From 9ac17e2340157ab5046fca9cdcea486f595f6472 Mon Sep 17 00:00:00 2001
From: Ke Li <ke.li@cern.ch>
Date: Sun, 6 Dec 2020 19:38:37 +0100
Subject: [PATCH 001/225] add ID ART tests for data at 15, 16, 17 and 18

---
 .../test/test_data15_13TeV_1000evt.sh         | 74 +++++++++++++++++++
 .../test/test_data16_13TeV_1000evt.sh         | 74 +++++++++++++++++++
 .../test/test_data17_13TeV_1000evt.sh         | 73 ++++++++++++++++++
 .../test/test_data18_13TeV_1000evt.sh         | 73 ++++++++++++++++++
 4 files changed, 294 insertions(+)
 create mode 100755 InnerDetector/InDetValidation/InDetPhysValMonitoring/test/test_data15_13TeV_1000evt.sh
 create mode 100755 InnerDetector/InDetValidation/InDetPhysValMonitoring/test/test_data16_13TeV_1000evt.sh
 create mode 100755 InnerDetector/InDetValidation/InDetPhysValMonitoring/test/test_data17_13TeV_1000evt.sh
 create mode 100755 InnerDetector/InDetValidation/InDetPhysValMonitoring/test/test_data18_13TeV_1000evt.sh

diff --git a/InnerDetector/InDetValidation/InDetPhysValMonitoring/test/test_data15_13TeV_1000evt.sh b/InnerDetector/InDetValidation/InDetPhysValMonitoring/test/test_data15_13TeV_1000evt.sh
new file mode 100755
index 000000000000..eb170383a419
--- /dev/null
+++ b/InnerDetector/InDetValidation/InDetPhysValMonitoring/test/test_data15_13TeV_1000evt.sh
@@ -0,0 +1,74 @@
+#!/bin/bash
+# art-description: Standard test for 2015 data
+# art-type: grid
+# art-include: master/Athena
+# art-output: physval*.root
+# art-output: *.xml
+# art-output: dcube*
+
+# Fix ordering of output in logfile
+exec 2>&1
+run() { (set -x; exec "$@") }
+
+
+lastref_dir=last_results
+artdata=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art
+inputBS=${artdata}/RecJobTransformTests/data15_13TeV.00283429.physics_Main.daq.RAW._lb0154._SFO-1._0001.data 
+dcubeXml="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/InDetPhysValMonitoring/dcube/config/IDPVMPlots_R22.xml"
+dcubeRef="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/InDetPhysValMonitoring/ReferenceHistograms/physval_data15_1000evt_reco_r22.root"
+
+# Reco step based on test InDetPhysValMonitoring ART setup from Josh Moss.
+
+run  Reco_tf.py \
+  --inputBSFile "$inputBS" \
+  --maxEvents 1000 \
+  --autoConfiguration everything \
+  --conditionsTag="CONDBR2-BLKPA-2016-14" \
+  --outputAODFile   physval.AOD.root \
+  --outputNTUP_PHYSVALFile physval.ntuple.root \
+  --steering        doRAWtoALL \
+  --checkEventCount False \
+  --ignoreErrors    True \
+  --valid           True \
+  --validationFlags doInDet \
+  --preExec 'from InDetRecExample.InDetJobProperties import InDetFlags; \
+  InDetFlags.doSlimming.set_Value_and_Lock(False); rec.doTrigger.set_Value_and_Lock(False); \
+  from InDetPhysValMonitoring.InDetPhysValJobProperties import InDetPhysValFlags; \
+  InDetPhysValFlags.doValidateTightPrimaryTracks.set_Value_and_Lock(True); \
+  InDetPhysValFlags.doValidateTracksInJets.set_Value_and_Lock(False); \
+  InDetPhysValFlags.doValidateGSFTracks.set_Value_and_Lock(False); \
+  InDetPhysValFlags.doPhysValOutput.set_Value_and_Lock(True); \
+  rec.doDumpProperties=True; rec.doCalo=True; rec.doEgamma=True; \
+  rec.doForwardDet=False; rec.doInDet=True; rec.doJetMissingETTag=True; \
+  rec.doLArg=True; rec.doLucid=True; rec.doMuon=True; rec.doMuonCombined=True; \
+  rec.doSemiDetailedPerfMon=True; rec.doTau=True; rec.doTile=True; \
+  from ParticleBuilderOptions.AODFlags import AODFlags; \
+  AODFlags.ThinGeantTruth.set_Value_and_Lock(False);  \
+  AODFlags.ThinNegativeEnergyCaloClusters.set_Value_and_Lock(False); \
+  AODFlags.ThinNegativeEnergyNeutralPFOs.set_Value_and_Lock(False);\
+  AODFlags.ThinInDetForwardTrackParticles.set_Value_and_Lock(False) '
+rec_tf_exit_code=$?
+echo "art-result: $rec_tf_exit_code reco"
+
+if [ $rec_tf_exit_code -eq 0 ]  ;then
+  echo "download latest result"
+  run art.py download --user=artprod --dst="$lastref_dir" "$ArtPackage" "$ArtJobName"
+  run ls -la "$lastref_dir"
+
+  echo "compare with R22 with nightly build at 2020-12-05"
+  $ATLAS_LOCAL_ROOT/dcube/current/DCubeClient/python/dcube.py \
+    -p -x dcube \
+    -c ${dcubeXml} \
+    -r ${dcubeRef} \
+    physval.ntuple.root
+  echo "art-result: $? plots"
+  
+  echo "compare with last build"
+  $ATLAS_LOCAL_ROOT/dcube/current/DCubeClient/python/dcube.py \
+    -p -x dcube_last \
+    -c ${dcubeXml} \
+    -r ${lastref_dir}/physval.ntuple.root \
+    physval.ntuple.root
+  echo "art-result: $? plots"
+fi
+
diff --git a/InnerDetector/InDetValidation/InDetPhysValMonitoring/test/test_data16_13TeV_1000evt.sh b/InnerDetector/InDetValidation/InDetPhysValMonitoring/test/test_data16_13TeV_1000evt.sh
new file mode 100755
index 000000000000..3efe0fede1c4
--- /dev/null
+++ b/InnerDetector/InDetValidation/InDetPhysValMonitoring/test/test_data16_13TeV_1000evt.sh
@@ -0,0 +1,74 @@
+#!/bin/bash
+# art-description: Standard test for 2016 data
+# art-type: grid
+# art-include: master/Athena
+# art-output: physval*.root
+# art-output: *.xml
+# art-output: dcube*
+
+# Fix ordering of output in logfile
+exec 2>&1
+run() { (set -x; exec "$@") }
+
+
+lastref_dir=last_results
+artdata=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art
+inputBS=${artdata}/RecJobTransformTests/data16_13TeV.00310809.physics_Main.daq.RAW._lb1219._SFO-2._0001.data 
+dcubeXml="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/InDetPhysValMonitoring/dcube/config/IDPVMPlots_R22.xml"
+dcubeRef="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/InDetPhysValMonitoring/ReferenceHistograms/physval_data16_1000evt_reco_r22.root"
+
+# Reco step based on test InDetPhysValMonitoring ART setup from Josh Moss.
+
+run  Reco_tf.py \
+  --inputBSFile "$inputBS" \
+  --maxEvents 1000 \
+  --autoConfiguration everything \
+  --conditionsTag="CONDBR2-BLKPA-2016-19" \
+  --outputAODFile   physval.AOD.root \
+  --outputNTUP_PHYSVALFile physval.ntuple.root \
+  --steering        doRAWtoALL \
+  --checkEventCount False \
+  --ignoreErrors    True \
+  --valid           True \
+  --validationFlags doInDet \
+  --preExec 'from InDetRecExample.InDetJobProperties import InDetFlags; \
+  InDetFlags.doSlimming.set_Value_and_Lock(False); rec.doTrigger.set_Value_and_Lock(False); \
+  from InDetPhysValMonitoring.InDetPhysValJobProperties import InDetPhysValFlags; \
+  InDetPhysValFlags.doValidateTightPrimaryTracks.set_Value_and_Lock(True); \
+  InDetPhysValFlags.doValidateTracksInJets.set_Value_and_Lock(False); \
+  InDetPhysValFlags.doValidateGSFTracks.set_Value_and_Lock(False); \
+  InDetPhysValFlags.doPhysValOutput.set_Value_and_Lock(True); \
+  rec.doDumpProperties=True; rec.doCalo=True; rec.doEgamma=True; \
+  rec.doForwardDet=False; rec.doInDet=True; rec.doJetMissingETTag=True; \
+  rec.doLArg=True; rec.doLucid=True; rec.doMuon=True; rec.doMuonCombined=True; \
+  rec.doSemiDetailedPerfMon=True; rec.doTau=True; rec.doTile=True; \
+  from ParticleBuilderOptions.AODFlags import AODFlags; \
+  AODFlags.ThinGeantTruth.set_Value_and_Lock(False);  \
+  AODFlags.ThinNegativeEnergyCaloClusters.set_Value_and_Lock(False); \
+  AODFlags.ThinNegativeEnergyNeutralPFOs.set_Value_and_Lock(False);\
+  AODFlags.ThinInDetForwardTrackParticles.set_Value_and_Lock(False) '
+rec_tf_exit_code=$?
+echo "art-result: $rec_tf_exit_code reco"
+
+if [ $rec_tf_exit_code -eq 0 ]  ;then
+  echo "download latest result"
+  run art.py download --user=artprod --dst="$lastref_dir" "$ArtPackage" "$ArtJobName"
+  run ls -la "$lastref_dir"
+
+  echo "compare with R22 with nightly build at 2020-12-05"
+  $ATLAS_LOCAL_ROOT/dcube/current/DCubeClient/python/dcube.py \
+    -p -x dcube \
+    -c ${dcubeXml} \
+    -r ${dcubeRef} \
+    physval.ntuple.root
+  echo "art-result: $? plots"
+  
+  echo "compare with last build"
+  $ATLAS_LOCAL_ROOT/dcube/current/DCubeClient/python/dcube.py \
+    -p -x dcube_last \
+    -c ${dcubeXml} \
+    -r ${lastref_dir}/physval.ntuple.root \
+    physval.ntuple.root
+  echo "art-result: $? plots"
+fi
+
diff --git a/InnerDetector/InDetValidation/InDetPhysValMonitoring/test/test_data17_13TeV_1000evt.sh b/InnerDetector/InDetValidation/InDetPhysValMonitoring/test/test_data17_13TeV_1000evt.sh
new file mode 100755
index 000000000000..679554938cd5
--- /dev/null
+++ b/InnerDetector/InDetValidation/InDetPhysValMonitoring/test/test_data17_13TeV_1000evt.sh
@@ -0,0 +1,73 @@
+#!/bin/bash
+# art-description: Standard test for 2017 data
+# art-type: grid
+# art-include: master/Athena
+# art-output: physval*.root
+# art-output: *.xml
+# art-output: dcube*
+
+# Fix ordering of output in logfile
+exec 2>&1
+run() { (set -x; exec "$@") }
+
+
+lastref_dir=last_results
+artdata=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art
+inputBS=${artdata}/RecJobTransformTests/data17_13TeV.00324910.physics_Main.daq.RAW._lb0713._SFO-6._0001.data 
+dcubeXml="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/InDetPhysValMonitoring/dcube/config/IDPVMPlots_R22.xml"
+dcubeRef="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/InDetPhysValMonitoring/ReferenceHistograms/physval_data17_1000evt_reco_r22.root"
+
+# Reco step based on test InDetPhysValMonitoring ART setup from Josh Moss.
+
+run  Reco_tf.py \
+  --inputBSFile "$inputBS" \
+  --maxEvents 1000 \
+  --AMI=f1088 \
+  --outputAODFile   physval.AOD.root \
+  --outputNTUP_PHYSVALFile physval.ntuple.root \
+  --steering        doRAWtoALL \
+  --checkEventCount False \
+  --ignoreErrors    True \
+  --valid           True \
+  --validationFlags doInDet \
+  --preExec 'from InDetRecExample.InDetJobProperties import InDetFlags; \
+  InDetFlags.doSlimming.set_Value_and_Lock(False); rec.doTrigger.set_Value_and_Lock(False); \
+  from InDetPhysValMonitoring.InDetPhysValJobProperties import InDetPhysValFlags; \
+  InDetPhysValFlags.doValidateTightPrimaryTracks.set_Value_and_Lock(True); \
+  InDetPhysValFlags.doValidateTracksInJets.set_Value_and_Lock(False); \
+  InDetPhysValFlags.doValidateGSFTracks.set_Value_and_Lock(False); \
+  InDetPhysValFlags.doPhysValOutput.set_Value_and_Lock(True); \
+  rec.doDumpProperties=True; rec.doCalo=True; rec.doEgamma=True; \
+  rec.doForwardDet=False; rec.doInDet=True; rec.doJetMissingETTag=True; \
+  rec.doLArg=True; rec.doLucid=True; rec.doMuon=True; rec.doMuonCombined=True; \
+  rec.doSemiDetailedPerfMon=True; rec.doTau=True; rec.doTile=True; \
+  from ParticleBuilderOptions.AODFlags import AODFlags; \
+  AODFlags.ThinGeantTruth.set_Value_and_Lock(False);  \
+  AODFlags.ThinNegativeEnergyCaloClusters.set_Value_and_Lock(False); \
+  AODFlags.ThinNegativeEnergyNeutralPFOs.set_Value_and_Lock(False);\
+  AODFlags.ThinInDetForwardTrackParticles.set_Value_and_Lock(False) '
+rec_tf_exit_code=$?
+echo "art-result: $rec_tf_exit_code reco"
+
+if [ $rec_tf_exit_code -eq 0 ]  ;then
+  echo "download latest result"
+  run art.py download --user=artprod --dst="$lastref_dir" "$ArtPackage" "$ArtJobName"
+  run ls -la "$lastref_dir"
+
+  echo "compare with R22 with nightly build at 2020-12-05"
+  $ATLAS_LOCAL_ROOT/dcube/current/DCubeClient/python/dcube.py \
+    -p -x dcube \
+    -c ${dcubeXml} \
+    -r ${dcubeRef} \
+    physval.ntuple.root
+  echo "art-result: $? plots"
+  
+  echo "compare with last build"
+  $ATLAS_LOCAL_ROOT/dcube/current/DCubeClient/python/dcube.py \
+    -p -x dcube_last \
+    -c ${dcubeXml} \
+    -r ${lastref_dir}/physval.ntuple.root \
+    physval.ntuple.root
+  echo "art-result: $? plots"
+fi
+
diff --git a/InnerDetector/InDetValidation/InDetPhysValMonitoring/test/test_data18_13TeV_1000evt.sh b/InnerDetector/InDetValidation/InDetPhysValMonitoring/test/test_data18_13TeV_1000evt.sh
new file mode 100755
index 000000000000..9decc003c2f3
--- /dev/null
+++ b/InnerDetector/InDetValidation/InDetPhysValMonitoring/test/test_data18_13TeV_1000evt.sh
@@ -0,0 +1,73 @@
+#!/bin/bash
+# art-description: Standard test for 2018 data
+# art-type: grid
+# art-include: master/Athena
+# art-output: physval*.root
+# art-output: *.xml
+# art-output: dcube*
+
+# Fix ordering of output in logfile
+exec 2>&1
+run() { (set -x; exec "$@") }
+
+
+lastref_dir=last_results
+artdata=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art
+inputBS=${artdata}/RecJobTransformTests/data18_13TeV/data18_13TeV.00348885.physics_Main.daq.RAW._lb0827._SFO-8._0002.data 
+dcubeXml="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/InDetPhysValMonitoring/dcube/config/IDPVMPlots_R22.xml"
+dcubeRef="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/InDetPhysValMonitoring/ReferenceHistograms/physval_data18_1000evt_reco_r22.root"
+
+# Reco step based on test InDetPhysValMonitoring ART setup from Josh Moss.
+
+run  Reco_tf.py \
+  --inputBSFile "$inputBS" \
+  --maxEvents 1000 \
+  --AMI=f1089 \
+  --outputAODFile   physval.AOD.root \
+  --outputNTUP_PHYSVALFile physval.ntuple.root \
+  --steering        doRAWtoALL \
+  --checkEventCount False \
+  --ignoreErrors    True \
+  --valid           True \
+  --validationFlags doInDet \
+  --preExec 'from InDetRecExample.InDetJobProperties import InDetFlags; \
+  InDetFlags.doSlimming.set_Value_and_Lock(False); rec.doTrigger.set_Value_and_Lock(False); \
+  from InDetPhysValMonitoring.InDetPhysValJobProperties import InDetPhysValFlags; \
+  InDetPhysValFlags.doValidateTightPrimaryTracks.set_Value_and_Lock(True); \
+  InDetPhysValFlags.doValidateTracksInJets.set_Value_and_Lock(False); \
+  InDetPhysValFlags.doValidateGSFTracks.set_Value_and_Lock(False); \
+  InDetPhysValFlags.doPhysValOutput.set_Value_and_Lock(True); \
+  rec.doDumpProperties=True; rec.doCalo=True; rec.doEgamma=True; \
+  rec.doForwardDet=False; rec.doInDet=True; rec.doJetMissingETTag=True; \
+  rec.doLArg=True; rec.doLucid=True; rec.doMuon=True; rec.doMuonCombined=True; \
+  rec.doSemiDetailedPerfMon=True; rec.doTau=True; rec.doTile=True; \
+  from ParticleBuilderOptions.AODFlags import AODFlags; \
+  AODFlags.ThinGeantTruth.set_Value_and_Lock(False);  \
+  AODFlags.ThinNegativeEnergyCaloClusters.set_Value_and_Lock(False); \
+  AODFlags.ThinNegativeEnergyNeutralPFOs.set_Value_and_Lock(False);\
+  AODFlags.ThinInDetForwardTrackParticles.set_Value_and_Lock(False) '
+rec_tf_exit_code=$?
+echo "art-result: $rec_tf_exit_code reco"
+
+if [ $rec_tf_exit_code -eq 0 ]  ;then
+  echo "download latest result"
+  run art.py download --user=artprod --dst="$lastref_dir" "$ArtPackage" "$ArtJobName"
+  run ls -la "$lastref_dir"
+
+  echo "compare with R22 with nightly build at 2020-12-05"
+  $ATLAS_LOCAL_ROOT/dcube/current/DCubeClient/python/dcube.py \
+    -p -x dcube \
+    -c ${dcubeXml} \
+    -r ${dcubeRef} \
+    physval.ntuple.root
+  echo "art-result: $? plots"
+  
+  echo "compare with last build"
+  $ATLAS_LOCAL_ROOT/dcube/current/DCubeClient/python/dcube.py \
+    -p -x dcube_last \
+    -c ${dcubeXml} \
+    -r ${lastref_dir}/physval.ntuple.root \
+    physval.ntuple.root
+  echo "art-result: $? plots"
+fi
+
-- 
GitLab


From ea3ae9ac427891cb2cd32442d620dcdabb241399 Mon Sep 17 00:00:00 2001
From: David Shope <david.richard.shope@cern.ch>
Date: Tue, 8 Dec 2020 22:18:36 +0100
Subject: [PATCH 002/225] Add diagonal elements of track covariance matrix to
 smart slimming list

---
 .../python/InDetTrackParticlesCPContent.py                      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetTrackParticlesCPContent.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetTrackParticlesCPContent.py
index ecb463322a02..55b9bc2b90e4 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetTrackParticlesCPContent.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetTrackParticlesCPContent.py
@@ -2,5 +2,5 @@
 
 InDetTrackParticlesCPContent = [
 "InDetTrackParticles",
-"InDetTrackParticlesAux.phi.theta.qOverP.chiSquared.numberDoF.numberOfInnermostPixelLayerHits.numberOfPixelHits.numberOfPixelHoles.numberOfPixelSharedHits.numberOfPixelDeadSensors.numberOfSCTHits.numberOfSCTHoles.numberOfSCTSharedHits.numberOfSCTDeadSensors"
+"InDetTrackParticlesAux.phi.theta.qOverP.chiSquared.numberDoF.numberOfInnermostPixelLayerHits.numberOfPixelHits.numberOfPixelHoles.numberOfPixelSharedHits.numberOfPixelDeadSensors.numberOfSCTHits.numberOfSCTHoles.numberOfSCTSharedHits.numberOfSCTDeadSensors.definingParametersCovMatrixDiag"
 ]
-- 
GitLab


From 3747e1c9e93f9f4d59a61b45487c4f8c2720ee44 Mon Sep 17 00:00:00 2001
From: Tadej Novak <tadej.novak@cern.ch>
Date: Mon, 7 Dec 2020 19:19:30 +0100
Subject: [PATCH 003/225] PyJobTransforms: Fix input/output file parsing from
 AMI

---
 Tools/PyJobTransforms/python/trfAMI.py | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/Tools/PyJobTransforms/python/trfAMI.py b/Tools/PyJobTransforms/python/trfAMI.py
index 2c3fd4044963..de453eac1a75 100644
--- a/Tools/PyJobTransforms/python/trfAMI.py
+++ b/Tools/PyJobTransforms/python/trfAMI.py
@@ -356,13 +356,11 @@ def getTrfConfigFromPANDA(tag):
             if arg.lstrip('-').startswith('input') and arg.endswith('File'):
                 value=physics.pop(arg)
                 msg.debug("Found input file argument %s=%s.", arg, value ) 
-                fmt=arg.lstrip('-').replace('input','').replace('File','')
-                trf.inFiles[arg]=getInputFileName(arg)
+                trf.inFiles[arg]=value
             elif arg.lstrip('-').startswith('output') and arg.endswith('File'):
                 value=physics.pop(arg)
                 msg.debug("Found output file argument %s=%s.", arg, value )
-                fmt=arg.lstrip('-').replace('output','').replace('File','')
-                trf.outFiles[arg]=getOutputFileName(fmt)
+                trf.outFiles[arg]=value
 
         msg.debug("Checking for not set arguments...")
         for arg,value in listitems(physics):
@@ -490,13 +488,11 @@ def getTrfConfigFromAMI(tag, suppressNonJobOptions = True):
                 if arg.lstrip('-').startswith('input') and arg.endswith('File'):
                     value = physics.pop(arg)
                     msg.debug("Found input file argument %s=%s.", arg, value)
-                    fmt = arg.lstrip('-').replace('input', '').replace('File', '')
-                    trf.inFiles[arg] = getInputFileName(arg)
+                    trf.inFiles[arg] = value
                 elif arg.lstrip('-').startswith('output') and arg.endswith('File'):
                     value = physics.pop(arg)
                     msg.debug("Found output file argument %s=%s.", arg, value)
-                    fmt = arg.lstrip('-').replace('output', '').replace('File', '')
-                    trf.outFiles[arg] = getOutputFileName(fmt)
+                    trf.outFiles[arg] = value
 
             msg.debug("Checking for not set arguments...")
             for arg, value in listitems(physics):
-- 
GitLab


From d255b0e579bc09846710d23efdfc7ef4da1abba4 Mon Sep 17 00:00:00 2001
From: Tadej Novak <tadej.novak@cern.ch>
Date: Wed, 9 Dec 2020 13:38:42 +0100
Subject: [PATCH 004/225] PyJobTransforms: Ignore custom inputs/outputs flags
 from AMI as they can be useful for tests

---
 Tools/PyJobTransforms/python/trfAMI.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Tools/PyJobTransforms/python/trfAMI.py b/Tools/PyJobTransforms/python/trfAMI.py
index de453eac1a75..8cbf661b2c92 100644
--- a/Tools/PyJobTransforms/python/trfAMI.py
+++ b/Tools/PyJobTransforms/python/trfAMI.py
@@ -469,7 +469,7 @@ def getTrfConfigFromAMI(tag, suppressNonJobOptions = True):
 
             if suppressNonJobOptions:
                 for k in list(physics):
-                    if k in ['productionStep', 'transformation', 'SWReleaseCache']:
+                    if k in ['inputs', 'outputs', 'productionStep', 'transformation', 'SWReleaseCache']:
                         physics.pop(k)
 
             for k, v in iteritems(physics):
-- 
GitLab


From 5ef2f1d480ef4001dcd8364aa9ba6b167b40de42 Mon Sep 17 00:00:00 2001
From: Tadej Novak <tadej.novak@cern.ch>
Date: Thu, 10 Dec 2020 13:21:13 +0100
Subject: [PATCH 005/225] PyJobTransforms: Update AMI tests

---
 Tools/PyJobTransforms/test/test_trfAMI.py | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/Tools/PyJobTransforms/test/test_trfAMI.py b/Tools/PyJobTransforms/test/test_trfAMI.py
index 143d070c90ce..7a53f02421ff 100755
--- a/Tools/PyJobTransforms/test/test_trfAMI.py
+++ b/Tools/PyJobTransforms/test/test_trfAMI.py
@@ -154,7 +154,9 @@ class trfAMIUnitTests(unittest.TestCase):
         self.assertEqual(tag.trfs[0].release, 'AtlasProduction,19.1.1.9')
         self.assertEqual(tag.trfs[0].newTransform, True)
         self.assertEqual(tag.trfs[0].physics, physics)
-        self.assertEqual(tag.trfs[0].inFiles, {'inputHighPtMinbiasHitsFile': 'myHighPtMinbiasHits', 'inputLowPtMinbiasHitsFile': 'myLowPtMinbiasHits'})
+        self.assertEqual(tag.trfs[0].inFiles, {
+            'inputHighPtMinbiasHitsFile': 'mc14_13TeV.119996.Pythia8_A2MSTW2008LO_minbias_inelastic_high.merge.HITS.e3038_s1967_s2007',
+            'inputLowPtMinbiasHitsFile': 'mc14_13TeV.119995.Pythia8_A2MSTW2008LO_minbias_inelastic_low.merge.HITS.e3038_s1967_s2007'})
         self.assertEqual(tag.trfs[0].outFiles, {})
         self.assertEqual(tag.trfs[0].outputs, {})
         self.assertEqual(tag.trfs[0].inDS, None)
@@ -223,8 +225,9 @@ class trfAMIUnitTests(unittest.TestCase):
         self.assertEqual(tag.trfs[0].release, 'AtlasProduction,20.1.4.5')
         self.assertEqual(tag.trfs[0].newTransform, True)
         self.assertEqual(tag.trfs[0].physics, physics)
-        self.assertEqual(tag.trfs[0].inFiles, {'inputHighPtMinbiasHitsFile': 'myHighPtMinbiasHits',
-                                               'inputLowPtMinbiasHitsFile': 'myLowPtMinbiasHits'})
+        self.assertEqual(tag.trfs[0].inFiles, {
+            'inputHighPtMinbiasHitsFile': 'mc15_valid.361035.Pythia8EvtGen_A2MSTW2008LO_minbias_inelastic_high.merge.HITS.e3581_s2578_s2169_tid05098387_00',
+            'inputLowPtMinbiasHitsFile': 'mc15_valid.361034.Pythia8EvtGen_A2MSTW2008LO_minbias_inelastic_low.merge.HITS.e3581_s2578_s2169_tid05098374_00'})
         self.assertEqual(tag.trfs[0].outFiles, {})
         self.assertEqual(tag.trfs[0].outputs, {})
         self.assertEqual(tag.trfs[0].inDS, None)
-- 
GitLab


From e501390e4f3ae8d59d0ed1034f8d298bfc7dfa7e Mon Sep 17 00:00:00 2001
From: Riccardo Longo <riccardo.longo@cern.ch>
Date: Thu, 10 Dec 2020 11:41:42 -0600
Subject: [PATCH 006/225] Updates to accommodate new dataHandle features and
 avoid crashes

---
 .../HeavyIonRec/HIJetRec/python/HIJetRecUtils.py      | 11 ++++++-----
 .../HeavyIonRec/HIJetRec/share/HIJetRec_jobOptions.py |  2 +-
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/Reconstruction/HeavyIonRec/HIJetRec/python/HIJetRecUtils.py b/Reconstruction/HeavyIonRec/HIJetRec/python/HIJetRecUtils.py
index 81a1276ab396..eab3fe8fff66 100644
--- a/Reconstruction/HeavyIonRec/HIJetRec/python/HIJetRecUtils.py
+++ b/Reconstruction/HeavyIonRec/HIJetRec/python/HIJetRecUtils.py
@@ -8,8 +8,8 @@ from JetRec.JetRecFlags import jetFlags
 def AddToOutputList(tname, objType='xAOD::JetContainer') :
 
     #filter container based on package flags
-    if HIJetFlags.UnsubtractedSuffix() in tname and not HIJetFlags.WriteUnsubtracted() : return
-    if HIJetFlags.SeedSuffix() in tname and not HIJetFlags.WriteSeeds() : return
+    if HIJetFlags.UnsubtractedSuffix() in str(tname) and not HIJetFlags.WriteUnsubtracted() : return
+    if HIJetFlags.SeedSuffix() in str(tname) and not HIJetFlags.WriteSeeds() : return
 
     has_key=False
     for k in HIJetFlags.HIJetOutputList() :
@@ -120,7 +120,7 @@ def MakeModulatorTool(mod_key, **kwargs) :
 
 def MakeSubtractionTool(shapeKey, moment_name='', momentOnly=False, **kwargs) :
     HIJetConstituentSubtractionTool=CompFactory.HIJetConstituentSubtractionTool
-    suffix=shapeKey
+    suffix=shapeKey.toStringProperty()
     if momentOnly : suffix+='_'+moment_name
 
     if 'modulator' in kwargs.keys() : mod_tool=kwargs['modulator']
@@ -131,7 +131,7 @@ def MakeSubtractionTool(shapeKey, moment_name='', momentOnly=False, **kwargs) :
         from HIEventUtils.HIEventUtilsConf import HIEventShapeMapTool
         map_tool=HIEventShapeMapTool()
 
-    subtr=HIJetConstituentSubtractionTool("HICS_"+suffix)
+    subtr=HIJetConstituentSubtractionTool(("HICS_"+suffix))
     subtr.EventShapeKey=shapeKey
     subtr.Modulator=mod_tool
     subtr.MomentName='JetSubtractedScale%sMomentum' % moment_name
@@ -371,7 +371,8 @@ def HITruthParticleCopy() :
 def BuildHarmonicName(shape_key, **kwargs) :
     tname=shape_key
     if 'harmonics' in kwargs.keys() :
-        for n in kwargs['harmonics'] : tname += '_V%d' % n
+        for n in kwargs['harmonics'] :
+            tname = str(tname) + str('_V%d' % n)
     return tname
 
 def GetNullModulator() :
diff --git a/Reconstruction/HeavyIonRec/HIJetRec/share/HIJetRec_jobOptions.py b/Reconstruction/HeavyIonRec/HIJetRec/share/HIJetRec_jobOptions.py
index 6b3eceb986b5..16b212838a3b 100644
--- a/Reconstruction/HeavyIonRec/HIJetRec/share/HIJetRec_jobOptions.py
+++ b/Reconstruction/HeavyIonRec/HIJetRec/share/HIJetRec_jobOptions.py
@@ -197,7 +197,7 @@ unsubtr_suffix=HIJetFlags.UnsubtractedSuffix()
 for k in jtm.jetrecs :
     if unsubtr_suffix in k.name() :
         in_name=k.OutputContainer
-        out_name=in_name.replace("_%s" % unsubtr_suffix,"")
+        out_name=in_name.toStringProperty().replace("_%s" % unsubtr_suffix,"")
         #>slight tweak in case R=1.0 jets are requestd, add some substructure tools
         modifiers=GetHIModifierList(out_name,hi_tools)
         if '10HIJets' in k.name() :
-- 
GitLab


From d28730cab1c9fc8f4d2caa6826e8295f5c4f2a6c Mon Sep 17 00:00:00 2001
From: Riccardo Longo <riccardo.longo@cern.ch>
Date: Thu, 10 Dec 2020 12:13:01 -0600
Subject: [PATCH 007/225] Removed a round of parenthesis not needed

---
 Reconstruction/HeavyIonRec/HIJetRec/python/HIJetRecUtils.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Reconstruction/HeavyIonRec/HIJetRec/python/HIJetRecUtils.py b/Reconstruction/HeavyIonRec/HIJetRec/python/HIJetRecUtils.py
index eab3fe8fff66..716c4e13f991 100644
--- a/Reconstruction/HeavyIonRec/HIJetRec/python/HIJetRecUtils.py
+++ b/Reconstruction/HeavyIonRec/HIJetRec/python/HIJetRecUtils.py
@@ -131,7 +131,7 @@ def MakeSubtractionTool(shapeKey, moment_name='', momentOnly=False, **kwargs) :
         from HIEventUtils.HIEventUtilsConf import HIEventShapeMapTool
         map_tool=HIEventShapeMapTool()
 
-    subtr=HIJetConstituentSubtractionTool(("HICS_"+suffix))
+    subtr=HIJetConstituentSubtractionTool("HICS_"+suffix)
     subtr.EventShapeKey=shapeKey
     subtr.Modulator=mod_tool
     subtr.MomentName='JetSubtractedScale%sMomentum' % moment_name
-- 
GitLab


From 818962cc3abc030a49740071b914ab0e18917f4e Mon Sep 17 00:00:00 2001
From: Tim Martin <Tim.Martin@cern.ch>
Date: Fri, 11 Dec 2020 17:07:53 +0100
Subject: [PATCH 008/225] Allow extra flexibility in HypoAlg output validation
 for multi-leg chains

---
 .../DecisionHandling/src/HypoBase.cxx         | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/Trigger/TrigSteer/DecisionHandling/src/HypoBase.cxx b/Trigger/TrigSteer/DecisionHandling/src/HypoBase.cxx
index 9f5244df6a12..37e07dedac87 100644
--- a/Trigger/TrigSteer/DecisionHandling/src/HypoBase.cxx
+++ b/Trigger/TrigSteer/DecisionHandling/src/HypoBase.cxx
@@ -150,16 +150,19 @@ StatusCode HypoBase::validateLogicalFlow(const ElementLink<DecisionContainer>& d
       ATH_CHECK( seed.isValid() );
       DecisionIDContainer seedIDSet;
       decisionIDs(*seed, seedIDSet);
-      if (passed(id, seedIDSet)) {
+      // Id may be a chain-ID (represetns a whole chain) or a leg-ID (represents just a single leg of a multi-leg chain)
+      // Is ID is in this parent's set of passed IDs?
+      // Or, (if ID is a leg-ID) is the chain-ID of leg-ID in the parent's set of passed IDs?
+      if (passed(id, seedIDSet) or passed(getIDFromLeg(id).numeric(), seedIDSet)) {
         ++parentsWithDecision;
       }
-      else{ //adding also Ids from the legs
-	for (auto sid: seedIDSet){
-	  if (TrigCompositeUtils::getIDFromLeg(sid).numeric() == id){
-	    ++parentsWithDecision;
-	    break;
-	  }
-	}
+      else{ // Or, for each of the seed IDs, if the seed ID is a leg-ID, is the seed chain-ID of the seed leg-ID the same as ID?  
+        for (auto sid: seedIDSet){
+          if (getIDFromLeg(sid).numeric() == id){
+            ++parentsWithDecision;
+            break;
+          }
+        }
       }
     }
     if (mode == kRequireOne && parentsWithDecision == 0) {
-- 
GitLab


From c6c7a8584459ea35ef9bf15bf9d24436641ebb68 Mon Sep 17 00:00:00 2001
From: Edward Moyse <edward.moyse@cern.ch>
Date: Sat, 12 Dec 2020 09:08:51 +0100
Subject: [PATCH 009/225] Move to LCG_98python3_ATLAS_3

---
 Projects/AthDataQuality/CMakeLists.txt    | 2 +-
 Projects/AthGeneration/build_externals.sh | 2 +-
 Projects/AthSimulation/build_externals.sh | 2 +-
 Projects/Athena/build_externals.sh        | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/Projects/AthDataQuality/CMakeLists.txt b/Projects/AthDataQuality/CMakeLists.txt
index 75a5c2a00fae..0a88450493ed 100644
--- a/Projects/AthDataQuality/CMakeLists.txt
+++ b/Projects/AthDataQuality/CMakeLists.txt
@@ -18,7 +18,7 @@ set( TDAQ-COMMON_ATROOT
 find_package( AtlasCMake REQUIRED )
 
 # Build the project against LCG:
-set( LCG_VERSION_POSTFIX "python3_ATLAS_2"
+set( LCG_VERSION_POSTFIX "python3_ATLAS_3"
    CACHE STRING "Version postfix for the LCG release to use" )
 set( LCG_VERSION_NUMBER 98
    CACHE STRING "Version number for the LCG release to use" )
diff --git a/Projects/AthGeneration/build_externals.sh b/Projects/AthGeneration/build_externals.sh
index 2046b1fcfd9e..926cc7c91aaf 100755
--- a/Projects/AthGeneration/build_externals.sh
+++ b/Projects/AthGeneration/build_externals.sh
@@ -24,7 +24,7 @@ BUILDDIR=""
 BUILDTYPE="RelWithDebInfo"
 FORCE=""
 CI=""
-EXTRACMAKE=(-DLCG_VERSION_NUMBER=98 -DLCG_VERSION_POSTFIX="python3_ATLAS_2"
+EXTRACMAKE=(-DLCG_VERSION_NUMBER=98 -DLCG_VERSION_POSTFIX="python3_ATLAS_3"
             -DATLAS_GAUDI_TAG="v35r0.001")
 while getopts ":t:b:x:fch" opt; do
     case $opt in
diff --git a/Projects/AthSimulation/build_externals.sh b/Projects/AthSimulation/build_externals.sh
index ab39eecffaa9..507d9e19dd0a 100755
--- a/Projects/AthSimulation/build_externals.sh
+++ b/Projects/AthSimulation/build_externals.sh
@@ -24,7 +24,7 @@ BUILDDIR=""
 BUILDTYPE="RelWithDebInfo"
 FORCE=""
 CI=""
-EXTRACMAKE=(-DLCG_VERSION_NUMBER=98 -DLCG_VERSION_POSTFIX="python3_ATLAS_2"
+EXTRACMAKE=(-DLCG_VERSION_NUMBER=98 -DLCG_VERSION_POSTFIX="python3_ATLAS_3"
             -DATLAS_GAUDI_TAG="v35r0.001")
 while getopts ":t:b:x:fch" opt; do
     case $opt in
diff --git a/Projects/Athena/build_externals.sh b/Projects/Athena/build_externals.sh
index 01e4fbb871eb..8766b836971c 100755
--- a/Projects/Athena/build_externals.sh
+++ b/Projects/Athena/build_externals.sh
@@ -24,7 +24,7 @@ BUILDDIR=""
 BUILDTYPE="RelWithDebInfo"
 FORCE=""
 CI=""
-EXTRACMAKE=(-DLCG_VERSION_NUMBER=98 -DLCG_VERSION_POSTFIX="python3_ATLAS_2"
+EXTRACMAKE=(-DLCG_VERSION_NUMBER=98 -DLCG_VERSION_POSTFIX="python3_ATLAS_3"
             -DATLAS_GAUDI_TAG="v35r0.001")
 while getopts ":t:b:x:fch" opt; do
     case $opt in
-- 
GitLab


From 152f99677edf75bea9734460166341c4302bae9a Mon Sep 17 00:00:00 2001
From: Debo <debottam.bakshi.gupta@cern.ch>
Date: Sun, 13 Dec 2020 23:21:42 +0100
Subject: [PATCH 010/225] Using updated RoI instead of initialRoi from
 precisionStep and avoid re attaching roi in hypoAlg

---
 .../src/TrigEgammaPrecisionCaloHypoAlgMT.cxx  |   8 +-
 .../TrigEgammaPrecisionElectronHypoAlgMT.cxx  |   8 +-
 .../share/ref_RDOtoRDOTrig_v1Dev_build.ref    | 110 +++++++++---------
 .../share/ref_data_v1Dev_build.ref            |  18 +--
 4 files changed, 72 insertions(+), 72 deletions(-)

diff --git a/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigEgammaPrecisionCaloHypoAlgMT.cxx b/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigEgammaPrecisionCaloHypoAlgMT.cxx
index 55fc86417b11..6bf6246d7133 100644
--- a/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigEgammaPrecisionCaloHypoAlgMT.cxx
+++ b/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigEgammaPrecisionCaloHypoAlgMT.cxx
@@ -43,9 +43,10 @@ StatusCode TrigEgammaPrecisionCaloHypoAlgMT::execute( const EventContext& contex
   // loop over previous decisions
   size_t counter=0;
   for ( auto previousDecision: *previousDecisionsHandle ) {
-    //get RoI  
-    auto roiELInfo = findLink<TrigRoiDescriptorCollection>( previousDecision, initialRoIString() );
-    
+
+    //get updated RoI  
+    auto roiELInfo = findLink<TrigRoiDescriptorCollection>( previousDecision, roiString() );
+      
     ATH_CHECK( roiELInfo.isValid() );
     const TrigRoiDescriptor* roi = *(roiELInfo.link);
 
@@ -70,7 +71,6 @@ StatusCode TrigEgammaPrecisionCaloHypoAlgMT::execute( const EventContext& contex
 	    auto d = newDecisionIn( decisions, name() );
 	    d->setObjectLink( featureString(),  el );
 	    TrigCompositeUtils::linkToPrevious( d, decisionInput().key(), counter );
-	    d->setObjectLink( roiString(), roiELInfo.link );
 	    toolInput.emplace_back( d, roi, clusterHandle.cptr()->at(cl), previousDecision );
 	    validclusters++;
 
diff --git a/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigEgammaPrecisionElectronHypoAlgMT.cxx b/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigEgammaPrecisionElectronHypoAlgMT.cxx
index 9dbb604bce45..3f5bb5c462b8 100644
--- a/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigEgammaPrecisionElectronHypoAlgMT.cxx
+++ b/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigEgammaPrecisionElectronHypoAlgMT.cxx
@@ -52,9 +52,10 @@ StatusCode TrigEgammaPrecisionElectronHypoAlgMT::execute( const EventContext& co
   // loop over previous decisions
   size_t counter=0;
   for ( auto previousDecision: *previousDecisionsHandle ) {
-    //get RoI  
-    auto roiELInfo = findLink<TrigRoiDescriptorCollection>( previousDecision, initialRoIString() );
-    
+
+    //get updated RoI  
+    auto roiELInfo = findLink<TrigRoiDescriptorCollection>( previousDecision, roiString() );
+
     ATH_CHECK( roiELInfo.isValid() );
     const TrigRoiDescriptor* roi = *(roiELInfo.link);
     const auto viewEL = previousDecision->objectLink<ViewContainer>( viewString() );
@@ -77,7 +78,6 @@ StatusCode TrigEgammaPrecisionElectronHypoAlgMT::execute( const EventContext& co
 	    auto d = newDecisionIn( decisions, name() );
 	    d->setObjectLink( "feature",  ph );
 	    TrigCompositeUtils::linkToPrevious( d, decisionInput().key(), counter );
-	    d->setObjectLink( roiString(), roiELInfo.link );
 	    toolInput.emplace_back( d, roi, electronHandle.cptr()->at(cl), previousDecision );
 	    validelectrons++;
 
diff --git a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
index 1ce4d677498b..3b5c4962d4a9 100644
--- a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
+++ b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
@@ -71,7 +71,7 @@ HLT_2g10_loose_mu20_L1MU20:
   stepFeatures:
     0: 3
     1: 3
-    2: 5
+    2: 4
 HLT_2g15_tight_dPhi15_L1DPHI-M70-2EM12I:
   eventCount: 0
 HLT_2g20_tight_L12EM15VH:
@@ -585,7 +585,7 @@ HLT_e17_lhloose_mu14_L1EM15VH_MU10:
   stepFeatures:
     0: 4
     1: 5
-    2: 6
+    2: 4
     3: 4
     4: 4
     5: 4
@@ -603,7 +603,7 @@ HLT_e17_lhvloose_nod0_L1EM15VH:
   stepFeatures:
     0: 6
     1: 7
-    2: 7
+    2: 5
     3: 5
     4: 5
 HLT_e17_lhvloose_nod0_L1EM15VHI:
@@ -617,7 +617,7 @@ HLT_e17_lhvloose_nod0_L1EM15VHI:
   stepFeatures:
     0: 5
     1: 6
-    2: 6
+    2: 4
     3: 4
     4: 4
 HLT_e20_lhmedium_e15_lhmedium_Zee_L12EM3:
@@ -649,7 +649,7 @@ HLT_e24_lhvloose_L1EM20VH:
   stepFeatures:
     0: 6
     1: 7
-    2: 7
+    2: 5
     3: 5
     4: 5
 HLT_e26_etcut_L1EM22VHI:
@@ -675,7 +675,7 @@ HLT_e26_lhloose_L1EM15VH:
   stepFeatures:
     0: 6
     1: 7
-    2: 7
+    2: 5
     3: 5
     4: 5
 HLT_e26_lhloose_L1EM22VHI:
@@ -689,7 +689,7 @@ HLT_e26_lhloose_L1EM22VHI:
   stepFeatures:
     0: 5
     1: 6
-    2: 6
+    2: 4
     3: 4
     4: 4
 HLT_e26_lhmedium_L1EM15VH:
@@ -703,7 +703,7 @@ HLT_e26_lhmedium_L1EM15VH:
   stepFeatures:
     0: 5
     1: 6
-    2: 6
+    2: 4
     3: 4
     4: 4
 HLT_e26_lhmedium_L1EM22VHI:
@@ -717,7 +717,7 @@ HLT_e26_lhmedium_L1EM22VHI:
   stepFeatures:
     0: 5
     1: 6
-    2: 6
+    2: 4
     3: 4
     4: 4
 HLT_e26_lhmedium_mu8noL1_L1EM22VHI:
@@ -733,7 +733,7 @@ HLT_e26_lhmedium_mu8noL1_L1EM22VHI:
   stepFeatures:
     0: 10
     1: 10
-    2: 10
+    2: 8
     3: 8
     4: 8
     5: 4
@@ -749,7 +749,7 @@ HLT_e26_lhtight_L1EM15VH:
   stepFeatures:
     0: 5
     1: 6
-    2: 6
+    2: 4
     3: 4
     4: 4
 HLT_e26_lhtight_L1EM22VHI:
@@ -763,7 +763,7 @@ HLT_e26_lhtight_L1EM22VHI:
   stepFeatures:
     0: 5
     1: 6
-    2: 6
+    2: 4
     3: 4
     4: 4
 HLT_e26_lhtight_gsf_L1EM22VHI:
@@ -777,7 +777,7 @@ HLT_e26_lhtight_gsf_L1EM22VHI:
   stepFeatures:
     0: 5
     1: 6
-    2: 6
+    2: 4
     3: 4
     4: 4
 HLT_e26_lhtight_ivarloose_L1EM22VHI:
@@ -791,7 +791,7 @@ HLT_e26_lhtight_ivarloose_L1EM22VHI:
   stepFeatures:
     0: 5
     1: 6
-    2: 6
+    2: 4
     3: 4
     4: 3
 HLT_e26_lhtight_ivarmedium_L1EM22VHI:
@@ -805,7 +805,7 @@ HLT_e26_lhtight_ivarmedium_L1EM22VHI:
   stepFeatures:
     0: 5
     1: 6
-    2: 6
+    2: 4
     3: 4
     4: 3
 HLT_e26_lhtight_ivartight_L1EM22VHI:
@@ -819,7 +819,7 @@ HLT_e26_lhtight_ivartight_L1EM22VHI:
   stepFeatures:
     0: 5
     1: 6
-    2: 6
+    2: 4
     3: 4
     4: 3
 HLT_e26_lhtight_nod0_L1EM22VHI:
@@ -833,7 +833,7 @@ HLT_e26_lhtight_nod0_L1EM22VHI:
   stepFeatures:
     0: 5
     1: 6
-    2: 6
+    2: 4
     3: 4
     4: 4
 HLT_e26_lhtight_nod0_L1EM24VHI:
@@ -847,7 +847,7 @@ HLT_e26_lhtight_nod0_L1EM24VHI:
   stepFeatures:
     0: 5
     1: 6
-    2: 6
+    2: 4
     3: 4
     4: 4
 HLT_e300_etcut_L1EM22VHI:
@@ -897,8 +897,8 @@ HLT_e5_lhloose_L1EM3:
   stepFeatures:
     0: 60
     1: 145
-    2: 78
-    3: 44
+    2: 81
+    3: 46
     4: 7
 HLT_e5_lhloose_noringer_L1EM3:
   eventCount: 6
@@ -911,7 +911,7 @@ HLT_e5_lhloose_noringer_L1EM3:
   stepFeatures:
     0: 56
     1: 128
-    2: 88
+    2: 84
     3: 46
     4: 7
 HLT_e5_lhmedium_L1EM3:
@@ -926,7 +926,7 @@ HLT_e5_lhmedium_L1EM3:
     0: 58
     1: 131
     2: 76
-    3: 42
+    3: 44
     4: 5
 HLT_e5_lhmedium_noringer_L1EM3:
   eventCount: 4
@@ -954,7 +954,7 @@ HLT_e5_lhtight_L1EM3:
     0: 57
     1: 128
     2: 74
-    3: 41
+    3: 43
     4: 5
 HLT_e5_lhtight_nod0_L1EM3:
   eventCount: 4
@@ -968,7 +968,7 @@ HLT_e5_lhtight_nod0_L1EM3:
     0: 57
     1: 128
     2: 74
-    3: 41
+    3: 43
     4: 5
 HLT_e5_lhtight_noringer_L1EM3:
   eventCount: 4
@@ -981,7 +981,7 @@ HLT_e5_lhtight_noringer_L1EM3:
   stepFeatures:
     0: 45
     1: 92
-    2: 60
+    2: 61
     3: 36
     4: 5
 HLT_e5_lhtight_noringer_nod0_L1EM3:
@@ -995,7 +995,7 @@ HLT_e5_lhtight_noringer_nod0_L1EM3:
   stepFeatures:
     0: 45
     1: 92
-    2: 60
+    2: 61
     3: 36
     4: 5
 HLT_e60_lhmedium_L1EM22VHI:
@@ -1009,7 +1009,7 @@ HLT_e60_lhmedium_L1EM22VHI:
   stepFeatures:
     0: 2
     1: 2
-    2: 4
+    2: 2
     3: 2
     4: 2
 HLT_e60_lhmedium_nod0_L1EM22VHI:
@@ -1023,7 +1023,7 @@ HLT_e60_lhmedium_nod0_L1EM22VHI:
   stepFeatures:
     0: 2
     1: 2
-    2: 4
+    2: 2
     3: 2
     4: 2
 HLT_e7_etcut_L1EM3:
@@ -1053,7 +1053,7 @@ HLT_e7_lhmedium_mu24_L1MU20:
   stepFeatures:
     0: 18
     1: 17
-    2: 17
+    2: 15
     3: 14
     4: 4
     5: 4
@@ -1085,7 +1085,7 @@ HLT_g12_loose_LArPEB_L1EM10VH:
   stepFeatures:
     0: 11
     1: 11
-    2: 24
+    2: 22
     3: 6
     4: 6
 HLT_g140_etcut_L1EM22VHI:
@@ -1104,7 +1104,7 @@ HLT_g20_loose_L1EM15VH:
   stepFeatures:
     0: 9
     1: 9
-    2: 17
+    2: 15
     3: 6
 HLT_g20_loose_L1EM15VHI:
   eventCount: 5
@@ -1116,7 +1116,7 @@ HLT_g20_loose_L1EM15VHI:
   stepFeatures:
     0: 6
     1: 6
-    2: 11
+    2: 9
     3: 5
 HLT_g20_loose_LArPEB_L1EM15:
   eventCount: 6
@@ -1129,7 +1129,7 @@ HLT_g20_loose_LArPEB_L1EM15:
   stepFeatures:
     0: 9
     1: 9
-    2: 17
+    2: 15
     3: 6
     4: 6
 HLT_g20_medium_L1EM15VH:
@@ -1142,7 +1142,7 @@ HLT_g20_medium_L1EM15VH:
   stepFeatures:
     0: 8
     1: 8
-    2: 15
+    2: 14
     3: 6
 HLT_g20_medium_L1EM15VHI:
   eventCount: 5
@@ -1154,7 +1154,7 @@ HLT_g20_medium_L1EM15VHI:
   stepFeatures:
     0: 6
     1: 6
-    2: 11
+    2: 9
     3: 5
 HLT_g20_tight_L1EM15VH:
   eventCount: 5
@@ -1166,7 +1166,7 @@ HLT_g20_tight_L1EM15VH:
   stepFeatures:
     0: 8
     1: 8
-    2: 15
+    2: 14
     3: 5
 HLT_g20_tight_L1EM15VHI:
   eventCount: 5
@@ -1178,7 +1178,7 @@ HLT_g20_tight_L1EM15VHI:
   stepFeatures:
     0: 6
     1: 6
-    2: 11
+    2: 9
     3: 5
 HLT_g20_tight_icaloloose_L1EM15VH:
   eventCount: 5
@@ -1190,7 +1190,7 @@ HLT_g20_tight_icaloloose_L1EM15VH:
   stepFeatures:
     0: 8
     1: 8
-    2: 15
+    2: 14
     3: 5
 HLT_g20_tight_icaloloose_L1EM15VHI:
   eventCount: 5
@@ -1202,7 +1202,7 @@ HLT_g20_tight_icaloloose_L1EM15VHI:
   stepFeatures:
     0: 6
     1: 6
-    2: 11
+    2: 9
     3: 5
 HLT_g20_tight_icalomedium_L1EM15VH:
   eventCount: 5
@@ -1214,7 +1214,7 @@ HLT_g20_tight_icalomedium_L1EM15VH:
   stepFeatures:
     0: 8
     1: 8
-    2: 15
+    2: 14
     3: 5
 HLT_g20_tight_icalomedium_L1EM15VHI:
   eventCount: 5
@@ -1226,7 +1226,7 @@ HLT_g20_tight_icalomedium_L1EM15VHI:
   stepFeatures:
     0: 6
     1: 6
-    2: 11
+    2: 9
     3: 5
 HLT_g20_tight_icalotight_L1EM15VH:
   eventCount: 0
@@ -1237,7 +1237,7 @@ HLT_g20_tight_icalotight_L1EM15VH:
   stepFeatures:
     0: 8
     1: 8
-    2: 15
+    2: 14
 HLT_g20_tight_icalotight_L1EM15VHI:
   eventCount: 0
   stepCounts:
@@ -1247,7 +1247,7 @@ HLT_g20_tight_icalotight_L1EM15VHI:
   stepFeatures:
     0: 6
     1: 6
-    2: 11
+    2: 9
 HLT_g22_tight_L1EM15VH:
   eventCount: 5
   stepCounts:
@@ -1258,7 +1258,7 @@ HLT_g22_tight_L1EM15VH:
   stepFeatures:
     0: 7
     1: 7
-    2: 12
+    2: 11
     3: 5
 HLT_g25_etcut_L1EM20VH:
   eventCount: 7
@@ -1280,7 +1280,7 @@ HLT_g25_loose_L1EM20VH:
   stepFeatures:
     0: 9
     1: 9
-    2: 17
+    2: 15
     3: 7
 HLT_g25_medium_L1EM20VH:
   eventCount: 6
@@ -1292,7 +1292,7 @@ HLT_g25_medium_L1EM20VH:
   stepFeatures:
     0: 7
     1: 7
-    2: 12
+    2: 11
     3: 6
 HLT_g25_medium_mu24_ivarmedium_L1MU20:
   eventCount: 0
@@ -1308,7 +1308,7 @@ HLT_g25_medium_mu24_ivarmedium_L1MU20:
   stepFeatures:
     0: 4
     1: 4
-    2: 6
+    2: 4
     3: 4
     4: 4
     5: 2
@@ -1324,7 +1324,7 @@ HLT_g25_tight_L1EM20VH:
   stepFeatures:
     0: 7
     1: 7
-    2: 12
+    2: 11
     3: 5
 HLT_g300_etcut_L1EM22VHI:
   eventCount: 0
@@ -1342,7 +1342,7 @@ HLT_g35_loose_mu18_L1EM24VHI:
   stepFeatures:
     0: 4
     1: 4
-    2: 6
+    2: 4
     3: 4
     4: 4
     5: 2
@@ -1359,7 +1359,7 @@ HLT_g35_tight_icalotight_mu18noL1_L1EM22VHI:
   stepFeatures:
     0: 10
     1: 10
-    2: 13
+    2: 11
 HLT_g3_loose_LArPEB_L1EM3:
   eventCount: 9
   stepCounts:
@@ -1385,7 +1385,7 @@ HLT_g40_loose_LArPEB_L1EM20VHI:
   stepFeatures:
     0: 5
     1: 5
-    2: 10
+    2: 8
     3: 5
     4: 5
 HLT_g5_etcut_L1EM3:
@@ -1408,7 +1408,7 @@ HLT_g5_loose_L1EM3:
   stepFeatures:
     0: 56
     1: 56
-    2: 103
+    2: 101
     3: 14
 HLT_g5_medium_L1EM3:
   eventCount: 9
@@ -1420,7 +1420,7 @@ HLT_g5_medium_L1EM3:
   stepFeatures:
     0: 48
     1: 48
-    2: 81
+    2: 83
     3: 12
 HLT_g5_tight_L1EM3:
   eventCount: 8
@@ -1432,7 +1432,7 @@ HLT_g5_tight_L1EM3:
   stepFeatures:
     0: 45
     1: 45
-    2: 73
+    2: 76
     3: 8
 HLT_g60_loose_LArPEB_L1EM20VHI:
   eventCount: 3
@@ -1445,7 +1445,7 @@ HLT_g60_loose_LArPEB_L1EM20VHI:
   stepFeatures:
     0: 3
     1: 3
-    2: 7
+    2: 5
     3: 3
     4: 3
 HLT_g80_loose_LArPEB_L1EM20VHI:
diff --git a/Trigger/TrigValidation/TriggerTest/share/ref_data_v1Dev_build.ref b/Trigger/TrigValidation/TriggerTest/share/ref_data_v1Dev_build.ref
index 9c8ff7445777..c4a67a11362a 100644
--- a/Trigger/TrigValidation/TriggerTest/share/ref_data_v1Dev_build.ref
+++ b/Trigger/TrigValidation/TriggerTest/share/ref_data_v1Dev_build.ref
@@ -429,7 +429,7 @@ HLT_e5_lhloose_L1EM3:
     0: 19
     1: 22
     2: 13
-    3: 9
+    3: 10
 HLT_e5_lhloose_noringer_L1EM3:
   eventCount: 0
   stepCounts:
@@ -440,7 +440,7 @@ HLT_e5_lhloose_noringer_L1EM3:
   stepFeatures:
     0: 15
     1: 22
-    2: 23
+    2: 22
     3: 12
 HLT_e5_lhmedium_L1EM3:
   eventCount: 0
@@ -452,8 +452,8 @@ HLT_e5_lhmedium_L1EM3:
   stepFeatures:
     0: 21
     1: 24
-    2: 15
-    3: 11
+    2: 16
+    3: 12
 HLT_e5_lhmedium_noringer_L1EM3:
   eventCount: 0
   stepCounts:
@@ -476,8 +476,8 @@ HLT_e5_lhtight_L1EM3:
   stepFeatures:
     0: 17
     1: 17
-    2: 10
-    3: 7
+    2: 11
+    3: 8
 HLT_e5_lhtight_nod0_L1EM3:
   eventCount: 0
   stepCounts:
@@ -488,8 +488,8 @@ HLT_e5_lhtight_nod0_L1EM3:
   stepFeatures:
     0: 17
     1: 17
-    2: 10
-    3: 7
+    2: 11
+    3: 8
 HLT_e5_lhtight_noringer_L1EM3:
   eventCount: 0
   stepCounts:
@@ -652,7 +652,7 @@ HLT_g5_loose_L1EM3:
   stepFeatures:
     0: 15
     1: 15
-    2: 28
+    2: 27
     3: 3
 HLT_g5_medium_L1EM3:
   eventCount: 3
-- 
GitLab


From 9d50324720a857cff78d1dc1fe1be81064a473a9 Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Thu, 10 Dec 2020 17:29:18 +0100
Subject: [PATCH 011/225] InDetRecExample: enable flake8 and fix code

---
 .../InDetRecExample/CMakeLists.txt            |  2 +-
 .../python/ConfiguredNewTrackingCuts.py       |  6 ----
 .../python/ConfiguredSecondaryVertexCuts.py   | 12 ++-----
 .../python/ConfiguredVertexingCuts.py         |  7 ++--
 .../python/InDetJobProperties.py              | 36 ++++++++-----------
 .../InDetRecExample/python/InDetKeys.py       | 14 +++-----
 .../python/InDetRecExampleConfig.py           |  5 ++-
 .../InDetRecExample/python/TrackingCommon.py  | 11 ++----
 8 files changed, 28 insertions(+), 65 deletions(-)

diff --git a/InnerDetector/InDetExample/InDetRecExample/CMakeLists.txt b/InnerDetector/InDetExample/InDetRecExample/CMakeLists.txt
index 194eb7184dcc..0573d1101cb4 100644
--- a/InnerDetector/InDetExample/InDetRecExample/CMakeLists.txt
+++ b/InnerDetector/InDetExample/InDetRecExample/CMakeLists.txt
@@ -4,6 +4,6 @@
 atlas_subdir( InDetRecExample )
 
 # Install files from the package:
-atlas_install_python_modules( python/*.py )
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
 atlas_install_joboptions( share/*.py )
 atlas_install_runtime( share/jobOptions.py )
diff --git a/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredNewTrackingCuts.py b/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredNewTrackingCuts.py
index c6cbe58ebdfc..5c4d468c1ef1 100755
--- a/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredNewTrackingCuts.py
+++ b/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredNewTrackingCuts.py
@@ -1,8 +1,5 @@
 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-from __future__ import print_function
-
-
 #########################################################################
 # ConfiguredNewtrackingCuts class
 #########################################################################
@@ -22,10 +19,7 @@ class ConfiguredNewTrackingCuts :
     self.__set_indetflags()     #pointer to InDetFlags, don't use them directly
                                 #to allow sharing this code with the trigger
 
-    from AthenaCommon.GlobalFlags import globalflags
     from AthenaCommon.DetFlags import DetFlags
-    from AthenaCommon.BeamFlags import jobproperties
-    from RecExConfig.RecFlags import rec
 
     # --- put defaults to run Pixel/SCT/TRT
     self.__usePixel = DetFlags.haveRIO.pixel_on()
diff --git a/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredSecondaryVertexCuts.py b/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredSecondaryVertexCuts.py
index 27515663fc48..9e19d16c2ec2 100644
--- a/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredSecondaryVertexCuts.py
+++ b/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredSecondaryVertexCuts.py
@@ -1,7 +1,4 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-
-from __future__ import print_function
-
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 ########################################################################
 # ConfiguredSecondaryVertexCuts class
@@ -19,13 +16,8 @@ class ConfiguredSecondaryVertexCuts :
     self.__mode      = mode
     self.__extension = ""
     self.__set_indetflags()    # pointer to InDetFlags, don't use them directly
- 			       # to allow sharing this code with the trigger
+                               # to allow sharing this code with the trigger
     
-    from AthenaCommon.GlobalFlags import globalflags
-    from AthenaCommon.DetFlags import DetFlags
-    from AthenaCommon.BeamFlags import jobproperties
-    from RecExConfig.RecFlags import rec
-
     # ------------------------------------------------
     # --- secondary vertexing setup of cuts
     # ------------------------------------------------
diff --git a/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredVertexingCuts.py b/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredVertexingCuts.py
index 889bc5fb701b..1507f2b33d1c 100644
--- a/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredVertexingCuts.py
+++ b/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredVertexingCuts.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 from __future__ import print_function
 
@@ -32,10 +32,7 @@ class ConfiguredVertexingCuts :
 #pointer to InDetFlags, don't use them directly
 #to allow sharing this code with the trigger  
    self.__set_indetflags()     
- 			      
-   from AthenaCommon.GlobalFlags import globalflags
-   from AthenaCommon.DetFlags import DetFlags
-   from AthenaCommon.BeamFlags import jobproperties
+
    from RecExConfig.RecFlags import rec
 
 #-----------------------------------------------------------------------
diff --git a/InnerDetector/InDetExample/InDetRecExample/python/InDetJobProperties.py b/InnerDetector/InDetExample/InDetRecExample/python/InDetJobProperties.py
index e945c5532be8..bf315e2c2a91 100644
--- a/InnerDetector/InDetExample/InDetRecExample/python/InDetJobProperties.py
+++ b/InnerDetector/InDetExample/InDetRecExample/python/InDetJobProperties.py
@@ -1,8 +1,5 @@
 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-from __future__ import print_function
-
-
 #
 ## @file InDetRecExample/python/InDetJobProperties.py
 ## @brief Python module to hold common flags to configure JobOptions
@@ -26,7 +23,6 @@ __all__    = [ "InDetJobProperties" ]
 
 from AthenaCommon.JobProperties import JobProperty, JobPropertyContainer
 from AthenaCommon.JobProperties import jobproperties
-import AthenaCommon.SystemOfUnits as Units
 
 ##-----------------------------------------------------------------------------
 ## 0th step: define infrastructure JPs DO NOT MODIFY THEM!!!
@@ -45,7 +41,7 @@ class Enabled(JobProperty):
       if not(obj._locked):
          obj.__dict__['statusOn']=True
       else:
-         obj._log.info('The JobProperty %s is blocked' % obj.__name__)
+         obj._log.info('The JobProperty %s is blocked', obj.__name__)
 
    def set_Off_NoDoAction(self, obj):
       """ Sets statusOn equals to False w/o _undo_action.
@@ -53,7 +49,7 @@ class Enabled(JobProperty):
       if not(obj._locked):
          obj.__dict__['statusOn']=False
       else:
-         obj._log.info('The JobProperty %s is blocked' % obj.__name__)
+         obj._log.info('The JobProperty %s is blocked', obj.__name__)
 
    def _do_action(self):
       for obj in self._the_same_context_objects():
@@ -1685,9 +1681,7 @@ class InDetJobProperties(JobPropertyContainer):
       # THIS METHOD MUST BE THE FIRST TO BE CALLED. DO NOT MOVE IT OR ADD THINGS IN FRONT
       self.setupDefaults()
 
-      from AthenaCommon.GlobalFlags import globalflags
       from AthenaCommon.DetFlags    import DetFlags
-      from RecExConfig.RecFlags     import rec
 
       # -------------------------------------------------------------------
       # Cosmics TRT extension, NewTracking needs full tracking geometry 
@@ -1741,7 +1735,7 @@ class InDetJobProperties(JobPropertyContainer):
       #
       # no new tracking if pixel or sct off (new tracking = inside out only)
       self.doNewTracking = self.doNewTracking() and (DetFlags.haveRIO.pixel_on() or DetFlags.haveRIO.SCT_on())
-	  # always use truth tracking for SplitReco and never use it if pixel or sct off
+      # always use truth tracking for SplitReco and never use it if pixel or sct off
       self.doPseudoTracking = (self.doPseudoTracking() or self.doSplitReco()) and (DetFlags.haveRIO.pixel_on() or DetFlags.haveRIO.SCT_on())
       #
       # no low pt tracking if no new tracking before or if pixels are off (since low-pt tracking is pixel seeded)!  Explicitly veto for cosmics to aid T0
@@ -1884,22 +1878,22 @@ class InDetJobProperties(JobPropertyContainer):
       # ---- Refit of tracks
       # --------------------------------------------------------------------
       #
-      if (self.trackFitterType() is not 'KalmanFitter' and self.trackFitterType() is not 'KalmanDNAFitter') :
+      if (self.trackFitterType() != 'KalmanFitter' and self.trackFitterType() != 'KalmanDNAFitter') :
          self.refitROT = True
       if not self.refitROT() and not self.redoTRT_LR() :
          print('ConfiguredInDetFlags.py       WARNING refitROT and redoTRT_LR are both False, NOT RECOMMENDED!')
       #
       # refKF needs a new method in IUpdator, where there is currently only one implementation
-      if (self.trackFitterType() is 'ReferenceKalmanFitter'):
+      if (self.trackFitterType() == 'ReferenceKalmanFitter'):
           self.kalmanUpdator = 'amg'
       #
       # check if a valid fitter has been used
-      if not (    (self.trackFitterType() is 'KalmanFitter')
-               or (self.trackFitterType() is 'KalmanDNAFitter')
-               or (self.trackFitterType() is 'ReferenceKalmanFitter')
-               or (self.trackFitterType() is 'DistributedKalmanFilter')
-               or (self.trackFitterType() is 'GlobalChi2Fitter' )
-               or (self.trackFitterType() is 'GaussianSumFilter') ):
+      if not (    (self.trackFitterType() == 'KalmanFitter')
+               or (self.trackFitterType() == 'KalmanDNAFitter')
+               or (self.trackFitterType() == 'ReferenceKalmanFitter')
+               or (self.trackFitterType() == 'DistributedKalmanFilter')
+               or (self.trackFitterType() == 'GlobalChi2Fitter' )
+               or (self.trackFitterType() == 'GaussianSumFilter') ):
          print('InDetJobProperties.py       WARNING unregistered or invalid track fitter setup.')
          print('                                      --> re-setting to TrkKalmanFitter.')
          self.trackFitterType = 'KalmanFitter'
@@ -2011,7 +2005,7 @@ class InDetJobProperties(JobPropertyContainer):
 
   def doNtupleCreation(self):
     return (self.doSctClusterNtuple() or
-	    self.doTrkNtuple() or self.doPixelTrkNtuple() or self.doSctTrkNtuple() or
+            self.doTrkNtuple() or self.doPixelTrkNtuple() or self.doSctTrkNtuple() or
             self.doTrtTrkNtuple() or self.doVtxNtuple() or self.doConvVtxNtuple() or
             self.doV0VtxNtuple())
 
@@ -2567,14 +2561,14 @@ class InDetJobProperties(JobPropertyContainer):
       print('* load TrackingGeometry')
     if self.loadExtrapolator() :
       print('* load Extrapolator:')
-      if self.propagatorType() is 'RungeKutta' :
+      if self.propagatorType() == 'RungeKutta' :
         print('* - load Runge Kutta propagator')
-      elif self.propagatorType() is 'STEP' :
+      elif self.propagatorType() == 'STEP' :
         print('* - load STEP propagator')
       if self.materialInteractions() :
         print('* - use material corrections of type %s in extrapolation and fit'% self.materialInteractionsType())
     if self.loadUpdator() :
-      if self.kalmanUpdator() is "fast" :
+      if self.kalmanUpdator() == "fast" :
         print('* load MeasurementUpdator_xk')
       else:
         print('* load MeasurementUpdator')
diff --git a/InnerDetector/InDetExample/InDetRecExample/python/InDetKeys.py b/InnerDetector/InDetExample/InDetRecExample/python/InDetKeys.py
index 8a54ef539b9d..9fe123b801b0 100644
--- a/InnerDetector/InDetExample/InDetRecExample/python/InDetKeys.py
+++ b/InnerDetector/InDetExample/InDetRecExample/python/InDetKeys.py
@@ -1,7 +1,4 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-
-from __future__ import print_function
-
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 ##
 ## @file InDetRecExample/python/InDetKeys.py
@@ -17,8 +14,6 @@ __author__ = "A. Wildauer"
 __version__= "$Revision: 1.19 $"
 __doc__    = "InDetContainerKeys"
 
-__all__    = [ "InDetKeyContainers" ]
-
 # kindly stolen from AthenaCommonFlags from S. Binet and M. Gallas
 
 ##-----------------------------------------------------------------------------
@@ -108,19 +103,18 @@ class TRT_RDOs(JobProperty):
     allowedTypes = ['str']
     StoredValue  = 'TRT_RDOs'
 
-	   
 class PixelPURDOs(JobProperty):
     """StoreGate key for PU pixel raw data objects"""
     statusOn     = True
     allowedTypes = ['str']
     StoredValue  = 'Pixel_PU_RDOs'
-	
+
 class SCT_PU_RDOs(JobProperty):
     """StoreGate key for PU SCT raw data objects"""
     statusOn     = True
     allowedTypes = ['str']
     StoredValue  = 'SCT_PU_RDOs'
-	
+
 class TRT_PU_RDOs(JobProperty):
     """StoreGate key for PU TRT raw data objects"""
     statusOn     = True
@@ -603,7 +597,7 @@ class TRTTracks_NewT(JobProperty):
     statusOn     = True
     allowedTypes = ['str']
     StoredValue  = 'TRTStandaloneTracks'
-	
+
 class PseudoTracks(JobProperty):
     """StoreGate key for the final track collection (PseudoTracking)"""
     statusOn     = True
diff --git a/InnerDetector/InDetExample/InDetRecExample/python/InDetRecExampleConfig.py b/InnerDetector/InDetExample/InDetRecExample/python/InDetRecExampleConfig.py
index d4968cf69d36..1cbd4a3f5935 100644
--- a/InnerDetector/InDetExample/InDetRecExample/python/InDetRecExampleConfig.py
+++ b/InnerDetector/InDetExample/InDetRecExample/python/InDetRecExampleConfig.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-from AthenaCommon import CfgMgr,CfgGetter
+from AthenaCommon import CfgGetter
 import AthenaCommon.SystemOfUnits as Units
 from InDetRecExample.TrackingCommon import setDefaults,copyArgs
 
@@ -195,7 +195,7 @@ def KalmanDNAFitter(name='KalmanDNAFitter',**kwargs) :
 
 def DistributedKalmanFilter(name="DistributedKalmanFilter", **kwargs) :
     pix_cluster_on_track_args = stripArgs(kwargs,['SplitClusterMapExtension','ClusterSplitProbabilityName','nameSuffix'])
-
+    from InDetRecExample                         import TrackingCommon
     from InDetRecExample.TrackingCommon          import setDefaults
     if 'ExtrapolatorTool' not in kwargs :
         kwargs = setDefaults(kwargs, ExtrapolatorTool = TrackingCommon.getInDetExtrapolator())
@@ -313,7 +313,6 @@ def InDetGlobalChi2FitterLowPt(name='InDetGlobalChi2FitterLowPt', **kwargs) :
                            RotCreatorTool        = TrackingCommon.getInDetRotCreator(**pix_cluster_on_track_args))
 
     from InDetRecExample.InDetJobProperties import InDetFlags
-    use_broad_cluster_any = InDetFlags.useBroadClusterErrors() and (not InDetFlags.doDBMstandalone())
     if 'BroadRotCreatorTool' not in kwargs and  not InDetFlags.doRefit():
         kwargs=setDefaults(kwargs,
                            BroadRotCreatorTool   = TrackingCommon.getInDetBroadRotCreator(**pix_cluster_on_track_args))
diff --git a/InnerDetector/InDetExample/InDetRecExample/python/TrackingCommon.py b/InnerDetector/InDetExample/InDetRecExample/python/TrackingCommon.py
index 90142d7220a3..761913acf116 100644
--- a/InnerDetector/InDetExample/InDetRecExample/python/TrackingCommon.py
+++ b/InnerDetector/InDetExample/InDetRecExample/python/TrackingCommon.py
@@ -1,7 +1,6 @@
 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-from __future__ import print_function
-
+from AthenaCommon.GlobalFlags import globalflags
 from AthenaCommon.Logging import logging
 log = logging.getLogger('TrackingCommon')
 
@@ -95,7 +94,7 @@ def makePublicTool(tool_creator) :
             if the_name != tool.name() :
                 raise Exception('Tool has not the exepected name %s but %s' % (the_name, tool.name()))
             if private is False :
-                log.debug ('Add to ToolSvc %s' % (tool.name()))
+                log.debug ('Add to ToolSvc %s', tool.name())
                 ToolSvc += tool
             return tool
         else :
@@ -211,7 +210,6 @@ def getRIO_OnTrackErrorScalingCondAlg( **kwargs) :
 
 
 def getEventInfoKey() :
-    from AthenaCommon.GlobalFlags import globalflags
     from AthenaCommon.DetFlags    import DetFlags
 
     isData = (globalflags.DataSource == 'data')
@@ -792,7 +790,6 @@ def getInDetPrdAssociationTool_setup(name='InDetPrdAssociationTool_setup',**kwar
     return getInDetPrdAssociationTool(name, **setDefaults(kwargs, SetupCorrect                   = True) )
 
 def getInDetPixelConditionsSummaryTool() :
-    from AthenaCommon.GlobalFlags import globalflags
     from InDetRecExample.InDetJobProperties import InDetFlags
     from PixelConditionsTools.PixelConditionsToolsConf import PixelConditionsSummaryTool
     pixelConditionsSummaryToolSetup = PixelConditionsSummaryTool("PixelConditionsSummaryTool",
@@ -880,7 +877,6 @@ def getInDetSCT_ConditionsSummaryTool() :
 def getInDetBoundaryCheckTool(name="InDetBoundarySearchTool", **kwargs):
     the_name = makeName(name, kwargs)
     from AthenaCommon.DetFlags import DetFlags
-    from InDetRecExample.InDetJobProperties import InDetFlags
 
     if 'SctSummaryTool' not in kwargs :
         kwargs = setDefaults( kwargs, SctSummaryTool   = getInDetSCT_ConditionsSummaryTool()  if DetFlags.haveRIO.SCT_on()   else None)
@@ -900,7 +896,6 @@ def getInDetBoundaryCheckTool(name="InDetBoundarySearchTool", **kwargs):
 @makePublicTool
 def getInDetHoleSearchTool(name = 'InDetHoleSearchTool', **kwargs) :
     the_name = makeName( name, kwargs)
-    from AthenaCommon.DetFlags    import DetFlags
     from InDetRecExample.InDetJobProperties import InDetFlags
 
     if 'Extrapolator' not in kwargs :
@@ -945,7 +940,6 @@ def getInDetRecTestBLayerTool(name='InDetRecTestBLayerTool', **kwargs) :
 @makePublicTool
 def getInDetTRTStrawStatusSummaryTool(name = "InDetTRT_StrawStatusSummaryTool", **kwargs) :
     the_name = makeName( name, kwargs)
-    from AthenaCommon.GlobalFlags import globalflags
     kwargs = setDefaults( kwargs, isGEANT4 = (globalflags.DataSource == 'geant4'))
     from TRT_ConditionsServices.TRT_ConditionsServicesConf import TRT_StrawStatusSummaryTool
     return TRT_StrawStatusSummaryTool(name = the_name, **kwargs )
@@ -977,7 +971,6 @@ def getInDetTRT_dEdxTool(name = "InDetTRT_dEdxTool", **kwargs) :
             or  InDetFlags.useExistingTracksAsInput(): # TRT_RDOs (used by the TRT_LocalOccupancy tool) are not present in ESD
         return None
 
-    from AthenaCommon.GlobalFlags import globalflags
     kwargs = setDefaults( kwargs, TRT_dEdx_isData = (globalflags.DataSource == 'data'))
 
     if 'TRT_LocalOccupancyTool' not in kwargs :
-- 
GitLab


From 3f0fdc65941c22eaaee0700300e60336b409cc3a Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Mon, 14 Dec 2020 11:14:38 +0100
Subject: [PATCH 012/225] RecExOnline: enable flake8, delete obsolete files

Enable flake8 and delete obsolete python modules and RTT files.
---
 .../RecExample/RecExOnline/CMakeLists.txt     |   8 +-
 .../python/OnlineISConfiguration.py           |  27 +-
 .../RecExOnline/python/comparison_plot.py     | 228 -----------
 .../RecExOnline/python/hash_tool.py           |   4 +-
 .../RecExOnline/python/power_of_test.py       |   7 +-
 .../RecExOnline/python/test_statistics.py     |  13 +-
 .../RecExample/RecExOnline/python/to_root.py  |  21 -
 .../RecExample/RecExOnline/python/utils.py    |  10 +-
 .../RecExOnline/share/RootHis_RTT.C           |  26 --
 .../share/SimpleJobOptions_ForRTT.py          |   1 -
 .../test/RecExOnline_TestConfiguration.xml    | 386 ------------------
 11 files changed, 30 insertions(+), 701 deletions(-)
 delete mode 100644 Reconstruction/RecExample/RecExOnline/python/comparison_plot.py
 delete mode 100644 Reconstruction/RecExample/RecExOnline/python/to_root.py
 delete mode 100644 Reconstruction/RecExample/RecExOnline/share/RootHis_RTT.C
 delete mode 100644 Reconstruction/RecExample/RecExOnline/share/SimpleJobOptions_ForRTT.py
 delete mode 100755 Reconstruction/RecExample/RecExOnline/test/RecExOnline_TestConfiguration.xml

diff --git a/Reconstruction/RecExample/RecExOnline/CMakeLists.txt b/Reconstruction/RecExample/RecExOnline/CMakeLists.txt
index 453eee1c0cd7..b77e0edbf06f 100644
--- a/Reconstruction/RecExample/RecExOnline/CMakeLists.txt
+++ b/Reconstruction/RecExample/RecExOnline/CMakeLists.txt
@@ -1,13 +1,11 @@
-################################################################################
-# Package: RecExOnline
-################################################################################
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # Declare the package name:
 atlas_subdir( RecExOnline )
 
 # Install files from the package:
-atlas_install_python_modules( python/*.py )
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
 atlas_install_joboptions( share/*.py )
-atlas_install_runtime( test/RecExOnline_TestConfiguration.xml share/RootHis*.C share/RecExOnline_Test*.C )
+atlas_install_runtime( share/RecExOnline_Test*.C )
 atlas_install_scripts( scripts/*.sh )
 
diff --git a/Reconstruction/RecExample/RecExOnline/python/OnlineISConfiguration.py b/Reconstruction/RecExample/RecExOnline/python/OnlineISConfiguration.py
index fbda833b60f6..bc2856ea6311 100644
--- a/Reconstruction/RecExample/RecExOnline/python/OnlineISConfiguration.py
+++ b/Reconstruction/RecExample/RecExOnline/python/OnlineISConfiguration.py
@@ -1,10 +1,5 @@
 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-from __future__ import print_function
-from future import standard_library
-standard_library.install_aliases()
-import subprocess
-
 import ispy
 
 
@@ -14,7 +9,7 @@ def GetAtlasReady():
       r4p = ISObject(IPCPartition("ATLAS"), 'RunParams.Ready4Physics', 'RunParams')
       r4p.checkout()
       return r4p.ready4physics
-   except:
+   except Exception:
       print ("#### Failed to determine if we are ready for physics")
       raise
 
@@ -33,15 +28,15 @@ def GetRunType():
       partition = "ATLAS"
   except KeyError:
     partition = "ATLAS"
-    mlog.warning("TDAQ_PARTITION not defined in environment, using %s as default" % partition)
+    mlog.warning("TDAQ_PARTITION not defined in environment, using %s as default", partition)
 
   #now try and read the information from IS
   try:
     from ipc import IPCPartition
     from ispy import ISObject
-    ipcPart = IPCPartition(partition);
+    ipcPart = IPCPartition(partition)
     if not ipcPart.isValid():
-      raise UserWarning("Partition %s invalid - cannot access run type settings" % partition);
+      raise UserWarning("Partition %s invalid - cannot access run type settings" % partition)
     runparams = ISObject(ipcPart, 'RunParams.RunParams', 'RunParams')
     runparams.checkout()
     beamEnergy = runparams.beam_energy
@@ -51,7 +46,7 @@ def GetRunType():
     beamEnergy = None
     projectTag = None
 
-  mlog.info("Setting project tag to %s" % projectTag)
+  mlog.info("Setting project tag to %s", projectTag)
   return (None, beamEnergy, projectTag) # the BeamType in the IS RunParams is not useful for auto-configuration
 
 def GetBFields():
@@ -61,16 +56,16 @@ def GetBFields():
 
   #BFields are read from initial partition
   partition = 'initial'
-  mlog.debug("Trying to read magnetic field configuration from partition %s" % partition)
+  mlog.debug("Trying to read magnetic field configuration from partition %s", partition)
 
   #now try and read the information from IS
   try:
     from ipc import IPCPartition
-    from ispy import ISObject
-    ipcPart = IPCPartition(partition);
+    ipcPart = IPCPartition(partition)
     if not ipcPart.isValid():
-      raise UserWarning("Partition %s invalid - cannot access magnetic field setting" % partition);
+      raise UserWarning("Partition %s invalid - cannot access magnetic field setting" % partition)
     #Get the current and valid status
+    #     from ispy import ISObject
     #     torCurrent = ISObject(ipcPart, 'DCS_GENERAL.MagnetToroidsCurrent.value', 'DdcFloatInfo')
     #     solCurrent = ISObject(ipcPart, 'DCS_GENERAL.MagnetSolenoidCurrent.value', 'DdcFloatInfo')
     #     torInvalid = ISObject(ipcPart, 'DCS_GENERAL.MagnetToroidsCurrent.invalid', 'DdcIntInfo')
@@ -107,8 +102,8 @@ def GetBFields():
     sys.exit(1)
 
   #print the result
-  mlog.info("Magnetic field in solenoid is %s" % ((solOn and "ON") or "OFF"))
-  mlog.info("Magnetic field in toroid is %s"   % ((torOn and "ON") or "OFF"))
+  mlog.info("Magnetic field in solenoid is %s", ((solOn and "ON") or "OFF"))
+  mlog.info("Magnetic field in toroid is %s",   ((torOn and "ON") or "OFF"))
 
   #finally return our values
   return (solCurrent, torCurrent)
diff --git a/Reconstruction/RecExample/RecExOnline/python/comparison_plot.py b/Reconstruction/RecExample/RecExOnline/python/comparison_plot.py
deleted file mode 100644
index 998b759b7ce1..000000000000
--- a/Reconstruction/RecExample/RecExOnline/python/comparison_plot.py
+++ /dev/null
@@ -1,228 +0,0 @@
-# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-
-"""
-Draw comparison plots and statistical tables for each 2 histograms inside 2 data sets.
-"""
-
-import rootpy.ROOT as ROOT
-from rootpy.plotting.hist import Hist
-from rootpy.plotting.style import get_style, set_style
-import rootpy.plotting.root2matplotlib as rplt
-import matplotlib
-import matplotlib.pyplot as plt
-import matplotlib.colors as colors
-import matplotlib.ticker
-import itertools
-import numpy as np
-import pandas as pd
-import re
-from collections import defaultdict
-import HistCompare.test_statistics as TS
-import copy
-from UnbinnedHist import UnbinnedHist
-from hash_tool import HashTool
-matplotlib.rcParams["text.usetex"]=True
-matplotlib.rcParams['text.latex.preamble']=['\\usepackage{booktabs}']
-def tree(): return defaultdict(tree)
-#set_style('ATLAS',mpl=True)
-def set_yaxis(ax, tick=None):
-    if tick == "%":
-        def to_percent(y, position):
-            s = format(100*y, '.1f')
-            if matplotlib.rcParams['text.usetex'] is True:
-                return s + r'$\%$'
-            else:
-                return s + '%'
-        formatter = matplotlib.ticker.FuncFormatter(to_percent)
-        ax.yaxis.set_major_formatter(formatter)
-def identity(*x):
-    if len(x)==1:
-        return x[0]
-    return x
-def formatted_plt_dict(plt_kw, length, **kwarg):
-    for i in range(length):
-        yield dict((key, val[i]) if np.iterable(val) else (key, val) for key, val in plt_kw.iteritems())
-
-# keyword arguments for matplotlib.pyplot.text
-TEXT_KW = {
-    "x": 0.94,
-    "y": 0.25,
-    "ha": "right",
-    "va": "center",
-    'zorder': 2}
-
-# keyword arguments for auto_statistic_table
-STATISTIC_TABLE_KW = {
-    "iterfunc": itertools.combinations,
-    "iterkey": {"r": 2},
-    "row_title_func": identity,
-    "col_title_func": identity, 
-    "table_fformat": ".2e",
-    "text_kw": TEXT_KW}
-
-# keyword arguments for matplotlib.pyplot.setp
-AXES_KW = {
-    "ylim":(0,None)}
-
-# keyword arguments for matplotlib.pyplot.plot
-PLT_KW = {
-    "linewidth": 2,
-    "color": None,
-    'zorder': 1
-    }
-
-def statistic_table_kw_func(ax):
-    statistic_table_kw = copy.deepcopy(STATISTIC_TABLE_KW)
-    statistic_table_kw["text_kw"].update({"axes": ax, "transform": ax.transAxes})
-    return statistic_table_kw
-
-def auto_draw(hist_dict, cumulative = False, normalized = False, table = True, axes = None, frameon = True, cmap = plt.cm.brg, add_statistic_table_kw = {}, add_axes_kw = {}, add_plt_kw = {}):
-    """
-    Draw comparison plots and statistical tables for each 2 histograms inside 2 data sets.
-    
-    Parameters
-    ----------
-    hist_dict : pandas dataframe
-        Input data. *hist_dict* Should have 2 *rootpy.plotting.Hist*/*UnbinnedHist* instances
-        in each row.
-    cumulative : bool, optional
-        If True, then a histogram is computed where each bin gives the counts in that bin plus all bins for smaller
-        values. The last bin gives the total number of datapoints. If normed is also True then the histogram is
-        normalized such that the last bin equals 1. If cumulative evaluates to less than 0 (e.g., -1), the direction
-        of accumulation is reversed. In this case, if normed is also True, then the histogram is normalized such that
-        the first bin equals 1.
-    normalized : bool, optional
-        If False, the result will contain the number of samples in each bin. If True, the result is the value of the 
-        probability density function at the bin, normalized such that the integral over the range is 1.
-    table : bool, optional
-        If True, places a statistical table on each axes.
-    axes : list of matplotlib axis, optional, default : None
-        if provided, plot on these axes. Note *axes* should have the same number as *hist_dict*. i.e.::
-        >>> len(axes) = len(hist_dict)
-    frameon : bool, optional, default : True
-        If False, suppress drawing the figure frame
-    cmap : matplotlib.colors.Colormap instance or list of str, optional, default : plt.cm.brg
-        list of any matplotlib colors.
-    add_statistic_table_kw : dict, optional
-        Additional Keyword Arguments for ``statistic_table``
-    add_axes_kw : dict, optional
-        Additional Keyword Arguments for ``matplotlib.pyplot.setp``
-    add_plt_kw : dict, optional
-        dditional Keyword Arguments for ``matplotlib.pyplot.plot``
-    
-    Returns
-    -------
-    [ax1, ax2, ...] : list
-    list of matplotlib axes
-    """
-    if axes == None:
-        axes = [plt.axes() for _ in hist_dict if plt.figure(frameon=frameon)]
-    for ax, kind in zip(axes, hist_dict): 
-        statistic_table_kw = statistic_table_kw_func(ax)
-        statistic_table_kw.update(add_statistic_table_kw)
-        axes_kw = AXES_KW
-        axes_kw.update(add_axes_kw)
-        plt_kw = PLT_KW
-        plt_kw.update(add_plt_kw)
-        if cmap:
-            plt_kw["color"] = cmap(np.linspace(0, 1, len(hist_dict)))   
-        plt_dicts = formatted_plt_dict(plt_kw, len(hist_dict))
-
-        for (i, h), d in zip(hist_dict[kind].iteritems(), plt_dicts):
-            entries = h.entries
-            h_ = h.clone("New1")
-            if normalized:
-                h_.Scale(1./h_.Integral())      
-            if cumulative:
-                arr = np.cumsum([bin.value for bin in h_ ])
-                h_.set_content(arr)
-            for key, val in d.iteritems():
-                setattr(h_,key,val)
-            rplt.hist(h_, label = "%s (%i)" % (statistic_table_kw["col_title_func"](i),entries), axes = ax)
-
-        ########################################################################
-        if np.all([type(v)==UnbinnedHist for v in hist_dict[kind].values]) and cumulative:
-            data_all = np.concatenate(map(UnbinnedHist.get_raw_data, hist_dict[kind].values))
-            if normalized:
-                cdfs = [sorted(np.searchsorted(data.get_raw_data(), data_all, side='right')*1.0 / data.get_raw_data().shape[0]) for data in hist_dict[kind].values]
-            else:
-                cdfs = [sorted(np.searchsorted(data.get_raw_data(), data_all, side='right')) for data in hist_dict[kind].values]
-            for i, cdf, d in zip(hist_dict[kind].keys(), cdfs, plt_dicts):
-                plt.plot(sorted(data_all), cdf, label = "%s (%i)" % (statistic_table_kw["col_title_func"](i),entries), linestyle="--", axes = ax, **d)
-        ########################################################################
-
-        ax.legend()
-        if table:
-            df = auto_statistic_table(hist_dict[kind], ax=ax, ret_table=False, ret_text=False, **statistic_table_kw)
-            if HASH.objs:
-                textkw = statistic_table_kw["text_kw"].copy()
-                text = ax.text(textkw.pop("x"), textkw.pop("y"), df[0].to_latex(escape=False, sparsify=False, index_names=False).replace("\n",""), **textkw)
-        ax.set_xlabel(kind, fontsize=25)
-        
-        plt.setp(ax, **axes_kw) 
-        if normalized:
-            ax.set_ylim(0,1)
-            set_yaxis(ax,tick='%')
-        if not cumulative:
-            ax.set_ylabel("Events", fontsize=25)
-        else:
-            ax.set_ylabel("Cumulative Events", fontsize=25)
-    return axes
-
-HASH = HashTool('hist_dict', ret_table=True)
-@HASH
-def auto_statistic_table(hist_dict, ax=None, ret_table=True, ret_text=True, **statistic_table_kw):
-    """Compute statistic tables for the 2 histograms in each row of *hist_dict*.
-    
-    Parameters
-    ----------
-    hist_dict : pandas dataframe
-        Input data. *hist_dict* Should have 2 *rootpy.plotting.Hist*/*UnbinnedHist* instances
-        in each row.
-    ax : matplotlib axis, optional, default : None
-        if provided, plot on this axis
-    statistic_table_kw : dict, optional
-        Other keyword arguments
-    ret_table : bool, optional, default : True
-        If True, returns the formatted table in *list* form.
-    ret_text : bool, optional, default : True
-        If True, returns the formatted table in *latex* form.
-    
-    Returns
-    -------
-    [text[, table]] : list
-        depending on *ret_table* and *ret_text*, returns a list with required inside.
-    """
-    header = ["Type of Test", "Bin", "T","P","NDF","Description"]
-    df_ = pd.DataFrame()
-    textkw = statistic_table_kw["text_kw"].copy()
-    for (nA,A),(nB,B) in statistic_table_kw["iterfunc"](hist_dict.iteritems(), **statistic_table_kw["iterkey"]):
-        A_Arr_Binned = np.array([bin.value for bin in A.bins()])
-        B_Arr_Binned = np.array([bin.value for bin in B.bins()])
-        bin_str = A_Arr_Binned.shape[0]
-        Table=[#["$\chi^2$ Absolute Comparison", bin_str] + list(TS.chi2_2samp(A_Arr_Binned, B_Arr_Binned, normed=False, binned=True)) + ["Scipy + Modificatoin"],
-        ["$\chi^2$ Shape Comparison",bin_str] + list(TS.chi2_2samp(A_Arr_Binned, B_Arr_Binned, normed=True, binned=True)) + ["Scipy + Modificatoin"],
-        ["",bin_str, A.Chi2Test(B,"WW CHI2"), A.Chi2Test(B,"WW"),'',"ROOT"],
-        ["Likelihood Ratio Shape Comparison",bin_str]+list(TS.likelihoodratio_ksamp(A_Arr_Binned, B_Arr_Binned))+["Scipy + Modification"],
-        #["Likelihood Value Shape Comparison",bin_str]+list(TS.likelihoodvalue_ksamp(A_Arr_Binned, B_Arr_Binned))+["Scipy + Modification"],
-        #["BDM Shape Comparison",bin_str] + list(TS.BDM_2samp(A_Arr_Binned, B_Arr_Binned))+["Scipy + Modification"],
-        ["K-S Shape Comparison",bin_str] + list(TS.ks_2samp(A_Arr_Binned,B_Arr_Binned,binned=True))+ ["SciPy + Modification"],
-        ["",bin_str,A.KolmogorovTest(B,"M"), A.KolmogorovTest(B), '',"ROOT"],
-        ["A-D Shape Comparison",bin_str] + list(TS.anderson_ksamp(A_Arr_Binned, B_Arr_Binned, binned=True)) + ["Scipy + Modification"],  
-        ["CVM Shape Comparison",bin_str] + list(TS.CVM_2samp(A_Arr_Binned, B_Arr_Binned, binned=True)) + ["Matlab"]]
-
-        if type(A)==UnbinnedHist and type(B)==UnbinnedHist:
-            Table.insert(8,  ["","Unbinned"] + list(TS.ks_2samp(A.get_raw_data(), B.get_raw_data(), binned=False)) + ["SciPy + Modification"])
-            Table.insert(10, ["","Unbinned"] + list(TS.anderson_ksamp(A.get_raw_data(), B.get_raw_data(), binned=False)) + ["Scipy"])
-            Table.insert(12, ["","Unbinned"] + list(TS.CVM_2samp(A.get_raw_data(), B.get_raw_data(), binned=False)) + ["Matlab"])
-
-        df=pd.DataFrame(Table, columns=header)
-        df["T/P"] = map(lambda tp: "/".join(["%"+statistic_table_kw["table_fformat"]]*2)%(tp[0],tp[1]), zip(df["T"],df.P))
-        df_ = df[header]
-    text = ax.text(textkw.pop("x"), textkw.pop("y"), df_.to_latex(escape=False, sparsify=False, index_names=False).replace("\n",""), **textkw)
-    result = []
-    if ret_text:
-        result.append(text)
-    if ret_table:
-        result.append(df_)
-    return result
diff --git a/Reconstruction/RecExample/RecExOnline/python/hash_tool.py b/Reconstruction/RecExample/RecExOnline/python/hash_tool.py
index fc00b999ddcb..272c5621d41f 100644
--- a/Reconstruction/RecExample/RecExOnline/python/hash_tool.py
+++ b/Reconstruction/RecExample/RecExOnline/python/hash_tool.py
@@ -1,9 +1,7 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 import inspect
 import warnings
-import numpy as np
-import sys
 
 class HashTool:
     def __init__(self, *args, **parse):
diff --git a/Reconstruction/RecExample/RecExOnline/python/power_of_test.py b/Reconstruction/RecExample/RecExOnline/python/power_of_test.py
index d63c9bcb31d5..f4d83c8e9a5f 100644
--- a/Reconstruction/RecExample/RecExOnline/python/power_of_test.py
+++ b/Reconstruction/RecExample/RecExOnline/python/power_of_test.py
@@ -1,9 +1,8 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 from scipy.stats import rv_discrete
 import test_statistics as TS
 import numpy as np
-import warnings
 
 # If True, import IPyParallel package to do the parallel computation.
 # And if IPyParallel is not installed, automatically turns it False.
@@ -121,7 +120,7 @@ def power_of_test(data1, data2, rvs_func = 'rvs_pairs', tests = ['chi2_2samp'],
     [p1, p2, ...] : 1-D array
         The corresponding p-values for each histogram pairs.
     """
-    if parallel == None: parallel = PARALLEL
+    if parallel is None: parallel = PARALLEL
     if parallel:
         try:
             global client
@@ -131,7 +130,7 @@ def power_of_test(data1, data2, rvs_func = 'rvs_pairs', tests = ['chi2_2samp'],
             jobs = []
             for i in range(N):
                 rvs_key['size'] = (size//N + 1) if (i < size % N) else size//N
-                jobs.append(client[client.ids[i]].apply_async(power_of_test, data1, data2, rvs_func, test, rvs_key, test_key, False))
+                jobs.append(client[client.ids[i]].apply_async(power_of_test, data1, data2, rvs_func, tests, rvs_key, test_key, False))
             ars = client._asyncresult_from_jobs(jobs)
             if sync:
                 ars.wait_interactive()
diff --git a/Reconstruction/RecExample/RecExOnline/python/test_statistics.py b/Reconstruction/RecExample/RecExOnline/python/test_statistics.py
index 3e956af00ed1..1d949bc8f10d 100644
--- a/Reconstruction/RecExample/RecExOnline/python/test_statistics.py
+++ b/Reconstruction/RecExample/RecExOnline/python/test_statistics.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 Test statistic functions.
 """
@@ -8,6 +8,7 @@ import numpy as np
 import scipy.stats
 import scipy.interpolate
 import scipy.special
+import statsmodels.api as sm
 import warnings
 import distributions as distr
 from sympy import binomial, log
@@ -94,7 +95,7 @@ def ks_2samp(data1, data2, binned=False):
     (0.07999999999999996, 0.41126949729859719)
 
     """
-    if binned == True:
+    if binned is True:
         cdf1 = np.cumsum(data1)
         cdf2 = np.cumsum(data2)
         n1 = cdf1[-1]
@@ -106,7 +107,7 @@ def ks_2samp(data1, data2, binned=False):
         n1 = data1.shape[0]
         n2 = data2.shape[0]
         ndf = float("nan")
-        if binned == False:
+        if binned is False:
             data1 = np.sort(data1)
             data2 = np.sort(data2)
             data_all = np.concatenate([data1, data2])
@@ -129,7 +130,7 @@ def ks_2samp(data1, data2, binned=False):
     en = np.sqrt(n1 * n2 / float(n1 + n2))
     try:
         prob = scipy.stats.distributions.kstwobign.sf((en + 0.12 + 0.11 / en) * d)
-    except:
+    except Exception:
         prob = 1.0
     if DEBUG:
         global statistic_seq
@@ -169,7 +170,7 @@ def chi2_2samp(data1, data2, normed=True, binned=True):
     This code is modified from scipy.stats.chisquare and extended with supporting on
     2 sample cases and shape comparison test. 
     """
-    if binned == True:
+    if binned is True:
         filter = ~((data1 == 0.) & (data2 == 0.))
         data1 = data1[filter] 
         data2 = data2[filter] 
@@ -385,7 +386,7 @@ def _anderson_ksamp_right(samples, Z, Zstar, k, n, N):
     A2kN = 0.
     lj = Z.searchsorted(Zstar[:-1], 'right') - Z.searchsorted(Zstar[:-1],  'left')
     Bj = lj.cumsum()
-    for i in arange(0, k):
+    for i in range(0, k):
         s = np.sort(samples[i])
         Mij = s.searchsorted(Zstar[:-1], side='right')
         inner = lj / float(N) * (N * Mij - Bj * n[i])**2 / (Bj * (N - Bj))
diff --git a/Reconstruction/RecExample/RecExOnline/python/to_root.py b/Reconstruction/RecExample/RecExOnline/python/to_root.py
deleted file mode 100644
index c355b1cf8d3b..000000000000
--- a/Reconstruction/RecExample/RecExOnline/python/to_root.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-import ROOT
-import numpy as np
-import warnings
-def fill_branch_by_arr(filename ,treename, list_of_branchname, list_of_entrylist):
-    of = ROOT.TFile(filename, 'update')
-    if of.GetListOfKeys().Contains(treename):
-        t = of.Get(treename)
-        warnings.warn('%r exsists.' % t, Warning)
-    else:
-        t = ROOT.TTree(treename, treename)
-    for branchname, entrylist in zip(list_of_branchname, list_of_entrylist):
-	    t.SetEntries(entrylist.size)
-	    address = np.zeros(1, 'float32')
-	    br = t.Branch(branchname, address, branchname+'/F')
-	    for en in entrylist:
-	        address[0] = en
-	        br.Fill()
-    of.Write("", 2)
-    of.Close()
\ No newline at end of file
diff --git a/Reconstruction/RecExample/RecExOnline/python/utils.py b/Reconstruction/RecExample/RecExOnline/python/utils.py
index 205690c7d8d2..64568d05abd3 100644
--- a/Reconstruction/RecExample/RecExOnline/python/utils.py
+++ b/Reconstruction/RecExample/RecExOnline/python/utils.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 from collections import defaultdict
 import numpy as np
 def tree(key_wrapper = None):
@@ -15,10 +15,10 @@ def get_array(hist):
     arr.SetSize(hist.GetNbinsX() + 2)
     return np.fromiter(arr, np.float)
 
-TAIL   = lambda s: u' └── {} '.format(s)
-BRANCH = lambda s: u' ├── {} '.format(s)
-LINE   = lambda s: u' │   {} '.format(s)
-SPACE  = lambda s: u'     {} '.format(s)
+TAIL   = lambda s: u' └── {} '.format(s)  # noqa: E731
+BRANCH = lambda s: u' ├── {} '.format(s)  # noqa: E731
+LINE   = lambda s: u' │   {} '.format(s)  # noqa: E731
+SPACE  = lambda s: u'     {} '.format(s)  # noqa: E731
 class TreeDict(defaultdict):
     def __init__(self, dic = {}, key_wrapper=None):
         super(defaultdict,self).__init__(dic)
diff --git a/Reconstruction/RecExample/RecExOnline/share/RootHis_RTT.C b/Reconstruction/RecExample/RecExOnline/share/RootHis_RTT.C
deleted file mode 100644
index cd21069e99e5..000000000000
--- a/Reconstruction/RecExample/RecExOnline/share/RootHis_RTT.C
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <iostream>
-#include <string>
-#include <fstream>
-
-#include "TH1F.h"
-#include "TFile.h"
-#include "TCanvas.h"
-#include "TSystem.h"
-#include "TKey.h"
-
-void RootHis_RTT() 
-{
-   
-   TFile *file = new TFile("Monitor.root");
-
-//    TH1F *h1_AK4LCTTopoJetsPt= (TH1F*)gDirectory->FindObjectAny("Jets/AntiKt4LCTTopoJets/pt");
-        TH1F *h1_AK4LCTTopoJetsPt= (TH1F*)gDirectory->FindObjectAny("pt");
-
-    TCanvas *c1 = new TCanvas("c1", "GIF Canvas", 400, 300);
-    h1_AK4LCTTopoJetsPt->Draw("HistE");
-    c1->Print("AK4LCTTopoJetsPt.png");
-       
-
-
-}
-
diff --git a/Reconstruction/RecExample/RecExOnline/share/SimpleJobOptions_ForRTT.py b/Reconstruction/RecExample/RecExOnline/share/SimpleJobOptions_ForRTT.py
deleted file mode 100644
index b9728ff2d1e9..000000000000
--- a/Reconstruction/RecExample/RecExOnline/share/SimpleJobOptions_ForRTT.py
+++ /dev/null
@@ -1 +0,0 @@
-theApp.EvtMax = 5
diff --git a/Reconstruction/RecExample/RecExOnline/test/RecExOnline_TestConfiguration.xml b/Reconstruction/RecExample/RecExOnline/test/RecExOnline_TestConfiguration.xml
deleted file mode 100755
index da82fc248d93..000000000000
--- a/Reconstruction/RecExample/RecExOnline/test/RecExOnline_TestConfiguration.xml
+++ /dev/null
@@ -1,386 +0,0 @@
-<?xml version="1.0"?>
-<!-- MB: Search for RUNNUMBER to replace the run input collections and setting -->
-<!-- MB: xml file validation: http://www.hep.ucl.ac.uk/atlas/AtlasTesting/DTD/onlineValidation/validator.html -->
-<!-- <!DOCTYPE unifiedTestConfiguration SYSTEM "https://test-rtt.web.cern.ch/test-rtt/brinick/Results/unifiedTestConfiguration.dtd"> --> <!-- xmltest -->
-<!DOCTYPE unifiedTestConfiguration SYSTEM "http://www.hep.ucl.ac.uk/atlas/AtlasTesting/DTD/unifiedTestConfiguration.dtd"> <!-- official -->
-<!-- A test version -->
-
-<unifiedTestConfiguration>
-    
-    <atn/>
-    <kv/>
-    <rtt xmlns="http://www.hep.ucl.ac.uk/atlas/AtlasTesting/rtt">
-        <rttContactPerson>Yun-Ju Lu</rttContactPerson>
-        <mailto>yunju@cern.ch</mailto>
-        <refRelease>20.1.X.Y</refRelease>
-        <jobList>
-        
-        <chain>
-        <chainName>OfflineChainJob</chainName>  
-         <sequential>
-          <chainElement>              
-           <jobTransform userJobId="RecExOnline_User_Offline_test_v1">
-             <doc>Recexonline test</doc>
-             <jobTransformJobName>First_RecexOnline_test</jobTransformJobName>
-             <jobTransformCmd>
-             athena.py -c "inpuevtMax=850" RecExOnline/RecExOnline_User_Offline.py 
-             </jobTransformCmd>
-             <group>RecExOnline_Test</group>
-             <queue>medium</queue>
-
-
-<!--
-
-             <test>
-               <modulename>RttLibraryTools</modulename>
-               <testname>FileGrepper</testname>
-          
-   
-               <arg>
-                 <fileGrepperArgs>
-                   <fileGrepperInputFile>*v1_log</fileGrepperInputFile>
-                  
-                   <fileGrepperSearchPattern>
-                     <fileGrepperPattern>Number of events processed</fileGrepperPattern>   
-                   </fileGrepperSearchPattern>   
-                 </fileGrepperArgs>
-               </arg>
-             </test>              
-            
-             <test>
-               <modulename>RttLibraryTools</modulename>
-               <testname>ROOTMacroRunner</testname>    
-                 <arg>
-                   <argname>macro</argname>
-                   <argvalue>RootHis_RTT.C</argvalue>
-                 </arg>
-             </test>
-             
-             <test>
-               <modulename>RttLibraryTools</modulename>
-               <testname>ROOTMacroRunner</testname>    
-                 <arg>
-                   <argname>macro</argname>
-                   <argvalue>RecExOnline_Test_Obj_His_RTT.C</argvalue>
-                 </arg>
-             </test>
--->
-             <test position="1">
-              <modulename>RttLibraryTools</modulename>
-               <testname>ROOTMacroRunner</testname>    
-                <arg>
-                <argname>macro</argname>
-                <argvalue>RecExOnline_Test_Obj_His_RTT_Cpp_rename.C</argvalue>
-                </arg>
-             </test>
-            
-             <alwaysRunPostProc />
-           </jobTransform>
-          <chainfileout>Monitor.root</chainfileout>
-         </chainElement>
-         
-         <chainElement>   
-          <jobTransform userJobId="RTTAlgs">
-             <doc>RTTAlgs</doc>
-             <jobTransformJobName>RTTAlgs</jobTransformJobName>
-             <jobTransformCmd>
-             athena.py RecExOnline/RTTAlgmain.py 
-             </jobTransformCmd>
-             <group>RecExOnline_Test</group>
-           
-             <chaindataset_info>
-             <jobTransformData />    
-             <chaindatasetName>Monitor.root</chaindatasetName>
-             <!-- If the file on the previous line is not in the chain store, then use the following fallback file. -->
-             <dataset_info>
-                 <jobTransformData />
-                 <datasetName>/afs/cern.ch/user/y/yunju/working/yunju/public/GM_ref_plots/Monitor.root</datasetName>
-             </dataset_info>
-        </chaindataset_info> 
-             <testToRemove>
-              <jobGroupName>AthenaRecExOnline_Test</jobGroupName>
-              <testidentifier>FileGrepperprocessed</testidentifier>
-             </testToRemove>
-          
-              <alwaysRunPostProc /> 
-            </jobTransform>     
-           </chainElement>
-
-             <chainElement>   
-          <jobTransform userJobId="ohp_hispathcheck">
-             <doc>ohp_hispathcheck</doc>
-             <jobTransformJobName>ohp_hispathcheck</jobTransformJobName>
-             <jobTransformCmd>
-             athena.py RecExOnline/Rtt_histogram.py 
-             </jobTransformCmd>
-             <group>RecExOnline_Test</group>
-           
-             <testToRemove>
-              <jobGroupName>AthenaRecExOnline_Test</jobGroupName>
-              <testidentifier>FileGrepperprocessed</testidentifier>
-             </testToRemove>
-          
-              <alwaysRunPostProc /> 
-            </jobTransform>     
-           </chainElement>
-
-          </sequential>
-         </chain>
-
-
-            <jobTransform userJobId="Online_reconstruction_autoconfiguration_test_v1">
-             <doc>Recexonline test Online_reconstruction_autoconfiguration</doc>
-             <jobTransformJobName>Online_reconstruction_autoconfiguration_test_v1</jobTransformJobName>
-             <jobTransformCmd>
-             athena.py -c "REO_doAutoConfiguration=True" RecExOnline/RecExOnline_User_Offline_isOnlineTrue.py 
-             </jobTransformCmd>
-             <group>RecExOnline_Test</group>
-             <queue>medium</queue> 
-            <test position="1">
-              <modulename>RttLibraryTools</modulename>
-               <testname>ROOTMacroRunner</testname>    
-               <arg>
-              <argname>macro</argname>
-              <argvalue>RecExOnline_Test_Obj_His_RTT_Cpp_Online.C</argvalue>
-              </arg>
-           </test>
-
-
-
-
-             <alwaysRunPostProc />
-            </jobTransform>
-            
-            <jobTransform userJobId="Online_reconstruction_autoconfiguration_False_test_v1">
-             <doc>Recexonline test Online_reconstruction_autoconfiguration_False</doc>
-             <jobTransformJobName>Online_reconstruction_autoconfiguration_False_test_v1</jobTransformJobName>
-             <jobTransformCmd>
-             athena.py -c "REO_doAutoConfiguration=False" RecExOnline/RecExOnline_User_Offline_isOnlineTrue.py 
-             </jobTransformCmd>
-             <group>RecExOnline_Test</group>
-             <queue>medium</queue>
-           <test position="1">
-             <modulename>RttLibraryTools</modulename>
-              <testname>ROOTMacroRunner</testname>    
-               <arg>
-               <argname>macro</argname>
-               <argvalue>RecExOnline_Test_Obj_His_RTT_Cpp_Online.C</argvalue>
-               </arg>
-            </test>
-
-
-
-
-
-
-             <alwaysRunPostProc />
-            </jobTransform>
-            
-            <jobTransform userJobId="Online_reconstruction_autoconfiguration_False_cosmics_test_v1">
-             <doc>Recexonline test Online_reconstruction_autoconfiguration_False_cosmics</doc>
-             <jobTransformJobName>Online_reconstruction_autoconfiguration_False_cosmics_test_v1</jobTransformJobName>
-             <jobTransformCmd>
-             athena.py -c "REO_doAutoConfiguration=False; beamType='cosmics'" RecExOnline/RecExOnline_User_Offline_isOnlineTrue.py 
-             </jobTransformCmd>
-             <group>RecExOnline_Test</group>
-             <queue>medium</queue> 
-             <test position="1">
-              <modulename>RttLibraryTools</modulename>
-               <testname>ROOTMacroRunner</testname>    
-                <arg>
-                <argname>macro</argname>
-                <argvalue>RecExOnline_Test_Obj_His_RTT_Cpp_Online.C</argvalue>
-                </arg>
-             </test>
-             
-              <alwaysRunPostProc />
-            </jobTransform>
-          
-            <jobTransform userJobId="RTTTool_test_v1">
-             <doc>RTTTool_test_v1</doc>
-             <jobTransformJobName>RTTTool_test_v1</jobTransformJobName>
-             <jobTransformCmd>
-             athena.py RecExOnline/SimpleJobOptions_ForRTT.py 
-             </jobTransformCmd>
-             <group>RecExOnline_Test</group>
- 
-             <testToRemove>
-              <jobGroupName>AthenaRecExOnline_Test</jobGroupName>
-              <testidentifier>FileGrepperprocessed</testidentifier>
-             </testToRemove>
-          
-              <alwaysRunPostProc /> 
-            </jobTransform>     
-          
-        
-
-
-    </jobList>
- <jobGroups>
-     <jobGroup name="AthenaRecExOnline_Test" parent="Athena">
-       <keepFilePattern>*.root</keepFilePattern>   
-       <keepFilePattern>*.png</keepFilePattern>    
-       <keepFilePattern>testlog*.log</keepFilePattern>      
-       <keepFilePattern>RTTAlg.html</keepFilePattern>      
-       <keepFilePattern>P1MON_RTT_result_template_v1.html</keepFilePattern>
-       <auxFilePattern>RootHis*.C</auxFilePattern>
-       <auxFilePattern>RecExOnline_Test*.C</auxFilePattern>
-       <auxFilePattern>RecExOnline_Test_Obj_His_RTT.C</auxFilePattern>
-       <auxFilePattern>RecExOnline_Test_Obj_His_RTT_CINT.C</auxFilePattern>
-
-<!--
-       <action>   
-               <modulename>RttLibraryTools</modulename>
-               <testname>ROOTMacroRunner</testname>    
-                 <arg>
-                   <argname>macro</argname>
-                   <argvalue>RecExOnline_Test_Obj_His_RTT.C</argvalue>
-                 </arg>
-       </action>
-       <action>    
-               <modulename>RttLibraryTools</modulename>
-               <testname>ROOTMacroRunner</testname>    
-                 <arg>
-                   <argname>macro</argname>
-                   <argvalue>RecExOnline_Test_Obj_His_RTT_CINT.C</argvalue>
-                 </arg>
-       </action>
-       <action>    
-               <modulename>RttLibraryTools</modulename>
-               <testname>ROOTMacroRunner</testname>    
-                 <arg>
-                   <argname>macro</argname>
-                   <argvalue>RecExOnline_Test_Obj_His_RTT_CINT.C</argvalue>
-                 </arg>
-       </action>
--->
-
-
-             <test position="2">
-
-                    <modulename>RttLibraryTools</modulename>
-                    <testname>FileGrepper</testname>
-                    <testidentifier>FileGrepperprocessed</testidentifier>
-             
-                    <arg>
-                        <argname>inputFile</argname>
-                        <argvalue>*v1_log</argvalue> <!-- put this one if you use job log -->
-                    </arg>
-                    <arg>
-                        <argname>outputFile</argname>
-                        <argvalue>testlogprocessed.log</argvalue>
-                    </arg>
-                    <arg>
-                        <argname>searchList</argname>
-                        <argvalue>Number of events processed</argvalue> <!-- put here the string you should find to mean all ok -->
-                    </arg>
-             </test>
-             
-             <test position="3">
-
-                    <modulename>RttLibraryTools</modulename>
-                    <testname>FileGrepper</testname>
-                    <testnegate />
-                    <testidentifier>FileGrepperERROR3</testidentifier>                     
-                    <arg>
-                        <argname>inputFile</argname>
-                        <argvalue>*v1_log</argvalue> <!-- put this one if you use job log -->
-                    </arg>
-                    <arg>
-                        <argname>outputFile</argname>
-                        <argvalue>testlogError.log</argvalue>
-                    </arg>
-                    <arg>
-                        <argname>searchList</argname>
-                        <argvalue>ERROR</argvalue> <!-- put here the string you should find to mean all ok -->
- 
-                    </arg>
-                    <noalarm /> 
-             </test>
-             <test position="4">
-
-                    <modulename>RttLibraryTools</modulename>
-                    <testname>FileGrepper</testname>
-                    <testidentifier>FileGrepperERROR4</testidentifier>
-                    
-                    <arg>
-                        <argname>inputFile</argname>
-                        <argvalue>*v1_log</argvalue> <!-- put this one if you use job log -->
-                    </arg>
-                    <arg>
-                        <argname>outputFile</argname>
-                        <argvalue>testlogError2.log</argvalue>
-                    </arg>
-                    <arg>
-                        <argname>searchList</argname>
-                        <argvalue>ERROR</argvalue> <!-- put here the string you should find to mean all ok -->
- 
-                    </arg>
-                    <noalarm /> 
-             </test>
-             
-
-             <test position="5">
-
-                    <modulename>RttLibraryTools</modulename>
-                    <testname>FileGrepper</testname>
-                    <testnegate />
-                    
-                    <testidentifier>FileGrepperFATAL</testidentifier>
-                    
-                    <arg>
-                        <argname>inputFile</argname>
-                        <argvalue>*v1_log</argvalue> <!-- put this one if you use job log -->
-                    </arg>
-                    <arg>
-                        <argname>outputFile</argname>
-                        <argvalue>testlogFATAL.log</argvalue>
-                    </arg>
-                    <arg>
-                        <argname>searchList</argname>
-                        <argvalue>FATAL</argvalue> <!-- put here the string you should find to mean all ok -->
-                         
-                    </arg>
-                    
-             </test>
-             
-             <test position="6">
-
-                    <modulename>RttLibraryTools</modulename>
-                    <testname>FileGrepper</testname>
-                    <testnegate />
-                    <testidentifier>FileGrepperTraceback</testidentifier>
-                    
-                    <arg>
-                        <argname>inputFile</argname>
-                        <argvalue>*v1_log</argvalue> <!-- put this one if you use job log -->
-                    </arg>
-                    <arg>
-                        <argname>outputFile</argname>
-                        <argvalue>testlogTraceback.log</argvalue>
-                    </arg>
-                    <arg>
-                        <argname>searchList</argname>
-                        <argvalue>Traceback</argvalue> <!-- put here the string you should find to mean all ok -->       
-                    </arg>
-                    <noalarm />
-             </test>
-             
-           <testToRemove>
-              <jobGroupName>RTT:Top</jobGroupName>
-              <testidentifier>CheckFileRunner0</testidentifier>
-           </testToRemove>
-           <testToRemove>
-              <jobGroupName>RTT:Athena</jobGroupName>
-              <testidentifier>Athena_FileGrepper</testidentifier>
-           </testToRemove>
-     
-     </jobGroup>
- </jobGroups>
-       
-
-
- 
-        
-    </rtt>
-</unifiedTestConfiguration>
-- 
GitLab


From 80396d226cee540940ff6f2b7bf736ecb2440e84 Mon Sep 17 00:00:00 2001
From: Debo <debottam.bakshi.gupta@cern.ch>
Date: Mon, 14 Dec 2020 11:42:04 +0100
Subject: [PATCH 013/225] Removing link to initialRoi from
 TrigEgammaPrecisionPhotonHypoAlgMT

---
 .../src/TrigEgammaPrecisionPhotonHypoAlgMT.cxx            | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigEgammaPrecisionPhotonHypoAlgMT.cxx b/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigEgammaPrecisionPhotonHypoAlgMT.cxx
index 6d59b33f34d2..82ff5a112846 100644
--- a/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigEgammaPrecisionPhotonHypoAlgMT.cxx
+++ b/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigEgammaPrecisionPhotonHypoAlgMT.cxx
@@ -52,9 +52,10 @@ StatusCode TrigEgammaPrecisionPhotonHypoAlgMT::execute( const EventContext& cont
   // loop over previous decisions
   size_t counter=0;
   for ( auto previousDecision: *previousDecisionsHandle ) {
-    //get RoI  
-    auto roiELInfo = findLink<TrigRoiDescriptorCollection>( previousDecision, initialRoIString() );
-    
+
+    //get updated RoI  
+    auto roiELInfo = findLink<TrigRoiDescriptorCollection>( previousDecision, roiString() );    
+
     ATH_CHECK( roiELInfo.isValid() );
     const TrigRoiDescriptor* roi = *(roiELInfo.link);
 
@@ -79,7 +80,6 @@ StatusCode TrigEgammaPrecisionPhotonHypoAlgMT::execute( const EventContext& cont
 	    auto d = newDecisionIn( decisions, name() );
 	    d->setObjectLink( "feature",  ph );
 	    TrigCompositeUtils::linkToPrevious( d, decisionInput().key(), counter );
-	    d->setObjectLink( roiString(), roiELInfo.link );
 	    toolInput.emplace_back( d, roi, photonHandle.cptr()->at(cl), previousDecision );
 	    validphotons++;
 
-- 
GitLab


From 26b383b5c7f09be12090bf8bfa948ea28454cb16 Mon Sep 17 00:00:00 2001
From: Oliver Majersky <oliver.majersky@cern.ch>
Date: Mon, 14 Dec 2020 14:06:57 +0100
Subject: [PATCH 014/225] Fix for loading CutBookkeepers for samples with only
 one weight.

---
 PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/Tools.cxx | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/Tools.cxx b/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/Tools.cxx
index 5fb00c304378..fe03601fd002 100644
--- a/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/Tools.cxx
+++ b/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/Tools.cxx
@@ -165,7 +165,10 @@ namespace top {
   void parseCutBookkeepers(xAOD::TEvent& xaodEvent, const std::size_t size,
       std::vector<std::string> &names, std::vector<float>& sumW, const bool isHLLHC) {
 
-    for (std::size_t icbk = 0; icbk < size; ++icbk) {
+    // workaround for PMGTruthWeightTool returning ZERO weights, when sample has ONLY ONE weight...
+    const std::size_t modifiedSize = (size == 0) ? 1 : size;
+
+    for (std::size_t icbk = 0; icbk < modifiedSize; ++icbk) {
       const std::string cbkName = (icbk == 0) ? "CutBookkeepers" : "CutBookkeepers_weight_" + std::to_string(icbk);
       const xAOD::CutBookkeeperContainer* cutBookKeepers = nullptr;
       top::check(xaodEvent.retrieveMetaInput(cutBookKeepers, cbkName), "Cannot retrieve CutBookkeepers: " + cbkName);
-- 
GitLab


From 5599f06d214b3a81cfd4a0e37e95b7ed94d19f9f Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Mon, 14 Dec 2020 14:20:46 +0100
Subject: [PATCH 015/225] MissingETD3PDMaker: enable flake8, delete unused
 files

Enable flake8 and delete unused/obsolete python modules.
---
 .../MissingETD3PDMaker/CMakeLists.txt         |   2 +-
 .../python/METGetterTrack.py                  | 100 ----------------
 .../python/MissingETCompAssociation.py        |  54 ---------
 .../python/MissingETD3PD.py                   |  57 +--------
 .../python/MissingETD3PDMakerFlags.py         |  18 +--
 .../python/MissingETD3PDTriggerBitsObject.py  |  19 ---
 .../python/MissingETD3PD_GoodnessModule.py    |  30 -----
 .../python/MissingETGoodnessD3PDObject.py     |   6 +-
 .../python/STVFMETGetter.py                   | 113 ------------------
 9 files changed, 17 insertions(+), 382 deletions(-)
 delete mode 100644 PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/METGetterTrack.py
 delete mode 100644 PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETCompAssociation.py
 delete mode 100644 PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETD3PDTriggerBitsObject.py
 delete mode 100644 PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETD3PD_GoodnessModule.py
 delete mode 100644 PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/STVFMETGetter.py

diff --git a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/CMakeLists.txt b/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/CMakeLists.txt
index 5f934fcd6f0a..8681b0e32097 100644
--- a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/CMakeLists.txt
+++ b/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/CMakeLists.txt
@@ -15,6 +15,6 @@ atlas_add_component( MissingETD3PDMaker
                      LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} CaloEvent StoreGateLib EventKernel GaudiKernel D3PDMakerInterfaces D3PDMakerUtils JetEvent MissingETEvent MissingETGoodnessLib MissingETPerformanceLib Particle AthenaKernel FourMomUtils xAODMissingET muonEvent egammaEvent tauEvent )
 
 # Install files from the package:
-atlas_install_python_modules( python/*.py )
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
 atlas_install_joboptions( share/*.py )
 
diff --git a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/METGetterTrack.py b/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/METGetterTrack.py
deleted file mode 100644
index 69d30a442ef5..000000000000
--- a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/METGetterTrack.py
+++ /dev/null
@@ -1,100 +0,0 @@
-# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-
-##############################################################################################
-#
-# METTrack Getters for MissingET.METAlg
-#
-# Author : Jet Goodson after S. Resconi
-# Date :   27 March  2010
-#
-#How to run this:
-#include this file
-#then add the line:
-#METGetterTrack()
-#before your alg (ie, the d3pd)
-##############################################################################################
-
-from AthenaCommon.SystemOfUnits import *  # loads MeV etc...
-from AthenaCommon.Constants import *      # Loads DEBUG INFO etc..
-from AthenaCommon.Logging import logging  # loads logger
-import traceback                          # to allow printout of trace back
-
-from RecExConfig.Configured import Configured            # import base class
-
-from MissingET.METRefGetter import getStandardCalibTool  # to get calib from DB
-
-from CaloTools.CaloNoiseToolDefault import CaloNoiseToolDefault           
-theCaloNoiseTool=CaloNoiseToolDefault()                                   
-from AthenaCommon.AppMgr import ToolSvc                                   
-ToolSvc+=theCaloNoiseTool
-
-class METGetterTrack ( Configured ):
-	   
-    def configure(self):
-        mlog = logging.getLogger ('METGetterTrack::configure:')
-        mlog.info ('entering')
-        
-        # now configure the algorithm       
-        try:
-            from MissingET.MissingETConf import METAlg
-            theMETAlg=METAlg("METAlg")
-        except:                                               
-            mlog.error("could not import MissingET.METAlg")   
-            mlog.error(traceback.format_exc())
-            return False       
-	        
-                
-        from AthenaCommon.DetFlags import DetFlags
-        if DetFlags.detdescr.ID_on():   
-            try:                                                                     
-                from MissingET.MissingETConf import METTrackTool                             
-                theMETTrackTool = METTrackTool("METTrack");                           
-
-                
-                # if doFastCaloSim set calibrator tool for ATLFAST2                           
-                from CaloRec.CaloCellFlags import jobproperties                               
-                if jobproperties.CaloCellFlags.doFastCaloSim:                                 
-                    doAtlfastII=True                                                         
-                else:                                                                         
-                    doAtlfastII=False
-                    
-                cellcalibtool  = getStandardCalibTool(doAtlfastII);
-                calibtool_name = cellcalibtool.name();
-                  
-                # add track select user interface                                             
-                theMETTrackTool.trackd0          = 1.5            # cut on trackd0           
-                theMETTrackTool.trackz0          = 1.50            # cut on trackz0           
-                theMETTrackTool.trackPtMin       = 500.0           # cut on trackPtMin       
-                theMETTrackTool.trackPtMax       = 9999999.0                                 
-                theMETTrackTool.trackPixelHits   = 1                                         
-                theMETTrackTool.trackSCTHits     = 6                                         
-                theMETTrackTool.trackChi2OverNdf = 999999                                     
-                theMETTrackTool.UseInsideOut     = 1
-                
-                theMETTrackTool.outKey           = "MET_Track"                                                           
-                
-            except:                                                                           
-                mlog.error("could not get handle to METTrackTool Quit")                       
-                mlog.error(traceback.format_exc())
-                return False                                                                 
-	       
-            # add cellcalibtool                                                               
-            theMETTrackTool += cellcalibtool                                                 
-            
-            # add  METTrackTool to list of tools                                             
-            theMETAlg.AlgTools+= [ theMETTrackTool.getFullName() ]                     
-            
-            # add tools to alg                                                               
-            theMETAlg += theMETTrackTool
-
-
-#------------------------------------------------------------------------------------------------
-	        # add algorithm to topSequence (this should always come at the end)
-	
-        mlog.info(" now adding to topSequence")       
-        from AthenaCommon.AlgSequence import AlgSequence
-        topSequence = AlgSequence()               
-        topSequence += theMETAlg
-	                   
-        return True     
-            
diff --git a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETCompAssociation.py b/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETCompAssociation.py
deleted file mode 100644
index 27b3d46d3622..000000000000
--- a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETCompAssociation.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-# $Id$
-#
-# @file MissingETD3PDMaker/python/MissingETAssociation.py
-# @author Jet Goodson <jgoodson@cern.ch>
-# @date September, 2010
-# @brief Helper for setting up a MissingET association to a contained object.
-#
-
-import D3PDMakerCoreComps
-import MissingETD3PDMaker
-from D3PDMakerCoreComps.D3PDObject import D3PDObject
-
-
-def MissingETCompAssociation (parent,
-                              type_name,
-                              default_sgkey,
-                              assocTool = MissingETD3PDMaker.MissingETCompAssociationTool,
-                              prefix = '',
-                              matched = '',
-                              level = 0,
-                              objectType = 'egamma',
-                              blockname = None,
-                              allowMissing = False,
-                              *args, **kw):
-   
-    if blockname == None:
-        blockname = prefix + 'METCompAssoc'
-
-    def maker (name, prefix, object_name,
-               sgkey = default_sgkey,
-               getter = None,
-               assoc = None):
-
-        if not getter:
-            getter = D3PDMakerCoreComps.SGObjGetterTool \
-                     (name + '_Getter',
-                      TypeName = type_name,
-                      SGKey = sgkey)
-        
-        assoc = assocTool (name + 'Assoc',
-                           Getter = getter,
-                           ObjectType = objectType,
-                           AllowMissing = allowMissing)
-        
-        return D3PDMakerCoreComps.ContainedAssociationFillerTool (name,
-                                                                  Prefix = prefix,
-                                                                  Associator = assoc,
-                                                                  Matched = matched)
-
-    obj = D3PDObject (maker, prefix)
-    parent.defineBlock (level, blockname, obj)
-    return obj
diff --git a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETD3PD.py b/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETD3PD.py
index 8ddaf7dbed5e..c37c458c371f 100644
--- a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETD3PD.py
+++ b/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETD3PD.py
@@ -1,67 +1,20 @@
-# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 import D3PDMakerCoreComps
-from D3PDMakerConfig.D3PDMakerFlags           import D3PDMakerFlags
-from RecExConfig.RecFlags import rec
-from MissingETD3PDMaker.MissingETD3PDMakerFlags import *
-from MissingETD3PDMaker.MissingETD3PDObject   import *
-from MissingETD3PDMaker.MissingETGoodnessD3PDObject import 	MissingETGoodnessD3PDObject
-## from TrackD3PDMaker.TrackD3PDMakerFlags              import *
-## from CaloD3PDMaker.ClusterD3PDObject                 import ClusterD3PDObject
-## from egammaD3PDMaker.ElectronD3PDObject              import ElectronD3PDObject
-## from egammaD3PDMaker.PhotonD3PDObject                import PhotonD3PDObject
-## from MuonD3PDMaker.MuonD3PDObject                    import MuonD3PDObject
-## from JetD3PDMaker.JetD3PDObject                      import JetD3PDObject
-## from TauD3PDMaker.TauD3PDObject                      import TauD3PDObject
+from MissingETD3PDMaker.MissingETD3PDObject import MissingETD3PDObject
 
 from AthenaCommon.AlgSequence import AlgSequence
 topSequence = AlgSequence()
-		
+
 def MissingETD3PD (file,
                    level = 10,
                    tuplename = 'METD3PD',
                    seq = topSequence,
                    D3PDSvc = 'D3PD::RootD3PDSvc'):
-	
+
     alg = D3PDMakerCoreComps.MakerAlg(tuplename, seq,
                                       file = file, D3PDSvc = D3PDSvc)
 
-    alg += MissingETD3PDObject (level=level, allowMissing = True, exclude=['MET_Base', 'MET_Truth_Int', 'MET_RefFinal_Phi', 'MET_MuonBoy_Et', 'MET_RefJet_SumEt'])#, exclude = ['MET_Muon_Isol_Muid', 'MET_Muon_Total_Muid', 'MET_Muon_NonIsol_Muid','MET_Muon_Isol_Staco', 'MET_Muon_Total_Staco', 'MET_Muon_NonIsol_Staco', 'MET_SoftJets', 'MET_RefMuon_Muid', 'MET_RefMuon_Staco', 'MET_RefMuon_Track_Muid', 'MET_RefMuon_Track_Staco'])
-    ##the terms in the exclude before this are specialized terms used by MET experts. They're not in regular AODs or ESDs [yet?], just specialized datasets used for the Pisa Hadronic Cal Workshop - so you may want to exclude them, otherwise they may show up as zeroed sets
-  #  alg += MissingETGoodnessD3PDObject (level=level, allowMissing = True) 
-
-    ##Example of a custom object
-    #alg += MissingETD3PDObject (level=level, sgkey = MissingETD3PDMakerFlags.METRefEleSGKey(), prefix=MissingETD3PDMakerFlags.METRefEleSGKey(), allowMissing = True)
-
-   ##  #More involved custom example - these are setup for custom MET D3PDs for the Pisa Hadronic Cal Workshop
-##     customMETs_Staco = ['MET_RefFinal', 'MET_RefGamma', 'MET_RefEle', 'MET_RefTau', 'MET_RefJet', 'MET_RefMuon' ,'MET_RefMuon_Staco', 'MET_CellOut', 'MET_Cryo', 'MET_Muon_Isol_Staco', 'MET_Muon_NonIsol_Staco', 'MET_Muon_Total_Staco', 'MET_SoftJets', 'MET_RefMuon_Track', 'MET_RefMuon_Track_Staco']
-
-
-##     customMETs_Muid = ['MET_RefFinal', 'MET_RefGamma', 'MET_RefEe', 'MET_RefTau', 'MET_RefJet', 'MET_RefMuon' ,'MET_RefMuon_Muid', 'MET_CellOut', 'MET_Cryo', 'MET_Muon_Isol_Muid', 'MET_Muon_NonIsol_Muid', 'MET_Muon_Total_Muid', 'MET_SoftJets', 'MET_RefMuon_Track', 'MET_RefMuon_Track_Muid']
-
-
-##     for custom in customMETs_Staco:
-##         alg += MissingETD3PDObject (level=0, sgkey = custom+'_LCW_pt20', prefix=custom+'_LCW_pt20', allowMissing = True)
-##         alg += MissingETD3PDObject (level=0, sgkey = custom+'_GCW_pt20', prefix=custom+'_GCW_pt20', allowMissing = True)
-##         alg += MissingETD3PDObject (level=0, sgkey = custom+'_LCW_NI_pt20_noSoftJets_eflow', prefix=custom+'_LCW_NI_pt20_noSoftJets_eflow', allowMissing = True)
-
-##     for custom in customMETs_Muid: 
-##         alg += MissingETD3PDObject (level=0, sgkey = custom+'_GCW_NI_pt20_Muid', prefix=custom+'_GCW_NI_pt20_Muid', allowMissing = True)
-##         alg += MissingETD3PDObject (level=0, sgkey = custom+'_LCW_NI_pt20_Muid_eflow', prefix=custom+'_LCW_NI_pt20_Muid_eflow', allowMissing = True)
-        
-        
-   ##  alg += ElectronD3PDObject(0)
-##     alg += PhotonD3PDObject(0)
-##     alg += TauD3PDObject(0)
-##     alg += MuonD3PDObject(0, sgkey='StacoMuonCollection', prefix="mu_staco_")
-##     alg += MuonD3PDObject(0, sgkey='MuidMuonCollection', prefix="mu_muid_")
-##     alg += JetD3PDObject(0, sgkey=MissingETD3PDMakerFlags.METDefaultJetCollectionSGKey(), prefix="jet_"+MissingETD3PDMakerFlags.METDefaultJetCollectionSGKey()[:-4].lower()+"_")
-##     alg += ClusterD3PDObject(0, prefix='cl_')
-##     #TrackD3PDMakerFlags.stor    eTrackPredictionAtBLayer = False
-    ##If you want a custom objecto MissingEtCalo type use MissingETCaloD3PDObject
-    ##Or TruthMETD3PDObject
-    ##JetsInfoMETD3PDObject
-    ##EtaRingsMETD3PDObject
-    ##those and MissingETD3PDObject are the distinct types
+    alg += MissingETD3PDObject (level=level, allowMissing = True, exclude=['MET_Base', 'MET_Truth_Int', 'MET_RefFinal_Phi', 'MET_MuonBoy_Et', 'MET_RefJet_SumEt'])
 
     return alg
diff --git a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETD3PDMakerFlags.py b/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETD3PDMakerFlags.py
index 72875c15b0ce..70553395ae12 100644
--- a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETD3PDMakerFlags.py
+++ b/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETD3PDMakerFlags.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # $Id$
 #
@@ -97,9 +97,9 @@ _sgkey_prop ('METMuonsSpectroSGKey', 'MET_Muons_Spectro') # 3rd chain
 _sgkey_prop ('METMuonsTrackSGKey', 'MET_Muons_Track') # 3rd chain
 
 _sgkey_prop ('METTruthPileUpSGKey', 'MET_Truth_PileUp')
-_sgkey_prop ('AllCaloCellsSGKey',  'AllCalo');##change to AllCalo for ESD use AODCellContainer for AOD
-_sgkey_prop ('METDefaultJetCollectionSGKey', 'AntiKt4LCTopoJets,Cone4H1TopoJets'); ##probably want to key to default later
-_sgkey_prop ('METDefaultTrackCollectionSGKey', 'TrackParticleCandidate'); ##probably want to key to default later
+_sgkey_prop ('AllCaloCellsSGKey',  'AllCalo') ##change to AllCalo for ESD use AODCellContainer for AOD
+_sgkey_prop ('METDefaultJetCollectionSGKey', 'AntiKt4LCTopoJets,Cone4H1TopoJets') ##probably want to key to default later
+_sgkey_prop ('METDefaultTrackCollectionSGKey', 'TrackParticleCandidate') ##probably want to key to default later
 _sgkey_prop ('METRefFinalEMSGKey', 'MET_RefFinal_em')
 _sgkey_prop ('METRefEleEMSGKey', 'MET_RefEle_em')
 _sgkey_prop ('METRefJetEMSGKey', 'MET_RefJet_em')
@@ -131,11 +131,11 @@ _sgkey_prop ('METDefaultJetPrefix', 'jet_antikt4LCtopo_MET_')
 _sgkey_prop ('METDefaultTrackPrefix', 'trk_MET_')
 
 ##########Trigger Flags
-_sgkey_prop ('METL1SGKey' , 'LVL1_ROI');
-_sgkey_prop ('METL2SGKey' , 'HLT_T2MissingET');
-_sgkey_prop ('METEFSGKey' , 'HLT_TrigEFMissingET');
-_sgkey_prop ('METEFNoiseSGKey' , 'HLT_TrigEFMissingET_noiseSupp');
-_sgkey_prop ('METEFFEBSGKey' , 'HLT_TrigEFMissingET_FEB');
+_sgkey_prop ('METL1SGKey' , 'LVL1_ROI')
+_sgkey_prop ('METL2SGKey' , 'HLT_T2MissingET')
+_sgkey_prop ('METEFSGKey' , 'HLT_TrigEFMissingET')
+_sgkey_prop ('METEFNoiseSGKey' , 'HLT_TrigEFMissingET_noiseSupp')
+_sgkey_prop ('METEFFEBSGKey' , 'HLT_TrigEFMissingET_FEB')
 
 class DoTruth (JobProperty):
     """If true, put truth information in D3PD."""
diff --git a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETD3PDTriggerBitsObject.py b/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETD3PDTriggerBitsObject.py
deleted file mode 100644
index b6e6c9a9b53d..000000000000
--- a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETD3PDTriggerBitsObject.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-# $Id$
-#
-#@file     MissingETD3PDMaker/python/MissingETD3PDTriggerBitsObject.py
-#@author   Jet Goodson <jgoodson@cern.ch> (copied Haifeng Li's & Scott Snyder's tool in egamma)
-#@date     12 Nov, 2009
-#@brief    Define trigger bit blocks for MissingET
-#
-
-from D3PDMakerCoreComps.D3PDObject  import make_Void_D3PDObject
-
-
-METD3PDTriggerBitsObject = \
-                         make_Void_D3PDObject (default_name = 'MissingETTriggerBitsFiller')
-
-#
-# The MET trigger bits are now added in MissingETD3PDObject;
-# this file is kept just for backwards compatibility.
diff --git a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETD3PD_GoodnessModule.py b/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETD3PD_GoodnessModule.py
deleted file mode 100644
index 74163f63b952..000000000000
--- a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETD3PD_GoodnessModule.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-import D3PDMakerCoreComps
-from D3PDMakerConfig.D3PDMakerFlags           import D3PDMakerFlags
-from RecExConfig.RecFlags import rec
-from MissingETD3PDMaker.MissingETD3PDMakerFlags import *
-from MissingETD3PDMaker.MissingETD3PDGoodnessD3PDObject   import *
-	
-from AthenaCommon.AlgSequence import AlgSequence
-topSequence = AlgSequence()
-
-## config file in case one only wishes to add the met goodness module
-		
-def METPhysicsD3PDGoodness (file,
-	                level = 4,
-	                tuplename = 'METPhysicsD3PD',
-	                seq = topSequence,
-	                D3PDSvc = 'D3PD::RootD3PDSvc'):
-	
-    alg = D3PDMakerCoreComps.MakerAlg(tuplename, seq,
-                                      file = file, D3PDSvc = D3PDSvc)
-
-    ## goodness filler 
-    alg += MissingETGoodnessD3PDObject (level, allow_missing = True) 
-    #Level 4 Objects ---- MetPerf Cleaning Variables
-    
-    alg += JetsInfoMETD3PDObject  (level, allow_missing = True) 
-    
-    return alg
-
diff --git a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETGoodnessD3PDObject.py b/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETGoodnessD3PDObject.py
index e748bea49aa6..392680b5549d 100644
--- a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETGoodnessD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/MissingETGoodnessD3PDObject.py
@@ -1,11 +1,9 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 import MissingETD3PDMaker
-import D3PDMakerCoreComps
 from D3PDMakerCoreComps.D3PDObject import make_SG_D3PDObject
 from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
-from MissingETD3PDMaker.MissingETD3PDMakerFlags import *
-from MissingETD3PDMaker.MissingETD3PDMakerConf import *
+from MissingETD3PDMaker.MissingETD3PDMakerFlags import MissingETD3PDMakerFlags
 
 MissingETGoodnessD3PDObject = \
                       make_SG_D3PDObject ('MissingET',
diff --git a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/STVFMETGetter.py b/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/STVFMETGetter.py
deleted file mode 100644
index b55512488d4e..000000000000
--- a/PhysicsAnalysis/D3PDMaker/MissingETD3PDMaker/python/STVFMETGetter.py
+++ /dev/null
@@ -1,113 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-# $Id: STVFMETGetter.py 525597 2012-11-13 12:54:50Z ssnyder $
-#
-# This configurable can schedule the STVF MET reconstruction if it's needed
-# by the D3PDMaker job.
-
-# Gaudi/Athena import(s):
-from AthenaCommon.Logging import logging
-from AthenaCommon.AlgSequence import AlgSequence
-from RecExConfig.Configured import Configured
-
-# D3PDMaker import(s):
-from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
-
-##
-# @short Class decorator for implementing the singleton pattern
-#
-# I just copy-pasted this code from the TauDiscriGetter code.
-# The idea is the same. The STVF MET reconstruction should only be
-# scheduled once into a job.
-#
-def singleton( cls ):
-
-    __log = logging.getLogger( "%s::__init__" % cls.__name__ )
-    __instances = {}
-
-    def getinstance( *args, **kwargs ):
-
-        # Check if the singleton has already been created:
-        if cls in __instances:
-            __log.debug( "STVF MET reconstruction already configured" )
-            return __instances[ cls ]
-
-        # Create the singleton:
-        obj = cls( *args, **kwargs )
-        __instances[ cls ] = obj
-        return obj
-
-    return getinstance
-
-##
-# @short Singleton class setting up the STVF MET reconstruction
-#
-# This class is responsible for setting up the STVF MET reconstruction for
-# D3PDMaker jobs.
-#
-# @author Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
-#
-# $Revision: 525597 $
-# $Date: 2012-11-13 13:54:50 +0100 (Tue, 13 Nov 2012) $
-@singleton
-class STVFMETGetter( Configured ):
-
-    def __init__( self,
-                  name = "STVFMETGetter",
-                  sequence = AlgSequence( D3PDMakerFlags.PreD3PDAlgSeqName() ),
-                  **kw):
-
-        # Remember the parameter(s):
-        self.__name = name
-        self.__sequence = sequence
-        Configured.__init__( self, **kw )
-
-    def configure( self ):
-
-        # Let the user know what we're doing:
-        __log = logging.getLogger( "STVFMETGetter" )
-        __log.info( "Configuring STVF MET reconstruction" )
-
-        # Sort out the sequence first. This is not pretty, but is needed
-        # in order to be able to use the default configurable nicely outside
-        # of D3PDMaker jobs.
-        topSeq = AlgSequence()
-        if self.__sequence != topSeq and \
-           not hasattr( topSeq, self.__sequence._name ):
-            topSeq += self.__sequence
-            pass
-
-        # Turn on MET reconstruction:
-        from RecExConfig.RecAlgsFlags import recAlgs
-        recAlgs.doMissingET.set_Value_and_Lock( True )
-
-        # Schedule the reconstruction of the STVF objects:
-        from MissingET.METRefGetter_newplup import make_METRefAlg
-        from AthenaCommon.SystemOfUnits import GeV
-        METalg_STVF = make_METRefAlg( _suffix = '_STVF' )
-        METalg_STVF.sequence                  = self.__sequence
-        METalg_STVF.jet_JetInputCollectionKey = 'AntiKt4LCTopoJets'
-        METalg_STVF.jet_JetPtCut              = 20.0 * GeV
-        METalg_STVF.jet_ApplyJetScale         = "Yes"
-        METalg_STVF.jet_UseJetMomentForScale  = True
-        METalg_STVF.jet_JetMomentForScale     = "LCJES"
-        METalg_STVF.jet_ApplyJetJVF           = "Yes"
-        METalg_STVF.jet_RunSoftJetsTool       = False
-        METalg_STVF.jet_calibType             = 'LocHad'
-        METalg_STVF.ele_calibType             = 'RefCalib'
-        METalg_STVF.gamma_calibType           = 'EmScale'
-        METalg_STVF.plupSuppCorr              = 'STVF'
-        METalg_STVF.celloutCorrection         = 'STVF'
-        METalg_STVF.cellout_calibType         = 'Eflow'
-        METalg_STVF.tau_calibType             = 'ExclRefCalib'
-        METalg_STVF.cryo_ApplyCorrection      = "Off"
-        METalg_STVF.muon_algorithm            = "Staco"
-        METalg_STVF.muon_isolationAlg         = "dRJet"
-
-        # Only run this if MET_RefFinal_STVF doesn't exist already.
-        METalg_STVF._output = {'MissingET' : ['MET_RefFinal_STVF']}
-
-        METalg_STVF()
-
-        # Signal that everything went okay:
-        return True
-- 
GitLab


From 78eb0e14659610d332593d6cba8261baa9884dde Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Mon, 14 Dec 2020 14:28:44 +0100
Subject: [PATCH 016/225] TileD3PDMaker: cmake and flake8 fixes

Cleanup cmake configuration, enable flake8 and make code compliant.
Delete unused `TileD3PD.py` modules.
---
 .../D3PDMaker/TileD3PDMaker/CMakeLists.txt    | 17 ++--
 .../TileD3PDMaker/python/TileD3PD.py          | 42 ---------
 .../TileD3PDMaker/python/TileD3PDObject.py    | 90 +------------------
 3 files changed, 7 insertions(+), 142 deletions(-)
 delete mode 100644 PhysicsAnalysis/D3PDMaker/TileD3PDMaker/python/TileD3PD.py

diff --git a/PhysicsAnalysis/D3PDMaker/TileD3PDMaker/CMakeLists.txt b/PhysicsAnalysis/D3PDMaker/TileD3PDMaker/CMakeLists.txt
index 4207f67cf1f7..b62564de17cd 100644
--- a/PhysicsAnalysis/D3PDMaker/TileD3PDMaker/CMakeLists.txt
+++ b/PhysicsAnalysis/D3PDMaker/TileD3PDMaker/CMakeLists.txt
@@ -1,26 +1,19 @@
-################################################################################
-# Package: TileD3PDMaker
-################################################################################
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # Declare the package name:
 atlas_subdir( TileD3PDMaker )
 
 # External dependencies:
-find_package( Boost COMPONENTS filesystem thread system )
-find_package( CORAL COMPONENTS CoralBase CoralKernel RelationalAccess )
-find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
+find_package( ROOT COMPONENTS Core MathCore )
 
 # Component(s) in the package:
 atlas_add_component( TileD3PDMaker
                      src/*.cxx
                      src/components/*.cxx
-                     INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${CORAL_INCLUDE_DIRS} 
-                     LINK_LIBRARIES ${ROOT_LIBRARIES} ${Boost_LIBRARIES} ${CORAL_LIBRARIES} AtlasHepMCLib CaloEvent CaloGeoHelpers AthContainers AthenaBaseComps 
-		     StoreGateLib SGtests GeoModelUtilities Identifier EventInfo xAODCaloEvent xAODEventInfo xAODMissingET xAODMuon xAODPrimitives xAODTracking 
-		     xAODTrigger GaudiKernel GeneratorObjects D3PDMakerUtils RecoToolInterfaces ITrackToVertex TileEvent TileIdentifier 
-		     TrkParameters TrkParametersIdentificationHelpers VxVertex TrigInDetEvent TrigMuonEvent )
+                     INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
+                     LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers AthenaBaseComps AtlasHepMCLib CaloEvent CaloGeoHelpers D3PDMakerUtils EventInfo GaudiKernel GeneratorObjects GeoModelInterfaces GeoModelUtilities GeoPrimitives ITrackToVertex Identifier RDBAccessSvcLib RecoToolInterfaces StoreGateLib TileEvent TileIdentifier TrkParameters TrkParametersIdentificationHelpers VxVertex xAODCaloEvent xAODEventInfo xAODMissingET xAODMuon xAODPrimitives xAODTracking xAODTrigger )
 
 # Install files from the package:
-atlas_install_python_modules( python/*.py )
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
 atlas_install_joboptions( share/*.py )
 
diff --git a/PhysicsAnalysis/D3PDMaker/TileD3PDMaker/python/TileD3PD.py b/PhysicsAnalysis/D3PDMaker/TileD3PDMaker/python/TileD3PD.py
deleted file mode 100644
index 05d66e192230..000000000000
--- a/PhysicsAnalysis/D3PDMaker/TileD3PDMaker/python/TileD3PD.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-# -*- coding: iso-8859-1 -*-
-#
-# File: TileD3PD.py
-# Author: Marco van Woerden <mvanwoer@cern.ch>
-# Date: September 2012
-#
-
-import TileD3PDMaker.TileD3PDObject
-from TileD3PDMaker.TileD3PDObject     import *
-from TileD3PDMaker                                import *
-from D3PDMakerCoreComps.resolveSGKey              import testSGKey
-
-def mu_D3PD (alg = None,
-              file = 'tile.root',
-              tuplename = 'calo'):
-
-    if not alg:
-        from OutputStreamAthenaPool.MultipleStreamManager import MSMgr
-        alg = MSMgr.NewRootStream( tuplename, file )
-        alg += TileD3PDMaker.TileD3PDObject.TileCellD3PDObject(10)
-        alg += TileD3PDMaker.TileD3PDObject.TileMBTSD3PDObject(10)
-        alg += TileD3PDMaker.TileD3PDObject.TileStacoMuonD3PDObject(10)
-        alg += TileD3PDMaker.TileD3PDObject.TileEventD3PDObject(10)
-
-        return alg
-
-def Ep_D3PD (alg = None,
-              file = 'tile.root',
-              tuplename = 'calo'):
-
-    if not alg:
-        from OutputStreamAthenaPool.MultipleStreamManager import MSMgr
-        alg = MSMgr.NewRootStream( tuplename, file )
-        alg += TileD3PDMaker.TileD3PDObject.TileTrackD3PDObject(10)
-        alg += TileD3PDMaker.TileD3PDObject.TileCellD3PDObject(10)
-        alg += TileD3PDMaker.TileD3PDObject.TileEventD3PDObject(10)
-        #alg += TileD3PDMaker.TileD3PDObject.TileMuonD3PDObject(10)
-        alg += TileD3PDMaker.TileD3PDObject.TileClusterD3PDObject(10)
-
-        return alg
diff --git a/PhysicsAnalysis/D3PDMaker/TileD3PDMaker/python/TileD3PDObject.py b/PhysicsAnalysis/D3PDMaker/TileD3PDMaker/python/TileD3PDObject.py
index 8ee6a2937ed0..a019c5db7c0e 100644
--- a/PhysicsAnalysis/D3PDMaker/TileD3PDMaker/python/TileD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/TileD3PDMaker/python/TileD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 # File: TileAnalysisD3PDObject.py
@@ -8,22 +8,9 @@
 #
 
 # IMPORT MODULES
-import TileD3PDMaker
 import D3PDMakerCoreComps
-import EventCommonD3PDMaker
-from D3PDMakerCoreComps.D3PDObject                      import D3PDObject
 from D3PDMakerConfig.D3PDMakerFlags                     import D3PDMakerFlags
-from D3PDMakerCoreComps.D3PDObject                      import make_SGDataVector_D3PDObject
-from D3PDMakerCoreComps.D3PDObject                      import make_Void_D3PDObject
-from D3PDMakerCoreComps.D3PDObject                      import make_SG_D3PDObject
-from D3PDMakerCoreComps.SimpleAssociation               import SimpleAssociation
-from D3PDMakerCoreComps.IndexAssociation                import IndexAssociation
-from D3PDMakerCoreComps.ContainedVectorMultiAssociation import ContainedVectorMultiAssociation
-from D3PDMakerCoreComps.IndexMultiAssociation           import IndexMultiAssociation
-from AthenaCommon.AlgSequence                           import AlgSequence
-from TileD3PDMaker                                      import *
-from CaloIdentifier                                     import SUBCALO 
-from AthenaCommon.AppMgr                                import ServiceMgr as svcMgr
+
 
 # VECTORFILLER DEFINITIONS
 def make_Cell_D3PDVectorFiller(name, prefix, object_name, getter = None,sgkey = None,label = None):
@@ -65,76 +52,3 @@ def make_Cluster_D3PDVectorFiller(name, prefix, object_name, getter = None,sgkey
     # CREATE SELECTED
     return D3PDMakerCoreComps.VectorFillerTool('cluster_Getter',Prefix = 'clusters_',Getter = calocluster_getter,
                                                ObjectName = 'caloclusters',SaveMetadata = D3PDMakerFlags.SaveObjectMetadata())
-
-######################################################
-# RETRIEVE D3PD OBJECT CONTAINING SELECTED TRACKS #
-######################################################
-#TileTrackD3PDObject = D3PDObject(make_Track_D3PDVectorFiller, 'tracks_' , 'TracksD3PDObject')
-#TileTrackD3PDObject.defineBlock(0, 'TrackParticleDump', TileD3PDMaker.TileTrackFillerTool)
-
-######################################################
-# RETRIEVE D3PD OBJECT CONTAINING SELECTED CALOCELLS #
-######################################################
-#TileCellD3PDObject = D3PDObject(make_Cell_D3PDVectorFiller, 'cells_' , 'CellsD3PDObject')
-#TileCellD3PDObject.defineBlock(0, 'CaloCellDump', TileD3PDMaker.TileCellFillerTool)
-
-#TileMBTSD3PDObject = D3PDObject(make_MBTS_D3PDVectorFiller, 'mbts_' , 'MBTSD3PDObject')
-#TileMBTSD3PDObject.defineBlock(0, 'MBTSDump', TileD3PDMaker.TileMBTSFillerTool)
-
-######################################################
-# RETRIEVE D3PD OBJECT CONTAINING SELECTED CLUSTERS #
-######################################################
-#TileClusterD3PDObject = D3PDObject(make_Cluster_D3PDVectorFiller, 'clusters_' , 'ClustersD3PDObject')
-#TileClusterD3PDObject.defineBlock(0, 'CaloClusterDump', TileD3PDMaker.TileCaloClusterFillerTool)
-
-#########################################
-# RETRIEVE D3PD OBJECT CONTAINING MUONS #
-#########################################
-#TileStacoMuonD3PDObject = make_SGDataVector_D3PDObject ('Analysis::MuonContainer','StacoMuonCollection','mu_', 'TileStacoMuonD3PDObject')
-#TileStacoMuonD3PDObject.defineBlock(0, 'StacoDump', TileD3PDMaker.TileMuonFillerTool)
-
-#TileMuidMuonD3PDObject = make_SGDataVector_D3PDObject ('Analysis::MuonContainer','MuidMuonCollection','muid_', 'TileMuidMuonD3PDObject')
-#TileMuidMuonD3PDObject.defineBlock(0, 'MuidDump', TileD3PDMaker.TileMuonFillerTool)
-
-#######################################
-# EVENT BY EVENT INFORMATION TO STORE #
-#######################################
-#TileEventD3PDObject = make_SG_D3PDObject( "EventInfo", D3PDMakerFlags.EventInfoSGKey(), 'evt_', "TileEventD3PDObject" )
-#TileEventD3PDObject.defineBlock(0, 'EventDump', TileD3PDMaker.TileEventFillerTool)
-
-
-######################
-# SETUP ASSOCIATIONS #
-######################
-#IndexMultiAssociation(parent=TileCellD3PDObject,assoctool=TileD3PDMaker.TileCellMuAssociationTool,target="mu_",prefix="cellsmu_",level=0,blockname="AssocCellToMuon")
-
-#IndexMultiAssociation(parent=TileMuonD3PDObject,assoctool=TileD3PDMaker.TileMuCellAssociationTool,target="cells_",prefix="mucells_",level=0,blockname="AssocMuonToCell")
-
-#IndexMultiAssociation(parent=TileClusterD3PDObject,assoctool=TileD3PDMaker.TileClusterCellAssociationTool,target="cells_",prefix="clustercells_",level=0,blockname="AssocClusterToCell")
-
-#IndexMultiAssociation(parent=TileTrackD3PDObject,assoctool=TileD3PDMaker.TileTrackCellAssociationTool,target="cells_",prefix="trackcells_",level=0,blockname="AssocTrackToCell")
-
-#IndexMultiAssociation(parent=TileTrackD3PDObject,assoctool=TileD3PDMaker.TileTrackClusterAssociationTool,target="clusters_",prefix="trackclusters_",level=0,blockname="AssocTrackToCluster")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-- 
GitLab


From 2a7e99e310898a304af4cb1eb69156b6e6738eda Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Mon, 14 Dec 2020 14:40:17 +0100
Subject: [PATCH 017/225] TrackD3PDMaker: enable flake8 and make code compliant

---
 .../D3PDMaker/TrackD3PDMaker/CMakeLists.txt            |  2 +-
 .../python/TrackParticleImpactParameters.py            |  6 +-----
 .../D3PDMaker/TrackD3PDMaker/python/__init__.py        |  4 ----
 .../TrackD3PDMaker/python/xAODTrackD3PDObject.py       | 10 +++-------
 .../TrackD3PDMaker/python/xAODTrackSummaryFiller.py    |  2 +-
 5 files changed, 6 insertions(+), 18 deletions(-)

diff --git a/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/CMakeLists.txt b/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/CMakeLists.txt
index f50e867947f6..c83691606fe4 100644
--- a/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/CMakeLists.txt
+++ b/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/CMakeLists.txt
@@ -9,4 +9,4 @@ atlas_add_component( TrackD3PDMaker
                      LINK_LIBRARIES TrkParameters AthenaKernel CxxUtils Identifier EventPrimitives xAODBase xAODPrimitives xAODTracking GaudiKernel InDetIdentifier InDetReadoutGeometry InDetTestBLayerLib ParticleEvent D3PDMakerInterfaces D3PDMakerUtils Particle InDetRecToolInterfaces ITrackToVertex RecoToolInterfaces TrkEventPrimitives TrkParticleBase VxVertex InDetBeamSpotServiceLib )
 
 # Install files from the package:
-atlas_install_python_modules( python/*.py )
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
diff --git a/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/python/TrackParticleImpactParameters.py b/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/python/TrackParticleImpactParameters.py
index e5988f53775b..b492d007bd8a 100644
--- a/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/python/TrackParticleImpactParameters.py
+++ b/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/python/TrackParticleImpactParameters.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# $Id$
 #
 # @file TrackD3PDMaker/python/TrackParticleImpactParameters.py
 # @author scott snyder <snyder@bnl.gov>
@@ -11,9 +10,6 @@
 
 import TrackD3PDMaker
 from D3PDMakerCoreComps.SimpleAssociation   import SimpleAssociation
-from D3PDMakerConfig.D3PDMakerFlags         import D3PDMakerFlags
-import D3PDMakerCoreComps
-
 
 def TrackParticleImpactParameters (TPD3PDObject,
                                    prefix = 'track',
diff --git a/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/python/__init__.py b/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/python/__init__.py
index ac486e0201f5..8629e6ab6e8c 100644
--- a/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/python/__init__.py
+++ b/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/python/__init__.py
@@ -5,10 +5,6 @@ for k, v in TrackD3PDMakerConf.__dict__.items():
     if k.startswith ('D3PD__'):
         globals()[k[6:]] = v
 
-# Backwards compatibility.
-TrackPerigeeFillerTool = PerigeeFillerTool
-
-
 # Copy these here from TrackSummary.h so that we don't need to load
 # all the EDM libraries to get these during configuration.
 # (FIXME: The enums should be split into a separate dictionary
diff --git a/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/python/xAODTrackD3PDObject.py b/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/python/xAODTrackD3PDObject.py
index b1db9a65a707..033f4311cf71 100644
--- a/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/python/xAODTrackD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/python/xAODTrackD3PDObject.py
@@ -7,7 +7,6 @@ from D3PDMakerCoreComps.D3PDObject import make_SGDataVector_D3PDObject
 from D3PDMakerCoreComps.IndexAssociation import IndexAssociation
 from TrackD3PDMaker.PerigeeAssociation import PerigeeAssociation
 from TrackD3PDMaker.TrackD3PDMakerFlags import TrackD3PDFlags
-from AthenaCommon.AppMgr import ToolSvc
 
 
 def xAODTrackD3PDObject(_label='trkTrack',
@@ -54,16 +53,14 @@ def xAODTrackD3PDObject(_label='trkTrack',
                                   InDetTestBLayerTool = ToolSvc.InDetRecTestBLayerTool)
 
     # perigee at Primary Vertex
-    PerigeeAtPVAssoc = PerigeeAssociation\
-                       (object,
+    PerigeeAtPVAssoc = PerigeeAssociation(object,  # noqa: F841
                         TrackD3PDMaker.TrackParticlePerigeeAtPVAssociationTool,
                         "PerigeeAtPV",
                         suffix='_wrtPV',
                         levelName = 'trackParametersAtPrimaryVertexLevelOfDetails')
 
     # perigee at Beam Spot
-    PerigeeAtBSAssoc = PerigeeAssociation\
-                       (object,
+    PerigeeAtBSAssoc = PerigeeAssociation(object,  # noqa: F841
                         TrackD3PDMaker.TrackParticlePerigeeAtBSAssociationTool,
                         "PerigeeAtBS",
                         suffix='_wrtBS', 
@@ -242,8 +239,7 @@ def xAODTrackD3PDObject(_label='trkTrack',
                                 'patternRecoInfo'])
 
     # Vertex association
-    VertexAssoc = IndexAssociation  (
-        object,
+    VertexAssoc = IndexAssociation(object,  # noqa: F841
         TrackD3PDMaker.TrackParticleVertexAssociationTool,
         vertexTarget,
         prefix = vertexPrefix,
diff --git a/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/python/xAODTrackSummaryFiller.py b/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/python/xAODTrackSummaryFiller.py
index 26280a322ccd..8e39cc4810d1 100644
--- a/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/python/xAODTrackSummaryFiller.py
+++ b/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/python/xAODTrackSummaryFiller.py
@@ -118,7 +118,7 @@ def xAODTrackSummaryFiller (obj, lod, blockName,
                             **kw):
     varlist = []
     for tags, v in sumvars:
-        if type(tags) != type([]): tags = [tags]
+        if not isinstance(tags, list): tags = [tags]
         sel = FullInfo
         for t in tags:
             sel += eval(t)
-- 
GitLab


From 9c39051da00e1607e1452eb129a55ab6bf996054 Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Mon, 14 Dec 2020 15:06:34 +0100
Subject: [PATCH 018/225] TruthD3PDMaker: enable flake8 and make code compliant

Enable flake8 and make code compliant. Delete code that is obviously
broken.
---
 .../D3PDMaker/TruthD3PDMaker/CMakeLists.txt   |  2 +-
 .../python/Atlfast1ElectronD3PDObject.py      |  8 +---
 .../python/Atlfast1MissingETD3PDObject.py     |  6 +--
 .../python/Atlfast1PhotonD3PDObject.py        |  9 +---
 .../python/GenEventD3PDObject.py              | 11 ++---
 .../python/GenParticleD3PDObject.py           | 16 +++----
 .../python/GenVertexD3PDObject.py             | 12 +++---
 .../TruthD3PDMaker/python/HforConfig.py       | 42 +++----------------
 .../TruthD3PDMaker/python/PartonJetConfig.py  | 17 ++------
 .../python/PileUpInfoD3PDObject.py            |  7 +---
 .../python/TruthJetD3PDObject.py              |  4 +-
 .../python/TruthJetFilterConfig.py            |  5 +--
 .../python/TruthLeptonParentAssociation.py    |  5 +--
 .../python/TruthParticleChildAssociation.py   |  7 +---
 .../python/TruthParticleFakerObject.py        | 11 ++---
 .../python/TruthParticleParentAssociation.py  |  7 +---
 .../python/TruthTauDecayAssociation.py        |  7 +---
 .../TruthD3PDMaker/python/atlfast1D3PD.py     | 12 +-----
 .../TruthD3PDMaker/python/evgenD3PD.py        | 10 ++---
 .../share/GenD3PDExample_jobOptions.py        |  3 --
 20 files changed, 53 insertions(+), 148 deletions(-)

diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/CMakeLists.txt b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/CMakeLists.txt
index 3d9ab004df54..ec53ce1d2b03 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/CMakeLists.txt
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/CMakeLists.txt
@@ -16,6 +16,6 @@ atlas_add_component( TruthD3PDMaker
                      LINK_LIBRARIES ${Boost_LIBRARIES} ${HEPPDT_LIBRARIES} ${CLHEP_LIBRARIES} AtlasHepMCLib AthenaBaseComps AthenaKernel Navigation EventInfo xAODTruth GaudiKernel GeneratorObjects TruthUtils D3PDMakerInterfaces D3PDMakerUtils TruthD3PDAnalysisLib MCTruthClassifierLib McParticleEvent McParticleKernel JetEvent TrkToolInterfaces GenInterfacesLib )
 
 # Install files from the package:
-atlas_install_python_modules( python/*.py )
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
 atlas_install_joboptions( share/*.py )
 
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/Atlfast1ElectronD3PDObject.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/Atlfast1ElectronD3PDObject.py
index 8cc3725ea955..111afefc8002 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/Atlfast1ElectronD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/Atlfast1ElectronD3PDObject.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-from egammaD3PDMaker.isem_version          import isem_version
 from EventCommonD3PDMaker.DRAssociation    import DRAssociation
 from D3PDMakerCoreComps.D3PDObject         import make_SGDataVector_D3PDObject
 from D3PDMakerCoreComps.SimpleAssociation  import SimpleAssociation
@@ -9,10 +8,7 @@ from TruthD3PDMaker.Atlfast1D3PDMakerFlags import Atlfast1D3PDMakerFlags
 from RecExConfig.RecFlags                  import rec
 import egammaD3PDMaker
 import EventCommonD3PDMaker
-import D3PDMakerCoreComps
 
-from ROOT import egammaParameters
-from ROOT import egammaPID
 
 Atlfast1ElectronD3PDObject = \
            make_SGDataVector_D3PDObject ('ElectronContainer',
@@ -29,7 +25,7 @@ Atlfast1ElectronD3PDObject.defineBlock (0, 'Charge',
                                         EventCommonD3PDMaker.ChargeFillerTool)
 
 if rec.doTruth():
-    import TruthD3PDMaker.MCTruthClassifierConfig
+    import TruthD3PDMaker.MCTruthClassifierConfig  # noqa: F401 (import side-effect)
     Atlfast1ElectronD3PDObject.defineBlock (1, 'TruthClassification',
                                             egammaD3PDMaker.egammaTruthClassificationFillerTool)
     Atlfast1ElectronGenPartAssoc = SimpleAssociation \
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/Atlfast1MissingETD3PDObject.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/Atlfast1MissingETD3PDObject.py
index adbb5738cb19..6cf07a528921 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/Atlfast1MissingETD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/Atlfast1MissingETD3PDObject.py
@@ -1,11 +1,9 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 import MissingETD3PDMaker
-import D3PDMakerCoreComps
-from D3PDMakerCoreComps.D3PDObject import D3PDObject
 from D3PDMakerCoreComps.D3PDObject import make_SG_D3PDObject
 from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
-from MissingETD3PDMaker.MissingETD3PDMakerFlags import *
+from MissingETD3PDMaker.MissingETD3PDMakerFlags import MissingETD3PDMakerFlags
 
 Atlfast1MissingETD3PDObject = \
                       make_SG_D3PDObject ('MissingET',
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/Atlfast1PhotonD3PDObject.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/Atlfast1PhotonD3PDObject.py
index 61a009a40140..3fdcefad52f9 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/Atlfast1PhotonD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/Atlfast1PhotonD3PDObject.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-from egammaD3PDMaker.isem_version          import isem_version
 from EventCommonD3PDMaker.DRAssociation    import DRAssociation
 from D3PDMakerCoreComps.D3PDObject         import make_SGDataVector_D3PDObject
 from D3PDMakerCoreComps.SimpleAssociation  import SimpleAssociation
@@ -9,10 +8,6 @@ from TruthD3PDMaker.Atlfast1D3PDMakerFlags import Atlfast1D3PDMakerFlags
 from RecExConfig.RecFlags                  import rec
 import egammaD3PDMaker
 import EventCommonD3PDMaker
-import D3PDMakerCoreComps
-
-from ROOT import egammaParameters
-from ROOT import egammaPID
 
 
 Atlfast1PhotonD3PDObject = \
@@ -28,7 +23,7 @@ Atlfast1PhotonD3PDObject.defineBlock (0, 'Kinematics',
                                       WriteRect = True)
 
 if rec.doTruth():
-    import TruthD3PDMaker.MCTruthClassifierConfig
+    import TruthD3PDMaker.MCTruthClassifierConfig  # noqa: F401 (import side-effect)
     Atlfast1PhotonD3PDObject.defineBlock (1, 'TruthClassification',
                                           egammaD3PDMaker.egammaTruthClassificationFillerTool)
     Atlfast1PhotonGenPartAssoc = SimpleAssociation \
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/GenEventD3PDObject.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/GenEventD3PDObject.py
index 89e6bb49ff9e..aa69372d0055 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/GenEventD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/GenEventD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 ## @file TruthD3PDMaker/python/GenParticleD3PDObject.py
@@ -7,8 +7,6 @@
 ## @date Nov, 2010
 ##
 
-from AthenaCommon.AppMgr import ToolSvc
-
 import TruthD3PDMaker
 
 import D3PDMakerCoreComps
@@ -17,7 +15,6 @@ from D3PDMakerConfig.D3PDMakerFlags  import D3PDMakerFlags
 
 from TruthD3PDAnalysis.AllTruthFilterTool import AllTruthFilterTool
 from TruthD3PDMaker.TruthD3PDMakerKeys import TruthD3PDKeys
-from TruthD3PDMaker.TruthD3PDMakerFlags import TruthD3PDFlags
 
 def make_GenEvent_D3PDObject( default_prefix, default_sgkey,
                               default_object_name = "",
@@ -28,9 +25,9 @@ def make_GenEvent_D3PDObject( default_prefix, default_sgkey,
                   getter = None, sgkey = None, filter = default_filter,
                   label = default_label, **kw ):
 
-        if sgkey == None: sgkey = default_sgkey
-        if label == None: label = TruthD3PDKeys.GenEventGetterLabel()
-        if getter == None:
+        if sgkey is None: sgkey = default_sgkey
+        if label is None: label = TruthD3PDKeys.GenEventGetterLabel()
+        if getter is None:
             getter = TruthD3PDMaker.GenEventGetterTool( name + '_Getter',
                                                         Label = label,
                                                         Selector = filter,
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/GenParticleD3PDObject.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/GenParticleD3PDObject.py
index d1c4ecb0614b..410fa23e6a58 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/GenParticleD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/GenParticleD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 ## @file TruthD3PDMaker/python/GenParticleD3PDObject.py
@@ -31,9 +31,9 @@ def make_GenParticle_D3PDObject( default_prefix, default_sgkey,
                   getter = None, sgkey = None, filter = default_filter,
                   label = default_label, **kw ):
 
-        if sgkey == None: sgkey = default_sgkey
-        if label == None: label = prefix
-        if getter == None:
+        if sgkey is None: sgkey = default_sgkey
+        if label is None: label = prefix
+        if getter is None:
             getter = TruthD3PDMaker.GenParticleGetterTool (name + "_Getter",
                                                            Label = label,
                                                            SGKey = sgkey,
@@ -62,14 +62,14 @@ GenParticleD3PDObject = make_GenParticle_D3PDObject( TruthD3PDKeys.GenParticlePr
 GenParticleD3PDObject.defineBlock( 0, 'GenParticle',
                                    TruthD3PDMaker.GenParticleFillerTool )
 
-if TruthD3PDFlags.GenEventAssocLabel() != None and TruthD3PDFlags.GenEventAssocLabel() != "": 
+if TruthD3PDFlags.GenEventAssocLabel() is not None and TruthD3PDFlags.GenEventAssocLabel() != "":
     GenPartEventAssoc = IndexAssociation( GenParticleD3PDObject,
                                           TruthD3PDMaker.GenParticleEventAssociationTool,
                                           TruthD3PDFlags.GenEventAssocLabel(),
                                           blockname = "GenPartEventAssoc",
                                           prefix = 'mcevt_' )
 
-if TruthD3PDFlags.GenVertexAssocLabel() != None and TruthD3PDFlags.GenVertexAssocLabel() != "":
+if TruthD3PDFlags.GenVertexAssocLabel() is not None and TruthD3PDFlags.GenVertexAssocLabel() != "":
     GenPartProdVertexAssoc = IndexAssociation( GenParticleD3PDObject,
                                                TruthD3PDMaker.GenParticleVertexAssociationTool,
                                                TruthD3PDFlags.GenVertexAssocLabel(),
@@ -91,7 +91,7 @@ if TruthD3PDFlags.GenParticleMother():
                                                 prefix = 'mother_',
                                                 InParticles = True)
 
-if TruthD3PDFlags.GenVertexAssocLabel() != None and TruthD3PDFlags.GenVertexAssocLabel() != "":
+if TruthD3PDFlags.GenVertexAssocLabel() is not None and TruthD3PDFlags.GenVertexAssocLabel() != "":
     GenPartDecayVertexAssoc = IndexAssociation( GenParticleD3PDObject,
                                                 TruthD3PDMaker.GenParticleVertexAssociationTool,
                                                 TruthD3PDFlags.GenVertexAssocLabel(),
@@ -113,7 +113,7 @@ if TruthD3PDFlags.GenParticleChild():
                                                prefix = 'child_',
                                                InParticles = False )
 
-if TruthD3PDFlags.TruthTrackAssocLabel() != None and TruthD3PDFlags.TruthTrackAssocLabel() != "":
+if TruthD3PDFlags.TruthTrackAssocLabel() is not None and TruthD3PDFlags.TruthTrackAssocLabel() != "":
     GenPartTruthTrackAssoc = IndexAssociation( GenParticleD3PDObject,
                                                TruthD3PDMaker.GenParticleParticleAssociationTool,
                                                TruthD3PDFlags.TruthTrackAssocLabel(),
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/GenVertexD3PDObject.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/GenVertexD3PDObject.py
index 7e5462cda3ec..035d510283a6 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/GenVertexD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/GenVertexD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 ## @file TruthD3PDMaker/python/GenParticleD3PDObject.py
@@ -29,9 +29,9 @@ def make_GenVertex_D3PDObject( default_prefix, default_sgkey,
                   getter = None, sgkey = None, filter = default_filter,
                   label = default_label, **kw ):
 
-        if sgkey == None: sgkey = default_sgkey
-        if label == None: label = TruthD3PDKeys.GenVertexGetterLabel()
-        if getter == None:
+        if sgkey is None: sgkey = default_sgkey
+        if label is None: label = TruthD3PDKeys.GenVertexGetterLabel()
+        if getter is None:
             getter = TruthD3PDMaker.GenVertexGetterTool( name + '_Getter',
                                                          Label = label,
                                                          Selector = filter,
@@ -60,7 +60,7 @@ GenVertexD3PDObject.defineBlock( 0,
                                  TruthD3PDMaker.GenVertexFillerTool,
                                  WriteID=TruthD3PDFlags.WriteTruthVertexIDs() )
 
-if TruthD3PDFlags.GenParticleAssocLabel() != None and TruthD3PDFlags.GenParticleAssocLabel() != "":
+if TruthD3PDFlags.GenParticleAssocLabel() is not None and TruthD3PDFlags.GenParticleAssocLabel() != "":
     if TruthD3PDFlags.GenVertexInPartAssoc():
         GenVertexPartInAssoc = \
            IndexMultiAssociation( GenVertexD3PDObject,
@@ -79,7 +79,7 @@ if TruthD3PDFlags.GenParticleAssocLabel() != None and TruthD3PDFlags.GenParticle
                                   prefix = 'outpart_',
                                   InParticles = False )
 
-if TruthD3PDFlags.GenEventAssocLabel() != None and TruthD3PDFlags.GenEventAssocLabel() != "": 
+if TruthD3PDFlags.GenEventAssocLabel() is not None and TruthD3PDFlags.GenEventAssocLabel() != "":
     GenVertexEventAssoc = IndexAssociation( GenVertexD3PDObject,
                                             TruthD3PDMaker.GenVertexEventAssociationTool,
                                             TruthD3PDFlags.GenEventAssocLabel(),
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/HforConfig.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/HforConfig.py
index ac8720e1ec51..58e38bb33173 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/HforConfig.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/HforConfig.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 class HforConfig:
     """
@@ -35,7 +35,6 @@ class HforConfig:
         self.getConfigFile(runArgs, filepath)
         self.getDSID(runArgs)
         self.getHforType()
-        #self.checkConsistency()
         return self.config_String
 
 
@@ -50,12 +49,11 @@ class HforConfig:
         """
 
         #Identify Hfor type
-        from AthenaCommon.Utils.unixtools import FindFile
-        import sys, os
+        import sys
 
         try:
             self.file = open(filepath)
-        except:
+        except Exception:
             currentError = "Exiting. Configuration file should be in "+str(filepath)
             self.hforLog.error(currentError)
             sys.exit(0)
@@ -87,7 +85,7 @@ class HforConfig:
                 try:
                     #try to get the DSID from runArgs
                     self.curr_DSID = runArgs.RunNumber
-                except:
+                except Exception:
                     #if cannot access runargs parse input file name for DSID
                     if len(self.fList) != 0:
                         files = self.fList 
@@ -98,7 +96,7 @@ class HforConfig:
                                 self.curr_DSID = firstFile[index+1]
                         try:
                             int(self.curr_DSID)
-                        except:
+                        except Exception:
                             self.hforLog.error("Could not find DSID from filename. The Hfor tool will not be correctly configured! Have you obeyed the naming convention?")
                             self.curr_DSID = 0
 
@@ -139,33 +137,3 @@ class HforConfig:
 
             if self.config_String == "fail":
                 self.hforLog.warning("failed to find DSID in configuration file. Hfor has not been activated. Does this sample require Hfor? ")
-
-
-
-
-    def checkConsistency(self):
-            """
-            Checks that all the files have the same DSID
-            Currently not used - remove?
-
-            """
-            import re
-
-
-            #check that all samples are of the same Hfor type otherwise exit
-            #What to do in case of runArgs being used?
-            for newfile in self.fList:
-                tmp2 = newfile.split(".")
-                for index, x in enumerate(tmp2):
-                    if re.search('mc[1234567890]{2}', x) is not None:
-                        thisDSID = index
-
-                try:
-                    if proc_dict[tmp2[thisDSID+1]] != self.config_String:
-                        self.hforLog.error("This tool must be used with samples of the same Hfor type. Terminating now")
-                        sys.exit(0)
-                except:
-                    
-                    self.hforLog.error("failure when checking if all DSIDs are of same type")
-
-
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/PartonJetConfig.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/PartonJetConfig.py
index b46163c34a40..32577c8e7ad3 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/PartonJetConfig.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/PartonJetConfig.py
@@ -9,19 +9,11 @@
 #        Reconstruction/Jet/JetSimTools/PartonTruthJets_jobOptions.py
 #
 
-
-import EventCommonD3PDMaker
-from D3PDMakerConfig.D3PDMakerFlags           import D3PDMakerFlags
-from AthenaCommon.AlgSequence                 import AlgSequence
+from AthenaCommon.SystemOfUnits import GeV
 from RecExConfig.ObjKeyStore                  import cfgKeyStore
 from RecExConfig.RecFlags                     import rec
 
-from JetRec.JetMomentGetter import make_JetMomentGetter
-from JetRec.JetGetters import *  
-
-from AthenaCommon.SystemOfUnits import MeV, GeV
-from JetRec.JetRecConf import JetAlgorithm
-
+from JetRec.JetGetters import make_StandardJetGetter
 from JetSimTools.JetSimToolsConf import JetPartonSelectorTool
 
 def PartonJetConfig (finder    = 'AntiKt',
@@ -50,11 +42,10 @@ def PartonJetConfig (finder    = 'AntiKt',
     jetPartonSelectorTool.DoPythia = doPythia
     jetPartonSelectorTool.DoHerwig = doHerwig
     jetPartonSelectorTool.max_absEta = absEtaMax
-    #jetPartonSelectorTool.OutputLevel = INFO
     ToolSvc += jetPartonSelectorTool
 
     # Configure jets builder
-    if inputCollections != None:
+    if inputCollections is not None:
         partonJetAlg = make_StandardJetGetter(finder,size,'Truth',inputSuff='Parton'+suffix,
                                               inputCollectionNames=inputCollections,
                                               inputTools=[jetPartonSelectorTool]).jetAlgorithmHandle()
@@ -63,7 +54,5 @@ def PartonJetConfig (finder    = 'AntiKt',
     else:
         partonJetAlg = make_StandardJetGetter(finder,size,'Truth',inputSuff='Parton'+suffix).jetAlgorithmHandle()
     partonJetAlg.AlgTools['JetFinalPtCut'].MinimumSignal = minJetPt
-    #partonJetAlg.AlgTools['InputToJet'].InputSelector = jetPartonSelectorTool
-    #partonJetAlg.OutputLevel = INFO
 
     return
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/PileUpInfoD3PDObject.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/PileUpInfoD3PDObject.py
index b0b4c96010ec..1a29127936b9 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/PileUpInfoD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/PileUpInfoD3PDObject.py
@@ -1,10 +1,7 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 import TruthD3PDMaker
-import D3PDMakerCoreComps
-from D3PDMakerCoreComps.D3PDObject import *
-from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
-from TruthD3PDMaker.TruthD3PDMakerConf import *
+from D3PDMakerCoreComps.D3PDObject import make_SG_D3PDObject
 from D3PDMakerCoreComps.ContainedVectorMultiAssociation import ContainedVectorMultiAssociation
 
 
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthJetD3PDObject.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthJetD3PDObject.py
index e3b5b17e6143..c8d57d3a164a 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthJetD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthJetD3PDObject.py
@@ -1,9 +1,7 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-import D3PDMakerCoreComps
 import EventCommonD3PDMaker
 import JetD3PDMaker
-from D3PDMakerCoreComps.D3PDObject      import D3PDObject
 from D3PDMakerCoreComps.D3PDObject      import make_SGDataVector_D3PDObject
 from D3PDMakerConfig.D3PDMakerFlags     import D3PDMakerFlags
 from RecExConfig.RecFlags               import rec
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthJetFilterConfig.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthJetFilterConfig.py
index dd93bf3c72a3..c19a5236101c 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthJetFilterConfig.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthJetFilterConfig.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# $Id$
 #
 # @file TruthD3PDMaker/python/TruthJetFilterConfig.py
 # @author Renaud Bruneliere <Renaud.Bruneliere@cern.ch>
@@ -8,11 +7,9 @@
 # @brief Build truth container to be used for parton-jet building
 #
 
-import EventCommonD3PDMaker
 from D3PDMakerConfig.D3PDMakerFlags           import D3PDMakerFlags
 from McParticleAlgs.JobOptCfg                 import createMcAodBuilder
 from RecExConfig.RecFlags                     import rec
-from AthenaCommon.AlgSequence                 import AlgSequence
 from RecExConfig.ObjKeyStore                  import cfgKeyStore
 from AthenaCommon                             import CfgMgr
 from TruthD3PDMaker.TruthD3PDMakerConf        import D3PD__TruthJetFilterTool
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthLeptonParentAssociation.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthLeptonParentAssociation.py
index 975f5b841d3a..e1c6a2d64a7e 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthLeptonParentAssociation.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthLeptonParentAssociation.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# $Id$
 #
 # @file TruthD3PDMaker/python/TruthLeptonParentAssociation.py
 # @author Zach Marshall <zach.marshall@cern.ch>
@@ -18,7 +17,7 @@ def TruthLeptonParentAssociation (parent,
                    *args, **kw):
     """Helper for setting up an association to lepton parents in the truth record"""
 
-    if blockname == None:
+    if blockname is None:
         blockname = prefix + 'LeptonParentMultiAssoc'
 
     return IndexMultiAssociation (parent,
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthParticleChildAssociation.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthParticleChildAssociation.py
index 795b767121ee..e071911ab3f1 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthParticleChildAssociation.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthParticleChildAssociation.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# $Id$
 #
 # @file TruthD3PDMaker/python/TruthParticleChildAssociation.py
 # @author Ryan Reece <ryan.reece@cern.ch>
@@ -10,9 +9,7 @@
 #
 
 
-import D3PDMakerCoreComps
 import TruthD3PDMaker
-from D3PDMakerCoreComps.D3PDObject import D3PDObject
 from D3PDMakerCoreComps.IndexMultiAssociation import IndexMultiAssociation
 
 
@@ -25,7 +22,7 @@ def TruthParticleChildAssociation (parent,
     """Helper for setting up an association for truth particle
 children by index.
 """
-    if blockname == None:
+    if blockname is None:
         blockname = prefix + 'TruthParticleChildAssociation'
 
     return IndexMultiAssociation (parent,
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthParticleFakerObject.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthParticleFakerObject.py
index 3ad98ababf79..d36f9a04b027 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthParticleFakerObject.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthParticleFakerObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 ## @file TruthD3PDMaker/python/TruthParticleFakerObject.py
 ## @brief Truth D3PD object for single particles
@@ -13,9 +13,6 @@ from D3PDMakerCoreComps.D3PDObject import D3PDObject
 from D3PDMakerConfig.D3PDMakerFlags  import D3PDMakerFlags
 
 from TruthD3PDAnalysis.AllTruthFilterTool import AllTruthFilterTool
-from TruthD3PDAnalysis.StableChargedTruthFilterTool import StableChargedTruthFilterTool
-from TruthD3PDMaker.TruthD3PDMakerKeys import TruthD3PDKeys
-from TruthD3PDMaker.TruthD3PDMakerFlags import TruthD3PDFlags
 
 from AthenaCommon.SystemOfUnits import GeV
 
@@ -28,9 +25,9 @@ def make_TruthParticleFaker_D3PDObject( default_prefix, default_sgkey,
                   getter = None, sgkey = None, filter = default_filter,
                   label = default_label, **kw ):
 
-        if sgkey == None: sgkey = default_sgkey
-        if label == None: label = prefix
-        if getter == None:
+        if sgkey is None: sgkey = default_sgkey
+        if label is None: label = prefix
+        if getter is None:
             getter = TruthD3PDMaker.GenParticleGetterTool (name + "_Getter",
                                                            Label = label,
                                                            SGKey = sgkey,
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthParticleParentAssociation.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthParticleParentAssociation.py
index f0ee62e6ac07..2b34e7984799 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthParticleParentAssociation.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthParticleParentAssociation.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# $Id$
 #
 # @file TruthD3PDMaker/python/TruthParticleParentAssociation.py
 # @author Ryan Reece <ryan.reece@cern.ch>
@@ -10,9 +9,7 @@
 #
 
 
-import D3PDMakerCoreComps
 import TruthD3PDMaker
-from D3PDMakerCoreComps.D3PDObject import D3PDObject
 from D3PDMakerCoreComps.IndexMultiAssociation import IndexMultiAssociation
 
 
@@ -25,7 +22,7 @@ def TruthParticleParentAssociation (parent,
     """Helper for setting up an association for truth particle
 parents by index.
 """
-    if blockname == None:
+    if blockname is None:
         blockname = prefix + 'TruthParticleParentAssociation'
 
     return IndexMultiAssociation (parent,
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthTauDecayAssociation.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthTauDecayAssociation.py
index 0f70fffb537b..1abfaf6e357f 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthTauDecayAssociation.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/TruthTauDecayAssociation.py
@@ -1,15 +1,12 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# $Id$
 #
 # @file TruthD3PDMaker/python/TruthTauDecayAssociation.py
 # @author Zach Marshall <zach.marshall@cern.ch>
 # @date June 2013
 # @brief Helper for setting up an association to tau decay products in the truth record
 
-#import D3PDMakerCoreComps
 import TruthD3PDMaker
-#from D3PDMakerCoreComps.D3PDObject import D3PDObject
 from D3PDMakerCoreComps.IndexMultiAssociation import IndexMultiAssociation
 
 def TruthTauDecayAssociation (parent,
@@ -20,7 +17,7 @@ def TruthTauDecayAssociation (parent,
                    *args, **kw):
     """Helper for setting up an association to tau decay products in the truth record"""
 
-    if blockname == None:
+    if blockname is None:
         blockname = prefix + 'TauDecayMultiAssoc'
 
     return IndexMultiAssociation (parent,
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/atlfast1D3PD.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/atlfast1D3PD.py
index bf4cd19a34fb..0f9616d9f4dc 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/atlfast1D3PD.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/atlfast1D3PD.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# $Id$
 #
 # @file TruthD3PDMaker/python/atlfast1D3PD.py
 # @author Renaud Bruneliere <Renaud.Bruneliere@cern.ch>
@@ -10,8 +9,6 @@
 
 
 import D3PDMakerCoreComps
-from D3PDMakerConfig.D3PDMakerFlags                  import D3PDMakerFlags
-
 
 from EventCommonD3PDMaker.EventInfoD3PDObject        import EventInfoD3PDObject
 from TruthD3PDMaker.Atlfast1ElectronD3PDObject       import Atlfast1ElectronD3PDObject
@@ -19,17 +16,11 @@ from TruthD3PDMaker.Atlfast1PhotonD3PDObject         import Atlfast1PhotonD3PDOb
 from MuonD3PDMaker.MuonD3PDObject                    import MuonD3PDObject
 from JetD3PDMaker.JetD3PDObject                      import JetD3PDObject
 from TruthD3PDMaker.TruthJetD3PDObject               import TruthJetD3PDObject
-#from TauD3PDMaker.TauD3PDObject                      import TauD3PDObject
-from MissingETD3PDMaker.MissingETD3PDMakerFlags      import MissingETD3PDMakerFlags
 from TruthD3PDMaker.Atlfast1MissingETD3PDObject      import Atlfast1MissingETD3PDObject
 from TruthD3PDMaker.Atlfast1MissingETD3PDObject      import TruthMETD3PDObject
-from EventCommonD3PDMaker.LBMetadataConfig           import LBMetadataConfig
-from HforD3PDObject                                  import HforD3PDObject
-
 
 from TruthD3PDMaker.GenEventD3PDObject               import GenEventD3PDObject
 from TruthD3PDAnalysis.truthParticleConfig           import truthParticleConfig
-#from TruthD3PDAnalysis.TruthJetFilterConfig          import TruthJetFilterConfig
 from TruthD3PDMaker.TruthParticleD3PDObject          import TruthParticleD3PDObject
 from TruthD3PDMaker.PartonJetConfig                  import PartonJetConfig
 from RecExConfig.RecFlags                            import rec
@@ -73,6 +64,5 @@ def atlfast1D3PD (file,
         alg += TruthMETD3PDObject (level=10)
         alg += TruthJetD3PDObject (level=10, sgkey='AntiKt4TruthJets', prefix='AntiKt4TruthJets_')
         alg += TruthJetD3PDObject (level=10, sgkey='AntiKt4TruthPartonJets', prefix='AntiKt4TruthPartonJets_')
-        alg += HforD3PDObject             (**_args (0, 'HforInfo', kw))    
 
     return alg
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/evgenD3PD.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/evgenD3PD.py
index 207221d26a7c..d3a17cc0a059 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/evgenD3PD.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/python/evgenD3PD.py
@@ -9,13 +9,9 @@
 
 
 import D3PDMakerCoreComps
-from D3PDMakerConfig.D3PDMakerFlags                  import D3PDMakerFlags
-
 
 from EventCommonD3PDMaker.EventInfoD3PDObject        import EventInfoD3PDObject
-from JetD3PDMaker.JetD3PDObject                      import JetD3PDObject
 from TruthD3PDMaker.TruthJetD3PDObject               import TruthJetD3PDObject
-from MissingETD3PDMaker.MissingETD3PDMakerFlags      import MissingETD3PDMakerFlags
 from TruthD3PDMaker.Atlfast1MissingETD3PDObject      import TruthMETD3PDObject
 
 from TruthD3PDMaker.GenEventD3PDObject               import GenEventD3PDObject
@@ -24,7 +20,7 @@ from TruthD3PDMaker.TruthJetFilterConfig             import TruthJetFilterConfig
 from TruthD3PDMaker.TruthParticleD3PDObject          import TruthParticleD3PDObject
 from TruthD3PDMaker.PartonJetConfig                  import PartonJetConfig
 from RecExConfig.RecFlags                            import rec
-from JetRec.JetGetters                               import *  
+from JetRec.JetGetters                               import make_StandardJetGetter
 
 from AthenaCommon.AlgSequence import AlgSequence
 topSequence = AlgSequence()
@@ -76,8 +72,8 @@ def evgenD3PD (file,
         antikt6truthAlg.AlgTools['InputToJet'].InputCollectionKeys = ['FilteredD3PDTruth']
         if doExcludeWZdecays:
             # Reconstruct standard ATLAS truth jets
-            antikt4truthAlgStd = make_StandardJetGetter('AntiKt',0.4,'Truth',disable=False).jetAlgorithmHandle()
-            antikt6truthAlgStd = make_StandardJetGetter('AntiKt',0.6,'Truth',disable=False).jetAlgorithmHandle()
+            antikt4truthAlgStd = make_StandardJetGetter('AntiKt',0.4,'Truth',disable=False).jetAlgorithmHandle()  # noqa: F841
+            antikt6truthAlgStd = make_StandardJetGetter('AntiKt',0.6,'Truth',disable=False).jetAlgorithmHandle()  # noqa: F841
 
 
     #--------------------------------------------------------------------------
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/share/GenD3PDExample_jobOptions.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/share/GenD3PDExample_jobOptions.py
index d01dcc54d2fb..fb0777e983f3 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/share/GenD3PDExample_jobOptions.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/share/GenD3PDExample_jobOptions.py
@@ -64,8 +64,5 @@ alg += GenParticleD3PDObject( 10, filter = AllTrackFilterTool() )
 from TruthD3PDMaker.GenParticleD3PDObject import GenTruthTrackD3PDObject
 alg += GenTruthTrackD3PDObject( 10, filter = TruthTrackFilterTool() )
 
-#from TruthD3PDMaker.HforD3PDObject import HforD3PDObject
-#alg += HforD3PDObject(**_args(0,'HforInfo',kw))
-
 ### you can link to the gen particle (e.g from tracks or btag truth lepton info)
 ### using the gen particle getter label: TruthD3PDKeys.GenParticleGetterLabel()
-- 
GitLab


From af121003b4d4c364763384ff619e7bcadbea33d1 Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Mon, 14 Dec 2020 16:01:09 +0100
Subject: [PATCH 019/225] TriggerD3PDMaker: cmake cleanup, enable flake8

---
 .../D3PDMaker/TriggerD3PDMaker/CMakeLists.txt | 15 ++++-----
 .../python/BunchStructureMetadata.py          | 16 ++--------
 .../TriggerD3PDMaker/python/CTPD3PDObject.py  |  4 +--
 .../python/EmTauROID3PDObject.py              |  4 +--
 .../python/MuCTPID3PDObject.py                |  8 ++---
 .../python/MuonROID3PDObject.py               |  4 +--
 .../python/TrigConfMetadata.py                | 31 ++++++-------------
 .../python/TrigRoiDescD3PDObject.py           |  4 +--
 .../python/defineTriggerBits.py               |  6 ++--
 9 files changed, 27 insertions(+), 65 deletions(-)

diff --git a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/CMakeLists.txt b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/CMakeLists.txt
index d74201ba19fb..9e2c231d3fec 100644
--- a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/CMakeLists.txt
+++ b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/CMakeLists.txt
@@ -1,27 +1,24 @@
-################################################################################
-# Package: TriggerD3PDMaker
-################################################################################
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # Declare the package name:
 atlas_subdir( TriggerD3PDMaker )
 
 # External dependencies:
-find_package( Boost COMPONENTS filesystem thread system )
+find_package( Boost )
 
 # Component(s) in the package:
 atlas_add_library( TriggerD3PDMakerLib
                    src/*.cxx
                    PUBLIC_HEADERS TriggerD3PDMaker
                    INCLUDE_DIRS ${Boost_INCLUDE_DIRS}
-                   LINK_LIBRARIES ${Boost_LIBRARIES} AthenaBaseComps AthenaKernel CxxUtils EventKernel FourMomUtils GaudiKernel D3PDMakerUtils TrigSteeringEvent TrigDecisionToolLib TrigObjectMatchingLib StoreGateLib SGtests
-                   PRIVATE_LINK_LIBRARIES xAODTrigger AnalysisTriggerEvent TrigConfHLTData TrigConfL1Data TrigMonitoringEvent TrigT1Interfaces TrigT1Result TrigAnalysisInterfaces )
+                   LINK_LIBRARIES ${Boost_LIBRARIES} AthenaBaseComps AthenaKernel CxxUtils D3PDMakerInterfaces D3PDMakerUtils EventKernel FourMomUtils GaudiKernel TrigAnalysisInterfaces TrigDecisionToolLib TrigObjectMatchingLib TrigT1Result
+                   PRIVATE_LINK_LIBRARIES AnalysisTriggerEvent StoreGateLib TrigConfHLTData TrigConfInterfaces TrigConfL1Data TrigMonitoringEvent TrigSteeringEvent TrigT1Interfaces xAODTrigger )
 
 atlas_add_component( TriggerD3PDMaker
                      src/components/*.cxx
-                     INCLUDE_DIRS ${Boost_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${Boost_LIBRARIES} AthenaBaseComps AthenaKernel CxxUtils EventKernel FourMomUtils GaudiKernel D3PDMakerUtils TrigDecisionToolLib TrigObjectMatchingLib TrigSteeringEvent StoreGateLib SGtests xAODTrigger AnalysisTriggerEvent TrigConfHLTData TrigConfL1Data TrigMonitoringEvent TrigT1Interfaces TrigT1Result TriggerD3PDMakerLib TrigAnalysisInterfaces )
+                     LINK_LIBRARIES TriggerD3PDMakerLib )
 
 # Install files from the package:
-atlas_install_python_modules( python/*.py )
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
 atlas_install_joboptions( share/*.py )
 
diff --git a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/BunchStructureMetadata.py b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/BunchStructureMetadata.py
index 0c9a6c95edcf..e9b207ff260f 100644
--- a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/BunchStructureMetadata.py
+++ b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/BunchStructureMetadata.py
@@ -1,6 +1,5 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-# $Id: BunchStructureMetadata.py 345964 2011-02-15 15:25:18Z ssnyder $
 
 ## @package BunchStructureMetadata
 #
@@ -9,8 +8,6 @@
 #
 # @author Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
 #
-# $Revision: 345964 $
-# $Date: 2011-02-15 16:25:18 +0100 (Tue, 15 Feb 2011) $
 
 ##
 # @short Function adding the bunch structure metadata to the D3PD
@@ -27,13 +24,9 @@
 #
 # @author Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
 #
-# $Revision: 345964 $
-# $Date: 2011-02-15 16:25:18 +0100 (Tue, 15 Feb 2011) $
-#
 def addBunchStructureMetadata( d3pdalg = None, source = "" ):
 
     # Create a logger for the function:
-    if "logger" in dir(): orig_logger = logger
     from AthenaCommon.Logging import logging
     logger = logging.getLogger( "addBunchStructureMetadata" )
 
@@ -55,9 +48,9 @@ def addBunchStructureMetadata( d3pdalg = None, source = "" ):
     _d3pdSvc = getattr( ServiceMgr, _d3pdSvcName )
 
     # If no D3PD::MakerAlg has been provided, create a dummy one:
-    if d3pdalg == None:
+    if d3pdalg is None:
         logger.warning( "No D3PD MakerAlg given to function!" )
-        logger.warning( "The bunch configuration will be saved into file: " +
+        logger.warning( "The bunch configuration will be saved into file: "
                         "\"BunchConfig.root\"" )
         from AthenaCommon.AlgSequence import AlgSequence
         theJob = AlgSequence()
@@ -68,7 +61,7 @@ def addBunchStructureMetadata( d3pdalg = None, source = "" ):
 
     # Add the metadata tool:
     _d3pdToolName = "BunchStructureMetadataTool"
-    if not _d3pdToolName in [ t.name() for t in d3pdalg.MetadataTools ]:
+    if _d3pdToolName not in [ t.name() for t in d3pdalg.MetadataTools ]:
         import TriggerD3PDMaker
         from TrigBunchCrossingTool.BunchCrossingConfProvider import BunchCrossingConfProvider
         d3pdalg.MetadataTools += [
@@ -90,7 +83,4 @@ def addBunchStructureMetadata( d3pdalg = None, source = "" ):
     else:
         logger.info( "BunchConfigIDD3PDObject already added to the D3PD::MakerAlg" )
 
-    # Restore the original logger if necessary:
-    if "orig_logger" in dir(): logger = orig_logger
-
     return
diff --git a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/CTPD3PDObject.py b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/CTPD3PDObject.py
index 9daa23f56b1c..4441f41195a8 100644
--- a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/CTPD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/CTPD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 # D3PD object saving the CTP_RDO information into the D3PD
@@ -6,8 +6,6 @@
 # is active...)
 #
 
-import D3PDMakerCoreComps
-from D3PDMakerCoreComps.D3PDObject import D3PDObject
 from D3PDMakerCoreComps.D3PDObject import make_SG_D3PDObject
 import TriggerD3PDMaker
 
diff --git a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/EmTauROID3PDObject.py b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/EmTauROID3PDObject.py
index 20f851907c4c..702f61931155 100644
--- a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/EmTauROID3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/EmTauROID3PDObject.py
@@ -1,13 +1,11 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# $Id: EmTauROID3PDObject.py 633616 2014-12-04 10:10:12Z ssnyder $
 #
 # D3PD object saving the LVL1 Em/Tau RoI information into the D3PD
 #
 
 from D3PDMakerCoreComps.D3PDObject  import make_SGDataVector_D3PDObject
 import TriggerD3PDMaker
-import EventCommonD3PDMaker
 import D3PDMakerCoreComps
 
 
diff --git a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/MuCTPID3PDObject.py b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/MuCTPID3PDObject.py
index c000fad52131..02b95661bcc0 100644
--- a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/MuCTPID3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/MuCTPID3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 # D3PD object saving the MuCTPI_RDO information into the D3PD
@@ -6,8 +6,6 @@
 # is active...)
 #
 
-import D3PDMakerCoreComps
-from D3PDMakerCoreComps.D3PDObject import D3PDObject
 from D3PDMakerCoreComps.D3PDObject import make_SG_D3PDObject
 import TriggerD3PDMaker
 
@@ -28,8 +26,8 @@ MuCTPID3PDObject = make_SG_D3PDObject( "MuCTPI_RDO", "MUCTPI_RDO",
 
 if _haveRDO:
     # Make sure the cabling services are configured:
-    import TrigT1RPCRecRoiSvc.TrigT1RPCRecRoiConfig
-    import TrigT1TGCRecRoiSvc.TrigT1TGCRecRoiConfig
+    import TrigT1RPCRecRoiSvc.TrigT1RPCRecRoiConfig  # noqa: F401
+    import TrigT1TGCRecRoiSvc.TrigT1TGCRecRoiConfig  # noqa: F401
 
     # Define the blocks:
     MuCTPID3PDObject.defineBlock( 0, "RDOInfo",
diff --git a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/MuonROID3PDObject.py b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/MuonROID3PDObject.py
index f1a36fe50453..bd396c7f0b17 100644
--- a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/MuonROID3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/MuonROID3PDObject.py
@@ -1,13 +1,11 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# $Id: MuonROID3PDObject.py 620244 2014-10-06 19:02:48Z ssnyder $
 #
 # D3PD object saving the LVL1 muon RoI information into the D3PD
 #
 
 from D3PDMakerCoreComps.D3PDObject import make_SGDataVector_D3PDObject
 import TriggerD3PDMaker
-import EventCommonD3PDMaker
 import D3PDMakerCoreComps
 
 MuonROID3PDObject = \
diff --git a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/TrigConfMetadata.py b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/TrigConfMetadata.py
index 26b66437fe44..3b18eed10f4c 100644
--- a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/TrigConfMetadata.py
+++ b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/TrigConfMetadata.py
@@ -5,7 +5,7 @@
 # metadata to the D3PD.
 #
 
-def addTrigConfMetadata( d3pdalg = None, useTrigConfEventSummaries = False, doCostL2 = False, doCostEF = False, doCostHLT = False, saveKeys = True, tuplePath = "" ):
+def addTrigConfMetadata( d3pdalg = None, useTrigConfEventSummaries = False, saveKeys = True, tuplePath = "" ):
 
     """Helper function that adds the necessary tool(s) and service(s) to the
        job to save the trigger configuration metadata to the output D3PD
@@ -20,7 +20,6 @@ def addTrigConfMetadata( d3pdalg = None, useTrigConfEventSummaries = False, doCo
     """
 
     # Create a logger for the function:
-    if "logger" in dir(): orig_logger = logger
     from AthenaCommon.Logging import logging
     logger = logging.getLogger( "addTrigConfMetadata" )
 
@@ -41,9 +40,9 @@ def addTrigConfMetadata( d3pdalg = None, useTrigConfEventSummaries = False, doCo
     _d3pdSvc = getattr( ServiceMgr, _d3pdSvcName )
 
     # If no D3PD::MakerAlg has been provided, create a dummy one:
-    if d3pdalg == None:
+    if d3pdalg is None:
         logger.warning( "No D3PD MakerAlg given to function!" )
-        logger.warning( "The trigger configuration will be saved into file: " +
+        logger.warning( "The trigger configuration will be saved into file: "
                         "\"TrigConfig.root\"" )
         from AthenaCommon.AlgSequence import AlgSequence
         theJob = AlgSequence()
@@ -53,7 +52,7 @@ def addTrigConfMetadata( d3pdalg = None, useTrigConfEventSummaries = False, doCo
 
     # Add the metadata tool:
     _d3pdToolName = "TrigConfMetadataTool"
-    if not _d3pdToolName in [ t.name() for t in d3pdalg.MetadataTools ]:
+    if _d3pdToolName not in [ t.name() for t in d3pdalg.MetadataTools ]:
         import TriggerD3PDMaker
         if (tuplePath == ""):
           tuplePath = d3pdalg.TuplePath
@@ -62,26 +61,17 @@ def addTrigConfMetadata( d3pdalg = None, useTrigConfEventSummaries = False, doCo
                                                                ConfigDir = tuplePath + "Meta" )
         _trigConfTool.UseTrigConfEventSummaries = useTrigConfEventSummaries
         if useTrigConfEventSummaries:
-            # Figure out if old or new style HLT if using CostMon to get correct storegate key
-            # Old key fomat was HLT_OPI_HLT_monitoring_config
-            if (doCostL2 == True or doCostEF == True or doCostHLT == True):
-              logger.info( "TrigConfMetadataTool will use passed arguments [L2="+str(doCostL2)+",EF="+str(doCostEF)+",HLT="+str(doCostHLT)+"]" )
-              if (doCostL2 == True or doCostEF == True):
-                _trigConfTool.keyConfig = "HLT_TrigMonConfigCollection_OPI_EF_monitoring_config"
-              elif (doCostHLT == True):
+            logger.info( "TrigConfMetadataTool will use TriggerFlags flags for config" )
+            from TriggerJobOpts.TriggerFlags import TriggerFlags
+            if TriggerFlags.doHLT():
                 _trigConfTool.keyConfig = "HLT_TrigMonConfigCollection_OPI_HLT_monitoring_config"
-            else: 
-              logger.info( "TrigConfMetadataTool will use TriggerFlags flags for config" )
-              from TriggerJobOpts.TriggerFlags import TriggerFlags
-              if TriggerFlags.doHLT():
-                _trigConfTool.keyConfig = "HLT_TrigMonConfigCollection_OPI_HLT_monitoring_config"
-            logger.info( "TrigConfMetadataTool will use the StoreGate key " + _trigConfTool.keyConfig )
+            logger.info( "TrigConfMetadataTool will use the StoreGate key %s", _trigConfTool.keyConfig )
             d3pdalg.MetadataTools += [ _trigConfTool ]
     else:
       logger.info( "TrigConfMetadataTool was already added to the D3PD::MakerAlg" )
 
     # Add the DB key filler object:
-    if saveKeys == True:
+    if saveKeys is True:
       _dbKeysFillerName = "TrigDBKeysFiller"
       if not hasattr( d3pdalg, _dbKeysFillerName ):
           from TriggerD3PDMaker.TrigDBKeysD3PDObject import TrigDBKeysD3PDObject
@@ -89,7 +79,4 @@ def addTrigConfMetadata( d3pdalg = None, useTrigConfEventSummaries = False, doCo
       else:
           logger.info( "TrigDBKeysD3PDObject already added to the D3PD::MakerAlg" )
 
-    # Restore the original logger if necessary:
-    if "orig_logger" in dir(): logger = orig_logger
-
     return
diff --git a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/TrigRoiDescD3PDObject.py b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/TrigRoiDescD3PDObject.py
index d81c2ce31976..3c76c4fe7111 100644
--- a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/TrigRoiDescD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/TrigRoiDescD3PDObject.py
@@ -1,12 +1,10 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# $Id: TrigRoiDescD3PDObject.py 338058 2010-12-20 13:20:43Z krasznaa $
 #
 # D3PD object saving information about TrigRoiDescriptor objects.
 # By default it saves the "initial RoIs", the RoIs that are given
 # to the LVL2 algorithms from LVL1.
 
-from D3PDMakerCoreComps.D3PDObject import D3PDObject
 from D3PDMakerCoreComps.D3PDObject import make_SGDataVector_D3PDObject
 import TriggerD3PDMaker
 
diff --git a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/defineTriggerBits.py b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/defineTriggerBits.py
index 21be38ef0912..af6ba52ec989 100644
--- a/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/defineTriggerBits.py
+++ b/PhysicsAnalysis/D3PDMaker/TriggerD3PDMaker/python/defineTriggerBits.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# $Id: defineTriggerBits.py 484175 2012-02-21 13:06:42Z krasznaa $
 #
 # @file  TriggerD3PDMaker/python/addTriggerBits.py
 # @author scott snyder <snyder@bnl.gov>
@@ -28,7 +27,6 @@
 import TriggerD3PDMaker
 from D3PDMakerCoreComps.D3PDObject  import make_Void_D3PDObject
 from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
-from AthenaCommon.AppMgr            import theApp
 
 
 triggerBitsD3PDObject = \
@@ -84,7 +82,7 @@ This allows one to segregate the trigger decision flags in a separate tree.
             pass
 
         pat = pattern
-        if type(pat) != type([]):
+        if not isinstance(pat, list):
             pat = [pat]
             pass
         filler.TriggerBitsFiller_TriggerBits.Triggers += pat
-- 
GitLab


From b15f1d0ccdcea5b4fa277ddb3b262849336fb7dc Mon Sep 17 00:00:00 2001
From: Ruby Ferguson <ruby.alice.molly.ferguson@cern.ch>
Date: Mon, 14 Dec 2020 16:31:08 +0000
Subject: [PATCH 020/225] removed BDT references

---
 .../python/tauMonitorAlgorithm.py             |  95 ++++++------
 .../tauMonitoring/src/tauMonitorAlgorithm.cxx | 146 +++++++++---------
 2 files changed, 115 insertions(+), 126 deletions(-)

diff --git a/Reconstruction/tauMonitoring/python/tauMonitorAlgorithm.py b/Reconstruction/tauMonitoring/python/tauMonitorAlgorithm.py
index b54d8e2dcdcc..1f058baac3a4 100644
--- a/Reconstruction/tauMonitoring/python/tauMonitorAlgorithm.py
+++ b/Reconstruction/tauMonitoring/python/tauMonitorAlgorithm.py
@@ -47,7 +47,7 @@ def tauMonitoringConfig(inputFlags):
     tauMonAlgEleTrig = cfgHelper.addAlgorithm( tauMonitorAlgorithm, name='tauMonAlgEleTrig')
     tauMonAlgJetTrig = cfgHelper.addAlgorithm( tauMonitorAlgorithm, name='tauMonAlgJetTrig')
     tauMonAlgHighPt = cfgHelper.addAlgorithm( tauMonitorAlgorithm, name='tauMonAlgHighPt')
-    tauMonAlgHighPtBDTLoose = cfgHelper.addAlgorithm( tauMonitorAlgorithm, name='tauMonAlgHighPtBDTLoose')
+    tauMonAlgHighPtRNNLoose = cfgHelper.addAlgorithm( tauMonitorAlgorithm, name='tauMonAlgHighPtRNNLoose')
 
 
 
@@ -88,8 +88,8 @@ def tauMonitoringConfig(inputFlags):
     tauMonAlgJetTrig.etaMax = 100
     tauMonAlgHighPt.etaMin = -100
     tauMonAlgHighPt.etaMax = 100
-    tauMonAlgHighPtBDTLoose.etaMin = -100
-    tauMonAlgHighPtBDTLoose.etaMax = 100
+    tauMonAlgHighPtRNNLoose.etaMin = -100
+    tauMonAlgHighPtRNNLoose.etaMax = 100
 
     tauMonAlgBA.kinGroupName = 'tauMonKinGroupBA'
     tauMonAlgCR.kinGroupName = 'tauMonKinGroupCR'
@@ -106,7 +106,7 @@ def tauMonitoringConfig(inputFlags):
     tauMonAlgEleTrig.kinGroupName = 'tauMonKinGroupEleTrig'
     tauMonAlgJetTrig.kinGroupName = 'tauMonKinGroupJetTrig'
     tauMonAlgHighPt.kinGroupName = 'tauMonKinGroupHighPt'
-    tauMonAlgHighPtBDTLoose.kinGroupName = 'tauMonKinGroupHighPtBDTLoose'
+    tauMonAlgHighPtRNNLoose.kinGroupName = 'tauMonKinGroupHighPtRNNLoose'
 
     ### STEP 4 ###
     # Add some tools. N.B. Do not use your own trigger decion tool. Use the
@@ -131,7 +131,7 @@ def tauMonitoringConfig(inputFlags):
     myKinGroupJetTrig = cfgHelper.addGroup(alg=tauMonAlgJetTrig, name='tauMonKinGroupJetTrig', topPath='Tau/Trigger/JetTrig' )
 
     myKinGroupHighPt = cfgHelper.addGroup(alg=tauMonAlgHighPt, name='tauMonKinGroupHighPt', topPath='Tau/' )
-    myKinGroupHighPtBDTLoose = cfgHelper.addGroup(alg=tauMonAlgHighPtBDTLoose, name='tauMonKinGroupHighPtBDTLoose', topPath='Tau/' )
+    myKinGroupHighPtRNNLoose = cfgHelper.addGroup(alg=tauMonAlgHighPtRNNLoose, name='tauMonKinGroupHighPtRNNLoose', topPath='Tau/' )
 
 
     naming= {
@@ -140,7 +140,7 @@ def tauMonitoringConfig(inputFlags):
             'EC': "Tau_TauE_",
             'Global': "",
             'HighPt': "",
-            'HighPtBDTLoose': "",
+            'HighPtRNNLoose': "",
             'EleTrig': "emTriggered_",
             'JetTrig': "jetTriggered_",
             'TauTrig1': "tauTriggered1_",
@@ -174,7 +174,7 @@ def tauMonitoringConfig(inputFlags):
                  (myKinGroupEC,'EC'),
                  (myKinGroupGlobal,'Global'),
                  (myKinGroupHighPt,'HighPt'),
-                 (myKinGroupHighPtBDTLoose,'HighPtBDTLoose'),
+                 (myKinGroupHighPtRNNLoose,'HighPtRNNLoose'),
                  (myKinGroupEleTrig,'EleTrig'),
                  (myKinGroupJetTrig,'JetTrig'),
                  (myKinGroupTauTrig1, 'TauTrig1'),
@@ -205,6 +205,10 @@ def tauMonitoringConfig(inputFlags):
             igroup.defineHistogram(namer('RNNJetScore','RNNJetScore','',postfix), title='RNN Jet Score',
                                    xbins=100, xmin=0, xmax=1,path=folder)
 
+            igroup.defineHistogram(namer('RNNJetScoreSigTrans','RNNJetScoreSigTrans','',postfix), title='RNN Jet Score Sig Trans',
+                                   xbins=48, xmin=0, xmax=1.1,path=folder)
+
+
 
             igroup.defineHistogram(namer('tauEt','tauEt','',postfix), title='Et of tau candidates;Transverse Energy (GeV);Number of Candidates',
                                    xbins=60, xmin=0., xmax=300.,path=folder)
@@ -232,46 +236,46 @@ def tauMonitoringConfig(inputFlags):
 
         if(postfix =="BA" or postfix =="CR" or postfix=="EC" or postfix.startswith('TauTrig')):
 
-            igroup.defineHistogram(namer('tauPhiBDTLoose','phi','Identification_BDTLoose',postfix), title='Phi of tau candidates ( BDTLoose) ;Phi;Number of Candidates',
-                xbins=65, xmin=PHIMIN-0.098174/2., xmax=PHIMAX+0.098174/2., path=folder+"Identification/BDTLoose" )
+            igroup.defineHistogram(namer('tauPhiRNNLoose','phi','Identification_RNNLoose',postfix), title='Phi of tau candidates ( RNNLoose) ;Phi;Number of Candidates',
+                xbins=65, xmin=PHIMIN-0.098174/2., xmax=PHIMAX+0.098174/2., path=folder+"Identification/RNNLoose" )
 
-            igroup.defineHistogram(namer('tauEtaBDTLoose','eta','Identification_BDTLoose',postfix), title='Eta of tau candidates ( BDTLoose) ;Eta;Number of Candidates',
-                xbins=51, xmin=-2.55, xmax=2.55, path=folder+"Identification/BDTLoose")
+            igroup.defineHistogram(namer('tauEtaRNNLoose','eta','Identification_RNNLoose',postfix), title='Eta of tau candidates ( RNNLoose) ;Eta;Number of Candidates',
+                xbins=51, xmin=-2.55, xmax=2.55, path=folder+"Identification/RNNLoose")
 
-            igroup.defineHistogram(namer('tauEtBDTLoose','et','Identification_BDTLoose',postfix), title='Et of tau candidates;Transverse Energy (GeV);Number of Candidates',
-                xbins=60, xmin=0., xmax=300.,path=folder+"Identification/BDTLoose")
+            igroup.defineHistogram(namer('tauEtRNNLoose','et','Identification_RNNLoose',postfix), title='Et of tau candidates;Transverse Energy (GeV);Number of Candidates',
+                xbins=60, xmin=0., xmax=300.,path=folder+"Identification/RNNLoose")
 
-            igroup.defineHistogram(namer('NumTracksBDTLoose','NumTracks','Identification_BDTLoose',postfix), title='Number Of Tracks for Tau Candidates (BDTLoose);Number Of Tracks;Number Of Candidates',
-                xbins=21, xmin=-0.5, xmax=20.5,path=folder+"Identification/BDTLoose")
+            igroup.defineHistogram(namer('NumTracksRNNLoose','NumTracks','Identification_RNNLoose',postfix), title='Number Of Tracks for Tau Candidates (RNNLoose);Number Of Tracks;Number Of Candidates',
+                xbins=21, xmin=-0.5, xmax=20.5,path=folder+"Identification/RNNLoose")
 
-            igroup.defineHistogram(namer('tauPhiBDTMedium','phi','Identification_BDTMedium',postfix), title='Phi of tau candidates ( BDTMedium) ;Phi;Number of Candidates',
-                xbins=65, xmin=PHIMIN-0.098174/2., xmax=PHIMAX+0.098174/2., path=folder+"Identification/BDTMedium" )
+            igroup.defineHistogram(namer('tauPhiRNNMedium','phi','Identification_RNNMedium',postfix), title='Phi of tau candidates ( RNNMedium) ;Phi;Number of Candidates',
+                xbins=65, xmin=PHIMIN-0.098174/2., xmax=PHIMAX+0.098174/2., path=folder+"Identification/RNNMedium" )
 
-            igroup.defineHistogram(namer('tauEtaBDTMedium','eta','Identification_BDTMedium',postfix), title='Eta of tau candidates ( BDTMedium) ;Eta;Number of Candidates',
-                xbins=51, xmin=-2.55, xmax=2.55, path=folder+"Identification/BDTMedium")
+            igroup.defineHistogram(namer('tauEtaRNNMedium','eta','Identification_RNNMedium',postfix), title='Eta of tau candidates ( RNNMedium) ;Eta;Number of Candidates',
+                xbins=51, xmin=-2.55, xmax=2.55, path=folder+"Identification/RNNMedium")
 
-            igroup.defineHistogram(namer('tauEtBDTMedium','et','Identification_BDTMedium',postfix), title='Et of tau candidates;Transverse Energy (GeV);Number of Candidates',
-                xbins=60, xmin=0., xmax=300.,path=folder+"Identification/BDTMedium")
+            igroup.defineHistogram(namer('tauEtRNNMedium','et','Identification_RNNMedium',postfix), title='Et of tau candidates;Transverse Energy (GeV);Number of Candidates',
+                xbins=60, xmin=0., xmax=300.,path=folder+"Identification/RNNMedium")
 
-            igroup.defineHistogram(namer('NumTracksBDTMedium','NumTracks','Identification_BDTMedium',postfix), title='Number Of Tracks for Tau Candidates (BDTMedium);Number Of Tracks;Number Of Candidates',
-                xbins=21, xmin=-0.5, xmax=20.5,path=folder+"Identification/BDTMedium")
-            igroup.defineHistogram(namer('tauPhiEt15BDTLoose','phi','Identification_BDTLoose15GeV',postfix), title='Phi of tau candidates (Et>15, BDTLoose) ;Phi;Number of Candidates',
-                xbins=65, xmin=PHIMIN-0.098174/2., xmax=PHIMAX+0.098174/2., path=folder+"Identification/BDTLoose15GeV" )
+            igroup.defineHistogram(namer('NumTracksRNNMedium','NumTracks','Identification_RNNMedium',postfix), title='Number Of Tracks for Tau Candidates (RNNMedium);Number Of Tracks;Number Of Candidates',
+                xbins=21, xmin=-0.5, xmax=20.5,path=folder+"Identification/RNNMedium")
+            igroup.defineHistogram(namer('tauPhiEt15RNNLoose','phi','Identification_RNNLoose15GeV',postfix), title='Phi of tau candidates (Et>15, RNNLoose) ;Phi;Number of Candidates',
+                xbins=65, xmin=PHIMIN-0.098174/2., xmax=PHIMAX+0.098174/2., path=folder+"Identification/RNNLoose15GeV" )
 
-            igroup.defineHistogram(namer('tauEtaEt15BDTLoose','eta','Identification_BDTLoose15GeV',postfix), title='Eta of tau candidates (Et>15, BDTLoose) ;Eta;Number of Candidates',
-                xbins=51, xmin=-2.55, xmax=2.55, path=folder+"Identification/BDTLoose15GeV")
+            igroup.defineHistogram(namer('tauEtaEt15RNNLoose','eta','Identification_RNNLoose15GeV',postfix), title='Eta of tau candidates (Et>15, RNNLoose) ;Eta;Number of Candidates',
+                xbins=51, xmin=-2.55, xmax=2.55, path=folder+"Identification/RNNLoose15GeV")
 
-            igroup.defineHistogram(namer('nClustersEt15BDTLoose','nCluster','Identification_BDTLoose15GeV',postfix), title='Number Of CaloTopoClusters (Et>15,BDTLoose);Number Of Clusters;Number Of Candidates',
-                xbins=40, xmin=0., xmax=40.,path=folder+"Identification/BDTLoose15GeV" )
+            igroup.defineHistogram(namer('nClustersEt15RNNLoose','nCluster','Identification_RNNLoose15GeV',postfix), title='Number Of CaloTopoClusters (Et>15,RNNLoose);Number Of Clusters;Number Of Candidates',
+                xbins=40, xmin=0., xmax=40.,path=folder+"Identification/RNNLoose15GeV" )
 
-            igroup.defineHistogram(namer('NumTracksEt15BDTLoose','NumTracks','Identification_BDTLoose15GeV',postfix), title='Number Of Tracks for Tau Candidates (Et>15,BDTLoose);Number Of Tracks;Number Of Candidates',
-                xbins=21, xmin=-0.5, xmax=20.5,path=folder+"Identification/BDTLoose15GeV")
+            igroup.defineHistogram(namer('NumTracksEt15RNNLoose','NumTracks','Identification_RNNLoose15GeV',postfix), title='Number Of Tracks for Tau Candidates (Et>15,RNNLoose);Number Of Tracks;Number Of Candidates',
+                xbins=21, xmin=-0.5, xmax=20.5,path=folder+"Identification/RNNLoose15GeV")
 
-            igroup.defineHistogram(namer('tauEtEt15BDTLoose','et','Identification_BDTLoose15GeV',postfix), title='Et of tau candidates;Transverse Energy (GeV);Number of Candidates',
-                                   xbins=60, xmin=0., xmax=300.,path=folder+"Identification/BDTLoose15GeV")
+            igroup.defineHistogram(namer('tauEtEt15RNNLoose','et','Identification_RNNLoose15GeV',postfix), title='Et of tau candidates;Transverse Energy (GeV);Number of Candidates',
+                                   xbins=60, xmin=0., xmax=300.,path=folder+"Identification/RNNLoose15GeV")
 
-            igroup.defineHistogram(namer('panModeEt15BDTLoose','panMode','Identification_BDTLoose15GeV',postfix), title='tau decay mode from panTau upon JetBDTSigMedium;mode',
-                                   xbins=5, xmin=0., xmax=5., path=folder+"Identification/BDTLoose15GeV", xlabels=["1p0n","1p1n","1pXn","3p0n","3pXn"])
+            igroup.defineHistogram(namer('panModeEt15RNNLoose','panMode','Identification_RNNLoose15GeV',postfix), title='tau decay mode from panTau upon JetRNNSigMedium;mode',
+                                   xbins=5, xmin=0., xmax=5., path=folder+"Identification/RNNLoose15GeV", xlabels=["1p0n","1p1n","1pXn","3p0n","3pXn"])
 
             igroup.defineHistogram(namer('jetSeedEta','jetSeedEta','Calo',postfix), title='Calorimeter eta of tau candidates;Eta;Numbers of Candidates',path=folder+"Calo",
             xbins=50, xmin=-2.5, xmax=2.5 )
@@ -312,27 +316,18 @@ def tauMonitoringConfig(inputFlags):
             igroup.defineHistogram('isolFrac,LB', type='TH2F', title='Isolation Fraction vs Lumiblock;Isolation Fraction;Lumiblock', path=folder+"Calo", 
             xbins=51,xmin=0,xmax=1.02,ybins=1200,ymin=0.,ymax=1200.)
 
-            igroup.defineHistogram(namer('BDTJetScore','BDTJetScore','Identification',postfix), title='BDT Score for Jet Rejection;Boosted Decision Tree Score',path=folder+"Identification",
-            xbins=48, xmin=-1.1, xmax=1.1 )
-
-            igroup.defineHistogram(namer('JetBDTBkgMedium','JetBDTBkgMedium','Identification',postfix), title='Loose EleBDT',path=folder+"Identification",
-            xbins=2, xmin=-0.5, xmax=1.5, xlabels=["False","True"])
-
-
-            igroup.defineHistogram(namer('BDTJetScoreSigTrans','BDTJetScoreSigTrans','Identification',postfix), title='Flattened signal Transformed BDT Score for Jet Rejection;Boosted Decision Tree Score',path=folder+"Identification",
-            xbins=48, xmin=0, xmax=1.1 )
 
 
             igroup.defineHistogram(namer('muonVeto','muonVeto','Identification',postfix), title='Muon Veto',path=folder+"Identification",
             xbins=2, xmin=-0.5, xmax=1.5, xlabels=["False","True"] )
 
-            igroup.defineHistogram(namer('tauBDTLoose','tauBDTLoose','Identification',postfix), title='Identification Flag: tauBDTLoose',path=folder+"Identification",
+            igroup.defineHistogram(namer('tauRNNLoose','tauRNNLoose','Identification',postfix), title='Identification Flag: tauRNNLoose',path=folder+"Identification",
             xbins=2, xmin=-0.5, xmax=1.5 , xlabels=["False","True"])
 
-            igroup.defineHistogram(namer('tauBDTMedium','tauBDTMedium','Identification',postfix), title='Identification Flag: tauBDTMedium',path=folder+"Identification",
+            igroup.defineHistogram(namer('tauRNNMedium','tauRNNMedium','Identification',postfix), title='Identification Flag: tauRNNMedium',path=folder+"Identification",
             xbins=2, xmin=-0.5, xmax=1.5 , xlabels=["False","True"])
 
-            igroup.defineHistogram(namer('tauBDTTight','tauBDTTight','Identification',postfix), title='Identification Flag: tauBDTTight',path=folder+"Identification",
+            igroup.defineHistogram(namer('tauRNNTight','tauRNNTight','Identification',postfix), title='Identification Flag: tauRNNTight',path=folder+"Identification",
             xbins=2, xmin=-0.5, xmax=1.5, xlabels=["False","True"])
 
 
@@ -529,9 +524,9 @@ def tauMonitoringConfig(inputFlags):
             igroup.defineHistogram(namer('tauEtaEt15,tauPhiEt15','tauPhiVsEta_et15','',postfix), type='TH2F', title='EtaVsEtTitle;Eta;Phi', 
                xbins=30,xmin=-2.55,xmax=2.55,ybins=32,ymin=PHIMIN,ymax=PHIMAX)
 
-        if postfix == 'HighPtBDTLoose':
+        if postfix == 'HighPtRNNLoose':
 
-            igroup.defineHistogram(namer('tauEtaEt15BDTLoose,tauPhiEt15BDTLoose','tauPhiVsEta_et15_BDTLoose','',postfix), type='TH2F', title='Phi vs Eta (Et>15, BDTLoose) ;Eta;Phi', 
+            igroup.defineHistogram(namer('tauEtaEt15RNNLoose,tauPhiEt15RNNLoose','tauPhiVsEta_et15_RNNLoose','',postfix), type='TH2F', title='Phi vs Eta (Et>15, RNNLoose) ;Eta;Phi', 
                xbins=30,xmin=-2.55,xmax=2.55,ybins=32,ymin=PHIMIN,ymax=PHIMAX)
 
 
@@ -596,7 +591,7 @@ if __name__=='__main__':
     exampleMonitorAcc.getEventAlgo('tauMonAlgEleTrig').OutputLevel = 2 # DEBUG
     exampleMonitorAcc.getEventAlgo('tauMonAlgJetTrig').OutputLevel = 2 # DEBUG
     exampleMonitorAcc.getEventAlgo('tauMonAlgHighPt').OutputLevel = 2 # DEBUG
-    exampleMonitorAcc.getEventAlgo('tauMonAlgHighPtBDTLoose').OutputLevel = 2 # DEBUG
+    exampleMonitorAcc.getEventAlgo('tauMonAlgHighPtRNNLoose').OutputLevel = 2 # DEBUG
 
     cfg.printConfig(withDetails=True) # set True for exhaustive info
 
diff --git a/Reconstruction/tauMonitoring/src/tauMonitorAlgorithm.cxx b/Reconstruction/tauMonitoring/src/tauMonitorAlgorithm.cxx
index 8abe8007f428..6110d4162921 100644
--- a/Reconstruction/tauMonitoring/src/tauMonitorAlgorithm.cxx
+++ b/Reconstruction/tauMonitoring/src/tauMonitorAlgorithm.cxx
@@ -49,8 +49,8 @@ StatusCode tauMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const
 
     auto tauPhi = Monitored::Scalar<float>("tauPhi",0.0);
     auto tauEt = Monitored::Scalar<float>("tauEt",0.0);
-    auto tauEtEt15BDTLoose = Monitored::Scalar<float>("tauEtEt15BDTLoose",0.0);
-    auto panModeEt15BDTLoose = Monitored::Scalar<float>("panModeEt15BDTLoose",0.0);
+    auto tauEtEt15RNNLoose = Monitored::Scalar<float>("tauEtEt15RNNLoose",0.0);
+    auto panModeEt15RNNLoose = Monitored::Scalar<float>("panModeEt15RNNLoose",0.0);
     auto panModeSubstructure = Monitored::Scalar<float>("panModeSubstructure",0.0);
     auto coreTrk = Monitored::Scalar<float>("coreTrk",0.0);
     auto PtTESMVA = Monitored::Scalar<float>("PtTESMVA",0.0);
@@ -60,30 +60,31 @@ StatusCode tauMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const
     auto tauPhiEt15 = Monitored::Scalar<float>("tauPhiEt15",0.0);
     auto tauEtaEt15 = Monitored::Scalar<float>("tauEtaEt15",0.0);
 
-    auto tauPhiEt15BDTLoose = Monitored::Scalar<float>("tauPhiEt15BDTLoose",0.0);
-    auto tauEtaEt15BDTLoose = Monitored::Scalar<float>("tauEtaEt15BDTLoose",0.0);
+    auto tauPhiEt15RNNLoose = Monitored::Scalar<float>("tauPhiEt15RNNLoose",0.0);
+    auto tauEtaEt15RNNLoose = Monitored::Scalar<float>("tauEtaEt15RNNLoose",0.0);
 
 
     auto tauCharge = Monitored::Scalar<int>("tauCharge",0.0);
     auto RNNJetScore = Monitored::Scalar<float>("RNNJetScore",0.0);
+    auto RNNJetScoreSigTrans = Monitored::Scalar<float>("RNNJetScoreSigTrans",0.0);
 
     auto NumTracks = Monitored::Scalar<int>("NumTracks",0.0);
-    auto NumTracksEt15BDTLoose = Monitored::Scalar<int>("NumTracksEt15BDTLoose",0.0);
+    auto NumTracksEt15RNNLoose = Monitored::Scalar<int>("NumTracksEt15RNNLoose",0.0);
 
     auto nTauCandidates = Monitored::Scalar<int>("nTauCandidates",0.0);
     auto nHighPtTauCandidates = Monitored::Scalar<int>("nHighPtTauCandidates",0.0);
     auto nClusters = Monitored::Scalar<int>("nClusters",0.0);
-    auto nClustersEt15BDTLoose = Monitored::Scalar<int>("nClustersEt15BDTLoose",0.0);
+    auto nClustersEt15RNNLoose = Monitored::Scalar<int>("nClustersEt15RNNLoose",0.0);
 
-    auto tauEtBDTLoose = Monitored::Scalar<float>("tauEtBDTLoose",0.0);
-    auto tauEtaBDTLoose = Monitored::Scalar<float>("tauEtaBDTLoose",0.0);
-    auto tauPhiBDTLoose = Monitored::Scalar<float>("tauPhiBDTLoose",0.0);
-    auto NumTracksBDTLoose = Monitored::Scalar<float>("NumTracksBDTLoose",0.0);
+    auto tauEtRNNLoose = Monitored::Scalar<float>("tauEtRNNLoose",0.0);
+    auto tauEtaRNNLoose = Monitored::Scalar<float>("tauEtaRNNLoose",0.0);
+    auto tauPhiRNNLoose = Monitored::Scalar<float>("tauPhiRNNLoose",0.0);
+    auto NumTracksRNNLoose = Monitored::Scalar<float>("NumTracksRNNLoose",0.0);
 
-    auto tauEtBDTMedium = Monitored::Scalar<float>("tauEtBDTMedium",0.0);
-    auto tauEtaBDTMedium = Monitored::Scalar<float>("tauEtaBDTMedium",0.0);
-    auto tauPhiBDTMedium = Monitored::Scalar<float>("tauPhiBDTMedium",0.0);
-    auto NumTracksBDTMedium = Monitored::Scalar<float>("NumTracksBDTMedium",0.0);
+    auto tauEtRNNMedium = Monitored::Scalar<float>("tauEtRNNMedium",0.0);
+    auto tauEtaRNNMedium = Monitored::Scalar<float>("tauEtaRNNMedium",0.0);
+    auto tauPhiRNNMedium = Monitored::Scalar<float>("tauPhiRNNMedium",0.0);
+    auto NumTracksRNNMedium = Monitored::Scalar<float>("NumTracksRNNMedium",0.0);
 
     auto LB = Monitored::Scalar<int>("LB",0.0);
 
@@ -100,16 +101,13 @@ StatusCode tauMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const
     auto jetSeedPhi = Monitored::Scalar<float>("jetSeedPhi",0.0);
     auto jetSeedPt = Monitored::Scalar<float>("jetSeedPt",0.0);
 
-    auto BDTJetScore = Monitored::Scalar<float>("BDTJetScore",0.0);
-    auto BDTJetScoreSigTrans = Monitored::Scalar<float>("BDTJetScoreSigTrans",0.0);
-    auto JetBDTBkgMedium  = Monitored::Scalar<float>("JetBDTBkgMedium",0.0);
 
     auto muonVeto = Monitored::Scalar<float>("muonVeto",0.0);
 
 
-    auto tauBDTLoose = Monitored::Scalar<float>("tauBDTLoose",0.0);
-    auto tauBDTMedium = Monitored::Scalar<float>("tauBDTMedium",0.0);
-    auto tauBDTTight = Monitored::Scalar<float>("tauBDTTight",0.0);
+    auto tauRNNLoose = Monitored::Scalar<float>("tauRNNLoose",0.0);
+    auto tauRNNMedium = Monitored::Scalar<float>("tauRNNMedium",0.0);
+    auto tauRNNTight = Monitored::Scalar<float>("tauRNNight",0.0);
 
     auto hadLeakFracFixed = Monitored::Scalar<float>("hadLeakFracFixed",0.0);
     auto PSSFrac = Monitored::Scalar<float>("PSSFrac",0.0);
@@ -208,17 +206,16 @@ StatusCode tauMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const
         ptIntermediateAxis     =    tau->ptIntermediateAxis()/GeV;
 
         //identification
-        BDTJetScore = tau->discriminant(xAOD::TauJetParameters::BDTJetScore);
-        BDTJetScoreSigTrans = tau->discriminant(xAOD::TauJetParameters::BDTJetScoreSigTrans);
         RNNJetScore =  tau->discriminant(xAOD::TauJetParameters::TauID::RNNJetScore);
+        RNNJetScoreSigTrans =  tau->discriminant(xAOD::TauJetParameters::TauID::RNNJetScoreSigTrans);
+
 
-        JetBDTBkgMedium = tau->isTau(xAOD::TauJetParameters::JetBDTBkgMedium);
 
 
         muonVeto     =       tau->isTau(xAOD::TauJetParameters::MuonVeto);
-        tauBDTLoose  =       tau->isTau(xAOD::TauJetParameters::JetBDTSigLoose);
-        tauBDTMedium =       tau->isTau(xAOD::TauJetParameters::JetBDTSigMedium);
-        tauBDTTight  =       tau->isTau(xAOD::TauJetParameters::JetBDTSigTight);
+        tauRNNLoose  =       tau->isTau(xAOD::TauJetParameters::JetRNNSigLoose);
+        tauRNNMedium =       tau->isTau(xAOD::TauJetParameters::JetRNNSigMedium);
+        tauRNNTight  =       tau->isTau(xAOD::TauJetParameters::JetRNNSigTight);
 
         dRmax           =    tau->detail<float>(xAOD::TauJetParameters::dRmax);
         EMPOverTrkSysP  =    tau->detail<float>(xAOD::TauJetParameters::EMPOverTrkSysP);
@@ -265,7 +262,7 @@ StatusCode tauMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const
                 nHighPtTaus +=1;
             }
 
-            if (m_kinGroupName != "tauMonKinGroupHighPt"&& m_kinGroupName!="tauMonKinGroupHighPtBDTLoose"){
+            if (m_kinGroupName != "tauMonKinGroupHighPt"&& m_kinGroupName!="tauMonKinGroupHighPtRNNLoose"){
 
                 if (
                      (
@@ -289,49 +286,49 @@ StatusCode tauMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const
                      (m_kinGroupName == "tauMonKinGroupJetTrig" && trigDecTool !=0 && trigDecTool->isPassed("HLT_j[2-9][0-9]_.*"))
                 ){
 
-                    if(m_kinGroupName != "tauMonKinGroupGlobal" && tauEt > lowerEtThreshold && tauBDTLoose){
-                        tauPhiEt15BDTLoose = tau->phi();
-                        tauEtaEt15BDTLoose = tau->eta();
-                        tauEtEt15BDTLoose = tau->pt()/GeV;
-                        nClustersEt15BDTLoose = tau->detail<int>(xAOD::TauJetParameters::numTopoClusters) ;
-                        NumTracksEt15BDTLoose = tau->nTracks();
+                    if(m_kinGroupName != "tauMonKinGroupGlobal" && tauEt > lowerEtThreshold && tauRNNLoose){
+                        tauPhiEt15RNNLoose = tau->phi();
+                        tauEtaEt15RNNLoose = tau->eta();
+                        tauEtEt15RNNLoose = tau->pt()/GeV;
+                        nClustersEt15RNNLoose = tau->detail<int>(xAOD::TauJetParameters::numTopoClusters) ;
+                        NumTracksEt15RNNLoose = tau->nTracks();
 
                         tau->panTauDetail(xAOD::TauJetParameters::PanTau_DecayMode, panModeDummy); 
-                        panModeEt15BDTLoose = panModeDummy;
+                        panModeEt15RNNLoose = panModeDummy;
                         fill(tool
-                        ,tauPhiEt15BDTLoose
-                        ,tauEtaEt15BDTLoose
-                        ,nClustersEt15BDTLoose
-                        ,NumTracksEt15BDTLoose
-                        ,tauEtEt15BDTLoose
-                        ,panModeEt15BDTLoose);
+                        ,tauPhiEt15RNNLoose
+                        ,tauEtaEt15RNNLoose
+                        ,nClustersEt15RNNLoose
+                        ,NumTracksEt15RNNLoose
+                        ,tauEtEt15RNNLoose
+                        ,panModeEt15RNNLoose);
                     }
 
                     
-                    if(m_kinGroupName != "tauMonKinGroupGlobal" && tauBDTLoose){
-                        tauPhiBDTLoose = tau->phi();
-                        tauEtaBDTLoose = tau->eta();
-                        tauEtBDTLoose = tau->pt()/GeV;
-                        NumTracksBDTLoose = tau->nTracks();
+                    if(m_kinGroupName != "tauMonKinGroupGlobal" && tauRNNLoose){
+                        tauPhiRNNLoose = tau->phi();
+                        tauEtaRNNLoose = tau->eta();
+                        tauEtRNNLoose = tau->pt()/GeV;
+                        NumTracksRNNLoose = tau->nTracks();
 
                         fill(tool
-                        ,tauPhiBDTLoose
-                        ,tauEtaBDTLoose
-                        ,NumTracksBDTLoose
-                        ,tauEtBDTLoose);
+                        ,tauPhiRNNLoose
+                        ,tauEtaRNNLoose
+                        ,NumTracksRNNLoose
+                        ,tauEtRNNLoose);
                     }
 
-                    if(m_kinGroupName != "tauMonKinGroupGlobal" && tauBDTMedium){
-                        tauPhiBDTMedium = tau->phi();
-                        tauEtaBDTMedium = tau->eta();
-                        tauEtBDTMedium = tau->pt()/GeV;
-                        NumTracksBDTMedium = tau->nTracks();
+                    if(m_kinGroupName != "tauMonKinGroupGlobal" && tauRNNMedium){
+                        tauPhiRNNMedium = tau->phi();
+                        tauEtaRNNMedium = tau->eta();
+                        tauEtRNNMedium = tau->pt()/GeV;
+                        NumTracksRNNMedium = tau->nTracks();
 
                         fill(tool
-                        ,tauPhiBDTMedium
-                        ,tauEtaBDTMedium
-                        ,NumTracksBDTMedium
-                        ,tauEtBDTMedium);
+                        ,tauPhiRNNMedium
+                        ,tauEtaRNNMedium
+                        ,NumTracksRNNMedium
+                        ,tauEtRNNMedium);
                     }
 
                     
@@ -461,15 +458,12 @@ StatusCode tauMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const
                     ,etEMAtEMScale
                     ,etHadAtEMScale
                     ,tauCharge
-                    ,BDTJetScore
-                    ,BDTJetScoreSigTrans
-                    ,JetBDTBkgMedium
                     ,RNNJetScore
+                    ,RNNJetScoreSigTrans
                     ,muonVeto
-                    ,tauBDTLoose
-                    ,tauBDTMedium
-                    ,tauBDTTight
-                    ,BDTJetScore
+                    ,tauRNNLoose
+                    ,tauRNNMedium
+                    ,tauRNNTight
                     ,PSSFrac
                     ,hadLeakFracFixed
                     ,etHotShotWinOverPtLeadTrk
@@ -513,20 +507,20 @@ StatusCode tauMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const
                 fill(tool,LB,tauPhiEt15,tauEtaEt15);
             }
 
-            if ((m_kinGroupName == "tauMonKinGroupHighPtBDTLoose") && tauEt > lowerEtThreshold &&tauBDTLoose){
-                tauPhiEt15BDTLoose = tau->phi();
-                tauEtaEt15BDTLoose = tau->eta();
-                tauEtEt15BDTLoose = tau->pt()/GeV; //GeV
+            if ((m_kinGroupName == "tauMonKinGroupHighPtRNNLoose") && tauEt > lowerEtThreshold &&tauRNNLoose){
+                tauPhiEt15RNNLoose = tau->phi();
+                tauEtaEt15RNNLoose = tau->eta();
+                tauEtEt15RNNLoose = tau->pt()/GeV; //GeV
 
-                nClustersEt15BDTLoose = tau->detail<int>(xAOD::TauJetParameters::numTopoClusters) ;
-                NumTracksEt15BDTLoose = tau->nTracks();
+                nClustersEt15RNNLoose = tau->detail<int>(xAOD::TauJetParameters::numTopoClusters) ;
+                NumTracksEt15RNNLoose = tau->nTracks();
                 fill(tool
                 ,LB
-                ,tauPhiEt15BDTLoose
-                ,tauEtaEt15BDTLoose
-                ,nClustersEt15BDTLoose
-                ,NumTracksEt15BDTLoose
-                ,tauEtEt15BDTLoose);
+                ,tauPhiEt15RNNLoose
+                ,tauEtaEt15RNNLoose
+                ,nClustersEt15RNNLoose
+                ,NumTracksEt15RNNLoose
+                ,tauEtEt15RNNLoose);
             }
         }
     }
-- 
GitLab


From 849db9a0119c5e705710c72b438f4cca21f39da4 Mon Sep 17 00:00:00 2001
From: Tomasz Bold <tomasz.bold@gmail.com>
Date: Mon, 14 Dec 2020 20:27:41 +0000
Subject: [PATCH 021/225] Refactored use of tracking flags in IDtacking config

---
 InnerDetector/InDetConfig/CMakeLists.txt      |   7 +
 .../InDetConfig/python/BackTrackingConfig.py  |  95 ++++++------
 .../python/TRTSegmentFindingConfig.py         |  61 ++++----
 .../python/TrackingCommonConfig.py            | 139 +++++++++---------
 4 files changed, 149 insertions(+), 153 deletions(-)

diff --git a/InnerDetector/InDetConfig/CMakeLists.txt b/InnerDetector/InDetConfig/CMakeLists.txt
index 193803d2174d..7c6b3a570c5a 100644
--- a/InnerDetector/InDetConfig/CMakeLists.txt
+++ b/InnerDetector/InDetConfig/CMakeLists.txt
@@ -14,3 +14,10 @@ atlas_add_test( TrackingCutsFlags_test
     SCRIPT python -m InDetConfig.TrackingCutsFlags
     POST_EXEC_SCRIPT nopost.sh)
  
+atlas_add_test( BackTrackingConfig_test
+    SCRIPT python -m InDetConfig.BackTrackingConfig  --norun
+    POST_EXEC_SCRIPT nopost.sh)
+
+atlas_add_test( TRTSegmentFindingConfig_test
+    SCRIPT python -m InDetConfig.TRTSegmentFindingConfig  --norun
+    POST_EXEC_SCRIPT nopost.sh)
diff --git a/InnerDetector/InDetConfig/python/BackTrackingConfig.py b/InnerDetector/InDetConfig/python/BackTrackingConfig.py
index 5d2714b8d588..e0aba1065e43 100644
--- a/InnerDetector/InDetConfig/python/BackTrackingConfig.py
+++ b/InnerDetector/InDetConfig/python/BackTrackingConfig.py
@@ -3,7 +3,7 @@ from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory     import CompFactory
 import InDetConfig.TrackingCommonConfig         as   TC
 
-def SiDetElementsRoadMaker_xkCfg(flags, name = 'InDetTRT_SeededSiRoad', TrackingFlags=None, **kwargs):
+def SiDetElementsRoadMaker_xkCfg(flags, name = 'InDetTRT_SeededSiRoad', **kwargs):
     acc = ComponentAccumulator()
     #
     # Silicon det elements road maker tool
@@ -12,9 +12,9 @@ def SiDetElementsRoadMaker_xkCfg(flags, name = 'InDetTRT_SeededSiRoad', Tracking
     acc.addPublicTool(InDetPatternPropagator)
 
     kwargs.setdefault("PropagatorTool", InDetPatternPropagator)
-    kwargs.setdefault("usePixel", TrackingFlags.usePixel)
+    kwargs.setdefault("usePixel", flags.InDet.Tracking.usePixel)
     kwargs.setdefault("PixManagerLocation", 'Pixel') # InDetKeys.PixelManager()
-    kwargs.setdefault("useSCT", TrackingFlags.useSCT)
+    kwargs.setdefault("useSCT", flags.InDet.Tracking.useSCT)
     kwargs.setdefault("SCTManagerLocation", 'SCT') # InDetKeys.SCT_Manager()
     kwargs.setdefault("RoadWidth", 35.)
     kwargs.setdefault("MaxStep", 20.)
@@ -22,7 +22,7 @@ def SiDetElementsRoadMaker_xkCfg(flags, name = 'InDetTRT_SeededSiRoad', Tracking
     if flags.Beam.Type == "cosmics":
         kwargs.setdefault("RoadWidth", 50)
     # Condition algorithm for InDet__SiDetElementsRoadMaker_xk
-    if TrackingFlags.useSCT:
+    if flags.InDet.Tracking.useSCT:
         acc.addCondAlgo(CompFactory.InDet.SiDetElementsRoadCondAlg_xk(name = "InDet__SiDetElementsRoadCondAlg_xk"))
 
     InDetTRT_SeededSiRoadMaker = CompFactory.InDet.SiDetElementsRoadMaker_xk(name = name, **kwargs)
@@ -52,7 +52,7 @@ def SimpleTRT_SeededSpacePointFinder_ATLCfg(flags, name='InDetTRT_SeededSpFinder
     acc.setPrivateTools(InDetTRT_SeededSpacePointFinder)
     return acc
 
-def TRT_SeededSpacePointFinder_ATLCfg(flags, name='InDetTRT_SeededSpFinder', TrackingFlags=None, InputCollections=[], **kwargs):
+def TRT_SeededSpacePointFinder_ATLCfg(flags, name='InDetTRT_SeededSpFinder', InputCollections=[], **kwargs):
     acc = ComponentAccumulator()
     #
     # --- decide if use the association tool
@@ -74,13 +74,13 @@ def TRT_SeededSpacePointFinder_ATLCfg(flags, name='InDetTRT_SeededSpFinder', Tra
     kwargs.setdefault("NeighborSearch", True)
     kwargs.setdefault("LoadFull", False)
     kwargs.setdefault("DoCosmics", flags.Beam.Type == "cosmics")
-    kwargs.setdefault("pTmin", TrackingFlags.minSecondaryPt)
+    kwargs.setdefault("pTmin", flags.InDet.Tracking.minSecondaryPt)
 
     InDetTRT_SeededSpacePointFinder = CompFactory.InDet.TRT_SeededSpacePointFinder_ATL(name = name, **kwargs)
     acc.setPrivateTools(InDetTRT_SeededSpacePointFinder)
     return acc
 
-def TRT_SeededTrackFinder_ATLCfg(flags, name='InDetTRT_SeededTrackMaker', TrackingFlags=None, InputCollections=[], **kwargs):
+def TRT_SeededTrackFinder_ATLCfg(flags, name='InDetTRT_SeededTrackMaker', InputCollections=[], **kwargs):
     acc = ComponentAccumulator()
     #
     # --- TRT seeded back tracking tool
@@ -94,8 +94,8 @@ def TRT_SeededTrackFinder_ATLCfg(flags, name='InDetTRT_SeededTrackMaker', Tracki
     InDetSiComTrackFinder = acc.popToolsAndMerge(TC.SiCombinatorialTrackFinder_xkCfg(flags))
     acc.addPublicTool(InDetSiComTrackFinder)
 
-    if (TrackingFlags.usePixel and TrackingFlags.useSCT) is not False:
-        InDetTRT_SeededSiRoadMaker = acc.popToolsAndMerge(SiDetElementsRoadMaker_xkCfg(flags, TrackingFlags=TrackingFlags))
+    if (flags.InDet.Tracking.usePixel and flags.InDet.Tracking.useSCT) is not False:
+        InDetTRT_SeededSiRoadMaker = acc.popToolsAndMerge(SiDetElementsRoadMaker_xkCfg(flags))
         acc.addPublicTool(InDetTRT_SeededSiRoadMaker)
         kwargs.setdefault("RoadTool", InDetTRT_SeededSiRoadMaker)
 
@@ -104,7 +104,6 @@ def TRT_SeededTrackFinder_ATLCfg(flags, name='InDetTRT_SeededTrackMaker', Tracki
     #
     if flags.InDet.loadTRTSeededSPFinder:
         InDetTRT_SeededSpacePointFinder = acc.popToolsAndMerge(TRT_SeededSpacePointFinder_ATLCfg(flags, 
-                                                                                                 TrackingFlags=TrackingFlags,
                                                                                                  InputCollections=InputCollections))
     elif flags.InDet.loadSimpleTRTSeededSPFinder:
         InDetTRT_SeededSpacePointFinder = acc.popToolsAndMerge(SimpleTRT_SeededSpacePointFinder_ATLCfg(flags, InputCollections=InputCollections))
@@ -115,11 +114,11 @@ def TRT_SeededTrackFinder_ATLCfg(flags, name='InDetTRT_SeededTrackMaker', Tracki
     kwargs.setdefault("UpdatorTool", InDetPatternUpdator)
     kwargs.setdefault("SeedTool", InDetTRT_SeededSpacePointFinder)
     kwargs.setdefault("CombinatorialTrackFinder", InDetSiComTrackFinder)
-    kwargs.setdefault("pTmin", TrackingFlags.minSecondaryPt)
-    kwargs.setdefault("nHolesMax", TrackingFlags.SecondarynHolesMax)
-    kwargs.setdefault("nHolesGapMax", TrackingFlags.SecondarynHolesGapMax)
-    kwargs.setdefault("Xi2max", TrackingFlags.SecondaryXi2max)
-    kwargs.setdefault("Xi2maxNoAdd", TrackingFlags.SecondaryXi2maxNoAdd)
+    kwargs.setdefault("pTmin", flags.InDet.Tracking.minSecondaryPt)
+    kwargs.setdefault("nHolesMax", flags.InDet.Tracking.SecondarynHolesMax)
+    kwargs.setdefault("nHolesGapMax", flags.InDet.Tracking.SecondarynHolesGapMax)
+    kwargs.setdefault("Xi2max", flags.InDet.Tracking.SecondaryXi2max)
+    kwargs.setdefault("Xi2maxNoAdd", flags.InDet.Tracking.SecondaryXi2maxNoAdd)
     kwargs.setdefault("SearchInCaloROI", False)
     kwargs.setdefault("InputClusterContainerName", 'InDetCaloClusterROIs') # InDetKeys.CaloClusterROIContainer()
     kwargs.setdefault("ConsistentSeeds", True)
@@ -132,7 +131,7 @@ def TRT_SeededTrackFinder_ATLCfg(flags, name='InDetTRT_SeededTrackMaker', Tracki
     acc.setPrivateTools(InDetTRT_SeededTrackTool)
     return acc
 
-def TRT_SeededTrackFinderCfg(flags, name='InDetTRT_SeededTrackFinder', TrackingFlags = None, InputCollections=[], **kwargs):
+def TRT_SeededTrackFinderCfg(flags, name='InDetTRT_SeededTrackFinder', InputCollections=[], **kwargs):
     acc = ComponentAccumulator()
 
     #
@@ -160,7 +159,7 @@ def TRT_SeededTrackFinderCfg(flags, name='InDetTRT_SeededTrackFinder', TrackingF
     InDetTrackSummaryToolNoHoleSearch = acc.popToolsAndMerge(TC.InDetTrackSummaryToolNoHoleSearchCfg(flags))
     acc.addPublicTool(InDetTrackSummaryToolNoHoleSearch)
 
-    InDetTRTExtensionTool = acc.popToolsAndMerge(TC.InDetTRT_ExtensionToolCfg(flags, TrackingFlags = TrackingFlags))
+    InDetTRTExtensionTool = acc.popToolsAndMerge(TC.InDetTRT_ExtensionToolCfg(flags))
     acc.addPublicTool(InDetTRTExtensionTool)
 
     from  InDetConfig.InDetRecToolConfig import InDetExtrapolatorCfg
@@ -169,7 +168,6 @@ def TRT_SeededTrackFinderCfg(flags, name='InDetTRT_SeededTrackFinder', TrackingF
     acc.merge(tmpAcc)
 
     InDetTRT_SeededTrackTool = acc.popToolsAndMerge(TRT_SeededTrackFinder_ATLCfg(flags, 
-                                                                                 TrackingFlags = TrackingFlags,
                                                                                  InputCollections=InputCollections))
     acc.addPublicTool(InDetTRT_SeededTrackTool)
 
@@ -178,24 +176,24 @@ def TRT_SeededTrackFinderCfg(flags, name='InDetTRT_SeededTrackFinder', TrackingF
     kwargs.setdefault("PRDtoTrackMap", prefix+'PRDtoTrackMap'+suffix if usePrdAssociationTool else "")
     kwargs.setdefault("TrackSummaryTool", InDetTrackSummaryToolNoHoleSearch)
     kwargs.setdefault("TrackExtensionTool", InDetTRTExtensionTool)
-    kwargs.setdefault("MinTRTonSegment", TrackingFlags.minSecondaryTRTonTrk)
-    kwargs.setdefault("MinTRTonly", TrackingFlags.minTRTonly)
+    kwargs.setdefault("MinTRTonSegment", flags.InDet.Tracking.minSecondaryTRTonTrk)
+    kwargs.setdefault("MinTRTonly", flags.InDet.Tracking.minTRTonly)
     kwargs.setdefault("TrtExtension", True)
-    kwargs.setdefault("SiExtensionCuts", TrackingFlags.SiExtensionCuts)
-    kwargs.setdefault("minPt", TrackingFlags.minSecondaryPt)
-    kwargs.setdefault("maxRPhiImp", TrackingFlags.maxSecondaryImpact)
-    kwargs.setdefault("maxZImp", TrackingFlags.maxZImpact)
-    kwargs.setdefault("maxEta", TrackingFlags.maxEta)
+    kwargs.setdefault("SiExtensionCuts", flags.InDet.Tracking.SiExtensionCuts)
+    kwargs.setdefault("minPt", flags.InDet.Tracking.minSecondaryPt)
+    kwargs.setdefault("maxRPhiImp", flags.InDet.Tracking.maxSecondaryImpact)
+    kwargs.setdefault("maxZImp", flags.InDet.Tracking.maxZImpact)
+    kwargs.setdefault("maxEta", flags.InDet.Tracking.maxEta)
     kwargs.setdefault("Extrapolator", InDetExtrapolator)
-    kwargs.setdefault("RejectShortExtension", TrackingFlags.rejectShortExtensions)
+    kwargs.setdefault("RejectShortExtension", flags.InDet.Tracking.rejectShortExtensions)
     kwargs.setdefault("FinalRefit", False)
     kwargs.setdefault("FinalStatistics", False)
     kwargs.setdefault("OutputSegments", False)
     kwargs.setdefault("InputSegmentsLocation", 'TRTSegments') # InDetKeys.TRT_Segments()
     kwargs.setdefault("OutputTracksLocation", TRTSeededTracks)
-    kwargs.setdefault("CaloClusterEt", TrackingFlags.minRoIClusterEt)
+    kwargs.setdefault("CaloClusterEt", flags.InDet.Tracking.minRoIClusterEt)
 
-    if TrackingFlags.RoISeededBackTracking:
+    if flags.InDet.Tracking.RoISeededBackTracking:
         from RegionSelector.RegSelToolConfig import regSelTool_SCT_Cfg
         RegSelTool_SCT   = acc.popToolsAndMerge(regSelTool_SCT_Cfg(flags))
         acc.addPublicTool(RegSelTool_SCT)
@@ -221,10 +219,10 @@ def TrkAmbiguityScoreCfg(name='InDetTRT_SeededAmbiguityScore', **kwargs):
     acc.addEventAlgo(InDetAmbiguityScore)
     return acc
 
-def InDetAmbiTrackSelectionToolCfg(flags, name='InDetTRT_SeededAmbiTrackSelectionTool', TrackingFlags=None, **kwargs):
+def InDetAmbiTrackSelectionToolCfg(flags, name='InDetTRT_SeededAmbiTrackSelectionTool', **kwargs):
     acc = ComponentAccumulator()
 
-    InDetTRTDriftCircleCut = TC.InDetTRTDriftCircleCutForPatternRecoCfg(flags, TrackingFlags= TrackingFlags)
+    InDetTRTDriftCircleCut = TC.InDetTRTDriftCircleCutForPatternRecoCfg(flags)
     acc.addPublicTool(InDetTRTDriftCircleCut)
 
     InDetPRDtoTrackMapToolGangedPixels = TC.InDetPRDtoTrackMapToolGangedPixelsCfg(flags)
@@ -233,11 +231,11 @@ def InDetAmbiTrackSelectionToolCfg(flags, name='InDetTRT_SeededAmbiTrackSelectio
     kwargs.setdefault("DriftCircleCutTool", InDetTRTDriftCircleCut)
     kwargs.setdefault("AssociationTool", InDetPRDtoTrackMapToolGangedPixels)
     kwargs.setdefault("minScoreShareTracks", -1.) # off !
-    kwargs.setdefault("minHits", TrackingFlags.minSecondaryClusters)
-    kwargs.setdefault("minNotShared", TrackingFlags.minSecondarySiNotShared)
-    kwargs.setdefault("maxShared", TrackingFlags.maxSecondaryShared)
-    kwargs.setdefault("minTRTHits", TrackingFlags.minSecondaryTRTonTrk)
-    kwargs.setdefault("UseParameterization", TrackingFlags.useParameterizedTRTCuts)
+    kwargs.setdefault("minHits", flags.InDet.Tracking.minSecondaryClusters)
+    kwargs.setdefault("minNotShared", flags.InDet.Tracking.minSecondarySiNotShared)
+    kwargs.setdefault("maxShared", flags.InDet.Tracking.maxSecondaryShared)
+    kwargs.setdefault("minTRTHits", flags.InDet.Tracking.minSecondaryTRTonTrk)
+    kwargs.setdefault("UseParameterization", flags.InDet.Tracking.useParameterizedTRTCuts)
     kwargs.setdefault("Cosmics", flags.Beam.Type == "cosmics")
     kwargs.setdefault("doPixelSplitting", flags.InDet.doPixelClusterSplitting)
 
@@ -245,7 +243,7 @@ def InDetAmbiTrackSelectionToolCfg(flags, name='InDetTRT_SeededAmbiTrackSelectio
     acc.setPrivateTools(InDetTRT_SeededAmbiTrackSelectionTool)
     return acc
 
-def SimpleAmbiguityProcessorToolCfg(flags, name='InDetTRT_SeededAmbiguityProcessor', TrackingFlags=None, ClusterSplitProbContainer="", **kwargs):
+def SimpleAmbiguityProcessorToolCfg(flags, name='InDetTRT_SeededAmbiguityProcessor', ClusterSplitProbContainer="", **kwargs):
     acc = ComponentAccumulator()
     #
     # --- load Ambiguity Processor
@@ -260,17 +258,17 @@ def SimpleAmbiguityProcessorToolCfg(flags, name='InDetTRT_SeededAmbiguityProcess
     # --- set up special Scoring Tool for TRT seeded tracks
     #
     if flags.Beam.Type == "cosmics":
-        InDetTRT_SeededScoringTool = acc.popToolsAndMerge(TC.InDetCosmicScoringTool_TRTCfg(flags, TrackingFlags=TrackingFlags))
+        InDetTRT_SeededScoringTool = acc.popToolsAndMerge(TC.InDetCosmicScoringTool_TRTCfg(flags))
         acc.addPublicTool(InDetTRT_SeededScoringTool)
         InDetTRT_SeededSummaryTool = acc.popToolsAndMerge(TC.InDetTrackSummaryToolSharedHitsCfg(flags))
         acc.addPublicTool(InDetTRT_SeededSummaryTool)
     else:
-        InDetTRT_SeededScoringTool = acc.popToolsAndMerge(TC.InDetTRT_SeededScoringToolCfg(flags, TrackingFlags=TrackingFlags))
+        InDetTRT_SeededScoringTool = acc.popToolsAndMerge(TC.InDetTRT_SeededScoringToolCfg(flags))
         acc.addPublicTool(InDetTRT_SeededScoringTool)
         InDetTRT_SeededSummaryTool = acc.popToolsAndMerge(TC.InDetTrackSummaryToolCfg(flags))
         acc.addPublicTool(InDetTRT_SeededSummaryTool)
 
-    InDetTRT_SeededAmbiTrackSelectionTool = acc.popToolsAndMerge(InDetAmbiTrackSelectionToolCfg(flags, TrackingFlags=TrackingFlags))
+    InDetTRT_SeededAmbiTrackSelectionTool = acc.popToolsAndMerge(InDetAmbiTrackSelectionToolCfg(flags))
     acc.addPublicTool(InDetTRT_SeededAmbiTrackSelectionTool)
 
     kwargs.setdefault("Fitter", InDetTrackFitterBT)
@@ -278,7 +276,7 @@ def SimpleAmbiguityProcessorToolCfg(flags, name='InDetTRT_SeededAmbiguityProcess
     kwargs.setdefault("TrackSummaryTool", InDetTRT_SeededSummaryTool)
     kwargs.setdefault("SelectionTool", InDetTRT_SeededAmbiTrackSelectionTool)
     kwargs.setdefault("InputClusterSplitProbabilityName", ClusterSplitProbContainer)
-    kwargs.setdefault("OutputClusterSplitProbabilityName", 'InDetTRT_SeededAmbiguityProcessorSplitProb'+TrackingFlags.extension)
+    kwargs.setdefault("OutputClusterSplitProbabilityName", 'InDetTRT_SeededAmbiguityProcessorSplitProb'+flags.InDet.Tracking.extension)
     kwargs.setdefault("RefitPrds", not flags.InDet.refitROT)
     kwargs.setdefault("SuppressTrackFit", False)
     kwargs.setdefault("SuppressHoleSearch", False)
@@ -293,13 +291,12 @@ def SimpleAmbiguityProcessorToolCfg(flags, name='InDetTRT_SeededAmbiguityProcess
     acc.setPrivateTools(InDetTRT_SeededAmbiguityProcessor)
     return acc
 
-def TrkAmbiguitySolverCfg(flags, name='InDetTRT_SeededAmbiguitySolver', TrackingFlags=None, ClusterSplitProbContainer ='', **kwargs):
+def TrkAmbiguitySolverCfg(flags, name='InDetTRT_SeededAmbiguitySolver', ClusterSplitProbContainer ='', **kwargs):
     acc = ComponentAccumulator()
 
     ResolvedTRTSeededTracks = 'ResolvedTRTSeededTracks' # InDetKeys.ResolvedTRTSeededTracks()
 
     InDetTRT_SeededAmbiguityProcessor = acc.popToolsAndMerge(SimpleAmbiguityProcessorToolCfg(flags, 
-                                                                                             TrackingFlags=TrackingFlags, 
                                                                                              ClusterSplitProbContainer=ClusterSplitProbContainer))
     acc.addPublicTool(InDetTRT_SeededAmbiguityProcessor)
 
@@ -317,7 +314,7 @@ def TrkAmbiguitySolverCfg(flags, name='InDetTRT_SeededAmbiguitySolver', Tracking
 #
 # ------------------------------------------------------------
 
-def BackTrackingCfg(flags, InputCollections = None, TrackingFlags = None, TrackCollectionKeys=[] , TrackCollectionTruthKeys=[], ClusterSplitProbContainer=''):
+def BackTrackingCfg(flags, InputCollections = None, TrackCollectionKeys=[] , TrackCollectionTruthKeys=[], ClusterSplitProbContainer=''):
     acc = ComponentAccumulator()
     # ------------------------------------------------------------
     #
@@ -330,7 +327,6 @@ def BackTrackingCfg(flags, InputCollections = None, TrackingFlags = None, TrackC
         # --- decide which TRT seed space point finder to use
         #
         acc.merge(TRT_SeededTrackFinderCfg( flags,
-                                            TrackingFlags=TrackingFlags, 
                                             InputCollections=InputCollections))
     # ------------------------------------------------------------
     #
@@ -340,7 +336,6 @@ def BackTrackingCfg(flags, InputCollections = None, TrackingFlags = None, TrackC
     if flags.InDet.doResolveBackTracks:
         acc.merge(TrkAmbiguityScoreCfg())
         acc.merge(TrkAmbiguitySolverCfg(flags,
-                                        TrackingFlags=TrackingFlags,
                                         ClusterSplitProbContainer = ClusterSplitProbContainer))
 
     return acc
@@ -433,13 +428,11 @@ if __name__ == "__main__":
 
     ######################################## TRTSegmentFinding Configuration ###########################################
     InputCollections = []
-    TrackingFlags = ConfigFlags.InDet.Tracking
 
     from InDetConfig.TRTSegmentFindingConfig import TRTSegmentFindingCfg
     top_acc.merge(TRTSegmentFindingCfg( ConfigFlags,
                                         extension = "",
                                         InputCollections = InputCollections,
-                                        TrackingFlags = TrackingFlags,
                                         BarrelSegments = 'TRTSegments', # InDetKeys.TRT_Segments
                                         doPhase = False))
 
@@ -448,7 +441,6 @@ if __name__ == "__main__":
 
     top_acc.merge(BackTrackingCfg(  ConfigFlags,
                                     InputCollections = InputCollections,
-                                    TrackingFlags = TrackingFlags,
                                     TrackCollectionKeys=TrackCollectionKeys,
                                     TrackCollectionTruthKeys=[],
                                     ClusterSplitProbContainer=''))
@@ -459,5 +451,8 @@ if __name__ == "__main__":
     iovsvc.OutputLevel=5
 
     top_acc.printConfig()
-    top_acc.run(25)
-    top_acc.store(open("test_BackTrackingConfig.pkl", "wb"))
\ No newline at end of file
+    top_acc.store(open("test_BackTrackingConfig.pkl", "wb"))
+    import sys
+    if "--norun" not in sys.argv:
+        sc = top_acc.run(25)
+        sys.exit(not sc.isSuccess())
diff --git a/InnerDetector/InDetConfig/python/TRTSegmentFindingConfig.py b/InnerDetector/InDetConfig/python/TRTSegmentFindingConfig.py
index fdf5a0e45ca1..deeec8e92527 100644
--- a/InnerDetector/InDetConfig/python/TRTSegmentFindingConfig.py
+++ b/InnerDetector/InDetConfig/python/TRTSegmentFindingConfig.py
@@ -13,7 +13,7 @@ def TRT_TrackSegmentsMaker_BarrelCosmicsCfg(flags, name='InDetTRTSegmentsMaker',
     acc.setPrivateTools(CompFactory.InDet.TRT_TrackSegmentsMaker_BarrelCosmics(name = name, **kwargs))
     return acc
 
-def TRT_TrackSegmentsMaker_ATLxkCfg(flags, name = 'InDetTRT_SeedsMaker', extension = '', TrackingFlags = None, InputCollections = None, **kwargs):
+def TRT_TrackSegmentsMaker_ATLxkCfg(flags, name = 'InDetTRT_SeedsMaker', extension = '', InputCollections = None, **kwargs):
     acc = ComponentAccumulator()
     #
     # --- decide if use the association tool
@@ -30,21 +30,21 @@ def TRT_TrackSegmentsMaker_ATLxkCfg(flags, name = 'InDetTRT_SeedsMaker', extensi
     #
     if extension == "_TRT":
         # TRT Subdetector segment finding
-        MinNumberDCs   = TrackingFlags.minTRTonly
-        pTmin          = TrackingFlags.minPT
-        sharedFrac     = TrackingFlags.maxTRTonlyShared
+        MinNumberDCs   = flags.InDet.Tracking.minTRTonly
+        pTmin          = flags.InDet.Tracking.minPT
+        sharedFrac     = flags.InDet.Tracking.maxTRTonlyShared
     else:
         # TRT-only/back-tracking segment finding
-        MinNumberDCs   = TrackingFlags.minSecondaryTRTonTrk
-        pTmin          = TrackingFlags.minSecondaryPt
-        sharedFrac     = TrackingFlags.maxSecondaryTRTShared
+        MinNumberDCs   = flags.InDet.Tracking.minSecondaryTRTonTrk
+        pTmin          = flags.InDet.Tracking.minSecondaryPt
+        sharedFrac     = flags.InDet.Tracking.maxSecondaryTRTShared
     #
     # --- offline version  of TRT segemnt making
     #
     InDetPatternPropagator = TC.InDetPatternPropagatorCfg()
     acc.addPublicTool(InDetPatternPropagator)
 
-    InDetTRTExtensionTool = acc.popToolsAndMerge(TC.InDetTRT_ExtensionToolCfg(flags, TrackingFlags = TrackingFlags))
+    InDetTRTExtensionTool = acc.popToolsAndMerge(TC.InDetTRT_ExtensionToolCfg(flags))
     acc.addPublicTool(InDetTRTExtensionTool)
 
     kwargs.setdefault("TRT_ClustersContainer", 'TRT_DriftCircles') # InDetKeys.TRT_DriftCircles
@@ -53,7 +53,7 @@ def TRT_TrackSegmentsMaker_ATLxkCfg(flags, name = 'InDetTRT_SeedsMaker', extensi
     kwargs.setdefault("PRDtoTrackMap", prefix+'PRDtoTrackMap'+suffix if usePrdAssociationTool else '')
     kwargs.setdefault("RemoveNoiseDriftCircles", flags.InDet.removeTRTNoise)
     kwargs.setdefault("MinNumberDriftCircles", MinNumberDCs)
-    kwargs.setdefault("NumberMomentumChannel", TrackingFlags.TRTSegFinderPtBins)
+    kwargs.setdefault("NumberMomentumChannel", flags.InDet.Tracking.TRTSegFinderPtBins)
     kwargs.setdefault("pTmin", pTmin)
     kwargs.setdefault("sharedFrac", sharedFrac)
 
@@ -61,30 +61,30 @@ def TRT_TrackSegmentsMaker_ATLxkCfg(flags, name = 'InDetTRT_SeedsMaker', extensi
     acc.setPrivateTools(InDetTRT_TrackSegmentsMaker)
     return acc
 
-def TRT_TrackSegmentsMakerCondAlg_ATLxkCfg(name = 'InDetTRT_SeedsMakerCondAlg', extension = '', TrackingFlags = None, **kwargs):
+def TRT_TrackSegmentsMakerCondAlg_ATLxkCfg(flags, name = 'InDetTRT_SeedsMakerCondAlg', extension = '', **kwargs):
     acc = ComponentAccumulator()
     #
     # --- cut values
     #
     if extension == "_TRT":
         # TRT Subdetector segment finding
-        pTmin = TrackingFlags.minPT
+        pTmin = flags.InDet.Tracking.minPT
     else:
         # TRT-only/back-tracking segment finding
-        pTmin = TrackingFlags.minSecondaryPt
+        pTmin = flags.InDet.Tracking.minSecondaryPt
 
     InDetPatternPropagator = TC.InDetPatternPropagatorCfg()
     acc.addPublicTool(InDetPatternPropagator)
 
     kwargs.setdefault("PropagatorTool", InDetPatternPropagator)
-    kwargs.setdefault("NumberMomentumChannel", TrackingFlags.TRTSegFinderPtBins)
+    kwargs.setdefault("NumberMomentumChannel", flags.InDet.Tracking.TRTSegFinderPtBins)
     kwargs.setdefault("pTmin", pTmin)
 
     InDetTRT_TrackSegmentsMakerCondAlg = CompFactory.InDet.TRT_TrackSegmentsMakerCondAlg_ATLxk(name = name, **kwargs)
     acc.addCondAlgo(InDetTRT_TrackSegmentsMakerCondAlg)
     return acc
 
-def TRT_TrackSegmentsFinderCfg(flags, name = 'InDetTRT_TrackSegmentsFinderPhase', extension = '', TrackingFlags = None, BarrelSegments = None, InputCollections =None, doPhase = False, **kwargs):
+def TRT_TrackSegmentsFinderCfg(flags, name = 'InDetTRT_TrackSegmentsFinderPhase', extension = '', BarrelSegments = None, InputCollections =None, doPhase = False, **kwargs):
     acc = ComponentAccumulator()
 
     # ---------------------------------------------------------------
@@ -107,7 +107,7 @@ def TRT_TrackSegmentsFinderCfg(flags, name = 'InDetTRT_TrackSegmentsFinderPhase'
                                                                                                               TRT_ClustersContainer = 'TRT_DriftCircles')) # InDetKeys.TRT_DriftCircles
             acc.addPublicTool(InDetTRT_TrackSegmentsMaker)
 
-            if flags.InDet.doCaloSeededTRTSegments or TrackingFlags.RoISeededBackTracking:
+            if flags.InDet.doCaloSeededTRTSegments or flags.InDet.Tracking.RoISeededBackTracking:
                 kwargs.setdefault("SegmentsMakerTool", InDetTRT_TrackSegmentsMaker)
                 kwargs.setdefault("SegmentsLocation", BarrelSegments)
                 kwargs.setdefault("useCaloSeeds", True)
@@ -123,31 +123,30 @@ def TRT_TrackSegmentsFinderCfg(flags, name = 'InDetTRT_TrackSegmentsFinderPhase'
         InDetTRT_TrackSegmentsMaker = acc.popToolsAndMerge(TRT_TrackSegmentsMaker_ATLxkCfg( flags, 
                                                                                             name = 'InDetTRT_SeedsMaker'+extension, 
                                                                                             extension = extension,
-                                                                                            TrackingFlags = TrackingFlags,
                                                                                             InputCollections = InputCollections))
         acc.addPublicTool(InDetTRT_TrackSegmentsMaker)
         kwargs.setdefault("SegmentsMakerTool", InDetTRT_TrackSegmentsMaker)
 
-        acc.merge(TRT_TrackSegmentsMakerCondAlg_ATLxkCfg(name = 'InDetTRT_SeedsMakerCondAlg'+ extension, 
-                                                         extension = extension,
-                                                         TrackingFlags=TrackingFlags))
+        acc.merge(TRT_TrackSegmentsMakerCondAlg_ATLxkCfg(flags, 
+                                                         name = 'InDetTRT_SeedsMakerCondAlg'+ extension, 
+                                                         extension = extension))
 
     acc.addEventAlgo(CompFactory.InDet.TRT_TrackSegmentsFinder( name = name, **kwargs))
     return acc
 
-def SegmentDriftCircleAssValidationCfg(flags, name="InDetSegmentDriftCircleAssValidation", extension='', TrackingFlags=None, BarrelSegments='', **kwargs):
+def SegmentDriftCircleAssValidationCfg(flags, name="InDetSegmentDriftCircleAssValidation", extension='', BarrelSegments='', **kwargs):
     acc = ComponentAccumulator()
     #
     # --- cut values
     #
     if extension == "_TRT":
         # TRT Subdetector segment finding
-        MinNumberDCs = TrackingFlags.minTRTonly
-        pTmin        = TrackingFlags.minPT
+        MinNumberDCs = flags.InDet.Tracking.minTRTonly
+        pTmin        = flags.InDet.Tracking.minPT
     else:
         # TRT-only/back-tracking segment finding
-        MinNumberDCs = TrackingFlags.minSecondaryTRTonTrk
-        pTmin        = TrackingFlags.minSecondaryPt
+        MinNumberDCs = flags.InDet.Tracking.minSecondaryTRTonTrk
+        pTmin        = flags.InDet.Tracking.minSecondaryPt
 
     #kwargs.setdefault("OrigTracksLocation", BarrelSegments)
     kwargs.setdefault("TRT_DriftCirclesName", 'TRT_DriftCircles') # InDetKeys.TRT_DriftCircles
@@ -173,7 +172,7 @@ def TRTActiveCondAlgCfg(flags, name="TRTActiveCondAlg", **kwargs):
     acc.addCondAlgo(TRTActiveCondAlg)
     return acc
 
-def TRTSegmentFindingCfg(flags, extension = "", InputCollections = None, TrackingFlags = None, BarrelSegments = None, doPhase = False):
+def TRTSegmentFindingCfg(flags, extension = "", InputCollections = None, BarrelSegments = None, doPhase = False):
     acc = ComponentAccumulator()
     #
     # --- decide if use the association tool
@@ -195,7 +194,6 @@ def TRTSegmentFindingCfg(flags, extension = "", InputCollections = None, Trackin
     acc.merge(TRT_TrackSegmentsFinderCfg( flags,
                                           name = 'InDetTRT_TrackSegmentsFinderPhase'+extension,
                                           extension =extension,
-                                          TrackingFlags = TrackingFlags,
                                           BarrelSegments=BarrelSegments,
                                           InputCollections = InputCollections,
                                           doPhase = doPhase))
@@ -206,7 +204,6 @@ def TRTSegmentFindingCfg(flags, extension = "", InputCollections = None, Trackin
     if flags.InDet.doTruth and not flags.Beam.Type == "cosmics":
         acc.merge(SegmentDriftCircleAssValidationCfg(flags,
                                                     name="InDetSegmentDriftCircleAssValidation"+extension,
-                                                    TrackingFlags = TrackingFlags,
                                                     BarrelSegments=BarrelSegments))
     
     return acc
@@ -253,7 +250,6 @@ if __name__ == "__main__":
     # NewTracking collection keys
     InputCombinedInDetTracks = []
 
-    TrackingFlags = ConfigFlags.InDet.Tracking
     #############################################################################
     top_acc.merge(TRTActiveCondAlgCfg(ConfigFlags))
     top_acc.merge(TC.TRT_DetElementsRoadCondAlgCfg())
@@ -265,7 +261,6 @@ if __name__ == "__main__":
     top_acc.merge(TRTSegmentFindingCfg( ConfigFlags,
                                         "",
                                         InputCombinedInDetTracks,
-                                        TrackingFlags,
                                         'TRTSegments')) # InDetKeys.TRT_Segments
     #############################################################################
 
@@ -273,5 +268,9 @@ if __name__ == "__main__":
     iovsvc.OutputLevel=5
     top_acc.getService('StoreGateSvc').Dump = True
     top_acc.printConfig(withDetails = True, summariseProps = True)
-    top_acc.run(25)
-    top_acc.store(open("test_TRTSegmentFinding.pkl", "wb"))
\ No newline at end of file
+    top_acc.store(open("test_TRTSegmentFinding.pkl", "wb"))
+
+    import sys
+    if "--norun" not in sys.argv:
+        sc = top_acc.run(25)
+        sys.exit(not sc.isSuccess())
diff --git a/InnerDetector/InDetConfig/python/TrackingCommonConfig.py b/InnerDetector/InDetConfig/python/TrackingCommonConfig.py
index 13107c433f5a..ac7fe2bab99a 100644
--- a/InnerDetector/InDetConfig/python/TrackingCommonConfig.py
+++ b/InnerDetector/InDetConfig/python/TrackingCommonConfig.py
@@ -322,11 +322,11 @@ def InDetTrackPRD_AssociationCfg(flags, name='InDetTrackPRD_Association', **kwar
     acc.addEventAlgo(CompFactory.InDet.InDetTrackPRD_Association(name = the_name, **kwargs))
     return acc
 
-def InDetTRTDriftCircleCutForPatternRecoCfg(flags, name='InDetTRTDriftCircleCutForPatternReco', TrackingFlags=None, **kwargs):
+def InDetTRTDriftCircleCutForPatternRecoCfg(flags, name='InDetTRTDriftCircleCutForPatternReco', **kwargs):
     the_name = makeName( name, kwargs)
 
     kwargs.setdefault("MinOffsetDCs", 5)
-    kwargs.setdefault("UseNewParameterization", TrackingFlags.useNewParameterizationTRT)
+    kwargs.setdefault("UseNewParameterization", flags.InDet.Tracking.useNewParameterizationTRT)
     kwargs.setdefault("UseActiveFractionSvc", flags.Detector.RecoTRT)
     return CompFactory.InDet.InDetTrtDriftCircleCutTool(the_name, **kwargs)
 
@@ -1110,7 +1110,7 @@ def InDetPatternUpdatorCfg(name='InDetPatternUpdator', **kwargs):
     the_name = makeName(name, kwargs)
     return CompFactory.Trk.KalmanUpdator_xk(name = the_name, **kwargs)
 
-def InDetTRT_TrackExtensionTool_xkCfg(flags, name='InDetTRT_ExtensionTool', TrackingFlags=None, **kwargs):
+def InDetTRT_TrackExtensionTool_xkCfg(flags, name='InDetTRT_ExtensionTool', **kwargs):
     acc = ComponentAccumulator()
     the_name = makeName( name, kwargs)
 
@@ -1125,7 +1125,7 @@ def InDetTRT_TrackExtensionTool_xkCfg(flags, name='InDetTRT_ExtensionTool', Trac
         kwargs.setdefault("UpdatorTool", InDetPatternUpdator)
 
     if 'DriftCircleCutTool' not in kwargs :
-        InDetTRTDriftCircleCutForPatternReco = InDetTRTDriftCircleCutForPatternRecoCfg(flags, TrackingFlags=TrackingFlags)
+        InDetTRTDriftCircleCutForPatternReco = InDetTRTDriftCircleCutForPatternRecoCfg(flags)
         acc.addPublicTool(InDetTRTDriftCircleCutForPatternReco)
         kwargs.setdefault("DriftCircleCutTool", InDetTRTDriftCircleCutForPatternReco)
 
@@ -1143,14 +1143,14 @@ def InDetTRT_TrackExtensionTool_xkCfg(flags, name='InDetTRT_ExtensionTool', Trac
     kwargs.setdefault("TRT_ClustersContainer", 'TRT_DriftCircles') # InDetKeys.TRT_DriftCircles()
     kwargs.setdefault("TrtManagerLocation", 'TRT') # InDetKeys.TRT_Manager()
     kwargs.setdefault("UseDriftRadius", not flags.InDet.noTRTTiming)
-    kwargs.setdefault("MinNumberDriftCircles", TrackingFlags.minTRTonTrk)
+    kwargs.setdefault("MinNumberDriftCircles", flags.InDet.Tracking.minTRTonTrk)
     kwargs.setdefault("ScaleHitUncertainty", 2)
     kwargs.setdefault("RoadWidth", 20.)
-    kwargs.setdefault("UseParameterization", TrackingFlags.useParameterizedTRTCuts)
+    kwargs.setdefault("UseParameterization", flags.InDet.Tracking.useParameterizedTRTCuts)
     kwargs.setdefault("maxImpactParameter", 500 if flags.InDet.doBeamHalo or flags.InDet.doBeamGas else 50 )  # single beam running, open cuts
 
-    if TrackingFlags.RoISeededBackTracking:
-        kwargs.setdefault("minTRTSegmentpT", TrackingFlags.minSecondaryPt)
+    if flags.InDet.Tracking.RoISeededBackTracking:
+        kwargs.setdefault("minTRTSegmentpT", flags.InDet.Tracking.minSecondaryPt)
 
     acc.setPrivateTools(CompFactory.InDet.TRT_TrackExtensionTool_xk(the_name, **kwargs))
     return acc
@@ -1219,13 +1219,13 @@ def InDetTRT_TrackExtensionTool_DAFCfg(flags, name='TRT_TrackExtensionTool_DAF',
     acc.setPrivateTools(CompFactory.InDet.TRT_TrackExtensionTool_DAF(the_name,**kwargs))
     return acc
 
-def InDetTRT_ExtensionToolCfg(flags, TrackingFlags=None, **kwargs):
+def InDetTRT_ExtensionToolCfg(flags, **kwargs):
     # @TODO set all names to InDetTRT_ExtensionTool ?
     if (flags.InDet.trtExtensionType == 'xk') or (not flags.InDet.doNewTracking) :
         if (flags.Beam.Type == "cosmics"):
             return InDetTRT_ExtensionToolCosmicsCfg(flags, **kwargs)
         else:
-            return InDetTRT_TrackExtensionTool_xkCfg(flags, TrackingFlags=TrackingFlags, **kwargs)
+            return InDetTRT_TrackExtensionTool_xkCfg(flags, **kwargs)
     elif flags.InDet.trtExtensionType == 'DAF' :
         return InDetTRT_TrackExtensionTool_DAFCfg(flags, name = 'InDetTRT_ExtensionTool',**kwargs)
 
@@ -1264,7 +1264,6 @@ def InDetROIInfoVecCondAlgCfg(name='InDetROIInfoVecCondAlg', **kwargs) :
 
 def InDetAmbiScoringToolBaseCfg(flags, name='InDetAmbiScoringTool', **kwargs) :
     acc = ComponentAccumulator()
-    TrackingFlags = kwargs.pop("TrackingFlags")
 
     from  InDetConfig.InDetRecToolConfig import InDetExtrapolatorCfg
     tmpAcc =  InDetExtrapolatorCfg(flags)
@@ -1275,7 +1274,7 @@ def InDetAmbiScoringToolBaseCfg(flags, name='InDetAmbiScoringTool', **kwargs) :
     InDetTrackSummaryTool = acc.popToolsAndMerge(InDetTrackSummaryToolCfg(flags))
     acc.addPublicTool(InDetTrackSummaryTool)
 
-    InDetTRTDriftCircleCutForPatternReco = InDetTRTDriftCircleCutForPatternRecoCfg(flags, TrackingFlags=TrackingFlags)
+    InDetTRTDriftCircleCutForPatternReco = InDetTRTDriftCircleCutForPatternRecoCfg(flags)
     acc.addPublicTool(InDetTRTDriftCircleCutForPatternReco)
 
     from AthenaCommon.DetFlags  import DetFlags
@@ -1287,23 +1286,23 @@ def InDetAmbiScoringToolBaseCfg(flags, name='InDetAmbiScoringTool', **kwargs) :
     kwargs.setdefault("DriftCircleCutTool", InDetTRTDriftCircleCutForPatternReco )
     kwargs.setdefault("useAmbigFcn", True )
     kwargs.setdefault("useTRT_AmbigFcn", False )
-    kwargs.setdefault("maxZImp", TrackingFlags.maxZImpact )
-    kwargs.setdefault("maxEta", TrackingFlags.maxEta )
-    kwargs.setdefault("usePixel", TrackingFlags.usePixel )
-    kwargs.setdefault("useSCT", TrackingFlags.useSCT )
+    kwargs.setdefault("maxZImp", flags.InDet.Tracking.maxZImpact )
+    kwargs.setdefault("maxEta", flags.InDet.Tracking.maxEta )
+    kwargs.setdefault("usePixel", flags.InDet.Tracking.usePixel )
+    kwargs.setdefault("useSCT", flags.InDet.Tracking.useSCT )
     kwargs.setdefault("doEmCaloSeed", have_calo_rois )
     acc.setPrivateTools(CompFactory.InDet.InDetAmbiScoringTool(name = name, **kwargs))
     return acc
 
 def InDetCosmicsScoringToolBaseCfg(flags, name='InDetCosmicsScoringTool', **kwargs) :
     acc = ComponentAccumulator()
-    TrackingFlags = kwargs.pop("TrackingFlags")
+    flags.InDet.Tracking = kwargs.pop("flags.InDet.Tracking")
     the_name=makeName(name, kwargs)
 
     InDetTrackSummaryTool = acc.popToolsAndMerge(InDetTrackSummaryToolCfg(flags))
     acc.setPrivateTools(InDetTrackSummaryTool)
 
-    kwargs.setdefault("nWeightedClustersMin", TrackingFlags.nWeightedClustersMin )
+    kwargs.setdefault("nWeightedClustersMin", flags.InDet.Tracking.nWeightedClustersMin )
     kwargs.setdefault("minTRTHits", 0 )
     kwargs.setdefault("SummaryTool", InDetTrackSummaryTool )
 
@@ -1322,11 +1321,11 @@ def InDetTRT_ExtensionToolPhaseCfg(flags, name='InDetTRT_ExtensionToolPhase', **
     acc.setPrivateTools(acc.popToolsAndMerge(InDetTRT_ExtensionToolCosmicsCfg(flags, name = name, **kwargs)))
     return acc
 
-def InDetCosmicExtenScoringToolCfg(flags, TrackingFlags, name='InDetCosmicExtenScoringTool',**kwargs) :
+def InDetCosmicExtenScoringToolCfg(flags, name='InDetCosmicExtenScoringTool',**kwargs) :
     acc = ComponentAccumulator()
-    kwargs.setdefault("TrackingFlags", TrackingFlags)
+    kwargs.setdefault("flags.InDet.Tracking", flags.InDet.Tracking)
     kwargs.setdefault("nWeightedClustersMin", 0)
-    kwargs.setdefault("minTRTHits", TrackingFlags.minTRTonTrk )
+    kwargs.setdefault("minTRTHits", flags.InDet.Tracking.minTRTonTrk )
     acc.setPrivateTools(acc.popToolsAndMerge(InDetCosmicsScoringToolBaseCfg(flags, name = 'InDetCosmicExtenScoringTool', **kwargs)))
     return acc
 
@@ -1359,34 +1358,32 @@ def SiCombinatorialTrackFinder_xkCfg(flags, name='InDetSiComTrackFinder', **kwar
     acc.setPrivateTools(InDetSiComTrackFinder)
     return acc
 
-def InDetCosmicScoringTool_TRTCfg(flags, TrackingFlags, name='InDetCosmicExtenScoringTool',**kwargs) :
+def InDetCosmicScoringTool_TRTCfg(flags, name='InDetCosmicExtenScoringTool',**kwargs) :
     acc = ComponentAccumulator()
     InDetTrackSummaryToolNoHoleSearch = acc.popToolsAndMerge(InDetTrackSummaryToolNoHoleSearchCfg(flags))
     acc.addPublicTool(InDetTrackSummaryToolNoHoleSearch)
 
-    kwargs.setdefault("minTRTHits", TrackingFlags.minSecondaryTRTonTrk)
+    kwargs.setdefault("minTRTHits", flags.InDet.Tracking.minSecondaryTRTonTrk)
     kwargs.setdefault("SummaryTool", InDetTrackSummaryToolNoHoleSearch)
 
     acc.setPrivateTools(acc.popToolsAndMerge(InDetCosmicExtenScoringToolCfg(flags,
-                                                                            TrackingFlags=TrackingFlags,
                                                                             name = 'InDetCosmicScoringTool_TRT', **kwargs)))
     return acc
 
-def InDetTRT_SeededScoringToolCfg(flags, name='InDetTRT_SeededScoringTool', TrackingFlags=None, **kwargs) :
+def InDetTRT_SeededScoringToolCfg(flags, name='InDetTRT_SeededScoringTool', **kwargs) :
     acc = ComponentAccumulator()
 
-    kwargs.setdefault("TrackingFlags",  TrackingFlags)
     kwargs.setdefault("useAmbigFcn",  not flags.InDet.doNewTracking) # full search => use NewT
     kwargs.setdefault("useTRT_AmbigFcn",  flags.InDet.doNewTracking) # full search => use NewT
-    kwargs.setdefault("minTRTonTrk",  TrackingFlags.minSecondaryTRTonTrk)
-    kwargs.setdefault("minTRTPrecisionFraction",  TrackingFlags.minSecondaryTRTPrecFrac)
-    kwargs.setdefault("minPt",  TrackingFlags.minSecondaryPt)
-    kwargs.setdefault("maxRPhiImp",  TrackingFlags.maxSecondaryImpact)
-    kwargs.setdefault("minSiClusters",  TrackingFlags.minSecondaryClusters)
-    kwargs.setdefault("maxSiHoles",  TrackingFlags.maxSecondaryHoles)
-    kwargs.setdefault("maxPixelHoles",  TrackingFlags.maxSecondaryPixelHoles)
-    kwargs.setdefault("maxSCTHoles",  TrackingFlags.maxSecondarySCTHoles)
-    kwargs.setdefault("maxDoubleHoles",  TrackingFlags.maxSecondaryDoubleHoles)
+    kwargs.setdefault("minTRTonTrk",  flags.InDet.Tracking.minSecondaryTRTonTrk)
+    kwargs.setdefault("minTRTPrecisionFraction",  flags.InDet.Tracking.minSecondaryTRTPrecFrac)
+    kwargs.setdefault("minPt",  flags.InDet.Tracking.minSecondaryPt)
+    kwargs.setdefault("maxRPhiImp",  flags.InDet.Tracking.maxSecondaryImpact)
+    kwargs.setdefault("minSiClusters",  flags.InDet.Tracking.minSecondaryClusters)
+    kwargs.setdefault("maxSiHoles",  flags.InDet.Tracking.maxSecondaryHoles)
+    kwargs.setdefault("maxPixelHoles",  flags.InDet.Tracking.maxSecondaryPixelHoles)
+    kwargs.setdefault("maxSCTHoles",  flags.InDet.Tracking.maxSecondarySCTHoles)
+    kwargs.setdefault("maxDoubleHoles",  flags.InDet.Tracking.maxSecondaryDoubleHoles)
 
     acc.setPrivateTools(acc.popToolsAndMerge(InDetAmbiScoringToolBaseCfg(flags, name=name, **kwargs)))
     return acc
@@ -1395,31 +1392,31 @@ def InDetTRT_SeededScoringToolCfg(flags, name='InDetTRT_SeededScoringTool', Trac
 #TRTExtension
 #########################################################################################################
 
-def InDetAmbiScoringToolCfg(flags, name='InDetAmbiScoringTool', TrackingFlags=None, **kwargs) :
+def InDetAmbiScoringToolCfg(flags, name='InDetAmbiScoringTool', **kwargs) :
     acc = ComponentAccumulator()
-    kwargs.setdefault("TrackingFlags", TrackingFlags )
+    kwargs.setdefault("flags.InDet.Tracking", flags.InDet.Tracking )
     kwargs.setdefault("useAmbigFcn", True )
     kwargs.setdefault("useTRT_AmbigFcn", False )
     kwargs.setdefault("minTRTonTrk", 0 )
     kwargs.setdefault("minTRTPrecisionFraction", 0 )
-    kwargs.setdefault("minPt", TrackingFlags.minPT )
-    kwargs.setdefault("maxRPhiImp", TrackingFlags.maxPrimaryImpact )
-    kwargs.setdefault("minSiClusters", TrackingFlags.minClusters )
-    kwargs.setdefault("minPixel", TrackingFlags.minPixel )
-    kwargs.setdefault("maxSiHoles", TrackingFlags.maxHoles )
-    kwargs.setdefault("maxPixelHoles", TrackingFlags.maxPixelHoles )
-    kwargs.setdefault("maxSCTHoles", TrackingFlags.maxSctHoles )
-    kwargs.setdefault("maxDoubleHoles", TrackingFlags.maxDoubleHoles )
-    acc.setPrivateTools(acc.popToolsAndMerge(InDetAmbiScoringToolBaseCfg(flags, name = name + TrackingFlags.extension, **kwargs )))
+    kwargs.setdefault("minPt", flags.InDet.Tracking.minPT )
+    kwargs.setdefault("maxRPhiImp", flags.InDet.Tracking.maxPrimaryImpact )
+    kwargs.setdefault("minSiClusters", flags.InDet.Tracking.minClusters )
+    kwargs.setdefault("minPixel", flags.InDet.Tracking.minPixel )
+    kwargs.setdefault("maxSiHoles", flags.InDet.Tracking.maxHoles )
+    kwargs.setdefault("maxPixelHoles", flags.InDet.Tracking.maxPixelHoles )
+    kwargs.setdefault("maxSCTHoles", flags.InDet.Tracking.maxSctHoles )
+    kwargs.setdefault("maxDoubleHoles", flags.InDet.Tracking.maxDoubleHoles )
+    acc.setPrivateTools(acc.popToolsAndMerge(InDetAmbiScoringToolBaseCfg(flags, name = name + flags.InDet.Tracking.extension, **kwargs )))
     return acc
 
-def InDetExtenScoringToolCfg(flags, TrackingFlags, name='InDetExtenScoringTool', **kwargs) :
+def InDetExtenScoringToolCfg(flags, name='InDetExtenScoringTool', **kwargs) :
     acc = ComponentAccumulator()
     if flags.InDet.trackFitterType in ['KalmanFitter', 'KalmanDNAFitter', 'ReferenceKalmanFitter']:
         kwargs.setdefault("minTRTPrecisionFraction", 0.2)
-    kwargs.setdefault("minTRTonTrk", TrackingFlags.minTRTonTrk)
-    kwargs.setdefault("minTRTPrecisionFraction", TrackingFlags.minTRTPrecFrac)
-    acc.setPrivateTools(acc.popToolsAndMerge(InDetAmbiScoringToolCfg(flags, name = name, TrackingFlags = TrackingFlags,  **kwargs)))
+    kwargs.setdefault("minTRTonTrk", flags.InDet.Tracking.minTRTonTrk)
+    kwargs.setdefault("minTRTPrecisionFraction", flags.InDet.Tracking.minTRTPrecFrac)
+    acc.setPrivateTools(acc.popToolsAndMerge(InDetAmbiScoringToolCfg(flags, name = name,  **kwargs)))
     return acc
 
 #############################################################################################
@@ -1458,7 +1455,6 @@ def PRDtoTrackMapToolCfg(name='PRDtoTrackMapTool',**kwargs) :
 
 def InDetNNScoringToolBaseCfg(flags, name='InDetNNScoringTool', **kwargs) :
     acc = ComponentAccumulator()
-    TrackingFlags = kwargs.pop("TrackingFlags")
     the_name=makeName(name,kwargs)
 
     from AthenaCommon.DetFlags  import DetFlags
@@ -1475,7 +1471,7 @@ def InDetNNScoringToolBaseCfg(flags, name='InDetNNScoringTool', **kwargs) :
     InDetTrackSummaryTool = acc.popToolsAndMerge(InDetTrackSummaryToolCfg(flags))
     acc.addPublicTool(InDetTrackSummaryTool)
 
-    InDetTRTDriftCircleCutForPatternReco = InDetTRTDriftCircleCutForPatternRecoCfg(flags, TrackingFlags=TrackingFlags)
+    InDetTRTDriftCircleCutForPatternReco = InDetTRTDriftCircleCutForPatternRecoCfg(flags)
     acc.addPublicTool(InDetTRTDriftCircleCutForPatternReco)
 
     kwargs.setdefault("nnCutConfig", "dev/TrackingCP/LRTAmbiNetwork/20200727_225401/nn-config.json" )
@@ -1485,33 +1481,32 @@ def InDetNNScoringToolBaseCfg(flags, name='InDetNNScoringTool', **kwargs) :
     kwargs.setdefault("DriftCircleCutTool", InDetTRTDriftCircleCutForPatternReco )
     kwargs.setdefault("useAmbigFcn", True )
     kwargs.setdefault("useTRT_AmbigFcn", False )
-    kwargs.setdefault("maxZImp", TrackingFlags.maxZImpact )
-    kwargs.setdefault("maxEta", TrackingFlags.maxEta )
-    kwargs.setdefault("usePixel", TrackingFlags.usePixel )
-    kwargs.setdefault("useSCT", TrackingFlags.useSCT )
+    kwargs.setdefault("maxZImp", flags.InDet.Tracking.maxZImpact )
+    kwargs.setdefault("maxEta", flags.InDet.Tracking.maxEta )
+    kwargs.setdefault("usePixel", flags.InDet.Tracking.usePixel )
+    kwargs.setdefault("useSCT", flags.InDet.Tracking.useSCT )
     kwargs.setdefault("doEmCaloSeed", have_calo_rois )
 
     acc.setPrivateTools(CompFactory.InDet.InDetNNScoringTool(name = the_name, **kwargs ))
     return acc
 
-def InDetNNScoringToolCfg(flags, TrackingFlags, name='InDetNNScoringTool', **kwargs) :
-    kwargs.setdefault("TrackingFlags", TrackingFlags )
+def InDetNNScoringToolCfg(flags, name='InDetNNScoringTool', **kwargs) :
+    kwargs.setdefault("flags.InDet.Tracking", flags.InDet.Tracking )
     kwargs.setdefault("useAmbigFcn", True )
     kwargs.setdefault("useTRT_AmbigFcn", False )
     kwargs.setdefault("minTRTonTrk", 0 )
     kwargs.setdefault("minTRTPrecisionFraction", 0 )
-    kwargs.setdefault("minPt", TrackingFlags.minPT )
-    kwargs.setdefault("maxRPhiImp", TrackingFlags.maxPrimaryImpact )
-    kwargs.setdefault("minSiClusters", TrackingFlags.minClusters )
-    kwargs.setdefault("minPixel", TrackingFlags.minPixel )
-    kwargs.setdefault("maxSiHoles", TrackingFlags.maxHoles )
-    kwargs.setdefault("maxPixelHoles", TrackingFlags.maxPixelHoles )
-    kwargs.setdefault("maxSCTHoles", TrackingFlags.maxSctHoles )
-    kwargs.setdefault("maxDoubleHoles", TrackingFlags.maxDoubleHoles)
-
-    return InDetNNScoringToolBaseCfg(flags, name=name+TrackingFlags.extension, **kwargs )
-
-def InDetCosmicsScoringToolCfg(flags, TrackingFlags, name='InDetCosmicsScoringTool', **kwargs) :
+    kwargs.setdefault("minPt", flags.InDet.Tracking.minPT )
+    kwargs.setdefault("maxRPhiImp", flags.InDet.Tracking.maxPrimaryImpact )
+    kwargs.setdefault("minSiClusters", flags.InDet.Tracking.minClusters )
+    kwargs.setdefault("minPixel", flags.InDet.Tracking.minPixel )
+    kwargs.setdefault("maxSiHoles", flags.InDet.Tracking.maxHoles )
+    kwargs.setdefault("maxPixelHoles", flags.InDet.Tracking.maxPixelHoles )
+    kwargs.setdefault("maxSCTHoles", flags.InDet.Tracking.maxSctHoles )
+    kwargs.setdefault("maxDoubleHoles", flags.InDet.Tracking.maxDoubleHoles)
+
+    return InDetNNScoringToolBaseCfg(flags, name=name+flags.InDet.Tracking.extension, **kwargs )
+
+def InDetCosmicsScoringToolCfg(flags, name='InDetCosmicsScoringTool', **kwargs) :
     return InDetCosmicsScoringToolBaseCfg(flags,
-                                          name=name+TrackingFlags.extension,
-                                          TrackingFlags=TrackingFlags)
+                                          name=name+flags.InDet.Tracking.extension)
-- 
GitLab


From 9bbeb891bcfe050557ace768e7f0faa2243f2606 Mon Sep 17 00:00:00 2001
From: Nils Erik Krumnack <nils.erik.krumnack@cern.ch>
Date: Mon, 14 Dec 2020 15:31:03 +0000
Subject: [PATCH 022/225] Merge branch '21.2' into '21.2'

Support more generator setups

See merge request atlas/athena!38979

(cherry picked from commit 6a59741feff455ba277afbdecdfa9babadbf8b0f)

2ed23ff7 Support more generator setups
d932ee14 store the m_doRadHighNoVar3c in a new folder
0a606025 Change + between booleans to &&
0ee29e1d Fix incorrect c++ syntax
f2e1849b Fix compilation warning since the variable was only valid in the if condition
64f63c3f new pointer for the new type of histograms
4a37f833 Fix typo scaleWeights -> scaleWeight
40acfd3a Merge branch '21.2' of https://gitlab.cern.ch:8443/meevans/athena into 21.2
e791c8ff Add m_hists*NoVar3c to header
---
 .../Root/JetFlavorPlots.cxx                   | 71 ++++++++++++++-----
 .../TopEventSelectionTools/JetFlavorPlots.h   |  6 ++
 2 files changed, 59 insertions(+), 18 deletions(-)

diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopEventSelectionTools/Root/JetFlavorPlots.cxx b/PhysicsAnalysis/TopPhys/xAOD/TopEventSelectionTools/Root/JetFlavorPlots.cxx
index bd156abbb52f..9e12ebdc80b9 100644
--- a/PhysicsAnalysis/TopPhys/xAOD/TopEventSelectionTools/Root/JetFlavorPlots.cxx
+++ b/PhysicsAnalysis/TopPhys/xAOD/TopEventSelectionTools/Root/JetFlavorPlots.cxx
@@ -34,6 +34,8 @@ namespace top {
     m_doNominal(false),
     m_doRadHigh(false),
     m_doRadLow(false),
+    m_doRadHighNoVar3c(false),
+    m_doRadLowNoVar3c(false),
     // default pT and eta binning, and default max number of Jets
     m_ptBins("15:20:30:45:60:80:110:160:210:260:310:400:500:600:800:1000:1200:1500:1800:2500"),
     m_etaBins("0.:0.3:0.8:1.2:2.1:2.8:3.6:4.5"),
@@ -73,25 +75,30 @@ namespace top {
                s == "radiationHigh") m_doRadHigh = true;
       else if (s == "radiationlow" || s == "RADIATIONLOW" || s == "RadiationLow" ||
                s == "radiationLow") m_doRadLow = true;
+      else if (s == "radiationhighnovar3c" || s == "RADIATIONHIGHNOVAR3C" || s == "RadiationHighNoVar3c" ||
+               s == "radiationHighNoVar3c") m_doRadHighNoVar3c = true;
+      else if (s == "radiationlownovar3c" || s == "RADIATIONLOWNOVAR3C" || s == "RadiationLowNoVar3c" ||
+               s == "radiationLowNoVar3c") m_doRadLowNoVar3c = true;
       else {
         throw std::runtime_error("ERROR: Can't understand argument " + s + "For JETFLAVORPLOTS");
       }
     }
     //If neither nominal or radiation has been selected, assume it's nominal
-    if ((m_doNominal + m_doRadHigh + m_doRadLow) == false) m_doNominal = true;
+    if ((m_doNominal && m_doRadHigh && m_doRadLow && m_doRadHighNoVar3c && m_doRadLowNoVar3c) == false) m_doNominal = true;
     // create the JetFlavorPlots and JetFlavorPlots_Loose directories only if needed
     if (m_config->doTightEvents()) {
       if (m_doNominal) m_hists = std::make_shared<PlotManager>(name + "/JetFlavorPlots", outputFile, wk);
-      if (m_doRadHigh) m_hists_RadHigh =
-          std::make_shared<PlotManager>(name + "/JetFlavorPlots_RadHigh", outputFile, wk);
+      if (m_doRadHigh) m_hists_RadHigh = std::make_shared<PlotManager>(name + "/JetFlavorPlots_RadHigh", outputFile, wk);
       if (m_doRadLow) m_hists_RadLow = std::make_shared<PlotManager>(name + "/JetFlavorPlots_RadLow", outputFile, wk);
+      if (m_doRadHighNoVar3c) m_hists_RadHighNoVar3c = std::make_shared<PlotManager>(name + "/JetFlavorPlots_RadHighNoVar3c", outputFile, wk);
+      if (m_doRadLowNoVar3c) m_hists_RadLowNoVar3c = std::make_shared<PlotManager>(name + "/JetFlavorPlots_RadLowNoVar3c", outputFile, wk);
     }
     if (m_config->doLooseEvents()) {
       if (m_doNominal) m_hists_Loose = std::make_shared<PlotManager>(name + "/JetFlavorPlots_Loose", outputFile, wk);
-      if (m_doRadHigh) m_hists_RadHigh_Loose = std::make_shared<PlotManager>(name + "/JetFlavorPlots_Loose_RadHigh",
-                                                                             outputFile, wk);
-      if (m_doRadLow) m_hists_RadLow_Loose = std::make_shared<PlotManager>(name + "/JetFlavorPlots_Loose_RadLow",
-                                                                           outputFile, wk);
+      if (m_doRadHigh) m_hists_RadHigh_Loose = std::make_shared<PlotManager>(name + "/JetFlavorPlots_Loose_RadHigh", outputFile, wk);
+      if (m_doRadLow) m_hists_RadLow_Loose = std::make_shared<PlotManager>(name + "/JetFlavorPlots_Loose_RadLow", outputFile, wk);
+      if (m_doRadHighNoVar3c) m_hists_RadHighNoVar3c_Loose = std::make_shared<PlotManager>(name + "/JetFlavorPlots_Loose_RadHighNoVar3c", outputFile, wk);
+      if (m_doRadLowNoVar3c) m_hists_RadLowNoVar3c_Loose = std::make_shared<PlotManager>(name + "/JetFlavorPlots_Loose_RadLowNoVar3c", outputFile, wk);
     }
     //handle binning
     std::vector<double> ptBinning;
@@ -111,11 +118,15 @@ namespace top {
       if (m_doNominal) BookHistograms(m_hists, ptBinning, etaBinning);
       if (m_doRadHigh) BookHistograms(m_hists_RadHigh, ptBinning, etaBinning);
       if (m_doRadLow) BookHistograms(m_hists_RadLow, ptBinning, etaBinning);
+      if (m_doRadHighNoVar3c) BookHistograms(m_hists_RadHighNoVar3c, ptBinning, etaBinning);
+      if (m_doRadLowNoVar3c) BookHistograms(m_hists_RadLowNoVar3c, ptBinning, etaBinning);
     }
     if (m_config->doLooseEvents()) {
       if (m_doNominal) BookHistograms(m_hists_Loose, ptBinning, etaBinning);
       if (m_doRadHigh) BookHistograms(m_hists_RadHigh_Loose, ptBinning, etaBinning);
       if (m_doRadLow) BookHistograms(m_hists_RadLow_Loose, ptBinning, etaBinning);
+      if (m_doRadHighNoVar3c) BookHistograms(m_hists_RadHighNoVar3c_Loose, ptBinning, etaBinning);
+      if (m_doRadLowNoVar3c) BookHistograms(m_hists_RadLowNoVar3c_Loose, ptBinning, etaBinning);
     }
   }
 
@@ -165,28 +176,52 @@ namespace top {
       if (event.m_isLoose) FillHistograms(m_hists_Loose, eventWeight, event);
       else FillHistograms(m_hists, eventWeight, event);
     }
-    if (m_doRadHigh) {
+    if (m_doRadHigh || m_doRadHighNoVar3c) {
       // 2 different names are acceptable
       double scaleWeight = 1.;
       if (m_PMGTruthWeights->hasWeight(" muR = 0.5, muF = 0.5 ")) scaleWeight = m_PMGTruthWeights->getWeight(" muR = 0.5, muF = 0.5 ");
       else if (m_PMGTruthWeights->hasWeight(" muR = 0.50, muF = 0.50 ")) scaleWeight = m_PMGTruthWeights->getWeight(" muR = 0.50, muF = 0.50 ");
+      else if (m_PMGTruthWeights->hasWeight("MUR0.5_MUF0.5_PDF261000")) scaleWeight = m_PMGTruthWeights->getWeight("MUR0.5_MUF0.5_PDF261000"); // for e.g. Sherpa Z+jets
+      else if (m_PMGTruthWeights->hasWeight(" muR=0.50000E+00 muF=0.50000E+00 ")) scaleWeight = m_PMGTruthWeights->getWeight(" muR=0.50000E+00 muF=0.50000E+00 "); // for e.g. ttZ DSID 410218
+      else if (m_PMGTruthWeights->hasWeight(" dyn=   0 muR=0.50000E+00 muF=0.50000E+00 ")) scaleWeight = m_PMGTruthWeights->getWeight(" dyn=   0 muR=0.50000E+00 muF=0.50000E+00 "); // for e.g. tWZ 412118
+      else if (m_PMGTruthWeights->hasWeight("1009")) scaleWeight = m_PMGTruthWeights->getWeight("1009"); // for e.g. tZ 412063
+      else if (m_PMGTruthWeights->hasWeight("muR=05,muF=05")) scaleWeight = m_PMGTruthWeights->getWeight("muR=05,muF=05"); // for some other generator setups
       else top::check(m_PMGTruthWeights->hasWeight(" muR = 0.5, muF = 0.5 "), "JetFlavorPlots::apply(): Weight \" muR = 0.5, muF = 0.5 \" not found. Please report this message!");
-      top::check(m_PMGTruthWeights->hasWeight("Var3cUp"), "JetFlavorPlots::apply(): Weight \"Var3cUp\" not found. Please report this message!");
-      double eventWeight = scaleWeight * m_PMGTruthWeights->getWeight("Var3cUp") / nominalWeight;
-      if (event.m_isLoose) FillHistograms(m_hists_RadHigh_Loose, eventWeight, event);
-      else FillHistograms(m_hists_RadHigh, eventWeight, event);
+      double eventWeight = scaleWeight;
+      if (!m_doRadHighNoVar3c) {
+        top::check(m_PMGTruthWeights->hasWeight("Var3cUp"), "JetFlavorPlots::apply(): Weight \"Var3cUp\" not found. Please report this message!");
+        eventWeight *= m_PMGTruthWeights->getWeight("Var3cUp") / nominalWeight;
+        if (event.m_isLoose) FillHistograms(m_hists_RadHigh_Loose, eventWeight, event);
+        else FillHistograms(m_hists_RadHigh, eventWeight, event);
+      } // finish if (!m_doRadHighNoVar3c) 
+      else { // m_doRadHighVar3c is true
+        if (event.m_isLoose) FillHistograms(m_hists_RadHighNoVar3c_Loose, eventWeight, event);
+        else FillHistograms(m_hists_RadHighNoVar3c, eventWeight, event);
+      } // finish else 
     }
-    if (m_doRadLow) {
+    if (m_doRadLow || m_doRadLowNoVar3c) {
       //2 different names are acceptable
       double scaleWeight = 1.;
       if (m_PMGTruthWeights->hasWeight(" muR = 2.0, muF = 2.0 ")) scaleWeight = m_PMGTruthWeights->getWeight(" muR = 2.0, muF = 2.0 ");
       else if (m_PMGTruthWeights->hasWeight(" muR = 2.00, muF = 2.00 ")) scaleWeight = m_PMGTruthWeights->getWeight(" muR = 2.00, muF = 2.00 ");
+      else if (m_PMGTruthWeights->hasWeight("MUR2_MUF2_PDF261000")) scaleWeight = m_PMGTruthWeights->getWeight("MUR2_MUF2_PDF261000"); // for e.g. Sherpa Z+jets
+      else if (m_PMGTruthWeights->hasWeight(" muR=0.20000E+01 muF=0.20000E+01 ")) scaleWeight = m_PMGTruthWeights->getWeight(" muR=0.20000E+01 muF=0.20000E+01 "); // for e.g. ttZ DSID 410218
+      else if (m_PMGTruthWeights->hasWeight(" dyn=   0 muR=0.20000E+01 muF=0.20000E+01 ")) scaleWeight = m_PMGTruthWeights->getWeight(" dyn=   0 muR=0.20000E+01 muF=0.20000E+01 "); // for e.g. tWZ 412118
+      else if (m_PMGTruthWeights->hasWeight("1005")) scaleWeight = m_PMGTruthWeights->getWeight("1005"); // for e.g. tZ 412063
+      else if (m_PMGTruthWeights->hasWeight("muR=20,muF=20")) scaleWeight = m_PMGTruthWeights->getWeight("muR=20,muF=20"); // for some other generator setups
       else top::check(m_PMGTruthWeights->hasWeight(" muR = 2.0, muF = 2.0 "), "JetFlavorPlots::apply(): Weight \" muR = 2.0, muF = 2.0 \" not found. Please report this message!");
-      top::check(m_PMGTruthWeights->hasWeight("Var3cUp"), "JetFlavorPlots::apply(): Weight \"Var3cUp\" not found. Please report this message!");
-      top::check(m_PMGTruthWeights->hasWeight("Var3cDown"), "JetFlavorPlots::apply(): Weight \"Var3cDown\" not found. Please report this message!");
-      double eventWeight = scaleWeight * m_PMGTruthWeights->getWeight("Var3cDown") / nominalWeight;
-      if (event.m_isLoose) FillHistograms(m_hists_RadLow_Loose, eventWeight, event);
-      else FillHistograms(m_hists_RadLow, eventWeight, event);
+      double eventWeight = scaleWeight;
+      if (!m_doRadLowNoVar3c) {
+        top::check(m_PMGTruthWeights->hasWeight("Var3cDown"), "JetFlavorPlots::apply(): Weight \"Var3cDown\" not found. Please report this message!");
+        eventWeight *= m_PMGTruthWeights->getWeight("Var3cDown") / nominalWeight;
+        if (event.m_isLoose) FillHistograms(m_hists_RadLow_Loose, eventWeight, event);
+        else FillHistograms(m_hists_RadLow, eventWeight, event);
+      } // finish if (!m_doRadLowNoVar3c) {
+      else { // m_doRadLowNoVar3c is true
+        if (event.m_isLoose) FillHistograms(m_hists_RadLowNoVar3c_Loose, eventWeight, event);
+        else FillHistograms(m_hists_RadLowNoVar3c, eventWeight, event);
+      } // finish else 
+      
     }
     return true;
   }
diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopEventSelectionTools/TopEventSelectionTools/JetFlavorPlots.h b/PhysicsAnalysis/TopPhys/xAOD/TopEventSelectionTools/TopEventSelectionTools/JetFlavorPlots.h
index 383a2547715e..2c29d5876940 100644
--- a/PhysicsAnalysis/TopPhys/xAOD/TopEventSelectionTools/TopEventSelectionTools/JetFlavorPlots.h
+++ b/PhysicsAnalysis/TopPhys/xAOD/TopEventSelectionTools/TopEventSelectionTools/JetFlavorPlots.h
@@ -67,6 +67,10 @@ namespace top {
     std::shared_ptr<PlotManager> m_hists_RadHigh_Loose = nullptr;
     std::shared_ptr<PlotManager> m_hists_RadLow = nullptr;
     std::shared_ptr<PlotManager> m_hists_RadLow_Loose = nullptr;
+    std::shared_ptr<PlotManager> m_hists_RadHighNoVar3c = nullptr;
+    std::shared_ptr<PlotManager> m_hists_RadHighNoVar3c_Loose = nullptr;
+    std::shared_ptr<PlotManager> m_hists_RadLowNoVar3c = nullptr;
+    std::shared_ptr<PlotManager> m_hists_RadLowNoVar3c_Loose = nullptr;
 
     // Nominal hash value
     std::size_t m_nominalHashValue;
@@ -78,6 +82,8 @@ namespace top {
     bool m_doNominal;
     bool m_doRadHigh;
     bool m_doRadLow;
+    bool m_doRadHighNoVar3c; // doRadHigh but don't take Var3c into account
+    bool m_doRadLowNoVar3c; // doRadLow but don't take Var3c into account
 
     // pT and eta bin edges, separated by colons
     std::string m_ptBins;
-- 
GitLab


From 2d4c23dbae09c6fd3e0e5dcce536c08ceb922e69 Mon Sep 17 00:00:00 2001
From: Nils Erik Krumnack <nils.erik.krumnack@cern.ch>
Date: Mon, 14 Dec 2020 15:29:52 +0000
Subject: [PATCH 023/225] Merge branch 'LM_21.2_FTagCDI_Dec2020' into '21.2'

Updated ATLAS FTag recommendations for release 21: December 2020 CDI

See merge request atlas/athena!38884

(cherry picked from commit 247766190604f5ddc6fd9e9f960843f2f6728dc8)

6f8da5d9 Changed the CDI file to the new December 2020 release and switched on VR track jets SFs
---
 .../TopPhys/xAOD/TopCPTools/Root/TopFlavorTaggingCPTools.cxx  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopCPTools/Root/TopFlavorTaggingCPTools.cxx b/PhysicsAnalysis/TopPhys/xAOD/TopCPTools/Root/TopFlavorTaggingCPTools.cxx
index 5619ff6cd054..d11a483076c3 100644
--- a/PhysicsAnalysis/TopPhys/xAOD/TopCPTools/Root/TopFlavorTaggingCPTools.cxx
+++ b/PhysicsAnalysis/TopPhys/xAOD/TopCPTools/Root/TopFlavorTaggingCPTools.cxx
@@ -40,7 +40,7 @@ namespace top {
     }
 
     static const std::string cdi_file_default =
-      "xAODBTaggingEfficiency/13TeV/2020-21-13TeV-MC16-CDI-2020-03-11_Sh228_v3.root";
+      "xAODBTaggingEfficiency/13TeV/2020-21-13TeV-MC16-CDI-2020-12-02_v2.root";
 
     m_tagger = ""; // Extract in the loop
     if (m_config->bTaggingCDIPath() != "Default") {
@@ -85,7 +85,7 @@ namespace top {
     // Calibrated and uncalibrated working points for VR track jets for all algorithms
     top::check(setTaggerWorkingPoints("AntiKtVR30Rmax4Rmin02TrackJets", true, "MV2c10", {"FixedCutBEff_60", "FixedCutBEff_70", "FixedCutBEff_77", "FixedCutBEff_85", "Continuous"}), "Error setting AntiKtVR30Rmax4Rmin02TrackJets WP");
     top::check(setTaggerWorkingPoints("AntiKtVR30Rmax4Rmin02TrackJets", true, "DL1", {"FixedCutBEff_60", "FixedCutBEff_70", "FixedCutBEff_77", "FixedCutBEff_85", "Continuous"}), "Error setting AntiKtVR30Rmax4Rmin02TrackJets WP");
-    top::check(setTaggerWorkingPoints("AntiKtVR30Rmax4Rmin02TrackJets", false, "DL1r", {"FixedCutBEff_60", "FixedCutBEff_70", "FixedCutBEff_77", "FixedCutBEff_85", "Continuous"}), "Error setting AntiKtVR30Rmax4Rmin02TrackJets WP");
+    top::check(setTaggerWorkingPoints("AntiKtVR30Rmax4Rmin02TrackJets", true, "DL1r", {"FixedCutBEff_60", "FixedCutBEff_70", "FixedCutBEff_77", "FixedCutBEff_85", "Continuous"}), "Error setting AntiKtVR30Rmax4Rmin02TrackJets WP");
     top::check(setTaggerWorkingPoints("AntiKtVR30Rmax4Rmin02TrackJets", false, "DL1rmu", {"FixedCutBEff_60", "FixedCutBEff_70", "FixedCutBEff_77", "FixedCutBEff_85", "Continuous"}), "Error setting AntiKtVR30Rmax4Rmin02TrackJets WP");
 
 
-- 
GitLab


From b124ca3e7fadcb558162ba2c9c23072a32201116 Mon Sep 17 00:00:00 2001
From: christos <christos@cern.ch>
Date: Tue, 15 Dec 2020 10:28:01 +0100
Subject: [PATCH 024/225] egammaValidation : increase the timeout (due to
 timing out in dbg builds)

---
 Reconstruction/egamma/egammaValidation/CMakeLists.txt     | 2 +-
 .../egamma/egammaValidation/python/egammaOnlyPreExec.py   | 8 ++++++--
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/Reconstruction/egamma/egammaValidation/CMakeLists.txt b/Reconstruction/egamma/egammaValidation/CMakeLists.txt
index a47daabbec5f..6f704d797d16 100644
--- a/Reconstruction/egamma/egammaValidation/CMakeLists.txt
+++ b/Reconstruction/egamma/egammaValidation/CMakeLists.txt
@@ -19,5 +19,5 @@ atlas_install_scripts( test/*.sh scripts/*py )
 
 atlas_add_test( ut_egammaARTJob_test
 	        SCRIPT test/ut_egammaARTJob_test.sh
-		PROPERTIES TIMEOUT 1000
+		PROPERTIES TIMEOUT 1200
 )
diff --git a/Reconstruction/egamma/egammaValidation/python/egammaOnlyPreExec.py b/Reconstruction/egamma/egammaValidation/python/egammaOnlyPreExec.py
index a30d147a65a5..bd245f4a87d5 100644
--- a/Reconstruction/egamma/egammaValidation/python/egammaOnlyPreExec.py
+++ b/Reconstruction/egamma/egammaValidation/python/egammaOnlyPreExec.py
@@ -1,8 +1,8 @@
 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-from ParticleBuilderOptions.AODFlags import AODFlags
-from RecExConfig.RecAlgsFlags import recAlgs
 from RecExConfig.RecFlags import rec
+from RecExConfig.RecAlgsFlags import recAlgs
+from ParticleBuilderOptions.AODFlags import AODFlags
 from JetRec.JetRecFlags import jetFlags
 
 
@@ -11,16 +11,20 @@ def setRunEgammaOnlyRecoFlags():
     rec.doTau.set_Value_and_Lock(False)
     rec.doMuon.set_Value_and_Lock(False)
     rec.doBTagging.set_Value_and_Lock(False)
+    rec.doCaloRinger.set_Value_and_Lock(False)
+
     recAlgs.doMuonSpShower.set_Value_and_Lock(False)
     recAlgs.doEFlow.set_Value_and_Lock(False)
     recAlgs.doEFlowJet.set_Value_and_Lock(False)
     recAlgs.doMissingET.set_Value_and_Lock(False)
     recAlgs.doMissingETSig.set_Value_and_Lock(False)
     recAlgs.doTrigger.set_Value_and_Lock(False)
+
     AODFlags.ThinGeantTruth.set_Value_and_Lock(False)
     AODFlags.egammaTrackSlimmer.set_Value_and_Lock(False)
     AODFlags.ThinInDetForwardTrackParticles.set_Value_and_Lock(False)
     AODFlags.ThinNegativeEnergyNeutralPFOs.set_Value_and_Lock(False)
+
     jetFlags.Enabled = False
 
 
-- 
GitLab


From 0206863783c697b9593251cac29d9feff84b265a Mon Sep 17 00:00:00 2001
From: Tomas Dado <tomas.dado@cern.ch>
Date: Tue, 15 Dec 2020 10:51:10 +0100
Subject: [PATCH 025/225] AnalysisTop: Fixing issue with AtomicConstAccessor

---
 .../TopPhys/xAOD/TopAnalysis/Root/EventSaverFlatNtuple.cxx    | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/EventSaverFlatNtuple.cxx b/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/EventSaverFlatNtuple.cxx
index 604e408b09cc..6ed286fe5a70 100644
--- a/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/EventSaverFlatNtuple.cxx
+++ b/PhysicsAnalysis/TopPhys/xAOD/TopAnalysis/Root/EventSaverFlatNtuple.cxx
@@ -12,6 +12,7 @@
 #include "xAODMissingET/MissingETContainer.h"
 #include "xAODBTagging/BTaggingUtilities.h"
 
+#include "AthContainers/tools/AtomicConstAccessor.h"
 #include "AthContainers/AuxTypeRegistry.h"
 
 #include "TFile.h"
@@ -2209,7 +2210,8 @@ namespace top {
 
     // (non-collision-)background flags
     m_backgroundFlags = 0;
-    if (event.m_info->isAvailable<unsigned int>("backgroundFlags")) m_backgroundFlags = event.m_info->auxdataConst<unsigned int>("backgroundFlags");
+    static const SG::AtomicConstAccessor<unsigned int> bkgFlagsAcc("backgroundFlags");
+    if (bkgFlagsAcc.isAvailable(*(event.m_info))) m_backgroundFlags = bkgFlagsAcc(*(event.m_info));
 
     // hasBadMuon flag
     m_hasBadMuon = 0;
-- 
GitLab


From 35a1509b2de8798200e28e22818380975904dff6 Mon Sep 17 00:00:00 2001
From: Maximilian Goblirsch-Kolb <goblirsc@cern.ch>
Date: Tue, 15 Dec 2020 11:38:56 +0100
Subject: [PATCH 026/225] Modify IDPVM efficiency histo ranges, add extra

---
 .../share/InDetPVMPlotDefCommon.xml            | 18 +++++++++++++++---
 .../src/InDetPerfPlot_Efficiency.cxx           | 11 ++++++++++-
 .../src/InDetPerfPlot_Efficiency.h             |  3 +++
 3 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/InnerDetector/InDetValidation/InDetPhysValMonitoring/share/InDetPVMPlotDefCommon.xml b/InnerDetector/InDetValidation/InDetPhysValMonitoring/share/InDetPVMPlotDefCommon.xml
index 8a3e04e69276..91db4d14cd2d 100644
--- a/InnerDetector/InDetValidation/InDetPhysValMonitoring/share/InDetPVMPlotDefCommon.xml
+++ b/InnerDetector/InDetValidation/InDetPhysValMonitoring/share/InDetPVMPlotDefCommon.xml
@@ -630,6 +630,10 @@
   <x title="p_{T} [GeV]" n="25" lo="0" hi="50"/>
   <y title="Efficiency" lo="0.0" hi="2.0"/>
 </h>
+<h id="efficiency_vs_pt_high" type="TEfficiency" title="Fraction of reco-matched truth track">
+  <x title="p_{T} [GeV]" n="29" lo="50" hi="1500"/>
+  <y title="Efficiency" lo="0.0" hi="2.0"/>
+</h>
 <h id="efficiency_vs_pt_low" type="TEfficiency" title="Fraction of reco-matched truth track">
   <x title="p_{T} [GeV]" n="52" lo="0.4" hi="3"/>
   <y title="Efficiency" lo="0.0" hi="2.0"/>
@@ -639,7 +643,7 @@
   <y title="Efficiency" lo="0.0" hi="2.0"/>
 </h>
 <h id="efficiency_vs_d0" type="TEfficiency" title="Fraction of reco-matched truth track">
-  <x title="d_{0} [mm]" n="100" lo="-25" hi="25"/>
+  <x title="d_{0} [mm]" n="80" lo="-10" hi="10"/>
   <y title="Efficiency" lo="0.0" hi="2.0"/>
 </h>
 <h id="efficiency_vs_z0" type="TEfficiency" title="Fraction of reco-matched truth track">
@@ -663,11 +667,19 @@
   <y title="Efficiency" lo="0.0" hi="2.0"/>
 </h>
 <h id="efficiency_vs_prodR" type="TEfficiency" title="Track Efficiency vs Production Vertex Radius">
-  <x title="prod_R [mm]" n="100" lo="0" hi="1500"/>
+  <x title="prod_R [mm]" n="65" lo="0" hi="650"/>
+  <y title="Efficiency" lo="0.0" hi="2.0"/>
+</h>
+<h id="efficiency_vs_prodR_extended" type="TEfficiency" title="Track Efficiency vs Production Vertex Radius">
+  <x title="prod_R [mm]" n="40" lo="0" hi="1200"/>
   <y title="Efficiency" lo="0.0" hi="2.0"/>
 </h>
 <h id="efficiency_vs_prodZ" type="TEfficiency" title="Track Efficiency vs Production Vertex Z">
-  <x title="prod_Z [mm]" n="100" lo="0" hi="2000"/>
+  <x title="prod_Z [mm]" n="50" lo="0" hi="300"/>
+  <y title="Efficiency" lo="0.0" hi="2.0"/>
+</h>
+<h id="efficiency_vs_prodZ_extended" type="TEfficiency" title="Track Efficiency vs Production Vertex Z">
+  <x title="prod_Z [mm]" n="40" lo="0" hi="1000"/>
   <y title="Efficiency" lo="0.0" hi="2.0"/>
 </h>
 <!-- Fake rate plots -->
diff --git a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_Efficiency.cxx b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_Efficiency.cxx
index e62298d7631a..66bed68a4bcf 100644
--- a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_Efficiency.cxx
+++ b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_Efficiency.cxx
@@ -15,6 +15,7 @@ InDetPerfPlot_Efficiency::InDetPerfPlot_Efficiency(InDetPlotBase* pParent, const
   m_efficiency_vs_eta{},
   m_efficiency_vs_pt{},
   m_efficiency_vs_pt_low{},
+  m_efficiency_vs_pt_high{},
   m_efficiency_vs_phi{},
   m_efficiency_vs_d0{},
   m_efficiency_vs_z0{},
@@ -23,7 +24,9 @@ InDetPerfPlot_Efficiency::InDetPerfPlot_Efficiency(InDetPlotBase* pParent, const
   m_extended_efficiency_vs_d0{},
   m_extended_efficiency_vs_z0{},
   m_efficiency_vs_prodR{},
-  m_efficiency_vs_prodZ{} {
+  m_efficiency_vs_prodR_extended{},
+  m_efficiency_vs_prodZ{},
+  m_efficiency_vs_prodZ_extended{} {
   // nop
 }
 
@@ -33,6 +36,7 @@ InDetPerfPlot_Efficiency::initializePlots() {
   book(m_efficiency_vs_eta, "efficiency_vs_eta");
   book(m_efficiency_vs_pt, "efficiency_vs_pt");
   book(m_efficiency_vs_pt_low, "efficiency_vs_pt_low");
+  book(m_efficiency_vs_pt_high, "efficiency_vs_pt_high");
   book(m_efficiency_vs_phi, "efficiency_vs_phi");
   book(m_efficiency_vs_d0, "efficiency_vs_d0");
   book(m_efficiency_vs_z0, "efficiency_vs_z0");
@@ -42,7 +46,9 @@ InDetPerfPlot_Efficiency::initializePlots() {
   book(m_extended_efficiency_vs_d0, "extended_efficiency_vs_d0");
   book(m_extended_efficiency_vs_z0, "extended_efficiency_vs_z0");
   book(m_efficiency_vs_prodR, "efficiency_vs_prodR");
+  book(m_efficiency_vs_prodR_extended, "efficiency_vs_prodR_extended");
   book(m_efficiency_vs_prodZ, "efficiency_vs_prodZ");
+  book(m_efficiency_vs_prodZ_extended, "efficiency_vs_prodZ_extended");
 
 }
 
@@ -55,6 +61,7 @@ InDetPerfPlot_Efficiency::fill(const xAOD::TruthParticle& truth, const bool isGo
   fillHisto(m_efficiency_vs_eta, eta, isGood);
   fillHisto(m_efficiency_vs_pt, pt, isGood);
   fillHisto(m_efficiency_vs_pt_low, pt, isGood);
+  fillHisto(m_efficiency_vs_pt_high, pt, isGood);
   fillHisto(m_efficiency_vs_phi, phi, isGood);
 
   double d0 = truth.auxdata<float>("d0");
@@ -73,7 +80,9 @@ InDetPerfPlot_Efficiency::fill(const xAOD::TruthParticle& truth, const bool isGo
     double prod_rad = vtx->perp();
     double prod_z = vtx->z();
     fillHisto(m_efficiency_vs_prodR, prod_rad, isGood);
+    fillHisto(m_efficiency_vs_prodR_extended, prod_rad, isGood);
     fillHisto(m_efficiency_vs_prodZ, prod_z, isGood);
+    fillHisto(m_efficiency_vs_prodZ_extended, prod_z, isGood);
   }
 }
 
diff --git a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_Efficiency.h b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_Efficiency.h
index e075aedf929f..b03ded92b8d4 100644
--- a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_Efficiency.h
+++ b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_Efficiency.h
@@ -34,6 +34,7 @@ private:
   TEfficiency* m_efficiency_vs_eta;
   TEfficiency* m_efficiency_vs_pt;
   TEfficiency* m_efficiency_vs_pt_low;
+  TEfficiency* m_efficiency_vs_pt_high;
   TEfficiency* m_efficiency_vs_phi;
   TEfficiency* m_efficiency_vs_d0;
   TEfficiency* m_efficiency_vs_z0;
@@ -43,7 +44,9 @@ private:
   TEfficiency* m_extended_efficiency_vs_d0;
   TEfficiency* m_extended_efficiency_vs_z0;
   TEfficiency* m_efficiency_vs_prodR;
+  TEfficiency* m_efficiency_vs_prodR_extended;
   TEfficiency* m_efficiency_vs_prodZ;
+  TEfficiency* m_efficiency_vs_prodZ_extended;
 
   // plot base has nop default implementation of this; we use it to book the histos
   void initializePlots();
-- 
GitLab


From 0387f61c2f8974f4b93940fa5025cf8224ec1e44 Mon Sep 17 00:00:00 2001
From: Peter Berta <peter.berta@cern.ch>
Date: Tue, 15 Dec 2020 12:24:22 +0100
Subject: [PATCH 027/225] updates for TCT tests; increased number of events for
 q221; decresed number of events fpr q431; increased number of threads and
 processes; increased number of events for the diff step

---
 Tools/Tier0ChainTests/test/test_q221.sh    | 4 ++--
 Tools/Tier0ChainTests/test/test_q221_mp.sh | 4 ++--
 Tools/Tier0ChainTests/test/test_q221_mt.sh | 4 ++--
 Tools/Tier0ChainTests/test/test_q431.sh    | 4 ++--
 Tools/Tier0ChainTests/test/test_q431_mp.sh | 4 ++--
 Tools/Tier0ChainTests/test/test_q431_mt.sh | 4 ++--
 6 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/Tools/Tier0ChainTests/test/test_q221.sh b/Tools/Tier0ChainTests/test/test_q221.sh
index e40936e53fb8..75bbcdd31b67 100755
--- a/Tools/Tier0ChainTests/test/test_q221.sh
+++ b/Tools/Tier0ChainTests/test/test_q221.sh
@@ -8,7 +8,7 @@
 # art-include: 21.3/Athena
 # art-include: 21.9/Athena
 
-Reco_tf.py --AMI=q221 --outputRDOFile=myRDO.pool.root --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --imf False  --preExec="all:from IOVDbSvc.CondDB import conddb; conddb.addOverride('/PIXEL/PixMapOverlay','PixMapOverlay-SIM-MC16-000-03');"
+Reco_tf.py --AMI=q221 --outputRDOFile=myRDO.pool.root --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --imf False  --preExec="all:from IOVDbSvc.CondDB import conddb; conddb.addOverride('/PIXEL/PixMapOverlay','PixMapOverlay-SIM-MC16-000-03');" --maxEvents=100
 echo "art-result: $? Reco"
 
 Reco_tf.py --validationFlags 'doExample,doMET,doPFlow,doTau,doEgamma,doBtag,doZee,doJet,doTopoCluster,doMuon,doTrigMinBias,doTrigIDtrk,doTrigBphys,doTrigMET,doTrigJet,doTrigTau, doTrigEgamma,doTrigMuon,doTrigBjet,doTrigHLTResult' --inputAODFile=myAOD.pool.root  --outputNTUP_PHYSVALFile=myNTUP_PHYSVAL.root
@@ -16,5 +16,5 @@ echo "art-result: $? PhysVal"
 
 ArtPackage=$1
 ArtJobName=$2
-art.py compare grid --entries 10 ${ArtPackage} ${ArtJobName}
+art.py compare grid --entries 30 ${ArtPackage} ${ArtJobName}
 echo "art-result: $? Diff"
diff --git a/Tools/Tier0ChainTests/test/test_q221_mp.sh b/Tools/Tier0ChainTests/test/test_q221_mp.sh
index 679fcf87c8f0..122492fbd014 100755
--- a/Tools/Tier0ChainTests/test/test_q221_mp.sh
+++ b/Tools/Tier0ChainTests/test/test_q221_mp.sh
@@ -8,7 +8,7 @@
 # art-include: 21.3/Athena
 # art-include: 21.9/Athena
 
-Reco_tf.py --AMI=q221 --athenaopts='--nprocs=2' --outputRDOFile=myRDO.pool.root --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --imf False  --preExec="all:from IOVDbSvc.CondDB import conddb; conddb.addOverride('/PIXEL/PixMapOverlay','PixMapOverlay-SIM-MC16-000-03');" 
+Reco_tf.py --AMI=q221 --athenaopts='--nprocs=8' --outputRDOFile=myRDO.pool.root --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --imf False  --preExec="all:from IOVDbSvc.CondDB import conddb; conddb.addOverride('/PIXEL/PixMapOverlay','PixMapOverlay-SIM-MC16-000-03');" --maxEvents=100
 echo "art-result: $? Reco"
 
 Reco_tf.py --validationFlags 'doExample,doMET,doPFlow,doTau,doEgamma,doBtag,doZee,doJet,doTopoCluster,doMuon,doTrigMinBias,doTrigIDtrk,doTrigBphys,doTrigMET,doTrigJet,doTrigTau, doTrigEgamma,doTrigMuon,doTrigBjet,doTrigHLTResult' --inputAODFile=myAOD.pool.root  --outputNTUP_PHYSVALFile=myNTUP_PHYSVAL.root
@@ -16,6 +16,6 @@ echo "art-result: $? PhysVal"
 
 ArtPackage=$1
 ArtJobName=$2
-art.py compare grid --entries 10 ${ArtPackage} ${ArtJobName}
+art.py compare grid --entries 30 ${ArtPackage} ${ArtJobName}
 echo "art-result: $? Diff"
 
diff --git a/Tools/Tier0ChainTests/test/test_q221_mt.sh b/Tools/Tier0ChainTests/test/test_q221_mt.sh
index 76b3d511b6da..9f4361c0af9b 100755
--- a/Tools/Tier0ChainTests/test/test_q221_mt.sh
+++ b/Tools/Tier0ChainTests/test/test_q221_mt.sh
@@ -8,7 +8,7 @@
 # art-include: 21.3/Athena
 # art-include: 21.9/Athena
 
-Reco_tf.py --AMI=q221 --athenaopts='--threads=1' --outputRDOFile=myRDO.pool.root --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --imf False  --preExec="all:from IOVDbSvc.CondDB import conddb; conddb.addOverride('/PIXEL/PixMapOverlay','PixMapOverlay-SIM-MC16-000-03');"
+Reco_tf.py --AMI=q221 --athenaopts='--threads=8' --outputRDOFile=myRDO.pool.root --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --imf False  --preExec="all:from IOVDbSvc.CondDB import conddb; conddb.addOverride('/PIXEL/PixMapOverlay','PixMapOverlay-SIM-MC16-000-03');" --maxEvents=100
 echo "art-result: $? Reco"
 
 Reco_tf.py --validationFlags 'doExample,doMET,doPFlow,doTau,doEgamma,doBtag,doZee,doJet,doTopoCluster,doMuon,doTrigMinBias,doTrigIDtrk,doTrigBphys,doTrigMET,doTrigJet,doTrigTau, doTrigEgamma,doTrigMuon,doTrigBjet,doTrigHLTResult' --inputAODFile=myAOD.pool.root  --outputNTUP_PHYSVALFile=myNTUP_PHYSVAL.root
@@ -16,5 +16,5 @@ echo "art-result: $? PhysVal"
 
 ArtPackage=$1
 ArtJobName=$2
-art.py compare grid --entries 10 ${ArtPackage} ${ArtJobName}
+art.py compare grid --entries 30 ${ArtPackage} ${ArtJobName}
 echo "art-result: $? Diff"
diff --git a/Tools/Tier0ChainTests/test/test_q431.sh b/Tools/Tier0ChainTests/test/test_q431.sh
index 47d12d3c523e..89e28b361c3d 100755
--- a/Tools/Tier0ChainTests/test/test_q431.sh
+++ b/Tools/Tier0ChainTests/test/test_q431.sh
@@ -8,10 +8,10 @@
 # art-include: 21.3/Athena
 # art-include: 21.9/Athena
 
-Reco_tf.py --AMI=q431 --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --imf False --maxEvents=1000
+Reco_tf.py --AMI=q431 --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --imf False --maxEvents=100
 echo "art-result: $? Reco"
 
 ArtPackage=$1
 ArtJobName=$2
-art.py compare grid --entries 10 ${ArtPackage} ${ArtJobName}
+art.py compare grid --entries 30 ${ArtPackage} ${ArtJobName}
 echo "art-result: $? Diff"
diff --git a/Tools/Tier0ChainTests/test/test_q431_mp.sh b/Tools/Tier0ChainTests/test/test_q431_mp.sh
index c3682da02683..c3b04b17d8ad 100755
--- a/Tools/Tier0ChainTests/test/test_q431_mp.sh
+++ b/Tools/Tier0ChainTests/test/test_q431_mp.sh
@@ -8,10 +8,10 @@
 # art-include: 21.3/Athena
 # art-include: 21.9/Athena
 
-Reco_tf.py --AMI=q431 --athenaopts='--nprocs=2' --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --imf False --maxEvents=1000
+Reco_tf.py --AMI=q431 --athenaopts='--nprocs=8' --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --imf False --maxEvents=100
 echo "art-result: $? Reco"
 
 ArtPackage=$1
 ArtJobName=$2
-art.py compare grid --entries 10 ${ArtPackage} ${ArtJobName}
+art.py compare grid --entries 30 ${ArtPackage} ${ArtJobName}
 echo "art-result: $? Diff"
diff --git a/Tools/Tier0ChainTests/test/test_q431_mt.sh b/Tools/Tier0ChainTests/test/test_q431_mt.sh
index a755a1d7b1f1..aa2d1cf58f65 100755
--- a/Tools/Tier0ChainTests/test/test_q431_mt.sh
+++ b/Tools/Tier0ChainTests/test/test_q431_mt.sh
@@ -8,10 +8,10 @@
 # art-include: 21.3/Athena
 # art-include: 21.9/Athena
 
-Reco_tf.py --AMI=q431 --athenaopts='--threads=2' --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --imf False --maxEvents=1000
+Reco_tf.py --AMI=q431 --athenaopts='--threads=8' --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --imf False --maxEvents=100
 echo "art-result: $? Reco"
 
 ArtPackage=$1
 ArtJobName=$2
-art.py compare grid --entries 10 ${ArtPackage} ${ArtJobName}
+art.py compare grid --entries 30 ${ArtPackage} ${ArtJobName}
 echo "art-result: $? Diff"
-- 
GitLab


From 0b9723dd7e2ea70a7bc99a165c99642979b8fbb9 Mon Sep 17 00:00:00 2001
From: Tim Martin <Tim.Martin@cern.ch>
Date: Tue, 15 Dec 2020 13:41:31 +0100
Subject: [PATCH 028/225] Change ComboHypo deduplication logic to work with 3+
 legs. Allow the FullScan ROI to pass any leg with any multiplicity
 requirement

---
 .../DecisionHandling/ComboHypo.h              |   2 +-
 .../DecisionHandling/src/ComboHypo.cxx        | 149 ++++++++++++------
 2 files changed, 103 insertions(+), 48 deletions(-)

diff --git a/Trigger/TrigSteer/DecisionHandling/DecisionHandling/ComboHypo.h b/Trigger/TrigSteer/DecisionHandling/DecisionHandling/ComboHypo.h
index ef7151cc8476..91fa2f8ca766 100644
--- a/Trigger/TrigSteer/DecisionHandling/DecisionHandling/ComboHypo.h
+++ b/Trigger/TrigSteer/DecisionHandling/DecisionHandling/ComboHypo.h
@@ -74,7 +74,7 @@ class ComboHypo : public ::AthReentrantAlgorithm {
    * @param[out] roiIndex Index inside the roiKey collection. 
    **/
   StatusCode extractFeatureAndRoI(const ElementLink<TrigCompositeUtils::DecisionContainer>& EL,
-    uint32_t& featureKey, uint16_t& featureIndex, uint32_t& roiKey, uint16_t& roiIndex) const; 
+    uint32_t& featureKey, uint16_t& featureIndex, uint32_t& roiKey, uint16_t& roiIndex, bool& roiFullscan) const; 
 
 
   /**
diff --git a/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx b/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx
index 23db05d587b0..d8a254693e95 100644
--- a/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx
+++ b/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx
@@ -93,7 +93,7 @@ StatusCode ComboHypo::copyDecisions(  const LegDecisionsMap & passingLegs, const
     if ( inputHandle.isValid() ) {
 
       for (const Decision* inputDecision : *inputHandle) {
-	auto thisEL = TrigCompositeUtils::decisionToElementLink(inputDecision, context);
+        auto thisEL = TrigCompositeUtils::decisionToElementLink(inputDecision, context);
         DecisionIDContainer inputDecisionIDs;
         decisionIDs( inputDecision, inputDecisionIDs );
 
@@ -102,28 +102,29 @@ StatusCode ComboHypo::copyDecisions(  const LegDecisionsMap & passingLegs, const
         std::set_intersection( inputDecisionIDs.begin(), inputDecisionIDs.end(), passing.begin(), passing.end(),
           std::inserter( common, common.end() ) );
 
-	// check if this EL is in the combination map for the passing decIDs:
-	ATH_MSG_DEBUG("Searching this element in the map: ("<<thisEL.dataID() << " , " << thisEL.index()<<")");
+        // check if this EL is in the combination map for the passing decIDs:
+        ATH_MSG_DEBUG("Searching this element in the map: ("<<thisEL.dataID() << " , " << thisEL.index()<<")");
         DecisionIDContainer finalIds;   
         for (const DecisionID c : common){
           const HLT::Identifier cID = HLT::Identifier(c);
-	  // add teh decID only if this candidate passed the combination selection
-	  const ElementLinkVector<DecisionContainer>& Comb=passingLegs.at(c);
-	  if(std::find(Comb.begin(), Comb.end(), thisEL) == Comb.end()) continue;
-
-	  ATH_MSG_DEBUG("  Adding "<< cID <<" because EL is found in the passingLegs map");
+          // add the decID only if this candidate passed the combination selection
+          const ElementLinkVector<DecisionContainer>& Comb=passingLegs.at(c);
+          if(std::find(Comb.begin(), Comb.end(), thisEL) == Comb.end()) {
+            continue;
+          }
+          ATH_MSG_DEBUG("  Adding "<< cID <<" because EL is found in the passingLegs map");
           finalIds.insert( cID.numeric() ); // all Ids used by the Filter, including legs
           if (TrigCompositeUtils::isLegId ( cID )){
             const HLT::Identifier mainChain = TrigCompositeUtils::getIDFromLeg( cID );
             finalIds.insert( mainChain.numeric() );
-	    ATH_MSG_DEBUG("  Adding "<< mainChain <<" consequently");
+            ATH_MSG_DEBUG("  Adding "<< mainChain <<" consequently");
           }
         }
 
         Decision* newDec = newDecisionIn( outDecisions, inputDecision, "CH", context );
         ATH_MSG_DEBUG("New decision (Container Index:" << input_counter << ", Element Index:"<< newDec->index() <<") has "
-		      << (TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>(newDec, initialRoIString())).isValid()
-		      << " valid initialRoI, "<< TrigCompositeUtils::getLinkToPrevious(newDec).size() <<" previous decisions and "<<finalIds.size()<<" decision IDs") ;   
+          << (TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>(newDec, initialRoIString())).isValid()
+          << " valid initialRoI, "<< TrigCompositeUtils::getLinkToPrevious(newDec).size() <<" previous decisions and "<<finalIds.size()<<" decision IDs") ;   
         insertDecisionIDs( finalIds, newDec );
 
       }
@@ -159,7 +160,6 @@ StatusCode ComboHypo::execute(const EventContext& context ) const {
 
   // loop over all chains in the mult-map
   for ( const auto& m : m_multiplicitiesReqMap ) { 
-    uint32_t nRequiredUnique = 0;
     const HLT::Identifier chainId = HLT::Identifier(m.first);
     const std::vector<int>& multiplicityPerLeg = m.second;
     const DecisionID requiredDecisionID = chainId.numeric();
@@ -169,14 +169,15 @@ StatusCode ComboHypo::execute(const EventContext& context ) const {
 
     bool overallDecision = true;
 
-    std::set<uint32_t> uniqueDecisionFeatures;
-    LegDecisionsMap thisChainCombMap;
+    std::vector< std::set<uint32_t> > legFeatureHashes; //!< Keeps track per leg of the hash of the objects passing the leg
+    legFeatureHashes.resize( multiplicityPerLeg.size() );
+    size_t fsCount = 0; //!< We allow the FullScan ROI to pass any multiplicity. So we may have to magic up some unique hashes. Counting integers work fine.
 
+    LegDecisionsMap thisChainCombMap;
 
     // Check multiplicity of each leg of this chain
     for ( size_t legIndex = 0; legIndex <  multiplicityPerLeg.size(); ++legIndex ) {
       const size_t requiredMultiplicity =  multiplicityPerLeg.at( legIndex );
-      nRequiredUnique += requiredMultiplicity;
 
       HLT::Identifier legId = TrigCompositeUtils::createLegName(chainId, legIndex);
       // If there is only one leg, then we just use the chain's name.
@@ -194,49 +195,102 @@ StatusCode ComboHypo::execute(const EventContext& context ) const {
         break;
       }
 
-      //check this leg of the chain passes with required multiplicity
-      const size_t observedMultiplicity = it->second.size();
+      // Check the total number of decision objects we have available on this leg from which to satisfy its multiplicity requirement
+      const size_t nLegDecisionObjects = it->second.size();
 
-      ATH_MSG_DEBUG( "Required multiplicity " << requiredMultiplicity  << " for leg " << legId 
-        << ": observed multiplicity " << observedMultiplicity << " in leg " << legIndex  );
+      ATH_MSG_DEBUG( "Will attempt to meet the required multiplicity of " << requiredMultiplicity  << " for leg " << legId 
+        << " with " << nLegDecisionObjects << " Decision Objects in leg " << legIndex << " of " << legId);
 
-      if ( observedMultiplicity < requiredMultiplicity ) {
-        overallDecision = false;
-        break;
-      }
-  
-      //keep track of the number of unique features/rois
+      // We extract unique passing features on the leg, if there are no features yet - then the L1 ROI is used as a fall-back feature
+      // A special behaviour is that if this fall-back triggers, and the full-scan ROI, then the leg is assumed valid. 
+      // This is regardless of whether or not other legs also use the same FS ROI. Regardless of if the leg's required multiplicity.
+      // This keeps the leg alive until the actual FS reconstruction may occur. At which point, the following ComboHypo will begin
+      // to cut on the actual reconstructed physics objects.
       for (const ElementLink<DecisionContainer>& dEL : it->second){
         uint32_t featureKey = 0, roiKey = 0;
         uint16_t featureIndex = 0, roiIndex = 0;
+        bool roiFullscan = false;
         // NOTE: roiKey, roiIndex are only currently used in the discrimination for L1 Decision objects (which don't have a 'feature' link)
         // NOTE: We should make it configurable to choose either the feature or the ROI here, as done in the InputMaker base class when merging.
-        ATH_CHECK( extractFeatureAndRoI(dEL, featureKey, featureIndex, roiKey, roiIndex) );
-        const uint32_t uniquenessHash = (featureKey != 0 ? (featureKey + featureIndex) : (roiKey + roiIndex)); 
-        if (uniquenessHash == 0) {
-          ATH_MSG_ERROR("Object has no feature, and no initialRoI. Cannot get obtain unique element to avoid double-counting.");
-          return StatusCode::FAILURE;
+        ATH_CHECK( extractFeatureAndRoI(dEL, featureKey, featureIndex, roiKey, roiIndex, roiFullscan) );
+        if (roiKey != 0 && roiFullscan) {
+          // This fsCount integer is being to generate unique "hash" values to allow the FS ROI to meet the multiplicity requirements of this leg
+          for (size_t i = 0; i < requiredMultiplicity; ++i) {
+            legFeatureHashes.at( legIndex ).insert( ++fsCount );
+            ATH_MSG_DEBUG("  -- Add feature hash '" << fsCount << "' to leg " << legIndex << ". (Note: passing hash generated from FullScan ROI)");
+          }
+        } else {
+          const uint32_t uniquenessHash = (featureKey != 0 ? (featureKey + featureIndex) : (roiKey + roiIndex)); 
+          legFeatureHashes.at( legIndex ).insert( uniquenessHash );
+          ATH_MSG_DEBUG("  -- Add feature hash '" << uniquenessHash << "' to leg " << legIndex << ".");
         }
-        uniqueDecisionFeatures.insert( uniquenessHash );
       }
 
       // save combinations of all legs for the tools
       thisChainCombMap.insert (*it);
       allDecisionIds.insert(requiredDecisionIDLeg);
+      
+    } // end loop over legIndex
+
+
+    // Remove any duplicated features which are shared between legs.
+    // Keep the feature only in the leg which can afford to loose the least number of object, given its multiplicity requirement.
+    std::set<uint32_t> allFeatureHashes;
+    for (const std::set<uint32_t>& legHashes : legFeatureHashes) {
+      allFeatureHashes.insert(legHashes.begin(), legHashes.end());
+    }
+    for (const uint32_t featureHash : allFeatureHashes) {
+      size_t legsWithHash = 0; //!< If this grows greater than one then we have to start culling features from legs
+      size_t keepLegIndex = 0; //!< If the hash is used in multiple legs, which leg can least afford to loose it?
+      int32_t keepLegMargin = std::numeric_limits<int32_t>::max(); //!< How many features the leg at keepLegIndex can afford to loose before it starts to fail its multiplicity requirement. 
+      for (size_t legIndex = 0; legIndex <  multiplicityPerLeg.size(); ++legIndex) {
+        if (legFeatureHashes.at(legIndex).count(featureHash) == 0) {
+          continue;
+        }
+        ++legsWithHash;
+        const int32_t requiredMultiplicity = multiplicityPerLeg.at(legIndex);
+        const int32_t currentMultiplicity = legFeatureHashes.at(legIndex).size();
+        const int32_t safetyMargin = currentMultiplicity - requiredMultiplicity; // Signed, if -ve then the chain has already been failed by the leg at legIndex
+        if (safetyMargin < keepLegMargin) {
+          keepLegMargin = safetyMargin;
+          keepLegIndex = legIndex;
+        }
+      }
+      if (legsWithHash == 1) {
+        continue;
+      }
+      // If a feature is found on multiple legs, then remove it from all but the leg which can afford to loose it the least
+      for (size_t legIndex = 0; legIndex <  multiplicityPerLeg.size(); ++legIndex) {
+        if (legIndex == keepLegIndex) {
+          ATH_MSG_DEBUG("Keeping feature hash '" << featureHash << "', on leg " << legIndex << ". This leg can least afford to loose it. "
+            << "Leg has " << legFeatureHashes.at(legIndex).size() 
+            << " features, and a multiplicity requirement of " << multiplicityPerLeg.at(legIndex));
+          continue;
+        }
+        if (legFeatureHashes.at(legIndex).erase(featureHash)) {
+          ATH_MSG_DEBUG("Removed duplicate feature hash '" << featureHash << "', from leg " << legIndex << ". Leg now has " << legFeatureHashes.at(legIndex).size() 
+            << " remaining features, and a multiplicity requirement of " << multiplicityPerLeg.at(legIndex));
+        }
+      }
     }
 
     //check that the multiplicity of unique features is high enough
-    ATH_MSG_DEBUG("Number of unique features: " << uniqueDecisionFeatures.size() << ", number of required unique decisions: " << nRequiredUnique);
-    if ( uniqueDecisionFeatures.size() < nRequiredUnique ) {
-      overallDecision = false;
+    for (size_t legIndex = 0; legIndex <  multiplicityPerLeg.size(); ++legIndex) {
+      const size_t requiredMultiplicity = multiplicityPerLeg.at(legIndex);
+      const size_t currentMultiplicity = legFeatureHashes.at(legIndex).size();
+      if (currentMultiplicity < requiredMultiplicity) {
+        ATH_MSG_DEBUG("Leg " << legIndex << " fails multiplicity check. Required unique features:" << requiredMultiplicity << ", found unique features: " << currentMultiplicity);
+        overallDecision = false;
+        break;
+      }
     }
 
     //Overall chain decision
     ATH_MSG_DEBUG( "Chain " << chainId <<  ( overallDecision ? " is accepted" : " is rejected")  <<" after multiplicity requirements" );
     if ( overallDecision == true ) {
       for (auto decID: allDecisionIds) {
-	// saving the good combiantions
-	passingLegs.insert (thisChainCombMap.begin(), thisChainCombMap.end());
+        // saving the good combinations
+        passingLegs.insert (thisChainCombMap.begin(), thisChainCombMap.end());
         ATH_MSG_DEBUG("  Passing " << HLT::Identifier(decID)<<" after multiplicity test");
       }
     }      
@@ -247,21 +301,21 @@ StatusCode ComboHypo::execute(const EventContext& context ) const {
     ///////////////////////
     if (m_hypoTools.size()>0){
       for ( auto& tool: m_hypoTools ) {
-	ATH_MSG_DEBUG( "Calling  tool "<<tool->name());
-	ATH_CHECK( tool->decide( passingLegs, context ) );
+        ATH_MSG_DEBUG( "Calling  tool "<<tool->name());
+        ATH_CHECK( tool->decide( passingLegs, context ) );
       }
     }
   }
 
-    // this is only for debug:
-    if (msgLvl(MSG::DEBUG)){
-      DecisionIDContainer passing;
-      for (auto const& element : passingLegs) {
-	passing.insert(element.first);
-      }
-      for (auto p: passing)
-	ATH_MSG_DEBUG("Passing "<<HLT::Identifier(p));
+  // this is only for debug:
+  if (msgLvl(MSG::DEBUG)){
+    DecisionIDContainer passing;
+    for (auto const& element : passingLegs) {
+      passing.insert(element.first);
     }
+    for (auto p: passing)
+    ATH_MSG_DEBUG("Passing "<<HLT::Identifier(p));
+  }
 
   // need to pass all combinations, since not all element pass the decID
   ATH_CHECK( copyDecisions( passingLegs, context ) );
@@ -271,7 +325,7 @@ StatusCode ComboHypo::execute(const EventContext& context ) const {
 
 
 StatusCode ComboHypo::extractFeatureAndRoI(const ElementLink<DecisionContainer>& dEL,
-  uint32_t& featureKey, uint16_t& featureIndex, uint32_t& roiKey, uint16_t& roiIndex) const 
+  uint32_t& featureKey, uint16_t& featureIndex, uint32_t& roiKey, uint16_t& roiIndex, bool& roiFullscan) const 
 {
   uint32_t featureClid = 0; // Note: Unused. We don't care what the type of the feature is here
   const bool foundFeature = typelessFindLink((*dEL), featureString(), featureKey, featureClid, featureIndex);
@@ -280,6 +334,7 @@ StatusCode ComboHypo::extractFeatureAndRoI(const ElementLink<DecisionContainer>&
   if (roiSeedLI.isValid()) {
     roiKey = roiSeedLI.link.key();
     roiIndex = roiSeedLI.link.index();
+    roiFullscan = (*(roiSeedLI.link))->isFullscan();
   }
   if (!foundFeature && !roiSeedLI.isValid()) {
     ATH_MSG_WARNING("Did not find the feature or initialRoI for " << dEL.dataID() << " index " << dEL.index());
-- 
GitLab


From f10f69e76cca66b6aec5a4f45a2f0915a15b666a Mon Sep 17 00:00:00 2001
From: Peter Berta <peter.berta@cern.ch>
Date: Tue, 15 Dec 2020 14:02:53 +0100
Subject: [PATCH 029/225] fixing the crash in RDOtoRDOTrigger step for
 test_q441.sh; increased number of events to 100; using 8 threads for the mt
 version

---
 Tools/Tier0ChainTests/test/test_q441.sh    | 2 +-
 Tools/Tier0ChainTests/test/test_q441_mt.sh | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/Tools/Tier0ChainTests/test/test_q441.sh b/Tools/Tier0ChainTests/test/test_q441.sh
index c6969fcdea9d..79fb1af1e196 100755
--- a/Tools/Tier0ChainTests/test/test_q441.sh
+++ b/Tools/Tier0ChainTests/test/test_q441.sh
@@ -4,7 +4,7 @@
 # art-type: grid
 # art-include: master/Athena
 
-Reco_tf.py --AMI=q441 --inputHITSFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/q441/22.0/HITS.12560240._000299.pool.root.1 --inputRDO_BKGFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/q441/22.0/RDO.17190395._000013.pool.root.1 --maxEvents=25 --outputAODFile=q441.AOD.pool.root --outputESDFile=q441.ESD.pool.root
+Reco_tf.py --AMI=q441 --athenaopts "RDOtoRDOTrigger:--imf --threads=1 --concurrent-events=1" --inputHITSFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/q441/22.0/HITS.12560240._000299.pool.root.1 --inputRDO_BKGFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/q441/22.0/RDO.17190395._000013.pool.root.1 --maxEvents=100 --outputAODFile=q441.AOD.pool.root --outputESDFile=q441.ESD.pool.root
 
 #This test currently has the muon isolation reconstruction switched off. It should be switched back on at a later date. 
 echo "art-result: $?"
diff --git a/Tools/Tier0ChainTests/test/test_q441_mt.sh b/Tools/Tier0ChainTests/test/test_q441_mt.sh
index d78498e66889..157bbf5948b0 100755
--- a/Tools/Tier0ChainTests/test/test_q441_mt.sh
+++ b/Tools/Tier0ChainTests/test/test_q441_mt.sh
@@ -4,7 +4,7 @@
 # art-type: grid
 # art-include: master/Athena
 
-Reco_tf.py --AMI=q441 --athenaopts='--threads=1' --inputHITSFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/q441/22.0/HITS.12560240._000299.pool.root.1 --inputRDO_BKGFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/q441/22.0/RDO.17190395._000013.pool.root.1 --maxEvents=25 --outputAODFile=q441.AOD.pool.root --outputESDFile=q441.ESD.pool.root
+Reco_tf.py --AMI=q441 --athenaopts='--threads=8' --inputHITSFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/q441/22.0/HITS.12560240._000299.pool.root.1 --inputRDO_BKGFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/q441/22.0/RDO.17190395._000013.pool.root.1 --maxEvents=100 --outputAODFile=q441.AOD.pool.root --outputESDFile=q441.ESD.pool.root
 
 #This test currently has the muon isolation reconstruction switched off. It should be switched back on at a later date. 
 echo "art-result: $?"
-- 
GitLab


From 8b88f70d1afa23d82167febc5297827f0106993f Mon Sep 17 00:00:00 2001
From: Andrii Verbytskyi <averbyts@cern.ch>
Date: Tue, 15 Dec 2020 14:29:08 +0100
Subject: [PATCH 030/225] More migration

---
 .../src/InDetPrimaryConversionSelector.cxx    | 50 +++++++++----------
 .../TrigTrackSelector.h                       |  4 +-
 .../src/TrigTrackSelector.cxx                 | 14 +++++-
 .../VP1TrackSystems/AscObj_TruthPoint.h       |  2 +-
 .../VP1TrackSystems/src/AscObj_TruthPoint.cxx | 12 ++---
 .../src/TrackHandle_TruthTrack.cxx            | 26 ++++++----
 6 files changed, 61 insertions(+), 47 deletions(-)

diff --git a/Tracking/TrkValidation/TrkValTools/src/InDetPrimaryConversionSelector.cxx b/Tracking/TrkValidation/TrkValTools/src/InDetPrimaryConversionSelector.cxx
index 26e8b3a15525..768c58a4fc20 100644
--- a/Tracking/TrkValidation/TrkValTools/src/InDetPrimaryConversionSelector.cxx
+++ b/Tracking/TrkValidation/TrkValTools/src/InDetPrimaryConversionSelector.cxx
@@ -59,61 +59,61 @@ StatusCode Trk::InDetPrimaryConversionSelector::finalize() {
   return StatusCode::SUCCESS;
 }
 
-std::vector<const HepMC::GenParticle*>*
+std::vector<HepMC::ConstGenParticlePtr>*
 Trk::InDetPrimaryConversionSelector::selectGenSignal (const McEventCollection* SimTracks) const {
 
   if (! SimTracks) return NULL;
 
-  std::vector<const HepMC::GenParticle *>* genSignal = 
-    new std::vector<const HepMC::GenParticle *>;
-
+  std::vector<HepMC::ConstGenParticlePtr>* genSignal = 
+    new std::vector<HepMC::ConstGenParticlePtr>;
   // pile-up: vector of MCEC has more than one entry
   DataVector<HepMC::GenEvent>::const_iterator itCollision = SimTracks->begin();
   
   for( ; itCollision != SimTracks->end(); ++itCollision ) {
     const HepMC::GenEvent*    genEvent = *itCollision;
-    HepMC::GenParticle * particle = NULL;
     
-    for (HepMC::GenEvent::particle_const_iterator it = genEvent->particles_begin();
-         it != genEvent->particles_end(); ++it) {
-
-      particle = *it;
+    for (auto particle: *genEvent) {
 
       // 1) require stable particle from generation or simulation
       if ((particle->status()%1000) != 1 )    continue;
 
-      if(particle->production_vertex() == NULL) {
+      if(!particle->production_vertex()) {
         ATH_MSG_WARNING ("GenParticle without production vertex - simulation corrupt? ");
-        ATH_MSG_DEBUG   ("It's this one: " << *particle);
+        ATH_MSG_DEBUG   ("It's this one: " << particle);
         continue;
       } else {
       
         // 2) require track inside ID - relaxed definition including decays of neutrals (secondaries)
-        if ( fabs(particle->production_vertex()->position().perp()) > m_maxRStartAll ||
-             fabs(particle->production_vertex()->position().z())    > m_maxZStartAll ) continue;
+        if ( std::fabs(particle->production_vertex()->position().perp()) > m_maxRStartAll ||
+             std::fabs(particle->production_vertex()->position().z())    > m_maxZStartAll ) continue;
 
         int   pdgCode         = particle->pdg_id();
-        if (abs(pdgCode) > 1000000000 ) continue; // ignore nuclei from hadronic interactions
+        if (std::abs(pdgCode) > 1000000000 ) continue; // ignore nuclei from hadronic interactions
         const HepPDT::ParticleData* pd = m_particleDataTable->particle(abs(pdgCode));
 
         if (!pd) { // nuclei excluded, still problems with a given type?
-          ATH_MSG_INFO ("Could not get particle data for particle with pdgCode="<<pdgCode<< ", status=" << particle->status() << ", barcode=" << particle->barcode());
-          ATH_MSG_INFO ("GenParticle= " << *particle);
+          ATH_MSG_INFO ("Could not get particle data for particle with pdgCode="<<pdgCode<< ", status=" << particle->status() << ", barcode=" << HepMC::barcode(particle));
+          ATH_MSG_INFO ("GenParticle= " << particle);
           continue;
         }
 
-	ATH_MSG_DEBUG ("found particle = " << *particle);
+	ATH_MSG_DEBUG ("found particle = " << particle);
 
 	// assume for the moment we're only running over single gamma MC files ...
-	HepMC::GenVertex* prodVertex( particle->production_vertex());
-	if ( abs(pdgCode) == 11 ) {
+        auto  prodVertex = particle->production_vertex();
+	if ( std::abs(pdgCode) == 11 ) {
 	  ATH_MSG_DEBUG ("Electron/Positron detected -- checking for production process ...");
-	  HepMC::GenVertex::particles_in_const_iterator inParticle     = prodVertex->particles_in_const_begin();
-	  HepMC::GenVertex::particles_out_const_iterator inParticleEnd = prodVertex->particles_in_const_end();
-	  for ( ; inParticle != inParticleEnd; ++inParticle) {
-	    ATH_MSG_DEBUG(" --> checking morther: " << *(*inParticle) );
-	    if ( abs((*inParticle)->pdg_id()) == 22 || abs((*inParticle)->pdg_id()) == 11 ){
-	      if (fabs(particle->momentum().perp()) >  m_minPt  &&  fabs(particle->momentum().pseudoRapidity()) < m_maxEta ) {
+#ifdef HEPMC3
+	  for ( auto  inParticle: prodVertex->particles_in()) {
+#else
+	  HepMC::GenVertex::particles_in_const_iterator ItinParticle     = prodVertex->particles_in_const_begin();
+	  HepMC::GenVertex::particles_out_const_iterator ItinParticleEnd = prodVertex->particles_in_const_end();
+	  for ( ; ItinParticle != ItinParticleEnd; ++ItinParticle) {
+            auto inParticle=*ItinParticle;
+#endif
+	    ATH_MSG_DEBUG(" --> checking morther: " << inParticle );
+	    if ( std::abs(inParticle->pdg_id()) == 22 || std::abs(inParticle->pdg_id()) == 11 ){
+	      if (std::fabs(particle->momentum().perp()) >  m_minPt  &&  std::fabs(particle->momentum().pseudoRapidity()) < m_maxEta ) {
 		genSignal->push_back(particle);
 		ATH_MSG_DEBUG ("Selected this electron/positron!");
 		break;
diff --git a/Trigger/TrigAnalysis/TrigInDetAnalysisUtils/TrigInDetAnalysisUtils/TrigTrackSelector.h b/Trigger/TrigAnalysis/TrigInDetAnalysisUtils/TrigInDetAnalysisUtils/TrigTrackSelector.h
index 09a6a6f20557..422a582703ea 100644
--- a/Trigger/TrigAnalysis/TrigInDetAnalysisUtils/TrigInDetAnalysisUtils/TrigTrackSelector.h
+++ b/Trigger/TrigAnalysis/TrigInDetAnalysisUtils/TrigInDetAnalysisUtils/TrigTrackSelector.h
@@ -104,7 +104,7 @@ public:
   void selectTracks( const xAOD::TruthParticleContainer* truthtracks );
 
 
-  bool selectTrack( const HepMC::GenParticle* track );
+  bool selectTrack( HepMC::ConstGenParticlePtr track );
 
 
   // add a TruthParticle 
@@ -117,7 +117,7 @@ public:
 
 
   // make a TIDA::Track from a GenParticle 
-  TIDA::Track* makeTrack( const HepMC::GenParticle* track );
+  TIDA::Track* makeTrack( HepMC::ConstGenParticlePtr track );
 
   // make a TIDA::Track from a TruthParticle 
   TIDA::Track* makeTrack( const TruthParticle* track, unsigned long tid=0 );
diff --git a/Trigger/TrigAnalysis/TrigInDetAnalysisUtils/src/TrigTrackSelector.cxx b/Trigger/TrigAnalysis/TrigInDetAnalysisUtils/src/TrigTrackSelector.cxx
index 66c02cad6d9f..450b0d6cd62b 100644
--- a/Trigger/TrigAnalysis/TrigInDetAnalysisUtils/src/TrigTrackSelector.cxx
+++ b/Trigger/TrigAnalysis/TrigInDetAnalysisUtils/src/TrigTrackSelector.cxx
@@ -298,13 +298,18 @@ void TrigTrackSelector::selectTracks( const xAOD::TruthParticleContainer* trutht
 
 
 // add a TruthParticle from a GenParticle - easy, bet it doesn't work 
-bool TrigTrackSelector::selectTrack( const HepMC::GenParticle* track ) {
+bool TrigTrackSelector::selectTrack( HepMC::ConstGenParticlePtr track ) {
   
     /// not a "final state" particle
     if ( track->status() != 1 ) return false;
 
     /// set this so can use it as the identifier - don't forget to reset!!
+//AV Using memory to get some value is not a good idea. This is not a repruducible/portable way, but I leave it as is.
+#ifdef HEPMC3
+    m_id = (unsigned long)(track.get());
+#else
     m_id = (unsigned long)track;
+#endif
     bool sel;
     sel = selectTrack( TruthParticle(track) );
     m_id = 0;
@@ -476,8 +481,13 @@ bool TrigTrackSelector::selectTrack( const xAOD::TruthParticle* track ) {
 
 
 // make a TIDA::Track from a GenParticle 
-TIDA::Track* TrigTrackSelector::makeTrack( const HepMC::GenParticle* track ) { 
+TIDA::Track* TrigTrackSelector::makeTrack(HepMC::ConstGenParticlePtr track ) { 
+//AV Using memory to get some value is not a good idea. This is not a repruducible/portable way, but I leave it as is.
+#ifdef HEPMC3
+    unsigned long id = (unsigned long)(track.get());
+#else
     unsigned long id = (unsigned long)track;
+#endif
     TruthParticle t = TruthParticle(track); 
     return  makeTrack( &t, id );
 }
diff --git a/graphics/VP1/VP1Systems/VP1TrackSystems/VP1TrackSystems/AscObj_TruthPoint.h b/graphics/VP1/VP1Systems/VP1TrackSystems/VP1TrackSystems/AscObj_TruthPoint.h
index c18c7be39ab4..7d75aa7e58dd 100644
--- a/graphics/VP1/VP1Systems/VP1TrackSystems/VP1TrackSystems/AscObj_TruthPoint.h
+++ b/graphics/VP1/VP1Systems/VP1TrackSystems/VP1TrackSystems/AscObj_TruthPoint.h
@@ -27,7 +27,7 @@ class SimHitHandleBase;
 class AscObj_TruthPoint : public AssociatedObjectHandleBase {
 public:
 
-  AscObj_TruthPoint( TrackHandleBase*, const HepMC::GenVertex * v, const HepMC::GenParticle * p );
+  AscObj_TruthPoint( TrackHandleBase*, HepMC::ConstGenVertexPtr  v, HepMC::ConstGenParticlePtr p );
   AscObj_TruthPoint( TrackHandleBase*, SimHitHandleBase* );
   virtual ~AscObj_TruthPoint();
 
diff --git a/graphics/VP1/VP1Systems/VP1TrackSystems/src/AscObj_TruthPoint.cxx b/graphics/VP1/VP1Systems/VP1TrackSystems/src/AscObj_TruthPoint.cxx
index 9372689c3f0e..04d581cbed4c 100644
--- a/graphics/VP1/VP1Systems/VP1TrackSystems/src/AscObj_TruthPoint.cxx
+++ b/graphics/VP1/VP1Systems/VP1TrackSystems/src/AscObj_TruthPoint.cxx
@@ -36,18 +36,18 @@
 //____________________________________________________________________
 class AscObj_TruthPoint::Imp {
 public:
-  Imp(const HepMC::GenVertex * v, const HepMC::GenParticle * p)
-    : genVertex(v), genParticle(p), simhit(0) {}
+  Imp(HepMC::ConstGenVertexPtr  v, HepMC::ConstGenParticlePtr p)
+    : genVertex(v), genParticle(p), simhit(nullptr) {}
   Imp(SimHitHandleBase*s)
-    : genVertex(0), genParticle(0), simhit(s) {}
-  const HepMC::GenVertex * genVertex;
-  const HepMC::GenParticle * genParticle;
+    : genVertex(nullptr), genParticle(nullptr), simhit(s) {}
+  HepMC::ConstGenVertexPtr genVertex;
+  HepMC::ConstGenParticlePtr genParticle;
   SimHitHandleBase * simhit;
 };
 
 
 //____________________________________________________________________
-AscObj_TruthPoint::AscObj_TruthPoint(TrackHandleBase*th, const HepMC::GenVertex * v, const HepMC::GenParticle * p)
+AscObj_TruthPoint::AscObj_TruthPoint(TrackHandleBase*th, HepMC::ConstGenVertexPtr v, HepMC::ConstGenParticlePtr p)
   : AssociatedObjectHandleBase(th), m_d(new Imp(v,p))
 {
 }
diff --git a/graphics/VP1/VP1Systems/VP1TrackSystems/src/TrackHandle_TruthTrack.cxx b/graphics/VP1/VP1Systems/VP1TrackSystems/src/TrackHandle_TruthTrack.cxx
index 1416ea225bfa..0ba886b74451 100644
--- a/graphics/VP1/VP1Systems/VP1TrackSystems/src/TrackHandle_TruthTrack.cxx
+++ b/graphics/VP1/VP1Systems/VP1TrackSystems/src/TrackHandle_TruthTrack.cxx
@@ -28,18 +28,18 @@
 class TrackHandle_TruthTrack::Imp {
 public:
   Imp(TrackHandle_TruthTrack * tc,
-      const SimBarCode& sbc,const SimHitList& shl,const HepMC::GenParticle* p)
+      const SimBarCode& sbc,const SimHitList& shl,HepMC::ConstGenParticlePtr p)
     : theclass(tc),
       simBarCode(sbc),
       simHitList(shl),
       genParticle(p),
       ascObjVis(false),
       ascObjs(0),
-      trkTrack(0) {}
+      trkTrack(nullptr) {}
   TrackHandle_TruthTrack * theclass;
   SimBarCode simBarCode;
   SimHitList simHitList;
-  const HepMC::GenParticle* genParticle;
+  HepMC::ConstGenParticlePtr genParticle;
 
   bool ascObjVis;
   std::vector<AscObj_TruthPoint*> * ascObjs;
@@ -47,11 +47,11 @@ public:
   const Trk::Track * trkTrack;
   void ensureInitTrkTracks();
 
-  static Trk::Perigee * createTrkPerigeeFromProdVertex(const HepMC::GenParticle * p, const double& charge )
+  static Trk::Perigee * createTrkPerigeeFromProdVertex(HepMC::ConstGenParticlePtr p, const double& charge )
   {
     if (!p)
       return 0;//Fixme: message!
-    const HepMC::GenVertex * v = p->production_vertex();
+    auto v = p->production_vertex();
     if (!v)
       return 0;//Fixme: message!
     Amg::Vector3D mom(p->momentum().px(),p->momentum().py(),p->momentum().pz());
@@ -62,11 +62,11 @@ public:
     return new Trk::Perigee(0.,0.,mom.phi(), mom.theta(), charge/absmom, pos);
    }
 
-  static Trk::TrackParameters * createTrkParamFromDecayVertex(const HepMC::GenParticle * p, const double& charge )
+  static Trk::TrackParameters * createTrkParamFromDecayVertex(HepMC::ConstGenParticlePtr p, const double& charge )
   {
     if (!p)
       return 0;//Fixme: message!
-    const HepMC::GenVertex * v = p->end_vertex();
+    auto v = p->end_vertex();
     if (!v)
       return 0;//Fixme: message!
     Amg::Vector3D mom(p->momentum().px(),p->momentum().py(),p->momentum().pz());
@@ -125,7 +125,7 @@ public:
 TrackHandle_TruthTrack::TrackHandle_TruthTrack( TrackCollHandleBase* ch,
 						const SimBarCode& simBarCode,
 						const SimHitList& simHitList,
-						const HepMC::GenParticle* genPart )
+						HepMC::ConstGenParticlePtr genPart )
   : TrackHandleBase(ch), m_d(new Imp(this,simBarCode,simHitList,genPart))
 {
   if (VP1Msg::verbose()) {
@@ -262,7 +262,7 @@ bool TrackHandle_TruthTrack::hasVertexAtIR(const double& rmaxsq, const double& z
 {
   if (!m_d->genParticle)
     return false;
-  const HepMC::GenVertex * v = m_d->genParticle->production_vertex();
+  auto v = m_d->genParticle->production_vertex();
   if (!v)
     return false;
 
@@ -308,8 +308,12 @@ void TrackHandle_TruthTrack::Imp::ensureInitAscObjs()
   if (ascObjs)
     return;
   ascObjs = new std::vector<AscObj_TruthPoint*>;
-  const HepMC::GenVertex * vprod = genParticle ? genParticle->production_vertex() : 0;
-  const HepMC::GenVertex * vend = genParticle ? genParticle->end_vertex() : 0;
+  HepMC::ConstGenVertexPtr vprod{nullptr};
+  HepMC::ConstGenVertexPtr vend{nullptr};
+  if (genParticle) {
+   vprod=genParticle->production_vertex(); 
+   vend=genParticle->end_vertex();
+  }
   ascObjs->reserve((vprod?1:0)+(vend?1:simHitList.size()));
   if (vprod)
     ascObjs->push_back(new AscObj_TruthPoint(theclass,vprod,genParticle));
-- 
GitLab


From c449a3062ea351046fd1d31c8137401566df18ac Mon Sep 17 00:00:00 2001
From: Christos Anastopoulos <christos.anastopoulos@cern.ch>
Date: Tue, 15 Dec 2020 13:50:34 +0000
Subject: [PATCH 031/225] egammaAlgs, pass the EventContext to the elementLinks
 ctors. Modify methods to allow for it when the EventContext was not one of
 their arguments

---
 Control/AthViews/src/SimpleView.cxx                           | 1 -
 .../egamma/egammaAlgs/src/EMBremCollectionBuilder.cxx         | 4 ++--
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/Control/AthViews/src/SimpleView.cxx b/Control/AthViews/src/SimpleView.cxx
index 9c232b98026a..f8de70c5b0dc 100644
--- a/Control/AthViews/src/SimpleView.cxx
+++ b/Control/AthViews/src/SimpleView.cxx
@@ -120,7 +120,6 @@ SG::DataProxy * SimpleView::findProxy( const CLID& id, const std::string& key, c
  */
 SG::DataProxy * SimpleView::proxy( const void* const pTransient ) const
 {
-  throw std::runtime_error( "Not implemented: SimpleView::proxy" );
   return m_store->proxy( pTransient );
 }
 
diff --git a/Reconstruction/egamma/egammaAlgs/src/EMBremCollectionBuilder.cxx b/Reconstruction/egamma/egammaAlgs/src/EMBremCollectionBuilder.cxx
index dc1bc79b266a..ead0ba6aaaac 100644
--- a/Reconstruction/egamma/egammaAlgs/src/EMBremCollectionBuilder.cxx
+++ b/Reconstruction/egamma/egammaAlgs/src/EMBremCollectionBuilder.cxx
@@ -253,7 +253,7 @@ EMBremCollectionBuilder::createNew(
     ElementLink<xAOD::TrackParticleContainer>>
     tP("originalTrackParticle");
   ElementLink<xAOD::TrackParticleContainer> linkToOriginal(*AllTracks,
-                                                           origIndex);
+                                                           origIndex,ctx);
   tP(*aParticle) = linkToOriginal;
 
   if (m_doTruth) {
@@ -303,7 +303,7 @@ EMBremCollectionBuilder::createNew(
   // Now  Slim the Trk::Track for writing to disk
   m_slimTool->slimTrack(*(Info.track));
   finalTracks->push_back(std::move(Info.track));
-  ElementLink<TrackCollection> trackLink(*finalTracks,finalTracks->size()-1);
+  ElementLink<TrackCollection> trackLink(*finalTracks,finalTracks->size()-1,ctx);
   aParticle->setTrackLink( trackLink );
   return StatusCode::SUCCESS;
 }
-- 
GitLab


From b36373369ce41c8af57b0b8f055f653b85c0936f Mon Sep 17 00:00:00 2001
From: Walter Lampl <walter.lampl@cern.ch>
Date: Tue, 15 Dec 2020 13:54:00 +0000
Subject: [PATCH 032/225] ComponentAccumulator: Verify arguments of methods
 adding components

---
 .../python/ComponentAccumulator.py            | 20 ++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/Control/AthenaConfiguration/python/ComponentAccumulator.py b/Control/AthenaConfiguration/python/ComponentAccumulator.py
index b08120e3ecfd..74d2ec9dbc94 100644
--- a/Control/AthenaConfiguration/python/ComponentAccumulator.py
+++ b/Control/AthenaConfiguration/python/ComponentAccumulator.py
@@ -9,6 +9,7 @@ from AthenaCommon.Constants import INFO
 
 import GaudiKernel.GaudiHandles as GaudiHandles
 import GaudiConfig2
+import AthenaPython
 from AthenaConfiguration.Deduplication import deduplicate, DeduplicationFailed
 
 import collections
@@ -331,8 +332,11 @@ class ComponentAccumulator(object):
             raise ConfigurationError("Can not find sequence %s" % sequenceName )
 
         for algo in algorithms:
-            if algo.__component_type__ != "Algorithm":
+            if not isinstance(algo,GaudiConfig2._configurables.Configurable) and not isinstance(algo,AthenaPython.Configurables.CfgPyAlgorithm):
                 raise TypeError("Attempt to add wrong type: %s as event algorithm" % type( algo ).__name__)
+                
+            if algo.__component_type__ != "Algorithm":
+                raise TypeError("Attempt to add an %s as event algorithm" % algo.__component_type__) 
 
             if algo.name in self._algorithms:
                 self._algorithms[algo.name].merge(algo)
@@ -368,8 +372,11 @@ class ComponentAccumulator(object):
         return list( set( sum( flatSequencers( seq, algsCollection=self._algorithms ).values(), []) ) )
 
     def addCondAlgo(self,algo,primary=False):
-        if algo.__component_type__ != "Algorithm":
+        if not isinstance(algo,GaudiConfig2._configurables.Configurable) and not isinstance(algo,AthenaPython.Configurables.CfgPyAlgorithm):
             raise TypeError("Attempt to add wrong type: %s as conditions algorithm" % type( algo ).__name__)
+
+        if algo.__component_type__ != "Algorithm":
+            raise TypeError("Attempt to add wrong type: %s as conditions algorithm" % algo.__component_type__)
             pass
         deduplicate(algo,self._conditionsAlgs) #will raise on conflict
         if primary:
@@ -389,6 +396,10 @@ class ComponentAccumulator(object):
         return hits[0]
 
     def addService(self,newSvc,primary=False,create=False):
+
+        if not isinstance(newSvc,GaudiConfig2._configurables.Configurable) and not isinstance(newSvc,AthenaPython.Configurables.CfgPyService):
+            raise TypeError("Attempt to add wrong type: %s as service" % type( newSvc ).__name__)
+
         if newSvc.__component_type__ != "Service":
             raise TypeError("Attempt to add wrong type: %s as service" % newSvc.__component_type__)
             pass
@@ -408,8 +419,11 @@ class ComponentAccumulator(object):
         return
 
     def addPublicTool(self,newTool,primary=False):
+        if not isinstance(newTool,GaudiConfig2._configurables.Configurable) and not isinstance(newTool,AthenaPython.Configurables.CfgPyAlgTool):
+            raise TypeError("Attempt to add wrong type: %s as public AlgTool" % type( newTool ).__name__)
+
         if newTool.__component_type__ != "AlgTool":
-            raise TypeError("Attempt to add wrong type: %s as AlgTool" % type( newTool ).__name__)
+            raise TypeError("Attempt to add wrong type: %s as public AlgTool" % newTool.__component_type__)
 
         deduplicate(newTool,self._publicTools)
         if primary:
-- 
GitLab


From d7bf3442424fcea74f1501b20129775254a1685f Mon Sep 17 00:00:00 2001
From: Tomasz Bold <tomasz.bold@gmail.com>
Date: Tue, 15 Dec 2020 14:08:17 +0000
Subject: [PATCH 033/225] Write Json Run 3 config from TrigConfReadWrite
 utility

---
 .../TrigConfStorage/CMakeLists.txt            |   6 +-
 .../TrigConfStorage/src/test/ReadWrite.cxx    | 102 +++++++++------
 .../src/test/Run2toRun3Converters.cxx         | 120 ++++++++++++++++++
 .../src/test/Run2toRun3Converters.h           |   7 +
 4 files changed, 190 insertions(+), 45 deletions(-)
 create mode 100644 Trigger/TrigConfiguration/TrigConfStorage/src/test/Run2toRun3Converters.cxx
 create mode 100644 Trigger/TrigConfiguration/TrigConfStorage/src/test/Run2toRun3Converters.h

diff --git a/Trigger/TrigConfiguration/TrigConfStorage/CMakeLists.txt b/Trigger/TrigConfiguration/TrigConfStorage/CMakeLists.txt
index 2caee70e4ef7..69876d4daa39 100644
--- a/Trigger/TrigConfiguration/TrigConfStorage/CMakeLists.txt
+++ b/Trigger/TrigConfiguration/TrigConfStorage/CMakeLists.txt
@@ -15,7 +15,7 @@ atlas_add_library( TrigConfStorage
                    PUBLIC_HEADERS TrigConfStorage
                    INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${COOL_INCLUDE_DIRS} ${CORAL_INCLUDE_DIRS}
                    PRIVATE_INCLUDE_DIRS ${TDAQ-COMMON_INCLUDE_DIRS}
-                   LINK_LIBRARIES ${Boost_LIBRARIES} ${COOL_LIBRARIES} TrigConfBase TrigConfHLTData TrigConfL1Data
+                   LINK_LIBRARIES ${Boost_LIBRARIES} ${COOL_LIBRARIES} TrigConfBase TrigConfHLTData TrigConfL1Data TrigConfData
                    PRIVATE_LINK_LIBRARIES ${CORAL_LIBRARIES} ${TDAQ-COMMON_LIBRARIES} TrigConfJobOptData L1TopoConfig )
 
 atlas_add_executable( TrigConf2COOLApp
@@ -27,8 +27,8 @@ atlas_add_executable( TrigConfConsistencyChecker
                       LINK_LIBRARIES TrigConfStorage )
 
 atlas_add_executable( TrigConfReadWrite
-                      src/test/ReadWrite.cxx
-                      LINK_LIBRARIES L1TopoConfig TrigConfJobOptData TrigConfStorage )
+                      src/test/ReadWrite.cxx src/test/Run2toRun3Converters.cxx
+                      LINK_LIBRARIES L1TopoConfig TrigConfJobOptData TrigConfStorage TrigConfData TrigConfIO TrigCompositeUtilsLib )
 
 atlas_add_executable( TrigConfCoolFix
                       src/test/CoolFix.cxx
diff --git a/Trigger/TrigConfiguration/TrigConfStorage/src/test/ReadWrite.cxx b/Trigger/TrigConfiguration/TrigConfStorage/src/test/ReadWrite.cxx
index 1d5a1f24dd2a..b439ea320db6 100644
--- a/Trigger/TrigConfiguration/TrigConfStorage/src/test/ReadWrite.cxx
+++ b/Trigger/TrigConfiguration/TrigConfStorage/src/test/ReadWrite.cxx
@@ -3,14 +3,14 @@
 */
 
 /////////////////////////////////////////////////////////////////////
-//                                                     
-// NAME:     TrigConfReadWrite.cxx 
+//
+// NAME:     TrigConfReadWrite.cxx
 // PACKAGE:  TrigConfStorage
-//                                                     
-// AUTHOR:   J.Stelzer (CERN)	Joerg.Stelzer@cern.ch 
+//
+// AUTHOR:   J.Stelzer (CERN)	Joerg.Stelzer@cern.ch
 // CREATED:  17 Mar 2013
-//                                                     
-// PURPOSE: 
+//
+// PURPOSE:
 //
 // This standalone application is designed to read and write the
 // trigger configuration (L1+HLT) from DB,XML,COOL and to XML or COOL
@@ -42,6 +42,8 @@
 #include "TrigConfHLTData/HLTPrescaleSet.h"
 #include "TrigConfJobOptData/JobOptionTable.h"
 
+#include "Run2toRun3Converters.h"
+
 #include "CoolKernel/DatabaseId.h"
 #include "CoolKernel/Exception.h"
 #include "CoolKernel/IDatabaseSvc.h"
@@ -60,10 +62,11 @@
 #include <ctime>
 #include <map>
 #include <vector>
-#include <sys/stat.h> 
+#include <sys/stat.h>
 
 using namespace std;
 using namespace TrigConf;
+HLTMenu convertRun2HLTtoRun3(const HLTFrame* frame);
 
 void printhelp(std::ostream & o, std::ostream& (*lineend) ( std::ostream& os )) {
   o << "================================================================================\n";
@@ -73,7 +76,7 @@ void printhelp(std::ostream & o, std::ostream& (*lineend) ( std::ostream& os ))
   o << "[Global options]\n";
   o << "  -i|--input        input [input [input]]             ... source of configuration, format see below (mandatory)\n";
   o << "  -2|--comp         input [input [input]]             ... source of a second configuration for comparison\n";
-  o << "  -o|--output       xml|cool [output[;cooldb]] [run]  ... output format, name (for cool optional run number)\n";
+  o << "  -o|--output xml|r3json|cool [output[;cooldb]] [run] ... output format, name (for cool optional run number)\n";
   o << "                                                      ... absolute output file name must contain '/', cooldb can be appended COMP200|OFLP200\n";
   o << "  -v|--loglevel     <string>                          ... log level [NIL, VERBOSE, DEBUG, INFO, WARNING, ERROR, FATAL, ALWAYS]\n";
   o << "  -l|--log          <string>                          ... name of a log file\n";
@@ -100,6 +103,7 @@ void printhelp(std::ostream & o, std::ostream& (*lineend) ( std::ostream& os ))
   o << "  -o xml test                                     ... will produce LVL1config_test.xml and/or HLTconfig_test.xml. When\n";
   o << "                                                      comparing two menus this will produce Diff_test.xml. In this case the\n";
   o << "                                                      specification of '-o test' is sufficient\n";
+  o << " -o r3json test                                   ... will produce Run3 JSON LVL1Menu_test.json and HLTMenu_test.json\n";
   o << "  -o cool                                         ... will produce trig_cool.db with cool db instance CONDBR2 and infinite IOV\n";
   o << "  -o cool 200000                                  ... will produce trig_cool.db with cool db instance CONDBR2 and run number 200000\n";
   o << "  -o cool test [200000]                           ... will produce trig_cool_test.db with cool db instance CONDBR2 [and run number 200000]\n";
@@ -111,7 +115,7 @@ void printhelp(std::ostream & o, std::ostream& (*lineend) ( std::ostream& os ))
 
 class JobConfig {
 public:
-   enum Format { UNDEF=0x00, DB=0x01, COOL=0x02, XML=0x04 };
+   enum Format { UNDEF=0x00, DB=0x01, COOL=0x02, XML=0x04, JSON=0x08 };
    enum ETriggerLevel { LVL1 = 0, HLT = 1, NONE = 2 };
    ~JobConfig(){}
    JobConfig() {}
@@ -127,6 +131,7 @@ public:
    string       l1xmlOutFile { "LVL1Config.xml" };
    string       l1topoOutFile { "L1TopoConfig.xml" };
    string       hltxmlOutFile { "HLTConfig.xml" };
+   string       hltJsonOutFile { "HLTMenu.json" };
    string       coolInputConnection { "" };
    string       coolOutputConnection { "" };
    unsigned int coolOutputRunNr { 0 };
@@ -210,9 +215,9 @@ JobConfig::parseProgramOptions(int argc, char* argv[]) {
       } else {
          if(currentPar == "i" || currentPar == "input")     { inpar.push_back(stripped); continue; }
          if(currentPar == "2" || currentPar == "comp")      { inpar2.push_back(stripped); continue; }
-         if(currentPar == "o" || currentPar == "output")    { 
-            if(outpar.size()==0 && stripped != "xml" && stripped != "cool") {
-               error.push_back("Unknown output type: " + stripped + ". Must be either xml or cool, optionally followed by a base string for the output file name");
+         if(currentPar == "o" || currentPar == "output")    {
+            if(outpar.size()==0 && stripped != "xml" && stripped != "r3json" && stripped != "cool") {
+               error.push_back("Unknown output type: " + stripped + ". Must be either xml, json or cool, optionally followed by a base string for the output file name");
             } else {
                outpar.push_back(stripped);
             }
@@ -228,7 +233,7 @@ JobConfig::parseProgramOptions(int argc, char* argv[]) {
             else if("ERROR" == stripped ) { outputlevel = MSGTC::ERROR; }
             else if("FATAL" == stripped ) { outputlevel = MSGTC::FATAL; }
             else if("ALWAYS" == stripped ) { outputlevel = MSGTC::ALWAYS; }
-            else { 
+            else {
                error.push_back("Unknown output level: " + stripped + ". Must be one of NIL, VERBOSE, DEBUG, INFO, WARNING, ERROR, FATAL, ALWAYS");
             }
             continue;
@@ -242,8 +247,8 @@ JobConfig::parseProgramOptions(int argc, char* argv[]) {
       error.push_back("No input specified, use '-i' option");
 
 
-   // parse the input 
-   if( (inpar.size()==1 && endswith(inpar[0],".xml")) || 
+   // parse the input
+   if( (inpar.size()==1 && endswith(inpar[0],".xml")) ||
        (inpar.size()==2 && endswith(inpar[0],".xml") && endswith(inpar[1],".xml")) ) {
       input = XML;
    } else if( inpar.size()>=1 && inpar[0].find(".db") != string::npos ) {
@@ -276,15 +281,17 @@ JobConfig::parseProgramOptions(int argc, char* argv[]) {
       };
    }
 
-   if( (inpar2.size()==1 && endswith(inpar2[0],".xml")) || 
+   if( (inpar2.size()==1 && endswith(inpar2[0],".xml")) ||
        (inpar2.size()==2 && endswith(inpar2[1],".xml") && endswith(inpar2[1],".xml")) ) {
       input2 = XML;
    }
 
    // parse the output
    for(const string& o: outpar) {
-      if ( o=="xml") { 
+      if ( o=="xml") {
          output |= XML;
+      } else if ( o=="r3json" ) {
+         output |= JSON;
       } else if ( o=="cool" ) {
          output |= COOL;
       } else if ( isUnsignedInteger(o) ) {
@@ -312,6 +319,7 @@ JobConfig::parseProgramOptions(int argc, char* argv[]) {
          l1xmlOutFile  = "LVL1config_" + outBase + ".xml";
          l1topoOutFile = "L1TopoConfig_" + outBase + ".xml";
          hltxmlOutFile = "HLTconfig_" + outBase + ".xml";
+         hltJsonOutFile = "HLTMenu_" + outBase + ".json";
       }
    }
 
@@ -319,17 +327,17 @@ JobConfig::parseProgramOptions(int argc, char* argv[]) {
 
 
 string JobConfig::CheckForCompleteSetup() {
-   if(input==UNDEF) 
+   if(input==UNDEF)
       return "Use argument '-i' to specify input source and check that the input is specified correctly";
    if( input == DB ) {
-      if( db == "" ) 
-         return "No TriggerDB connection string specified";      
+      if( db == "" )
+         return "No TriggerDB connection string specified";
       if( keys.size()==0 )
          return "No configuration key(s) specified";
    }
    if( input2 == DB ) {
-      if( db2 == "" ) 
-         return "No TriggerDB connection string specified for comparison, use option '--db2'";      
+      if( db2 == "" )
+         return "No TriggerDB connection string specified for comparison, use option '--db2'";
       if( keys2.size()==0 )
          return "No smk specified for comparison, use option '--dbsmk2'";
    }
@@ -356,7 +364,7 @@ JobConfig::PrintSetup(std::ostream & log, std::ostream& (*lineend) ( std::ostrea
    if( output != UNDEF ) {
       log << "   Output              : ";
       if( output&XML )  log << l1xmlOutFile << ", " << l1topoOutFile << ", " << hltxmlOutFile;
-      if( output&COOL ) { 
+      if( output&COOL ) {
          log << coolOutputConnection;
          if(coolOutputRunNr==0) { log << ", infinite IOV"; } else { log << ", run nr " << coolOutputRunNr; }
       }
@@ -370,7 +378,7 @@ JobConfig::PrintSetup(std::ostream & log, std::ostream& (*lineend) ( std::ostrea
 
 
 int main( int argc, char* argv[] ) {
-  
+
    /***************************************
     *
     * Getting the program parameters
@@ -407,9 +415,9 @@ int main( int argc, char* argv[] ) {
       if(errf) errf->close();
       return 1;
    }
-  
+
    gConfig.PrintSetup(log, lineend);
-  
+
 
    /***************************************
     *
@@ -421,7 +429,7 @@ int main( int argc, char* argv[] ) {
    HLTFrame* hltFrame(0);
    TXC::L1TopoMenu* l1tm = nullptr;
    uint smk(0),l1psk(0),hltpsk(0),bgsk(0), mck{0};
-   string release; 
+   string release;
 
 
    /*------------------
@@ -430,7 +438,7 @@ int main( int argc, char* argv[] ) {
    if (gConfig.input == JobConfig::DB) {
       unique_ptr<StorageMgr> sm(new StorageMgr(gConfig.db, "", "", log));
 
-      // Loading L1 topo 
+      // Loading L1 topo
       //log << "Retrieving Lvl1 Topo configuration" << lineend;
       l1tm  = new TXC::L1TopoMenu();
       l1tm->setSMK(gConfig.getKey(0));
@@ -469,9 +477,9 @@ int main( int argc, char* argv[] ) {
          mckloader->loadReleaseLinkedToMCK(mck,release);
         log << "Loaded MCK " << mck << " (active for SMK " << smk << " and release " << release << ")" << endl;
       } else {
-	log << "Did not load MCK from DB as MCK is 0 or no MCK is linked";
+         log << "Did not load MCK from DB as MCK is 0 or no MCK is linked";
       }
-      
+
 
    }
    /*------------------
@@ -522,7 +530,7 @@ int main( int argc, char* argv[] ) {
       PrescaleSet ps;
       coolWriter->readL1PrescalePayload( runnumber, lb, l1psk, ps);
       ctpc->setPrescaleSet( ps );
-      
+
       //       log << "L1 PSK 0  " << ps.id() << lineend;
       //       log << "L1 PSK 1  " << l1psk << lineend;
       //       log << "L1 PSK 2  " << ctpc->prescaleSet().id() << lineend;
@@ -561,7 +569,7 @@ int main( int argc, char* argv[] ) {
    if (gConfig.input2 != JobConfig::UNDEF) {
       CTPConfig* ctpc2(0);
       HLTFrame* hltFrame2(0);
-      
+
       /*------------------
        * from DB
        *-----------------*/
@@ -578,7 +586,7 @@ int main( int argc, char* argv[] ) {
          sm->masterTableLoader().load(*ctpc2);
          ctpc2->muCTPi().setSMK( gConfig.getKey2(0) );
          sm->masterTableLoader().load(ctpc2->muCTPi());
-      
+
          log << "Retrieving HLT menu configuration and prescale set from the TriggerDB for comparison" << lineend;
          hltFrame2 = new HLTFrame();
          hltFrame2->setSMK( gConfig.getKey2(0) );
@@ -594,7 +602,7 @@ int main( int argc, char* argv[] ) {
          unique_ptr<XMLStorageMgr> sm( gConfig.inpar2.size()==1 ?
                                        new XMLStorageMgr( { xmlpathresolve(gConfig.inpar2[0]) } ) :
                                        new XMLStorageMgr( { xmlpathresolve(gConfig.inpar2[0]),xmlpathresolve(gConfig.inpar2[1]) } ) );
-         
+
          if(sm->hasLVL1()) {
             ctpc2 = new CTPConfig();
             log << "Retrieving Lvl1 CTP configuration from " << sm->m_xmlL1File << lineend;
@@ -611,7 +619,7 @@ int main( int argc, char* argv[] ) {
             sm->hltFrameLoader().load( *hltFrame2 );
             log << "Done reading " << sm->m_xmlHLTFile << lineend;
          }
-      
+
       } else if (gConfig.input2 == JobConfig::COOL) {
          /*------------------
           * from COOL
@@ -665,6 +673,17 @@ int main( int argc, char* argv[] ) {
       }
 
    }
+   if ( (gConfig.output & JobConfig::JSON) != 0 ) {
+      /*------------------
+       * to JSON
+       *-----------------*/
+      // TODO add L1 menu
+      if(hltFrame) {
+         convertRun2HLTtoRun3(hltFrame, gConfig.hltJsonOutFile);
+      }
+
+   }
+
    if ( (gConfig.output & JobConfig::COOL) != 0 ) {
       /*------------------
        * to COOL
@@ -677,16 +696,16 @@ int main( int argc, char* argv[] ) {
       string info("");
       unsigned int runNr = gConfig.coolOutputRunNr;
       if(runNr == 0) { runNr = 0x80000000; } // infinite range
-      
+
       if(ctpc)
          coolWriter->writeL1Payload(runNr, *ctpc);
       try{
 	if(hltFrame)
 	  coolWriter->writeHLTPayload(runNr, *hltFrame, configSource);
-      }   
+      }
       catch(const cool::StorageTypeStringTooLong& e){
-	log << "FATAL: Unable to write data to COOL";
-	exit(1);
+	      log << "FATAL: Unable to write data to COOL";
+      	exit(1);
       }
        if(mck)
          coolWriter->writeMCKPayload(runNr, mck, release, info);
@@ -696,12 +715,12 @@ int main( int argc, char* argv[] ) {
    delete hltFrame;
    if(l1tm!=nullptr)
       delete l1tm;
-    
+
    if( gConfig.jo ) {
 
       JobOptionTable jot;
       unique_ptr<IStorageMgr> sm( new StorageMgr(gConfig.db,"","",log) );
-      
+
       log << "TrigConfReadWrite:                  Retrieving JO from the TriggerDB" << lineend;
       jot.setSMK( gConfig.getKey(0) );
       jot.setTriggerLevel(0); // L2
@@ -715,4 +734,3 @@ int main( int argc, char* argv[] ) {
    }
 
 }
-
diff --git a/Trigger/TrigConfiguration/TrigConfStorage/src/test/Run2toRun3Converters.cxx b/Trigger/TrigConfiguration/TrigConfStorage/src/test/Run2toRun3Converters.cxx
new file mode 100644
index 000000000000..869d42f9659c
--- /dev/null
+++ b/Trigger/TrigConfiguration/TrigConfStorage/src/test/Run2toRun3Converters.cxx
@@ -0,0 +1,120 @@
+#include "TrigConfData/HLTMenu.h"
+#include "TrigConfData/DataStructure.h"
+#include "TrigCompositeUtils/HLTIdentifier.h"
+#include <boost/property_tree/json_parser.hpp>
+#include "TrigConfHLTData/HLTFrame.h"
+#include "TrigConfHLTData/HLTChain.h"
+#include "TrigConfHLTData/HLTStreamTag.h"
+#include "TrigConfHLTData/HLTSignature.h"
+#include "TrigConfHLTData/HLTTriggerElement.h"
+#include "TrigConfIO/JsonFileWriterHLT.h"
+
+template<typename COLL>
+boost::property_tree::ptree asArray( const COLL& data) {
+   using ptree = boost::property_tree::ptree;
+   ptree array;
+   for ( const auto& el: data ) {
+      ptree one;
+      one.put("", el);
+      array.push_back(std::make_pair("", one));
+   }
+   return array;
+}
+
+std::vector<int> legMult(const TrigConf::HLTChain* cptr) {
+   std::vector<int> maxMult;
+   for ( const auto sig: cptr->signatures() ) {
+      std::vector<std::string> names;
+      std::vector<int> mult;
+      for ( const auto te: sig->outputTEs() ) {
+         auto found = std::find(names.begin(), names.end(), te->name());
+         if ( found == names.end() ) {
+            names.push_back(te->name());
+            mult.push_back(1);
+         } else {
+            int index = std::find(names.begin(), names.end(), te->name()) - names.begin();
+            mult[index]++;
+         }
+      }
+      if ( maxMult.size() < mult.size() ) {
+         maxMult = mult;
+      }  
+   }
+   return maxMult;
+}
+
+std::vector<std::string> l1thresholds(const TrigConf::HLTFrame* frame, const TrigConf::HLTChain* cptr) {
+   std::set<std::string> names;
+   for ( const auto sig: cptr->signatures() ) {
+      for ( const auto te: sig->outputTEs() ) {
+         auto sequence = frame->sequences().getSequence(te->name());
+         for ( const auto inTE: sequence->inputTEs() ) {
+            std::cout << "IN TE" << inTE->name()  << " \n";
+            if ( not ( inTE->name().find("L2_") == 0 or inTE->name().find("EF_") == 0 or inTE->name().find("HLT_") == 0 ) ) {
+               names.insert(inTE->name());
+               std::cout << "L1 is " << inTE->name()  << " \n";
+            }
+         }
+      }
+   }
+   return std::vector<std::string>( names.begin(), names.end() );
+}
+
+
+void convertRun2HLTtoRun3(const TrigConf::HLTFrame* frame, const std::string& filename) {
+   using ptree = boost::property_tree::ptree;
+   ptree top;
+   top.put("filetype", "hltmenu");
+   top.put("name", frame->name());
+   ptree pChains;
+
+   std::map<std::string, const TrigConf::HLTStreamTag*> allStreams;
+
+   for ( auto cptr : frame->chains() ) {
+      ptree pChain;
+      pChain.put("counter", cptr->chain_counter());
+      pChain.put("nameHash", cptr->chain_hash_id());
+      pChain.put("l1item", cptr->lower_chain_name());
+      pChain.add_child("l1thresholds", asArray(l1thresholds(frame, cptr)));
+      pChain.add_child("legMultiplicities", asArray(legMult(cptr)) );
+      pChain.add_child("sequencers", asArray(std::vector<std::string>({"missing"})));
+      
+      std::vector<std::string> strNames;
+      for ( const auto st: cptr->streams()) {
+         strNames.push_back(st->stream());
+         allStreams[st->stream()] = st;
+      }
+      pChain.add_child("streams", asArray(strNames));
+
+      pChain.add_child("groups", asArray(cptr->groups()));
+
+      pChains.push_back(std::make_pair(cptr->chain_name(), pChain));
+   }
+   ptree pStreams;
+   for ( auto [sname, stream]: allStreams ) {
+      ptree pStream;
+      pStream.put("name", sname);
+      pStream.put("type", stream->type());
+      pStream.put("obeyLB", stream->obeyLB());
+      pStream.put("forceFullEventBuilding", true);  // TODO understand how to get this information from old menu    
+      pStreams.push_back(std::make_pair(sname, pStream));
+   }
+
+   top.add_child("chains", pChains);
+
+   top.add_child("streams", pStreams);
+   ptree pSequencers;
+   pSequencers.add_child("missing", asArray(std::vector<std::string>({""})));
+   top.add_child("sequencers", pSequencers);
+
+   std::stringstream ss;
+   boost::property_tree::json_parser::write_json(ss, top);
+//   std::cout << ss.str() << std::endl;
+
+
+  TrigConf::HLTMenu menu(std::move(top));
+  TrigConf::JsonFileWriterHLT writer;
+  std::cout << "Saving file: " << filename << std::endl;
+  writer.writeJsonFile(filename, menu);
+
+}
\ No newline at end of file
diff --git a/Trigger/TrigConfiguration/TrigConfStorage/src/test/Run2toRun3Converters.h b/Trigger/TrigConfiguration/TrigConfStorage/src/test/Run2toRun3Converters.h
new file mode 100644
index 000000000000..4a7946faecee
--- /dev/null
+++ b/Trigger/TrigConfiguration/TrigConfStorage/src/test/Run2toRun3Converters.h
@@ -0,0 +1,7 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "TrigConfData/HLTMenu.h"
+#include "TrigConfHLTData/HLTFrame.h"
+void convertRun2HLTtoRun3(const TrigConf::HLTFrame* frame, const std::string& filename);
\ No newline at end of file
-- 
GitLab


From 3ff7404ea3cd1862feb817dc37745681f06a1c46 Mon Sep 17 00:00:00 2001
From: christos <christos@cern.ch>
Date: Tue, 15 Dec 2020 15:14:11 +0100
Subject: [PATCH 034/225] Egamma Super Cluster Builders pass the EventContext
 to the ElementLinks

---
 .../egamma/egammaAlgs/src/electronSuperClusterBuilder.cxx       | 2 +-
 .../egamma/egammaAlgs/src/photonSuperClusterBuilder.cxx         | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/Reconstruction/egamma/egammaAlgs/src/electronSuperClusterBuilder.cxx b/Reconstruction/egamma/egammaAlgs/src/electronSuperClusterBuilder.cxx
index 0ba40bd73d30..80dee18d0c82 100644
--- a/Reconstruction/egamma/egammaAlgs/src/electronSuperClusterBuilder.cxx
+++ b/Reconstruction/egamma/egammaAlgs/src/electronSuperClusterBuilder.cxx
@@ -173,7 +173,7 @@ electronSuperClusterBuilder::execute(const EventContext& ctx) const
     // Push back the new cluster into the output container.
     outputClusterContainer->push_back(std::move(newClus));
     ElementLink<xAOD::CaloClusterContainer> clusterLink(*outputClusterContainer,
-                                                        outputClusterContainer->size() - 1);
+                                                        outputClusterContainer->size() - 1,ctx);
     std::vector<ElementLink<xAOD::CaloClusterContainer>> elClusters{ clusterLink };
 
     // Make egammaRec object, and push it back into output container.
diff --git a/Reconstruction/egamma/egammaAlgs/src/photonSuperClusterBuilder.cxx b/Reconstruction/egamma/egammaAlgs/src/photonSuperClusterBuilder.cxx
index 486312931960..69acee220f30 100644
--- a/Reconstruction/egamma/egammaAlgs/src/photonSuperClusterBuilder.cxx
+++ b/Reconstruction/egamma/egammaAlgs/src/photonSuperClusterBuilder.cxx
@@ -162,7 +162,7 @@ photonSuperClusterBuilder::execute(const EventContext& ctx) const
 
     // Add the cluster link to the super cluster
     ElementLink<xAOD::CaloClusterContainer> clusterLink(*outputClusterContainer,
-                                                        outputClusterContainer->size() - 1);
+                                                        outputClusterContainer->size() - 1,ctx);
     std::vector<ElementLink<xAOD::CaloClusterContainer>> phCluster{ clusterLink };
 
     ///////////////////////////////////////////////////////
-- 
GitLab


From 7b4ecb5736e99125cb2ff98a1b159273fa5e5dfc Mon Sep 17 00:00:00 2001
From: Tulay Cuhadar Donszelmann <tulay.cuhadar.donszelmann@cern.ch>
Date: Tue, 15 Dec 2020 14:16:45 +0000
Subject: [PATCH 035/225] Update TCT MP/MT ART tests to run in 8-core machine

---
 Tools/Tier0ChainTests/test/test_q220_mp.sh | 1 +
 Tools/Tier0ChainTests/test/test_q220_mt.sh | 5 +----
 Tools/Tier0ChainTests/test/test_q221_mp.sh | 1 +
 Tools/Tier0ChainTests/test/test_q221_mt.sh | 5 +----
 Tools/Tier0ChainTests/test/test_q223_mp.sh | 1 +
 Tools/Tier0ChainTests/test/test_q223_mt.sh | 5 +----
 Tools/Tier0ChainTests/test/test_q431_mp.sh | 1 +
 Tools/Tier0ChainTests/test/test_q431_mt.sh | 5 +----
 Tools/Tier0ChainTests/test/test_q441_mp.sh | 1 +
 Tools/Tier0ChainTests/test/test_q441_mt.sh | 1 +
 10 files changed, 10 insertions(+), 16 deletions(-)

diff --git a/Tools/Tier0ChainTests/test/test_q220_mp.sh b/Tools/Tier0ChainTests/test/test_q220_mp.sh
index 0ab3fea359cd..b404fc660651 100755
--- a/Tools/Tier0ChainTests/test/test_q220_mp.sh
+++ b/Tools/Tier0ChainTests/test/test_q220_mp.sh
@@ -7,6 +7,7 @@
 # art-include: master/Athena
 # art-include: 21.3/Athena
 # art-include: 21.9/Athena
+# art-athena-mt: 8
 
 Reco_tf.py --AMI=q220 --athenaopts='--nprocs=2' --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --imf False
 echo "art-result: $?"
diff --git a/Tools/Tier0ChainTests/test/test_q220_mt.sh b/Tools/Tier0ChainTests/test/test_q220_mt.sh
index 8d00ae6d8a2c..78d87f9cb3f1 100755
--- a/Tools/Tier0ChainTests/test/test_q220_mt.sh
+++ b/Tools/Tier0ChainTests/test/test_q220_mt.sh
@@ -2,11 +2,8 @@
 #
 # art-description: RecoTrf
 # art-type: grid
-# art-include: 21.0/Athena
-# art-include: 21.0-TrigMC/Athena
 # art-include: master/Athena
-# art-include: 21.3/Athena
-# art-include: 21.9/Athena
+# art-athena-mt: 8
 
 Reco_tf.py --AMI=q220 --athenaopts='--threads=1' --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --imf False
 echo "art-result: $?"
diff --git a/Tools/Tier0ChainTests/test/test_q221_mp.sh b/Tools/Tier0ChainTests/test/test_q221_mp.sh
index 679fcf87c8f0..a2e3ba9f6eee 100755
--- a/Tools/Tier0ChainTests/test/test_q221_mp.sh
+++ b/Tools/Tier0ChainTests/test/test_q221_mp.sh
@@ -7,6 +7,7 @@
 # art-include: master/Athena
 # art-include: 21.3/Athena
 # art-include: 21.9/Athena
+# art-athena-mt: 8
 
 Reco_tf.py --AMI=q221 --athenaopts='--nprocs=2' --outputRDOFile=myRDO.pool.root --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --imf False  --preExec="all:from IOVDbSvc.CondDB import conddb; conddb.addOverride('/PIXEL/PixMapOverlay','PixMapOverlay-SIM-MC16-000-03');" 
 echo "art-result: $? Reco"
diff --git a/Tools/Tier0ChainTests/test/test_q221_mt.sh b/Tools/Tier0ChainTests/test/test_q221_mt.sh
index 76b3d511b6da..74052fae96f1 100755
--- a/Tools/Tier0ChainTests/test/test_q221_mt.sh
+++ b/Tools/Tier0ChainTests/test/test_q221_mt.sh
@@ -2,11 +2,8 @@
 #
 # art-description: RecoTrf
 # art-type: grid
-# art-include: 21.0/Athena
-# art-include: 21.0-TrigMC/Athena
 # art-include: master/Athena
-# art-include: 21.3/Athena
-# art-include: 21.9/Athena
+# art-athena-mt: 8
 
 Reco_tf.py --AMI=q221 --athenaopts='--threads=1' --outputRDOFile=myRDO.pool.root --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --imf False  --preExec="all:from IOVDbSvc.CondDB import conddb; conddb.addOverride('/PIXEL/PixMapOverlay','PixMapOverlay-SIM-MC16-000-03');"
 echo "art-result: $? Reco"
diff --git a/Tools/Tier0ChainTests/test/test_q223_mp.sh b/Tools/Tier0ChainTests/test/test_q223_mp.sh
index b61face0f6eb..74cf91e960f0 100755
--- a/Tools/Tier0ChainTests/test/test_q223_mp.sh
+++ b/Tools/Tier0ChainTests/test/test_q223_mp.sh
@@ -7,6 +7,7 @@
 # art-include: master/Athena
 # art-include: 21.3/Athena
 # art-include: 21.9/Athena
+# art-athena-mt: 8
 
 Reco_tf.py --AMI=q223 --athenaopts='--nprocs=2' --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --imf False
 echo "art-result: $? Reco"
diff --git a/Tools/Tier0ChainTests/test/test_q223_mt.sh b/Tools/Tier0ChainTests/test/test_q223_mt.sh
index 15d69d1b0f57..43dbbda69573 100755
--- a/Tools/Tier0ChainTests/test/test_q223_mt.sh
+++ b/Tools/Tier0ChainTests/test/test_q223_mt.sh
@@ -2,11 +2,8 @@
 #
 # art-description: RecoTrf
 # art-type: grid
-# art-include: 21.0/Athena
-# art-include: 21.0-TrigMC/Athena
 # art-include: master/Athena
-# art-include: 21.3/Athena
-# art-include: 21.9/Athena
+# art-athena-mt: 8
 
 Reco_tf.py --AMI=q223 --athenaopts='--threads=1' --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --imf False
 echo "art-result: $? Reco"
diff --git a/Tools/Tier0ChainTests/test/test_q431_mp.sh b/Tools/Tier0ChainTests/test/test_q431_mp.sh
index c3682da02683..bafb7fa6b404 100755
--- a/Tools/Tier0ChainTests/test/test_q431_mp.sh
+++ b/Tools/Tier0ChainTests/test/test_q431_mp.sh
@@ -7,6 +7,7 @@
 # art-include: master/Athena
 # art-include: 21.3/Athena
 # art-include: 21.9/Athena
+# art-athena-mt: 8
 
 Reco_tf.py --AMI=q431 --athenaopts='--nprocs=2' --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --imf False --maxEvents=1000
 echo "art-result: $? Reco"
diff --git a/Tools/Tier0ChainTests/test/test_q431_mt.sh b/Tools/Tier0ChainTests/test/test_q431_mt.sh
index a755a1d7b1f1..a4de91f041ac 100755
--- a/Tools/Tier0ChainTests/test/test_q431_mt.sh
+++ b/Tools/Tier0ChainTests/test/test_q431_mt.sh
@@ -2,11 +2,8 @@
 #
 # art-description: RecoTrf
 # art-type: grid
-# art-include: 21.0/Athena
-# art-include: 21.0-TrigMC/Athena
 # art-include: master/Athena
-# art-include: 21.3/Athena
-# art-include: 21.9/Athena
+# art-athena-mt: 8
 
 Reco_tf.py --AMI=q431 --athenaopts='--threads=2' --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --imf False --maxEvents=1000
 echo "art-result: $? Reco"
diff --git a/Tools/Tier0ChainTests/test/test_q441_mp.sh b/Tools/Tier0ChainTests/test/test_q441_mp.sh
index 10a25f938818..a3083fb141d0 100755
--- a/Tools/Tier0ChainTests/test/test_q441_mp.sh
+++ b/Tools/Tier0ChainTests/test/test_q441_mp.sh
@@ -3,6 +3,7 @@
 # art-description: RecoTrf
 # art-type: grid
 # art-include: master/Athena
+# art-athena-mt: 8
 
 Reco_tf.py --AMI=q441 --athenaopts='--nprocs=2' --inputHITSFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/q441/22.0/HITS.12560240._000299.pool.root.1 --inputRDO_BKGFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/q441/22.0/RDO.17190395._000013.pool.root.1 --maxEvents=25 --outputAODFile=q441.AOD.pool.root --outputESDFile=q441.ESD.pool.root
 
diff --git a/Tools/Tier0ChainTests/test/test_q441_mt.sh b/Tools/Tier0ChainTests/test/test_q441_mt.sh
index d78498e66889..64ed500504aa 100755
--- a/Tools/Tier0ChainTests/test/test_q441_mt.sh
+++ b/Tools/Tier0ChainTests/test/test_q441_mt.sh
@@ -3,6 +3,7 @@
 # art-description: RecoTrf
 # art-type: grid
 # art-include: master/Athena
+# art-athena-mt: 8
 
 Reco_tf.py --AMI=q441 --athenaopts='--threads=1' --inputHITSFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/q441/22.0/HITS.12560240._000299.pool.root.1 --inputRDO_BKGFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/q441/22.0/RDO.17190395._000013.pool.root.1 --maxEvents=25 --outputAODFile=q441.AOD.pool.root --outputESDFile=q441.ESD.pool.root
 
-- 
GitLab


From 8c31c3090781690540d1f423b3326ff61ca58936 Mon Sep 17 00:00:00 2001
From: Tim Martin <Tim.Martin@cern.ch>
Date: Tue, 15 Dec 2020 15:24:37 +0100
Subject: [PATCH 036/225] Change InputMaker merging code to be typeless

---
 .../DecisionHandling/InputMakerBase.h         |  5 +-
 .../DecisionHandling/InputMakerBase.icc       | 40 ----------------
 .../DecisionHandling/src/InputMakerBase.cxx   | 46 ++++++++++++++++++-
 3 files changed, 45 insertions(+), 46 deletions(-)
 delete mode 100644 Trigger/TrigSteer/DecisionHandling/DecisionHandling/InputMakerBase.icc

diff --git a/Trigger/TrigSteer/DecisionHandling/DecisionHandling/InputMakerBase.h b/Trigger/TrigSteer/DecisionHandling/DecisionHandling/InputMakerBase.h
index 756d4de76031..03b6c3775b86 100644
--- a/Trigger/TrigSteer/DecisionHandling/DecisionHandling/InputMakerBase.h
+++ b/Trigger/TrigSteer/DecisionHandling/DecisionHandling/InputMakerBase.h
@@ -47,8 +47,7 @@ This is a base class for HLT InputMakers to reduce boilerplate and enforce the c
   /// does the standard handling of input decisions: read from handles with all the checks, create merged output handles and link them, copies links and return outputHandles
   StatusCode decisionInputToOutput(const EventContext& context, SG::WriteHandle<TrigCompositeUtils::DecisionContainer>& outputHandle) const;
 
-  /// Checks for merge-able Decision objects coming from N upstream filters. Check based on stored element link in typed CONTAINER with 'linkNameToMatch'
-  template<typename CONTAINER>
+  /// Checks for merge-able Decision objects coming from N upstream filters. Check based on most-recent element link with name 'linkNameToMatch'. Works for any link type.
   size_t matchDecision(const TrigCompositeUtils::DecisionContainer* outDecisions, 
     const TrigCompositeUtils::Decision* toMatch, 
     const std::string& linkNameToMatch) const;
@@ -68,6 +67,4 @@ This is a base class for HLT InputMakers to reduce boilerplate and enforce the c
   
 };
 
-#include "InputMakerBase.icc"
-
 #endif // DECISIONHANDLING_INPUTMAKERBASE_H
diff --git a/Trigger/TrigSteer/DecisionHandling/DecisionHandling/InputMakerBase.icc b/Trigger/TrigSteer/DecisionHandling/DecisionHandling/InputMakerBase.icc
deleted file mode 100644
index 496914524d53..000000000000
--- a/Trigger/TrigSteer/DecisionHandling/DecisionHandling/InputMakerBase.icc
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-*/
-
-template<typename CONTAINER>
-size_t InputMakerBase::matchDecision(const TrigCompositeUtils::DecisionContainer* outDecisions, 
-  const TrigCompositeUtils::Decision* toMatch, 
-  const std::string& linkNameToMatch) const
-{
-  const std::vector<TrigCompositeUtils::LinkInfo<CONTAINER>> myObject = TrigCompositeUtils::findLinks<CONTAINER>(toMatch, linkNameToMatch, TrigDefs::lastFeatureOfType);
-  
-  if (myObject.size() != 1) {
-    ATH_MSG_ERROR("InputMakerBase::matchDecision Did not locate exactly one object of type '" << ClassID_traits<CONTAINER>::typeName() << "' having searched for a link named '" << linkNameToMatch 
-      << "', found " << myObject.size() << ". Unable to match this Decision object.");
-    for (const auto& li : myObject) {
-      ATH_MSG_ERROR("  -- " << li.link.dataID() << ":" << li.link.index() << ". Dump:" << *(li.source)); 
-    }
-    return std::numeric_limits<std::size_t>::max();
-  }
-
-  // Look for match
-  for (size_t index = 0; index < outDecisions->size(); ++index) {
-    const TrigCompositeUtils::Decision* checkDecision = outDecisions->at(index);
-    if (checkDecision == nullptr) {
-      ATH_MSG_ERROR("Failed to get Decision object " << index << " of " << outDecisions->size());
-      return std::numeric_limits<std::size_t>::max();
-    }
-    const std::vector<TrigCompositeUtils::LinkInfo<CONTAINER>> checkObject = TrigCompositeUtils::findLinks<CONTAINER>(checkDecision, linkNameToMatch, TrigDefs::lastFeatureOfType);
-    if (checkObject.size() != 1) {
-      ATH_MSG_ERROR("Logic error. Expect myObject().size() == 1 and checkObject.size() == 1."
-        << " But have checkObject.size() = " << checkObject.size() << ". Unable to match this Decision object.");
-      return std::numeric_limits<std::size_t>::max();
-    }
-    if (myObject.at(0).link == checkObject.at(0).link) {
-      return index;
-    }
-  }
-
-  return std::numeric_limits<std::size_t>::max();
-}
diff --git a/Trigger/TrigSteer/DecisionHandling/src/InputMakerBase.cxx b/Trigger/TrigSteer/DecisionHandling/src/InputMakerBase.cxx
index 8b445be045ac..afebd6200261 100644
--- a/Trigger/TrigSteer/DecisionHandling/src/InputMakerBase.cxx
+++ b/Trigger/TrigSteer/DecisionHandling/src/InputMakerBase.cxx
@@ -94,13 +94,55 @@ StatusCode InputMakerBase::decisionInputToOutput(const EventContext& context, SG
 
 bool InputMakerBase::matchInCollection(const DecisionContainer* toMatchAgainst, const Decision* toMatch, size_t& matchIndex) const {
   if ( m_mergeUsingFeature ) {
-    matchIndex = matchDecision<xAOD::IParticleContainer>(toMatchAgainst, toMatch, featureString());
+    matchIndex = matchDecision(toMatchAgainst, toMatch, featureString());
   } else {
-    matchIndex = matchDecision<TrigRoiDescriptorCollection>(toMatchAgainst, toMatch, m_roisLink.value());
+    matchIndex = matchDecision(toMatchAgainst, toMatch, m_roisLink.value());
   }
   return (matchIndex != std::numeric_limits<std::size_t>::max());
 }
 
+size_t InputMakerBase::matchDecision(const DecisionContainer* outDecisions, const Decision* toMatch, const std::string& linkNameToMatch) const {
+  
+  std::set<const Decision*> cache; //!< Used to accelerate the recursive typelessFindLinks. Should be cleared between uses.
+  std::vector<uint32_t> keysA;
+  std::vector<uint32_t> clidsA;
+  std::vector<uint16_t> indiciesA;
+  TrigCompositeUtils::typelessfindLinks(toMatch, linkNameToMatch, keysA, clidsA, indiciesA, TrigDefs::lastFeatureOfType, &cache);
+  
+  if (keysA.size() != 1) {
+    ATH_MSG_ERROR("InputMakerBase::matchDecision Did not locate exactly one object having searched for a link named '" << linkNameToMatch 
+      << "', found " << keysA.size() << ". Unable to match this Decision object.");
+    for (size_t i = 0; i < keysA.size(); ++i) {
+      ATH_MSG_ERROR("  -- Key:" << keysA.at(i) << " Index:" << indiciesA.at(i) << " CLID:" << clidsA.at(i)); 
+    }
+    return std::numeric_limits<std::size_t>::max();
+  }
+
+  // Look for match
+  for (size_t index = 0; index < outDecisions->size(); ++index) {
+    const TrigCompositeUtils::Decision* checkDecision = outDecisions->at(index);
+    if (checkDecision == nullptr) {
+      ATH_MSG_ERROR("Failed to get Decision object " << index << " of " << outDecisions->size());
+      return std::numeric_limits<std::size_t>::max();
+    }
+    cache.clear();
+    std::vector<uint32_t> keysB;
+    std::vector<uint32_t> clidsB;
+    std::vector<uint16_t> indiciesB;
+    TrigCompositeUtils::typelessfindLinks(checkDecision, linkNameToMatch, keysB, clidsB, indiciesB, TrigDefs::lastFeatureOfType, &cache);
+    if (keysB.size() != 1) {
+      ATH_MSG_ERROR("Logic error. Expect toMatch size == 1 (confirmed) and checkObject size == 1."
+        << " But have checkObject size = " << keysB.size() << ". Unable to match this Decision object.");
+      return std::numeric_limits<std::size_t>::max();
+    }
+    if (keysA.at(0) == keysB.at(0) and clidsA.at(0) == clidsB.at(0) and indiciesA.at(0) == indiciesB.at(0)) {
+      return index;
+    }
+  }
+
+  return std::numeric_limits<std::size_t>::max();
+}
+
 
 void InputMakerBase::debugPrintOut(const EventContext& context, SG::WriteHandle<TrigCompositeUtils::DecisionContainer>& outputHandle) const{
   size_t validInput=0;
-- 
GitLab


From e4ff1288054b79c7e1a314663dc43225e905bb80 Mon Sep 17 00:00:00 2001
From: Rafal Bielski <rafal.bielski@cern.ch>
Date: Tue, 15 Dec 2020 13:02:59 +0100
Subject: [PATCH 037/225] Disable Trigger in RecExCommon unless really needed

---
 .../share/RecExCommon_topOptions.py           | 65 ++++++++++++-------
 .../RecExConfig/python/RecAlgsFlags.py        |  4 +-
 .../share/skeleton.ESDtoAOD_tf.py             | 20 ++----
 3 files changed, 48 insertions(+), 41 deletions(-)

diff --git a/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py b/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py
index 6529e23a8e2e..9988b612aecf 100644
--- a/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py
+++ b/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py
@@ -554,42 +554,57 @@ if rec.readESD() and rec.doESD():
     rec.doTrigger=False
     recAlgs.doTrigger=False
     logRecExCommon_topOptions.info("detected re-reconstruction from ESD, will switch trigger OFF !")
-#try:
+
+# Disable Trigger output reading in MC if there is none, unless running Trigger selection algorithms
+if not globalflags.InputFormat.is_bytestream() and not recAlgs.doTrigger:
+    try:
+        from RecExConfig.ObjKeyStore import cfgKeyStore
+        from PyUtils.MetaReaderPeeker import convert_itemList
+        cfgKeyStore.addManyTypesInputFile(convert_itemList(layout='#join'))
+        # Check for Run-1, Run-2 or Run-3 Trigger content in the input file
+        if not cfgKeyStore.isInInputFile("HLT::HLTResult", "HLTResult_EF") \
+                and not cfgKeyStore.isInInputFile("xAOD::TrigNavigation", "TrigNavigation") \
+                and not cfgKeyStore.isInInputFile("xAOD::TrigCompositeContainer", "HLTNav_Summary"):
+            logRecExCommon_topOptions.info('Disabled rec.doTrigger because recAlgs.doTrigger=False and there is no Trigger content in the input file')
+            rec.doTrigger = False
+    except Exception:
+        logRecExCommon_topOptions.warning('Failed to check input file for Trigger content, leaving rec.doTrigger value unchanged (%s)', rec.doTrigger)
+
 if rec.doTrigger:
-    if globalflags.DataSource() == 'data'and globalflags.InputFormat == 'bytestream':
+    if globalflags.DataSource() == 'data' and globalflags.InputFormat == 'bytestream':
         try:
             include("TriggerJobOpts/BStoESD_Tier0_HLTConfig_jobOptions.py")
         except Exception:
             treatException("Could not import TriggerJobOpts/BStoESD_Tier0_HLTConfig_jobOptions.py . Switching trigger off !" )
-            recAlgs.doTrigger=False
+            rec.doTrigger = recAlgs.doTrigger = False
     else:
         try:
             from TriggerJobOpts.TriggerGetter import TriggerGetter
             triggerGetter = TriggerGetter()
         except Exception:
             treatException("Could not import TriggerJobOpts.TriggerGetter . Switched off !" )
-            recAlgs.doTrigger=False
-
-# Run-3 Trigger Outputs: Don't run any trigger - only pass the HLT contents from ESD to AOD
-if rec.readESD() and rec.doAOD():
-    from AthenaConfiguration.AllConfigFlags import ConfigFlags
-    # The simplest protection in case ConfigFlags.Input.Files is not set, doesn't cover all cases:
-    if ConfigFlags.Input.Files == ['_ATHENA_GENERIC_INPUTFILE_NAME_'] and athenaCommonFlags.FilesInput():
-        ConfigFlags.Input.Files = athenaCommonFlags.FilesInput()
-
-    if ConfigFlags.Trigger.EDMVersion == 3:
-        # Add HLT output
-        from TriggerJobOpts.HLTTriggerResultGetter import HLTTriggerResultGetter
-        hltOutput = HLTTriggerResultGetter()
-        # Add Trigger menu metadata
-        if rec.doFileMetaData():
-            from RecExConfig.ObjKeyStore import objKeyStore
-            metadataItems = [ "xAOD::TriggerMenuContainer#TriggerMenu",
-                              "xAOD::TriggerMenuAuxContainer#TriggerMenuAux." ]
-            objKeyStore.addManyTypesMetaData( metadataItems )
-        # Add L1 output (to be consistent with R2)
-        from TrigEDMConfig.TriggerEDM import getLvl1AODList
-        objKeyStore.addManyTypesStreamAOD(getLvl1AODList())
+            rec.doTrigger = recAlgs.doTrigger = False
+
+    # ESDtoAOD Run-3 Trigger Outputs: Don't run any trigger - only pass the HLT contents from ESD to AOD
+    if rec.readESD() and rec.doAOD():
+        from AthenaConfiguration.AllConfigFlags import ConfigFlags
+        # The simplest protection in case ConfigFlags.Input.Files is not set, doesn't cover all cases:
+        if ConfigFlags.Input.Files == ['_ATHENA_GENERIC_INPUTFILE_NAME_'] and athenaCommonFlags.FilesInput():
+            ConfigFlags.Input.Files = athenaCommonFlags.FilesInput()
+
+        if ConfigFlags.Trigger.EDMVersion == 3:
+            # Add HLT output
+            from TriggerJobOpts.HLTTriggerResultGetter import HLTTriggerResultGetter
+            hltOutput = HLTTriggerResultGetter()
+            # Add Trigger menu metadata
+            if rec.doFileMetaData():
+                from RecExConfig.ObjKeyStore import objKeyStore
+                metadataItems = [ "xAOD::TriggerMenuContainer#TriggerMenu",
+                                "xAOD::TriggerMenuAuxContainer#TriggerMenuAux." ]
+                objKeyStore.addManyTypesMetaData( metadataItems )
+            # Add L1 output (to be consistent with R2)
+            from TrigEDMConfig.TriggerEDM import getLvl1AODList
+            objKeyStore.addManyTypesStreamAOD(getLvl1AODList())
 
 AODFix_postTrigger()
 
diff --git a/Reconstruction/RecExample/RecExConfig/python/RecAlgsFlags.py b/Reconstruction/RecExample/RecExConfig/python/RecAlgsFlags.py
index 720352aba5d7..77ae0617c997 100755
--- a/Reconstruction/RecExample/RecExConfig/python/RecAlgsFlags.py
+++ b/Reconstruction/RecExample/RecExConfig/python/RecAlgsFlags.py
@@ -102,9 +102,11 @@ class doEgammaBremReco(JobProperty):
     StoredValue=False 
 class doTrigger(JobProperty):
     """ Switch for trigger"""
+    # TODO: Remove this flag and assume False in all client configuration
+    # once the Run-2 trigger execution is removed from release 22
     statusOn=True 
     allowedTypes=['bool']
-    StoredValue=True 
+    StoredValue=False
 class doAtlfast(JobProperty):
     """ Switch for fast simulation (but normally run at ESD->AOD stage)"""
     statusOn=True
diff --git a/Reconstruction/RecJobTransforms/share/skeleton.ESDtoAOD_tf.py b/Reconstruction/RecJobTransforms/share/skeleton.ESDtoAOD_tf.py
index 7014c91ffcc1..443fd8786897 100644
--- a/Reconstruction/RecJobTransforms/share/skeleton.ESDtoAOD_tf.py
+++ b/Reconstruction/RecJobTransforms/share/skeleton.ESDtoAOD_tf.py
@@ -52,21 +52,11 @@ if hasattr(runArgs,"outputAODFile"):
     rec.doAOD.set_Value_and_Lock( True )
     rec.doWriteAOD.set_Value_and_Lock( True ) 
     athenaCommonFlags.PoolAODOutput.set_Value_and_Lock( runArgs.outputAODFile )
-    # Begin temporary block for Run-3 Trigger outputs
-    if ConfigFlags.Trigger.EDMVersion == 3:
-        # Lock DQ configuration to prevent downstream override
-        from AthenaMonitoring.DQMonFlags import DQMonFlags
-        print('DQMonFlags override')
-        if not rec.doTrigger():
-            DQMonFlags.useTrigger.set_Value_and_Lock(False)
-        if DQMonFlags.useTrigger() and rec.doTrigger():
-            DQMonFlags.useTrigger.set_Value_and_Lock(True)
-        # Don't run any trigger - only pass the HLT contents from ESD to AOD
-        # Configure here, and extract HLT content in RecExCommon_topOptions
-        # after the rest of the job is configured
-        from RecExConfig.RecAlgsFlags import recAlgs
-        recAlgs.doTrigger.set_Value_and_Lock( False )
-        rec.doTrigger.set_Value_and_Lock( False )
+    # Lock DQ configuration to prevent downstream override
+    # RB 15/12/2020: This logic was added in !36737, not sure if still needed
+    from AthenaMonitoring.DQMonFlags import DQMonFlags
+    print('DQMonFlags.useTrigger override')
+    DQMonFlags.useTrigger.set_Value_and_Lock(rec.doTrigger() and DQMonFlags.useTrigger())
 
 if hasattr(runArgs,"outputTAGFile"):
     # should be used as outputTAGFile_e2a=myTAG.root so that it does not trigger AODtoTAG
-- 
GitLab


From 4b7d4a39702e67ac276a6f63e7c35fdb370bdc5d Mon Sep 17 00:00:00 2001
From: Rafal Bielski <rafal.bielski@cern.ch>
Date: Tue, 15 Dec 2020 13:03:11 +0100
Subject: [PATCH 038/225] Clean up Trigger configuration from incorrect
 assumptions of recAlgs.doTrigger

---
 .../TrigT2CaloCommon/python/CaloDef.py        |  4 +++-
 .../python/TrigCaloMonitoringConfig.py        |  4 +++-
 .../TriggerJobOpts/python/HLTTriggerGetter.py |  4 +++-
 .../python/HLTTriggerResultGetter.py          | 10 ++++-----
 .../python/Lvl1ResultBuilderGetter.py         |  3 +--
 .../BStoESD_Tier0_HLTConfig_jobOptions.py     | 22 +++++++++++--------
 6 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/CaloDef.py b/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/CaloDef.py
index b606da07f6fe..a0cd4ffdc044 100644
--- a/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/CaloDef.py
+++ b/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/CaloDef.py
@@ -13,7 +13,9 @@ def setMinimalCaloSetup() :
     svcMgr.TrigCaloDataAccessSvc.OutputLevel=ERROR
   if not hasattr(svcMgr,'RegSelSvcDefault'):
     from RegionSelector.RegSelSvcDefault import RegSelSvcDefault
-    svcMgr += RegSelSvcDefault()
+    regsel = RegSelSvcDefault()
+    regsel.enableCalo = True
+    svcMgr += regsel
 
 
 
diff --git a/Trigger/TrigMonitoring/TrigCaloMonitoring/python/TrigCaloMonitoringConfig.py b/Trigger/TrigMonitoring/TrigCaloMonitoring/python/TrigCaloMonitoringConfig.py
index 2351ac41e3ec..248fad1bf028 100644
--- a/Trigger/TrigMonitoring/TrigCaloMonitoring/python/TrigCaloMonitoringConfig.py
+++ b/Trigger/TrigMonitoring/TrigCaloMonitoring/python/TrigCaloMonitoringConfig.py
@@ -63,7 +63,9 @@ def HLTCaloMonitoringTool():
     from AthenaCommon.AppMgr import ServiceMgr
     if not hasattr(ServiceMgr,"RegSelSvcDefault"):
         from RegionSelector.RegSelSvcDefault import RegSelSvcDefault
-        ServiceMgr += RegSelSvcDefault()
+        regsel = RegSelSvcDefault()
+        regsel.enableCalo = True
+        ServiceMgr += regsel
 
     #HLTFullCalo = HLTCaloTool(name             = 'HLTFullCalo',
     #                                histoPathBase    = "/Trigger/HLT")
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/HLTTriggerGetter.py b/Trigger/TriggerCommon/TriggerJobOpts/python/HLTTriggerGetter.py
index a5b2806068a0..3ff97c437a6b 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/python/HLTTriggerGetter.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/HLTTriggerGetter.py
@@ -145,7 +145,9 @@ class HLTSimulationGetter(Configured):
         log.info("Loading RegionSelector")
         from AthenaCommon.AppMgr import ServiceMgr
         from RegionSelector.RegSelSvcDefault import RegSelSvcDefault
-        ServiceMgr += RegSelSvcDefault()
+        regsel = RegSelSvcDefault()
+        regsel.enableCalo = TriggerFlags.doCalo()
+        ServiceMgr += regsel
 
         # Configure the Data Preparation for Calo
         if TriggerFlags.doCalo():
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/HLTTriggerResultGetter.py b/Trigger/TriggerCommon/TriggerJobOpts/python/HLTTriggerResultGetter.py
index a7378fe50751..1fbbeb989f33 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/python/HLTTriggerResultGetter.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/HLTTriggerResultGetter.py
@@ -8,7 +8,6 @@ from AthenaCommon.GlobalFlags import globalflags
 from AthenaCommon.AppMgr import ServiceMgr
 from RecExConfig.Configured import Configured
 
-from RecExConfig.RecAlgsFlags import recAlgs
 from RecExConfig.RecFlags import rec
 
 from TrigRoiConversion.TrigRoiConversionConf import RoiWriter
@@ -305,11 +304,10 @@ class HLTTriggerResultGetter(Configured):
             xaodcnvrt = xAODConversionGetter()
             xAODContainers = xaodcnvrt.xaodlist
 
-        if recAlgs.doTrigger() or TriggerFlags.doTriggerConfigOnly():
-            if ConfigFlags.Trigger.EDMVersion <= 2:
-                tdt = TrigDecisionGetterRun2()  # noqa: F841
-            else:
-                tdt = TrigDecisionGetter()  # noqa: F841
+        if ConfigFlags.Trigger.EDMVersion <= 2 and (rec.doTrigger() or TriggerFlags.doTriggerConfigOnly()):
+            tdt = TrigDecisionGetterRun2()  # noqa: F841
+        elif ConfigFlags.Trigger.EDMVersion >= 3 and TriggerFlags.readBS():
+            tdt = TrigDecisionGetter()  # noqa: F841
 
         # Temporary hack to add Run-3 navigation to ESD and AOD
         if (rec.doESD() or rec.doAOD()) and ConfigFlags.Trigger.EDMVersion == 3:
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/Lvl1ResultBuilderGetter.py b/Trigger/TriggerCommon/TriggerJobOpts/python/Lvl1ResultBuilderGetter.py
index 510671ab213a..f5a3b362b8bb 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/python/Lvl1ResultBuilderGetter.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/Lvl1ResultBuilderGetter.py
@@ -8,7 +8,6 @@ from AthenaCommon.Include import include  # to include old style job options
 from AthenaCommon.AppMgr import theApp
 
 from RecExConfig.RecFlags  import rec
-from RecExConfig.RecAlgsFlags import recAlgs
 
 
 from RecExConfig.Configured import Configured
@@ -41,7 +40,7 @@ class Lvl1ResultBuilderGetter(Configured):
         topSequence = AlgSequence()
 
 
-        if recAlgs.doTrigger():
+        if rec.doTrigger():
             if (rec.doESD() or rec.doAOD()) and (not(rec.readAOD() or \
                                                          rec.readESD())):
                 if jobproperties.Global.InputFormat() == 'bytestream':
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/share/BStoESD_Tier0_HLTConfig_jobOptions.py b/Trigger/TriggerCommon/TriggerJobOpts/share/BStoESD_Tier0_HLTConfig_jobOptions.py
index f7245c3d1b15..1b0a6dbd1e82 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/share/BStoESD_Tier0_HLTConfig_jobOptions.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/share/BStoESD_Tier0_HLTConfig_jobOptions.py
@@ -15,6 +15,11 @@ from TriggerJobOpts.TriggerFlags import TriggerFlags as tf
 from AthenaCommon.AppMgr import ServiceMgr, ToolSvc
 from AthenaCommon.Include import include
 
+assertMsg = 'This file is meant for Trigger configuration in RAWtoESD/RAWtoALL data reconstruction.'
+assert rec.doTrigger(), assertMsg + ' Since rec.doTrigger is disabled, this file should not be included.'
+assert not recAlgs.doTrigger(), assertMsg + \
+    ' Trigger selection should not run in offline reconstruction, so recAlgs.doTrigger should be False'
+
 # First check is HLT psk is ok, if not, turn trigger off.
 if tf.configForStartup() != 'HLToffline':
     include( "TriggerJobOpts/TriggerConfigCheckHLTpsk.py" )
@@ -130,14 +135,13 @@ if rec.doTrigger():
             getattr(ToolSvc, toolName).LVL1ConfigSvc="TrigConf::TrigConfigSvc/TrigConfigSvc"
 
     #---------------------------------------------------------------------------
-    if recAlgs.doTrigger():
-        try:
-            from TriggerJobOpts.T0TriggerGetter import T0TriggerGetter
-            triggerGetter = T0TriggerGetter()
-        except Exception:
-            from AthenaCommon.Resilience import treatException
-            treatException("Could not import TriggerJobOpts.TriggerGetter . Switched off !" )
-            recAlgs.doTrigger=False
-    elif rec.doWriteBS():
+    try:
+        from TriggerJobOpts.T0TriggerGetter import T0TriggerGetter
+        triggerGetter = T0TriggerGetter()
+    except Exception:
+        from AthenaCommon.Resilience import treatException
+        treatException("Could not import TriggerJobOpts.TriggerGetter . Switched off !" )
+        recAlgs.doTrigger=False
+    if rec.doWriteBS():
         include( "ByteStreamCnvSvc/RDP_ByteStream_jobOptions.py" )
 ## end of configure the HLT config
-- 
GitLab


From a74b111234201dab4ca26e8af5290cabc5974e65 Mon Sep 17 00:00:00 2001
From: amete <serhanmete@gmail.com>
Date: Tue, 15 Dec 2020 15:46:25 +0100
Subject: [PATCH 039/225] PerfMonComps: Enable flake8

---
 .../PerfMonComps/CMakeLists.txt               |   4 +-
 .../PerfMonComps/python/DomainsRegistry.py    |   9 +-
 .../PerfMonComps/python/JobOptCfg.py          |   8 +-
 .../PerfMonComps/python/MTJobOptCfg.py        |   4 +-
 .../PerfMonComps/python/PMonSD.py             | 170 +++++++++++-------
 .../PerfMonComps/python/PerfMonFlags.py       |   8 +-
 .../PerfMonComps/python/PerfMonSerializer.py  |  23 +--
 .../PerfMonComps/python/PyComps.py            |  10 +-
 .../PerfMonComps/python/PyMonUtils.py         |  42 +++--
 .../PerfMonComps/python/PyPerfMon.py          |  77 ++++----
 .../PerfMonComps/share/FastMon.py             |   2 +
 .../PerfMonComps/share/FullMon.py             |   2 +
 .../share/PerfMonMTSvc_jobOptions.py          |   2 +
 .../share/PerfMonSvc_jobOptions.py            |   2 +
 14 files changed, 198 insertions(+), 165 deletions(-)

diff --git a/Control/PerformanceMonitoring/PerfMonComps/CMakeLists.txt b/Control/PerformanceMonitoring/PerfMonComps/CMakeLists.txt
index e2512aedb0f2..7e335590382b 100644
--- a/Control/PerformanceMonitoring/PerfMonComps/CMakeLists.txt
+++ b/Control/PerformanceMonitoring/PerfMonComps/CMakeLists.txt
@@ -23,5 +23,5 @@ atlas_add_component( PerfMonComps
    AthDSoCallBacks nlohmann_json::nlohmann_json)
 
 # Install files from the package:
-atlas_install_python_modules( python/*.py )
-atlas_install_joboptions( share/*.py )
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
+atlas_install_joboptions( share/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
diff --git a/Control/PerformanceMonitoring/PerfMonComps/python/DomainsRegistry.py b/Control/PerformanceMonitoring/PerfMonComps/python/DomainsRegistry.py
index ad3867be4e22..57deaf97bb05 100644
--- a/Control/PerformanceMonitoring/PerfMonComps/python/DomainsRegistry.py
+++ b/Control/PerformanceMonitoring/PerfMonComps/python/DomainsRegistry.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # @file PerfMonComps/python/DomainsRegistry.py
 # @purpose hold a registry of alg names and their association w/ domain
@@ -158,8 +158,6 @@ class Registry(object):
         """
         if registry is None:
             registry=self._registry
-        start_alg = None
-        idx = None
         for ielmt, elmt in enumerate(registry):
             if elmt[0] == name:
                 return ielmt, elmt[1]
@@ -328,7 +326,7 @@ class Registry(object):
         if not self._dirty_db:
             return dict(self._d2a_db)
         # side-effect of calling self.algs: will build  self._d2a_db
-        a2d = self.algs
+        a2d = self.algs # noqa: F841
         return dict(self._d2a_db)
 
     @property
@@ -443,9 +441,6 @@ def _test_main():
         print("    ref: ",ref[d])
         assert algs == ref[d]
 
-    db = pdr.a2d_db()
-    db = pdr.d2a_db()
-    
     print("OK")
     return 0
 
diff --git a/Control/PerformanceMonitoring/PerfMonComps/python/JobOptCfg.py b/Control/PerformanceMonitoring/PerfMonComps/python/JobOptCfg.py
index 639ead38e649..bd31661d30be 100644
--- a/Control/PerformanceMonitoring/PerfMonComps/python/JobOptCfg.py
+++ b/Control/PerformanceMonitoring/PerfMonComps/python/JobOptCfg.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # @file: JobOptCfg.py
 # @purpose: a customized Configurable class for the PerfMonSvc
@@ -145,11 +145,11 @@ class PerfMonSvc( _PerfMonSvc ):
                     ioLabels = [ "streamRDO","streamESD",
                                  "streamAOD","streamTAG",
                                  "inputBackNav","inputFile" ]
-                    for l in ioLabels:
+                    for z in ioLabels:
                         try:
-                            ioContainers.extend(keystore[l].list())
+                            ioContainers.extend(keystore[z].list())
                         except AttributeError:
-                            for k,v in keystore[l].items():
+                            for k,v in keystore[z].items():
                                 ioContainers += [ "%s#%s" % (k,c) for c in v ]
                     pass
                 ## collect everything
diff --git a/Control/PerformanceMonitoring/PerfMonComps/python/MTJobOptCfg.py b/Control/PerformanceMonitoring/PerfMonComps/python/MTJobOptCfg.py
index a366480824bf..3562eb45f3c7 100644
--- a/Control/PerformanceMonitoring/PerfMonComps/python/MTJobOptCfg.py
+++ b/Control/PerformanceMonitoring/PerfMonComps/python/MTJobOptCfg.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
  
 # Job options configuration file for PerfMonMTSvc
 
@@ -26,8 +26,6 @@ class PerfMonMTSvc ( _PerfMonMTSvc  ):
         if not isinstance(handle, PerfMonMTSvc):
             return
 
-        from AthenaCommon import CfgMgr
-
         ## Enable the auditors
         from AthenaCommon.AppMgr import theApp
         theApp.AuditAlgorithms = True
diff --git a/Control/PerformanceMonitoring/PerfMonComps/python/PMonSD.py b/Control/PerformanceMonitoring/PerfMonComps/python/PMonSD.py
index ec3404dbe2d7..cd47b4052bca 100644
--- a/Control/PerformanceMonitoring/PerfMonComps/python/PMonSD.py
+++ b/Control/PerformanceMonitoring/PerfMonComps/python/PMonSD.py
@@ -1,5 +1,4 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-from __future__ import print_function
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 __doc__   ='Module for parsing and basic analysis of Semi-Detailed PerfMon (PMonSD) output. More info at https://twiki.cern.ch/twiki/bin/viewauth/Atlas/PerfMonSD'
 __author__='Thomas Kittelmann <thomas.kittelmann@cern.ch>'
@@ -15,7 +14,8 @@ def pmonsd_version():
 def parse(infile,outfile=None):
     """Parse PMonSD output and return list of dictionaries. Optionally save output in pickle file."""
     p=__smart_parse(infile)
-    if p==None: return None
+    if p is None:
+        return None
     if outfile:
         __save_output(p,outfile,'.psd',infile)
     return p
@@ -25,14 +25,15 @@ def deparse(infile):
     identical to the ones it was parsed from"""
     out=[]
     p=__smart_parse(infile)
-    if p==None: return []
+    if p is None:
+        return []
     for e in p:
         out+=__deparse_single(e)
     return out
 
-def need_line(l):
+def need_line(z):
     """To identify lines which PMonSD needs for parsing"""
-    return l.startswith(_appname)
+    return z.startswith(_appname)
 
 def print_ascii(infile):
     """Print parsed PMonSD info to stdout"""
@@ -52,13 +53,16 @@ def _validate_identical(infile1,infile2):
     #For validation
     p1=__smart_parse(infile1)
     p2=__smart_parse(infile2)
-    if p1==None or p2==None: return False
+    if p1 is None or p2 is None:
+        return False
     return p1==p2
 
 def force_share(obj):
     """Dive into lists and dictionaries and make sure strings with similar content gets shared"""
-    if type(obj)==list: __fs_list(obj)
-    elif type(obj)==dict: __fs_dict(obj)
+    if type(obj)==list:
+        __fs_list(obj)
+    elif type(obj)==dict:
+        __fs_dict(obj)
 
 def get_shared_string(s): return __get_shared_string(s)
 
@@ -94,7 +98,7 @@ def __save_output(data,outfile,prefix,infile=None):
         fh=gzip.open(outfile,'w')
     else:
         fh=open(outfile,'w')
-    if infile!=None and outfile==infile:
+    if infile is not None and outfile==infile:
         print("%s.parse WARNING: output file %s equals input file. Won't dump."%(_appname,outfile))
     else:
         import cPickle
@@ -146,8 +150,10 @@ def __smart_parse(infile):
     else:
         #in case this is already parsed info, make sure we just return it as it is:
         if type(infile)==list:
-            if len(infile)==0: return infile
-            if type(infile[0])==dict and 'steps_comps' in infile[0].keys(): return infile
+            if len(infile)==0:
+                return infile
+            if type(infile[0])==dict and 'steps_comps' in infile[0].keys():
+                return infile
         #Hopefully this is something we can iterate through (like a list of strings or a file-handle):
         return __actual_parse(infile)
 
@@ -168,13 +174,13 @@ def __actual_parse(filehandle):
         return (float(v),int(i))
     d=new_dict()
     stepcount={}#for keeping track of in what order within each step a component is listed
-    for l in filehandle:
-        if not l.startswith(_prefix):
+    for z in filehandle:
+        if not z.startswith(_prefix):
             continue
         #ensure the first thing we pick up is the version:
-        if version==None:
-            if intro_version in l:
-                vstr=l.split(intro_version)[1].split()[0]
+        if version is None:
+            if intro_version in z:
+                vstr=z.split(intro_version)[1].split()[0]
                 full_info=vstr[-1]=='f'
                 v_major,v_minor=vstr[:-1].split('.')
                 version=(int(v_major),int(v_minor))
@@ -185,22 +191,23 @@ def __actual_parse(filehandle):
                     print("WARNING: Using PMonSD of version %f to parse output made with version %f"%(pmonsd_version(),version))
             continue
         #remove prefix:
-        l=l[len(_prefix):].strip()
-        if l.startswith('WARNING'): continue
-        if l.startswith('=='):
+        z=z[len(_prefix):].strip()
+        if z.startswith('WARNING'):
+            continue
+        if z.startswith('=='):
             #This is a comment/separator. Look for end marker:
-            if end_marker in l:
+            if end_marker in z:
                 #found. Grab parsed info and make room for more (in case of concatenated logs)
                 output+=[d]
                 d=new_dict()
                 version=None#reset
-            elif 'Full output inside:' in l:
-                filename=l.split('Full output inside:')[1].split('===')[0].strip()
+            elif 'Full output inside:' in z:
+                filename=z.split('Full output inside:')[1].split('===')[0].strip()
                 d['fulloutput_file']=filename
             continue
-        if not l.startswith('['):
+        if not z.startswith('['):
             continue#ignore column headers
-        f=l.split()
+        f=z.split()
         if f[0]=='[---]' and '=' in f[1]:
             for valfield in f[1:]:
                 n,vstr=valfield.split('=',1)
@@ -226,15 +233,17 @@ def __actual_parse(filehandle):
                 d['special']['snapshots'][comp]={'n':n,'cpu':float(f[0]),'wall':float(f[1]),
                                                  'vmem':float(f[2]),'malloc':float(f[3])}
         else:
-            if not step in d['steps_comps'].keys():
+            if step not in d['steps_comps'].keys():
                 d['steps_comps'][step]={}
                 d['steps_totals'][step]={}
                 stepcount[step]=0
             iorder=stepcount[step]
             stepcount[step]+=1
                 #workaround situation where two collapsed or total lines have same form (nentries is always different):
-            if is_collapsed and comp in d['steps_comps'][step].keys(): comp+=':n=%i'%n
-            if is_total and comp in d['steps_totals'][step].keys(): comp+=':n=%i'%n
+            if is_collapsed and comp in d['steps_comps'][step].keys():
+                comp+=':n=%i'%n
+            if is_total and comp in d['steps_totals'][step].keys():
+                comp+=':n=%i'%n
             if len(f)==6:
                 #has max@evt info
                 d['steps_comps'][step][comp]={'order':iorder,'n':n,'cpu':float(f[0]),'vmem':float(f[2]),'malloc':float(f[4])}
@@ -242,8 +251,10 @@ def __actual_parse(filehandle):
             else:
                 #doesn't have max@evt info (step!='evt' or 'evt' but collapsed or total)
                 nfo={'order':iorder,'n':n,'cpu':float(f[0]),'vmem':float(f[1]),'malloc':float(f[2])}
-                if is_total: d['steps_totals'][step][comp]=nfo
-                else: d['steps_comps'][step][comp]=nfo
+                if is_total:
+                    d['steps_totals'][step][comp]=nfo
+                else:
+                    d['steps_comps'][step][comp]=nfo
     force_share(output)#make sure we register shared strings
     return output
 
@@ -251,14 +262,18 @@ def __deparse_single(d):
     _prefix=_appname+' '
     out=[]
     assert type(d)==dict
-    def header(l,s,center=True):
-        if center: s=(' %s '%s).center(82,'=')
-        else: s=(' %s '%s).ljust(82,'=')
-        l+=[ _prefix+'==='+s+'===']
+    def header(z,s,center=True):
+        if center:
+            s=(' %s '%s).center(82,'=')
+        else:
+            s=(' %s '%s).ljust(82,'=')
+        z+=[ _prefix+'==='+s+'===']
         
     full_info=d['full_info']
-    if full_info: fullstr='f'
-    else: fullstr='c'
+    if full_info:
+        fullstr='f'
+    else:
+        fullstr='c'
     header(out,'semi-detailed perfmon info v%i.%i%s / start'%(d['version'][0],d['version'][1],fullstr))
     header(out,'Documentation: https://twiki.cern.ch/twiki/bin/viewauth/Atlas/PerfMonSD',center=False)
     header(out,'Note that documentation includes recipe for easy parsing from python.  ',center=False)
@@ -268,7 +283,7 @@ def __deparse_single(d):
     stdsteps=['ini','1st','cbk','evt','fin']
     steps=[]
     for step in d['steps_comps'].keys():
-        if not step in stdsteps and not step in steps:
+        if step not in stdsteps and step not in steps:
             steps+=[step]
     steps.sort()
     steps=stdsteps+steps
@@ -284,20 +299,25 @@ def __deparse_single(d):
         is_evt=step=='evt'
         header(out,'step %s'%step)
         entries=[]
-        if not step in d['steps_comps'].keys(): continue
+        if step not in d['steps_comps'].keys():
+            continue
         for comp,compdata in d['steps_comps'][step].items():
-            if '_comps]:n=' in comp: comp=comp.split('_comps]:n=')[0]+'_comps]'
+            if '_comps]:n=' in comp:
+                comp=comp.split('_comps]:n=')[0]+'_comps]'
             if is_evt and comp in d['evt_max_info'].keys():
                 s=format_evt_withmax%(compdata['n'],compdata['cpu'],format_max(d['evt_max_info'][comp]['cpu']),
                                                  compdata['vmem'],format_max(d['evt_max_info'][comp]['vmem']),
                                                  compdata['malloc'],format_max(d['evt_max_info'][comp]['malloc']),comp)
             else:
-                if is_evt: format=format_evt_nomax
-                else: format=format_notevt
+                if is_evt:
+                    format=format_evt_nomax
+                else:
+                    format=format_notevt
                 s=format%(compdata['n'],compdata['cpu'],compdata['vmem'],compdata['malloc'],comp)
             entries+=[(compdata['order'],comp,s)]
         for comp,compdata in d['steps_totals'][step].items():
-            if '_comps]:n=' in comp: comp=comp.split('_comps]:n=')[0]+'_comps]'
+            if '_comps]:n=' in comp:
+                comp=comp.split('_comps]:n=')[0]+'_comps]'
             format='%4i %6i %7i %7i %s'
             if is_evt:
                 format='%4i %6i            %7i            %7i             %s'
@@ -305,8 +325,10 @@ def __deparse_single(d):
             entries+=[(compdata['order'],comp,s)]
         if entries:
             entries.sort()
-            if is_evt: out+=[ _prefix+' '*len(step)+colheader_evt]
-            else: out+=[ _prefix+' '*len(step)+colheader_std]
+            if is_evt:
+                out+=[ _prefix+' '*len(step)+colheader_evt]
+            else:
+                out+=[ _prefix+' '*len(step)+colheader_std]
             for _,_,s in entries:
                 out+=[ '%s[%s] %s'%(_prefix,step,s)]
     header(out,'special info')
@@ -323,8 +345,6 @@ def __deparse_single(d):
     for leak in leaks:
         dl=d['special']['leaks'][leak]
         out+=[ '%s[---] %4i        -        - %8i %8i %s'%(_prefix,dl['n'],dl['vmem'],dl['malloc'],leak)]
-    specialvals=d['special']['values'].keys()
-    svs=[]
     order=[['vmem_peak','vmem_mean','rss_mean'],
            ['jobcfg_walltime','jobstart'],
            ['cpu_bmips','cpu_res','release'],
@@ -335,8 +355,10 @@ def __deparse_single(d):
         lineformat=[]
         for sv in lineorder:
             v=d['special']['values'][sv]
-            if type(v)==float: v_str='%i'%v
-            else: v_str=v
+            if type(v)==float:
+                v_str='%i'%v
+            else:
+                v_str=v
             lineformat+=['%s=%s'%(sv,v_str)]
         out+=['%s[---] %s'%(_prefix,' '.join(lineformat))]
     header(out,'semi-detailed perfmon info / end')
@@ -352,17 +374,18 @@ def _validate_deparsing(f):
         fh=gzip_fastopen(f)
     else:
         fh=open(f)
-    for l in fh:
-        if l.startswith(_prefix):
-            if l.startswith(_prefix+'WARNING'):
+    for z in fh:
+        if z.startswith(_prefix):
+            if z.startswith(_prefix+'WARNING'):
                 continue
-            if l.endswith('\n'): l=l[0:-1]
-            lines+=[l]
+            if z.endswith('\n'):
+                z=z[0:-1]
+            lines+=[z]
     if len(lines)==0:
         print("File does not have %s lines!"%_appname)
         return False
     d=__smart_parse(lines)
-    if d==None:
+    if d is None:
         return False
     lines2=deparse(d)
     if len(lines)!=len(lines2):
@@ -388,7 +411,8 @@ def _validate_deparsing(f):
 def __actual_diff(infile1,infile2):
     d1=__smart_parse(infile1)
     d2=__smart_parse(infile2)
-    if d1==None or d2==None: return False
+    if d1 is None or d2 is None:
+        return False
     #Gymnastics to accept separate types:
     if type(d1)==list and type(d2)==list:
         if len(d1)!=len(d2):
@@ -422,13 +446,15 @@ def __actual_diff(infile1,infile2):
         anycollapsed=False
         for comp,data in compdata.items():
             n=data['n']
-            if not n in nentries2ncomps.keys(): nentries2ncomps[n]=0
+            if n not in nentries2ncomps.keys():
+                nentries2ncomps[n]=0
             if comp.startswith('[collapsed_'):
                 anycollapsed=True
-                nc=int(comp.split('_')[1])
+                #nc=int(comp.split('_')[1])
             else:
-                nc=1
-            nentries2ncomps[n]+=1
+                pass
+                #nc=1
+            nentries2ncomps[n]+=1 # check if this should be +=nc
         return nentries2ncomps,anycollapsed
 
 
@@ -455,7 +481,7 @@ def __actual_diff(infile1,infile2):
         if not anycollapsed1 and not anycollapsed2:
             #awesome, we can check all comps completely before vs. after
             for comp,compdata in d1['steps_comps'][step].items():
-                if not comp in d2['steps_comps'][step].keys():
+                if comp not in d2['steps_comps'][step].keys():
                     print("Difference: Component %s only present in one input in step %s"%(comp,step))
                     return False
                 check+=[(comp,compdata,d2['steps_comps'][step][comp])]
@@ -477,14 +503,17 @@ def __get_shared_string(s):
     global __allstrings
     return __allstrings.setdefault(s,s)
 
-def __fs_list(l):
-    i=len(l)
+def __fs_list(z):
+    i=len(z)
     while i:
         i-=1
-        t=type(l[i])
-        if t==str: l[i]=__get_shared_string(l[i])
-        elif t==list: __fs_list(l[i])
-        elif t==dict: __fs_dict(l[i])
+        t=type(z[i])
+        if t==str:
+            z[i]=__get_shared_string(z[i])
+        elif t==list:
+            __fs_list(z[i])
+        elif t==dict:
+            __fs_dict(z[i])
 
 def __fs_dict(d):
     keys=d.keys()
@@ -492,7 +521,10 @@ def __fs_dict(d):
         o=d[k]
         del d[k]
         t=type(o)
-        if t==str: o=__get_shared_string(o)
-        elif t==list: __fs_list(o)
-        elif t==dict: __fs_dict(o)
+        if t==str:
+            o=__get_shared_string(o)
+        elif t==list:
+            __fs_list(o)
+        elif t==dict:
+            __fs_dict(o)
         d[__get_shared_string(k)]=o
diff --git a/Control/PerformanceMonitoring/PerfMonComps/python/PerfMonFlags.py b/Control/PerformanceMonitoring/PerfMonComps/python/PerfMonFlags.py
index 565bb21ad05d..150ecf02ad8d 100644
--- a/Control/PerformanceMonitoring/PerfMonComps/python/PerfMonFlags.py
+++ b/Control/PerformanceMonitoring/PerfMonComps/python/PerfMonFlags.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # @file: PerfMonFlags.py
 # @purpose: a container of flags for Performance Monitoring
@@ -58,8 +58,6 @@ class doPersistencyMonitoring(JobProperty):
         if not jobproperties.PerfMonFlags.doMonitoring():
             jobproperties.PerfMonFlags.doMonitoring = True
             pass
-        from AthenaCommon.AppMgr import ServiceMgr as svcMgr
-        #svcMgr.PerfMonSvc.MonLvl = -1
         return
 # 
 class doDetailedMonitoring(JobProperty):
@@ -105,8 +103,6 @@ class doFullMon(JobProperty):
         jobproperties.PerfMonFlags.doFastMon = False
         jobproperties.PerfMonFlags.doMonitoring = True
         # setup values
-        from AthenaCommon.AppMgr import ServiceMgr as svcMgr
-        #svcMgr.PerfMonSvc.MonLvl = -1
         # enable DSO monitoring
         jobproperties.PerfMonFlags.doDsoMonitoring = True
         # activate persistency monitoring too
@@ -410,7 +406,7 @@ def _decode_pmon_opts(opts):
         elif opt.startswith('+'):
             val = True
             flag_name = flag_name[1:]
-        if not flag_name in dispatch:
+        if flag_name not in dispatch:
             raise ValueError(
                 '[%s] is not a valid PerfMonFlag (allowed: %r)' %
                 (flag_name, dispatch.keys())
diff --git a/Control/PerformanceMonitoring/PerfMonComps/python/PerfMonSerializer.py b/Control/PerformanceMonitoring/PerfMonComps/python/PerfMonSerializer.py
index 94cc5df2b969..ab092b64cc30 100644
--- a/Control/PerformanceMonitoring/PerfMonComps/python/PerfMonSerializer.py
+++ b/Control/PerformanceMonitoring/PerfMonComps/python/PerfMonSerializer.py
@@ -1,9 +1,7 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # @file PerfMonComps/python/PerfMonSerializer
 
-from __future__ import with_statement, print_function
-
 __version__ = "$Revision: 524466 $"
 __doc__ = "various utils to encode/decode perfmon (meta)data with base64"
 __author__ = "Sebastien Binet, Thomas Kittlemann"
@@ -161,23 +159,22 @@ def iextract_pmon_data(fname):
     else:
         raise ValueError("expect a xyz.pmon.gz or xyz.stream file (got [%s])"%(fname,))
     
-    from collections import defaultdict
     import numpy as np
     out = _init_pmon_data()
         
     with open(stream_fname, 'r') as f:
-        for l in f:
+        for z in f:
             data, step, idx, comp = (None, ) * 4
-            if l.startswith('#'):
+            if z.startswith('#'):
                 continue
             #print("[%s]" % l.strip())
             # handle things like:
             # /io/std::vector<unsigned int>#L1CaloUnpackingErrors ...
             # /io/std::map<std::string,std::vector<int> >#mapdata ...
-            l = l.replace('unsigned int', 'unsigned-int')\
+            z = z.replace('unsigned int', 'unsigned-int')\
                  .replace('> >', '>->')
             
-            fields = l.split()
+            fields = z.split()
             #print("##",repr(l))
             if fields[0].startswith(('/ini/','/evt/','/fin/',
                                      '/cbk/','/usr/',
@@ -345,7 +342,7 @@ def iextract_pmon_data(fname):
                 pass
             else:
                 print("warning: unhandled field [%s]" % (fields[0],))
-                print(repr(l))
+                print(repr(z))
 
             # yields what we got so far
             yield step, idx, comp, out
@@ -391,7 +388,8 @@ def encode(data, use_base64=True):
 def decode(s):
     """decode a (compressed) string into a python object
     """
-    if not s: return None
+    if not s:
+        return None
     import zlib
     import cPickle as pickle
     if s[0]=='B':
@@ -399,7 +397,6 @@ def decode(s):
         s=base64.b64decode(s[1:])
     else:
         s=s[1:]
-    d=pickle.loads(zlib.decompress(s))
     return pickle.loads(zlib.decompress(s))
 
 def build_callgraph(fname):
@@ -417,9 +414,7 @@ def build_callgraph(fname):
     current_step = 'ini'
     local_ctx = None
     
-    out = None
     for step, idx, comp, table in iextract_pmon_data(fname):
-        out = table
         if idx is None:
             if comp == 'PerfMonSliceIo':
                 # ignore this component for now...
@@ -493,7 +488,7 @@ def build_callgraph(fname):
                 # push the stack of contexes
                 parent_ctx = local_ctx
                 local_ctx = GraphNode(comp, parent=parent_ctx)
-                if not step in graph.keys():
+                if step not in graph.keys():
                     local_ctx.ctype = step
                 parent_ctx.children.append(local_ctx)
             elif idx == 1:
diff --git a/Control/PerformanceMonitoring/PerfMonComps/python/PyComps.py b/Control/PerformanceMonitoring/PerfMonComps/python/PyComps.py
index 305c6a877a77..0646fbafff59 100644
--- a/Control/PerformanceMonitoring/PerfMonComps/python/PyComps.py
+++ b/Control/PerformanceMonitoring/PerfMonComps/python/PyComps.py
@@ -1,15 +1,13 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # @file:    PerfMonComps/python/PyComps.py
 # @purpose: a set of python components to perform performance monitoring
 # @author:  Sebastien Binet <binet@cern.ch>
-from __future__ import print_function
 
 __doc__     = 'a set of python components to perform performance monitoring'
 __version__ = '$Revision: 298807 $'
 __author__  = 'Sebastien Binet <binet@cern.ch>'
 
-import AthenaCommon.SystemOfUnits as Units
 import AthenaPython.PyAthena as PyAthena
 from AthenaPython.PyAthena import StatusCode
 
@@ -105,8 +103,8 @@ class PyStorePayloadMon (PyAthena.Svc):
             tp_name = clid2name(p.clID())
             print(fmt, (mem_0, mem_1, mem_0 - mem_1, tp_name, p.name()), file=fd)
             pass
-        mem_store_0 = long(mem_store_0)
-        mem_store_1 = long(mem_store_1)
+        mem_store_0 = int(mem_store_0)
+        mem_store_1 = int(mem_store_1)
         
         print(fmt, (
             mem_store_0, mem_store_1, mem_store_0 - mem_store_1,
@@ -133,7 +131,7 @@ class PyStorePayloadMon (PyAthena.Svc):
         ##     mem_0, mem_1, mem_1 - mem_0, ncalls_0, ncalls_1,
         ##     p.clID(), p.name()
         ##     ))
-        return (p, long(mem_0), long(mem_1))
+        return (p, int(mem_0), int(mem_1))
     
     def finalize(self):
         self.msg.info('==> finalize...')
diff --git a/Control/PerformanceMonitoring/PerfMonComps/python/PyMonUtils.py b/Control/PerformanceMonitoring/PerfMonComps/python/PyMonUtils.py
index 78bd444393e9..488d9145455d 100644
--- a/Control/PerformanceMonitoring/PerfMonComps/python/PyMonUtils.py
+++ b/Control/PerformanceMonitoring/PerfMonComps/python/PyMonUtils.py
@@ -1,8 +1,7 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # @file: PyMonUtils.py
 # @author: Sebastien Binet <binet@cern.ch>
-from __future__ import print_function
 
 __author__  = "Sebastien Binet <binet@cern.ch>"
 __version__ = "$Revision: 1.3 $"
@@ -44,7 +43,7 @@ def mon_push_back (sgname='StoreGateSvc'):
         # no double counting from symlinks
         # FIXME: it is actually valid to have 2 different collections
         #        (=/= CLIDs) with the same key...
-        if wasted.has_key(k):
+        if k in wasted:
             continue
         clid = dp.clID()
         klass = "%s" % cl.typename(clid)
@@ -81,18 +80,22 @@ def mon_push_back (sgname='StoreGateSvc'):
 
 def dump_smaps (fname=None):
     import os,sys
-    if not (fname is None): o = open (fname, 'w')
-    else:                   o = sys.stdout
-    for l in open('/proc/%d/smaps'%os.getpid()):
-        print(l, file=o)
+    if not (fname is None):
+        o = open (fname, 'w')
+    else:
+        o = sys.stdout
+    for z in open('/proc/%d/smaps'%os.getpid()):
+        print(z, file=o)
     if not (fname is None):
         o.close()
     return
 
 def loaded_libs (fname=None, pid=None, show=False):
     import os,sys,re
-    if not (fname is None): o = open (fname, 'w')
-    else:                   o = sys.stdout
+    if not (fname is None):
+        o = open (fname, 'w')
+    else:
+        o = sys.stdout
     pat = re.compile(r'(?P<addr_beg>\w*?)\-(?P<addr_end>\w*?)\s'\
                      r'(?P<perm>.{4})\s(?P<offset>\w*?)\s'\
                      r'(?P<devmajor>\d{2}):(?P<devminor>\d{2})\s'\
@@ -102,13 +105,13 @@ def loaded_libs (fname=None, pid=None, show=False):
     if pid is None:
         pid = os.getpid()
     for line in open('/proc/%s/smaps'%pid):
-        l = line.strip()
-        res = re.match(pat,l)
+        z = line.strip()
+        res = re.match(pat,z)
         if res:
             g = res.group
             libname = g('libname').strip()
             libs.add(_realpath(libname))
-    libs = sorted([l for l in libs], reverse=True)
+    libs = sorted([z for z in libs], reverse=True)
     if show:
         for libname in libs:
             print(libname, file=o)
@@ -117,8 +120,6 @@ def loaded_libs (fname=None, pid=None, show=False):
 import sys
 if sys.platform == 'darwin':
     def pymon():
-        from os import getpid,sysconf
-        from sys import platform
         from resource import getrusage, RUSAGE_SELF
         cpu = getrusage(RUSAGE_SELF)
         cpu = (cpu.ru_utime+cpu.ru_stime) * 1e3 # in milliseconds
@@ -138,7 +139,6 @@ if sys.platform == 'darwin':
 else:
     def pymon():
         from os import getpid,sysconf
-        from sys import platform
         from resource import getrusage, RUSAGE_SELF
         cpu = getrusage(RUSAGE_SELF)
         cpu = (cpu.ru_utime+cpu.ru_stime) * 1e3 # in milliseconds
@@ -152,13 +152,17 @@ else:
 def lshosts_infos():
     import socket,commands
     hostname = '<unknown>'
-    try: hostname = socket.gethostname()
-    except Exception: pass
+    try:
+        hostname = socket.gethostname()
+    except Exception:
+        pass
     sc,out = commands.getstatusoutput('which lshosts')
-    if sc != 0: return ('no lshosts command',0.) # no lshosts could be found
+    if sc != 0:
+        return ('no lshosts command',0.) # no lshosts could be found
     cmd = out
     sc,out = commands.getstatusoutput("%s %s"%(cmd,hostname))
-    if sc != 0: return ('host not in db', 0.)
+    if sc != 0:
+        return ('host not in db', 0.)
     cpu_infos = {}
     try:
         title,data = out.splitlines()
diff --git a/Control/PerformanceMonitoring/PerfMonComps/python/PyPerfMon.py b/Control/PerformanceMonitoring/PerfMonComps/python/PyPerfMon.py
index 60d0dc473fbc..90ef5b7bdbd1 100644
--- a/Control/PerformanceMonitoring/PerfMonComps/python/PyPerfMon.py
+++ b/Control/PerformanceMonitoring/PerfMonComps/python/PyPerfMon.py
@@ -2,7 +2,6 @@
 
 # @file: PyPerfMon.py
 # @author: Sebastien Binet <binet@cern.ch>
-from __future__ import with_statement
 
 __author__  = "Sebastien Binet <binet@cern.ch>"
 __version__ = "$Revision: 1.51 $"
@@ -10,17 +9,12 @@ __doc__     = """python module holding a python service to monitor athena perfor
 """
 
 import os,sys
-from time import time
-import resource
-from resource import getrusage as resource_getrusage
-import string
 
-import array
 import AthenaCommon.Logging as L
 
 _perfMonStates = ('ini','evt','fin')
 
-from PerfMonComps.PyMonUtils import *
+from PerfMonComps.PyMonUtils import Units, pymon
 
 from PyUtils.Decorators import memoize, forking
 
@@ -54,7 +48,6 @@ class Svc(object):
     instances = {}
 
     def __init__(self, name, properties = None):
-        import AthenaCommon.Logging as L
         ## init base class
         super(Svc,self).__init__()
         self.name  = name
@@ -94,9 +87,12 @@ class Svc(object):
                 cfg_module = 'PerfMonComps'
             elif c in cfgs:
                 cfg = cfgs[c]
-                if isinstance(cfg, ConfigurableAlgorithm): cfg_type = 'alg'
-                elif isinstance(cfg, ConfigurableAlgTool): cfg_type = 'algtool'
-                elif isinstance(cfg, ConfigurableService): cfg_type = 'svc'
+                if isinstance(cfg, ConfigurableAlgorithm):
+                    cfg_type = 'alg'
+                elif isinstance(cfg, ConfigurableAlgTool):
+                    cfg_type = 'algtool'
+                elif isinstance(cfg, ConfigurableService):
+                    cfg_type = 'svc'
                 cfg_class  = cfg.__class__.__name__
                 cfg_module = cfg.__class__.__module__
             else:
@@ -139,7 +135,7 @@ class Svc(object):
 
         ## perfmon domains
         try:
-            import DomainsRegistry as pdr
+            import PerfMonComps.DomainsRegistry as pdr
             self.meta['domains_a2d'] = pdr.a2d_db()
         except Exception:
             _msg.info('problem retrieving domains-registry...')
@@ -159,7 +155,9 @@ class Svc(object):
                 'rt':       (0.,0.),
                 }
 
-        import gc; gc.collect(); del gc
+        import gc
+        gc.collect()
+        del gc
         return
 
     def domains_db(self):
@@ -170,7 +168,6 @@ class Svc(object):
     
     @property
     def msg(self):
-        import AthenaCommon.Logging as L
         return L.logging.getLogger(self.name)
 
     def _set_stats(self, name,
@@ -227,7 +224,7 @@ class Svc(object):
             self._do_malloc_mon = False
         _msg.info('installing pmon-malloc hooks: %s', self._do_malloc_mon)
         import AthenaPython.PyAthena as PyAthena
-        lib = PyAthena.load_library('PerfMonEventDict')
+        PyAthena.load_library('PerfMonEventDict')
         memstats = PyAthena.PerfMon.MemStats
         memstats.enable(bool(self._do_malloc_mon))
         _msg.info('pmon-malloc hooks enabled: %s', bool(memstats.enabled()))
@@ -308,10 +305,10 @@ class Svc(object):
             statm = {}
             from sys import platform
             if platform != 'darwin' :
-                for l in open('/proc/self/status', 'r'):
+                for z in open('/proc/self/status', 'r'):
                     # lines are of the form:
                     # VmPeak: some value
-                    ll = list(map(str.strip, l.split(':')))
+                    ll = list(map(str.strip, z.split(':')))
                     k = ll[0]
                     v = ' '.join(ll[1:])
                     statm[k] = v
@@ -343,9 +340,9 @@ class Svc(object):
             for evtstr,fitn,fitted_slope in self._slope_data['fits']:
                 maxfitn=max(maxfitn,fitn)
             for evtstr,fitn,fitted_slope in self._slope_data['fits']:
-                _msg.info( '  evt %s fitted vmem-slope (%s points): %s'%
-                           (evtstr,str(fitn).rjust(len(str(maxfitn))),
-                            '%7.1f kb/evt'%fitted_slope if fitn>=2 else 'N/A') )
+                _msg.info( '  evt %s fitted vmem-slope (%s points): %s',
+                           evtstr,str(fitn).rjust(len(str(maxfitn))),
+                            '%7.1f kb/evt'%fitted_slope if fitn>=2 else 'N/A' )
             summary['job']['vmem_slope'] = self._slope_data
         else:
             _msg.info('vmem-leak estimation: [N/A]')
@@ -353,8 +350,10 @@ class Svc(object):
             
         ## try to recoup some memory by flushing out ROOT stuff...
         headerFile = os.path.splitext(self.outFileName)[0]+".dat"
-        if os.path.exists(headerFile):       os.remove(headerFile)
-        if os.path.exists(self.outFileName): os.remove(self.outFileName)
+        if os.path.exists(headerFile):
+            os.remove(headerFile)
+        if os.path.exists(self.outFileName):
+            os.remove(self.outFileName)
 
         ## build the callgraph...
         #import PerfMonComps.PerfMonSerializer as pmon_ser
@@ -431,12 +430,15 @@ class Svc(object):
         ## write out meta-data
         import PyUtils.dbsqlite as dbs
         meta = dbs.open(headerFile, 'n')
-        for k,v in six.iteritems (self.meta): meta[k] = v
+        for k,v in six.iteritems (self.meta):
+            meta[k] = v
         meta['version_id'] = '0.4.0' # stream-format + header file
         meta['pmon_tuple_files'] = map( os.path.basename, outFiles[1:] )
         import socket
-        try:   meta['hostname'] = socket.gethostname()
-        except Exception: meta['hostname'] = '<unknown>'
+        try:
+            meta['hostname'] = socket.gethostname()
+        except Exception:
+            meta['hostname'] = '<unknown>'
         meta.close()
 
         
@@ -447,8 +449,10 @@ class Svc(object):
         try:
             for outFile in outFiles:
                 outFileDirName = os.path.dirname(outFile)
-                try: os.chdir(outFileDirName)
-                except OSError as err: pass
+                try:
+                    os.chdir(outFileDirName)
+                except OSError:
+                    pass
                 outFile = os.path.basename(outFile)
                 _msg.info(' --> [%s] => %8.3f kb',
                           outFile,
@@ -517,10 +521,12 @@ class PoolMonTool(object):
         from AthenaCommon import CfgMgr
         from AthenaCommon.Configurable import Configurable
         for c in list(Configurable.allConfigurables.values()):
-            if not isinstance(c, CfgMgr.AthenaOutputStream): continue
+            if not isinstance(c, CfgMgr.AthenaOutputStream):
+                continue
             try:
                 outFile = c.properties()["OutputFile"]
-            except KeyError: continue
+            except KeyError:
+                continue
             if outFile.startswith("ROOTTREE:"):
                 outFile = outFile[len("ROOTTREE:"):]
             outFiles.add( outFile )
@@ -530,7 +536,6 @@ class PoolMonTool(object):
         
     @property
     def msg(self):
-        import AthenaCommon.Logging as L
         return L.logging.getLogger(self.name)
 
     def initialize(self):
@@ -620,7 +625,8 @@ class PoolMonTool(object):
                     self.msg.info( "Could not run checkFile on [%s] !!",
                                    inFileName )
                     self.msg.info( "Reason: %s", err )
-                    if 'inFile' in dir(): del inFile               
+                    if 'inFile' in dir():
+                        del inFile
                 _msg.unMute()
         if len(self.outputPoolFiles)>0:
             self.msg.info( "Content of output POOL files:" )
@@ -651,7 +657,8 @@ class PoolMonTool(object):
                     self.msg.info( "Could not run checkFile on [%s] !!",
                                    outFileName )
                     self.msg.info( "Reason: %s", err )
-                    if 'outFile' in dir(): del outFile               
+                    if 'outFile' in dir():
+                        del outFile
                 _msg.unMute()
                 
         return
@@ -678,13 +685,13 @@ class HephaestusMonTool(object):
         # during our finalize.
         self._heph_has_checkPoint = False 
         import sys
-        if not 'Hephaestus.atexit' in sys.modules.keys():
+        if 'Hephaestus.atexit' not in sys.modules.keys():
             self.msg.warning('Hephaestus was not correctly initialized !')
             self.msg.warning('Final report may be inaccurate...')
             self.msg.warning('(to fix this, run athena with --leak-check)')
 
         import dl, Hephaestus.MemoryTracker as m
-        _hephLib = dl.open (m.__file__, dl.RTLD_GLOBAL | dl.RTLD_NOW)
+        dl.open (m.__file__, dl.RTLD_GLOBAL | dl.RTLD_NOW)
         memtrack = m
 
         from os.path import splitext
@@ -742,7 +749,7 @@ class HephaestusMonTool(object):
         
         # consolidate last events with end-of-job leak report
         _clearCheckPoint = self.memtrack.CheckPoints.clearCheckPoint
-        for _ in xrange(self.lag):
+        for _ in range(self.lag):
             _clearCheckPoint( 0 )
 
         # put the per-evt leaks into a different file
diff --git a/Control/PerformanceMonitoring/PerfMonComps/share/FastMon.py b/Control/PerformanceMonitoring/PerfMonComps/share/FastMon.py
index bead3f619f1d..6c175942e6a6 100644
--- a/Control/PerformanceMonitoring/PerfMonComps/share/FastMon.py
+++ b/Control/PerformanceMonitoring/PerfMonComps/share/FastMon.py
@@ -1,3 +1,5 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
 # @file: PerfMonComps/FastMon.py
 # @author: Sebastien Binet
 # $Id: FastMon.py,v 1.2 2007-12-03 19:07:38 binet Exp $
diff --git a/Control/PerformanceMonitoring/PerfMonComps/share/FullMon.py b/Control/PerformanceMonitoring/PerfMonComps/share/FullMon.py
index 8cf777264c1c..0f5ab9cf19d2 100644
--- a/Control/PerformanceMonitoring/PerfMonComps/share/FullMon.py
+++ b/Control/PerformanceMonitoring/PerfMonComps/share/FullMon.py
@@ -1,3 +1,5 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
 # @file: PerfMonComps/FullMon.py
 # @author: Sebastien Binet
 # $Id$
diff --git a/Control/PerformanceMonitoring/PerfMonComps/share/PerfMonMTSvc_jobOptions.py b/Control/PerformanceMonitoring/PerfMonComps/share/PerfMonMTSvc_jobOptions.py
index b8adada555d2..b3cb87c5506e 100644
--- a/Control/PerformanceMonitoring/PerfMonComps/share/PerfMonMTSvc_jobOptions.py
+++ b/Control/PerformanceMonitoring/PerfMonComps/share/PerfMonMTSvc_jobOptions.py
@@ -1,3 +1,5 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
 ###############################
 # Print what we're doing
 ###############################
diff --git a/Control/PerformanceMonitoring/PerfMonComps/share/PerfMonSvc_jobOptions.py b/Control/PerformanceMonitoring/PerfMonComps/share/PerfMonSvc_jobOptions.py
index 8b732fc34a69..5f546a8b942a 100644
--- a/Control/PerformanceMonitoring/PerfMonComps/share/PerfMonSvc_jobOptions.py
+++ b/Control/PerformanceMonitoring/PerfMonComps/share/PerfMonSvc_jobOptions.py
@@ -1,3 +1,5 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
 # @file: PerfMonComps/PerfMonSvc_jobOptions.py
 # @author: Sebastien Binet
 # $Id: PerfMonSvc_jobOptions.py,v 1.3 2007-08-01 20:58:52 binet Exp $
-- 
GitLab


From 800a1ef3bd6f123bcee3da1c7300452348df463f Mon Sep 17 00:00:00 2001
From: sutt <sutt@cern.ch>
Date: Tue, 15 Dec 2020 16:43:14 +0100
Subject: [PATCH 040/225] Add explicit Electron FTF Roi to circumvent a bug in
 the electron hypo

Bug in the electron hypos adds another Roi by mistake, so we need to
expplicity use the electron Roi to be able to retrieve the tracks
---
 .../share/TrigInDetValidation_AODtoTrkNtuple.py                 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_AODtoTrkNtuple.py b/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_AODtoTrkNtuple.py
index 5b204531fcb5..f5ca2e82ea53 100644
--- a/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_AODtoTrkNtuple.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_AODtoTrkNtuple.py
@@ -172,7 +172,7 @@ if ( True ) :
 
 #    "HLT_e.*_etcut.*:HLT_IDTrack_Electron_FTF",
 #    "HLT_e.*_etcut.*:HLT_IDTrack_Electron_IDTrig",
-    "HLT_e.*:HLT_IDTrack_Electron_FTF",
+    "HLT_e.*:HLT_IDTrack_Electron_FTF:HLT_Roi_FastElectron",
     "HLT_e.*:HLT_IDTrack_Electron_IDTrig",
 
 
-- 
GitLab


From c7e8e7760da45a7bb873cb4ab71b7324375b6645 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nicolas=20K=C3=B6hler?= <nicolas.koehler@cern.ch>
Date: Tue, 15 Dec 2020 16:54:30 +0100
Subject: [PATCH 041/225] use Minuit2 instead of TMinuit

---
 .../MdtSegmentT0Fitter/MdtSegmentT0Fitter.h   |  20 --
 .../src/MdtSegmentT0Fitter.cxx                | 340 +++++++-----------
 2 files changed, 125 insertions(+), 235 deletions(-)

diff --git a/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/MdtSegmentT0Fitter/MdtSegmentT0Fitter/MdtSegmentT0Fitter.h b/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/MdtSegmentT0Fitter/MdtSegmentT0Fitter/MdtSegmentT0Fitter.h
index e3e89b6c26f9..efd01f8cfa9d 100755
--- a/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/MdtSegmentT0Fitter/MdtSegmentT0Fitter/MdtSegmentT0Fitter.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/MdtSegmentT0Fitter/MdtSegmentT0Fitter/MdtSegmentT0Fitter.h
@@ -19,8 +19,6 @@
 #include <vector>
 #include <memory>
 
-#include "TMinuit.h"
-
 namespace TrkDriftCircleMath {
 
   class MdtSegmentT0Fitter : public AthAlgTool, public DCSLFitter, virtual public Muon::IDCSLFitProvider {
@@ -36,34 +34,16 @@ namespace TrkDriftCircleMath {
  
       virtual const DCSLFitter* getFitter() const override { return this; }
 
-      /// Struct for passing data to/from TMinuit fit function
-      struct MdtSegmentT0FcnData {
-        struct HitCoords {
-          double z;
-          double t;
-          double y;
-          double w;
-          double r;
-          const MuonCalib::IRtRelation *rt;
-        };
-        std::vector<HitCoords> data;
-        int used;
-        int t0Error;
-      };
-
     private:
       ToolHandle<MdtCalibrationDbTool> m_calibrationDbTool{this,"CalibrationDbTool","MdtCalibrationDbTool"};
 
       Gaudi::Property<bool> m_trace{this,"TraceOperation",false,"debug - traces operation"};
-      Gaudi::Property<bool> m_dumpToFile{this,"DumpToFile",false,"debug - dumps some performance info"};
       Gaudi::Property<bool> m_rejectWeakTopologies{this,"RejectWeakTopologies",true,"reject topolgies that do not have at least one +- combination in one multilayer"};
       Gaudi::Property<bool> m_scaleErrors{this,"RescaleErrors",true,"rescale errors in fit"};
       Gaudi::Property<bool> m_propagateErrors{this,"PropagateErrors",true,"propagate errors"};
       Gaudi::Property<int> m_minHits{this,"MinimumHits",4,"minimum number of selected hits for t0 fit. Otherwise use default"};
       Gaudi::Property<float> m_dRTol{this,"dRTolerance",0.1};
 
-      std::unique_ptr<TMinuit> m_minuit;
-
       // counters
       mutable std::atomic_uint m_ntotalCalls;
       mutable std::atomic_uint m_npassedNHits;
diff --git a/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/MdtSegmentT0Fitter/src/MdtSegmentT0Fitter.cxx b/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/MdtSegmentT0Fitter/src/MdtSegmentT0Fitter.cxx
index c317a68d4ee1..5c9ab78eaacf 100755
--- a/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/MdtSegmentT0Fitter/src/MdtSegmentT0Fitter.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/MdtSegmentT0Fitter/src/MdtSegmentT0Fitter.cxx
@@ -15,6 +15,10 @@
 #include "MuonRIO_OnTrack/MdtDriftCircleOnTrack.h"
 #include "MuonPrepRawData/MdtPrepData.h"
 
+#include "Minuit2/Minuit2Minimizer.h"
+#include "Math/Functor.h"
+#include <functional>
+
 #include <iostream>
 #include <fstream>
 #include <atomic>
@@ -40,9 +44,72 @@
 
 namespace TrkDriftCircleMath {
 
-  static MdtSegmentT0Fitter::MdtSegmentT0FcnData* g_fcnData ATLAS_THREAD_SAFE = nullptr; ///< Data to pass to/from TMinuit fcn. Guarded with mutex.
-  static std::mutex g_fcnDataMutex; ///< Mutex to protect g_fcnData access
-	    
+  class FunctionToMinimize : public ROOT::Math::IMultiGenFunction {
+    public:
+      struct HitCoords {
+        double z;
+        double t;
+        double y;
+        double w;
+        double r;
+        const MuonCalib::IRtRelation *rt;
+      };
+      FunctionToMinimize(const int used) : m_data(),m_used(used),m_t0Error() {}
+      ~FunctionToMinimize() {m_data.clear();}
+      double DoEval(const double* xx) const {
+        double ang = xx[0];  
+        double b = xx[1];
+        double t0 = xx[2];
+        
+        double cosin = std::cos(ang);
+        double sinus = std::sin(ang);
+        
+        double fval = 0.;
+        // Add t0 constraint 
+        if (m_t0Error == WEAK_TOPO_T0ERROR ) {
+         fval += xx[2]*xx[2]/(1.0 *m_t0Error*m_t0Error);
+        }
+        double t, r, z, y, w, dist;
+        for(int i=0;i<m_used;++i) {
+          t = m_data[i].t - t0;
+          z = m_data[i].z;
+          y = m_data[i].y;
+          w = m_data[i].w;
+          dist = std::abs(b*cosin + z*sinus - y*cosin); // same thing as fabs(a*z - y + b)/sqrt(1. + a*a);
+          double uppercut = m_data[i].rt->tUpper();
+          double lowercut = m_data[i].rt->tLower();
+          // Penalty for t<lowercut and t >uppercut
+          if (t> uppercut ) { // too large 
+            fval += (t-uppercut)* (t-uppercut)*0.1;
+          } else if (t < 0 ) {// too small
+            fval += (t-lowercut)*(t-lowercut)*0.1;
+          }
+          if(t<lowercut) r =  m_data[i].rt->radius(lowercut);
+          else if(t>uppercut)  r = m_data[i].rt->radius(uppercut);
+          else r = m_data[i].rt->radius(t);
+          fval += (dist - r)*(dist - r)*w;
+        }
+        return fval;
+      }
+      ROOT::Math::IBaseFunctionMultiDim* Clone() const {return new FunctionToMinimize(m_used);}
+      unsigned int NDim() const {return 3;}
+      void setT0Error(const int t0Error){m_t0Error=t0Error;}
+      void addCoords(const double z, const double t, const double y, const double w, const double r, const MuonCalib::IRtRelation *rt){
+        HitCoords coords;
+        coords.z=z;
+        coords.t=t;
+        coords.y=y;
+        coords.w=w;
+        coords.r=r;
+        coords.rt=rt;
+        m_data.push_back(coords);
+      }
+    private:
+      std::vector<HitCoords> m_data;
+      int m_used;
+      int m_t0Error;
+  };
+
   MdtSegmentT0Fitter::MdtSegmentT0Fitter(const std::string& ty,const std::string& na,const IInterface* pa)
   : AthAlgTool(ty,na,pa),
     DCSLFitter(), 
@@ -56,15 +123,7 @@ namespace TrkDriftCircleMath {
   }
   
   StatusCode MdtSegmentT0Fitter::initialize() {
-
-    TMinuit* oldMinuit = gMinuit;
-    m_minuit = std::make_unique<TMinuit>(3);
-    m_minuit->SetPrintLevel(-1); // -1: no output, 1: std output
-    if( msgLvl(MSG::VERBOSE) ) m_minuit->SetPrintLevel(1);
-    gMinuit = oldMinuit;
-    
     ATH_CHECK(m_calibrationDbTool.retrieve());
-
     return StatusCode::SUCCESS;
   }
   
@@ -79,7 +138,6 @@ namespace TrkDriftCircleMath {
                   << " sel. hits > 2    " << std::setw(10) << m_npassedNSelectedHits << "   " << scaleFactor*m_npassedNSelectedHits << "\n"
                   << " Hits > min hits  " << std::setw(10) << m_npassedMinHits << "   " << scaleFactor*m_npassedMinHits << "\n"
                   << " Passed Fit       " << std::setw(10) << m_npassedMinuitFit << "   " << scaleFactor*m_npassedMinuitFit  );
-    if(gMinuit == m_minuit.get()) gMinuit = nullptr;
     return StatusCode::SUCCESS;
   }
   
@@ -217,52 +275,6 @@ namespace TrkDriftCircleMath {
     }
     return -1;    // failed to find key
   }
-  
-  /// the fit function
-  /// gets distance between the line and the hit (in the frame whose direction is given by the line segment
-  /// and position is given by the weighted average of all the hits), subtracts off the radius from the rt relation etc 
-  void mdtSegmentT0Fcn(Int_t &/*npar*/, Double_t* grad, Double_t &fval, Double_t* par, Int_t jflag) {
-    if(jflag < 0) grad[0] = 0.;
-    
-    double ang = par[0];  
-    double b = par[1];
-    double t0 = par[2];
-    
-    double cosin = std::cos(ang);
-    double sinus = std::sin(ang);
-    
-    fval = 0.;
-    // Add t0 constraint 
-    if (g_fcnData->t0Error == WEAK_TOPO_T0ERROR ) {
-     fval += par[2]*par[2]/(1.0 *g_fcnData->t0Error*g_fcnData->t0Error);
-    }
-    double t, r, z, y, w, dist;
-    for(int i = 0; i < g_fcnData->used ; i++) {
-      t = g_fcnData->data[i].t - t0;
-      z = g_fcnData->data[i].z;
-      y = g_fcnData->data[i].y;
-      w = g_fcnData->data[i].w;
-      dist = std::abs(b*cosin + z*sinus - y*cosin); // same thing as fabs(a*z - y + b)/sqrt(1. + a*a);
-      double uppercut = g_fcnData->data[i].rt->tUpper();
-      double lowercut = g_fcnData->data[i].rt->tLower();
-// Penalty for t<lowercut and t >uppercut
-      if (t> uppercut ) { // too large 
-	fval += (t-uppercut)* (t-uppercut)*0.1;
-      }else if (t < 0 ) {// too small
-	fval += (t-lowercut)*(t-lowercut)*0.1;
-      }
-	  if(t<lowercut) r =  g_fcnData->data[i].rt->radius(lowercut);
-          else if(t>uppercut)  r =  g_fcnData->data[i].rt->radius(uppercut);
-	  else r = g_fcnData->data[i].rt->radius(t);
-      fval += (dist - r)*(dist - r)*w;
-      
-    }
-    
-    return;
-  }
-  /***********************************************************************************/
-  
-  
   int sign(double a) {
     if(a>0) return 1;
     if(a<0) return -1;
@@ -272,14 +284,17 @@ namespace TrkDriftCircleMath {
     ++m_ntotalCalls;
 
     if(m_trace) ATH_MSG_DEBUG("New seg: ");
+
+    ROOT::Math::Minimizer* minimum = new ROOT::Minuit2::Minuit2Minimizer("algoName");
+    minimum->SetMaxFunctionCalls(1000000);
+    minimum->SetTolerance(0.001);
+    minimum->SetPrintLevel(-1);
+    if(msgLvl(MSG::VERBOSE)) minimum->SetPrintLevel(1);
  
     const DCOnTrackVec& dcs_keep = dcs;
 
     unsigned int N = dcs_keep.size();
 
-    std::unique_ptr<MdtSegmentT0FcnData> fcnData = std::make_unique<MdtSegmentT0FcnData>();
-
-    fcnData->used=0;
     result.setT0Shift(-99999,-99999);
     
     if(N<2) {
@@ -291,16 +306,17 @@ namespace TrkDriftCircleMath {
       return false;
     }  
     ++m_npassedSelectionConsistency;
+    int used=0;
     for(unsigned int i=0;i<N;++i){
-      if( selection[i] == 0 ) ++(fcnData->used);
+      if( selection[i] == 0 ) ++used;
     }
-    if(fcnData->used < 2){
+    if(used < 2){
       if(m_trace) ATH_MSG_DEBUG("TOO FEW HITS SELECTED");
       return false;
     }
     ++m_npassedNSelectedHits;
-    if(fcnData->used < m_minHits) {
-      if(m_trace) ATH_MSG_DEBUG("FEWER THAN Minimum HITS N " << m_minHits << " total hits " <<N<<" used " << fcnData->used);
+    if(used < m_minHits) {
+      if(m_trace) ATH_MSG_DEBUG("FEWER THAN Minimum HITS N " << m_minHits << " total hits " <<N<<" used " << used);
 
       //
       //     Copy driftcircles and reset the drift radii as they might have been overwritten
@@ -339,7 +355,7 @@ namespace TrkDriftCircleMath {
       if(m_trace) ATH_MSG_DEBUG(" chi2 total " << result.chi2() << " angle " << result.line().phi() << " y0 " << result.line().y0()  << " nhits "<< selection.size() << " refit ok " << iok);
       return oldrefit;
     } else {
-      if(m_trace) ATH_MSG_DEBUG("FITTING FOR T0 N "<<N<<" used " << fcnData->used);
+      if(m_trace) ATH_MSG_DEBUG("FITTING FOR T0 N "<<N<<" used " << used);
     } 
 
     ++m_npassedMinHits;
@@ -361,10 +377,9 @@ namespace TrkDriftCircleMath {
     std::vector<double> dr(N);
     std::vector<double> t(N);
     std::vector<const MuonCalib::IRtRelation*> rtpointers(N);
-    
-    // allocate memory for data
-    if(fcnData->data.capacity() != 50) fcnData->data.reserve(50);
-    fcnData->data.resize(fcnData->used);
+
+    FunctionToMinimize minFunct(used);
+
     {
       DCOnTrackVec::const_iterator it = dcs_keep.begin();
       DCOnTrackVec::const_iterator it_end = dcs_keep.end();
@@ -442,13 +457,7 @@ namespace TrkDriftCircleMath {
     
     for(int ii=0 ;it!=it_end; ++it, ++ii ){
       if( selection[ii] == 0 ) {
-        fcnData->data[selcount].z = z[ii];
-        fcnData->data[selcount].y = y[ii];
-        fcnData->data[selcount].r = r[ii];
-        fcnData->data[selcount].w = w[ii];
-        fcnData->data[selcount].rt = rtpointers[ii];
-        double r2tval;
-        r2tval = r2t_ext(&rtpointers,  r[ii], ii) ;
+        double r2tval = r2t_ext(&rtpointers,  r[ii], ii) ;
         tl = rtpointers[ii]->tLower();
         th = rtpointers[ii]->tUpper();
         if(t[ii] - tl < min_tlower) min_tlower = t[ii] - tl;
@@ -468,8 +477,9 @@ namespace TrkDriftCircleMath {
         t0seed += tee0;
         st0 += tee0*tee0;
         if(tee0 < min_t0 && std::abs(r2tval) < R2TSPURIOUS) min_t0 = tee0;
-        
-        fcnData->data[selcount].t = t[ii];
+
+        minFunct.addCoords(z[ii], t[ii], y[ii], w[ii], r[ii], rtpointers[ii]);
+
         selcount++;
       } 
     }
@@ -518,13 +528,15 @@ namespace TrkDriftCircleMath {
       if(it->id().ml()==1&&sdist < 0) nml2n++;
     }
 
-// Define t0 constraint in Minuit 
-    fcnData->t0Error = STRONG_TOPO_T0ERROR;
-    if (nml1p+nml2p < 2 || nml1n+nml2n < 2) fcnData->t0Error = WEAK_TOPO_T0ERROR;
+// Define t0 constraint in Minuit
+    int t0Error = STRONG_TOPO_T0ERROR;
+    if (nml1p+nml2p < 2 || nml1n+nml2n < 2) t0Error = WEAK_TOPO_T0ERROR;
+
+    minFunct.setT0Error(t0Error);
 
 // Reject topologies where in one of the Multilayers no +- combination is present
     if((nml1p<1||nml1n<1)&&(nml2p<1||nml2n<1)&&m_rejectWeakTopologies) {
-      if(m_trace) ATH_MSG_DEBUG("Combination rejected for positive radii ML1 " <<  nml1p << " ML2 " <<  nml2p << " negative radii ML1 " << nml1n << " ML " << nml2n << " used hits " << fcnData->used << " t0 Error " << fcnData->t0Error);
+      if(m_trace) ATH_MSG_DEBUG("Combination rejected for positive radii ML1 " <<  nml1p << " ML2 " <<  nml2p << " negative radii ML1 " << nml1n << " ML " << nml2n << " used hits " << used << " t0 Error " << t0Error);
       it = dcs.begin();
       it_end = dcs.end();
       double chi2p = 0.; 
@@ -554,127 +566,32 @@ namespace TrkDriftCircleMath {
       return oldrefit;
     }  // end rejection of weak topologies  
 
-    if(m_trace) ATH_MSG_DEBUG("positive radii ML1 " <<  nml1p << " ML2 " <<  nml2p << " negative radii ML1 " << nml1n << " ML " << nml2n << " used hits " << fcnData->used << " t0 Error " << fcnData->t0Error);
-    
-    int errFlag = 0;
-    int errFlag1 = 0;
-    int errFlag2 = 0;
-    int errFlag3 = 0;
-    int errFlag4 = 0;
-    int errFlag5 = 0;
-    {
-      // The part where the fcn gets used, requires locking to protect fcnData from concurrent access
-      std::scoped_lock lock(g_fcnDataMutex);
-      g_fcnData = fcnData.get();
-
-      m_minuit->SetFCN(mdtSegmentT0Fcn);
-      Double_t arglist[3];
-      
-      // Set printout level
-      arglist[0] = -1;
-      // Clear previous fit
-      m_minuit->mncler();
-      arglist[0] = -1;
-      
-      Double_t vstart[3];
-      vstart[0] = theta;
-      // x' = x - xc, y' = y - yc => y' = m x' + b + m xc - yc
-      // and b = yc - m xc
-      vstart[1] = d ; 
-      vstart[2] = 0 ;
+    if(m_trace) ATH_MSG_DEBUG("positive radii ML1 " <<  nml1p << " ML2 " <<  nml2p << " negative radii ML1 " << nml1n << " ML " << nml2n << " used hits " << used << " t0 Error " << t0Error);
 
-      // if t0Seed value from outside use this
-      if(t0Seed > -999.)  vstart[2] = t0Seed; 
+    Double_t step[3] = {0.01 , 0.01 , 0.1 };
+    // starting point
+    Double_t variable[3] = {theta,d,0};
+    // if t0Seed value from outside use this
+    if(t0Seed > -999.) variable[2] = t0Seed; 
 
-      Double_t step[3] = {0.01 , 0.01 , 0.1 };
-      
-      if(m_trace) {
-        ATH_MSG_DEBUG("\n____________INITIAL VALUES________________" );
-        ATH_MSG_DEBUG("Theta " << theta << "("<<std::tan(theta)<<") d " << vstart[1]);
-      }
-      
+    minimum->SetVariable(0,"a",variable[0], step[0]);
+    minimum->SetVariable(1,"b",variable[1], step[1]);
+    minimum->SetVariable(2,"t0",variable[2], step[2]);
 
-      m_minuit->mnparm(0, "a", vstart[0], step[0], -0.5, 3.5,errFlag);
-      m_minuit->mnparm(1, "b", vstart[1], step[1], 0., 0.,errFlag);
-      m_minuit->mnparm(2, "t0", vstart[2], step[2], 0., 0.,errFlag);
+    minimum->SetFunction(minFunct);
 
-      if (errFlag !=0 &&m_trace)  {
-        ATH_MSG_DEBUG("ALARM with steering of Minuit variable " << errFlag);
-      }
-      
-      m_minuit->FixParameter(0);
-      m_minuit->FixParameter(1);
-
-      m_minuit->mnexcm("MINIMIZE", arglist, 0,errFlag1);
-
-      m_minuit->Release(0);
-      m_minuit->Release(1);
-      m_minuit->FixParameter(2);
-      m_minuit->mnexcm("MINIMIZE", arglist, 0,errFlag2);
-      m_minuit->mnexcm("MIGRAD", arglist, 0,errFlag3);
-      m_minuit->Release(2);
-      m_minuit->mnexcm("MINIMIZE", arglist, 0,errFlag4);
-      m_minuit->mnexcm("MIGRAD", arglist, 0,errFlag5);
-      if(errFlag5!=0&&errFlag4==0) {
-        m_minuit->mnexcm("MINIMIZE", arglist, 0,errFlag4); 
-        if (errFlag4 == 0 &&m_trace)  {
-          ATH_MSG_DEBUG(" ALARM Fall back to MINIMIZE " << errFlag4);
-        }
-      }
-      g_fcnData = nullptr; 
-    } // end of scoped_lock
-    
-    // Get the chisquare and errors
-    double chisq(0);
-    double edm(0);
-    double errdef(0);
-    int npari(0);
-    int nparx(0);
-    int icstat(0);
-    m_minuit->mnstat(chisq, edm, errdef, npari, nparx, icstat);
-   
-    int fitretval = errFlag5;
-    if (npari<0 || nparx < 0 || chisq < 0) ATH_MSG_WARNING("MdtSegmentT0Fitter MINUIT problem " << " chisq "<<chisq<<" npari "<<npari<<" nparx "<< nparx <<" fitretval "<< fitretval<<" (cf. ATLASRECTS-5795)");
-
-    if (fitretval !=0 &&m_trace)  {
-      ATH_MSG_DEBUG(  " ALARM return value " << fitretval  );
-    }
-    if(m_dumpToFile) {
-      std::ofstream ff;
-      ff.open("fitres.txt", std::ios::out | std::ios::app);
-      ff<<npari<<" "<<nparx<<" "<<fitretval<<" "<<chisq<< " "<< std::endl;
-      ff.close();
-    }
-    if(m_trace) ATH_MSG_DEBUG("chisq "<<chisq<<" npari "<<npari<<" nparx "<<nparx<<" fitretval "<<fitretval);
+    // do the minimization
+    minimum->Minimize();
 
-    // Do standard DCSL fit if minuit is bad 
-    // Do standard DCSL fit if all fits from minuit are bad 
-    if (errFlag5!=0&&errFlag4!=0&&errFlag3!=0&&errFlag2!=0&&errFlag1!=0) {
-      if(m_trace)ATH_MSG_DEBUG(" ALARM Minimize fix " << errFlag1 << " ALARM minimize release " << errFlag2 
-			<< " ALARM migrad fix 1 " << errFlag3 << " ALARM minimize all free" << errFlag4 << " ALARM migrad all free " 
-                                << errFlag5);
+    const double *results = minimum->X();
+    const double *errors = minimum->Errors();
+    ATH_MSG_DEBUG("Minimum: f(" << results[0] << "+-" << errors[0] << "," << results[1]<< "+-" << errors[1]<< "," << results[2] << "+-" << errors[2]<< "): " << minimum->MinValue());
 
-      DCOnTrackVec dcs_new;
-      dcs_new.reserve(dcs.size());
-      DCOnTrackVec::const_iterator it = dcs.begin();
-      DCOnTrackVec::const_iterator it_end = dcs.end();
-    
-      for(int i=0; it!=it_end; ++it, ++i ){
-        const DriftCircle* ds  = & dcs[i];
-        DriftCircle dc_keep(ds->position(), ds->rot()->driftRadius(), ds->dr(), ds->drPrecise(), ds->state(), ds->id(), ds->index(),ds->rot() );
-        DCOnTrack dc_new(dc_keep, 0., 0.);
-        dc_new.state(dcs[i].state());
-        dcs_new.push_back( dc_new );
-      }
-      bool oldrefit =  DCSLFitter::fit( result, line , dcs_new, selection );
-      return oldrefit;
-    }
     ++m_npassedMinuitFit;
 
     // Get the fit values
-    double aret(0);
-    double aErr(0);
-    m_minuit->GetParameter(0,aret,aErr); // theta returned
+    double aret=results[0];
+    double aErr=errors[0];
     double dtheta = aErr;
     double tana = std::tan(aret); // tangent of angle
     double ang = aret;  // between zero and pi
@@ -687,48 +604,41 @@ namespace TrkDriftCircleMath {
       cosin = -cosin;
     }
     ang = std::atan2(sinus, cosin);
-    
-    
-    double b(0);
-    double bErr(0);
-    m_minuit->GetParameter(1,b,bErr); // intercept
-    double t0(0);
-    double t0Err(0);
-    m_minuit->GetParameter(2,t0,t0Err);
+    double b=results[1];
+    double bErr=errors[1];
+    double t0=results[2];
+    double t0Err=errors[2];
     double dy0 = cosin * bErr - b * sinus * aErr;
     
     double del_t;
     del_t = std::abs(rtpointers[0]->radius((t0+t0Err)) - rtpointers[0]->radius(t0)) ;
-    
+
     if(m_trace) {
       ATH_MSG_DEBUG("____________FINAL VALUES________________" );
       ATH_MSG_DEBUG("Values: a "<<tana<<" d "<<b * cosin <<" t0 "<<t0);
       ATH_MSG_DEBUG("Errors: a "<<aErr<<" b "<<dy0 <<" t0 "<<t0Err);
     }
     d = b * cosin;
-    double covar[3][3];
-    m_minuit->mnemat(&covar[0][0],3);  // 3x3
     if(m_trace) {
       msg() << MSG::DEBUG <<"COVAR  ";
       for(int it1=0; it1<3; it1++) {
         for(int it2=0; it2<3; it2++) {
-          msg() << MSG::DEBUG <<covar[it1][it2]<<" ";
+          msg() << MSG::DEBUG <<minimum->CovMatrix(it1,it2)<<" ";
         }
         msg() << MSG::DEBUG << endmsg;
       }
     }
-    
+
     result.dcs().clear();
     result.clusters().clear();
     result.emptyTubes().clear();
 
     if(m_trace) ATH_MSG_DEBUG("after fit theta "<<ang<<" sinus "<<sinus<< " cosin "<< cosin);
-    
+
     double chi2 = 0;
     unsigned int nhits(0);
     double yl;
-    
-    
+
     // calculate predicted hit positions from track parameters
     it = dcs_keep.begin();
     it_end = dcs_keep.end();
@@ -775,7 +685,7 @@ namespace TrkDriftCircleMath {
       double covsq=0;
       for(int rr=0; rr<3; rr++) {
         for(int cc=0; cc<3; cc++) {
-          covsq += deriv[rr]*covar[rr][cc]* deriv[cc];
+          covsq += deriv[rr]*minimum->CovMatrix(rr,cc)* deriv[cc];
         }
       }
       if(m_trace) {
@@ -783,8 +693,8 @@ namespace TrkDriftCircleMath {
 	if( covsq < 0. ){
 	  for(int rr=0; rr<3; rr++) {
 	    for(int cc=0; cc<3; cc++) {
-	      double dot = deriv[rr]*covar[rr][cc]* deriv[cc];
-	      ATH_MSG_DEBUG(" adding term " << dot << " dev1 " << deriv[rr] << " cov " << covar[rr][cc] << " dev2 " << deriv[cc]);
+	      double dot = deriv[rr]*minimum->CovMatrix(rr,cc)* deriv[cc];
+	      ATH_MSG_DEBUG(" adding term " << dot << " dev1 " << deriv[rr] << " cov " << minimum->CovMatrix(rr,cc) << " dev2 " << deriv[cc]);
 	    }
 	  }
 	}
@@ -836,7 +746,7 @@ namespace TrkDriftCircleMath {
       if(chi2/(nhits-NUMPAR) > 5) {
         ATH_MSG_DEBUG("_______NOT GOOD ");
       }
-      ATH_MSG_DEBUG("chi2 "<<chi2<<" per dof "<<chi2/(nhits-NUMPAR)<<" root chisq "<<chisq);
+      ATH_MSG_DEBUG("chi2 "<<chi2<<" per dof "<<chi2/(nhits-NUMPAR));
     }
     return true;
   }
-- 
GitLab


From be4e221136d2f4dc2c5d8a6f16a39b1152510941 Mon Sep 17 00:00:00 2001
From: Tomasz Bold <tomasz.bold@gmail.com>
Date: Tue, 15 Dec 2020 17:46:58 +0000
Subject: [PATCH 042/225] Fixed references for emulation tests

---
 .../DecisionHandling/share/emu_step_menu_processing.ref     | 4 ++--
 .../DecisionHandling/share/emu_step_processing.ref          | 6 +++---
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/Trigger/TrigSteer/DecisionHandling/share/emu_step_menu_processing.ref b/Trigger/TrigSteer/DecisionHandling/share/emu_step_menu_processing.ref
index 5b79e11c73ac..ce9c480634a2 100644
--- a/Trigger/TrigSteer/DecisionHandling/share/emu_step_menu_processing.ref
+++ b/Trigger/TrigSteer/DecisionHandling/share/emu_step_menu_processing.ref
@@ -144,7 +144,7 @@ TrigSignatureMoniMT                                 INFO -- #2511524900 Events
 TrigSignatureMoniMT                                 INFO -- #2511524900 Features                             3          -          3          3          
 TrigSignatureMoniMT                                 INFO HLT_TestChain6_muv1_TestChain10_ev1_L1MU6_EM5 #64374772
 TrigSignatureMoniMT                                 INFO -- #64374772 Events           2          2          1          1          1          1          1          
-TrigSignatureMoniMT                                 INFO -- #64374772 Features                               3          3          3          3          
+TrigSignatureMoniMT                                 INFO -- #64374772 Features                               5          5          5          5          
 TrigSignatureMoniMT                                 INFO HLT_TestChain6_muv1_TestChain10_muv1_L12MU6 #3196402061
 TrigSignatureMoniMT                                 INFO -- #3196402061 Events         2          2          1          0          0          0          0          
 TrigSignatureMoniMT                                 INFO -- #3196402061 Features                             3          0          0          0          
@@ -153,7 +153,7 @@ TrigSignatureMoniMT                                 INFO -- #1237112870 Events
 TrigSignatureMoniMT                                 INFO -- #1237112870 Features                             0          0          0          0          
 TrigSignatureMoniMT                                 INFO HLT_TestChain6_muv2_TestChain8_ev2_L1MU6_EM5 #3476793373
 TrigSignatureMoniMT                                 INFO -- #3476793373 Events         2          2          2          2          2          -          2          
-TrigSignatureMoniMT                                 INFO -- #3476793373 Features                             4          4          4          -          
+TrigSignatureMoniMT                                 INFO -- #3476793373 Features                             7          7          7          -          
 TrigSignatureMoniMT                                 INFO HLT_TestChain8_ev1_L1EM5 #1677577445
 TrigSignatureMoniMT                                 INFO -- #1677577445 Events         4          4          3          3          3          -          3          
 TrigSignatureMoniMT                                 INFO -- #1677577445 Features                             4          4          4          -          
diff --git a/Trigger/TrigSteer/DecisionHandling/share/emu_step_processing.ref b/Trigger/TrigSteer/DecisionHandling/share/emu_step_processing.ref
index c561eca08f8b..0df617cc3d1b 100644
--- a/Trigger/TrigSteer/DecisionHandling/share/emu_step_processing.ref
+++ b/Trigger/TrigSteer/DecisionHandling/share/emu_step_processing.ref
@@ -131,7 +131,7 @@ TrigSignatureMoniMT                                 INFO -- #1756953305 Events
 TrigSignatureMoniMT                                 INFO -- #1756953305 Features                             4          4          4          -          
 TrigSignatureMoniMT                                 INFO HLT_TestChain5_ev1_TestChain8_ev1_2TestChain6_muv1_L1EM3_L1EM5_L12MU6 #1820214917
 TrigSignatureMoniMT                                 INFO -- #1820214917 Events         1          1          1          1          -          -          1          
-TrigSignatureMoniMT                                 INFO -- #1820214917 Features                             2          2          -          -          
+TrigSignatureMoniMT                                 INFO -- #1820214917 Features                             5          5          -          -          
 TrigSignatureMoniMT                                 INFO HLT_TestChain5_ev1_TestChain8_ev1_L12EM3 #2709794009
 TrigSignatureMoniMT                                 INFO -- #2709794009 Events         0          0          0          0          -          -          0          
 TrigSignatureMoniMT                                 INFO -- #2709794009 Features                             0          0          -          -          
@@ -149,7 +149,7 @@ TrigSignatureMoniMT                                 INFO -- #2511524900 Events
 TrigSignatureMoniMT                                 INFO -- #2511524900 Features                             3          -          3          3          
 TrigSignatureMoniMT                                 INFO HLT_TestChain6_muv1_TestChain10_ev1_L1MU6_EM5 #64374772
 TrigSignatureMoniMT                                 INFO -- #64374772 Events           2          2          2          1          -          1          1          
-TrigSignatureMoniMT                                 INFO -- #64374772 Features                               4          3          -          3          
+TrigSignatureMoniMT                                 INFO -- #64374772 Features                               7          5          -          5          
 TrigSignatureMoniMT                                 INFO HLT_TestChain6_muv1_TestChain10_muv1_L12MU6 #3196402061
 TrigSignatureMoniMT                                 INFO -- #3196402061 Events         2          2          1          0          -          -          0          
 TrigSignatureMoniMT                                 INFO -- #3196402061 Features                             3          0          -          -          
@@ -158,7 +158,7 @@ TrigSignatureMoniMT                                 INFO -- #3205587050 Events
 TrigSignatureMoniMT                                 INFO -- #3205587050 Features                             0          0          -          -          
 TrigSignatureMoniMT                                 INFO HLT_TestChain6_muv2_TestChain8_ev2_L1MU6_EM5 #3476793373
 TrigSignatureMoniMT                                 INFO -- #3476793373 Events         2          2          2          2          -          -          2          
-TrigSignatureMoniMT                                 INFO -- #3476793373 Features                             4          4          -          -          
+TrigSignatureMoniMT                                 INFO -- #3476793373 Features                             7          7          -          -          
 TrigSignatureMoniMT                                 INFO HLT_TestChain8_ev1_L1EM5 #1677577445
 TrigSignatureMoniMT                                 INFO -- #1677577445 Events         4          4          3          3          3          -          3          
 TrigSignatureMoniMT                                 INFO -- #1677577445 Features                             4          4          4          -          
-- 
GitLab


From c903e209dfee2b50ace0d6ffe54c8952cb345f21 Mon Sep 17 00:00:00 2001
From: christos <christos@cern.ch>
Date: Tue, 15 Dec 2020 20:12:32 +0100
Subject: [PATCH 043/225] topoEgammaBuilder pass EventContext to the
 ElementLinks ctors

---
 .../egammaAlgs/src/topoEgammaBuilder.cxx       | 16 +++++++++-------
 .../egamma/egammaAlgs/src/topoEgammaBuilder.h  | 18 +++++++++---------
 2 files changed, 18 insertions(+), 16 deletions(-)

diff --git a/Reconstruction/egamma/egammaAlgs/src/topoEgammaBuilder.cxx b/Reconstruction/egamma/egammaAlgs/src/topoEgammaBuilder.cxx
index 1351748fb9d8..eb7ffa5166fd 100644
--- a/Reconstruction/egamma/egammaAlgs/src/topoEgammaBuilder.cxx
+++ b/Reconstruction/egamma/egammaAlgs/src/topoEgammaBuilder.cxx
@@ -60,7 +60,7 @@ topoEgammaBuilder::initialize()
     m_egammaOQTool.disable();
   }
 
-  //do we actually do ambiguity 
+  //do we actually do ambiguity
   m_doAmbiguity = !m_ambiguityTool.empty();
   if (m_doElectrons && m_doPhotons && m_doAmbiguity) {
     ATH_CHECK(m_ambiguityTool.retrieve());
@@ -100,15 +100,15 @@ topoEgammaBuilder::execute(const EventContext& ctx) const
   }
 
   SG::WriteHandle<xAOD::ElectronContainer> electronContainer(m_electronOutputKey, ctx);
-  
+
   ATH_CHECK(electronContainer.record(std::make_unique<xAOD::ElectronContainer>(),
                                      std::make_unique<xAOD::ElectronAuxContainer>()));
 
   SG::WriteHandle<xAOD::PhotonContainer> photonContainer(m_photonOutputKey,ctx);
-  
+
   ATH_CHECK(photonContainer.record(std::make_unique<xAOD::PhotonContainer>(),
                                    std::make_unique<xAOD::PhotonAuxContainer>()));
-  
+
   electrons = electronContainer.ptr();
   photons = photonContainer.ptr();
 
@@ -248,7 +248,7 @@ topoEgammaBuilder::execute(const EventContext& ctx) const
   }
   // Do the ambiguity Links
   if (m_doElectrons && m_doPhotons) {
-    ATH_CHECK(doAmbiguityLinks(electrons, photons));
+    ATH_CHECK(doAmbiguityLinks(ctx,electrons, photons));
   }
 
   return StatusCode::SUCCESS;
@@ -256,6 +256,7 @@ topoEgammaBuilder::execute(const EventContext& ctx) const
 
 StatusCode
 topoEgammaBuilder::doAmbiguityLinks(
+  const EventContext& ctx,
   xAOD::ElectronContainer* electronContainer,
   xAOD::PhotonContainer* photonContainer) const
 {
@@ -287,7 +288,7 @@ topoEgammaBuilder::doAmbiguityLinks(
       if (caloClusterLinks(*(electron->caloCluster())).at(0) ==
           caloClusterLinks(*(photon->caloCluster())).at(0)) {
         ElementLink<xAOD::EgammaContainer> link(*electronContainer,
-                                                electronIndex);
+                                                electronIndex,ctx);
         ELink(*photon) = link;
         break;
       }
@@ -309,7 +310,8 @@ topoEgammaBuilder::doAmbiguityLinks(
 
       if (caloClusterLinks(*(electron->caloCluster())).at(0) ==
           caloClusterLinks(*(photon->caloCluster())).at(0)) {
-        ElementLink<xAOD::EgammaContainer> link(*photonContainer, photonIndex);
+        ElementLink<xAOD::EgammaContainer> link(
+          *photonContainer, photonIndex, ctx);
         ELink(*electron) = link;
         break;
       }
diff --git a/Reconstruction/egamma/egammaAlgs/src/topoEgammaBuilder.h b/Reconstruction/egamma/egammaAlgs/src/topoEgammaBuilder.h
index 658b1ae97e1b..e086726d2326 100644
--- a/Reconstruction/egamma/egammaAlgs/src/topoEgammaBuilder.h
+++ b/Reconstruction/egamma/egammaAlgs/src/topoEgammaBuilder.h
@@ -65,17 +65,17 @@ private:
     bool getPhoton(const egammaRec* egRec, xAOD::PhotonContainer *photonContainer,
             const unsigned int author, uint8_t type) const;
 
+    /** @brief Do the final ambiguity **/
+    StatusCode doAmbiguityLinks(const EventContext& ctx,
+                                xAOD::ElectronContainer* electronContainer,
+                                xAOD::PhotonContainer* photonContainer) const;
 
-    /** @brief Do the final ambiguity **/  
-    StatusCode doAmbiguityLinks(xAOD::ElectronContainer *electronContainer, 
-            xAOD::PhotonContainer *photonContainer) const ;
-
-    /** @brief Call a tool using contExecute and electrons, photon containers if given **/
+    /** @brief Call a tool using contExecute and electrons, photon containers if
+     * given **/
     StatusCode CallTool(const EventContext& ctx,
-            const ToolHandle<IegammaBaseTool>& tool, 
-            xAOD::ElectronContainer *electronContainer = nullptr, 
-            xAOD::PhotonContainer *photonContainer = nullptr) const;
-
+                        const ToolHandle<IegammaBaseTool>& tool,
+                        xAOD::ElectronContainer* electronContainer = nullptr,
+                        xAOD::PhotonContainer* photonContainer = nullptr) const;
 
     /** @brief Vector of tools for dressing electrons and photons **/
     ToolHandleArray<IegammaBaseTool> m_egammaTools {this,
-- 
GitLab


From 00b89010b35ab4a14f4be69563baf7e8a91069d6 Mon Sep 17 00:00:00 2001
From: Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
Date: Tue, 15 Dec 2020 20:50:19 +0100
Subject: [PATCH 044/225] Updated all projects to atlasexternals-2.0.93.

---
 Projects/AnalysisBase/externals.txt   | 2 +-
 Projects/AthAnalysis/externals.txt    | 2 +-
 Projects/AthDataQuality/externals.txt | 2 +-
 Projects/AthGeneration/externals.txt  | 2 +-
 Projects/AthSimulation/externals.txt  | 2 +-
 Projects/Athena/externals.txt         | 2 +-
 Projects/VP1Light/externals.txt       | 2 +-
 7 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/Projects/AnalysisBase/externals.txt b/Projects/AnalysisBase/externals.txt
index 56cafc4159cf..5194df2180d4 100644
--- a/Projects/AnalysisBase/externals.txt
+++ b/Projects/AnalysisBase/externals.txt
@@ -6,4 +6,4 @@
 # forbidden.
 
 # The version of atlas/atlasexternals to use:
-AnalysisBaseExternalsVersion = 2.0.92
+AnalysisBaseExternalsVersion = 2.0.93
diff --git a/Projects/AthAnalysis/externals.txt b/Projects/AthAnalysis/externals.txt
index 3eab080a1962..daedfe45cd05 100644
--- a/Projects/AthAnalysis/externals.txt
+++ b/Projects/AthAnalysis/externals.txt
@@ -6,4 +6,4 @@
 # forbidden.
 
 # The version of atlas/atlasexternals to use:
-AthAnalysisExternalsVersion = 2.0.92
+AthAnalysisExternalsVersion = 2.0.93
diff --git a/Projects/AthDataQuality/externals.txt b/Projects/AthDataQuality/externals.txt
index 7e3bc3a47628..878d0bf1cf52 100644
--- a/Projects/AthDataQuality/externals.txt
+++ b/Projects/AthDataQuality/externals.txt
@@ -5,4 +5,4 @@
 # an "origin/" prefix before it. For tags however this is explicitly
 # forbidden.
 
-AtlasExternalsVersion = 2.0.92
+AtlasExternalsVersion = 2.0.93
diff --git a/Projects/AthGeneration/externals.txt b/Projects/AthGeneration/externals.txt
index 02a983fc934c..d18f36322222 100644
--- a/Projects/AthGeneration/externals.txt
+++ b/Projects/AthGeneration/externals.txt
@@ -6,4 +6,4 @@
 # forbidden.
 
 # The version of atlas/atlasexternals to use:
-AthGenerationExternalsVersion = 2.0.92
+AthGenerationExternalsVersion = 2.0.93
diff --git a/Projects/AthSimulation/externals.txt b/Projects/AthSimulation/externals.txt
index 278b93235d14..900556adffda 100644
--- a/Projects/AthSimulation/externals.txt
+++ b/Projects/AthSimulation/externals.txt
@@ -6,4 +6,4 @@
 # forbidden.
 
 # The version of atlas/atlasexternals to use:
-AthSimulationExternalsVersion = 2.0.92
+AthSimulationExternalsVersion = 2.0.93
diff --git a/Projects/Athena/externals.txt b/Projects/Athena/externals.txt
index d69bd120be45..5e279150d955 100644
--- a/Projects/Athena/externals.txt
+++ b/Projects/Athena/externals.txt
@@ -6,4 +6,4 @@
 # forbidden.
 
 # The version of atlas/atlasexternals to use:
-AthenaExternalsVersion = 2.0.92
+AthenaExternalsVersion = 2.0.93
diff --git a/Projects/VP1Light/externals.txt b/Projects/VP1Light/externals.txt
index ae41cc700aaa..488dcf5ae416 100644
--- a/Projects/VP1Light/externals.txt
+++ b/Projects/VP1Light/externals.txt
@@ -6,4 +6,4 @@
 # forbidden.
 
 # The version of atlas/atlasexternals to use:
-VP1LightExternalsVersion = 2.0.92
+VP1LightExternalsVersion = 2.0.93
-- 
GitLab


From 2654d383f52098c1f216478507e2f77fcc4bdc71 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Tue, 15 Dec 2020 16:17:58 +0100
Subject: [PATCH 045/225] StoreGate: Fix potential deadlock in removeProxy.

In removeProxy(), don't try to get a pointer from a proxy if it's
not valid.  Doing so may trigger I/O.  Besides being useless here,
we may get deadlocks if we call into I/O code while holding the SG lock.

See ATEAM-685.
---
 Control/StoreGate/src/SGImplSvc.cxx | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/Control/StoreGate/src/SGImplSvc.cxx b/Control/StoreGate/src/SGImplSvc.cxx
index 66d8f08d59c3..225df8b11272 100644
--- a/Control/StoreGate/src/SGImplSvc.cxx
+++ b/Control/StoreGate/src/SGImplSvc.cxx
@@ -1311,15 +1311,21 @@ SGImplSvc::removeProxy(DataProxy* proxy, const void* pTrans,
   }
 
   // remove all entries from t2p map
-  this->t2pRemove(pTrans);
-  SG::DataProxy::CLIDCont_t clids = proxy->transientID();
-  for (SG::DataProxy::CLIDCont_t::const_iterator i = clids.begin();
-       i != clids.end();
-       ++i)
+  //  --- only if the proxy actually has an object!
+  //      otherwise, we can trigger I/O.
+  //      besides being useless here, we can get deadlocks if we
+  //      call into the I/O code while holding the SG lock.
+  if (proxy->isValidObject()) {
+    this->t2pRemove(pTrans);
+    SG::DataProxy::CLIDCont_t clids = proxy->transientID();
+    for (SG::DataProxy::CLIDCont_t::const_iterator i = clids.begin();
+         i != clids.end();
+         ++i)
     {
       void* ptr = SG::DataProxy_cast (proxy, *i);
       this->t2pRemove(ptr);
     }
+  }
 
   // remove from store
   return m_pStore->removeProxy(proxy, forceRemove, true);
-- 
GitLab


From 946c3c15981ba1e428c8f02b604f1b2d3910d760 Mon Sep 17 00:00:00 2001
From: christos <christos@cern.ch>
Date: Tue, 15 Dec 2020 22:26:17 +0100
Subject: [PATCH 046/225] Pass the EventContext from the e/gamma
 accept(ctx,...) to  the electons accept(ctx...)

---
 .../Root/AsgElectronLikelihoodTool.cxx        | 158 +++++++++---------
 1 file changed, 79 insertions(+), 79 deletions(-)

diff --git a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/Root/AsgElectronLikelihoodTool.cxx b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/Root/AsgElectronLikelihoodTool.cxx
index 47e1fd55c2e4..65bd255b1ba0 100644
--- a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/Root/AsgElectronLikelihoodTool.cxx
+++ b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/Root/AsgElectronLikelihoodTool.cxx
@@ -96,7 +96,7 @@ AsgElectronLikelihoodTool::AsgElectronLikelihoodTool(const std::string& myname)
   declareProperty("useOneExtraHighETLHBin",m_rootTool->m_useOneExtraHighETLHBin,"Use one extra bin for high ET LH");
   // cut on Wstot above HighETBinThreshold
   declareProperty("CutWstotAtHighET",m_rootTool->m_cutWstotAtHighET,"Cut on Wstot above HighETBinThreshold");
-  // cut on EoverP above HighETBinThreshold 
+  // cut on EoverP above HighETBinThreshold
   declareProperty("CutEoverPAtHighET",m_rootTool->m_cutEoverPAtHighET,"Cut on EoverP above HighETBinThreshold");
   // ET threshold for using high ET cuts and bin
   declareProperty("HighETBinThreshold",m_rootTool->m_highETBinThreshold,"ET threshold for using high ET cuts and bin");
@@ -145,34 +145,34 @@ StatusCode AsgElectronLikelihoodTool::initialize()
 {
 
     ATH_MSG_INFO("initialize : WP " << m_WorkingPoint.size() << " " << m_configFile.size());
-    
+
   std::string PDFfilename(""); //Default
 
   if(!m_WorkingPoint.empty()){
     m_configFile=AsgConfigHelper::findConfigFile(m_WorkingPoint,EgammaSelectors::LHPointToConfFile);
     ATH_MSG_INFO("operating point : " << this->getOperatingPointName());
   }
-  
+
   if(!m_configFile.empty()){
     std::string configFile = PathResolverFindCalibFile( m_configFile);
-    if(configFile.empty()){ 
+    if(configFile.empty()){
       ATH_MSG_ERROR("Could not locate " << m_configFile );
       return StatusCode::FAILURE;
-    } 
+    }
 
     ATH_MSG_DEBUG("Configfile to use  " << m_configFile );
     TEnv env(configFile.c_str());
-    
+
     // Get the input PDFs in the tool.
     ATH_MSG_DEBUG("Get the input PDFs in the tool ");
-    
+
     if(!m_pdfFileName.empty())
       {  //If the property was set by the user, take that.
         ATH_MSG_INFO("Setting user specified PDF file " << m_pdfFileName);
         PDFfilename = m_pdfFileName;
       } else {
       if (m_configFile.find("dev/") != std::string::npos) {
-	
+
         std::string PDFdevval = env.GetValue("inputPDFFileName", "ElectronPhotonSelectorTools/v1/ElectronLikelihoodPdfs.root");
         PDFfilename = ("dev/"+PDFdevval);
         ATH_MSG_DEBUG ( "Getting the input PDFs from: " << PDFfilename  );
@@ -235,25 +235,25 @@ StatusCode AsgElectronLikelihoodTool::initialize()
     m_rootTool->m_discLooseForPileupTransform4GeV = AsgConfigHelper::HelperDouble("DiscLooseForPileupTransform4GeV",env);
     m_rootTool->m_discMaxForPileupTransform = env.GetValue("DiscMaxForPileupTransform", 2.0);
     m_rootTool->m_pileupMaxForPileupTransform = env.GetValue("PileupMaxForPileupTransform", 50);
-   
+
   } else{  //Error if it cant find the conf
       ATH_MSG_ERROR("Could not find configuration file");
       return StatusCode::FAILURE;
   }
   ///-----------End of text config----------------------------
-  
+
   // Setup primary vertex key handle
   ATH_CHECK( m_primVtxContKey.initialize(m_usePVCont) );
-  // Setup HI container key handle (must come after init from env) 
+  // Setup HI container key handle (must come after init from env)
   bool doCentralityTransform = m_rootTool->m_doCentralityTransform;
   ATH_CHECK(m_HIESContKey.initialize(doCentralityTransform&&m_useCaloSumsCont));
- 
+
 
   // Get the name of the current operating point, and massage the other strings accordingly
   ATH_MSG_VERBOSE( "Going to massage the labels based on the provided operating point..." );
   // Get the message level and set the underlying ROOT tool message level accordingly
   m_rootTool->msg().setLevel(this->msg().level());
-  
+
   // We need to initialize the underlying ROOT TSelectorTool
   if ( m_rootTool->initialize().isFailure() ){
     ATH_MSG_ERROR ( "ERROR! Could not initialize the TElectronLikelihoodTool!" );
@@ -272,7 +272,7 @@ const asg::AcceptInfo& AsgElectronLikelihoodTool::getAcceptInfo() const
 }
 
 //=============================================================================
-// The main accept method: the actual cuts are applied here 
+// The main accept method: the actual cuts are applied here
 //=============================================================================
 asg::AcceptData AsgElectronLikelihoodTool::accept(const xAOD::Electron* el, double mu ) const
 {
@@ -290,7 +290,7 @@ asg::AcceptData AsgElectronLikelihoodTool::accept(const EventContext& ctx, const
   if ( !cluster ){
     ATH_MSG_ERROR("exiting because cluster is NULL " << cluster);
     return m_rootTool->accept();
-  }  
+  }
 
   if( !cluster->hasSampling(CaloSampling::CaloSample::EMB2) && !cluster->hasSampling(CaloSampling::CaloSample::EME2) ){
     ATH_MSG_ERROR("Failed, cluster is missing samplings EMB2 and EME2");
@@ -298,29 +298,29 @@ asg::AcceptData AsgElectronLikelihoodTool::accept(const EventContext& ctx, const
   }
 
   const double energy = cluster->e();
-  const float  eta    = (cluster->etaBE(2)); 
+  const float  eta    = (cluster->etaBE(2));
 
   if( isForwardElectron(el,eta) ){
     ATH_MSG_WARNING("Failed, this is a forward electron! The AsgElectronLikelihoodTool is only suitable for central electrons!");
-    return m_rootTool->accept();    
+    return m_rootTool->accept();
   }
-  
+
   double et = 0.;
   if(el->trackParticle() && !m_caloOnly) {
     et  = ( cosh(el->trackParticle()->eta()) != 0.) ? energy/cosh(el->trackParticle()->eta()) : 0.;
-  } else 
+  } else
     et  = ( cosh(eta) != 0.) ? energy/cosh(eta) : 0.;
-  
+
   // number of track hits
   uint8_t nSiHitsPlusDeadSensors(0);
   uint8_t nPixHitsPlusDeadSensors(0);
-  bool passBLayerRequirement(false); 
+  bool passBLayerRequirement(false);
   float d0(0.0);
   float deltaEta=0;
   float deltaPhiRescaled2=0;
   float wstot=0;
   float EoverP=0;
-  uint8_t ambiguityBit(0); 
+  uint8_t ambiguityBit(0);
   double ip(0);
 
   bool allFound = true;
@@ -335,17 +335,17 @@ asg::AcceptData AsgElectronLikelihoodTool::accept(const EventContext& ctx, const
   // get the ambiguity type from the decoration
   if ( !m_rootTool->m_cutAmbiguity.empty() ) {
     if ( el->isAvailable<uint8_t>("ambiguityType") ) {
-      static const SG::AuxElement::Accessor<uint8_t> acc("ambiguityType");    
+      static const SG::AuxElement::Accessor<uint8_t> acc("ambiguityType");
       ambiguityBit = acc(*el);
     } else {
       allFound = false;
       notFoundList += "ambiguityType ";
     }
   }
-  
+
   if(!m_caloOnly) {
       // retrieve associated track
-      const xAOD::TrackParticle* t  = el->trackParticle();    
+      const xAOD::TrackParticle* t  = el->trackParticle();
       if (t) {
         nSiHitsPlusDeadSensors = ElectronSelectorHelpers::numberOfSiliconHitsAndDeadSensors(t);
         nPixHitsPlusDeadSensors = ElectronSelectorHelpers::numberOfPixelHitsAndDeadSensors(t);
@@ -379,7 +379,7 @@ asg::AcceptData AsgElectronLikelihoodTool::accept(const EventContext& ctx, const
     ip = mu;
   }
 
-  // for now don't cache. 
+  // for now don't cache.
   double likelihood = calculate(ctx, el, ip);
 
   ATH_MSG_VERBOSE(Form(
@@ -395,7 +395,7 @@ asg::AcceptData AsgElectronLikelihoodTool::accept(const EventContext& ctx, const
     ATH_MSG_ERROR("Skipping LH rectangular cuts! The following variables are missing: " << notFoundList);
     return m_rootTool->accept();
   }
-  
+
   // Get the answer from the underlying ROOT tool
   return m_rootTool->accept( likelihood,
                              eta,
@@ -431,39 +431,39 @@ asg::AcceptData AsgElectronLikelihoodTool::accept(const EventContext& ctx, const
   if (!m_caloOnly) {
     if(eg->type() == xAOD::Type::Electron){
     const xAOD::Electron* el = static_cast<const xAOD::Electron*>(eg);
-    return accept(el, mu);
-    } 
+    return accept(ctx,el, mu);
+    }
       ATH_MSG_ERROR("Input is not an electron and not caloOnly is set");
       return m_rootTool->accept();
-    
+
   }
-  
+
   //Calo only LH
   const xAOD::CaloCluster* cluster = eg->caloCluster();
   if ( !cluster ){
     ATH_MSG_ERROR ("Failed, no cluster.");
     return m_rootTool->accept();
-  }  
+  }
   if( !cluster->hasSampling(CaloSampling::CaloSample::EMB2) && !cluster->hasSampling(CaloSampling::CaloSample::EME2) ){
     ATH_MSG_ERROR("Failed, cluster is missing samplings EMB2 and EME2");
     return m_rootTool->accept();
   }
-  
+
   const double energy =  cluster->e();
-  const float eta = (cluster->etaBE(2)); 
+  const float eta = (cluster->etaBE(2));
   if( isForwardElectron(eg,eta) ){
     ATH_MSG_WARNING(
         "Failed, this is a forward electron! The AsgElectronLikelihoodTool is "
         "only suitable for central electrons!");
     return m_rootTool->accept();
   }
-  
+
   const double et  = ( cosh(eta) != 0.) ? energy/cosh(eta) : 0.;
-  
+
   // Variables the EFCaloLH ignores
   uint8_t nSiHitsPlusDeadSensors(0);
   uint8_t nPixHitsPlusDeadSensors(0);
-  bool passBLayerRequirement(false); 
+  bool passBLayerRequirement(false);
   uint8_t ambiguityBit(0);
 
   // Get the pileup or centrality information
@@ -478,8 +478,8 @@ asg::AcceptData AsgElectronLikelihoodTool::accept(const EventContext& ctx, const
   else {
     ip = mu;
   }
-  // for now don't cache. 
-  double likelihood = calculate(ctx, eg, ip); 
+  // for now don't cache.
+  double likelihood = calculate(ctx, eg, ip);
 
   double deltaEta=0;
   double deltaPhiRescaled2=0;
@@ -492,7 +492,7 @@ asg::AcceptData AsgElectronLikelihoodTool::accept(const EventContext& ctx, const
 
   // Wstot for use when CutWstotAtHighET vector is filled
   if( !eg->showerShapeValue(wstot, xAOD::EgammaParameters::wtots1) ){
-    allFound = false; 
+    allFound = false;
     notFoundList += "wtots1 ";
   }
 
@@ -524,7 +524,7 @@ asg::AcceptData AsgElectronLikelihoodTool::accept(const EventContext& ctx, const
                              ip
                            );
 }
-   
+
 //=============================================================================
 // The main result method: the actual likelihood is calculated here
 //=============================================================================
@@ -543,14 +543,14 @@ double AsgElectronLikelihoodTool::calculate( const EventContext& ctx, const xAOD
   if ( !cluster ){
     ATH_MSG_ERROR ("Failed, no cluster.");
     return -999;
-  }  
+  }
   if( !cluster->hasSampling(CaloSampling::CaloSample::EMB2) && !cluster->hasSampling(CaloSampling::CaloSample::EME2) ){
     ATH_MSG_ERROR("Failed, cluster is missing samplings EMB2 and EME2");
     return -999;
   }
 
   const double energy =  cluster->e();
-  const float eta = cluster->etaBE(2); 
+  const float eta = cluster->etaBE(2);
 
   if( isForwardElectron(el,eta) ){
     ATH_MSG_WARNING("Failed, this is a forward electron! The AsgElectronLikelihoodTool is only suitable for central electrons!");
@@ -563,7 +563,7 @@ double AsgElectronLikelihoodTool::calculate( const EventContext& ctx, const xAOD
   } else {
     et  = ( cosh(eta) != 0.) ? energy/cosh(eta) : 0.;
   }
-  
+
   // number of track hits and other track quantities
   float trackqoverp(0.0);
   float d0(0.0);
@@ -579,7 +579,7 @@ double AsgElectronLikelihoodTool::calculate( const EventContext& ctx, const xAOD
 
   if (!m_caloOnly){
   // retrieve associated TrackParticle
-    const xAOD::TrackParticle* t = el->trackParticle();    
+    const xAOD::TrackParticle* t = el->trackParticle();
     if (t)
       {
         trackqoverp = t->qOverP();
@@ -589,12 +589,12 @@ double AsgElectronLikelihoodTool::calculate( const EventContext& ctx, const xAOD
           d0sigma=sqrtf(vard0);
         }
         if( !t->summaryValue(TRT_PID, xAOD::eProbabilityHT) ){
-          allFound = false; 
+          allFound = false;
           notFoundList += "eProbabilityHT ";
         }
 
         //Transform the TRT PID output for use in the LH tool.
-        double tau = 15.0; 
+        double tau = 15.0;
         double fEpsilon = 1.0e-30;  // to avoid zero division
 	double pid_tmp = TRT_PID;
         if (pid_tmp >= 1.0) pid_tmp = 1.0 - 1.0e-15;  //this number comes from TMVA
@@ -603,20 +603,20 @@ double AsgElectronLikelihoodTool::calculate( const EventContext& ctx, const xAOD
 
         unsigned int index;
         if(  t->indexOfParameterAtPosition(index, xAOD::LastMeasurement) ) {
-	
-	  double refittedTrack_LMqoverp  = 
+
+	  double refittedTrack_LMqoverp  =
 	    t->charge() / sqrt(std::pow(t->parameterPX(index), 2) +
 			     std::pow(t->parameterPY(index), 2) +
 			     std::pow(t->parameterPZ(index), 2));
-	
+
 	  dpOverp = 1 - trackqoverp/(refittedTrack_LMqoverp);
         }
 	else if (!m_skipDeltaPoverP){
-	    allFound = false; 
+	    allFound = false;
 	    notFoundList += "deltaPoverP ";
 	}
- 
-      
+
+
       }
     else
       {
@@ -636,7 +636,7 @@ double AsgElectronLikelihoodTool::calculate( const EventContext& ctx, const xAOD
 
   // reta = e237/e277
   if( !el->showerShapeValue(Reta, xAOD::EgammaParameters::Reta) ){
-    allFound = false; 
+    allFound = false;
     notFoundList += "Reta ";
   }
   // rphi e233/e237
@@ -705,7 +705,7 @@ double AsgElectronLikelihoodTool::calculate( const EventContext& ctx, const xAOD
       eta, et, f3, Rhad, Rhad1, Reta,
       w2, f1, Eratio,
       deltaEta, d0,
-      d0sigma, 
+      d0sigma,
       Rphi, dpOverp, deltaPhiRescaled2,
       TRT_PID, trans_TRT_PID,
       ip ) );
@@ -739,7 +739,7 @@ double AsgElectronLikelihoodTool::calculate( const EventContext& ctx, const xAOD
 //=============================================================================
 // Calculate method for EFCaloLH in the trigger; do full LH if !CaloCutsOnly
 //=============================================================================
-double AsgElectronLikelihoodTool::calculate( const xAOD::Egamma* eg, double mu ) const 
+double AsgElectronLikelihoodTool::calculate( const xAOD::Egamma* eg, double mu ) const
 {
   //Backward compatibility
   return calculate(Gaudi::Hive::currentContext(), eg, mu);
@@ -757,31 +757,31 @@ double AsgElectronLikelihoodTool::calculate( const EventContext& ctx, const xAOD
         const xAOD::Electron* el = static_cast<const xAOD::Electron*>(eg);
         return calculate(ctx, el);
       }
-      
+
         ATH_MSG_ERROR("Input is not an electron and not Calo Only is required");
         return -999;
-      
+
   }
 
  const xAOD::CaloCluster* cluster = eg->caloCluster();
   if ( !cluster ){
     ATH_MSG_ERROR ("Failed, no cluster.");
     return -999;
-  }  
+  }
 
   if( !cluster->hasSampling(CaloSampling::CaloSample::EMB2) && !cluster->hasSampling(CaloSampling::CaloSample::EME2) ){
     ATH_MSG_ERROR("Failed, cluster is missing samplings EMB2 and EME2");
     return -999;
   }
-  
+
   const double energy =  cluster->e();
-  const float eta = cluster->etaBE(2); 
+  const float eta = cluster->etaBE(2);
 
   if( isForwardElectron(eg,eta) ){
      ATH_MSG_WARNING("Failed, this is a forward electron! The AsgElectronLikelihoodTool is only suitable for central electrons!");
     return -999;
   }
-  
+
   const double et  = ( cosh(eta) != 0.) ? energy/cosh(eta) : 0.;
 
   // Track variables that the EFCaloLH will not use
@@ -808,42 +808,42 @@ double AsgElectronLikelihoodTool::calculate( const EventContext& ctx, const xAOD
 
   // reta = e237/e277
   if( !eg->showerShapeValue(Reta, xAOD::EgammaParameters::Reta) ){
-    allFound = false; 
+    allFound = false;
     notFoundList += "Reta ";
   }
   // rphi e233/e237
   if( !eg->showerShapeValue(Rphi, xAOD::EgammaParameters::Rphi) ){
-    allFound = false; 
+    allFound = false;
     notFoundList += "Rphi ";
   }
   // rhad1 = ethad1/et
   if( !eg->showerShapeValue(Rhad1, xAOD::EgammaParameters::Rhad1) ){
-    allFound = false; 
+    allFound = false;
     notFoundList += "Rhad1 ";
   }
   // rhad = ethad/et
   if( !eg->showerShapeValue(Rhad, xAOD::EgammaParameters::Rhad) ){
-    allFound = false; 
+    allFound = false;
     notFoundList += "Rhad ";
   }
   // shower width in 2nd sampling
   if( !eg->showerShapeValue(w2, xAOD::EgammaParameters::weta2) ){
-    allFound = false; 
+    allFound = false;
     notFoundList += "weta2 ";
   }
   // fraction of energy reconstructed in the 1st sampling
   if( !eg->showerShapeValue(f1, xAOD::EgammaParameters::f1) ){
-    allFound = false; 
+    allFound = false;
     notFoundList += "f1 ";
   }
   // E of 2nd max between max and min in strips
   if( !eg->showerShapeValue(Eratio, xAOD::EgammaParameters::Eratio) ){
-    allFound = false; 
+    allFound = false;
     notFoundList += "Eratio ";
   }
   // fraction of energy reconstructed in the 3rd sampling
   if( !eg->showerShapeValue(f3, xAOD::EgammaParameters::f3) ){
-    allFound = false; 
+    allFound = false;
     notFoundList += "f3 ";
   }
 
@@ -914,10 +914,10 @@ asg::AcceptData AsgElectronLikelihoodTool::accept(const EventContext& ctx, const
     const xAOD::Electron* el = static_cast<const xAOD::Electron*>(part);
     return accept(ctx, el);
   }
-  
+
     ATH_MSG_ERROR("Input is not an electron");
     return m_rootTool->accept();
-  
+
 }
 
 double AsgElectronLikelihoodTool::calculate(const xAOD::IParticle* part) const
@@ -932,20 +932,20 @@ double AsgElectronLikelihoodTool::calculate(const EventContext& ctx, const xAOD:
     const xAOD::Electron* el = static_cast<const xAOD::Electron*>(part);
     return calculate(ctx, el);
   }
-  
+
       ATH_MSG_ERROR ( "Input is not an electron" );
       return -999;
-  
+
 }
 
 //=============================================================================
 // Helper method to get the number of primary vertices
-// We don't want to iterate over all vertices in the event for each electron!!! 
+// We don't want to iterate over all vertices in the event for each electron!!!
 //=============================================================================
 unsigned int AsgElectronLikelihoodTool::getNPrimVertices(const EventContext& ctx) const
 {
   unsigned int nVtx(0);
-  SG::ReadHandle<xAOD::VertexContainer> vtxCont (m_primVtxContKey, ctx); 
+  SG::ReadHandle<xAOD::VertexContainer> vtxCont (m_primVtxContKey, ctx);
   for ( unsigned int i = 0; i < vtxCont->size(); i++ ) {
       const xAOD::Vertex* vxcand = vtxCont->at(i);
       if ( vxcand->nTrackParticles() >= 2 ) nVtx++;
@@ -959,7 +959,7 @@ unsigned int AsgElectronLikelihoodTool::getNPrimVertices(const EventContext& ctx
 double AsgElectronLikelihoodTool::getFcalEt(const EventContext& ctx) const
 {
   double fcalEt(0.);
-  SG::ReadHandle<xAOD::HIEventShapeContainer> HIESCont (m_HIESContKey,ctx); 
+  SG::ReadHandle<xAOD::HIEventShapeContainer> HIESCont (m_HIESContKey,ctx);
   xAOD::HIEventShapeContainer::const_iterator es_itr = HIESCont->begin();
   xAOD::HIEventShapeContainer::const_iterator es_end = HIESCont->end();
   for (; es_itr != es_end; es_itr++){
@@ -975,7 +975,7 @@ bool AsgElectronLikelihoodTool::isForwardElectron( const xAOD::Egamma* eg, const
   static const SG::AuxElement::ConstAccessor< uint16_t > accAuthor( "author" );
 
   if( accAuthor.isAvailable(*eg) ){
-    
+
     // cannot just do eg->author() because it isn't always filled
     // at trigger level
     if( accAuthor(*eg) == xAOD::EgammaParameters::AuthorFwdElectron ){
@@ -984,7 +984,7 @@ bool AsgElectronLikelihoodTool::isForwardElectron( const xAOD::Egamma* eg, const
     }
   }
   else{
-    //Check for fwd via eta range the old logic 
+    //Check for fwd via eta range the old logic
     if ( fabs(eta) > 2.5 ) {
       ATH_MSG_WARNING("Failed, cluster->etaBE(2) range due to " << eta << " seems like a fwd electron" );
       return true;
-- 
GitLab


From 12c99c236110b93ad4a3c30411d5383efb009488 Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Tue, 8 Dec 2020 22:11:55 -0500
Subject: [PATCH 047/225] xAODMetaData: Fix operator<< definition.

operator<< should be defined within the namespace of the object its
printing.  Otherwise, it won't work correctly with clang.
---
 Event/xAOD/xAODMetaData/Root/FileMetaData_v1.cxx       |  6 +++---
 .../xAODMetaData/versions/FileMetaData_v1.h            | 10 +++++-----
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/Event/xAOD/xAODMetaData/Root/FileMetaData_v1.cxx b/Event/xAOD/xAODMetaData/Root/FileMetaData_v1.cxx
index efc4dd3e0b42..33644eb58b2d 100644
--- a/Event/xAOD/xAODMetaData/Root/FileMetaData_v1.cxx
+++ b/Event/xAOD/xAODMetaData/Root/FileMetaData_v1.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 // $Id: FileMetaData_v1.cxx 683694 2015-07-17 09:03:52Z krasznaa $
@@ -362,8 +362,6 @@ namespace xAOD {
       return true;
    }
 
-} // namespace xAOD
-
 /// Helper macro used to print MetaDataType values
 #define PRINT_TYPE( TYPE )                      \
    case xAOD::FileMetaData_v1::TYPE:            \
@@ -404,3 +402,5 @@ std::ostream& operator<< ( std::ostream& out,
    return out;
 }
 
+
+} // namespace xAOD
diff --git a/Event/xAOD/xAODMetaData/xAODMetaData/versions/FileMetaData_v1.h b/Event/xAOD/xAODMetaData/xAODMetaData/versions/FileMetaData_v1.h
index 19f0fb56072a..990b15f55c1b 100644
--- a/Event/xAOD/xAODMetaData/xAODMetaData/versions/FileMetaData_v1.h
+++ b/Event/xAOD/xAODMetaData/xAODMetaData/versions/FileMetaData_v1.h
@@ -1,7 +1,7 @@
 // Dear emacs, this is -*- c++ -*-
 
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 // $Id: FileMetaData_v1.h 685184 2015-07-23 20:25:43Z cranshaw $
@@ -106,11 +106,11 @@ namespace xAOD {
 
    }; // class FileMetaData_v1
 
-} // namespace xAOD
+   /// A convenience print operator for xAOD::FileMetaData_v1::MetaDataType
+   std::ostream& operator<< ( std::ostream& out,
+                              xAOD::FileMetaData_v1::MetaDataType type );
 
-/// A convenience print operator for xAOD::FileMetaData_v1::MetaDataType
-std::ostream& operator<< ( std::ostream& out,
-                           xAOD::FileMetaData_v1::MetaDataType type );
+} // namespace xAOD
 
 // Declare a base class for the type:
 #include "xAODCore/BaseInfo.h"
-- 
GitLab


From 563893621adf81106ae42691a2353897bee1c10f Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Tue, 15 Dec 2020 17:09:02 +0100
Subject: [PATCH 048/225] MuonCombinedTrackFindingTools: Fix clang warnings.

Missing override keywords.
---
 .../src/MuonLayerAmbiguitySolverTool.h                      | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/Reconstruction/MuonIdentification/MuonCombinedTrackFindingTools/src/MuonLayerAmbiguitySolverTool.h b/Reconstruction/MuonIdentification/MuonCombinedTrackFindingTools/src/MuonLayerAmbiguitySolverTool.h
index d746543df480..bce590e43a3c 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedTrackFindingTools/src/MuonLayerAmbiguitySolverTool.h
+++ b/Reconstruction/MuonIdentification/MuonCombinedTrackFindingTools/src/MuonLayerAmbiguitySolverTool.h
@@ -29,13 +29,13 @@ namespace Muon {
     /** Default AlgTool functions */
     MuonLayerAmbiguitySolverTool(const std::string& type, const std::string& name, const IInterface* parent);
     virtual ~MuonLayerAmbiguitySolverTool()=default;
-    StatusCode initialize();
+    virtual StatusCode initialize() override;
 
     /**IMuonLayerAmbiguitySolverTool interface: find */   
-    void resolveOverlaps( const std::vector<Muon::MuonLayerRecoData>& allLayers, std::vector< MuonCandidate >& resolvedCandidates ) const;
+    virtual void resolveOverlaps( const std::vector<Muon::MuonLayerRecoData>& allLayers, std::vector< MuonCandidate >& resolvedCandidates ) const override;
 
 
-    void cleanUp() const override;
+    virtual void cleanUp() const override;
 
   private:
     void buildLayerVec( const std::vector<MuonLayerRecoData>& allLayers,  
-- 
GitLab


From c3dfaa1615b57afda868afe43548795fb0d5900a Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Tue, 15 Dec 2020 17:11:04 +0100
Subject: [PATCH 049/225] MuonTrackFinderTools: Fix clang warnings.

Missing override keywords.
---
 .../src/MuonSegmentRegionRecoveryTool.h                   | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonSegmentRegionRecoveryTool.h b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonSegmentRegionRecoveryTool.h
index f45b7fc80096..01a310467690 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonSegmentRegionRecoveryTool.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonSegmentRegionRecoveryTool.h
@@ -110,15 +110,15 @@ namespace Muon {
     virtual ~MuonSegmentRegionRecoveryTool () = default;
     
     /** @brief AlgTool initialize */
-    StatusCode initialize();
+    virtual StatusCode initialize() override;
     
     /** @brief AlgTool finalize */
-    StatusCode finalize();
+    virtual StatusCode finalize() override;
     
     /** @brief returns a new track with segments recovered using RegionSelector*/
-    Trk::Track* recover( const Trk::Track& track ) const;
+    virtual Trk::Track* recover( const Trk::Track& track ) const override;
     
-    void cleanUp() const override;
+    virtual void cleanUp() const override;
 
   private:
 
-- 
GitLab


From e3b3c693050e4c133bc9dc07887c6dd12f35e9c6 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Tue, 15 Dec 2020 17:12:32 +0100
Subject: [PATCH 050/225] MuonTrackSteeringTools: Fix clang warnings.

Missing override keywords.
---
 .../MuonTrackSteeringTools/src/MooCandidateMatchingTool.h | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooCandidateMatchingTool.h b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooCandidateMatchingTool.h
index bda954a90c03..ace936628b1f 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooCandidateMatchingTool.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MooCandidateMatchingTool.h
@@ -68,13 +68,13 @@ namespace Muon {
     MooCandidateMatchingTool(const std::string&, const std::string&, const IInterface*);
     
     /** destructor */
-    ~MooCandidateMatchingTool();
+    virtual ~MooCandidateMatchingTool();
     
     /** initialize method, method taken from bass-class AlgTool */
-    StatusCode initialize();
+    virtual StatusCode initialize() override;
 
     /** finialize method, method taken from bass-class AlgTool */
-    StatusCode finalize();
+    virtual StatusCode finalize() override;
     
     /** @brief access to tool interface */
     static const InterfaceID& interfaceID() { return IID_MooCandidateMatchingTool; }
@@ -89,7 +89,7 @@ namespace Muon {
     bool match( const MuPatCandidateBase& entry1, const MuPatSegment& entry2, bool useTightCuts = false ) const;
 
     /** @brief match a track with a segment */
-    bool match( const Trk::Track& track, const MuonSegment& segment, bool useTightCuts ) const;
+    virtual bool match( const Trk::Track& track, const MuonSegment& segment, bool useTightCuts ) const override;
 
     /** @brief calculate the info needed for the matching decision */
     void calculateTrackSegmentMatchResult( const MuPatTrack& entry1, const MuPatSegment& entry2, MooTrackSegmentMatchResult& info ) const;
-- 
GitLab


From e505c2d290f3c9119c79bd68a3cd70cea140cfb8 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Tue, 15 Dec 2020 17:14:23 +0100
Subject: [PATCH 051/225] PixelMonitoring: Fix clang warnings.

Braces in initializers.
---
 .../PixelMonitoring/src/PixelAthErrorMonAlg.cxx               | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/InnerDetector/InDetMonitoring/PixelMonitoring/src/PixelAthErrorMonAlg.cxx b/InnerDetector/InDetMonitoring/PixelMonitoring/src/PixelAthErrorMonAlg.cxx
index c5fac8bb94be..e496478075cd 100644
--- a/InnerDetector/InDetMonitoring/PixelMonitoring/src/PixelAthErrorMonAlg.cxx
+++ b/InnerDetector/InDetMonitoring/PixelMonitoring/src/PixelAthErrorMonAlg.cxx
@@ -137,8 +137,8 @@ StatusCode PixelAthErrorMonAlg::fillHistograms( const EventContext& ctx ) const
       is_fei4 = false;
     }
     // flagging/counting categorized errors per module.
-    bool has_err_cat[ErrorCategory::COUNT][nFEIBL2D] = {false};
-    int nerrors_cat_rodmod[ErrorCategoryRODMOD::COUNT][nFEIBL2D] = {0};
+    bool has_err_cat[ErrorCategory::COUNT][nFEIBL2D] = {{false}};
+    int nerrors_cat_rodmod[ErrorCategoryRODMOD::COUNT][nFEIBL2D] = {{0}};
 
     // count number of words w/ MCC/FE flags per module
     unsigned int num_femcc_errwords = 0;
-- 
GitLab


From 803cbe8b2b4725b5464b3b53aa63cc35fc6d12b0 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Tue, 15 Dec 2020 17:15:52 +0100
Subject: [PATCH 052/225] ZdcConditions: Fix clang warning.

Unused private data member.
---
 .../ZDC/ZdcConditions/ZdcConditions/ZdcCablingService.h          | 1 -
 1 file changed, 1 deletion(-)

diff --git a/ForwardDetectors/ZDC/ZdcConditions/ZdcConditions/ZdcCablingService.h b/ForwardDetectors/ZDC/ZdcConditions/ZdcConditions/ZdcCablingService.h
index 3f44a8c2e843..5c153baf2e3f 100755
--- a/ForwardDetectors/ZDC/ZdcConditions/ZdcConditions/ZdcCablingService.h
+++ b/ForwardDetectors/ZDC/ZdcConditions/ZdcConditions/ZdcCablingService.h
@@ -74,7 +74,6 @@ public:
     int         m_channel_db[4][64];
     int         m_hv_db[4][64];
     int         m_ppm_db[16];
-    int         m_crate_db[8];
     int         m_crate_index[4];
     int         m_ncrate;
     //int         m_crate_lookup[2][3][2];
-- 
GitLab


From 9f7a5526880bb47460a8a01959d00af789ba52e2 Mon Sep 17 00:00:00 2001
From: fernando <Fernando.Monticelli@cern.ch>
Date: Tue, 15 Dec 2020 23:16:46 +0100
Subject: [PATCH 053/225] Fixed typo in lhlmedium[whatever]

---
 .../python/HLTMenuConfig/Egamma/ElectronDef.py       | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Egamma/ElectronDef.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Egamma/ElectronDef.py
index f1087e5e0a93..7441ed68d838 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Egamma/ElectronDef.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Egamma/ElectronDef.py
@@ -86,9 +86,9 @@ class ElectronChainConfiguration(ChainConfigurationBase):
                 'lhlooseivarloose'  : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionElectron'],
                 'lhlooseivarmedium' : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionElectron'],
                 'lhlooseivartight'  : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionElectron'],
-                'lhlmediumivarloose' : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionElectron'],
-                'lhlmediumivarmedium': ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionElectron'],
-                'lhlmediumivartight' : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionElectron'],
+                'lhmediumivarloose' : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionElectron'],
+                'lhmediumivarmedium': ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionElectron'],
+                'lhmediumivartight' : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionElectron'],
                 'lhtightivarloose'   : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionElectron'],
                 'lhtightivarmedium'  : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionElectron'],
                 'lhtightivartight'   : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionElectron'],
@@ -100,9 +100,9 @@ class ElectronChainConfiguration(ChainConfigurationBase):
                 'lhloosegsfivarloose'  : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionGSFElectron'],
                 'lhloosegsfivarmedium' : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionGSFElectron'],
                 'lhloosegsfivartight'  : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionGSFElectron'],
-                'lhlmediumgsfivarloose' : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionGSFElectron'],
-                'lhlmediumgsfivarmedium': ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionGSFElectron'],
-                'lhlmediumgsfivartight' : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionGSFElectron'],
+                'lhmediumgsfivarloose' : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionGSFElectron'],
+                'lhmediumgsfivarmedium': ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionGSFElectron'],
+                'lhmediumgsfivartight' : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionGSFElectron'],
                 'lhtightgsfivarloose'   : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionGSFElectron'],
                 'lhtightgsfivarmedium'  : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionGSFElectron'],
                 'lhtightgsfivartight'   : ['getFastCalo', 'getFastElectron', 'getPrecisionCaloElectron', 'getPrecisionTracking', 'getPrecisionGSFElectron'],
-- 
GitLab


From 9e42d75d6a5326a6717f2b71386c96b8d6e61566 Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Mon, 7 Dec 2020 13:01:39 -0500
Subject: [PATCH 054/225] ParticleJetTools: cmake fix

Missing find_package for ROOT.
---
 PhysicsAnalysis/AnalysisCommon/ParticleJetTools/CMakeLists.txt | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/PhysicsAnalysis/AnalysisCommon/ParticleJetTools/CMakeLists.txt b/PhysicsAnalysis/AnalysisCommon/ParticleJetTools/CMakeLists.txt
index c6037c209eb8..d8f44123c870 100644
--- a/PhysicsAnalysis/AnalysisCommon/ParticleJetTools/CMakeLists.txt
+++ b/PhysicsAnalysis/AnalysisCommon/ParticleJetTools/CMakeLists.txt
@@ -3,6 +3,8 @@
 # Declare the package name:
 atlas_subdir( ParticleJetTools )
 
+find_package( ROOT )
+
 # Component(s) in the package:
 if( XAOD_STANDALONE )
    atlas_add_library( ParticleJetToolsLib
-- 
GitLab


From f076f083c4f1a1ec2b84f688f6611e1792a4e048 Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Mon, 7 Dec 2020 13:50:07 -0500
Subject: [PATCH 055/225] BTagging: Fix gcc11 warning.

Needless copy in for loop.
---
 .../JetTagging/JetTagAlgs/BTagging/src/HighLevelBTagAlg.cxx     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/src/HighLevelBTagAlg.cxx b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/src/HighLevelBTagAlg.cxx
index 9aca1b663647..4d35c7fc711f 100644
--- a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/src/HighLevelBTagAlg.cxx
+++ b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/src/HighLevelBTagAlg.cxx
@@ -62,7 +62,7 @@ namespace Analysis {
     CHECK( m_dec_track_mom.initialize() );
 
     // create and initialize write handles
-    for (const std::string key: m_jetDecorator->getDecoratorKeys()) {
+    for (const std::string& key: m_jetDecorator->getDecoratorKeys()) {
       std::string full_key = m_BTagCollectionName.key() + "." + key;
       ATH_MSG_DEBUG("Adding " << full_key);
       m_outputKeys.emplace_back(std::make_unique<SG::WriteDecorHandleKey<xAOD::BTaggingContainer>>(this, key, full_key, ""));
-- 
GitLab


From fc77c32d8ccdb27d2df50ff756f49e15ba5e8439 Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Mon, 7 Dec 2020 15:54:12 -0500
Subject: [PATCH 056/225] TrkKalmanFitter: Fix gcc11 warnings.

Misleading indentation.
---
 .../TrkKalmanFitter/src/KalmanFitter.cxx      | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanFitter.cxx b/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanFitter.cxx
index 90c908422b12..c1293717fd59 100755
--- a/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanFitter.cxx
+++ b/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanFitter.cxx
@@ -429,12 +429,13 @@ Trk::KalmanFitter::fit(const EventContext& ctx,
     ATH_MSG_VERBOSE( "list of parameters as they are on the input track:");
     DataVector<const TrackParameters>::const_iterator it
       = inputTrack.trackParameters()->begin();
-    for(int i=0 ; it!=inputTrack.trackParameters()->end(); ++it, ++i)
+    for(int i=0 ; it!=inputTrack.trackParameters()->end(); ++it, ++i) {
       ATH_MSG_VERBOSE( "TrackPar" << (i<10 ? "  " : " ") << i 
             << " position mag : " << (*it)->position().mag()
             << ", to ref is " << ((*it)->position()-m_sortingRefPoint).mag());
-      ATH_MSG_VERBOSE( "Now getting track parameters near origin " 
-                              << (m_option_enforceSorting? "via STL sort" : "as first TP (convention)"));
+    }
+    ATH_MSG_VERBOSE( "Now getting track parameters near origin " 
+                     << (m_option_enforceSorting? "via STL sort" : "as first TP (convention)"));
   }
   // fill internal trajectory through external preparator class
   const TrackParameters* minPar = nullptr;
@@ -1182,13 +1183,13 @@ bool Trk::KalmanFitter::invokeAnnealingFilter(const Trk::TrackParameters*&  star
           dafStatus = m_smoother->fitWithReference(m_trajectory, newFitQuality, kalMec);
         else
           dafStatus = m_smoother->fit(m_trajectory, newFitQuality, kalMec);
-          ATH_MSG_INFO( "Internal DAF returned with chi2 chain:");
-          for (Trk::Trajectory::const_iterator it=m_trajectory.begin();it!=m_trajectory.end(); it++) {
-            if (!it->isOutlier()) {
-              if (it->fitQuality()) ATH_MSG_INFO( it->fitQuality()->chiSquared() << " % ");
-              else                  ATH_MSG_INFO( "Problem - no FitQ % ");
-            }
+        ATH_MSG_INFO( "Internal DAF returned with chi2 chain:");
+        for (Trk::Trajectory::const_iterator it=m_trajectory.begin();it!=m_trajectory.end(); it++) {
+          if (!it->isOutlier()) {
+            if (it->fitQuality()) ATH_MSG_INFO( it->fitQuality()->chiSquared() << " % ");
+            else                  ATH_MSG_INFO( "Problem - no FitQ % ");
           }
+        }
       } 
           
       bool successfulRecovery  = newFitQuality!= nullptr
-- 
GitLab


From c3c5da65482b8fe740043f8ef9d3c3fd94824946 Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Mon, 7 Dec 2020 16:55:23 -0500
Subject: [PATCH 057/225] TauAnalysisTools: Fix gcc11 warning.

Check result of dynamic_cast before dereferencing.
---
 .../TauID/TauAnalysisTools/Root/CommonSmearingTool.cxx       | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/PhysicsAnalysis/TauID/TauAnalysisTools/Root/CommonSmearingTool.cxx b/PhysicsAnalysis/TauID/TauAnalysisTools/Root/CommonSmearingTool.cxx
index 9026acf04f44..1f37ff54499e 100644
--- a/PhysicsAnalysis/TauID/TauAnalysisTools/Root/CommonSmearingTool.cxx
+++ b/PhysicsAnalysis/TauID/TauAnalysisTools/Root/CommonSmearingTool.cxx
@@ -179,7 +179,10 @@ CP::CorrectionCode CommonSmearingTool::applyCorrection( xAOD::TauJet& xTau )
   if (m_bApplyMVATES)
   {    
     // veto MVA TES for unreasonably low resolution values
-    bool bVeto = dynamic_cast<CombinedP4FromRecoTaus*>(m_tCombinedP4FromRecoTaus.get())->getUseCaloPtFlag(xTau);
+    bool bVeto = false;
+    if (auto combp4 = dynamic_cast<CombinedP4FromRecoTaus*>(m_tCombinedP4FromRecoTaus.get())) {
+      bVeto = combp4->getUseCaloPtFlag(xTau);
+    }
 
     if (xTau.nTracks() > 0 and xTau.nTracks() < 6)
     {
-- 
GitLab


From fc33e9dbdd04e3edc16e5ccbb411dcf0fdc4c062 Mon Sep 17 00:00:00 2001
From: sutt <sutt@cern.ch>
Date: Wed, 16 Dec 2020 01:02:47 +0100
Subject: [PATCH 058/225] Fix electron chains

---
 .../TrigInDetValidation_AODtoTrkNtuple.py     | 22 +++++--------------
 1 file changed, 5 insertions(+), 17 deletions(-)

diff --git a/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_AODtoTrkNtuple.py b/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_AODtoTrkNtuple.py
index f5ca2e82ea53..36bc74755080 100644
--- a/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_AODtoTrkNtuple.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_AODtoTrkNtuple.py
@@ -134,22 +134,10 @@ if ( True ) :
 
     "Taus:Medium:1Prong",
     "Taus:Tight:1Prong",
-    
-    # "HLT_e.*idperf.*:InDetTrigTrackingxAODCnv_Electron_FTF",
-    # "HLT_e.*idperf.*:InDetTrigTrackingxAODCnv_Electron_IDTrig",
-    # "HLT_mu.*_idperf.*:InDetTrigTrackingxAODCnv_Muon_IDTrig;DTE",
-    # "HLT_mu.*idperf.*:InDetTrigTrackingxAODCnv_Muon_IDTrig",
-    # "HLT_tau.*idperf.*track:key=InDetTrigTrackingxAODCnv_Tau_IDTrig",
-    # "HLT_tau.*idperf.*track:key=InDetTrigTrackingxAODCnv_Tau_FTF",
-    # "HLT_tau.*idperf.*tracktwo:key=InDetTrigTrackingxAODCnv_TauCore_FTF:roi=forID1",
-    # "HLT_tau.*idperf.*tracktwo:key=InDetTrigTrackingxAODCnv_TauIso_FTF:roi=forID3",
-    # "HLT_tau.*idperf.*tracktwo:key=InDetTrigTrackingxAODCnv_Tau_IDTrig:roi=forID3",
-    
-    # "HLT_tau.*idperf.*tracktwo:key=InDetTrigTrackingxAODCnv_TauCore_FTF:roi=forID1",
-    # "HLT_tau.*idperf.*tracktwo:key=InDetTrigTrackingxAODCnv_TauIso_FTF:roi=forID3",
-    # "HLT_tau.*idperf.*tracktwo:key=InDetTrigTrackingxAODCnv_Tau_IDTrig:roi=forID3",
-
 
+    "Electron:Tight",
+    "Electron:Medium",
+    
     #    ":HLT_IDTrack_FS_FTF",
     #    ":HLT_IDTrack_FS_FTF:roi=HLT_FSRoI:vtx=HLT_IDVertex_FS",
 
@@ -172,13 +160,14 @@ if ( True ) :
 
 #    "HLT_e.*_etcut.*:HLT_IDTrack_Electron_FTF",
 #    "HLT_e.*_etcut.*:HLT_IDTrack_Electron_IDTrig",
-    "HLT_e.*:HLT_IDTrack_Electron_FTF:HLT_Roi_FastElectron",
+    "HLT_e.*:HLT_IDTrack_Electron_FTF:roi=HLT_Roi_FastElectron",
     "HLT_e.*:HLT_IDTrack_Electron_IDTrig",
 
 
     # two stage tau FTF
     "HLT_tau.*_idperf.*tracktwo.*:HLT_IDTrack_TauCore_FTF:roi=HLT_Roi_TauCore",
     "HLT_tau.*_idperf.*tracktwo.*:HLT_IDTrack_TauIso_FTF:roi=HLT_Roi_TauIso",
+    "HLT_tau.*_idperf.*tracktwo.*:HLT_IDTrack_TauIso_FTF:roi=HLT_Roi_TauIsoBDT",
 
     # two stage tau precision tracking - empty ???
     "HLT_tau.*_idperf.*tracktwo.*:HLT_IDTrack_Tau_IDTrig:roi=HLT_Roi_TauIso",
@@ -189,7 +178,6 @@ if ( True ) :
     "HLT_tau.*_idperf.*_track_.*:HLT_IDTrack_Tau_IDTrig:roi=HLT_Roi_Tau",
 
 
-
     # none of these will work
     "HLT_tau.*_idperf.*:HLT_IDTrack_Tau_IDTrig",
 
-- 
GitLab


From 591942a387be998901f59f9b721a0f691cd300d1 Mon Sep 17 00:00:00 2001
From: sutt <sutt@cern.ch>
Date: Wed, 16 Dec 2020 02:15:30 +0100
Subject: [PATCH 059/225] Add the correct views for the Tau track collections

The Tau_IDTrig tracks cannot be retrieved from TauIso Roi, and the TauIso_FTF, nor the Tau_IDTrig
tracks can be retrieved frmo the TauIsoBDT Roi.

In the EDMConfig the relevant views are not in the lists for these track collections so these have been added.

There is a caveat that I am nt sure of the view name for the precisopn tracking
for the TauIsoBDT - there seems to be no dedicated PRecision tracking configuration
python function, so the  Tau_IDTrig collection may still end up as unretrievable.
---
 Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py b/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py
index 36f1a86f5704..2b2c6f4cb2d3 100644
--- a/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py
+++ b/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py
@@ -291,13 +291,13 @@ TriggerHLTListRun3 = [
     ('xAOD::TrackParticleContainer#HLT_IDTrack_TauCore_FTF',                 'BS ESD AODFULL', 'Tau', 'inViews:TAUFTFCoreViews'),
     ('xAOD::TrackParticleAuxContainer#HLT_IDTrack_TauCore_FTFAux.',          'BS ESD AODFULL', 'Tau'),
 
-    ('xAOD::TrackParticleContainer#HLT_IDTrack_TauIso_FTF',                 'BS ESD AODFULL', 'Tau', 'inViews:TAUFTFIsoViews,TAUEFViews'),
+    ('xAOD::TrackParticleContainer#HLT_IDTrack_TauIso_FTF',                 'BS ESD AODFULL', 'Tau', 'inViews:TAUFTFIsoViews,TAUEFViews,TAUFTFIsoBDTViews'),
     ('xAOD::TrackParticleAuxContainer#HLT_IDTrack_TauIso_FTFAux.',          'BS ESD AODFULL', 'Tau'),
 
     ('xAOD::TrackParticleContainer#HLT_IDTrack_Tau_FTF',                 'BS ESD AODFULL', 'Tau', 'inViews:TAUFTFIdViews'),
     ('xAOD::TrackParticleAuxContainer#HLT_IDTrack_Tau_FTFAux.',          'BS ESD AODFULL', 'Tau'),
 
-    ('xAOD::TrackParticleContainer#HLT_IDTrack_Tau_IDTrig',                 'BS ESD AODFULL', 'Tau', 'inViews:TAUFTFIdViews'),
+    ('xAOD::TrackParticleContainer#HLT_IDTrack_Tau_IDTrig',                 'BS ESD AODFULL', 'Tau', 'inViews:TAUFTFIdViews,TAUPrecIsoViews'),
     ('xAOD::TrackParticleAuxContainer#HLT_IDTrack_Tau_IDTrigAux.',          'BS ESD AODFULL', 'Tau'),
 
     ('TrigRoiDescriptorCollection#HLT_Roi_Tau',              'BS ESD AODFULL AODSLIM',  'Steer'),
-- 
GitLab


From 5912e8843ba6306483ebcd7fdca2bea722bd564f Mon Sep 17 00:00:00 2001
From: yoyamagu <yohei.yamaguchi@cern.ch>
Date: Wed, 16 Dec 2020 11:03:31 +0900
Subject: [PATCH 060/225] find element index

---
 .../TrigHypothesis/TrigMuonHypoMT/src/TrigMufastHypoTool.cxx | 5 +++--
 .../TrigHypothesis/TrigMuonHypoMT/src/TrigmuCombHypoTool.cxx | 5 +++--
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMufastHypoTool.cxx b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMufastHypoTool.cxx
index 19ebae5bcf9d..d975a6c2cfd4 100644
--- a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMufastHypoTool.cxx
+++ b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMufastHypoTool.cxx
@@ -322,9 +322,9 @@ StatusCode TrigMufastHypoTool::inclusiveSelection(std::vector<TrigMufastHypoTool
 StatusCode TrigMufastHypoTool::multiplicitySelection(std::vector<TrigMufastHypoTool::MuonClusterInfo>& toolInput) const{
 
    HLT::Index2DVec passingSelection( m_ptBins.size() );
+   size_t elementIndex{ 0 };
 
    for ( size_t cutIndex=0; cutIndex < m_ptBins.size(); ++cutIndex ) {
-      size_t elementIndex{ 0 };      
       for ( auto& i: toolInput ) {
 
 	if(!m_acceptAll && m_applyOR && !i.passOR) {
@@ -332,6 +332,8 @@ StatusCode TrigMufastHypoTool::multiplicitySelection(std::vector<TrigMufastHypoT
 	  continue;
 	}
 
+	elementIndex = &i - &toolInput.front();
+
          // If muon event has difference DecisionID, it shouldn't apply.
          if ( TrigCompositeUtils::passed( m_decisionId.numeric(), i.previousDecisionIDs ) ) {
             if ( decideOnSingleObject( i, cutIndex ) == true ) {
@@ -343,7 +345,6 @@ StatusCode TrigMufastHypoTool::multiplicitySelection(std::vector<TrigMufastHypoT
          } else {
             ATH_MSG_DEBUG("Not match DecisionID " << m_decisionId );
          }
-         elementIndex++;
       }
 
       // If no object passes the selection, multipul selection should stop.
diff --git a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigmuCombHypoTool.cxx b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigmuCombHypoTool.cxx
index 106859d6ca42..dc4323fef1c0 100644
--- a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigmuCombHypoTool.cxx
+++ b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigmuCombHypoTool.cxx
@@ -275,9 +275,9 @@ StatusCode TrigmuCombHypoTool::inclusiveSelection(std::vector<TrigmuCombHypoTool
 StatusCode TrigmuCombHypoTool::multiplicitySelection(std::vector<TrigmuCombHypoTool::CombinedMuonInfo>& input) const
 {
    HLT::Index2DVec passingSelection( m_ptBins.size() );
+   size_t elementIndex{ 0 };
 
    for ( size_t cutIndex=0; cutIndex < m_ptBins.size(); ++cutIndex ) {
-      size_t elementIndex{ 0 };      
       for ( auto& i: input ) {
 
 	if(!m_acceptAll && m_applyOR && !i.passOR) {
@@ -285,6 +285,8 @@ StatusCode TrigmuCombHypoTool::multiplicitySelection(std::vector<TrigmuCombHypoT
 	  continue;
 	}
 
+	elementIndex = &i - &input.front();
+
          // If muon event has difference DecisionID, it shouldn't apply.
          if ( TrigCompositeUtils::passed( m_decisionId.numeric(), i.previousDecisionIDs ) ) {
             if ( decideOnSingleObject( i, cutIndex ) == true ) {
@@ -296,7 +298,6 @@ StatusCode TrigmuCombHypoTool::multiplicitySelection(std::vector<TrigmuCombHypoT
          } else {
             ATH_MSG_DEBUG("Not match DecisionID " << m_decisionId );
          }
-         elementIndex++;
       }
 
       // If no object passes the selection, multipul selection should stop.
-- 
GitLab


From a29df0c068ccdf269f6d217adbaac358f962fdbb Mon Sep 17 00:00:00 2001
From: Oana Vickey Boeriu <oana.boeriu@cern.ch>
Date: Tue, 15 Dec 2020 17:37:06 +0000
Subject: [PATCH 061/225] Merge branch '21.2-EGAM7-AddCells-20201214' into
 '21.2'

add cell container to EGAM7

See merge request atlas/athena!39174

(cherry picked from commit b2d0f02b7bff0575dbc3fe1ef803496373f069a0)

b05e8538 add cell container to EGAM7
---
 .../DerivationFrameworkEGamma/share/EGAM7.py                | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/share/EGAM7.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/share/EGAM7.py
index 3b9755c3556e..f47fc4e7d135 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/share/EGAM7.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/share/EGAM7.py
@@ -384,3 +384,9 @@ EGAM7SlimmingHelper.ExtraVariables += PhotonsCPDetailedContent
 
 # This line must come after we have finished configuring EGAM7SlimmingHelper
 EGAM7SlimmingHelper.AppendContentToStream(EGAM7Stream)
+
+#Add full CellContainer
+EGAM7Stream.AddItem("CaloCellContainer#AODCellContainer")
+EGAM7Stream.AddItem("CaloClusterCellLinkContainer#egammaClusters_links")
+
+
-- 
GitLab


From 4d81670c23349bbeb6492aaead33f8b5f6b15a51 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Mon, 14 Dec 2020 15:37:37 +0100
Subject: [PATCH 062/225] D3PDMakerConfig: Configuration fix.

Update to work with trigger configuration changes.
---
 .../D3PDMaker/D3PDMakerConfig/share/AODToEgammaD3PD.py          | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/PhysicsAnalysis/D3PDMaker/D3PDMakerConfig/share/AODToEgammaD3PD.py b/PhysicsAnalysis/D3PDMaker/D3PDMakerConfig/share/AODToEgammaD3PD.py
index 3a7512fb4bf6..dfa8e02ffd39 100644
--- a/PhysicsAnalysis/D3PDMaker/D3PDMakerConfig/share/AODToEgammaD3PD.py
+++ b/PhysicsAnalysis/D3PDMaker/D3PDMakerConfig/share/AODToEgammaD3PD.py
@@ -13,6 +13,8 @@
 
 from AthenaCommon.AthenaCommonFlags import athenaCommonFlags
 athenaCommonFlags.FilesInput= ["AOD.pool.root"]
+from AthenaConfiguration.AllConfigFlags import ConfigFlags
+ConfigFlags.Input.Files = athenaCommonFlags.FilesInput()
 
 
 ###################################################################3
-- 
GitLab


From a1a9a1b2e0746db34072b091803d0c144ebc10a9 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Fri, 11 Dec 2020 22:32:53 +0100
Subject: [PATCH 063/225] D3PDMakerConfig: Remove use of
 MuonScatteringSigToolConfig from egamma.

Changes in iPat broke MuonScatteringSigToolConfig.
Just remove it.
---
 .../D3PDMakerConfig/share/EgammaD3PD_prodJobOFragment.py       | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/PhysicsAnalysis/D3PDMaker/D3PDMakerConfig/share/EgammaD3PD_prodJobOFragment.py b/PhysicsAnalysis/D3PDMaker/D3PDMakerConfig/share/EgammaD3PD_prodJobOFragment.py
index a65e3009e84f..2b11e34ce1e6 100644
--- a/PhysicsAnalysis/D3PDMaker/D3PDMakerConfig/share/EgammaD3PD_prodJobOFragment.py
+++ b/PhysicsAnalysis/D3PDMaker/D3PDMakerConfig/share/EgammaD3PD_prodJobOFragment.py
@@ -23,9 +23,6 @@ if prodFlags.WriteEgammaD3PD.isVirtual:
     raise NameError( "Egamma D3PD set to be a virtual stream" )
     pass
 
-#configure MuonScatteringAngleSignificanceTool
-include("JetTagD3PDMaker/MuonScatteringSigToolConfig.py")
-
 # Construct the stream and file names for the SUSY D3PD:
 streamName = prodFlags.WriteEgammaD3PD.StreamName
 fileName   = buildFileName( prodFlags.WriteEgammaD3PD )
-- 
GitLab


From 6bf0b1a9b122b27969d34db847568f73a3a4a9fd Mon Sep 17 00:00:00 2001
From: sutt <sutt@cern.ch>
Date: Wed, 16 Dec 2020 04:11:30 +0100
Subject: [PATCH 064/225] Fix the vertex analyses in the allttbar ID Trigger
 validation

Update the analyses to be performaned on the vertex candidates in the
ID TRigger jobs which run the full trigger on the ttbar sample
---
 .../share/TIDAhisto-panel-vtx.dat             |  8 +++---
 .../share/TrigInDetValidation_NewBase.py      |  2 +-
 .../test/test_trigID_all_ttbar_pu40_new.py    | 25 ++++++++++---------
 3 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAhisto-panel-vtx.dat b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAhisto-panel-vtx.dat
index d6933c847c57..bb9c224cc634 100644
--- a/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAhisto-panel-vtx.dat
+++ b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAhisto-panel-vtx.dat
@@ -24,12 +24,12 @@ vtx_res_panel = {
 
   "rdz_vs_ntrax/mean",        "Offset z vs N_{tracks}",     "xaxis:lin:auto",     "Offline track multiplicity",  "yaxis:auto:lin:-1:1.", "z_{0} mean [mm]" ,
   "rdz_vs_zed/mean",          "Offset z vs z",              "xaxis:lin:-175:175", "Offline vertex z [mm]",        "yaxis:auto:lin:-1:1",  "z_{0} mean [mm]" ,
-  "rdz_vs_zed/1d+rebin10",     "Residual z",                 "xaxis:lin:-5:5",   "#Delta z [mm]",                 "yaxis:log:auton",    "(1/N)dN/dz [mm^{-1}]" ,
+  "rdz_vs_zed/1d+rebin10",    "Residual z",                 "xaxis:lin:-5:5",   "#Delta z [mm]",                 "yaxis:log:auton",    "(1/N)dN/dz [mm^{-1}]" ,
 
 
-  "rdz_vs_ntrax/sigma",       "Offset z vs N_{tracks}",     "xaxis:lin:auto",     "Offline track multiplicity",  "yaxis:auto:lin:0:2.", "z_{0} resolution [mm]" ,
-  "rdz_vs_zed/sigma",         "Resolution z vs z",          "xaxis:lin:-175:175", "Offline vertex z [mm]",        "yaxis:lin:auto:0:2",       "z_{0} resolution [mm]" ,
-  "rdz_vs_zed/1d+lin+rebin10", "Residual z",                 "xaxis:lin:-5:5",   "#Delta z [mm]",                  "yaxis:lin:auton",    "(1/N)dN/dz [mm^{-1}]"	
+  "rdz_vs_ntrax/sigma",        "Offset z vs N_{tracks}",     "xaxis:lin:auto",     "Offline track multiplicity",  "yaxis:log:auto:0.003:2.", "z_{0} resolution [mm]" ,
+  "rdz_vs_zed/sigma",          "Resolution z vs z",          "xaxis:lin:-175:175", "Offline vertex z [mm]",       "yaxis:log:auto:0.003:2",       "z_{0} resolution [mm]" ,
+  "rdz_vs_zed/1d+lin+rebin10", "Residual z",                 "xaxis:lin:-5:5",   "#Delta z [mm]",                 "yaxis:lin:auton",    "(1/N)dN/dz [mm^{-1}]"	
 
 };
 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_NewBase.py b/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_NewBase.py
index afbbee8fe151..7edd9a5a291f 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_NewBase.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_NewBase.py
@@ -32,7 +32,7 @@ except getopt.GetoptError:
     print("-n  N          run only on N events per job")
     print("-c(--config)   run with config_only and print to a pkl file")
     print("")
-
+    sys.exit(1)
 
 Events_local  = 0
 local         = False
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40_new.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40_new.py
index 65623557b83d..a510619a4395 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40_new.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40_new.py
@@ -32,20 +32,21 @@ Threads = 8
 Slots   = 8
 Input   = 'ttbar_ID'    # defined in TrigValTools/share/TrigValInputs.json  
 
-Jobs = [ ( "Offline",  " TIDAdata-run3-offline.dat -o data-hists.root" ) ]
+Jobs = [ ( "Offline",     " TIDAdata-run3-offline.dat      -o data-hists-offline.root" ),
+         ( "OfflineVtx",  " TIDAdata-run3-offline-vtx.dat  -o data-hists-offline-vtx.root" ) ]
 
+Comp = [ ( "L2muon",       "L2muon",      "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-muon " ),
+         ( "L2electron",   "L2electron",  "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-electron " ),
+         ( "L2tau",        "L2tau",       "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-tau " ),
+         ( "L2bjet",       "L2bjet",      "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-bjet " ),   
+         ( "FSjetoffline", "L2fsjet",     "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-FS " ),
+         ( "FSvtx",        "L2fsjetvtx",  "data-hists-offline-vtx.root",  " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtx     --ncols 3" ),
+         ( "FSvtxall",     "L2fsjetvtx",  "data-hists-offline.root",      " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtxall  --ncols 3" ), 
 
-Comp = [ ( "L2muon",       "L2muon",      "data-hists.root",          " -c TIDAhisto-panel.dat  -d HLTL2-plots-muon " ),
-         ( "L2electron",   "L2electron",  "data-hists.root",          " -c TIDAhisto-panel.dat  -d HLTL2-plots-electron " ),
-         ( "L2tau",        "L2tau",       "data-hists.root",          " -c TIDAhisto-panel.dat  -d HLTL2-plots-tau " ),
-         ( "L2bjet",       "L2bjet",      "data-hists.root",          " -c TIDAhisto-panel.dat  -d HLTL2-plots-bjet " ),   
-         ( "FSjetoffline", "L2fsjet",     "data-hists.root",          " -c TIDAhisto-panel.dat  -d HLTL2-plots-FS " ),
-         ( "FSvtx",        "L2fsjetvtx",  "data-hists.root",          " -c TIDAhistos-vtx.dat   -d HLTL2-plots-vtx " ),
- 
-         ( "EFmuon",       "EFmuon",      "data-hists.root",          " -c TIDAhisto-panel.dat  -d HLTEF-plots-muon " ),
-         ( "EFelectron",   "EFelectron",  "data-hists.root",          " -c TIDAhisto-panel.dat  -d HLTEF-plots-electron " ),
-         ( "EFtau",        "EFtau",       "data-hists.root",          " -c TIDAhisto-panel.dat  -d HLTEF-plots-tau " ),
-         ( "EFbjet",       "EFmuon",      "data-hists.root",          " -c TIDAhisto-panel.dat  -d HLTEF-plots-bjet " ) ]
+         ( "EFmuon",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-muon " ),
+         ( "EFelectron",   "EFelectron",  "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-electron " ),
+         ( "EFtau",        "EFtau",       "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-tau " ),
+         ( "EFbjet",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-bjet " ) ]
    
 from AthenaCommon.Include import include 
 include("TrigInDetValidation/TrigInDetValidation_NewBase.py")
-- 
GitLab


From efc8e856dd36b02ac867777f848e3830a79a9866 Mon Sep 17 00:00:00 2001
From: Jason Robert Veatch <jason.veatch@cern.ch>
Date: Wed, 16 Dec 2020 09:57:11 +0000
Subject: [PATCH 065/225] Porting BoostedJetTaggers to master

---
 .../JetAnalysisInterfaces/IJetQGTagger.h      |  50 ++
 .../JetAnalysisInterfaces/IJetSelectorTool.h  |  27 -
 .../JetAnalysisInterfacesDict.h               |   4 +-
 .../JetAnalysisInterfaces/selection.xml       |   2 +-
 .../TopCPTools/TopBoostedTaggingCPTools.h     |   4 +-
 .../Root/JetObjectCollectionMaker.cxx         |   3 +-
 .../JetObjectCollectionMaker.h                |   4 +-
 Projects/AnalysisBase/package_filters.txt     |   2 +-
 .../BoostedJetTaggers/BoostedJetTaggersDict.h |  19 +
 .../BoostedJetTaggers/JSSTaggerBase.h         | 239 ++++++
 .../BoostedJetTaggers/JSSWTopTaggerANN.h      |  47 ++
 .../BoostedJetTaggers/JSSWTopTaggerDNN.h      |  43 +
 .../BoostedJetTaggers/JetQGTagger.h           | 126 +++
 .../BoostedJetTaggers/JetQGTaggerBDT.h        |  75 ++
 .../BoostedJetTaggers/SmoothedWZTagger.h      |  51 ++
 .../BoostedJetTaggers/TagResultEnum.h         |  45 ++
 .../BoostedJetTaggers/selection.xml           |  17 +
 .../Jet/BoostedJetTaggers/CMakeLists.txt      |  92 +++
 .../Jet/BoostedJetTaggers/README.md           | 137 ++++
 .../BoostedJetTaggers/README_SFprovider.md    | 134 ++++
 .../BoostedJetTaggers/Root/JSSTaggerBase.cxx  | 574 ++++++++++++++
 .../Root/JSSWTopTaggerANN.cxx                 | 415 ++++++++++
 .../Root/JSSWTopTaggerDNN.cxx                 | 399 ++++++++++
 .../BoostedJetTaggers/Root/JetQGTagger.cxx    | 734 ++++++++++++++++++
 .../BoostedJetTaggers/Root/JetQGTaggerBDT.cxx | 380 +++++++++
 .../Root/SmoothedWZTagger.cxx                 | 365 +++++++++
 .../components/BoostedJetTaggers_entries.cxx  |  12 +
 .../util/test_JSSWTopTaggerANN.cxx            | 289 +++++++
 .../util/test_JSSWTopTaggerDNN.cxx            | 296 +++++++
 .../util/test_JetQGTagger.cxx                 | 213 +++++
 .../util/test_JetQGTaggerBDT.cxx              | 272 +++++++
 .../util/test_SmoothedWZTagger.cxx            | 258 ++++++
 32 files changed, 5292 insertions(+), 36 deletions(-)
 create mode 100644 PhysicsAnalysis/Interfaces/JetAnalysisInterfaces/JetAnalysisInterfaces/IJetQGTagger.h
 delete mode 100644 PhysicsAnalysis/Interfaces/JetAnalysisInterfaces/JetAnalysisInterfaces/IJetSelectorTool.h
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/BoostedJetTaggersDict.h
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JSSTaggerBase.h
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JSSWTopTaggerANN.h
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JSSWTopTaggerDNN.h
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JetQGTagger.h
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JetQGTaggerBDT.h
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/SmoothedWZTagger.h
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/TagResultEnum.h
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/selection.xml
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/CMakeLists.txt
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/README.md
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/README_SFprovider.md
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/Root/JSSTaggerBase.cxx
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/Root/JSSWTopTaggerANN.cxx
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/Root/JSSWTopTaggerDNN.cxx
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/Root/JetQGTagger.cxx
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/Root/JetQGTaggerBDT.cxx
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/Root/SmoothedWZTagger.cxx
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/src/components/BoostedJetTaggers_entries.cxx
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/util/test_JSSWTopTaggerANN.cxx
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/util/test_JSSWTopTaggerDNN.cxx
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/util/test_JetQGTagger.cxx
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/util/test_JetQGTaggerBDT.cxx
 create mode 100644 Reconstruction/Jet/BoostedJetTaggers/util/test_SmoothedWZTagger.cxx

diff --git a/PhysicsAnalysis/Interfaces/JetAnalysisInterfaces/JetAnalysisInterfaces/IJetQGTagger.h b/PhysicsAnalysis/Interfaces/JetAnalysisInterfaces/JetAnalysisInterfaces/IJetQGTagger.h
new file mode 100644
index 000000000000..3b0178dd123b
--- /dev/null
+++ b/PhysicsAnalysis/Interfaces/JetAnalysisInterfaces/JetAnalysisInterfaces/IJetQGTagger.h
@@ -0,0 +1,50 @@
+// this file is -*- C++ -*-
+
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef IJETQGTAGGER_H
+#define IJETQGTAGGER_H
+
+#include "PATInterfaces/CorrectionCode.h"
+#include "PATInterfaces/ISystematicsTool.h"
+
+#include "xAODJet/Jet.h"
+#include "xAODTracking/Vertex.h"
+
+namespace CP {
+
+  namespace QGntrackSyst {
+    const static SystematicVariation trackefficiency("JET_QG_trackEfficiency");
+    const static SystematicVariation trackfakes("JET_QG_trackFakes");
+    const static SystematicVariation nchargedtopo("JET_QG_nchargedTopo");
+    const static SystematicVariation nchargedexp_up("JET_QG_nchargedExp__1up");
+    const static SystematicVariation nchargedme_up("JET_QG_nchargedME__1up");
+    const static SystematicVariation nchargedpdf_up("JET_QG_nchargedPDF__1up");
+    const static SystematicVariation nchargedexp_down("JET_QG_nchargedExp__1down");
+    const static SystematicVariation nchargedme_down("JET_QG_nchargedME__1down");
+    const static SystematicVariation nchargedpdf_down("JET_QG_nchargedPDF__1down");
+    const static SystematicVariation trackeff("JET_QG_trackeff");
+    const static SystematicVariation fake("JET_QG_fake");
+
+  } //namespace QGntrackSyst
+
+  class IJetQGTagger : public virtual CP::ISystematicsTool {
+
+    ASG_TOOL_INTERFACE( CP::IJetQGTagger )
+
+    public:
+
+    virtual ~IJetQGTagger() {}
+
+    virtual StatusCode tag(const xAOD::Jet& jet) const = 0;
+    virtual StatusCode tag(const xAOD::Jet& jet, const xAOD::Vertex* pv) const = 0;
+
+    virtual StatusCode sysApplySystematicVariation(const SystematicSet&) = 0;
+
+  };
+
+} // namespace CP
+
+#endif /* IJETQGTAGGER_H */
diff --git a/PhysicsAnalysis/Interfaces/JetAnalysisInterfaces/JetAnalysisInterfaces/IJetSelectorTool.h b/PhysicsAnalysis/Interfaces/JetAnalysisInterfaces/JetAnalysisInterfaces/IJetSelectorTool.h
deleted file mode 100644
index 139f0bf2f2d5..000000000000
--- a/PhysicsAnalysis/Interfaces/JetAnalysisInterfaces/JetAnalysisInterfaces/IJetSelectorTool.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// for editors : this file is -*- C++ -*-
-
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-#ifndef JetAnalysisInterfaces_IJetSelectorTool_H_
-#define JetAnalysisInterfaces_IJetSelectorTool_H_
-
-#include "AsgTools/IAsgTool.h"
-
-#include "xAODJet/Jet.h"
-
-#include "PATCore/AcceptData.h"
-
-
-class IJetSelectorTool :  virtual public asg::IAsgTool {
-  ASG_TOOL_INTERFACE(IJetSelectorTool)
-
-  public:
-
-  virtual asg::AcceptData& tag(const xAOD::Jet& jet) const = 0;
-
-
-};
-
-#endif
diff --git a/PhysicsAnalysis/Interfaces/JetAnalysisInterfaces/JetAnalysisInterfaces/JetAnalysisInterfacesDict.h b/PhysicsAnalysis/Interfaces/JetAnalysisInterfaces/JetAnalysisInterfaces/JetAnalysisInterfacesDict.h
index 5bd4acf1a765..60b8fb63a900 100644
--- a/PhysicsAnalysis/Interfaces/JetAnalysisInterfaces/JetAnalysisInterfaces/JetAnalysisInterfacesDict.h
+++ b/PhysicsAnalysis/Interfaces/JetAnalysisInterfaces/JetAnalysisInterfaces/JetAnalysisInterfacesDict.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef JETANALYSISINTERFACES_JETANALYSISINTERFACESDICT_H
@@ -10,7 +10,7 @@
 #endif // __GCCXML__
 
 // Includes for the dictionary generation:
-#include "JetAnalysisInterfaces/IJetSelectorTool.h"
+#include "JetAnalysisInterfaces/IJetQGTagger.h"
 #include "JetAnalysisInterfaces/IJetJvtEfficiency.h"
 
 #endif // JETANALYSISINTERFACES_JETANALYSISINTERFACESDICT_H
diff --git a/PhysicsAnalysis/Interfaces/JetAnalysisInterfaces/JetAnalysisInterfaces/selection.xml b/PhysicsAnalysis/Interfaces/JetAnalysisInterfaces/JetAnalysisInterfaces/selection.xml
index 0a98caef59b5..8e9a1f98c191 100644
--- a/PhysicsAnalysis/Interfaces/JetAnalysisInterfaces/JetAnalysisInterfaces/selection.xml
+++ b/PhysicsAnalysis/Interfaces/JetAnalysisInterfaces/JetAnalysisInterfaces/selection.xml
@@ -1,6 +1,6 @@
 <lcgdict>
   <!-- Requested dictionary generation -->
-  <class name="IJetSelectorTool" />
+  <class name="IJetQGTagger" />
   <class name="IJetJvtEfficiency" />
 
   <!-- Suppress unwanted dictionaries generated by ROOT 6 -->
diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopCPTools/TopCPTools/TopBoostedTaggingCPTools.h b/PhysicsAnalysis/TopPhys/xAOD/TopCPTools/TopCPTools/TopBoostedTaggingCPTools.h
index 523d678de379..9cb78b2eef40 100644
--- a/PhysicsAnalysis/TopPhys/xAOD/TopCPTools/TopCPTools/TopBoostedTaggingCPTools.h
+++ b/PhysicsAnalysis/TopPhys/xAOD/TopCPTools/TopCPTools/TopBoostedTaggingCPTools.h
@@ -15,7 +15,7 @@
 #include "AsgTools/ToolHandle.h"
 #include "AsgTools/ToolHandleArray.h"
 #include "AsgTools/AnaToolHandle.h"
-#include "JetAnalysisInterfaces/IJetSelectorTool.h"
+#include "JetInterface/IJetDecorator.h"
 #include "JetCPInterfaces/ICPJetUncertaintiesTool.h"
 
 namespace top {
@@ -30,7 +30,7 @@ namespace top {
   private:
     std::shared_ptr<top::TopConfig> m_config;
 
-    std::unordered_map<std::string, asg::AnaToolHandle<IJetSelectorTool> > m_taggers;
+    std::unordered_map<std::string, asg::AnaToolHandle<IJetDecorator> > m_taggers;
     std::unordered_map<std::string, ToolHandle<ICPJetUncertaintiesTool> > m_tagSFuncertTool;
   };
 }  // namespace top
diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/Root/JetObjectCollectionMaker.cxx b/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/Root/JetObjectCollectionMaker.cxx
index 811c9eca48b7..244d7303f591 100644
--- a/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/Root/JetObjectCollectionMaker.cxx
+++ b/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/Root/JetObjectCollectionMaker.cxx
@@ -290,7 +290,7 @@ namespace top {
     if (m_config->useLargeRJets()) {
       for (const std::pair<std::string, std::string>& name : m_config->boostedJetTaggers()) {
         std::string fullName = name.first + "_" + name.second;
-        m_boostedJetTaggers[fullName] = ToolHandle<IJetSelectorTool>(fullName);
+        m_boostedJetTaggers[fullName] = ToolHandle<IJetDecorator>(fullName);
         top::check(m_boostedJetTaggers[fullName].retrieve(), "Failed to retrieve " + fullName);
       }
     }
@@ -764,6 +764,7 @@ namespace top {
     //decorate with boosted-tagging flags
     for (const std::pair<std::string, std::string>& name : m_config->boostedJetTaggers()) {
       std::string fullName = name.first + "_" + name.second;
+      // TODO: Rewrite this to use the new interface
 //      const Root::TAccept& result = m_boostedJetTaggers[fullName]->tag(jet);
       // TAccept has bool operator overloaded, but let's be more explicit in the output to char
 //      jet.auxdecor<char>("isTagged_" + fullName) = (result ? 1 : 0);
diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/TopSystematicObjectMaker/JetObjectCollectionMaker.h b/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/TopSystematicObjectMaker/JetObjectCollectionMaker.h
index 686540e520bb..57bfb1538fb4 100644
--- a/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/TopSystematicObjectMaker/JetObjectCollectionMaker.h
+++ b/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/TopSystematicObjectMaker/JetObjectCollectionMaker.h
@@ -47,7 +47,7 @@
 #include "TopJetSubstructure/TopJetSubstructure.h"
 
 #include "FTagAnalysisInterfaces/IBTaggingSelectionTool.h"
-#include "JetAnalysisInterfaces/IJetSelectorTool.h"
+#include "JetInterface/IJetDecorator.h"
 #include "ParticleJetTools/JetTruthLabelingTool.h"
 
 // Forward declaration(s):
@@ -135,7 +135,7 @@ namespace top {
     // do decorate the large-R jets with the boosted-tagging flags
     // and decorate jets with TAccept object containing detailed tag result informaiton
     // https://twiki.cern.ch/twiki/bin/view/AtlasProtected/BoostedJetTaggingRecommendation2017#TAcceptUsageSection
-    std::unordered_map<std::string, ToolHandle<IJetSelectorTool> > m_boostedJetTaggers;
+    std::unordered_map<std::string, ToolHandle<IJetDecorator> > m_boostedJetTaggers;
 
     ToolHandle<IJetUpdateJvt> m_jetUpdateJvtTool;
     ToolHandle<IJetModifier> m_jetSelectfJvtTool;
diff --git a/Projects/AnalysisBase/package_filters.txt b/Projects/AnalysisBase/package_filters.txt
index 2f954cc6d377..b83b59bc01c3 100644
--- a/Projects/AnalysisBase/package_filters.txt
+++ b/Projects/AnalysisBase/package_filters.txt
@@ -11,7 +11,6 @@
 #+ PhysicsAnalysis/AnalysisCommon/FakeBkgTools
 #+ PhysicsAnalysis/BPhys/BPhysTools
 #+ PhysicsAnalysis/DerivationFramework/DerivationFrameworkAnalysisTests
-#+ Reconstruction/Jet/BoostedJetTaggers
 #+ Trigger/TriggerSimulation/TrigBtagEmulationTool
 
 
@@ -83,6 +82,7 @@
 + PhysicsAnalysis/TauID/TauAnalysisTools
 + PhysicsAnalysis/TrackingID/.*
 + Reconstruction/EventShapes/EventShapeInterface
++ Reconstruction/Jet/BoostedJetTaggers
 - Reconstruction/Jet/JetAnalysisTools/JetAnalysisEDM
 - Reconstruction/Jet/JetEvent.*
 - Reconstruction/Jet/JetMonitoring
diff --git a/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/BoostedJetTaggersDict.h b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/BoostedJetTaggersDict.h
new file mode 100644
index 000000000000..2dd7809e2995
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/BoostedJetTaggersDict.h
@@ -0,0 +1,19 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef BOOSTEDJETTAGGERS_BOOSTEDJETTAGGERSDICT_H
+#define BOOSTEDJETTAGGERS_BOOSTEDJETTAGGERSDICT_H
+
+#if defined(__GCCXML__) and not defined(EIGEN_DONT_VECTORIZE)
+#define EIGEN_DONT_VECTORIZE
+#endif // __GCCXML__
+
+// Includes for the dictionary generation:
+#include "BoostedJetTaggers/SmoothedWZTagger.h"
+#include "BoostedJetTaggers/JSSWTopTaggerDNN.h"
+#include "BoostedJetTaggers/JSSWTopTaggerANN.h"
+#include "BoostedJetTaggers/JetQGTagger.h"
+#include "BoostedJetTaggers/JetQGTaggerBDT.h"
+
+#endif // BOOSTEDJETTAGGERS_BOOSTEDJETTAGGERSDICT_H
diff --git a/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JSSTaggerBase.h b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JSSTaggerBase.h
new file mode 100644
index 000000000000..4988e50eda32
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JSSTaggerBase.h
@@ -0,0 +1,239 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef BOOSTEDJETSTAGGERS_JSSTAGGERBASE_H
+#define BOOSTEDJETSTAGGERS_JSSTAGGERBASE_H
+
+#include "AsgTools/AsgTool.h"
+#include "AsgTools/AnaToolHandle.h"
+
+#include "JetInterface/IJetDecorator.h"
+
+#include "xAODJet/Jet.h"
+#include "xAODJet/JetContainer.h"
+#include "xAODTruth/TruthParticleContainer.h"
+#include "xAODEventInfo/EventInfo.h"
+
+#include "BoostedJetTaggers/TagResultEnum.h"
+
+#include "PATCore/AcceptData.h"
+
+#include "PathResolver/PathResolver.h"
+
+#include "AsgDataHandles/WriteDecorHandle.h"
+#include "AsgDataHandles/ReadDecorHandle.h"
+
+#include <TFile.h>
+#include <TEnv.h>
+#include <TH2.h>
+#include <TF1.h>
+
+#include <atomic>
+
+class JSSTaggerBase :   public asg::AsgTool ,
+  virtual public IJetDecorator
+{
+  ASG_TOOL_CLASS1(JSSTaggerBase, IJetDecorator )
+
+  protected:
+
+    /// Default constructor - to be used in all derived classes
+    JSSTaggerBase(const std::string &name);
+
+    /// Default destructor - to be used in all derived classes
+    ~JSSTaggerBase() {};
+
+    /// Initialize the tool
+    virtual StatusCode initialize() override;
+
+    /// Decorate jet collection with tagging info
+    virtual StatusCode decorate( const xAOD::JetContainer& jets ) const override;
+
+    /// Decorate single jet with tagging info
+    virtual StatusCode tag( const xAOD::Jet& jet ) const = 0;
+
+    /// TEnv instance to read config files
+    TEnv m_configReader;
+
+    /// Object that stores the results for a jet
+    asg::AcceptInfo m_acceptInfo;
+
+    /// WriteDecorHandle keys for tagging bools
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decTaggedKey{this, "TaggedName", "Tagged", "SG key for Tagged"};
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decValidPtRangeHighKey{this, "ValidPtRangeHighName", "ValidPtRangeHigh", "SG key for ValidPtRangeHigh"};
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decValidPtRangeLowKey{this, "ValidPtRangeLowName", "ValidPtRangeLow", "SG key for ValidPtRangeLow"};
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decValidEtaRangeKey{this, "ValidEtaRangeName", "ValidEtaRange", "SG key for ValidEtaRange"};
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decValidJetContentKey{this, "ValidJetContentName", "ValidJetContent", "SG key for ValidJetContent"};
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decValidEventContentKey{this, "ValidEventContentName", "ValidEventContent", "SG key for ValidEventContent"};
+    
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decPassMassKey{this, "PassMassName", "PassMass", "SG key for PassMass"};
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decPassScoreKey{this, "PassScoreName", "PassScore", "SG key for PassScore"};
+    
+    /// Maximum number of warnings
+    const int m_nWarnMax = 10;
+
+    /// Warning counters
+    mutable std::atomic<int> m_nWarnKin;
+    mutable std::atomic<int> m_nWarnVar;
+
+    /// Flag to indicate units pT is defined in
+    /// Set to false by default
+    bool m_ptGeV = false;
+
+    /// Flag to indicate if mass window cut is used
+    bool m_useMassCut = false;
+
+    /// Flag to indicate if a discriminant score is used
+    bool m_useScoreCut = false;
+
+    /// TAGTYPE enum
+    enum TAGCLASS{Unknown, WBoson, ZBoson, TopQuark};
+    TAGCLASS m_tagClass;
+
+    /// Configurable members
+
+    /// Jet container name
+    std::string m_containerName;
+
+    /// Path to the SF configuration root file
+    std::string m_weightConfigPath;
+
+    /// Configuration file name
+    std::string m_configFile;
+
+    /// Location where config files live on cvmfs
+    std::string m_calibArea;
+
+    /// Keras configurations for ML taggers
+    std::string m_kerasConfigFileName;
+    std::string m_kerasConfigFilePath;
+    std::string m_kerasConfigOutputName;
+    std::string m_kerasCalibArea;
+
+    /// TMVA configurations for BDT taggers
+    std::string m_tmvaConfigFileName;
+    std::string m_tmvaConfigFilePath;
+    std::string m_tmvaCalibArea;
+
+    /// Tagger information
+    std::string m_wkpt;
+    std::string m_tagType;
+
+    /// Kinematic bounds for the jet - the units are controlled by m_ptGeV
+    float m_jetPtMin;
+    float m_jetPtMax;
+    float m_jetEtaMax;
+
+    /// Flags controlling whether generalized ECF moments or L-series ratios are needed
+    /// TODO: Implement the functionality controlled by these
+    bool m_useECFG = false;
+    bool m_useLSeries = false;
+
+    /// WriteDecorHandle keys for JSS moments
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decTau21WTAKey{this, "Tau21WTAName", "Tau21_wta", "SG key for Tau21_wta"};
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decTau32WTAKey{this, "Tau32WTAName", "Tau32_wta", "SG key for Tau32_wta"};
+    
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decC2Key{this, "C2Name", "C2", "SG key for C2"};
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decD2Key{this, "D2Name", "D2", "SG key for D2"};
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decE3Key{this, "e3Name", "e3", "SG key for e3"};
+    
+    /// ReadDecorHandle keys for JSS moments
+    SG::ReadDecorHandleKey<xAOD::JetContainer> m_readTau1WTAKey{this, "Tau1WTAName", "Tau1_wta", "SG key for Tau1_wta"};
+    SG::ReadDecorHandleKey<xAOD::JetContainer> m_readTau2WTAKey{this, "Tau2WTAName", "Tau2_wta", "SG key for Tau2_wta"};
+    SG::ReadDecorHandleKey<xAOD::JetContainer> m_readTau3WTAKey{this, "Tau3WTAName", "Tau3_wta", "SG key for Tau3_wta"};
+ 
+    SG::ReadDecorHandleKey<xAOD::JetContainer> m_readTau21WTAKey{this, "Tau21WTAName", "Tau21_wta", "SG key for Tau21_wta"};
+    SG::ReadDecorHandleKey<xAOD::JetContainer> m_readTau32WTAKey{this, "Tau32WTAName", "Tau32_wta", "SG key for Tau32_wta"};
+    
+    SG::ReadDecorHandleKey<xAOD::JetContainer> m_readECF1Key{this, "ECF1Name", "ECF1", "SG key for ECF1"};
+    SG::ReadDecorHandleKey<xAOD::JetContainer> m_readECF2Key{this, "ECF2Name", "ECF2", "SG key for ECF2"};
+    SG::ReadDecorHandleKey<xAOD::JetContainer> m_readECF3Key{this, "ECF3Name", "ECF3", "SG key for ECF3"};
+    
+    SG::ReadDecorHandleKey<xAOD::JetContainer> m_readC2Key{this, "C2Name", "C2", "SG key for C2"};
+    SG::ReadDecorHandleKey<xAOD::JetContainer> m_readD2Key{this, "D2Name", "D2", "SG key for D2"};
+    SG::ReadDecorHandleKey<xAOD::JetContainer> m_readE3Key{this, "e3Name", "e3", "SG key for e3"};
+    
+    SG::ReadDecorHandleKey<xAOD::JetContainer> m_readSplit12Key{this, "Split12Name", "Split12", "SG key for Split12"};
+    SG::ReadDecorHandleKey<xAOD::JetContainer> m_readSplit23Key{this, "Split23Name", "Split23", "SG key for Split23"};
+    
+    SG::ReadDecorHandleKey<xAOD::JetContainer> m_readQwKey{this, "QwName", "Qw", "SG key for Qw"};
+
+    /// Strings for cut functions
+    std::string m_strMassCutLow;
+    std::string m_strMassCutHigh;
+    std::string m_strScoreCut;
+
+    /// TF1 for cut functions
+    std::unique_ptr<TF1> m_funcMassCutLow;
+    std::unique_ptr<TF1> m_funcMassCutHigh;
+    std::unique_ptr<TF1> m_funcScoreCut;
+
+    /// Decoration name
+    std::string m_decorationName;
+
+    /// Flag to calculate scale factor
+    bool m_calcSF;
+    bool m_isMC;
+
+    /// String for scale factor decoration names
+    std::string m_weightDecorationName;
+    std::string m_weightFileName;
+    std::string m_weightHistogramName;
+    std::string m_efficiencyHistogramName;
+    std::string m_weightFlavors;
+
+    /// Histograms for scale factors
+    std::unique_ptr<TFile> m_weightConfig;
+    std::map<std::string, std::unique_ptr<TH2D>> m_weightHistograms;
+    std::map<std::string, std::unique_ptr<TH2D>> m_efficiencyHistograms;
+
+    /// Truth label options
+    bool m_truthLabelUseTRUTH3;
+    std::string m_truthParticleContainerName;
+    std::string m_truthBosonContainerName;
+    std::string m_truthTopQuarkContainerName;
+    std::string m_truthLabelName;
+
+    /// Truth label ReadDecorHandle key
+    SG::ReadDecorHandleKey<xAOD::JetContainer> m_readTruthLabelKey{this, "truthLabelName", "truthLabel", "SG key for truthLabel"};
+
+    /// WriteDecorHandle keys for cut values
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decCutMLowKey{this, "CutMLowName", "Cut_mlow", "SG key for Cut_mlow"};
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decCutMHighKey{this, "CutMHighName", "Cut_mhigh", "SG key for Cut_mhigh"};
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decScoreCutKey{this, "CutScoreName", "Cut_score", "SG key for Cut_score"};
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decScoreValueKey{this, "ScoreName", "Score", "SG key for Score"};
+
+    /// WriteDecorHandle keys for SF
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decWeightKey{this, "weightName", "weight", "SG key for weight"};
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decEfficiencyKey{this, "efficiencyName", "efficiency", "SG key for efficiency"};
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_decEffSFKey{this, "effSFName", "effSF", "SG key for effSF"};
+
+    /// Get configReader StatusCode
+    StatusCode getConfigReader();
+
+    /// Reset cuts
+    StatusCode resetCuts( asg::AcceptData &acceptData ) const;
+
+    /// Check if jet passes kinematic constraints
+    bool passKinRange( const xAOD::Jet &jet ) const;
+
+    /// Check and record if jet passes kinematic constraints
+    StatusCode checkKinRange( const xAOD::Jet &jet, asg::AcceptData &acceptData ) const;
+
+    /// Calculate JSS moment ratios in case they are not already saved
+    /// TODO: Remove this once JSSMomentTools is modified to take const jets
+    int calculateJSSRatios( const xAOD::Jet &jet ) const;
+
+    /// Get SF weight
+    StatusCode getWeight( const xAOD::Jet& jet, bool passSel, asg::AcceptData &acceptData ) const;
+
+    /// Get scale factor and efficiency
+    std::pair<double,double> getSF( const xAOD::Jet& jet, asg::AcceptData &acceptData ) const;
+
+    /// Print configured cuts
+    void printCuts() const;
+
+};
+
+#endif
diff --git a/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JSSWTopTaggerANN.h b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JSSWTopTaggerANN.h
new file mode 100644
index 000000000000..41c67b32441d
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JSSWTopTaggerANN.h
@@ -0,0 +1,47 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef JSSWTOPTAGGERANN_H_
+#define JSSWTOPTAGGERANN_H_
+
+#include "BoostedJetTaggers/JSSTaggerBase.h"
+
+#include "lwtnn/LightweightGraph.hh"
+#include "lwtnn/parse_json.hh"
+#include "lwtnn/Exceptions.hh"
+#include "lwtnn/lightweight_nn_streamers.hh"
+
+class JSSWTopTaggerANN :
+  public JSSTaggerBase {
+    ASG_TOOL_CLASS0(JSSWTopTaggerANN)
+
+    public:
+
+      /// Constructor
+      JSSWTopTaggerANN(const std::string& name);
+
+      /// Run once at the start of the job to setup everything
+      virtual StatusCode initialize() override;
+
+      /// Decorate single jet with tagging info
+      virtual StatusCode tag(const xAOD::Jet& jet) const override;
+
+    private:
+      
+      /// ANN tools
+      std::unique_ptr<lwt::LightweightGraph> m_lwnn;
+      std::map<std::string, std::map<std::string,double>> m_ANN_inputValues;   // variables for ANN
+
+      /// Internal stuff to keep track of the output node for the NN
+      std::vector<std::string> m_out_names;
+
+      /// Retrieve score for a given ANN type (top/W)
+      double getScore(const xAOD::Jet& jet) const;
+
+      /// Update the jet substructure variables for each jet to use in ANN
+      std::map<std::string, std::map<std::string,double>> getJetProperties(const xAOD::Jet& jet) const;
+
+  };
+
+#endif
diff --git a/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JSSWTopTaggerDNN.h b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JSSWTopTaggerDNN.h
new file mode 100644
index 000000000000..6ad76c08a588
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JSSWTopTaggerDNN.h
@@ -0,0 +1,43 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef JSSWTOPTAGGERDNN_H_
+#define JSSWTOPTAGGERDNN_H_
+
+#include "BoostedJetTaggers/JSSTaggerBase.h"
+
+#include "lwtnn/LightweightNeuralNetwork.hh"
+#include "lwtnn/parse_json.hh"
+
+class JSSWTopTaggerDNN :
+  public JSSTaggerBase {
+    ASG_TOOL_CLASS0(JSSWTopTaggerDNN)
+
+    public:
+
+      /// Constructor
+      JSSWTopTaggerDNN( const std::string& name );
+
+      /// Run once at the start of the job to setup everything
+      virtual StatusCode initialize() override;
+
+      /// Decorate single jet with tagging info
+      virtual StatusCode tag( const xAOD::Jet& jet ) const override;
+
+    private:
+
+      /// DNN tools
+      std::unique_ptr<lwt::LightweightNeuralNetwork> m_lwnn;
+      /// Variables for DNN
+      std::map<std::string, double> m_DNN_inputValues;
+
+      /// Retrieve score for a given DNN type (top/W)
+      double getScore( const xAOD::Jet& jet ) const;
+
+      /// Update the jet substructure variables for each jet to use in DNN
+      std::map<std::string,double> getJetProperties( const xAOD::Jet& jet ) const;
+
+  };
+
+#endif
diff --git a/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JetQGTagger.h b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JetQGTagger.h
new file mode 100644
index 000000000000..53f73796fd06
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JetQGTagger.h
@@ -0,0 +1,126 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef JETQGTAGGER_H
+#define JETQGTAGGER_H
+
+#include "JetAnalysisInterfaces/IJetQGTagger.h"
+#include "BoostedJetTaggers/JSSTaggerBase.h"
+
+#include "PATInterfaces/SystematicsTool.h"
+
+#include <TH2D.h>
+
+namespace InDet { class IInDetTrackSelectionTool; }
+namespace InDet { class IInDetTrackTruthFilterTool; }
+namespace InDet { class IJetTrackFilterTool; }
+namespace InDet { class IInDetTrackTruthOriginTool; }
+
+namespace CP {
+
+  enum QGSystApplied {
+    QG_NONE,
+    QG_TRACKEFFICIENCY,
+    QG_TRACKFAKES,
+    QG_NCHARGEDTOPO,
+    QG_NCHARGEDEXP_UP,
+    QG_NCHARGEDME_UP,
+    QG_NCHARGEDPDF_UP,
+    QG_NCHARGEDEXP_DOWN,
+    QG_NCHARGEDME_DOWN,
+    QG_NCHARGEDPDF_DOWN
+  };
+
+
+  class JetQGTagger: public IJetQGTagger, public JSSTaggerBase, public SystematicsTool{
+    ASG_TOOL_CLASS( JetQGTagger, IJetQGTagger )
+
+    public:
+
+      JetQGTagger( const std::string& name); 
+      virtual ~JetQGTagger(); // destructor
+
+      virtual StatusCode initialize() override;
+
+      // Implement IBoostedJetTagger interface
+      virtual StatusCode tag(const xAOD::Jet& jet, const xAOD::Vertex *pv) const override;
+      virtual StatusCode tag(const xAOD::Jet& jet) const override { return tag(jet, nullptr); }
+
+      // functions for systematic variations
+      virtual bool isAffectedBySystematic(const SystematicVariation& var) const override {return SystematicsTool::isAffectedBySystematic(var);}
+      virtual SystematicSet affectingSystematics() const override {return SystematicsTool::affectingSystematics();}
+      virtual SystematicSet recommendedSystematics() const override {return SystematicsTool::recommendedSystematics();}
+      virtual StatusCode applySystematicVariation(const SystematicSet& set) override {return SystematicsTool::applySystematicVariation(set);}
+      virtual StatusCode sysApplySystematicVariation(const SystematicSet&) override;
+
+    private:
+      JetQGTagger();
+      StatusCode getNTrack(const xAOD::Jet * jet, /*const xAOD::Vertex * pv,*/ int &ntracks) const ;
+      StatusCode getNTrackWeight(const xAOD::Jet * jet, double &weight) const ;
+      StatusCode simplegetNTrackWeight(const xAOD::Jet * jet, double &weight) const ;
+
+      QGSystApplied m_appliedSystEnum;
+
+      TH2D* m_hquark;
+      TH2D* m_hgluon;
+
+      TH2D* m_topo_hquark;
+
+      TH2D* m_exp_hquark_up;
+      TH2D* m_exp_hquark_down;
+      TH2D* m_exp_hgluon_up;
+      TH2D* m_exp_hgluon_down;
+
+      TH2D* m_me_hquark_up;
+      TH2D* m_me_hquark_down;
+      TH2D* m_me_hgluon_up;
+      TH2D* m_me_hgluon_down;
+
+      TH2D* m_pdf_hquark_up;
+      TH2D* m_pdf_hquark_down;
+      TH2D* m_pdf_hgluon_up;
+      TH2D* m_pdf_hgluon_down;
+
+      TH2D* m_trackeff_hquark;
+      TH2D* m_trackeff_hgluon;
+      TH2D* m_fake_hquark;
+      TH2D* m_fake_hgluon;
+
+      StatusCode loadHist(TH2D *&hist,std::string filename,std::string histname);
+
+      std::string m_taggername;
+      std::string m_topofile;
+      std::string m_expfile;
+      std::string m_mefile;
+      std::string m_pdffile;
+      std::string m_trackefffile;
+      std::string m_fakefile;
+      std::string m_weight_decoration_name;
+      std::string m_tagger_decoration_name;
+
+      int m_NTrackCut;
+      double m_slope;
+      double m_intercept;
+      std::string m_cuttype;
+      int m_mode;
+
+      asg::AnaToolHandle<InDet::IInDetTrackSelectionTool> m_trkSelectionTool;
+      asg::AnaToolHandle<InDet::IInDetTrackTruthFilterTool> m_trkTruthFilterTool;
+      asg::AnaToolHandle<InDet::IInDetTrackTruthFilterTool> m_trkFakeTool;
+      asg::AnaToolHandle<InDet::IJetTrackFilterTool> m_jetTrackFilterTool;
+      asg::AnaToolHandle<InDet::IInDetTrackTruthOriginTool> m_originTool;
+
+      /// ReadDecorHandle keys
+      SG::ReadDecorHandleKey<xAOD::JetContainer> m_readNumTrkPt500PVKey{this, "NumTrkPt500PVName", "NumTrkPt500PV", "SG key for NumTrkPt500PV"};
+      SG::ReadDecorHandleKey<xAOD::JetContainer> m_readNtrkKey{this, "NtrkName", "DFCommonJets_QGTagger_NTracks", "SG key for Ntrk"};
+
+      /// WriteDecorHandle keys
+      SG::WriteDecorHandleKey<xAOD::JetContainer> m_decTagKey{this, "TagName", "Tag", "SG key for Tag"};
+      SG::WriteDecorHandleKey<xAOD::JetContainer> m_decWeightKey{this, "WeightName", "Weight", "SG key for Weight"};
+  
+  };
+
+} /* namespace CP */
+
+#endif /* JETQGTAGGER_H */
diff --git a/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JetQGTaggerBDT.h b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JetQGTaggerBDT.h
new file mode 100644
index 000000000000..8404a5c5ec2c
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/JetQGTaggerBDT.h
@@ -0,0 +1,75 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef JETQGTAGGERBDT_H_
+#define JETQGTAGGERBDT_H_
+
+#include "BoostedJetTaggers/JSSTaggerBase.h"
+
+#include "TMVA/Tools.h"
+#include "TMVA/Reader.h"
+#include "TMVA/MethodCuts.h"
+
+namespace InDet {
+  class IInDetTrackSelectionTool;
+}
+
+namespace CP {
+
+  class JetQGTaggerBDT :
+    public JSSTaggerBase {
+      ASG_TOOL_CLASS0(JetQGTaggerBDT)
+
+      public:
+
+        /// Constructor
+        JetQGTaggerBDT(const std::string& name);
+
+        /// Run once at the start of the job to setup everything
+        virtual StatusCode initialize() override;
+
+        /// IBoostedJetTagger interface
+        virtual StatusCode tag(const xAOD::Jet& jet) const override;
+
+      private:
+
+        /// Retrieve BDT score
+        float getScore( const xAOD::Jet& jet, asg::AcceptData &acceptData ) const;
+
+        /// Update the jet substructure variables for each jet to use in BDT
+        bool getJetProperties( const xAOD::Jet& jet, asg::AcceptData &acceptData ) const;
+
+        bool getPrecomputedVariables( const xAOD::Jet& jet, asg::AcceptData &acceptData ) const;
+
+        bool calculateVariables( const xAOD::Jet& jet, asg::AcceptData &acceptData ) const;
+
+        bool isCorrectNumberOfTracks( int expectedNTracks, int nTracksFromGhostTracks ) const;
+
+        /// TMVA tools
+        std::unique_ptr<TMVA::Reader> m_bdtTagger;
+        std::string m_BDTmethod;
+
+        asg::AnaToolHandle<InDet::IInDetTrackSelectionTool> m_trkSelectionTool;
+
+        // inclusive config file
+        std::string m_tmvaConfigFileName;
+        std::string m_tmvaConfigFilePath;
+
+        //string for cut function
+        std::string m_strScoreCut;
+
+        // variables for TMVA
+        mutable float m_pt;
+        mutable float m_eta;
+        mutable float m_ntracks;
+        mutable float m_trackwidth;
+        mutable float m_trackC1;
+
+        int m_mode;
+
+    };
+
+} /* namespace CP */
+
+#endif
diff --git a/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/SmoothedWZTagger.h b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/SmoothedWZTagger.h
new file mode 100644
index 000000000000..3f9e00307f34
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/SmoothedWZTagger.h
@@ -0,0 +1,51 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef BOOSTEDJETSTAGGERS_SMOOTHEDWZTAGGER_H_
+#define BOOSTEDJETSTAGGERS_SMOOTHEDWZTAGGER_H_
+
+#include "BoostedJetTaggers/JSSTaggerBase.h"
+
+class SmoothedWZTagger :
+  public JSSTaggerBase {
+    ASG_TOOL_CLASS0(SmoothedWZTagger)
+  
+    public:
+
+      /// Constructor
+      SmoothedWZTagger( const std::string& name );
+
+      /// Run once at the start of the job to setup everything
+      virtual StatusCode initialize() override;
+
+      /// Decorate single jet with tagging info
+      virtual StatusCode tag( const xAOD::Jet& jet ) const override;
+
+    private:
+
+      /// Flag to indicate if Ntrk is used
+      bool m_useNtrk;
+
+      /// Store functional form of cuts
+      std::string m_strD2Cut;
+      std::string m_strNtrkCut;
+
+      /// Functions that are configurable for specific cut values
+      std::unique_ptr<TF1> m_funcD2Cut;
+      std::unique_ptr<TF1> m_funcNtrkCut;
+
+      /// WriteDecorHandle keys
+      SG::WriteDecorHandleKey<xAOD::JetContainer> m_decPassD2Key{this, "PassD2Name", "PassD2", "SG key for PassD2"};
+      SG::WriteDecorHandleKey<xAOD::JetContainer> m_decPassNtrkKey{this, "PassNtrkName", "PassNtrk", "SG key for PassNtrk"};
+
+      SG::WriteDecorHandleKey<xAOD::JetContainer> m_decCutD2Key{this, "CutD2Name", "Cut_D2", "SG key for Cut_D2"};
+      SG::WriteDecorHandleKey<xAOD::JetContainer> m_decCutNtrkKey{this, "CutNtrkName", "Cut_Ntrk", "SG key for Cut_Ntrk"};
+      SG::WriteDecorHandleKey<xAOD::JetContainer> m_decAcceptKey{this, "acceptName", "accept", "SG key for accept"};
+
+      /// ReadDecorHandle keys
+      SG::ReadDecorHandleKey<xAOD::JetContainer> m_readUngroomedLinkKey{this, "ParentName", "Parent", "SG key for Parent"};
+
+  };
+
+#endif
diff --git a/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/TagResultEnum.h b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/TagResultEnum.h
new file mode 100644
index 000000000000..2273d4cb5dd3
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/TagResultEnum.h
@@ -0,0 +1,45 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TAGRESULTENUM_H
+#define TAGRESULTENUM_H
+
+namespace TagResult
+{
+  enum TypeEnum
+  {
+    UNKNOWN=0, // not tagged yet
+    passMpassD2_2Var,
+    passMfailD2_2Var,
+    failMpassD2_2Var,
+    failMfailD2_2Var
+  };
+  inline int enumToInt(const TypeEnum type)
+  {
+    switch (type)
+      {
+      case passMpassD2_2Var: return 1;
+      case passMfailD2_2Var: return 2;
+      case failMpassD2_2Var: return 3;
+      case failMfailD2_2Var: return 4;
+      default:               return 0;
+      }
+  }
+  inline TypeEnum intToEnum(const int type)
+  {
+    if ( type==1 ){
+      return passMpassD2_2Var;
+    }else if ( type==2 ){
+      return passMfailD2_2Var;
+    }else if ( type==3 ){
+      return failMpassD2_2Var;
+    }else if ( type==4 ){
+      return failMfailD2_2Var;
+    }
+    
+    return UNKNOWN;
+  }
+}
+
+#endif
diff --git a/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/selection.xml b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/selection.xml
new file mode 100644
index 000000000000..2c1ca9c8c170
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/BoostedJetTaggers/selection.xml
@@ -0,0 +1,17 @@
+<lcgdict>
+  <!-- Requested dictionary generation -->
+  <class name="SmoothedWZTagger" />
+  <class name="JSSWTopTaggerDNN" />
+  <class name="JSSWTopTaggerANN" />
+  <class name="JetQGTagger" />
+  <class name="CP::JetQGTaggerBDT" />
+
+  <!-- Suppress unwanted dictionaries generated by ROOT 6 -->
+  <exclusion>
+    <class name="SG::IConstAuxStore"/>
+    <class name="DataLink<SG::IConstAuxStore>"/>
+    <class name="xAOD::IParticle"/>
+    <class name="DataVector<xAOD::IParticle>"/>
+    <class name="ElementLink<DataVector<xAOD::IParticle> >"/>
+  </exclusion>
+</lcgdict>
diff --git a/Reconstruction/Jet/BoostedJetTaggers/CMakeLists.txt b/Reconstruction/Jet/BoostedJetTaggers/CMakeLists.txt
new file mode 100644
index 000000000000..b70403f2e74f
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/CMakeLists.txt
@@ -0,0 +1,92 @@
+################################################################################
+# Build configuration for BoostedJetTaggers
+################################################################################
+
+# Declare the name of the package:
+atlas_subdir( BoostedJetTaggers )
+
+# Extra dependencies, based on the environment:
+set( extra_libs )
+if( XAOD_STANDALONE )
+   set( extra_deps Control/xAODRootAccess )
+   set( extra_libs xAODRootAccess )
+else()
+   set( extra_deps PRIVATE GaudiKernel )
+endif()
+
+# External dependencies:
+find_package( FastJet )
+find_package( ROOT COMPONENTS Matrix TMVA )
+find_package( Boost )
+find_package( lwtnn )
+
+# Build a shared library:
+atlas_add_library( BoostedJetTaggersLib
+  BoostedJetTaggers/*.h
+  Root/JSSTaggerBase.cxx
+  Root/JetQGTagger.cxx
+  Root/JetQGTaggerBDT.cxx
+  Root/JSSWTopTaggerDNN.cxx
+  Root/JSSWTopTaggerANN.cxx
+  Root/SmoothedWZTagger.cxx
+   PUBLIC_HEADERS BoostedJetTaggers
+   INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS} ${LWTNN_INCLUDE_DIRS}
+   LINK_LIBRARIES ${Boost_LIBRARIES} ${ROOT_LIBRARIES} ${FASTJET_LIBRARIES}
+   ${LWTNN_LIBRARIES}
+   AsgTools 
+   xAODBase xAODJet xAODTruth xAODTracking JetInterface JetRecLib JetEDM JetSelectorToolsLib JetCalibToolsLib  JetUncertaintiesLib ParticleJetToolsLib PathResolver
+   MuonSelectorToolsLib MuonMomentumCorrectionsLib PATCoreLib PATInterfaces FlavorTagDiscriminants
+   JetAnalysisInterfacesLib InDetTrackSelectionToolLib InDetTrackSystematicsToolsLib 
+   MuonAnalysisInterfacesLib ${extra_libs} 
+   PRIVATE_LINK_LIBRARIES JetEDM )
+
+if( NOT XAOD_STANDALONE )
+   atlas_add_component( BoostedJetTaggers
+      src/components/*.cxx
+      LINK_LIBRARIES BoostedJetTaggersLib JetCalibToolsLib)
+endif()
+
+atlas_add_dictionary( BoostedJetTaggersDict
+   BoostedJetTaggers/BoostedJetTaggersDict.h
+   BoostedJetTaggers/selection.xml 
+   LINK_LIBRARIES BoostedJetTaggersLib )
+   
+# Executable(s) in the package:
+if( XAOD_STANDALONE )
+   atlas_add_executable( test_SmoothedWZTagger
+      util/test_SmoothedWZTagger.cxx
+      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} 
+      LINK_LIBRARIES ${ROOT_LIBRARIES} xAODRootAccess
+      xAODEventInfo xAODJet xAODTruth xAODCore PATInterfaces xAODCore AsgTools
+      BoostedJetTaggersLib
+   )   
+   atlas_add_executable( test_JetQGTagger
+      util/test_JetQGTagger.cxx
+      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} 
+      LINK_LIBRARIES ${ROOT_LIBRARIES} xAODRootAccess
+      xAODEventInfo xAODJet xAODCore PATInterfaces xAODCore AsgTools
+      BoostedJetTaggersLib
+   )
+   atlas_add_executable( test_JSSWTopTaggerDNN
+      util/test_JSSWTopTaggerDNN.cxx
+      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
+      LINK_LIBRARIES ${ROOT_LIBRARIES} xAODRootAccess
+      xAODEventInfo xAODJet xAODTruth xAODCore PATInterfaces xAODCore AsgTools
+      BoostedJetTaggersLib
+   )
+   atlas_add_executable( test_JSSWTopTaggerANN
+      util/test_JSSWTopTaggerANN.cxx
+      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
+      LINK_LIBRARIES ${ROOT_LIBRARIES} xAODRootAccess
+      xAODEventInfo xAODJet xAODTruth xAODCore PATInterfaces xAODCore AsgTools
+      BoostedJetTaggersLib
+   )
+   atlas_add_executable( test_JetQGTaggerBDT
+      util/test_JetQGTaggerBDT.cxx
+      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} 
+      LINK_LIBRARIES ${ROOT_LIBRARIES} xAODRootAccess
+      xAODEventInfo xAODJet xAODCore PATInterfaces xAODCore AsgTools
+      BoostedJetTaggersLib
+   )
+endif()
+
diff --git a/Reconstruction/Jet/BoostedJetTaggers/README.md b/Reconstruction/Jet/BoostedJetTaggers/README.md
new file mode 100644
index 000000000000..9927df88e9e6
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/README.md
@@ -0,0 +1,137 @@
+Boosted Jet Taggers
+===================
+
+This package contains the tagging code for boosted Top/W/Z/Higgs tagging
+
+
+How to add a tagger
+===================
+
+We assume you have access to `/cvmfs`
+
+Step 1: Set up a release
+------------------------
+
+First you should pick a relatively recent version of AnalysisBase. To
+see the versions, look here:
+
+```
+/cvmfs/atlas.cern.ch/repo/sw/software/21.2/AnalysisBase
+```
+
+You should probably pick the highest number.
+
+Next move to an empty directory and make a setup script. Something
+like this should work:
+
+```
+export ATLAS_LOCAL_ROOT_BASE=/cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase
+alias setupATLAS='source ${ATLAS_LOCAL_ROOT_BASE}/user/atlasLocalSetup.sh'
+
+setupATLAS
+asetup AnalysisBase,21.2.XX
+```
+
+where you can replace the `XX` on the last line with the most recent
+release you found above. I recommend putting this into a `setup.sh`
+script in the empty directory, so you can source it every time you log
+in.
+
+Once you have this, run `source setup.sh`.
+
+Step 2: Check out BoostedJetTaggers
+-----------------------------------
+
+We follow the "sparse checkout" instructions on the
+[Atlas docs][1]. Assuming you've already created your fork of Athena,
+you clone Athena and check out BoostedJetTaggers with
+
+```
+lsetup git
+git atlas init-workdir https://:@gitlab.cern.ch:8443/atlas/athena.git
+cd athena
+git checkout -t upstream/21.2
+git atlas addpkg BoostedJetTaggers
+```
+
+When this finishes you'll see `Reconstruction` in your local
+directory. The boosted taggers package is inside.
+
+[1]: https://atlassoftwaredocs.web.cern.ch/gittutorial/
+
+Step 3: Build
+-------------
+
+Go back to the top level directory (with your `setup.sh` script) and
+run the following
+
+```
+mkdir build
+cd build
+cmake ../athena/Projects/WorkDir/
+make -j 4
+```
+
+(Note that the `-j 4` argument in the last line is just to tell make
+to run 4 processes in parallel. If you have limited cores on your
+machine you can omit this.)
+
+Step 4: Run a test job
+----------------------
+
+You want to make sure something works before you start hacking
+away. To run a simple test job, you can use the built in unit tests
+before doing anything though, you need to set up the local
+environment:
+
+```
+source $AnalysisBase_PLATFORM/setup.sh
+```
+
+In general you have to do this every time you start working (after
+setting up the release).
+
+Now run
+
+```
+test_SmoothedWZTagger
+```
+
+it should start printing lines that indicate it's processing events.
+
+Step 5: Start a New Tagger
+--------------------------
+
+We recommend reading through one of the existing taggers to get an
+idea of how they work. There are a few caveats to keep in mind when
+creating one:
+
+ - You should add the `.cxx` file under the `atlas_add_library` list
+   in the `CMakeLists.txt` file. This will ensure that CMake doesn't
+   get confused when you change something.
+
+ - To ensure usability with ROOT (both inside and outside Athena),
+   you'll have to add your tagger to both `selection.xml` and
+   `BoostedJetTaggersDict.h`. Both of these files are in
+   `BoostedJetTaggers/BoostedJetTaggers/`.
+
+ - You'll also have to add your tagger under
+   `src/components/BoostedJetTaggers_entries.cxx`.
+
+ - If you have large configuration files that need to be read by your
+   tagger (BDT or NN weights, for example), you should store them in
+   [cvmfs][2]. To create these files you'll have to file a JIRA ticket
+   similar to this one: https://its.cern.ch/jira/browse/ATLINFR-1354
+
+We also encourage you to copy one of the `test_*` executables in
+`util` so that you can test your tagger before running it.
+
+Once you're reasonably happy with your tagger, you should create a
+[merge request][3] with the 21.2 branch. We encourage you to do this
+even if the tagger isn't completely final and to mark the request as
+"WIP" (work in progress) so that people can see and discuss your
+changes.
+
+
+[2]: http://atlas.web.cern.ch/Atlas/GROUPS/DATABASE/GroupData/BoostedJetTaggers/
+[3]: https://atlassoftwaredocs.web.cern.ch/gittutorial/merge-request/
diff --git a/Reconstruction/Jet/BoostedJetTaggers/README_SFprovider.md b/Reconstruction/Jet/BoostedJetTaggers/README_SFprovider.md
new file mode 100644
index 000000000000..5fc904f65ac6
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/README_SFprovider.md
@@ -0,0 +1,134 @@
+Tagging efficiency SF provider
+===================
+
+Tagging efficiency SF is decorated to the jet.
+[Note] Currently, development is ongoing only for DNN top tagger.
+
+
+Step 1: Decprate the truth labeling
+===================
+
+SF is provided according to the jet truth labels.
+Truth labels are defined as enum in BoostedJetTaggers/FatjetLabelEnum.h:
+```
+  enum TypeEnum
+  {
+    UNKNOWN=0, // Not tagged yet
+    tqqb,      // full-contained top->qqb
+    Wqq,       // full-contained W->qq
+    Zqq,       // full-contained Z->qq
+    Wqq_From_t,// full-contained W->qq (also mathced to top)
+    other_From_t, // matched to top
+    other_From_V, // matched to W/Z
+    notruth,   // failed to truth-jet matching (pileup)
+    qcd,       // not matched to top or W/Z (background jet)
+    Hbb,       // full-contained H->bb
+    other_From_H, // matched to Higgs
+  };  
+```
+
+I is decorated to the given jet as integer by decorateTruthLabel( ) function in BoostedJetTaggers/JSSTaggerBase.h, which is called inside the tag() function, with the following convention:
+```
+  inline int enumToInt(const TypeEnum type)
+  {
+    switch (type)
+      {
+      case tqqb:         return 1;
+      case Wqq:          return 2;
+      case Zqq:          return 3;
+      case Wqq_From_t:   return 4;
+      case other_From_t: return 5;
+      case other_From_V: return 6;
+      case notruth:      return 7;
+      case qcd:          return 8;
+      case Hbb:          return 9;
+      case other_From_H: return	10;
+      default:           return 0;
+      }
+  }  
+```
+* First of all, DecorateMatchedTruthJet( ) function, defined in BoostedJetTaggers/JSSTaggerBase.h, is called to decorate trimmed truth jet associated with the given jet by dR<0.75. The function automatically identifies the format of the truth particle container (TRUTH1 or TRUTH3).
+* If the matching to truth jet is failed, FatjetTruthLabel::notruth is docorated as the truth label.
+* Then getWTopContainment( ) function is called to decorate truth labeling according to the definitions below.
+
+Details of truth definitions
+-----------------------------------
+* FatjetTruthLabel::tqqb
+1. Associated trimmed truth jet is matched to truth top quark by dR<0.75
+2. GhostBHadronsFinalCount is greater than 0
+3. Trimmed truth jet mass satisfies 140 < mJ < 200GeV
+
+* FatjetTruthLabel::Wqq_From_t
+1. Associated trimmed truth jet is matched to both truth top and truth W boson by dR<0.75
+2. GhostBHadronsFinalCount is equal to 0
+3. Trimmed truth jet mass satisfies 50 < mJ < 100GeV
+
+* FatjetTruthLabel::Wqq
+1. Associated trimmed truth jet is matched to truth W boson by dR<0.75 but not matched to truth top
+2. GhostBHadronsFinalCount is equal to 0
+3. Trimmed truth jet mass satisfies 50 < mJ < 100GeV
+
+* FatjetTruthLabel::Zqq
+1. Associated trimmed truth jet is matched to truth Z boson by dR<0.75
+2. Trimmed truth jet mass satisfies 60 < mJ < 110GeV
+
+* FatjetTruthLabel::Hbb
+1. Associated trimmed truth jet is matched to truth H boson by dR<0.75
+2. GhostBHadronsFinalCount is greater than 1
+
+* FatjetTruthLabel::other_From_t
+If trimmed truth jet is matched to truth top quark but does not satisfy the additional requirements above, FatjetTruthLabel::other_From_t is decorated.
+
+* FatjetTruthLabel::other_From_V
+If trimmed truth jet is matched to truth W or Z but does not satisfy the additional requirements above, FatjetTruthLabel::other_From_V is decorated.
+
+* FatjetTruthLabel::other_From_H
+If trimmed truth jet is matched to truth Hbut does not satisfy the additional requirements above, FatjetTruthLabel::other_From_H is decorated.
+
+* FatjetTruthLabel::unknown
+All jets not satisfying the above are defined as FatjetTruthLabel::unknown.
+
+It is implemented in Root/JSSTaggerBase.cxx.
+
+
+Sherpa V+jets
+-----------------------------------
+Sherpa 2.2.1 V+jets samples do not contain the intermediate truth W/Z boson information in the TruthParticles container.
+We can look at the pair of truth particles with status==3, check the flavors of them, and reconstruct the mass of truth W/Z to define the truth W/Z boson.
+The function matchToWZ_Sherpa( ) is called only when the flag isSherpa is turned on. The flag is turned on based on dataset ID defined in getIsSherpa( ) function in BoostedJetTaggers/JSSTaggerBase.h.
+The DSID is needed to determine if the isSherpa flag should be switched on. This is done now automatically in the code and does not need to be provided anymore
+
+
+
+
+
+
+Step 2: Decorate the SF
+===================
+
+SF is decorated to the given jet according to the truth definitions above.
+getWeight( ) function is called inside the tag( ) function.
+
+SF values, as functions of jet pT and m/pT, are provided by TH2 histograms in ROOT file.
+Path of the ROOT file, as well as some parameters for SF provider, are specified in the config file of BoostedJetTaggers tool.
+An example is found in share/JSSWTopTaggingDNN/JSSDNNTagger_AntiKt10LCTopoTrimmed_TopQuarkContained_MC15c_20170824_BOOSTSetup80Eff.dat.
+
+
+
+
+Systematic uncertainties
+===================
+
+We plan to provide the systematic uncertainties using JetUncertainties tool.
+[Not ready yet]
+
+
+
+
+Test the tool
+===================
+To run the script to apply SF to tagged jets,
+```
+$ test_JSSWTopTaggerDNN -f your.test.DAOD.root
+```
+you can find output_JSSWTopTaggerDNN.root in your directory.
diff --git a/Reconstruction/Jet/BoostedJetTaggers/Root/JSSTaggerBase.cxx b/Reconstruction/Jet/BoostedJetTaggers/Root/JSSTaggerBase.cxx
new file mode 100644
index 000000000000..8c55ce8b6250
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/Root/JSSTaggerBase.cxx
@@ -0,0 +1,574 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "BoostedJetTaggers/JSSTaggerBase.h"
+
+#include "ParticleJetTools/LargeRJetLabelEnum.h"
+
+#include <TSystem.h>
+
+JSSTaggerBase::JSSTaggerBase(const std::string &name) :
+  asg::AsgTool(name),
+  m_calibArea(""),
+  m_jetPtMin(200000.),
+  m_jetPtMax(3000000.),
+  m_jetEtaMax(2.0),
+  m_strMassCutLow(""),
+  m_strMassCutHigh(""),
+  m_strScoreCut("")
+{
+
+  /// Tagger configuration properties
+  declareProperty( "ContainerName", m_containerName = "",     "Name of jet container" );
+  declareProperty( "ConfigFile",    m_configFile = "",        "Name of config file" );
+  declareProperty( "CalibArea",     m_calibArea = "",         "Path to config file" );
+  declareProperty( "CalcSF",        m_calcSF = false,         "Flag to calculate the efficiency SF"  );
+  declareProperty( "WorkingPoint",  m_wkpt = "",              "If specified, name of working point is added to the variable names" );
+  declareProperty( "TaggerType",    m_tagType = "XXX",        "Tagger type (e.g. SmoothedWZTagger, JSSWTopTaggerDNN, etc.)" );
+  declareProperty( "Decoration",    m_decorationName = "XX",  "Prefix for the variables decorated to xAOD::Jet" );
+  declareProperty( "IsMC",          m_isMC = true,            "Flag to identify data or MC" );
+
+  /// Jet kinematics properties
+  declareProperty( "JetEtaMax", m_jetEtaMax = 2.0, "Eta cut to define fiducial phase space for the tagger");
+
+  /// Truth labeling properties
+  declareProperty( "UseTRUTH3",                     m_truthLabelUseTRUTH3 = true,
+		   "Flag to use TRUTH3 containers. If false, TRUTH1 format is used." );
+  declareProperty( "TruthParticleContainerName",    m_truthParticleContainerName = "TruthParticles",
+		   "Name of truth-particle container (with UseTRUTH3=false). TruthParticles by default" );
+  declareProperty( "TruthBosonContainerName",       m_truthBosonContainerName = "TruthBosonsWithDecayParticles",
+		   "Name of truth-boson container (with UseTRUTH3=true). TruthBosonWithDecayParticles by default" );
+  declareProperty( "TruthTopQuarkContainerName",    m_truthTopQuarkContainerName = "TruthTopQuarkWithDecayParticles",
+		   "Name of truth-top container (with UseTRUTH3=true). TruthTopQuarkWithDecayParticles by default" );
+
+  /// Keras properties
+  declareProperty( "CalibAreaKeras",  m_kerasCalibArea = "BoostedJetTaggers/TopoclusterTopTagger/Boost2017/",
+		   "Path to json file to configure ML-taggers (Keras)" );
+  declareProperty( "KerasConfigFile", m_kerasConfigFileName = "XXX",
+		   "Name of json file to configure ML-taggers (Keras)" );
+  declareProperty( "KerasOutput",     m_kerasConfigOutputName = "XXX",
+		   "Name of output variable by the ML-tagger (Keras)" );
+
+  /// TMVA properties
+  declareProperty( "CalibAreaTMVA",  m_tmvaCalibArea = "BoostedJetTaggers/JSSWTopTaggerBDT/Boost2017/",
+		   "Path to xml file to configure ML-taggers (TMVA)" );
+  declareProperty( "TMVAConfigFile", m_tmvaConfigFileName = "XXX",
+		   "Name of xml file to configure ML-taggers (TMVA)" );
+
+  /// Tagging scale factors
+  declareProperty( "WeightDecorationName",      m_weightDecorationName = "SF",
+		   "Name of SF variable decorated to xAOD::Jet" );
+  declareProperty( "WeightFile",                m_weightFileName = "",
+		   "Name of config ROOT file for SF calculation" );
+  declareProperty( "WeightHistogramName",       m_weightHistogramName = "",
+		   "Name of SF histograms in the ROOT file" );
+  declareProperty( "EfficiencyHistogramName",   m_efficiencyHistogramName = "",
+		   "Name of efficiency histograms in the ROOT file" );
+  declareProperty( "WeightFlavors",             m_weightFlavors = "",
+		   "List of jet flavours for which the SF is available. Divided by comma" );
+}
+
+StatusCode JSSTaggerBase::initialize() {
+
+  /// Make sure jet container is set
+  if ( m_containerName.empty() ) {
+    ATH_MSG_ERROR( "ContainerName has not been set. Exiting" );
+    return StatusCode::FAILURE;
+  }
+
+  /// Initialize warning counters
+  m_nWarnKin = 0;
+  m_nWarnVar = 0;
+
+  /// Define common tagger states
+  m_acceptInfo.addCut( "ValidPtRangeHigh"  , "True if the jet is not too high pT" );
+  m_acceptInfo.addCut( "ValidPtRangeLow"   , "True if the jet is not too low pT" );
+  m_acceptInfo.addCut( "ValidEtaRange"     , "True if the jet is not too forward" );
+  
+  m_acceptInfo.addCut( "ValidJetContent"   , "True if the jet is alright technically (e.g. all attributes necessary for tag)" );
+  m_acceptInfo.addCut( "ValidEventContent" , "True if the event is alright technically (e.g. primary vertices)" );
+
+  /// Initialize decorators
+  ATH_MSG_INFO( "Decorators that will be attached to jet :" );
+
+  m_decTaggedKey = m_containerName + "." + m_decorationName + "_" + m_decTaggedKey.key();
+  m_decValidPtRangeHighKey = m_containerName + "." + m_decorationName + "_" + m_decValidPtRangeHighKey.key();
+  m_decValidPtRangeLowKey = m_containerName + "." + m_decorationName + "_" + m_decValidPtRangeLowKey.key();
+  m_decValidEtaRangeKey = m_containerName + "." + m_decorationName + "_" + m_decValidEtaRangeKey.key();
+  m_decValidJetContentKey = m_containerName + "." + m_decorationName + "_" + m_decValidJetContentKey.key();
+  m_decValidEventContentKey = m_containerName + "." + m_decorationName + "_" + m_decValidEventContentKey.key();
+
+  ATH_CHECK( m_decTaggedKey.initialize() );
+  ATH_CHECK( m_decValidPtRangeHighKey.initialize() );
+  ATH_CHECK( m_decValidPtRangeLowKey.initialize() );
+  ATH_CHECK( m_decValidEtaRangeKey.initialize() );
+  ATH_CHECK( m_decValidJetContentKey.initialize() );
+  ATH_CHECK( m_decValidEventContentKey.initialize() );
+
+  ATH_MSG_INFO( "  " << m_decTaggedKey.key() << " : pass tagging criteria" );
+  ATH_MSG_INFO( "  " << m_decValidPtRangeHighKey.key() << " : pass upper pt range" );
+  ATH_MSG_INFO( "  " << m_decValidPtRangeLowKey.key() << " : pass lower pt range" );
+  ATH_MSG_INFO( "  " << m_decValidEtaRangeKey.key() << " : pass eta range" );
+  ATH_MSG_INFO( "  " << m_decValidJetContentKey.key() << " : has valid jet content" );
+  ATH_MSG_INFO( "  " << m_decValidEventContentKey.key() << " : has valid event content" );
+
+  if ( m_useMassCut ) {
+
+    m_decPassMassKey = m_containerName + "." + m_decorationName + "_" + m_decPassMassKey.key();
+    m_decCutMLowKey = m_containerName + "." + m_decorationName + "_" + m_decCutMLowKey.key();
+    m_decCutMHighKey = m_containerName + "." + m_decorationName + "_" + m_decCutMHighKey.key();
+
+    ATH_CHECK( m_decPassMassKey.initialize() );
+    ATH_CHECK( m_decCutMLowKey.initialize() );
+    ATH_CHECK( m_decCutMHighKey.initialize() );
+
+    ATH_MSG_INFO( "  " << m_decPassMassKey.key() << " : pass mass cut" );
+    ATH_MSG_INFO( "  " << m_decCutMLowKey.key() << " : lower mass cut" );
+    ATH_MSG_INFO( "  " << m_decCutMHighKey.key() << " : upper mass cut" );
+
+  }
+
+  if ( m_useScoreCut ) {
+  
+    m_decPassScoreKey = m_containerName + "." + m_decorationName + "_" + m_decPassScoreKey.key();
+    m_decScoreCutKey = m_containerName + "." + m_decorationName + "_" + m_decScoreCutKey.key();
+    m_decScoreValueKey = m_containerName + "." + m_decorationName + "_" + m_decScoreValueKey.key();
+
+    ATH_CHECK( m_decPassScoreKey.initialize() );
+    ATH_CHECK( m_decScoreCutKey.initialize() );
+    ATH_CHECK( m_decScoreValueKey.initialize() );
+
+    ATH_MSG_INFO( "  " << m_decPassScoreKey.key() << " : pass MVA score cut" );
+    ATH_MSG_INFO( "  " << m_decScoreCutKey.key() << " : MVA score cut" );
+    ATH_MSG_INFO( "  " << m_decScoreValueKey.key() << " : evaluated MVA score" );
+
+  }
+
+  if ( m_calcSF ) {
+  
+    m_decWeightKey = m_containerName + "." + m_decorationName + "_" + m_weightDecorationName;
+    m_decEfficiencyKey = m_containerName + "." + m_decorationName + "_" + m_decEfficiencyKey.key();
+    m_decEffSFKey = m_containerName + "." +m_decorationName + "_" + m_decEffSFKey.key();
+    
+    ATH_CHECK( m_decWeightKey.initialize() );
+    ATH_CHECK( m_decEfficiencyKey.initialize() );
+    ATH_CHECK( m_decEffSFKey.initialize() );
+    
+    ATH_MSG_INFO( "  " << m_decWeightKey.key() << " : tagging SF" );
+   
+    m_readTruthLabelKey = m_containerName + "." + m_truthLabelName;
+    ATH_CHECK( m_readTruthLabelKey.initialize() );
+  
+  }
+
+  /// Initialize SFs if they are needed
+  if ( m_calcSF ) {
+
+    /// Get weight config file
+    m_weightConfig = std::make_unique<TFile>( m_weightConfigPath.c_str() );
+    if( !m_weightConfig ) {
+      ATH_MSG_ERROR( "SmoothedWZTagger: Error openning config file : " << m_weightConfigPath );
+      return StatusCode::FAILURE;
+    }
+
+    /// Install histograms for tagging SFs
+    std::stringstream ss{m_weightFlavors};
+    std::string flavor;
+    while ( std::getline(ss, flavor, ',') ) {
+      m_weightHistograms.insert( std::make_pair( flavor, (TH2D*)m_weightConfig->Get((m_weightHistogramName+"_"+flavor).c_str()) ) );
+      if ( !m_efficiencyHistogramName.empty() ) {
+        m_efficiencyHistograms.insert( std::make_pair( flavor, (TH2D*)m_weightConfig->Get((m_efficiencyHistogramName+"_"+flavor).c_str()) ) );
+      }
+      ATH_MSG_INFO( "Tagging SF histogram for " << flavor << " is installed." );
+    }
+
+  }
+
+  return StatusCode::SUCCESS;
+
+}
+
+/// Loop over jet collection and decorate each jet
+StatusCode JSSTaggerBase::decorate( const xAOD::JetContainer& jets ) const {
+
+  for ( auto jet : jets ) {
+    ATH_CHECK( tag(*jet) );
+  }
+
+  return StatusCode::SUCCESS;
+
+}
+
+/// Get configReader TEnv
+StatusCode JSSTaggerBase::getConfigReader() {
+
+  ATH_MSG_INFO( "Using config file : " << m_configFile );
+
+  /// Check for the existence of the configuration file
+  std::string configPath;
+
+  if ( m_calibArea.compare("Local") == 0 ) {
+    configPath = PathResolverFindCalibFile(("$WorkDir_DIR/data/BoostedJetTaggers/"+m_configFile).c_str());
+  }
+  else if ( m_calibArea.find("eos") != std::string::npos) {
+    configPath = PathResolverFindCalibFile((m_calibArea+"/"+m_configFile).c_str());
+  }
+  else {
+    configPath = PathResolverFindCalibFile(("BoostedJetTaggers/"+m_calibArea+"/"+m_configFile).c_str());
+  }
+
+  /// https://root.cern.ch/root/roottalk/roottalk02/5332.html
+  FileStat_t fStats;
+  int fSuccess = gSystem->GetPathInfo(configPath.c_str(), fStats);
+  if ( fSuccess ) {
+    ATH_MSG_ERROR( "Recommendations file " << m_configFile << " could not be found" );
+    return StatusCode::FAILURE;
+  }
+  else {
+    ATH_MSG_DEBUG( "Recommendations file was found : " << configPath );
+  }
+
+  if ( m_configReader.ReadFile( configPath.c_str(), EEnvLevel(0) ) ) {
+    ATH_MSG_ERROR( "Error while reading config file : "<< configPath );
+    return StatusCode::FAILURE;
+  }
+
+  return StatusCode::SUCCESS;
+
+}
+
+/// Reset cuts
+StatusCode JSSTaggerBase::resetCuts( asg::AcceptData &acceptData ) const {
+
+  /// Reset the AcceptData cut results to false
+  acceptData.clear();
+
+  /// Initialize common cuts to true by default
+  acceptData.setCutResult( "ValidJetContent", true );
+  acceptData.setCutResult( "ValidEventContent", true );
+  
+  acceptData.setCutResult( "ValidPtRangeHigh", true );
+  acceptData.setCutResult( "ValidPtRangeLow" , true );
+  acceptData.setCutResult( "ValidEtaRange"   , true );
+
+  return StatusCode::SUCCESS;
+
+}
+
+/// Check if jet passes kinematic constraints
+bool JSSTaggerBase::passKinRange( const xAOD::Jet &jet ) const {
+
+  float scale = 1.0;
+  if ( m_ptGeV ) scale = 1.e3;
+
+  if ( jet.pt() < m_jetPtMin * scale ) return false;
+  if ( jet.pt() > m_jetPtMax * scale ) return false;
+  if ( std::abs( jet.eta() ) > m_jetEtaMax ) return false;
+
+  return true;
+
+}
+
+/// Check and record if jet passes kinematic constraints
+StatusCode JSSTaggerBase::checkKinRange( const xAOD::Jet &jet, asg::AcceptData &acceptData ) const {
+
+  float scale = 1.0;
+  if ( m_ptGeV ) scale = 1.e3;
+
+  /// Check each kinematic constraint
+  /// Print warnings using counters
+  if ( std::abs(jet.eta()) > m_jetEtaMax ) {
+    if ( m_nWarnKin++ < m_nWarnMax ) ATH_MSG_WARNING( "Jet does not pass basic kinematic selection (|eta| < " << m_jetEtaMax << "). Jet eta = " << jet.eta() );
+    else ATH_MSG_DEBUG( "Jet does not pass basic kinematic selection (|eta| < " << m_jetEtaMax << "). Jet eta = " << jet.eta() );
+    acceptData.setCutResult( "ValidEtaRange", false );
+  }
+
+  if ( jet.pt() < m_jetPtMin * scale ) {
+    if ( m_nWarnKin++ < m_nWarnMax ) ATH_MSG_WARNING("Jet does not pass basic kinematic selection (pT > " << m_jetPtMin * scale / 1.e3 << "). Jet pT = " << jet.pt() / 1.e3 << " GeV" );
+    else ATH_MSG_DEBUG( "Jet does not pass basic kinematic selection (pT > " << m_jetPtMin * scale / 1.e3 << "). Jet pT = " << jet.pt() / 1.e3 << " GeV" );
+    acceptData.setCutResult( "ValidPtRangeLow", false );
+  }
+
+  if ( jet.pt() > m_jetPtMax * scale ) {
+    if( m_nWarnKin++ < m_nWarnMax ) ATH_MSG_WARNING( "Jet does not pass basic kinematic selection (pT < " << m_jetPtMax * scale / 1.e3 << "). Jet pT = " << jet.pt() / 1.e3 << " GeV" );
+    else ATH_MSG_DEBUG( "Jet does not pass basic kinematic selection (pT < " << m_jetPtMax * scale / 1.e3 << "). Jet pT = " << jet.pt() / 1.e3 << " GeV" );
+    acceptData.setCutResult( "ValidPtRangeHigh", false );
+  }
+
+  /// Create write decor handles
+  SG::WriteDecorHandle<xAOD::JetContainer, bool> decValidPtRangeHigh(m_decValidPtRangeHighKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, bool> decValidPtRangeLow(m_decValidPtRangeLowKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, bool> decValidEtaRange(m_decValidEtaRangeKey);
+ 
+  /// Decorate kinematic pass information
+  decValidPtRangeHigh(jet) = acceptData.getCutResult( "ValidPtRangeHigh" );
+  decValidPtRangeLow(jet) = acceptData.getCutResult( "ValidPtRangeLow" );
+  decValidEtaRange(jet) = acceptData.getCutResult( "ValidEtaRange" );
+
+  return StatusCode::SUCCESS;
+
+}
+
+/// Calculate JSS moment ratios in case they are not already saved
+/// These are calculated by hand here because JetSubStructureMomentTools
+/// does not operate on const jets. This should be changed in the future
+int JSSTaggerBase::calculateJSSRatios( const xAOD::Jet &jet ) const {
+
+  int result = 0;
+
+  /// Create write decor handles
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decTau21WTA(m_decTau21WTAKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decTau32WTA(m_decTau32WTAKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decC2(m_decC2Key);
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decD2(m_decD2Key);
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decE3(m_decE3Key);
+
+  /// Create read decor handles
+  SG::ReadDecorHandle<xAOD::JetContainer, float> readTau1WTA(m_readTau1WTAKey);
+  SG::ReadDecorHandle<xAOD::JetContainer, float> readTau2WTA(m_readTau2WTAKey);
+  SG::ReadDecorHandle<xAOD::JetContainer, float> readTau3WTA(m_readTau3WTAKey);
+  
+  SG::ReadDecorHandle<xAOD::JetContainer, float> readECF1(m_readECF1Key);
+  SG::ReadDecorHandle<xAOD::JetContainer, float> readECF2(m_readECF2Key);
+  SG::ReadDecorHandle<xAOD::JetContainer, float> readECF3(m_readECF3Key);
+
+  /// WTA N-subjettiness ratios
+  float tau21_wta = -999.0;
+  float tau32_wta = -999.0;
+
+  float tau1_wta = readTau1WTA(jet);
+  float tau2_wta = readTau2WTA(jet);
+  float tau3_wta = readTau3WTA(jet);
+
+  if ( tau1_wta > 1e-8 ) {
+    tau21_wta = tau2_wta / tau1_wta;
+  }
+  else result = 1;
+
+  if ( tau2_wta > 1e-8 ) {
+    tau32_wta = tau3_wta / tau2_wta;
+  }
+  else result = 1;
+
+  decTau21WTA(jet) = tau21_wta;
+  decTau32WTA(jet) = tau32_wta;
+
+  /// ECF ratios
+  float C2 = -999.0;
+  float D2 = -999.0;
+  float e3 = -999.0;
+  
+  float ECF1 = readECF1(jet);
+  float ECF2 = readECF2(jet);
+  float ECF3 = readECF3(jet);
+
+  if ( ECF2 > 1e-8 ) {
+    C2 = ECF3 * ECF1 / std::pow( ECF2, 2.0 );
+    D2 = ECF3 * std::pow( ECF1, 3.0 ) / std::pow( ECF2, 3.0 );
+  }
+  else result = 1;
+
+  e3 = ECF3 / std::pow( ECF1, 3.0 );
+  
+  decC2(jet) = C2;
+  decD2(jet) = D2;
+  decE3(jet) = e3;
+
+  // TODO: Add L-series for UFO taggers
+  // TODO: Add ECFG for ANN tagger whenever it is defined
+
+  return result;
+
+}
+
+/// Get SF weight
+StatusCode JSSTaggerBase::getWeight( const xAOD::Jet& jet, bool passSel, asg::AcceptData &acceptData ) const {
+
+  if ( !m_calcSF ) return StatusCode::SUCCESS;
+
+  float weight = 1.0;
+  float effSF = 1.0;
+  float efficiency = 1.0;
+
+  if ( m_isMC ) {
+
+    std::tie(effSF, efficiency) = getSF( jet, acceptData );
+
+    /// Inefficiency SF is directly used
+    if ( m_weightFlavors.find("fail") != std::string::npos ) {
+      weight = effSF;
+    }
+
+    else {
+
+      /// Efficiency SF
+      if ( passSel ) {
+        weight = effSF;
+      }
+
+      /// Calculate inefficiency SF
+      else {
+        /// If inefficiency SF is not available, SF is always 1.0
+        if ( m_efficiencyHistogramName.empty() ) {
+          weight = 1.0;
+        }
+        else if ( efficiency < 1.0 ) {
+          weight = ( 1. - effSF * efficiency ) / ( 1. - efficiency );
+        }
+        else {
+          weight = 1.0;
+        }
+      }
+    }
+
+  }
+
+  else {
+    weight = 1.0;
+  }
+
+  /// Create write decor handles
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decWeight(m_decWeightKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decEfficiency(m_decEfficiencyKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decEffSF(m_decEffSFKey);
+
+  /// Decorate values  
+  decWeight(jet) = weight;
+  decEfficiency(jet) = efficiency;
+  decEffSF(jet) = effSF;
+
+  return StatusCode::SUCCESS;
+
+}
+
+/// Get scale factor and efficiency
+std::pair<double, double> JSSTaggerBase::getSF( const xAOD::Jet& jet, asg::AcceptData &acceptData ) const {
+
+  if ( !passKinRange(jet) ) return std::make_pair( 1.0, 1.0 );
+
+  /// Truth label string
+  std::string truthLabelStr;
+
+  /// Truth label value
+  SG::ReadDecorHandle<xAOD::JetContainer, float> readTruthLabel(m_readTruthLabelKey);
+  LargeRJetTruthLabel::TypeEnum jetContainment = LargeRJetTruthLabel::intToEnum(readTruthLabel(jet));
+
+  /// Contained top tagger
+  if ( m_weightHistograms.count("t_qqb") ) {
+
+    /// Contained top
+    if ( jetContainment==LargeRJetTruthLabel::tqqb ) {
+      truthLabelStr = "t_qqb";
+    }
+    /// QCD
+    else if ( jetContainment==LargeRJetTruthLabel::notruth || jetContainment==LargeRJetTruthLabel::qcd ) {
+      truthLabelStr = "q";
+    }
+
+  }
+  /// TCC W/Z 2-var tagger
+  else if ( m_weightHistograms.count("V_qq_passMpassD2") ) {
+
+    /// Top
+    if ( jetContainment==LargeRJetTruthLabel::tqqb || jetContainment==LargeRJetTruthLabel::other_From_t ) {
+      truthLabelStr = "t_";
+    }
+    /// W/Z
+    else if ( jetContainment==LargeRJetTruthLabel::Wqq || jetContainment==LargeRJetTruthLabel::Zqq || jetContainment==LargeRJetTruthLabel::Wqq_From_t ) {
+      truthLabelStr = "V_qq_";
+    }
+    /// QCD
+    else if ( jetContainment==LargeRJetTruthLabel::notruth || jetContainment==LargeRJetTruthLabel::qcd ) {
+      truthLabelStr = "q_";
+    }
+
+    /// Pass mass and D2
+    if ( acceptData.getCutResult("PassMassLow") && acceptData.getCutResult("PassMassHigh") && acceptData.getCutResult("PassD2") ) {
+      truthLabelStr += "passMpassD2";
+    }
+    /// Fail mass, pass D2
+    else if ( !(acceptData.getCutResult("PassMassLow") && acceptData.getCutResult("PassMassHigh")) && acceptData.getCutResult("PassD2") ) {
+      truthLabelStr += "failMpassD2";
+    }
+    /// Pass mass, fail D2
+    else if ( acceptData.getCutResult("PassMassLow") && acceptData.getCutResult("PassMassHigh") && !acceptData.getCutResult("PassD2") ) {
+      truthLabelStr += "passMfailD2";
+    }
+    /// Fail mass and D2
+    else{
+      truthLabelStr += "failMfailD2";
+    }
+
+  }
+
+  /// W/Z or inclusive top tagger
+  else {
+
+    /// Top
+    if ( jetContainment==LargeRJetTruthLabel::tqqb || jetContainment==LargeRJetTruthLabel::other_From_t ) {
+      truthLabelStr = "t";
+    }
+    /// W/Z
+    else if ( jetContainment==LargeRJetTruthLabel::Wqq || jetContainment==LargeRJetTruthLabel::Zqq || jetContainment==LargeRJetTruthLabel::Wqq_From_t ) {
+      truthLabelStr = "V_qq";
+    }
+    /// QCD
+    else if ( jetContainment==LargeRJetTruthLabel::notruth || jetContainment==LargeRJetTruthLabel::qcd ) {
+      truthLabelStr = "q";
+    }
+
+  }
+
+  double logmOverPt = std::log(jet.m()/jet.pt());
+  if ( m_decorationName.find("SmoothZ") != std::string::npos ) {
+    /// To apply W-tagging efficiency SF to Z-tagger, jet mass is shifted by 10.803 GeV
+    const double WtoZmassShift = 10803;
+    logmOverPt = std::log((jet.m()-WtoZmassShift)/jet.pt());
+  }
+
+  if ( logmOverPt > 0 ) logmOverPt = 0;
+
+  double SF = 1.0;
+  double eff = 1.0;
+
+  if ( m_weightHistograms.count(truthLabelStr.c_str()) ) {
+
+    int pt_mPt_bin = (m_weightHistograms.find(truthLabelStr.c_str())->second)->FindBin(jet.pt()*0.001, logmOverPt);
+    SF = (m_weightHistograms.find(truthLabelStr.c_str())->second)->GetBinContent(pt_mPt_bin);
+
+    if ( !m_efficiencyHistogramName.empty() ) {
+      eff = (m_efficiencyHistograms.find(truthLabelStr.c_str())->second)->GetBinContent(pt_mPt_bin);
+    }
+
+  }
+  else {
+    ATH_MSG_DEBUG( "SF for truth label for " << truthLabelStr << " is not available. Returning 1.0" );
+    return std::make_pair( 1.0, 1.0 );
+  }
+
+  if ( SF < 1e-3 ) {
+    ATH_MSG_DEBUG( "(pt, m/pt) (" << jet.pt()/1.e3 << ", " << jet.m()/jet.pt() << ") is out of range for SF calculation. Returning 1.0" );
+    return std::make_pair( 1.0, 1.0 );
+  }
+  else {
+    return std::make_pair( SF, eff );
+  }
+
+}
+
+/// Print configured cuts
+void JSSTaggerBase::printCuts() const {
+  ATH_MSG_INFO( "After tagging, you will have access to the following cuts as an asg::AcceptData : (<NCut>) <cut> : <description>)" );
+  int nCuts = m_acceptInfo.getNCuts();
+  for ( int iCut=0; iCut < nCuts; iCut++ ) {
+    std::string cut_string = "";
+    cut_string += "  (";
+    cut_string += std::to_string(iCut);
+    cut_string += ")  ";
+    cut_string += m_acceptInfo.getCutName(iCut).data();
+    cut_string += " : ";
+    cut_string += m_acceptInfo.getCutDescription(iCut).data();
+    ATH_MSG_INFO( cut_string );
+  }
+}
diff --git a/Reconstruction/Jet/BoostedJetTaggers/Root/JSSWTopTaggerANN.cxx b/Reconstruction/Jet/BoostedJetTaggers/Root/JSSWTopTaggerANN.cxx
new file mode 100644
index 000000000000..66785276ca0b
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/Root/JSSWTopTaggerANN.cxx
@@ -0,0 +1,415 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "BoostedJetTaggers/JSSWTopTaggerANN.h"
+
+#include <fstream>
+
+JSSWTopTaggerANN::JSSWTopTaggerANN( const std::string& name ) :
+  JSSTaggerBase( name ),
+  m_lwnn(nullptr)
+{
+
+}
+
+/// Initialize the tagger
+StatusCode JSSWTopTaggerANN::initialize() {
+
+  ATH_MSG_INFO( "Initializing JSSWTopTaggerANN tool" );
+
+  /// Pt values are defined in GeV
+  m_ptGeV = true;
+
+  /// Use mass cut
+  m_useMassCut = true;
+
+  /// Use discriminant score cut
+  m_useScoreCut = true;
+
+  if( ! m_configFile.empty() ) {
+
+    /// Get configReader
+    ATH_CHECK( getConfigReader() );
+
+    /// Get tagger type
+    m_tagType = m_configReader.GetValue("TaggerType" ,"");
+
+    /// Get the CVMFS calib area where stuff is stored
+    /// If this is set to "Local" then it will look for the config file in the share space
+    m_kerasCalibArea = m_configReader.GetValue("CalibAreaKeras" ,"");
+
+    /// Get the name/path of the JSON config
+    m_kerasConfigFileName = m_configReader.GetValue("KerasConfigFile" ,"");
+
+    /// Get the name of the Keras output node
+    m_kerasConfigOutputName = m_configReader.GetValue("KerasOutput" ,"");
+
+    /// Get min and max jet mass. The unit is GeV now. Need to be consistent with ATLAS convention in the future
+    m_strMassCutLow  = m_configReader.GetValue("MassCutLow_in_GeV" ,"");
+    m_strMassCutHigh = m_configReader.GetValue("MassCutHigh_in_GeV" ,"");
+
+    /// Get min and max jet pt. The unit is GeV now. Need to be consistent with ATLAS convention in the future
+    m_jetPtMin = m_configReader.GetValue("pTCutLow_in_GeV", 200.0);
+    m_jetPtMax = m_configReader.GetValue("pTCutHigh_in_GeV", 2000.0);
+
+    /// Get cut for ANN score
+    m_strScoreCut = m_configReader.GetValue("ScoreCut" ,"");
+
+    /// Get the decoration name
+    m_decorationName = m_configReader.GetValue("DecorationName" ,"");
+
+    /// Get the scale factor configuration
+    m_calcSF = m_configReader.GetValue("CalcSF", false);
+    if ( m_calcSF ) {
+      m_weightDecorationName = m_configReader.GetValue("WeightDecorationName", "");
+      m_weightFileName = m_configReader.GetValue("WeightFile", "");
+      m_weightHistogramName = m_configReader.GetValue("WeightHistogramName", "");
+      m_efficiencyHistogramName = m_configReader.GetValue("EfficiencyHistogramName", "");
+      m_weightFlavors = m_configReader.GetValue("WeightFlavors", "");
+
+      /// Get truth label name information
+      m_truthLabelName = m_configReader.GetValue("TruthLabelName" , "R10TruthLabel_R21Consolidated");
+    }
+
+    /// Print out the configuration parameters for viewing
+    ATH_MSG_INFO( "Configurations Loaded :");
+    ATH_MSG_INFO( "tagType               : " << m_tagType );
+    ATH_MSG_INFO( "calibarea_keras       : " << m_kerasCalibArea );
+    ATH_MSG_INFO( "kerasConfigFileName   : " << m_kerasConfigFileName );
+    ATH_MSG_INFO( "kerasConfigOutputName : " << m_kerasConfigOutputName );
+    ATH_MSG_INFO( "strMassCutLow         : " << m_strMassCutLow );
+    ATH_MSG_INFO( "strMassCutHigh        : " << m_strMassCutHigh );
+    ATH_MSG_INFO( "pTCutLow              : " << m_jetPtMin );
+    ATH_MSG_INFO( "pTCutHigh             : " << m_jetPtMax );
+    ATH_MSG_INFO( "strScoreCut           : " << m_strScoreCut );
+    ATH_MSG_INFO( "decorationName        : " << m_decorationName );
+    if ( m_calcSF ) {
+      ATH_MSG_INFO( "weightDecorationName  : " << m_weightDecorationName );
+      ATH_MSG_INFO( "weightFile            : " << m_weightFileName );
+      ATH_MSG_INFO( "weightHistogramName   : " << m_weightHistogramName );
+      ATH_MSG_INFO( "efficiencyHistogramName : "<<m_efficiencyHistogramName );
+      ATH_MSG_INFO( "weightFlavors         : " << m_weightFlavors );
+      ATH_MSG_INFO( "TruthLabelName        : " << m_truthLabelName );
+    }
+  }
+  else { /// No config file
+    /// Assume the cut functions have been set through properties.
+    /// Check they are non empty
+    if ( (m_kerasConfigFileName.empty() ||
+          m_kerasConfigOutputName.empty() ||
+          m_strScoreCut.empty() ||
+          m_strMassCutLow.empty() ||
+          m_strMassCutHigh.empty() ||
+          m_decorationName.empty() || 
+          m_weightFileName.empty()) ||
+        ((m_weightDecorationName.empty() ||
+          m_weightHistogramName.empty() ||
+          m_weightFlavors.empty()) && m_calcSF) ) {
+      ATH_MSG_ERROR( "No config file provided OR you haven't manually specified all needed parameters" ) ;
+      ATH_MSG_ERROR( "Please read the TWiki for this tool" );
+      return StatusCode::FAILURE;
+    }
+
+  }
+
+  ATH_MSG_INFO( "Mass cut low   : " << m_strMassCutLow );
+  ATH_MSG_INFO( "Mass cut High  : " << m_strMassCutHigh );
+  ATH_MSG_INFO( "Score cut low  : " << m_strScoreCut );
+
+  /// If the calibarea is specified to be "Local" then it looks in the same place as the top level configs
+  if ( m_kerasCalibArea.empty() ) {
+    ATH_MSG_ERROR( "You need to specify where the calibarea is as either being Local or on CVMFS" );
+    return StatusCode::FAILURE;
+  }
+  else if( !m_kerasCalibArea.compare("Local") ) {
+    std::string localCalibArea = "BoostedJetTaggers/JSSWTopTaggerANN/";
+    ATH_MSG_INFO( "Using Local calibarea " << localCalibArea );
+    /// Convert the JSON config file name to the full path
+    m_kerasConfigFilePath = PathResolverFindCalibFile(localCalibArea+m_kerasConfigFileName);
+    if ( m_calcSF )
+      m_weightConfigPath = PathResolverFindCalibFile(localCalibArea+m_weightFileName);
+  }
+  else {
+    ATH_MSG_INFO( "Using CVMFS calibarea" );
+    /// Get the config file from CVMFS
+    /// Necessary because xml files are too large to house on the data space
+    m_kerasConfigFilePath = PathResolverFindCalibFile( (m_kerasCalibArea+m_kerasConfigFileName).c_str() );
+    if ( m_calcSF )
+      m_weightConfigPath = PathResolverFindCalibFile( (m_kerasCalibArea+m_weightFileName).c_str());
+  }
+
+  /// Read json file for ANN weights
+  ATH_MSG_INFO( "ANN Tagger configured with: " << m_kerasConfigFilePath );
+
+  std::ifstream input_cfg( m_kerasConfigFilePath.c_str() );
+
+  if ( !input_cfg.is_open() ) {
+    ATH_MSG_ERROR( "Error openning config file: " << m_kerasConfigFilePath );
+    ATH_MSG_ERROR( "Are you sure that the file exists at this path?" );
+    return StatusCode::FAILURE;
+  }
+
+  lwt::GraphConfig config = lwt::parse_json_graph( input_cfg );
+
+  for ( auto& input_node: config.inputs ) {
+    ATH_MSG_INFO( " input node: " << input_node.name );
+    for ( auto& input: input_node.variables ) {
+      ATH_MSG_INFO( "  " << input );
+    }
+  }
+
+  auto output_node_name = config.outputs.begin()->first;
+  m_out_names = config.outputs.at(output_node_name).labels;
+
+  ATH_MSG_INFO( "Keras Network NLayers: " << config.layers.size() );
+
+  m_lwnn = std::make_unique< lwt::LightweightGraph >(config, output_node_name);
+
+  /// Build the network
+  try {
+    m_lwnn.reset(new lwt::LightweightGraph(config, output_node_name));
+  } catch (lwt::NNConfigurationException& exc) {
+    ATH_MSG_ERROR( "NN configuration problem: " << exc.what() );
+    return StatusCode::FAILURE;
+  }
+
+  /// Set internal tagger type
+  if ( !m_tagType.compare("TopQuark") ) {
+    ATH_MSG_DEBUG( "This is a top quark tagger" );
+    m_tagClass = TAGCLASS::TopQuark;
+  }
+  else if ( !m_tagType.compare("WBoson") ) {
+    ATH_MSG_DEBUG( "This is a W boson tagger" );
+    m_tagClass = TAGCLASS::WBoson;
+  }
+  else if ( !m_tagType.compare("ZBoson") ) {
+    ATH_MSG_DEBUG( "This is a Z boson tagger" );
+    m_tagClass = TAGCLASS::ZBoson;
+  }
+  else {
+    ATH_MSG_ERROR( "I can't tell what kind of tagger your configuration is for." );
+    return StatusCode::FAILURE;
+  }
+
+  /// Set the possible states that the tagger can be left in after the JSSTaggerBase::tag() function is called
+  m_acceptInfo.addCut( "PassMassLow" , "mJet > mCutLow" );
+  m_acceptInfo.addCut( "PassScore"   , "ScoreJet > ScoreCut" );
+  if ( m_tagClass == TAGCLASS::WBoson || m_tagClass == TAGCLASS::ZBoson ) {
+    m_acceptInfo.addCut( "PassMassHigh", "mJet < mCutHigh" );
+  }
+
+  /// Loop over and print out the cuts that have been configured
+  printCuts();
+
+  /// Call base class initialize
+  ATH_CHECK( JSSTaggerBase::initialize() );
+
+  ATH_MSG_INFO( "ANN Tagger tool initialized" );
+
+  return StatusCode::SUCCESS;
+
+}
+
+StatusCode JSSWTopTaggerANN::tag( const xAOD::Jet& jet ) const {
+
+  ATH_MSG_DEBUG( "Obtaining ANN result" );
+
+  /// Create asg::AcceptData object
+  asg::AcceptData acceptData( &m_acceptInfo );
+
+  /// Reset the AcceptData cut results
+  ATH_CHECK( resetCuts( acceptData ) );
+
+  /// Check basic kinematic selection
+  ATH_CHECK( checkKinRange( jet, acceptData ) );
+
+  /// Get the relevant attributes of the jet
+  /// Mass and pt - note that this will depend on the configuration of the calibration used
+  float jet_pt   = jet.pt()/1000.0;
+  float jet_mass = jet.m()/1000.0;
+
+  /// Get ANN score for the jet
+  float jet_score = getScore(jet);
+
+  /// Evaluate the values of the upper and lower mass bounds and the d2 cut
+  float cut_mass_low  = m_funcMassCutLow ->Eval(jet_pt);
+  float cut_mass_high = m_funcMassCutHigh->Eval(jet_pt);
+  float cut_score     = m_funcScoreCut   ->Eval(jet_pt);
+
+  /// Print cut criteria and jet values
+  ATH_MSG_VERBOSE( "Cut values : Mass window = [" << cut_mass_low << "," << cut_mass_high << "], score cut = " << cut_score );
+  ATH_MSG_VERBOSE( "Jet values : Mass = " << jet_mass << ", score = " << jet_score );
+
+  /// Get SF weight
+  ATH_CHECK( getWeight( jet, jet_score > cut_score, acceptData ) );
+
+  /// Decorate cut information if needed
+  ATH_MSG_DEBUG( "Decorating with score" );
+
+  /// Create WriteDecorHandles
+  SG::WriteDecorHandle<xAOD::JetContainer, bool> decPassMass(m_decPassMassKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, bool> decPassScore(m_decPassScoreKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, bool> decTagged(m_decTaggedKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decCutMLow(m_decCutMLowKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decCutMHigh(m_decCutMHighKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decScoreCut(m_decScoreCutKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decScoreValue(m_decScoreValueKey);
+
+  /// Decorate values
+  decCutMLow(jet) = cut_mass_low;
+  decCutMHigh(jet) = cut_mass_high;
+  decScoreCut(jet) = cut_score;
+  decScoreValue(jet) = jet_score;
+
+  /// Cut summary
+  bool passCuts = true;
+
+  /// Set the AcceptData depending on whether it is a W/Z or a top tagger
+  if ( m_tagClass == TAGCLASS::WBoson || m_tagClass == TAGCLASS::ZBoson ) {
+    ATH_MSG_VERBOSE( "Determining WZ tag return" );
+    if ( jet_mass > cut_mass_low ) acceptData.setCutResult( "PassMassLow", true );
+    if ( jet_mass < cut_mass_high ) acceptData.setCutResult( "PassMassHigh", true );
+    if ( jet_score > cut_score ) acceptData.setCutResult( "PassScore", true );
+    decPassMass(jet) = acceptData.getCutResult( "PassMassLow" ) && acceptData.getCutResult( "PassMassHigh" );
+    passCuts = passCuts && acceptData.getCutResult( "PassMassLow" ) && acceptData.getCutResult( "PassMassHigh" );
+  }
+  else if ( m_tagClass == TAGCLASS::TopQuark ) {
+    ATH_MSG_VERBOSE( "Determining TopQuark tag return" );
+    if( jet_mass > cut_mass_low ) acceptData.setCutResult( "PassMassLow", true );
+    if( jet_score > cut_score ) acceptData.setCutResult( "PassScore", true );
+    decPassMass(jet) = acceptData.getCutResult( "PassMassLow" );
+    passCuts = passCuts && acceptData.getCutResult( "PassMassLow" );
+  }
+
+  decPassScore(jet) = acceptData.getCutResult( "PassScore" );
+
+  passCuts = passCuts && acceptData.getCutResult( "PassScore" );
+
+  decTagged(jet) = passCuts;
+
+  return StatusCode::SUCCESS;
+
+}
+
+double JSSWTopTaggerANN::getScore( const xAOD::Jet& jet ) const {
+
+    /// Create input dictionary map<string,double> for argument to lwtnn
+    std::map<std::string, std::map<std::string,double>> ANN_inputs = getJetProperties(jet);
+
+    /// Evaluate the network response
+    auto discriminant = m_lwnn->compute(ANN_inputs);
+
+    /// Obtain the output associated with the single output node
+    double ANNscore = -666.;
+
+    /// Check that input variables are valid
+    bool validVars = true;
+    SG::ReadDecorHandle<xAOD::JetContainer, float> readTau21WTA(m_readTau21WTAKey);
+    if ( readTau21WTA(jet) < 0.0 ) validVars = false;
+    if ( m_tagClass == TAGCLASS::TopQuark ) {
+      SG::ReadDecorHandle<xAOD::JetContainer, float> readTau32WTA(m_readTau32WTAKey);
+      if ( readTau32WTA(jet) < 0.0 ) validVars = false;
+    }
+
+    if ( !validVars ) {
+
+      if ( m_nWarnVar++ < m_nWarnMax ) ATH_MSG_WARNING( "One (or more) tagger input variable has an out-of-range value, setting score to -666" );
+      else ATH_MSG_WARNING( "One (or more) tagger input variable has an out-of-range value, setting score to -666" );
+
+      return ANNscore;
+
+    }
+
+    ANNscore = discriminant.at(m_out_names.at(0));
+
+    return ANNscore;
+}
+
+std::map<std::string, std::map<std::string, double>> JSSWTopTaggerANN::getJetProperties( const xAOD::Jet& jet ) const {
+
+  /// Map to store inputs
+  std::map< std::string, std::map<std::string, double> > ANN_inputs;
+  std::map< std::string, double > ANN_inputValues;
+
+  /// Calculate NSubjettiness and ECF ratios
+  calculateJSSRatios(jet);
+
+  ATH_MSG_DEBUG( "Loading variables for common ANN tagger" );
+
+  /// Create common read decor handles
+  SG::ReadDecorHandle<xAOD::JetContainer, float> readTau21WTA(m_readTau21WTAKey);
+  SG::ReadDecorHandle<xAOD::JetContainer, float> readC2(m_readC2Key);
+  SG::ReadDecorHandle<xAOD::JetContainer, float> readD2(m_readD2Key);
+  SG::ReadDecorHandle<xAOD::JetContainer, float> readSplit12(m_readSplit12Key);
+
+  /// Mass and pT
+  /// It is assumed that these are the combined and calibrated mass and pT
+  ANN_inputValues["CaloTACombinedMassUncorrelated"] = jet.m();
+  ANN_inputValues["JetpTCorrByCombinedMass"] = jet.pt();
+
+  /// Splitting scales
+  ANN_inputValues["Split12"] = readSplit12(jet);
+
+  /// Energy Correlation Functions
+  ANN_inputValues["C2"] = readC2(jet);
+  ANN_inputValues["D2"] = readD2(jet);
+
+  /// Tau21 WTA
+  ANN_inputValues["Tau21_wta"] = readTau21WTA(jet);
+
+  if ( m_tagClass == TAGCLASS::WBoson ) {
+
+    ATH_MSG_DEBUG( "Loading variables for W boson tagger" );
+
+    /// Other moments
+    ANN_inputValues["FoxWolfram20"] = jet.getAttribute<float>("FoxWolfram2") / jet.getAttribute<float>("FoxWolfram0");
+    ANN_inputValues["PlanarFlow"] = jet.getAttribute<float>("PlanarFlow");
+    ANN_inputValues["Angularity"] = jet.getAttribute<float>("Angularity");
+    ANN_inputValues["Aplanarity"] = jet.getAttribute<float>("Aplanarity");
+    ANN_inputValues["ZCut12"] = jet.getAttribute<float>("ZCut12");
+    ANN_inputValues["KtDR"] = jet.getAttribute<float>("KtDR");
+
+  }
+
+  else if ( m_tagClass == TAGCLASS::TopQuark ) {
+
+    ATH_MSG_DEBUG( "Loading variables for top quark tagger" );
+
+    /// Create top quark read decor handles
+    SG::ReadDecorHandle<xAOD::JetContainer, float> readTau1WTA(m_readTau1WTAKey);
+    SG::ReadDecorHandle<xAOD::JetContainer, float> readTau2WTA(m_readTau2WTAKey);
+    SG::ReadDecorHandle<xAOD::JetContainer, float> readTau3WTA(m_readTau3WTAKey);
+    SG::ReadDecorHandle<xAOD::JetContainer, float> readTau32WTA(m_readTau32WTAKey);
+    SG::ReadDecorHandle<xAOD::JetContainer, float> readSplit23(m_readSplit23Key);
+    SG::ReadDecorHandle<xAOD::JetContainer, float> readQw(m_readQwKey);
+    SG::ReadDecorHandle<xAOD::JetContainer, float> readE3(m_readE3Key);
+
+    /// Additional splitting Scales
+    ANN_inputValues["Split23"] = readSplit23(jet);
+
+    /// e3 := normalized ECF3/ECF1**3
+    ANN_inputValues["e3"] = readE3(jet);
+
+    /// N-subjettiness
+    ANN_inputValues["Tau1_wta"] = readTau1WTA(jet);
+    ANN_inputValues["Tau2_wta"] = readTau2WTA(jet);
+    ANN_inputValues["Tau3_wta"] = readTau3WTA(jet);
+
+    ANN_inputValues["Tau32_wta"] = readTau32WTA(jet);
+
+    /// Qw observable for top tagging
+    ANN_inputValues["Qw"] = readQw(jet);
+
+  }
+
+  else {
+    ATH_MSG_ERROR( "Loading variables failed because the tagger type is not supported" );
+  }
+
+  ANN_inputs["node_0"] = ANN_inputValues;
+
+  return ANN_inputs;
+
+}
+
diff --git a/Reconstruction/Jet/BoostedJetTaggers/Root/JSSWTopTaggerDNN.cxx b/Reconstruction/Jet/BoostedJetTaggers/Root/JSSWTopTaggerDNN.cxx
new file mode 100644
index 000000000000..af30c48b8b05
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/Root/JSSWTopTaggerDNN.cxx
@@ -0,0 +1,399 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "BoostedJetTaggers/JSSWTopTaggerDNN.h"
+
+#include <fstream>
+
+JSSWTopTaggerDNN::JSSWTopTaggerDNN( const std::string& name ) :
+  JSSTaggerBase( name ),
+  m_lwnn(nullptr)
+{
+
+}
+
+/// Initialize the tagger
+StatusCode JSSWTopTaggerDNN::initialize() {
+
+  ATH_MSG_INFO( "Initializing JSSWTopTaggerDNN tool" );
+ 
+  /// Pt values are defined in GeV
+  m_ptGeV = true;
+
+  /// Use mass cut
+  m_useMassCut = true;
+
+  /// Use discriminant score cut
+  m_useScoreCut = true;
+
+  if ( ! m_configFile.empty() ) {
+
+    /// Get configReader
+    ATH_CHECK( getConfigReader() );
+
+    /// Get tagger type
+    m_tagType = m_configReader.GetValue("TaggerType" ,"");
+
+    /// Get the CVMFS calib area where stuff is stored
+    /// If this is set to "Local" then it will look for the config file in the share space
+    m_kerasCalibArea = m_configReader.GetValue("CalibAreaKeras" ,"");
+
+    /// Get the name/path of the JSON config
+    m_kerasConfigFileName = m_configReader.GetValue("KerasConfigFile" ,"");
+
+    /// Get the name of the Keras output node
+    m_kerasConfigOutputName = m_configReader.GetValue("KerasOutput" ,"");
+
+    /// Get the configured cut values
+    m_strMassCutLow  = m_configReader.GetValue("MassCutLow" ,"");
+    m_strMassCutHigh = m_configReader.GetValue("MassCutHigh" ,"");
+    m_strScoreCut    = m_configReader.GetValue("ScoreCut" ,"");
+
+    /// Get min and max jet pt
+    m_jetPtMin = m_configReader.GetValue("pTCutLow", 350.0);
+    m_jetPtMax = m_configReader.GetValue("pTCutHigh", 4000.0);
+
+    /// Get the decoration name
+    m_decorationName = m_configReader.GetValue("DecorationName" ,"");
+
+    /// Get the scale factor configuration
+    m_calcSF = m_configReader.GetValue("CalcSF", false);
+    if ( m_calcSF ) {
+      m_weightDecorationName = m_configReader.GetValue("WeightDecorationName", "");
+      m_weightFileName = m_configReader.GetValue("WeightFile", "");
+      m_weightHistogramName = m_configReader.GetValue("WeightHistogramName", "");
+      m_efficiencyHistogramName = m_configReader.GetValue("EfficiencyHistogramName", "");
+      m_weightFlavors = m_configReader.GetValue("WeightFlavors", "");
+
+      /// Get truth label name information
+      m_truthLabelName = m_configReader.GetValue("TruthLabelName" , "R10TruthLabel_R21Consolidated");
+    }
+
+    /// print out the configuration parameters for viewing
+    ATH_MSG_INFO( "Configurations Loaded :");
+    ATH_MSG_INFO( "tagType               : " << m_tagType );
+    ATH_MSG_INFO( "calibarea_keras       : " << m_kerasCalibArea );
+    ATH_MSG_INFO( "kerasConfigFileName   : " << m_kerasConfigFileName );
+    ATH_MSG_INFO( "kerasConfigOutputName : " << m_kerasConfigOutputName );
+    ATH_MSG_INFO( "strMassCutLow         : " << m_strMassCutLow );
+    ATH_MSG_INFO( "strMassCutHigh        : " << m_strMassCutHigh );
+    ATH_MSG_INFO( "pTCutLow              : " << m_jetPtMin );
+    ATH_MSG_INFO( "pTCutHigh             : " << m_jetPtMax );
+    ATH_MSG_INFO( "strScoreCut           : " << m_strScoreCut );
+    ATH_MSG_INFO( "decorationName        : " << m_decorationName );
+    if ( m_calcSF ) {
+      ATH_MSG_INFO( "weightDecorationName  : " << m_weightDecorationName );
+      ATH_MSG_INFO( "weightFile            : " << m_weightFileName );
+      ATH_MSG_INFO( "weightHistogramName   : " << m_weightHistogramName );
+      ATH_MSG_INFO( "efficiencyHistogramName : "<<m_efficiencyHistogramName );
+      ATH_MSG_INFO( "weightFlavors         : " << m_weightFlavors );
+      ATH_MSG_INFO( "TruthLabelName        : " << m_truthLabelName );
+    }
+  }
+  else { /// No config file
+    /// Assume the cut functions have been set through properties.
+    /// Check they are non empty
+    if ( (m_kerasConfigFileName.empty() ||
+          m_kerasConfigOutputName.empty() ||
+          m_strScoreCut.empty() ||
+          m_strMassCutLow.empty() ||
+          m_strMassCutHigh.empty() ||
+          m_decorationName.empty() || 
+          m_weightFileName.empty()) ||
+        ((m_weightDecorationName.empty() ||
+          m_weightHistogramName.empty() ||
+          m_weightFlavors.empty()) && m_calcSF)
+       )
+    {
+      ATH_MSG_ERROR( "No config file provided OR you haven't manually specified all needed parameters" ) ;
+      ATH_MSG_ERROR( "Please read the TWiki for this tool" );
+      return StatusCode::FAILURE;
+    }
+
+  }
+
+  ATH_MSG_INFO( "Mass cut low   : " << m_strMassCutLow );
+  ATH_MSG_INFO( "Mass cut High  : " << m_strMassCutHigh );
+  ATH_MSG_INFO( "Score cut low  : " << m_strScoreCut );
+
+  /// If the calibarea is specified to be "Local" then it looks in the same place as the top level configs
+  if ( m_kerasCalibArea.empty() ) {
+    ATH_MSG_ERROR( "You need to specify where the calibarea is as either being Local or on CVMFS" );
+    return StatusCode::FAILURE;
+  }
+  else if ( !m_kerasCalibArea.compare("Local") ){
+    std::string localCalibArea = "BoostedJetTaggers/JSSWTopTaggerDNN/";
+    ATH_MSG_INFO( "Using Local calibarea " << localCalibArea );
+    /// Convert the JSON config file name to the full path
+    m_kerasConfigFilePath = PathResolverFindCalibFile(localCalibArea+m_kerasConfigFileName);
+    if ( m_calcSF )
+      m_weightConfigPath = PathResolverFindCalibFile(localCalibArea+m_weightFileName);
+  }
+  else {
+    ATH_MSG_INFO( "Using CVMFS calibarea" );
+    /// Get the config file from CVMFS
+    /// Necessary because xml files are too large to house on the data space
+    m_kerasConfigFilePath = PathResolverFindCalibFile( (m_kerasCalibArea+m_kerasConfigFileName).c_str() );
+    if ( m_calcSF )
+      m_weightConfigPath = PathResolverFindCalibFile( (m_kerasCalibArea+m_weightFileName).c_str());
+  }
+
+  /// Read json file for DNN weights
+  ATH_MSG_INFO( "DNN Tagger configured with: " << m_kerasConfigFilePath );
+
+  std::ifstream input_cfg( m_kerasConfigFilePath.c_str() );
+
+  if ( !input_cfg.is_open() ) {
+    ATH_MSG_ERROR( "Error openning config file: " << m_kerasConfigFilePath );
+    ATH_MSG_ERROR( "Are you sure that the file exists at this path?" );
+    return StatusCode::FAILURE;
+  }
+
+  lwt::JSONConfig cfg = lwt::parse_json( input_cfg );
+
+  ATH_MSG_INFO( "Keras Network NLayers: " << cfg.layers.size() );
+
+  m_lwnn = std::make_unique<lwt::LightweightNeuralNetwork>(cfg.inputs, cfg.layers, cfg.outputs);
+
+  /// Set internal tagger type
+  if ( !m_tagType.compare("TopQuark") ) {
+    ATH_MSG_DEBUG( "This is a top quark tagger" );
+    m_tagClass = TAGCLASS::TopQuark;
+  }
+  else if ( !m_tagType.compare("WBoson") ) {
+    ATH_MSG_DEBUG( "This is a W boson tagger" );
+    m_tagClass = TAGCLASS::WBoson;
+  }
+  else if ( !m_tagType.compare("ZBoson") ) {
+    ATH_MSG_DEBUG( "This is a Z boson tagger" );
+    m_tagClass = TAGCLASS::ZBoson;
+  }
+  else {
+    ATH_MSG_ERROR( "I can't tell what kind of tagger your configuration is for." );
+    return StatusCode::FAILURE;
+  }
+
+  /// Set the possible states that the tagger can be left in after the JSSTaggerBase::tag() function is called
+  m_acceptInfo.addCut( "PassMassLow" , "mJet > mCutLow" );
+  m_acceptInfo.addCut( "PassScore"   , "ScoreJet > ScoreCut" );
+  if ( m_tagClass == TAGCLASS::WBoson || m_tagClass == TAGCLASS::ZBoson ) {
+    m_acceptInfo.addCut( "PassMassHigh", "mJet < mCutHigh" );
+  }
+
+  /// Loop over and print out the cuts that have been configured
+  printCuts();
+
+  /// Call base class initialize
+  ATH_CHECK( JSSTaggerBase::initialize() );
+
+  ATH_MSG_INFO( "DNN Tagger tool initialized" );
+
+  return StatusCode::SUCCESS;
+
+}
+
+StatusCode JSSWTopTaggerDNN::tag( const xAOD::Jet& jet ) const {
+
+  ATH_MSG_DEBUG( "Obtaining DNN result" );
+
+  /// Create asg::AcceptData object
+  asg::AcceptData acceptData( &m_acceptInfo );
+
+  /// Reset the AcceptData cut results
+  ATH_CHECK( resetCuts( acceptData ) );
+
+  /// Check basic kinematic selection
+  ATH_CHECK( checkKinRange( jet, acceptData ) );
+
+  /// Get the relevant attributes of the jet
+  /// Mass and pt - note that this will depend on the configuration of the calibration used
+  float jet_pt   = jet.pt()/1000.0;
+  float jet_mass = jet.m()/1000.0;
+
+  /// Get DNN score for the jet
+  float jet_score = getScore(jet);
+
+  /// Evaluate the values of the upper and lower mass bounds and the d2 cut
+  float cut_mass_low  = m_funcMassCutLow ->Eval(jet_pt);
+  float cut_mass_high = m_funcMassCutHigh->Eval(jet_pt);
+  float cut_score     = m_funcScoreCut   ->Eval(jet_pt);
+
+  /// Print cut criteria and jet values
+  ATH_MSG_VERBOSE( "Cut values : Mass window = [" << cut_mass_low << "," << cut_mass_high << "], score cut = " << cut_score );
+  ATH_MSG_VERBOSE( "Jet values : Mass = " << jet_mass << ", score = " << jet_score );
+
+  /// Get SF weight
+  ATH_CHECK( getWeight( jet, jet_score > cut_score, acceptData ) );
+
+  /// Decorate cut information if needed
+  ATH_MSG_DEBUG( "Decorating with score" );
+
+  /// Create WriteDecorHandles
+  SG::WriteDecorHandle<xAOD::JetContainer, bool> decPassMass(m_decPassMassKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, bool> decPassScore(m_decPassScoreKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, bool> decTagged(m_decTaggedKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decCutMLow(m_decCutMLowKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decCutMHigh(m_decCutMHighKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decScoreCut(m_decScoreCutKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decScoreValue(m_decScoreValueKey);
+
+  /// Decorate values
+  decCutMLow(jet) = cut_mass_low;
+  decCutMHigh(jet) = cut_mass_high;
+  decScoreCut(jet) = cut_score;
+  decScoreValue(jet) = jet_score;
+
+  /// Cut summary
+  bool passCuts = true;
+
+  /// Set the AcceptData depending on whether it is a W/Z or a top tagger
+  if ( m_tagClass == TAGCLASS::WBoson || m_tagClass == TAGCLASS::ZBoson ) {
+    ATH_MSG_VERBOSE( "Determining WZ tag return" );
+    if ( jet_mass > cut_mass_low ) acceptData.setCutResult( "PassMassLow", true );
+    if ( jet_mass < cut_mass_high ) acceptData.setCutResult( "PassMassHigh", true );
+    if ( jet_score > cut_score ) acceptData.setCutResult( "PassScore", true );
+    decPassMass(jet) = acceptData.getCutResult( "PassMassLow" ) && acceptData.getCutResult( "PassMassHigh" );
+    passCuts = passCuts && acceptData.getCutResult( "PassMassLow" ) && acceptData.getCutResult( "PassMassHigh" );
+  }
+  else if ( m_tagClass == TAGCLASS::TopQuark ) {
+    ATH_MSG_VERBOSE( "Determining TopQuark tag return" );
+    if ( jet_mass > cut_mass_low ) acceptData.setCutResult( "PassMassLow", true );
+    if ( jet_score > cut_score ) acceptData.setCutResult( "PassScore", true );
+    decPassMass(jet) = acceptData.getCutResult( "PassMassLow" );
+    passCuts = passCuts && acceptData.getCutResult( "PassMassLow" );
+  }
+
+  decPassScore(jet) = acceptData.getCutResult( "PassScore" );
+
+  passCuts = passCuts && acceptData.getCutResult( "PassScore" );
+
+  decTagged(jet) = passCuts;
+
+  return StatusCode::SUCCESS;
+
+}
+
+double JSSWTopTaggerDNN::getScore( const xAOD::Jet& jet ) const {
+
+  /// Create input dictionary map<string,double> for argument to lwtnn
+  std::map<std::string,double> DNN_inputValues = getJetProperties(jet);
+
+  /// Evaluate the network response
+  lwt::ValueMap discriminant = m_lwnn->compute(DNN_inputValues);
+
+  /// Obtain the output associated with the single output node
+  double DNNscore = -666.;
+
+  /// Check that input variables are valid
+  bool validVars = true;
+  SG::ReadDecorHandle<xAOD::JetContainer, float> readTau21WTA(m_readTau21WTAKey);
+  if ( readTau21WTA(jet) < 0.0 ) validVars = false;
+  if ( m_tagClass == TAGCLASS::TopQuark ) {
+    SG::ReadDecorHandle<xAOD::JetContainer, float> readTau32WTA(m_readTau32WTAKey);
+    if ( readTau32WTA(jet) < 0.0 ) validVars = false;
+  }
+
+  if ( !validVars ) {
+
+    if ( m_nWarnVar++ < m_nWarnMax ) ATH_MSG_WARNING( "One (or more) tagger input variable has an out-of-range value, setting score to -666" );
+    else ATH_MSG_DEBUG( "One (or more) tagger input variable has an out-of-range value, setting score to -666" );
+
+    return DNNscore;
+
+  }
+
+  DNNscore = discriminant[m_kerasConfigOutputName];
+
+  return DNNscore;
+
+}
+
+std::map<std::string,double> JSSWTopTaggerDNN::getJetProperties( const xAOD::Jet& jet ) const {
+
+  /// Map to store inputs
+  std::map<std::string,double> DNN_inputValues;
+
+  /// Calculate NSubjettiness and ECF ratios
+  calculateJSSRatios(jet);
+
+  ATH_MSG_DEBUG( "Loading variables for common DNN tagger" );
+
+  /// Create common read decor handles
+  SG::ReadDecorHandle<xAOD::JetContainer, float> readTau21WTA(m_readTau21WTAKey);
+  SG::ReadDecorHandle<xAOD::JetContainer, float> readC2(m_readC2Key);
+  SG::ReadDecorHandle<xAOD::JetContainer, float> readD2(m_readD2Key);
+  SG::ReadDecorHandle<xAOD::JetContainer, float> readSplit12(m_readSplit12Key);
+
+  /// Mass and pT
+  /// It is assumed that these are the combined and calibrated mass and pT
+  DNN_inputValues["CaloTACombinedMassUncorrelated"] = jet.m();
+  DNN_inputValues["JetpTCorrByCombinedMass"] = jet.pt();
+
+  /// Splitting scales
+  DNN_inputValues["Split12"] = readSplit12(jet);
+
+  /// Energy Correlation Functions
+  DNN_inputValues["C2"] = readC2(jet);
+  DNN_inputValues["D2"] = readD2(jet);
+
+  /// Tau21 WTA
+  DNN_inputValues["Tau21_wta"] = readTau21WTA(jet);
+
+  if ( m_tagClass == TAGCLASS::WBoson ) {
+
+    ATH_MSG_DEBUG( "Loading variables for W boson tagger" );
+
+    /// Other moments
+    DNN_inputValues["FoxWolfram20"] = jet.getAttribute<float>("FoxWolfram2") / jet.getAttribute<float>("FoxWolfram0");
+    DNN_inputValues["PlanarFlow"] = jet.getAttribute<float>("PlanarFlow");
+    DNN_inputValues["Angularity"] = jet.getAttribute<float>("Angularity");
+    DNN_inputValues["Aplanarity"] = jet.getAttribute<float>("Aplanarity");
+    DNN_inputValues["ZCut12"] = jet.getAttribute<float>("ZCut12");
+    DNN_inputValues["KtDR"] = jet.getAttribute<float>("KtDR");
+  
+  }
+  
+  else if ( m_tagClass == TAGCLASS::TopQuark ) {
+  
+    ATH_MSG_DEBUG("Loading variables for top quark tagger");
+
+    /// Create top quark read decor handles
+    SG::ReadDecorHandle<xAOD::JetContainer, float> readTau1WTA(m_readTau1WTAKey);
+    SG::ReadDecorHandle<xAOD::JetContainer, float> readTau2WTA(m_readTau2WTAKey);
+    SG::ReadDecorHandle<xAOD::JetContainer, float> readTau3WTA(m_readTau3WTAKey);
+    SG::ReadDecorHandle<xAOD::JetContainer, float> readTau32WTA(m_readTau32WTAKey);
+    SG::ReadDecorHandle<xAOD::JetContainer, float> readSplit23(m_readSplit23Key);
+    SG::ReadDecorHandle<xAOD::JetContainer, float> readQw(m_readQwKey);
+    SG::ReadDecorHandle<xAOD::JetContainer, float> readE3(m_readE3Key);
+
+    /// Mass and pT again
+    DNN_inputValues["m"] = jet.m();
+    DNN_inputValues["pt"] = jet.pt();
+
+    /// Additional splitting scales
+    DNN_inputValues["Split23"] = readSplit23(jet);
+
+    /// e3 := normalized ECF3/ECF1**3
+    DNN_inputValues["e3"] = readE3(jet);
+
+    /// N-subjettiness
+    DNN_inputValues["Tau1_wta"] = readTau1WTA(jet);
+    DNN_inputValues["Tau2_wta"] = readTau2WTA(jet);
+    DNN_inputValues["Tau3_wta"] = readTau3WTA(jet);
+
+    DNN_inputValues["Tau32_wta"] = readTau32WTA(jet);
+
+    /// Qw observable for top tagging
+    DNN_inputValues["Qw"] = readQw(jet);
+  
+  }
+  
+  else {
+    ATH_MSG_ERROR( "Loading variables failed because the tagger type is not supported" );
+  }
+
+  return DNN_inputValues;
+
+}
+
diff --git a/Reconstruction/Jet/BoostedJetTaggers/Root/JetQGTagger.cxx b/Reconstruction/Jet/BoostedJetTaggers/Root/JetQGTagger.cxx
new file mode 100644
index 000000000000..df139d452d56
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/Root/JetQGTagger.cxx
@@ -0,0 +1,734 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "BoostedJetTaggers/JetQGTagger.h"
+
+#include <TRandom3.h>
+#include <TSystem.h>
+
+#include "InDetTrackSelectionTool/InDetTrackSelectionTool.h"
+#include "InDetTrackSystematicsTools/InDetTrackTruthFilterTool.h"
+#include "InDetTrackSystematicsTools/InDetTrackTruthOriginTool.h"
+#include "InDetTrackSystematicsTools/JetTrackFilterTool.h"
+
+#include "xAODTracking/VertexContainer.h"
+
+namespace CP {
+
+  JetQGTagger::JetQGTagger( const std::string& name): JSSTaggerBase( name ),
+                  m_appliedSystEnum(QG_NONE),
+                  m_hquark(nullptr),
+                  m_hgluon(nullptr),
+                  m_topo_hquark(nullptr),
+                  m_exp_hquark_up(nullptr),
+                  m_exp_hquark_down(nullptr),
+                  m_exp_hgluon_up(nullptr),
+                  m_exp_hgluon_down(nullptr),
+                  m_me_hquark_up(nullptr),
+                  m_me_hquark_down(nullptr),
+                  m_me_hgluon_up(nullptr),
+                  m_me_hgluon_down(nullptr),
+                  m_pdf_hquark_up(nullptr),
+                  m_pdf_hquark_down(nullptr),
+                  m_pdf_hgluon_up(nullptr),
+                  m_pdf_hgluon_down(nullptr),
+                  m_trackeff_hquark(nullptr),
+                  m_trackeff_hgluon(nullptr),
+                  m_fake_hquark(nullptr),
+                  m_fake_hgluon(nullptr),
+                  m_trkSelectionTool(name+"_trackselectiontool", this),
+                  m_trkTruthFilterTool(name+"_trackfiltertool",this),
+                  m_trkFakeTool(name+"_trackfaketool",this),
+                  m_jetTrackFilterTool(name+"_jettrackfiltertool",this),
+                  m_originTool(name+"_origintool",this)
+  {
+
+    declareProperty( "NTrackCut",    m_NTrackCut=-1);
+    declareProperty( "cuttype",      m_cuttype="log_pt");
+    declareProperty( "slope",        m_slope=9.779);
+    declareProperty( "intercept",    m_intercept=-32.28);
+    declareProperty( "UseJetVars",   m_mode = 0); // 0 uses the tracks. 1 uses variables from the jets
+
+    declareProperty( "Tagger", m_taggername = "ntrack");
+    m_calibArea = "BoostedJetTaggers/QGTagger/May2019/"; // Overwrite base class default
+    declareProperty( "TopoWeightFile", m_topofile = "");
+    declareProperty( "ExpWeightFile", m_expfile = "qgsyst_exp.root");
+    declareProperty( "MEWeightFile",  m_mefile  = "qgsyst_me.root");
+    declareProperty( "PDFWeightFile", m_pdffile = "qgsyst_pdf.root");
+    declareProperty( "TrackEffFile", m_trackefffile = "track_systs.root");//REPLACE when file available
+    declareProperty( "FakeFile", m_fakefile = "track_systs.root");//REPLACE when file available
+    declareProperty( "MinPt", m_jetPtMin = 50e3);
+    declareProperty( "MaxEta", m_jetEtaMax = 2.1);
+    declareProperty( "WeightDecorationName", m_weight_decoration_name = "qgTaggerWeight");
+    declareProperty( "TaggerDecorationName", m_tagger_decoration_name = "qgTagger");
+
+
+    applySystematicVariation(SystematicSet()).ignore();
+  
+  }
+
+  StatusCode JetQGTagger::initialize() {
+
+    ATH_MSG_INFO( "Initializing QuarkGluonTagger tool" );
+
+    if( ! m_configFile.empty() ) {
+      ATH_MSG_INFO( "Using config file : "<< m_configFile );
+      // check for the existence of the configuration file
+      std::string configPath;
+      configPath = PathResolverFindDataFile(("BoostedJetTaggers/"+m_configFile).c_str());
+      FileStat_t fStats;
+      int fSuccess = gSystem->GetPathInfo(configPath.c_str(), fStats);
+
+      if ( fSuccess ){
+        ATH_MSG_ERROR( "Recommendations file " << m_configFile << " could not be found");
+        return StatusCode::FAILURE;
+      }
+      else {
+        ATH_MSG_DEBUG( "Recommendations file was found : " << configPath );
+      }
+
+      TEnv configReader;
+      if(configReader.ReadFile( configPath.c_str(), EEnvLevel(0) ) != 0 ) {
+        ATH_MSG_ERROR( "Error while reading config file : "<< configPath );
+        return StatusCode::FAILURE;
+      }
+
+      // read in the specified track cut in the config file
+      m_NTrackCut=configReader.GetValue("NTrackCut" ,-1);
+
+      ATH_MSG_VERBOSE( "NTrackCut by config file : "<<m_NTrackCut );
+
+    }
+    else {
+      // no config file
+      // Assume the cut functions have been set through properties.
+      // check they are non empty
+      if( m_NTrackCut!=-1){
+        ATH_MSG_VERBOSE( "NTrackCut by manual setting of property : "<<m_NTrackCut );
+      }
+      else {
+        ATH_MSG_WARNING( "No config file provided AND no NTrackCut specified." ) ;
+      }
+    }
+    if(m_cuttype != "linear_pt" && m_cuttype != "threshold" && m_cuttype != "log_pt"){
+	ATH_MSG_ERROR("Cuttype set to: " << m_cuttype );
+	ATH_MSG_ERROR("Cuttype invalid. Must use 'linear_pt', 'log_pt', or 'threshold'");
+	return StatusCode::FAILURE;	
+    }
+ 
+    // decorators used to store
+    // 1) ntracks
+    // 2) tagger weight
+    ATH_MSG_INFO( "Decorators that will be attached to jet :" );
+    ATH_MSG_INFO( "  " << m_tagger_decoration_name << " : Number of tracks for tagging decision" );
+    ATH_MSG_INFO( "  " << m_weight_decoration_name << " : Scale factor weight given the number of tracks" );
+    
+    m_decTagKey = m_containerName + "." + m_tagger_decoration_name;
+    m_decWeightKey = m_containerName + "." + m_weight_decoration_name;
+
+    ATH_CHECK( m_decTagKey.initialize() );
+    ATH_CHECK( m_decWeightKey.initialize() );
+
+    /// ReadDecorHandles for Ntrk variables
+    m_readNumTrkPt500PVKey = m_containerName + "." + m_readNumTrkPt500PVKey.key();
+    m_readNtrkKey = m_containerName + "." + m_readNtrkKey.key();
+
+    ATH_CHECK( m_readNumTrkPt500PVKey.initialize() );
+    ATH_CHECK( m_readNtrkKey.initialize() );
+
+    // set up InDet selection tool
+    ANA_CHECK( ASG_MAKE_ANA_TOOL( m_trkSelectionTool,  InDet::InDetTrackSelectionTool ) );
+    ANA_CHECK( m_trkSelectionTool.setProperty( "CutLevel", "Loose" ) );
+    ANA_CHECK( m_trkSelectionTool.retrieve() );
+
+    // set up InDet truth track selection tools
+    ANA_CHECK( ASG_MAKE_ANA_TOOL( m_trkTruthFilterTool, InDet::InDetTrackTruthFilterTool ) );
+    ANA_CHECK( ASG_MAKE_ANA_TOOL( m_trkFakeTool, InDet::InDetTrackTruthFilterTool ) );
+
+    ANA_CHECK( ASG_MAKE_ANA_TOOL( m_originTool, InDet::InDetTrackTruthOriginTool ) );
+    ANA_CHECK( m_originTool.retrieve() );
+
+    ANA_CHECK( m_trkTruthFilterTool.setProperty( "Seed", 1234 ) );
+    ANA_CHECK( m_trkTruthFilterTool.setProperty( "trackOriginTool", m_originTool ) );
+    ANA_CHECK( m_trkTruthFilterTool.retrieve() );
+    CP::SystematicSet systSetTrk = {
+      InDet::TrackSystematicMap[InDet::TRK_EFF_LOOSE_GLOBAL],
+      InDet::TrackSystematicMap[InDet::TRK_EFF_LOOSE_IBL],
+      InDet::TrackSystematicMap[InDet::TRK_EFF_LOOSE_PP0],
+      InDet::TrackSystematicMap[InDet::TRK_EFF_LOOSE_PHYSMODEL]
+    };
+    ANA_CHECK( m_trkTruthFilterTool->applySystematicVariation(systSetTrk) );
+
+    // set up tools used for systematic variations of tracks
+    ANA_CHECK( m_trkFakeTool.setProperty( "Seed", 1234 ) );
+    ANA_CHECK( m_trkFakeTool.setProperty( "trackOriginTool", m_originTool ) );
+    ANA_CHECK( m_trkFakeTool.retrieve() );
+    CP::SystematicSet systSetTrkFake = {
+      InDet::TrackSystematicMap[InDet::TRK_FAKE_RATE_LOOSE]
+    };
+    ANA_CHECK( m_trkFakeTool->applySystematicVariation(systSetTrkFake) );
+
+    ANA_CHECK( ASG_MAKE_ANA_TOOL( m_jetTrackFilterTool, InDet::JetTrackFilterTool ) );
+    ANA_CHECK( m_jetTrackFilterTool.setProperty( "Seed", 1234 ) );
+    ANA_CHECK( m_jetTrackFilterTool.setProperty( "trackOriginTool", m_originTool ) ); 
+    ANA_CHECK( m_jetTrackFilterTool.retrieve() );
+    CP::SystematicSet systSetJet = {
+      InDet::TrackSystematicMap[InDet::TRK_EFF_LOOSE_TIDE]
+    };
+    ANA_CHECK( m_jetTrackFilterTool->applySystematicVariation(systSetJet) );
+
+    // specify systematic variations relevant for this tool
+    if (!addAffectingSystematic(QGntrackSyst::trackfakes,true) ||
+        !addAffectingSystematic(QGntrackSyst::trackefficiency,true) ||
+        !addAffectingSystematic(QGntrackSyst::nchargedtopo,false /*for topology differences */) ||
+        !addAffectingSystematic(QGntrackSyst::nchargedexp_up,true) ||
+        !addAffectingSystematic(QGntrackSyst::nchargedme_up,true) ||
+        !addAffectingSystematic(QGntrackSyst::nchargedpdf_up,true) ||
+        !addAffectingSystematic(QGntrackSyst::nchargedexp_down,true) ||
+        !addAffectingSystematic(QGntrackSyst::nchargedme_down,true) ||
+        !addAffectingSystematic(QGntrackSyst::nchargedpdf_down,true) ||
+        !addAffectingSystematic(QGntrackSyst::trackeff,true)||
+        !addAffectingSystematic(QGntrackSyst::fake,true)
+      )
+    {
+      ATH_MSG_ERROR("failed to set up JetQGTagger systematics");
+      return StatusCode::FAILURE;
+    }
+
+    // load in the histograms that store the ntrack systematics
+    if(m_topofile!="")//load topology file only if explicitly configured (default is "")
+    ANA_CHECK( this->loadHist(m_topo_hquark,    m_topofile,"h2dquark") );
+    ANA_CHECK( this->loadHist(m_exp_hquark_up,  m_expfile,"h2dquark_up")  );
+    ANA_CHECK( this->loadHist(m_exp_hquark_down,m_expfile,"h2dquark_down"));
+    ANA_CHECK( this->loadHist(m_exp_hgluon_up,  m_expfile,"h2dgluon_up")  );
+    ANA_CHECK( this->loadHist(m_exp_hgluon_down,m_expfile,"h2dgluon_down"));
+    ANA_CHECK( this->loadHist(m_me_hquark_up,   m_mefile, "h2dquark_up")  );
+    ANA_CHECK( this->loadHist(m_me_hquark_down, m_mefile, "h2dquark_down"));
+    ANA_CHECK( this->loadHist(m_me_hgluon_up,   m_mefile, "h2dgluon_up")  );
+    ANA_CHECK( this->loadHist(m_me_hgluon_down, m_mefile, "h2dgluon_down"));
+    ANA_CHECK( this->loadHist(m_pdf_hquark_up,  m_pdffile,"h2dquark_up")  );
+    ANA_CHECK( this->loadHist(m_pdf_hquark_down,m_pdffile,"h2dquark_down"));
+    ANA_CHECK( this->loadHist(m_pdf_hgluon_up,  m_pdffile,"h2dgluon_up")  );
+    ANA_CHECK( this->loadHist(m_pdf_hgluon_down,m_pdffile,"h2dgluon_down"));
+    ATH_MSG_INFO("about to load track syst histos");
+    ATH_MSG_INFO("trackeff file: " << m_trackefffile);
+    ANA_CHECK( this->loadHist(m_trackeff_hquark,m_trackefffile,"track_syste_quark"));//REPLACE w/ right histo
+    ANA_CHECK( this->loadHist(m_trackeff_hgluon,m_trackefffile,"track_syste_gluon"));//REPLACE w/ right histo
+    ANA_CHECK( this->loadHist(m_fake_hquark,m_fakefile,"track_systf_quark"));//REPLACE w/ right histo
+    ANA_CHECK( this->loadHist(m_fake_hgluon,m_fakefile,"track_systf_gluon"));//REPLACE w/ right histo
+
+    ATH_MSG_INFO( ": JetQGTagger tool initialized" );
+    ATH_MSG_INFO( "  NTrackCut   : "<< m_NTrackCut );
+
+    /// Initialize the tagger states
+    m_acceptInfo.addCut( "QuarkJetTag", "True if the jet is deemed a quark jet because NTrack<NCut, False if jet deemed gluon jet because NTrack<NCut" );
+
+    /// Call base class initialize
+    ATH_CHECK( JSSTaggerBase::initialize() );
+    
+    /// Loop over and print out the cuts that have been configured
+    printCuts();
+
+    return StatusCode::SUCCESS;
+  
+  }
+
+  JetQGTagger::~JetQGTagger(){
+
+    delete m_topo_hquark;
+    delete m_exp_hquark_up;
+    delete m_exp_hquark_down;
+    delete m_exp_hgluon_up;
+    delete m_exp_hgluon_down;
+    delete m_me_hquark_up;
+    delete m_me_hquark_down;
+    delete m_me_hgluon_up;
+    delete m_me_hgluon_down;
+    delete m_pdf_hquark_up;
+    delete m_pdf_hquark_down;
+    delete m_pdf_hgluon_up;
+    delete m_pdf_hgluon_down;
+    delete m_trackeff_hquark;
+    delete m_trackeff_hgluon;
+    delete m_fake_hquark;
+    delete m_fake_hgluon;
+
+  }
+
+  StatusCode JetQGTagger::tag( const xAOD::Jet& jet, const xAOD::Vertex * pv ) const {
+
+    ATH_MSG_DEBUG( "Obtaining QG result" );
+
+    double jetWeight = -1;
+    int    jetNTrack = -1;
+
+    /// Create asg::AcceptData object
+    asg::AcceptData acceptData( &m_acceptInfo );
+
+    /// Reset the AcceptData cut results
+    ATH_CHECK( resetCuts( acceptData ) );
+
+    /// Check basic kinematic selection
+    ATH_CHECK( checkKinRange( jet, acceptData ) );
+
+    /// Create WriteDecorHandles
+    SG::WriteDecorHandle<xAOD::JetContainer, bool> decTagged(m_decTaggedKey);
+    SG::WriteDecorHandle<xAOD::JetContainer, bool> decValidEventContent(m_decValidEventContentKey);
+
+    /// If the jet isn't valid there's no point applying the remaining cuts
+    /// TODO: Is this actually needed?
+    if ( !passKinRange(jet) ) {
+      decTagged(jet) = false;
+      return StatusCode::SUCCESS;
+    }
+
+    if ( m_mode == 0 ) { //do tagging assuming relevant track particle, PV, etc containers exist
+      bool isValid = true;
+      if ( pv ) ATH_MSG_DEBUG( "Obtaining JetQGTagger decision with user specific primary vertex" );
+      else ATH_MSG_DEBUG( "Obtaining JetQGTagger decision default" );
+
+      // if no primary vertex is specified, then the 0th primary vertex is used
+      if ( !pv ) {
+        const xAOD::VertexContainer* vxCont = nullptr;
+        if ( evtStore()->retrieve( vxCont, "PrimaryVertices" ).isFailure() ) {
+          ATH_MSG_WARNING("Unable to retrieve primary vertex container PrimaryVertices");
+          acceptData.setCutResult("ValidEventContent", false);
+          isValid = false;
+        }
+        else if ( vxCont->empty() ) {
+          ATH_MSG_WARNING("Event has no primary vertices!");
+          acceptData.setCutResult("ValidEventContent", false);
+          isValid = false;
+        }
+        else {
+          for ( const auto& vx : *vxCont ) {
+            // take the first vertex in the list that is a primary vertex
+            if ( vx->vertexType()==xAOD::VxType::PriVtx ) {
+              pv = vx;
+              break;
+            }
+          }
+        }
+        // Now we have to make sure that we did ID one as PV
+        // I think this can happen in physics events (though they've got to be removed in order to perform a lot of calibrations)
+        // so I've elected to not spit out a warning message here
+        if ( !pv ) {
+          acceptData.setCutResult("ValidEventContent", false);
+          isValid = false;
+        }
+      }
+
+      // If the object isn't valid there's no point applying the remaining cuts
+      if ( !isValid ) return StatusCode::SUCCESS;
+
+      // obtain the relevant information for tagging
+      // 1) the number of tracks
+      // 2) jet-by-jet event weight  
+      ATH_CHECK( getNTrack(&jet, /*pv,*/ jetNTrack) );
+      ATH_CHECK( getNTrackWeight(&jet, jetWeight) );
+    
+    }
+
+    if ( m_mode == 1 ) { //only calculating uncertainty using given jet info (nTrk already calculated, etc)
+      ATH_CHECK( simplegetNTrackWeight(&jet, jetWeight) );
+      SG::ReadDecorHandle<xAOD::JetContainer, int> readNumTrkPt500PV(m_readNumTrkPt500PVKey);
+      SG::ReadDecorHandle<xAOD::JetContainer, int> readNtrk(m_readNtrkKey);
+      if ( readNtrk.isAvailable() ) jetNTrack = readNtrk(jet);
+      else if ( readNumTrkPt500PV.isAvailable() ) jetNTrack = readNumTrkPt500PV(jet);
+      else { 
+        ATH_MSG_ERROR("Neither NumTrkPt500PV nor DFCommonJets_QGTagger_NTracks is available for your jet. Please add it before running in mode 1 of the JetQGTagger.");
+        return StatusCode::FAILURE;
+      }
+
+      // decorate the cut value if specified
+      SG::WriteDecorHandle<xAOD::JetContainer, float> decWeight(m_decWeightKey);
+      decWeight(jet) = jetWeight;
+    }
+
+    decValidEventContent(jet) = acceptData.getCutResult( "ValidEventContent" );
+
+    // decorate the cut value if specified
+    SG::WriteDecorHandle<xAOD::JetContainer, float> decTag(m_decTagKey);
+    SG::WriteDecorHandle<xAOD::JetContainer, float> decWeight(m_decWeightKey);
+
+    decTag(jet) = jetNTrack;
+    decWeight(jet) = jetWeight;
+
+    // fill the AcceptData
+    ATH_MSG_DEBUG("NTrack       = "<<jetNTrack);
+    ATH_MSG_DEBUG("NTrackWeight = "<<jetWeight);
+    double variable_nTrk = -999.0;
+    if (m_cuttype=="linear_pt"){
+      variable_nTrk=(m_slope*jet.pt())+m_intercept;
+      if(jetNTrack<variable_nTrk) acceptData.setCutResult("QuarkJetTag", true);
+    }
+    else if (m_cuttype=="log_pt"){
+      variable_nTrk=(m_slope*TMath::Log10(jet.pt()))+m_intercept;
+      if(jetNTrack<variable_nTrk) acceptData.setCutResult("QuarkJetTag", true);
+    }
+    else if(m_cuttype=="threshold" && jetNTrack<m_NTrackCut) acceptData.setCutResult("QuarkJetTag", true);
+
+    decTagged(jet) = acceptData.getCutResult( "QuarkJetTag" );
+
+    return StatusCode::SUCCESS;
+
+  }
+
+  StatusCode JetQGTagger::simplegetNTrackWeight(const xAOD::Jet * jet, double &weight) const {
+
+    ATH_MSG_DEBUG( "Getting the jet weight for systematic variation " << m_appliedSystEnum );
+
+    // initially set the weight to unity
+    // this is the weight returned if you are *not* dealing with a systematic variation
+    weight = 1.0;
+    ATH_MSG_DEBUG("Getting the jet weight for systematic variation " << m_appliedSystEnum);
+    ATH_MSG_DEBUG("made it into simplegetntrk");
+
+    // if you are not dealing with a systematic variation, then exit
+    if ( m_appliedSystEnum!=QG_NCHARGEDEXP_UP &&
+        m_appliedSystEnum!=QG_NCHARGEDME_UP &&
+        m_appliedSystEnum!=QG_NCHARGEDPDF_UP &&
+        m_appliedSystEnum!=QG_NCHARGEDEXP_DOWN &&
+        m_appliedSystEnum!=QG_NCHARGEDME_DOWN &&
+        m_appliedSystEnum!=QG_NCHARGEDPDF_DOWN &&
+        m_appliedSystEnum!=QG_TRACKEFFICIENCY &&
+        m_appliedSystEnum!=QG_TRACKFAKES
+       )
+    {
+      return StatusCode::SUCCESS;
+    }
+
+    // use the lookup tables loaded in initialize() to find the systematically shifted weights
+    bool truthsyst = m_appliedSystEnum==QG_NCHARGEDEXP_UP || m_appliedSystEnum==QG_NCHARGEDME_UP || m_appliedSystEnum==QG_NCHARGEDPDF_UP || m_appliedSystEnum == QG_NCHARGEDEXP_DOWN || m_appliedSystEnum== QG_NCHARGEDME_DOWN || m_appliedSystEnum == QG_NCHARGEDPDF_DOWN;
+    bool recosyst = m_appliedSystEnum==QG_TRACKEFFICIENCY || m_appliedSystEnum == QG_TRACKFAKES;
+
+    int ptbin, ntrkbin;
+    int pdgid = jet->getAttribute<int>("PartonTruthLabelID");
+    if (truthsyst){
+      int tntrk = jet->getAttribute<int>("DFCommonJets_QGTagger_truthjet_nCharged");
+      float tjetpt = jet->getAttribute<float>("DFCommonJets_QGTagger_truthjet_pt")*0.001;
+      float tjeteta = jet->getAttribute<float>("DFCommonJets_QGTagger_truthjet_eta");
+      ATH_MSG_DEBUG("truth jet pdgid: " << pdgid << " pt: " << tjetpt);
+      if ( pdgid<0 ) {
+        ATH_MSG_DEBUG("Undefined pdg ID: setting weight to 1");
+        return StatusCode::SUCCESS;
+      }
+
+      // if the jet is outside of the measurement fiducial region
+      // the systematic uncertainty is set to 0
+      if ( tjetpt < m_jetPtMin*1e-3 || std::abs(tjeteta) > m_jetEtaMax ) {
+        ATH_MSG_DEBUG( "Outside of fiducial region: setting weight to 1" );
+        return StatusCode::SUCCESS;
+      }
+
+      if ( pdgid==21 && m_appliedSystEnum!=QG_NCHARGEDTOPO ) {
+        ptbin = m_hgluon->GetXaxis()->FindBin(tjetpt);
+        ntrkbin = m_hgluon->GetYaxis()->FindBin(tntrk);
+        weight = m_hgluon->GetBinContent(ptbin,ntrkbin);
+      }// gluon
+      else if ( pdgid < 5 && m_appliedSystEnum != QG_NCHARGEDTOPO && m_appliedSystEnum != QG_TRACKEFFICIENCY && m_appliedSystEnum != QG_TRACKFAKES ) {
+        ptbin = m_hquark->GetXaxis()->FindBin(tjetpt);
+        ntrkbin = m_hquark->GetYaxis()->FindBin(tntrk);
+        weight = m_hquark->GetBinContent(ptbin,ntrkbin);
+      }//quarks
+      else {
+        ATH_MSG_INFO( "Neither quark nor gluon jet: setting weight to 1" );
+      }
+    }
+
+    // check if jet contains at least one NTracks variables
+    // prefer to use DFCommonJets* version
+    int ntrk = -1;
+    if ( recosyst) {
+      SG::ReadDecorHandle<xAOD::JetContainer, int> readNumTrkPt500PV(m_readNumTrkPt500PVKey);
+      SG::ReadDecorHandle<xAOD::JetContainer, int> readNtrk(m_readNtrkKey);
+      if ( readNtrk.isAvailable() ) ntrk = readNtrk(*jet);
+      else if ( readNumTrkPt500PV.isAvailable() ) ntrk = readNumTrkPt500PV(*jet);
+      else ATH_MSG_ERROR("Neither NumTrkPt500PV nor DFCommonJets_QGTagger_NTracks is available for your jet. Please add it before running mode 1 JetQGTagger.");
+      //float rjetpt = jet->getAttribute<float>("truthjet_pt")*0.001;
+      float rjetpt = jet->pt()*1e-3;
+      float rjeteta = jet->eta();
+
+      ATH_MSG_DEBUG("reco jet Pt: " << rjetpt << " eta: " << rjeteta);
+      if( rjetpt<m_jetPtMin*1e-3 || std::abs(rjeteta)>m_jetEtaMax){
+        ATH_MSG_DEBUG("Outside of fiducial region: setting weight to 1");
+        return StatusCode::SUCCESS;
+      }
+
+      if ( pdgid < 5 ) {
+        ptbin = m_hquark->GetXaxis()->FindBin(rjetpt);
+        ntrkbin = m_hquark->GetYaxis()->FindBin(ntrk);
+        weight = m_hquark->GetBinContent(ptbin,ntrkbin);
+      }
+      if ( pdgid == 21 ) {
+        ptbin = m_hgluon->GetXaxis()->FindBin(rjetpt);
+        ntrkbin = m_hgluon->GetYaxis()->FindBin(ntrk);
+        weight = m_hgluon->GetBinContent(ptbin,ntrkbin);
+      }
+    }
+
+    ATH_MSG_DEBUG("weight: " << weight);
+
+    return StatusCode::SUCCESS;
+
+  }
+
+  StatusCode JetQGTagger::getNTrack(const xAOD::Jet * jet, /*const xAOD::Vertex * pv,*/ int &ntracks) const {
+
+    ATH_MSG_DEBUG( "Counting the number of tracks in the jet" );
+
+    ntracks = 0;
+    // loop over the tracks associated to the jet of interest
+    std::vector<const xAOD::IParticle*> jettracks;
+
+    if(!jet->getAssociatedObjects<xAOD::IParticle>(xAOD::JetAttribute::GhostTrack,jettracks)){
+      ATH_MSG_ERROR("This jet has no associated objects, so it will not be tagged. Please check the jet collection you are using.");
+      ntracks=999;
+      //Returning failure as this jet has no associated objects and we do not want to wrongly classify it as a gluon or quark using tag(). 
+      //Physics should be independent of skimming, which may have removed tracks.
+      //So we are returning a failure, and throwing an exception. 
+      return StatusCode::FAILURE;
+    }
+
+    for (size_t i = 0; i < jettracks.size(); i++) {
+
+      const xAOD::TrackParticle* trk = static_cast<const xAOD::TrackParticle*>(jettracks[i]);
+
+      if(!trk){
+        ATH_MSG_ERROR("This jet has null tracks, so it will not be tagged. Please check the jet collection you are using.");
+        ntracks=998;
+        //Returning failure as this jet has null tracks and we do not want to wrongly classify it as a gluon or quark using tag(). 
+        //Physics should be independent of skimming, which may have introduced null tracks.
+        //So we are returning a failure, and throwing an exception. 
+        return StatusCode::FAILURE;
+      }
+
+      // if you are applying a systematic variation then
+      // FRANCESCO ADD COMMENT
+
+      bool acceptSyst = true;
+
+      if ( m_appliedSystEnum==QG_TRACKEFFICIENCY )
+        acceptSyst = ( m_trkTruthFilterTool->accept(trk) && m_jetTrackFilterTool->accept(trk,jet) );
+      else if ( m_appliedSystEnum==QG_TRACKFAKES )
+        acceptSyst = m_trkFakeTool->accept(trk);
+
+      if (!acceptSyst)
+        continue;
+
+      // only count tracks with selections
+      // 1) pt>500 MeV
+      // 2) accepted track from InDetTrackSelectionTool with CutLevel==Loose
+      // 3) associated to primary vertex OR within 3mm of the primary vertex
+      bool accept = (trk->pt()>500 &&
+          m_trkSelectionTool->accept(*trk)
+          // TODO: Implement alternative to TrackParticle::vertex()
+          //&& (trk->vertex()==pv || (!trk->vertex() && std::abs((trk->z0()+trk->vz()-pv->z())*sin(trk->theta()))<3.))
+          );
+      if (!accept)
+        continue;
+
+      ntracks++;
+    }
+
+    return StatusCode::SUCCESS;
+  }
+
+
+
+  StatusCode JetQGTagger::getNTrackWeight(const xAOD::Jet * jet, double &weight) const {
+
+    ATH_MSG_DEBUG( "Getting the jet weight for systematic variation " << m_appliedSystEnum );
+
+    // initially set the weight to unity
+    // this is the weight returned if you are *not* dealing with a systematic variation
+    weight = 1.0;
+
+    // if you are not dealing with a systematic variation, then exit
+    if ( m_appliedSystEnum!=QG_NCHARGEDTOPO &&
+        m_appliedSystEnum!=QG_NCHARGEDEXP_UP &&
+        m_appliedSystEnum!=QG_NCHARGEDME_UP &&
+        m_appliedSystEnum!=QG_NCHARGEDPDF_UP &&
+        m_appliedSystEnum!=QG_NCHARGEDEXP_DOWN &&
+        m_appliedSystEnum!=QG_NCHARGEDME_DOWN &&
+        m_appliedSystEnum!=QG_NCHARGEDPDF_DOWN
+       )
+      return StatusCode::SUCCESS;
+
+    int pdgid = jet->getAttribute<int>("PartonTruthLabelID");
+    if ( pdgid<0 ) {
+      ATH_MSG_DEBUG("Undefined pdg ID: setting weight to 1");
+      return StatusCode::SUCCESS;
+    }
+
+    // getting the associated truth jet
+    // FRANCESCO COMMENT
+    const xAOD::Jet* tjet;
+    if(jet->isAvailable< ElementLink<xAOD::JetContainer> >("GhostTruthAssociationLink") ){
+      ATH_MSG_DEBUG("Accessing GhostTruthAssociationLink: is available");
+      if(jet->auxdata< ElementLink<xAOD::JetContainer> >("GhostTruthAssociationLink").isValid() ){
+        ATH_MSG_DEBUG("Accessing GhostTruthAssociationLink: is valid");
+        ElementLink<xAOD::JetContainer> truthlink = jet->auxdata< ElementLink<xAOD::JetContainer> >("GhostTruthAssociationLink");
+        if(truthlink)
+          tjet = * truthlink;
+        else{
+          ATH_MSG_WARNING("Cannot access truth: setting weight to 1");
+          return StatusCode::SUCCESS;
+        }//endelse NULL pointer
+      }
+      else {
+        ATH_MSG_WARNING("Cannot access truth: setting weight to 1");
+        return StatusCode::SUCCESS;
+      } //endelse isValid
+    } //endif isAvailable
+    else {
+      ATH_MSG_WARNING("Cannot access truth: setting weight to 1");
+      return StatusCode::SUCCESS;
+    }//endelse isAvailable
+
+    // if the jet is outside of the measurement fiducial region
+    // the systematic uncertainty is set to 0
+    double tjetpt = tjet->pt()*0.001;
+    double tjeteta = tjet->eta();
+    if( tjetpt<m_jetPtMin*1.0e-3 || std::abs(tjeteta)>m_jetEtaMax){
+      ATH_MSG_DEBUG("Outside of fiducial region: setting weight to 1");
+      return StatusCode::SUCCESS;
+    }
+
+    // compute truth ntrk
+    int tntrk = 0;
+    for (size_t ind = 0; ind < tjet->numConstituents(); ind++) {
+      const xAOD::TruthParticle *part = static_cast<const xAOD::TruthParticle*>(tjet->rawConstituent(ind));
+
+      // dont count invalid truth particles
+      if (!part) continue;
+      // require the particle in the final state
+      if( ! (part->status() == 1) ) continue;
+      // require that the particle type (e.g. production type) be valid (e.g. not primaries)
+      if ((part->barcode())>2e5) continue;
+      // pt>500 MeV
+      if( ! (part->pt()>500.) )  continue;
+      // charged
+      if( !(part->isCharged()) ) continue;
+      // this seems redundant
+      // FRANCESCO COMMENT
+      double pt = part->pt();
+      if( pt>500 ) tntrk++;
+
+    }
+
+    // use the lookup tables loaded in initialize() to find the systematically shifted weights
+    if ( pdgid==21 && m_appliedSystEnum!=QG_NCHARGEDTOPO){
+      int ptbin = m_hgluon->GetXaxis()->FindBin(tjetpt);
+      int ntrkbin = m_hgluon->GetYaxis()->FindBin(tntrk);
+      weight = m_hgluon->GetBinContent(ptbin,ntrkbin);
+    }// gluon
+    else if ( pdgid<5 ){
+      int ptbin = m_hquark->GetXaxis()->FindBin(tjetpt);
+      int ntrkbin = m_hquark->GetYaxis()->FindBin(tntrk);
+      weight = m_hquark->GetBinContent(ptbin,ntrkbin);
+    }//quarks
+    else{
+      ATH_MSG_DEBUG("Neither quark nor gluon jet: setting weight to 1");
+    }
+
+    return StatusCode::SUCCESS;
+  }
+
+  StatusCode JetQGTagger::sysApplySystematicVariation(const SystematicSet& systSet){
+
+    // FRANCESCO COMMENT
+    ATH_MSG_DEBUG( "Applying systematic variation by weight" );
+
+    // by default no systematics are applied
+    m_appliedSystEnum = QG_NONE;
+
+    if (systSet.size()==0) {
+      ATH_MSG_DEBUG("No affecting systematics received.");
+      return StatusCode::SUCCESS;
+    }
+    else if (systSet.size()>1) {
+      ATH_MSG_WARNING("Tool does not support multiple systematics, returning unsupported" );
+      return StatusCode::FAILURE;
+    }
+    SystematicVariation systVar = *systSet.begin();
+    if (systVar == SystematicVariation(""))
+      m_appliedSystEnum = QG_NONE;
+    else if (systVar == QGntrackSyst::nchargedtopo){
+      m_appliedSystEnum = QG_NCHARGEDTOPO;
+      m_hquark=m_topo_hquark;
+    }
+    else if (systVar == QGntrackSyst::trackefficiency)
+      m_appliedSystEnum = QG_TRACKEFFICIENCY;
+    else if (systVar == QGntrackSyst::trackfakes)
+      m_appliedSystEnum = QG_TRACKFAKES;
+    else if (systVar == QGntrackSyst::nchargedexp_up){
+      m_appliedSystEnum = QG_NCHARGEDEXP_UP;
+      m_hquark=m_exp_hquark_up;
+      m_hgluon=m_exp_hgluon_up;
+    }
+    else if (systVar == QGntrackSyst::nchargedme_up){
+      m_appliedSystEnum = QG_NCHARGEDME_UP;
+      m_hquark=m_me_hquark_up;
+      m_hgluon=m_me_hgluon_up;
+    }
+    else if (systVar == QGntrackSyst::nchargedpdf_up){
+      m_appliedSystEnum = QG_NCHARGEDPDF_UP;
+      m_hquark=m_pdf_hquark_up;
+      m_hgluon=m_pdf_hgluon_up;
+    }
+    else if (systVar == QGntrackSyst::nchargedexp_down){
+      m_appliedSystEnum = QG_NCHARGEDEXP_DOWN;
+      m_hquark=m_exp_hquark_down;
+      m_hgluon=m_exp_hgluon_down;
+    }
+    else if (systVar == QGntrackSyst::nchargedme_down){
+      m_appliedSystEnum = QG_NCHARGEDME_DOWN;
+      m_hquark=m_me_hquark_down;
+      m_hgluon=m_me_hgluon_down;
+    }
+    else if (systVar == QGntrackSyst::nchargedpdf_down){
+      m_appliedSystEnum = QG_NCHARGEDPDF_DOWN;
+      m_hquark=m_pdf_hquark_down;
+      m_hgluon=m_pdf_hgluon_down;
+    }
+    else if (systVar == QGntrackSyst::trackeff){
+      m_appliedSystEnum = QG_TRACKEFFICIENCY;
+      m_hquark = m_trackeff_hquark;
+      m_hgluon = m_trackeff_hgluon;
+    }
+    else if (systVar == QGntrackSyst::fake){
+      m_appliedSystEnum = QG_TRACKFAKES;
+      m_hquark = m_fake_hquark;
+      m_hgluon = m_fake_hgluon;
+    }
+
+    else {
+      ATH_MSG_WARNING("unsupported systematic applied");
+      return StatusCode::FAILURE;
+    }
+
+    ATH_MSG_DEBUG("applied systematic is " << m_appliedSystEnum);
+    return StatusCode::SUCCESS;
+  }
+
+  StatusCode JetQGTagger::loadHist(TH2D *&hist,std::string fname,std::string histname){
+
+    std::string filename = PathResolverFindCalibFile( (m_calibArea+fname).c_str() );
+    ATH_MSG_INFO("CALIB FILE: " << filename << " histo: " << histname);
+    if (filename.empty()){
+      ATH_MSG_ERROR( "Could NOT resolve file name " << fname );
+      return StatusCode::FAILURE;
+    }
+    else{
+      ATH_MSG_DEBUG( "Path found = " << filename );
+    }
+    TFile* infile = TFile::Open(filename.c_str());
+    hist = dynamic_cast<TH2D*>(infile->Get(histname.c_str()));
+    hist->SetDirectory(0);
+    return StatusCode::SUCCESS;
+  }
+
+
+} /* namespace CP */
diff --git a/Reconstruction/Jet/BoostedJetTaggers/Root/JetQGTaggerBDT.cxx b/Reconstruction/Jet/BoostedJetTaggers/Root/JetQGTaggerBDT.cxx
new file mode 100644
index 000000000000..b0f98b931275
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/Root/JetQGTaggerBDT.cxx
@@ -0,0 +1,380 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "BoostedJetTaggers/JetQGTaggerBDT.h"
+
+#include <TSystem.h>
+
+#include "InDetTrackSelectionTool/InDetTrackSelectionTool.h"
+
+#include "xAODTracking/VertexContainer.h"
+
+namespace CP {
+
+  JetQGTaggerBDT::JetQGTaggerBDT( const std::string& name ) :
+    JSSTaggerBase( name ),
+    m_BDTmethod("BDT_method"),
+    m_trkSelectionTool(name+"_trackselectiontool", this)
+  {
+
+    /// Jet kinematics
+    declareProperty( "JetPtMin",              m_jetPtMin = 20000.0);
+    declareProperty( "JetPtMax",              m_jetPtMax = 1500000.0);
+    m_jetEtaMax = 2.5; /// Replace base class default value for JetEtaMax
+
+    /// Tagger configuration
+    m_calibArea = "BoostedJetTaggers/JetQGTaggerBDT/Oct18/"; /// Overwrite base class default
+    declareProperty( "TMVAConfigFile", m_tmvaConfigFileName="TMVAClassification_BDTQGTagger_Oct18_BDT.weights.xml");
+    declareProperty( "UseJetVars",  m_mode = 1); /// 0 uses the tracks. 1 uses variables from the jets (default)
+
+  }
+
+  StatusCode JetQGTaggerBDT::initialize() {
+
+    ATH_MSG_INFO( "Initializing JetQGTaggerBDT tool" );
+
+    if( ! m_configFile.empty() ) {
+      ATH_MSG_INFO( "Using config file : "<< m_configFile );
+      // check for the existence of the configuration file
+      std::string configPath;
+      configPath = PathResolverFindDataFile(("BoostedJetTaggers/"+m_configFile).c_str());
+
+      /* https://root.cern.ch/root/roottalk/roottalk02/5332.html */
+      FileStat_t fStats;
+      int fSuccess = gSystem->GetPathInfo(configPath.c_str(), fStats);
+      if(fSuccess != 0){
+        ATH_MSG_ERROR("Recommendations file could not be found : " << configPath);
+        return StatusCode::FAILURE;
+      }
+      else {
+        ATH_MSG_DEBUG("Recommendations file was found : "<<configPath);
+      }
+
+      TEnv configReader;
+      if(configReader.ReadFile( configPath.c_str(), EEnvLevel(0) ) != 0 ) {
+        ATH_MSG_ERROR( "Error while reading config file : "<< configPath );
+        return StatusCode::FAILURE;
+      }
+
+      // get the CVMFS calib area where stuff is stored
+      m_calibArea = configReader.GetValue("CalibArea" ,"");
+
+      // get the name/path of the JSON config
+      m_tmvaConfigFileName = configReader.GetValue("TMVAConfigFile" ,"");
+
+      m_strScoreCut = configReader.GetValue("ScoreCut" ,"");
+
+      ATH_MSG_INFO( "scoreCut: "<<m_strScoreCut );
+
+    }
+    // if the calibArea is specified to be "Local" then it looks in the same place as the top level configs
+    if( m_calibArea.empty() ){
+      ATH_MSG_ERROR( "You need to specify where the calibArea is as either being Local or on CVMFS" );
+      return StatusCode::FAILURE;
+    }
+    else if(m_calibArea.compare("Local")==0){
+      std::string localCalibArea = "BoostedJetTaggers/share/JetQGTaggerBDT/";
+      ATH_MSG_INFO( "Using Local calibArea " << localCalibArea );
+      // convert the JSON config file name to the full path
+      m_tmvaConfigFilePath = PathResolverFindCalibFile(localCalibArea+m_tmvaConfigFileName);
+    }
+    else{
+      ATH_MSG_INFO( "Using CVMFS calibArea" );
+      // get the config file from CVMFS
+      // necessary because xml files are too large to house on the data space
+      m_tmvaConfigFilePath = PathResolverFindCalibFile( (m_calibArea+m_tmvaConfigFileName).c_str() );
+    }
+
+    /// Make sure score cut string is not empty
+    if(m_strScoreCut.empty()){
+      ATH_MSG_ERROR( "Score cut function is empty!" );
+      return StatusCode::FAILURE;
+    }
+    // set up InDet selection tool
+    ANA_CHECK( ASG_MAKE_ANA_TOOL( m_trkSelectionTool,  InDet::InDetTrackSelectionTool ) );
+    ANA_CHECK( m_trkSelectionTool.setProperty( "CutLevel", "Loose" ) );
+    ANA_CHECK( m_trkSelectionTool.retrieve() );
+
+    // read json file for DNN weights
+    ATH_MSG_INFO( "BDT Tagger configured with: " << m_tmvaConfigFilePath );
+
+    // -- Initialize TMVA for BDTs
+    TMVA::Tools::Instance();
+    m_bdtTagger = std::make_unique<TMVA::Reader>( "!Color:!Silent" );
+
+    m_bdtTagger->AddVariable( "NTracks", &m_ntracks);
+    m_bdtTagger->AddVariable( "TrackWidth", &m_trackwidth  );
+    m_bdtTagger->AddVariable( "JetPt",  &m_pt );
+    m_bdtTagger->AddVariable( "JetEta", &m_eta  );
+    m_bdtTagger->AddVariable( "TrackC1", &m_trackC1  );
+
+    // configure the bdt
+    m_bdtTagger->BookMVA( m_BDTmethod.c_str(), m_tmvaConfigFilePath.c_str() );
+
+    /// Call base class initialize
+    ATH_CHECK( JSSTaggerBase::initialize() );
+
+    return StatusCode::SUCCESS;
+  
+  }
+
+  StatusCode JetQGTaggerBDT::tag( const xAOD::Jet& jet ) const {
+    
+    ATH_MSG_DEBUG( "Obtaining BDT QG result" );
+
+    /// Create asg::AcceptData object
+    asg::AcceptData acceptData( &m_acceptInfo );
+
+    /// Reset the AcceptData cut results
+    ATH_CHECK( resetCuts( acceptData ) );
+
+    /// Check basic kinematic selection
+    ATH_CHECK( checkKinRange( jet, acceptData ) );
+
+    /// Create WriteDecorHandles
+    SG::WriteDecorHandle<xAOD::JetContainer, bool> decTagged(m_decTaggedKey);
+
+    /// TODO: Is this actually needed?
+    if ( !passKinRange(jet) ) {
+      decTagged(jet) = false;
+      return StatusCode::SUCCESS;
+    }
+
+    // get BDT score
+    float jet_score = getScore( jet, acceptData );
+    ATH_MSG_DEBUG(TString::Format("jet score %g",jet_score) );
+
+    //get cut from cut function
+    float cut = m_funcScoreCut->Eval(jet.pt()/1000.);
+
+    if ( jet_score < cut ) acceptData.setCutResult("QuarkJetTag", true);
+    decTagged(jet) = acceptData.getCutResult( "QuarkJetTag" );
+
+    // return the AcceptData object that you created and filled
+    return StatusCode::SUCCESS;
+
+  }
+
+  float JetQGTaggerBDT::getScore( const xAOD::Jet& jet, asg::AcceptData &acceptData ) const {
+
+    /// Load the new values of the variables for this jet
+    bool validVars = getJetProperties( jet, acceptData );
+
+    /// evaluate bdt
+    float bdt_score(-666.);
+    if ( !validVars ) {
+      ATH_MSG_WARNING( "One (or more) tagger input variable has an undefined value (NaN), setting score to -666" );
+      return bdt_score;
+    }
+    bdt_score = m_bdtTagger->EvaluateMVA( m_BDTmethod.c_str() );
+
+    return bdt_score;
+  }
+
+  bool JetQGTaggerBDT::getJetProperties( const xAOD::Jet& jet, asg::AcceptData &acceptData ) const {
+    /* Update the jet substructure variables for this jet */
+
+    m_pt  = jet.pt()/1000.0;
+    m_eta = jet.eta();
+
+    ATH_MSG_DEBUG( TString::Format("pT: %g, eta: %g",m_pt,m_eta) );
+
+    m_ntracks = -1.;
+    m_trackwidth = -1.;
+    m_trackC1 = -1.;
+
+    bool validVars = true;
+
+    if ( m_mode == 1 ) {
+      validVars = getPrecomputedVariables( jet, acceptData );
+    }
+    else if( m_mode == 0 ) {
+      validVars = calculateVariables( jet, acceptData );
+    }
+
+    if ( !validVars ) {
+      ATH_MSG_ERROR( "Can't determine QG tagging variables! Try different mode." );
+    }
+    
+    return validVars;
+  
+  }
+
+  bool JetQGTaggerBDT::getPrecomputedVariables( const xAOD::Jet& jet, asg::AcceptData &acceptData ) const {
+
+    bool validVars = true;
+
+    int ntrk = -1;
+    float trkWidth = -1.;
+    float trkC1 = -1.;
+
+    if ( !jet.getAttribute<int>("DFCommonJets_QGTagger_NTracks", ntrk) ) {
+      if ( m_nWarnVar++ < m_nWarnMax ) ATH_MSG_WARNING( "Unable to retrieve DFCommonJets_QGTagger_NTracks" );
+      else ATH_MSG_DEBUG( "Unable to retrieve DFCommonJets_QGTagger_NTracks" );
+      acceptData.setCutResult("ValidEventContent", false);
+      validVars = false;
+    }
+    if ( !jet.getAttribute<float>("DFCommonJets_QGTagger_TracksWidth", trkWidth) ) {
+      if ( m_nWarnVar++ < m_nWarnMax )ATH_MSG_WARNING( "Unable to retrieve DFCommonJets_QGTagger_TracksWidth" );
+      else ATH_MSG_DEBUG( "Unable to retrieve DFCommonJets_QGTagger_TracksWidth" );
+      acceptData.setCutResult("ValidEventContent", false);
+      validVars = false;
+    }
+    if ( !jet.getAttribute<float>("DFCommonJets_QGTagger_TracksC1", trkC1) ) {
+      if ( m_nWarnVar++ < m_nWarnMax ) ATH_MSG_WARNING( "Unable to retrieve DFCommonJets_QGTagger_TracksC1" );
+      else ATH_MSG_DEBUG( "Unable to retrieve DFCommonJets_QGTagger_TracksC1" );
+      acceptData.setCutResult("ValidEventContent", false);
+      validVars = false;
+    }
+
+    m_ntracks = (float) ntrk;
+    m_trackwidth = trkWidth;
+    m_trackC1 = trkC1;
+
+    return validVars;
+  
+  }
+
+  bool JetQGTaggerBDT::calculateVariables( const xAOD::Jet& jet, asg::AcceptData &acceptData ) const {
+    //calculate q/g tagging variables from GhostTracks associated to jet
+    //some derivations apply slimming to these tracks, which would lead to wrong values.
+    //so we compare the number of GhostTracks to NumTrkPt500 (i.e. nTracks)
+    //      if they are "close enough" we can proceed
+
+    bool validVars = true;
+    bool isValid = true;
+    const xAOD::Vertex* primvertex {nullptr};
+
+    const xAOD::VertexContainer* vxCont = nullptr;
+    if ( evtStore()->retrieve( vxCont, "PrimaryVertices" ).isFailure() ) {
+      if ( m_nWarnVar++ < m_nWarnMax ) ATH_MSG_WARNING( "Unable to retrieve primary vertex container PrimaryVertices" );
+      else ATH_MSG_DEBUG( "Unable to retrieve primary vertex container PrimaryVertices" );
+      acceptData.setCutResult("ValidEventContent", false);
+      isValid = false;
+    }
+    else if ( vxCont->empty() ) {
+      if ( m_nWarnVar++ < m_nWarnMax ) ATH_MSG_WARNING( "Event has no primary vertices!" );
+      ATH_MSG_DEBUG( "Event has no primary vertices!" );
+      acceptData.setCutResult("ValidEventContent", false);
+      isValid = false;
+    }
+    else {
+      for ( const auto& vx : *vxCont ) {
+        // take the first vertex in the list that is a primary vertex
+        if ( vx->vertexType()==xAOD::VxType::PriVtx ) {
+          primvertex = vx;
+          break;
+        }
+      }
+    }
+    if ( !primvertex ) isValid = false;
+
+    if ( !isValid ) {
+      validVars = false;
+      return validVars;
+    }
+
+    //NTracks
+    std::vector<int> nTrkVec;
+    if(jet.getAttribute(xAOD::JetAttribute::NumTrkPt500, nTrkVec)){
+      ATH_MSG_DEBUG(nTrkVec.size());
+      m_ntracks = (float) nTrkVec[primvertex->index()];
+    }
+    else
+      //if NumTrkPt500 is not available, I can't confirm that the number of GhostTracks is correct (i.e. unslimmed)
+      validVars = false;
+
+    //TrackWidth
+    bool undefTrackWidth = false;
+    std::vector<float> trkWidthVec;
+    if(jet.getAttribute(xAOD::JetAttribute::TrackWidthPt500, trkWidthVec)){
+      ATH_MSG_DEBUG(trkWidthVec.size());
+      m_trackwidth = trkWidthVec[primvertex->index()];
+    }
+    else
+      //if TrackWidthPt500 is not available, we can maybe calculate it from tracks
+      undefTrackWidth = true;
+    float weightedwidth = 0.;
+
+    //TrackC1
+    float beta = 0.2;
+    float weightedwidth2 = 0.;
+    float sumPt = 0.;
+
+    std::vector<const xAOD::TrackParticle*> trackParttmp;
+    if(!jet.getAssociatedObjects("GhostTrack",trackParttmp)){
+      ATH_MSG_ERROR("This jet has no associated objects");
+      validVars = false;
+    }
+    //track selection
+    for(unsigned i=trackParttmp.size();i>0; i--){
+      if(!trackParttmp[i-1]){
+        trackParttmp.erase(trackParttmp.begin()+i-1);
+        continue;
+      }
+      const xAOD::TrackParticle* trk = static_cast<const xAOD::TrackParticle*>(trackParttmp[i-1]);
+      bool accept = (trk->pt()>500 &&
+          m_trkSelectionTool->accept(*trk)
+          // TODO: Implement alternative to TrackParticle::vertex()
+          //&& (trk->vertex()==primvertex || (!trk->vertex() && std::abs((trk->z0()+trk->vz()-primvertex->z())*sin(trk->theta()))<3.))
+      );
+      if (!accept){
+        trackParttmp.erase(trackParttmp.begin()+i-1);
+      }
+    }
+
+    if(! isCorrectNumberOfTracks(m_ntracks,trackParttmp.size())){
+      ATH_MSG_ERROR("Number of ghost associated tracks wrong!");
+      validVars = false;
+    }
+
+    //calculate TrackC1 (and TrackWidth if necessary)
+    for(unsigned i=0; i<trackParttmp.size(); i++){
+      double ipt = trackParttmp.at(i)->pt();
+      double ieta = trackParttmp.at(i)->eta();
+      double iphi = trackParttmp.at(i)->phi();
+      sumPt += ipt;
+      if(undefTrackWidth){
+        double deta_i = trackParttmp.at(i)->eta() - jet.eta();
+        double dphi_i = TVector2::Phi_mpi_pi(trackParttmp.at(i)->phi() - jet.phi());
+        double dR_i = sqrt( deta_i*deta_i + dphi_i*dphi_i );
+        weightedwidth += ipt * dR_i;
+      }
+
+      for(unsigned j=i+1; j<trackParttmp.size(); j++){
+        double deta = ieta - trackParttmp.at(j)->eta();
+        double dphi = TVector2::Phi_mpi_pi(iphi - trackParttmp.at(j)->phi());
+        double dR = sqrt( deta*deta + dphi*dphi );
+        weightedwidth2 += ipt * trackParttmp.at(j)->pt() * pow(dR,beta);
+      }
+    }
+
+    if(undefTrackWidth)
+      m_trackwidth = sumPt>0 ? weightedwidth/sumPt : -0.1;
+    m_trackC1 = sumPt>0 ? weightedwidth2/(sumPt*sumPt) : -0.1;
+
+    return validVars;
+  }
+
+  bool JetQGTaggerBDT::isCorrectNumberOfTracks(int expectedNTracks, int nTracksFromGhostTracks) const{
+    //some derivations do not store all tracks associated to the jet.
+    //In this case the calculation of the tagging variables will be wrong.
+    //The requirements are fairly loose, because a few tracks may get lost in the derivation production.
+    //But it will fail quickly if the too many tracks were slimmed away.
+    if(nTracksFromGhostTracks == 0){
+      if(expectedNTracks == 0)
+        return true;
+      if(abs(expectedNTracks-nTracksFromGhostTracks) < 3)
+        return true;
+      else
+        return false;
+    }else if(expectedNTracks/nTracksFromGhostTracks < 0.5 && abs(expectedNTracks-nTracksFromGhostTracks) > 5){
+      return false;
+    }
+    return true;
+  }
+
+} /* namespace CP */
+
+// the end
diff --git a/Reconstruction/Jet/BoostedJetTaggers/Root/SmoothedWZTagger.cxx b/Reconstruction/Jet/BoostedJetTaggers/Root/SmoothedWZTagger.cxx
new file mode 100644
index 000000000000..9be6b5c68269
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/Root/SmoothedWZTagger.cxx
@@ -0,0 +1,365 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "BoostedJetTaggers/SmoothedWZTagger.h"
+
+#include "xAODTracking/VertexContainer.h"
+
+SmoothedWZTagger::SmoothedWZTagger( const std::string& name ) :
+  JSSTaggerBase( name )
+{
+
+  /// Functional forms for cuts
+  declareProperty( "MassCutLowFunc",  m_strMassCutLow = "",  "Lower mass cut");
+  declareProperty( "MassCutHighFunc", m_strMassCutHigh = "", "Higher mass cut");
+  declareProperty( "D2CutFunc",       m_strD2Cut = "",       "Upper cut on D2");
+  declareProperty( "NtrkCutFunc",     m_strNtrkCut = "",     "Upper cut on Ntrk");
+
+}
+
+StatusCode SmoothedWZTagger::initialize() {
+
+  ATH_MSG_INFO( "Initializing SmoothedWZTagger tool" );
+
+  /// Pt values are defined in GeV
+  m_ptGeV = true;
+
+  /// Use mass cut
+  m_useMassCut = true;
+
+  if ( ! m_configFile.empty() ) {
+
+    /// Get configReader
+    ATH_CHECK( getConfigReader() );
+
+    if ( m_wkpt.empty() ) {
+      m_strMassCutLow = m_configReader.GetValue("MassCutLow", "");
+      m_strMassCutHigh = m_configReader.GetValue("MassCutHigh", "");
+      m_strD2Cut = m_configReader.GetValue("D2Cut", "");
+      m_strNtrkCut = m_configReader.GetValue("NtrkCut", "");
+    }
+    else {
+      m_strMassCutLow = m_configReader.GetValue((m_wkpt+".MassCutLow").c_str(), "");
+      m_strMassCutHigh = m_configReader.GetValue((m_wkpt+".MassCutHigh").c_str(), "");
+      m_strD2Cut = m_configReader.GetValue((m_wkpt+".D2Cut").c_str(), "");
+      m_strNtrkCut = m_configReader.GetValue((m_wkpt+".NtrkCut").c_str(), "");
+    }
+
+    /// Get min and max jet pt
+    m_jetPtMin = m_configReader.GetValue("pTCutLow", 200.0);
+    m_jetPtMax = m_configReader.GetValue("pTCutHigh", 4000.0);
+
+    /// Get the decoration name
+    m_decorationName = m_configReader.GetValue("DecorationName", "");
+
+    /// Get the scale factor configuration
+    m_calcSF = m_configReader.GetValue("CalcSF", false);
+    if ( m_calcSF ) {
+      m_weightDecorationName = m_configReader.GetValue("WeightDecorationName", "");
+      m_weightFileName = m_configReader.GetValue("WeightFile", "");
+      m_weightHistogramName = m_configReader.GetValue("WeightHistogramName", "");
+      m_efficiencyHistogramName = m_configReader.GetValue("EfficiencyHistogramName", "");
+      m_weightFlavors = m_configReader.GetValue("WeightFlavors", "");
+    
+      /// Get truth label name information
+      m_truthLabelName = m_configReader.GetValue("TruthLabelName", "R10TruthLabel_R21Consolidated");
+
+      if ( m_calibArea.compare("Local") == 0 ) {
+        m_weightConfigPath = PathResolverFindCalibFile(("$WorkDir_DIR/data/BoostedJetTaggers/SmoothedWZTaggers/"+m_weightFileName).c_str());      
+      }
+      else if ( m_calibArea.find("eos") != std::string::npos ) {
+        m_weightConfigPath = PathResolverFindCalibFile((m_calibArea+"/"+m_weightFileName).c_str());
+      }
+      else {
+        m_weightConfigPath = PathResolverFindCalibFile(("BoostedJetTaggers/"+m_calibArea+"/"+m_weightFileName).c_str());
+      }
+    }
+    
+  }
+  else { /// No config file
+    /// Assume the cut functions have been set through properties.
+    /// Check they are non empty
+    if( m_strD2Cut.empty() || m_strMassCutLow.empty() || m_strMassCutHigh.empty() ||
+        ((m_weightDecorationName.empty() ||
+          m_weightHistogramName.empty() ||
+	  m_weightFlavors.empty()) && m_calcSF) ) {
+      ATH_MSG_ERROR( "No config file provided AND no parameters specified." ) ;
+      return StatusCode::FAILURE;
+    }
+  }
+
+  /// Set flag to indicate if Ntrk cut is used
+  m_useNtrk = !m_strNtrkCut.empty();
+
+  /// Transform these strings into functions
+  m_funcD2Cut = std::make_unique<TF1>("strD2Cut", m_strD2Cut.c_str(), 0, 14000);
+  if ( m_useNtrk ) m_funcNtrkCut = std::make_unique<TF1>("strNtrkCut", m_strNtrkCut.c_str(), 0, 14000);
+
+  ATH_MSG_INFO( "Smoothed WZ Tagger tool initialized" );
+  ATH_MSG_INFO( "  Mass cut low      : " << m_strMassCutLow );
+  ATH_MSG_INFO( "  Mass cut High     : " << m_strMassCutHigh );
+  ATH_MSG_INFO( "  D2 cut low        : " << m_strD2Cut );
+  if ( m_useNtrk )
+    ATH_MSG_INFO( "  Ntrk cut low      : " << m_strNtrkCut );
+  ATH_MSG_INFO( "  DecorationName    : " << m_decorationName );
+  if ( m_calcSF ) {
+    ATH_MSG_INFO( "weightDecorationName    : " << m_weightDecorationName );
+    ATH_MSG_INFO( "weightFile              : " << m_weightFileName );
+    ATH_MSG_INFO( "weightHistogramName     : " << m_weightHistogramName );
+    ATH_MSG_INFO( "efficiencyHistogramName : " << m_efficiencyHistogramName );
+    ATH_MSG_INFO( "weightFlavors           : " << m_weightFlavors );
+    ATH_MSG_INFO( "TruthLabelName          : " << m_truthLabelName );
+  }
+  ATH_MSG_INFO( "  Pt cut low        : " << m_jetPtMin );
+  ATH_MSG_INFO( "  Pt cut high       : " << m_jetPtMax );
+
+  /// Set the possible states that the tagger can be left in after the JSSTaggerBase::tag() function is called
+  m_acceptInfo.addCut( "PassMassLow", "mJet > mCutLow" );
+  m_acceptInfo.addCut( "PassMassHigh", "mJet < mCutHigh" );
+  m_acceptInfo.addCut( "PassD2", "D2Jet < D2Cut" );
+  if ( m_useNtrk ) {
+    m_acceptInfo.addCut( "PassNtrk", "NtrkJet < NtrkCut" );
+  }
+
+  /// Loop over and print out the cuts that have been configured
+  printCuts();
+
+  /// Call base class initialize
+  ATH_CHECK( JSSTaggerBase::initialize() );
+
+  /// Initialize additional decorators
+  ATH_MSG_INFO( "Additional decorators that will be attached to jet :" );
+
+  m_decPassD2Key = m_containerName + "." + m_decorationName + "_" + m_decPassD2Key.key();
+  m_decCutD2Key = m_containerName + "." + m_decorationName + "_" + m_decCutD2Key.key();
+  
+  ATH_CHECK( m_decPassD2Key.initialize() );
+  ATH_CHECK( m_decCutD2Key.initialize() );
+  
+  ATH_MSG_INFO( "  " << m_decPassD2Key.key() << " : pass D2 cut" );
+  ATH_MSG_INFO( "  " << m_decCutD2Key.key() << " : D2 cut" );
+
+  if ( m_useNtrk ) {
+  
+    m_decPassNtrkKey = m_containerName + "." + m_decorationName + "_" + m_decPassNtrkKey.key();
+    m_decCutNtrkKey = m_containerName + "." + m_decorationName + "_" + m_decCutNtrkKey.key();
+    
+    ATH_CHECK( m_decPassNtrkKey.initialize() );
+    ATH_CHECK( m_decCutNtrkKey.initialize() );
+    
+    ATH_MSG_INFO( "  " << m_decPassNtrkKey.key() << " : pass Ntrk cut" );
+    ATH_MSG_INFO( "  " << m_decCutNtrkKey.key() << " : Ntrk cut" );
+
+  }
+
+  if ( m_calcSF ) {
+    
+    m_decAcceptKey = m_containerName + "." + m_decorationName + "_" + m_decAcceptKey.key();
+    ATH_CHECK( m_decAcceptKey.initialize() );
+  
+  }
+
+  return StatusCode::SUCCESS;
+
+}
+
+StatusCode SmoothedWZTagger::tag( const xAOD::Jet& jet ) const {
+
+  ATH_MSG_DEBUG( "Obtaining Smooth WZ result" );
+
+  /// Create asg::AcceptData object
+  asg::AcceptData acceptData( &m_acceptInfo );
+
+  /// Reset the AcceptData cut results
+  ATH_CHECK( resetCuts( acceptData ) );
+
+  /// Check basic kinematic selection
+  ATH_CHECK( checkKinRange( jet, acceptData ) );
+
+  /// Get the relevant attributes of the jet
+  /// Mass and pt - note that this will depend on the configuration of the calibration used
+  float jet_pt   = jet.pt()/1000.0;
+  float jet_mass = jet.m()/1000.0;
+
+  /// Initialize d2 to 0.  This probably gets used when the jet has one constituent, so it will fail the mass cut anyways
+  float jet_d2 = 0;
+
+  /// Calculate NSubjettiness and ECF ratios
+  calculateJSSRatios(jet);
+
+  /// Create D2 read decor handle
+  SG::ReadDecorHandle<xAOD::JetContainer, float> readD2(m_readD2Key);
+
+  /// Get D2 value
+  jet_d2 = readD2(jet);
+
+  /// Evaluate the values of the upper and lower mass bounds and the d2 cut
+  float cut_mass_low  = m_funcMassCutLow ->Eval(jet_pt);
+  float cut_mass_high = m_funcMassCutHigh->Eval(jet_pt);
+  float cut_d2        = m_funcD2Cut      ->Eval(jet_pt);
+
+  /// Decorate the cut values
+
+  /// Create WriteDecorHandles
+  SG::WriteDecorHandle<xAOD::JetContainer, bool> decPassMass(m_decPassMassKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, bool> decPassD2(m_decPassD2Key);
+  SG::WriteDecorHandle<xAOD::JetContainer, bool> decTagged(m_decTaggedKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decCutMLow(m_decCutMLowKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decCutMHigh(m_decCutMHighKey);
+  SG::WriteDecorHandle<xAOD::JetContainer, float> decCutD2(m_decCutD2Key);
+
+  /// Decorate values
+  decCutMLow(jet) = cut_mass_low;
+  decCutMHigh(jet) = cut_mass_high;
+  decCutD2(jet) = cut_d2;
+
+  /// Evaluate the cut criteria on mass and d2
+  ATH_MSG_VERBOSE( "Cut Values : MassWindow = [" << cut_mass_low << "," << cut_mass_high << "], D2Cut = " << cut_d2 );
+  ATH_MSG_VERBOSE( "Cut Values : JetMass = " << jet_mass << ", D2 = " << jet_d2 );
+
+  if ( jet_mass >= cut_mass_low ) acceptData.setCutResult( "PassMassLow", true );
+
+  if ( jet_mass <= cut_mass_high ) acceptData.setCutResult( "PassMassHigh", true );
+
+  if ( jet_d2 < cut_d2 ) acceptData.setCutResult( "PassD2", true );
+
+  decPassMass(jet) = acceptData.getCutResult( "PassMassLow" ) && acceptData.getCutResult( "PassMassHigh" );
+  decPassD2(jet) = acceptData.getCutResult( "PassD2" );
+
+  bool passCuts = acceptData.getCutResult( "PassMassLow" ) && acceptData.getCutResult( "PassMassHigh" );
+  passCuts = passCuts && acceptData.getCutResult( "PassD2" );
+
+  /// Check if it's a smooth three-variable tagger (ntrk)
+  if ( m_useNtrk ) {
+
+    float cut_ntrk = m_funcNtrkCut->Eval(jet_pt);
+
+    /// Decorate Ntrk cut value
+
+    /// Create WriteDecorHandles
+    SG::WriteDecorHandle<xAOD::JetContainer, bool> decValidJetContent(m_decValidJetContentKey);
+    SG::WriteDecorHandle<xAOD::JetContainer, bool> decValidEventContent(m_decValidEventContentKey);
+    SG::WriteDecorHandle<xAOD::JetContainer, bool> decPassNtrk(m_decPassNtrkKey);
+    SG::WriteDecorHandle<xAOD::JetContainer, float> decCutNtrk(m_decCutNtrkKey);
+
+    /// Decorate values
+    decCutNtrk(jet) = cut_ntrk;
+
+    /// Get the primary vertex
+    bool validVtx = false;
+    const xAOD::Vertex* primaryVertex = 0;
+
+    const xAOD::VertexContainer* vxCont = 0;
+    if ( evtStore()->retrieve( vxCont, "PrimaryVertices" ).isFailure() ) {
+      ATH_MSG_WARNING( "Unable to retrieve primary vertex container PrimaryVertices" );
+      validVtx = false;
+    }
+    else {
+      for ( const auto& vx : *vxCont ) {
+        if ( vx->vertexType()==xAOD::VxType::PriVtx ) {
+          primaryVertex = vx;
+          break;
+        }
+      }
+
+      if ( primaryVertex ) validVtx = true;
+    
+    }
+
+    if ( validVtx ) {
+      static SG::AuxElement::Accessor<ElementLink<xAOD::JetContainer> > ungroomedLink("Parent");
+      const xAOD::Jet * ungroomedJet = 0;
+
+      if ( ungroomedLink.isAvailable(jet) ) {
+        ElementLink<xAOD::JetContainer> linkToUngroomed = ungroomedLink(jet);
+        if ( linkToUngroomed.isValid() ) {
+          ungroomedJet = *linkToUngroomed;
+
+          static SG::AuxElement::ConstAccessor< std::vector<int> >acc_Ntrk("NumTrkPt500");
+
+          if ( acc_Ntrk.isAvailable(*ungroomedJet) ) {
+
+            const std::vector<int> NTrkPt500 = acc_Ntrk(*ungroomedJet);
+
+            int jet_ntrk = NTrkPt500.at(primaryVertex->index());
+            jet.auxdecor<int>("ParentJetNTrkPt500") = jet_ntrk;
+
+            if ( jet_ntrk < cut_ntrk ) acceptData.setCutResult( "PassNtrk", true );
+            decPassNtrk(jet) = acceptData.getCutResult( "PassNtrk" );
+            passCuts = passCuts && acceptData.getCutResult( "PassNtrk" );
+          
+          }
+          else {
+            acceptData.setCutResult( "ValidJetContent", false );
+            decValidJetContent(jet) = false;
+            ATH_MSG_ERROR( "Unable to retrieve Ntrk of the ungroomed parent jet. Please make sure this variable is in your derivations!!!" );
+            return StatusCode::FAILURE;
+          }
+        }
+        else {
+          acceptData.setCutResult( "ValidJetContent", false );
+          decValidJetContent(jet) = false;
+          ATH_MSG_ERROR( "Unable to retrieve the parent ungroomed jet. Please make sure this variable is in your derivations!!!" );
+          return StatusCode::FAILURE;
+        }
+      }
+      else {
+        acceptData.setCutResult( "ValidJetContent", false );
+        decValidJetContent(jet) = false;
+        ATH_MSG_ERROR( "Unable to retrieve the link to the parent ungroomed jet. Please make sure this variable is in your derivations!!!" );
+        return StatusCode::FAILURE;
+      }
+    }
+    else {
+      acceptData.setCutResult( "ValidEventContent", false );
+    }
+
+    decValidJetContent(jet) = acceptData.getCutResult( "ValidJetContent" );
+    decValidEventContent(jet) = acceptData.getCutResult( "ValidEventContent" );
+
+  }
+
+  /// Decorate jet with tagging summary
+  decTagged(jet) = passCuts;
+
+  /// Get enum to decorate acceptData state if only using 2-var tagger
+  TagResult::TypeEnum myCutResultForSF = TagResult::UNKNOWN;
+  if ( !m_useNtrk ) {
+    /// Pass mass cut
+    if ( acceptData.getCutResult("PassMassLow") && acceptData.getCutResult("PassMassHigh") ) {
+      if ( acceptData.getCutResult("PassD2") ) {
+        myCutResultForSF = TagResult::passMpassD2_2Var;
+      }
+      else {
+        myCutResultForSF = TagResult::passMfailD2_2Var;
+      }
+    }
+    /// Fail mass cut
+    else {
+      if ( acceptData.getCutResult("PassD2") ) {
+        myCutResultForSF = TagResult::failMpassD2_2Var;
+      }
+      else {
+        myCutResultForSF = TagResult::failMfailD2_2Var;
+      }
+    }
+  }
+
+  /// Get SF weight
+  ATH_CHECK( getWeight( jet, (bool)acceptData, acceptData ) );
+
+  if ( m_calcSF ) { 
+
+    /// Create WriteDecorHandles
+    SG::WriteDecorHandle<xAOD::JetContainer, float> decAccept(m_decAcceptKey);
+
+    /// Decorate values
+    decAccept(jet) = myCutResultForSF;
+
+  }
+
+  return StatusCode::SUCCESS;
+
+}
+
diff --git a/Reconstruction/Jet/BoostedJetTaggers/src/components/BoostedJetTaggers_entries.cxx b/Reconstruction/Jet/BoostedJetTaggers/src/components/BoostedJetTaggers_entries.cxx
new file mode 100644
index 000000000000..46588c6f64d2
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/src/components/BoostedJetTaggers_entries.cxx
@@ -0,0 +1,12 @@
+#include "BoostedJetTaggers/SmoothedWZTagger.h"
+#include "BoostedJetTaggers/JetQGTagger.h"
+#include "BoostedJetTaggers/JetQGTaggerBDT.h"
+#include "BoostedJetTaggers/JSSWTopTaggerDNN.h"
+#include "BoostedJetTaggers/JSSWTopTaggerANN.h"
+
+DECLARE_COMPONENT(SmoothedWZTagger)
+DECLARE_COMPONENT(JSSWTopTaggerDNN)
+DECLARE_COMPONENT(JSSWTopTaggerANN)
+DECLARE_COMPONENT(CP::JetQGTagger)
+DECLARE_COMPONENT(CP::JetQGTaggerBDT)
+
diff --git a/Reconstruction/Jet/BoostedJetTaggers/util/test_JSSWTopTaggerANN.cxx b/Reconstruction/Jet/BoostedJetTaggers/util/test_JSSWTopTaggerANN.cxx
new file mode 100644
index 000000000000..c83665f09702
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/util/test_JSSWTopTaggerANN.cxx
@@ -0,0 +1,289 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+// System include(s):
+#include <string>
+
+// ROOT include(s):
+#include <TFile.h>
+#include <TString.h>
+#include <TTree.h>
+#include <TChain.h>
+
+// Infrastructure include(s):
+#ifdef ROOTCORE
+#   include "xAODRootAccess/Init.h"
+#   include "xAODRootAccess/TEvent.h"
+#endif // ROOTCORE
+
+// EDM include(s):
+#include "xAODCore/ShallowAuxContainer.h"
+#include "xAODCore/ShallowCopy.h"
+#include "xAODCore/tools/IOStats.h"
+
+// Tool testing include(s):
+#include "BoostedJetTaggers/JSSWTopTaggerANN.h"
+#include "JetUncertainties/JetUncertaintiesTool.h"
+
+#include "AsgMessaging/MessageCheck.h"
+
+// messaging
+ANA_MSG_HEADER(Test)
+ANA_MSG_SOURCE(Test, "BoostedJetTaggers")
+using namespace Test;
+
+int main( int argc, char* argv[] ) {
+
+  ANA_CHECK_SET_TYPE (int); // makes ANA_CHECK return ints if exiting function
+
+  // The application's name:
+  char* APP_NAME = argv[ 0 ];
+
+  // arguments
+  TString fileName = "/eos/atlas/atlascerngroupdisk/perf-jets/ReferenceFiles/mc16_13TeV.361028.Pythia8EvtGen_A14NNPDF23LO_jetjet_JZ8W.deriv.DAOD_FTAG1.e3569_s3126_r9364_r9315_p3260/DAOD_FTAG1.12133096._000074.pool.root.1";
+  int  ievent=-1;
+  int  nevents=-1;
+  bool m_isMC=true;
+  bool verbose=false;
+
+
+  Info( APP_NAME, "==============================================" );
+  Info( APP_NAME, "Usage: $> %s [xAOD file name]", APP_NAME );
+  Info( APP_NAME, " $> %s       | Run on default file", APP_NAME );
+  Info( APP_NAME, " $> %s -f X  | Run on xAOD file X", APP_NAME );
+  Info( APP_NAME, " $> %s -n X  | X = number of events you want to run on", APP_NAME );
+  Info( APP_NAME, " $> %s -e X  | X = specific number of the event to run on - for debugging", APP_NAME );
+  Info( APP_NAME, " $> %s -d X  | X = dataset ID", APP_NAME );
+  Info( APP_NAME, " $> %s -m X  | X = isMC", APP_NAME );
+  Info( APP_NAME, " $> %s -v    | run in verbose mode   ", APP_NAME );
+  Info( APP_NAME, "==============================================" );
+
+  // Check if we received a file name:
+  if( argc < 2 ) {
+    Info( APP_NAME, "No arguments - using default file" );
+    Info( APP_NAME, "Executing on : %s", fileName.Data() );
+  }
+
+  ////////////////////////////////////////////////////
+  //:::  parse the options
+  ////////////////////////////////////////////////////
+  std::string options;
+  for( int i=0; i<argc; i++){
+    options+=(argv[i]);
+  }
+
+  if(options.find("-f")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-f")==0){
+        fileName = argv[ipos+1];
+        Info( APP_NAME, "Argument (-f) : Running on file # %s", fileName.Data() );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-event")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-event")==0){
+        ievent = atoi(argv[ipos+1]);
+        Info( APP_NAME, "Argument (-event) : Running only on event # %i", ievent );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-m")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-m")==0){
+        m_isMC = atoi(argv[ipos+1]);
+        Info( APP_NAME, "Argument (-m) : IsMC = %i", m_isMC );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-n")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-n")==0){
+        nevents = atoi(argv[ipos+1]);
+        Info( APP_NAME, "Argument (-n) : Running on NEvents = %i", nevents );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-v")!=std::string::npos){
+    verbose=true;
+    Info( APP_NAME, "Argument (-v) : Setting verbose");
+  }
+
+
+  ////////////////////////////////////////////////////
+  //:::  initialize the application and get the event
+  ////////////////////////////////////////////////////
+  ANA_CHECK( xAOD::Init( APP_NAME ) );
+  StatusCode::enableFailure();
+
+  // Open the input file:
+  TFile* ifile( TFile::Open( fileName, "READ" ) );
+  if( !ifile ) Error( APP_NAME, "Cannot find file %s",fileName.Data() );
+
+  TChain *chain = new TChain ("CollectionTree","CollectionTree");
+  chain->Add(fileName);
+
+  // Create a TEvent object:
+  xAOD::TEvent event( (TTree*)chain, xAOD::TEvent::kAthenaAccess );
+  Info( APP_NAME, "Number of events in the file: %i", static_cast< int >( event.getEntries() ) );
+
+  // Create a transient object store. Needed for the tools.
+  xAOD::TStore store;
+
+  // Decide how many events to run over:
+  Long64_t entries = event.getEntries();
+
+  // Fill a validation true with the tag return value
+  std::unique_ptr<TFile> outputFile(TFile::Open("output_JSSWTopTaggerANN.root", "recreate"));
+  int pass,truthLabel,idx;
+  float sf,pt,eta,m;
+  TTree* Tree = new TTree( "tree", "test_tree" );
+  Tree->Branch( "pass", &pass, "pass/I" );
+  Tree->Branch( "sf", &sf, "sf/F" );
+  Tree->Branch( "pt", &pt, "pt/F" );
+  Tree->Branch( "m", &m, "m/F" );
+  Tree->Branch( "eta", &eta, "eta/F" );
+  Tree->Branch( "idx", &idx, "idx/I" );
+  Tree->Branch( "truthLabel", &truthLabel, "truthLabel/I" );
+
+  std::unique_ptr<JetUncertaintiesTool> m_jetUncToolSF(new JetUncertaintiesTool(("JetUncProvider_SF")));
+  ANA_CHECK( m_jetUncToolSF->setProperty("JetDefinition", "AntiKt10LCTopoTrimmedPtFrac5SmallR20") );
+  ANA_CHECK( m_jetUncToolSF->setProperty("Path", "/eos/user/g/gang/public/BoostedJetTaggers/JSSWTopTaggerANN/") );
+  ANA_CHECK( m_jetUncToolSF->setProperty("ConfigFile", "TagSFUncert_JSSANNTagger_AntiKt10LCTopoTrimmed.config") );
+  ANA_CHECK( m_jetUncToolSF->setProperty("MCType", "MC16a") );
+  ANA_CHECK( m_jetUncToolSF->initialize() );
+
+  std::vector<std::string> pulls = {"__1down", "__1up"};
+  CP::SystematicSet jetUnc_sysSet = m_jetUncToolSF->recommendedSystematics();
+  const std::set<std::string> sysNames = jetUnc_sysSet.getBaseNames();
+  std::vector<CP::SystematicSet> m_jetUnc_sysSets;
+  for (std::string sysName: sysNames) {
+    for (std::string pull : pulls) {
+      std::string sysPulled = sysName + pull;
+      m_jetUnc_sysSets.push_back(CP::SystematicSet(sysPulled));
+    }
+  }
+
+  ////////////////////////////////////////////
+  /////////// START TOOL SPECIFIC ////////////
+  ////////////////////////////////////////////
+
+  ////////////////////////////////////////////////////
+  //::: Tool setup
+  // setup the tool handle as per the
+  // recommendation by ASG - https://twiki.cern.ch/twiki/bin/view/AtlasProtected/AthAnalysisBase#How_to_use_AnaToolHandle
+  ////////////////////////////////////////////////////
+  std::cout<<"Initializing JSSWTopTaggerANN Tagger"<<std::endl;
+  asg::AnaToolHandle<JSSWTopTaggerANN> m_Tagger; //!
+  ASG_SET_ANA_TOOL_TYPE( m_Tagger, JSSWTopTaggerANN);
+  m_Tagger.setName("MyTagger");
+  if(verbose) ANA_CHECK( m_Tagger.setProperty("OutputLevel", MSG::DEBUG) );
+  ANA_CHECK( m_Tagger.setProperty( "CalibArea",    "/eos/user/g/gang/public/BoostedJetTaggers/JSSWTopTaggerANN/") );
+  ANA_CHECK( m_Tagger.setProperty( "ConfigFile",   "JSSANNTagger_test.dat") );
+  ANA_CHECK( m_Tagger.setProperty("TruthJetContainerName", "AntiKt10TruthTrimmedPtFrac5SmallR20Jets") );
+  ANA_CHECK( m_Tagger.setProperty("IsMC", m_isMC) );
+  ANA_CHECK( m_Tagger.retrieve() );
+
+
+  std::cout << "Total Events in File : " << entries << std::endl;
+
+  ////////////////////////////////////////////////////
+  // Loop over the events
+  ////////////////////////////////////////////////////
+  for( Long64_t entry = 0; entry < entries; ++entry ) {
+
+    if( nevents!=-1 && entry > nevents ) break;
+    // Tell the object which entry to look at:
+    event.getEntry( entry );
+
+    // Print some event information
+    const xAOD::EventInfo* evtInfo = 0;
+    if(event.retrieve( evtInfo, "EventInfo" ) != StatusCode::SUCCESS){
+      continue;
+    }
+    if(ievent!=-1 && static_cast <int> (evtInfo->eventNumber())!=ievent) {
+      continue;
+    }
+
+    // Get the jets
+    const xAOD::JetContainer* myJets = 0;
+    if( event.retrieve( myJets, "AntiKt10LCTopoTrimmedPtFrac5SmallR20Jets" ) != StatusCode::SUCCESS)
+      continue ;
+
+    // Loop over jet container
+    std::pair< xAOD::JetContainer*, xAOD::ShallowAuxContainer* > jets_shallowCopy = xAOD::shallowCopyContainer( *myJets );
+    std::unique_ptr<xAOD::JetContainer> shallowJets(jets_shallowCopy.first);
+    std::unique_ptr<xAOD::ShallowAuxContainer> shallowAux(jets_shallowCopy.second);
+    idx=0;
+    for( xAOD::Jet* jetSC : *shallowJets ){
+      
+      ANA_CHECK( m_Tagger->tag( *jetSC ) );
+      if(verbose) {
+        std::cout << "Testing ANN Tagger " << std::endl;
+        std::cout << "jet pt              = " << jetSC->pt() << std::endl;
+        std::cout << "RunningTag : " << jetSC->getAttribute<bool>("ANNTagger_Tagged") << std::endl;
+        std::cout << "Printing jet score : " << jetSC->auxdata<float>("ANNTagger_Score") << std::endl;
+        std::cout << "result masspass     = " << jetSC->getAttribute<bool>("ANNTagger_PassMass") << std::endl;
+      }
+      truthLabel = jetSC->auxdata<int>("R10TruthLabel_R21Consolidated");
+
+      pass = jetSC->getAttribute<bool>("ANNTagger_Tagged");
+      sf = jetSC->auxdata<float>("ANNTagger_SF");
+      pt = jetSC->pt();
+      m  = jetSC->m();
+      eta = jetSC->eta();
+
+      Tree->Fill();
+      idx++;
+      if ( m_isMC ){
+	if ( pt/1.e3 > 350 && std::abs(eta) < 2.0 && pass ) {
+	  bool validForUncTool = ( pt/1.e3 >= 150 && pt/1.e3 < 2500 );
+	  validForUncTool &= ( m/pt >= 0 && m/pt <= 1 );
+	  validForUncTool &= ( std::abs(eta) < 2 );
+	  std::cout << "Nominal SF=" << sf << " truthLabel=" << truthLabel << " (1: t->qqb)" << std::endl;
+	  if( validForUncTool ){
+	    for ( CP::SystematicSet sysSet : m_jetUnc_sysSets ){
+	      ANA_CHECK( m_Tagger->tag( *jetSC ) );
+	      ANA_CHECK( m_jetUncToolSF->applySystematicVariation(sysSet) );
+	      ANA_CHECK( m_jetUncToolSF->applyCorrection(*jetSC) );
+	      std::cout << sysSet.name() << " " << jetSC->auxdata<float>("ANNTagger_SF") << std::endl;
+	    }
+	  }
+	}
+      }
+    }
+
+    Info( APP_NAME, "===>>>  done processing event #%i, run #%i %i events processed so far  <<<===", static_cast< int >( evtInfo->eventNumber() ), static_cast< int >( evtInfo->runNumber() ), static_cast< int >( entry + 1 ) );
+  }
+
+  ////////////////////////////////////////////
+  /////////// END TOOL SPECIFIC //////////////
+  ////////////////////////////////////////////
+
+  // write the tree to the output file
+  outputFile->cd();
+  Tree->Write();
+  outputFile->Close();
+
+  // cleanup
+  delete chain;
+
+  // print the branches that were used for help with smart slimming
+  std::cout<<std::endl<<std::endl;
+  std::cout<<"Smart Slimming Checker :"<<std::endl;
+  xAOD::IOStats::instance().stats().printSmartSlimmingBranchList();
+  std::cout<<std::endl<<std::endl;
+
+  return 0;
+
+}
+
diff --git a/Reconstruction/Jet/BoostedJetTaggers/util/test_JSSWTopTaggerDNN.cxx b/Reconstruction/Jet/BoostedJetTaggers/util/test_JSSWTopTaggerDNN.cxx
new file mode 100644
index 000000000000..5b53f927b3e2
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/util/test_JSSWTopTaggerDNN.cxx
@@ -0,0 +1,296 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+// System include(s):
+#include <string>
+
+// ROOT include(s):
+#include <TFile.h>
+#include <TString.h>
+#include <TTree.h>
+#include <TChain.h>
+
+// Infrastructure include(s):
+#ifdef ROOTCORE
+#   include "xAODRootAccess/Init.h"
+#   include "xAODRootAccess/TEvent.h"
+#endif // ROOTCORE
+
+// EDM include(s):
+#include "xAODCore/ShallowAuxContainer.h"
+#include "xAODCore/ShallowCopy.h"
+#include "xAODCore/tools/IOStats.h"
+
+// Tool testing include(s):
+#include "BoostedJetTaggers/JSSWTopTaggerDNN.h"
+#include "JetUncertainties/JetUncertaintiesTool.h"
+
+#include "AsgMessaging/MessageCheck.h"
+
+// messaging
+ANA_MSG_HEADER(Test)
+ANA_MSG_SOURCE(Test, "BoostedJetTaggers")
+using namespace Test;
+
+int main( int argc, char* argv[] ) {
+
+  ANA_CHECK_SET_TYPE (int); // makes ANA_CHECK return ints if exiting function
+
+  // The application's name:
+  char* APP_NAME = argv[ 0 ];
+
+  // arguments
+  TString fileName = "/eos/atlas/atlascerngroupdisk/perf-jets/ReferenceFiles/mc16_13TeV.361028.Pythia8EvtGen_A14NNPDF23LO_jetjet_JZ8W.deriv.DAOD_FTAG1.e3569_s3126_r9364_r9315_p3260/DAOD_FTAG1.12133096._000074.pool.root.1";
+  int  ievent=-1;
+  int  nevents=-1;
+  bool m_isMC=true;
+  bool verbose=false;
+
+
+  Info( APP_NAME, "==============================================" );
+  Info( APP_NAME, "Usage: $> %s [xAOD file name]", APP_NAME );
+  Info( APP_NAME, " $> %s       | Run on default file", APP_NAME );
+  Info( APP_NAME, " $> %s -f X  | Run on xAOD file X", APP_NAME );
+  Info( APP_NAME, " $> %s -n X  | X = number of events you want to run on", APP_NAME );
+  Info( APP_NAME, " $> %s -e X  | X = specific number of the event to run on - for debugging", APP_NAME );
+  Info( APP_NAME, " $> %s -d X  | X = dataset ID", APP_NAME );
+  Info( APP_NAME, " $> %s -m X  | X = isMC", APP_NAME );
+  Info( APP_NAME, " $> %s -v    | run in verbose mode   ", APP_NAME );
+  Info( APP_NAME, "==============================================" );
+
+  // Check if we received a file name:
+  if( argc < 2 ) {
+    Info( APP_NAME, "No arguments - using default file" );
+    Info( APP_NAME, "Executing on : %s", fileName.Data() );
+  }
+
+  ////////////////////////////////////////////////////
+  //:::  parse the options
+  ////////////////////////////////////////////////////
+  std::string options;
+  for( int i=0; i<argc; i++){
+    options+=(argv[i]);
+  }
+
+  if(options.find("-f")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-f")==0){
+        fileName = argv[ipos+1];
+        Info( APP_NAME, "Argument (-f) : Running on file # %s", fileName.Data() );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-event")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-event")==0){
+        ievent = atoi(argv[ipos+1]);
+        Info( APP_NAME, "Argument (-event) : Running only on event # %i", ievent );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-m")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-m")==0){
+        m_isMC = atoi(argv[ipos+1]);
+        Info( APP_NAME, "Argument (-m) : IsMC = %i", m_isMC );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-n")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-n")==0){
+        nevents = atoi(argv[ipos+1]);
+        Info( APP_NAME, "Argument (-n) : Running on NEvents = %i", nevents );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-v")!=std::string::npos){
+    verbose=true;
+    Info( APP_NAME, "Argument (-v) : Setting verbose");
+  }
+
+
+  ////////////////////////////////////////////////////
+  //:::  initialize the application and get the event
+  ////////////////////////////////////////////////////
+  ANA_CHECK( xAOD::Init( APP_NAME ) );
+  StatusCode::enableFailure();
+
+  // Open the input file:
+  TFile* ifile( TFile::Open( fileName, "READ" ) );
+  if( !ifile ) Error( APP_NAME, "Cannot find file %s",fileName.Data() );
+
+  TChain *chain = new TChain ("CollectionTree","CollectionTree");
+  chain->Add(fileName);
+
+  // Create a TEvent object:
+  xAOD::TEvent event( (TTree*)chain, xAOD::TEvent::kAthenaAccess );
+  Info( APP_NAME, "Number of events in the file: %i", static_cast< int >( event.getEntries() ) );
+
+  // Create a transient object store. Needed for the tools.
+  xAOD::TStore store;
+
+  // Decide how many events to run over:
+  Long64_t entries = event.getEntries();
+
+  // Fill a validation true with the tag return value
+  std::unique_ptr<TFile> outputFile(TFile::Open("output_JSSWTopTaggerDNN.root", "recreate"));
+  int pass,truthLabel,idx;
+  float sf,pt,eta,m;
+  TTree* Tree = new TTree( "tree", "test_tree" );
+  Tree->Branch( "pass", &pass, "pass/I" );
+  Tree->Branch( "sf", &sf, "sf/F" );
+  Tree->Branch( "pt", &pt, "pt/F" );
+  Tree->Branch( "m", &m, "m/F" );
+  Tree->Branch( "eta", &eta, "eta/F" );
+  Tree->Branch( "idx", &idx, "idx/I" );
+  Tree->Branch( "truthLabel", &truthLabel, "truthLabel/I" );
+
+  std::unique_ptr<JetUncertaintiesTool> m_jetUncToolSF(new JetUncertaintiesTool(("JetUncProvider_SF")));
+  ANA_CHECK( m_jetUncToolSF->setProperty("JetDefinition", "AntiKt10LCTopoTrimmedPtFrac5SmallR20") );
+  //ANA_CHECK( m_jetUncToolSF->setProperty("ConfigFile", "rel21/Summer2019/R10_SF_LC_DNNContained80_TopTag.config") );
+  ANA_CHECK( m_jetUncToolSF->setProperty("ConfigFile", "/afs/cern.ch/user/t/tnobe/workDir/makeConfig/makebjtconfigs/outputs/temp_R10_SF_DNNTaggerTopQuarkContained80_SF.config") );
+  ANA_CHECK( m_jetUncToolSF->setProperty("MCType", "MC16") );
+  ANA_CHECK( m_jetUncToolSF->initialize() );
+
+  std::vector<std::string> pulls = {"__1down", "__1up"};
+  CP::SystematicSet jetUnc_sysSet = m_jetUncToolSF->recommendedSystematics();
+  const std::set<std::string> sysNames = jetUnc_sysSet.getBaseNames();
+  std::vector<CP::SystematicSet> m_jetUnc_sysSets;
+  for (std::string sysName: sysNames) {
+    for (std::string pull : pulls) {
+      std::string sysPulled = sysName + pull;
+      m_jetUnc_sysSets.push_back(CP::SystematicSet(sysPulled));
+    }
+  }
+
+  ////////////////////////////////////////////
+  /////////// START TOOL SPECIFIC ////////////
+  ////////////////////////////////////////////
+
+  ////////////////////////////////////////////////////
+  //::: Tool setup
+  // setup the tool handle as per the
+  // recommendation by ASG - https://twiki.cern.ch/twiki/bin/view/AtlasProtected/AthAnalysisBase#How_to_use_AnaToolHandle
+  ////////////////////////////////////////////////////
+  std::cout<<"Initializing JSSWTopTaggerDNN Tagger"<<std::endl;
+  asg::AnaToolHandle<JSSWTopTaggerDNN> m_Tagger; //!
+  ASG_SET_ANA_TOOL_TYPE( m_Tagger, JSSWTopTaggerDNN);
+  m_Tagger.setName("MyTagger");
+  if(verbose) ANA_CHECK( m_Tagger.setProperty("OutputLevel", MSG::DEBUG) );
+  ANA_CHECK( m_Tagger.setProperty( "CalibArea",   "Local") );
+  ANA_CHECK( m_Tagger.setProperty( "ConfigFile",   "JSSWTopTaggerDNN/temp_JSSDNNTagger_AntiKt10LCTopoTrimmed_TopQuarkContained_MC16d_80Eff.dat") );
+  ANA_CHECK( m_Tagger.setProperty( "UseTRUTH3", false) );
+  //ANA_CHECK( m_Tagger.setProperty( "CalibArea",   "JSSWTopTaggerDNN/Rel21") );
+  //ANA_CHECK( m_Tagger.setProperty( "ConfigFile",   "JSSDNNTagger_AntiKt10LCTopoTrimmed_TopQuarkContained_MC16d_20190405_80Eff.dat") );
+  ANA_CHECK( m_Tagger.setProperty("IsMC", m_isMC) );
+  ANA_CHECK( m_Tagger.retrieve() );
+
+
+  std::cout << "Total Events in File : " << entries << std::endl;
+
+  ////////////////////////////////////////////////////
+  // Loop over the events
+  ////////////////////////////////////////////////////
+  for( Long64_t entry = 0; entry < entries; ++entry ) {
+
+    if( nevents!=-1 && entry > nevents ) break;
+    // Tell the object which entry to look at:
+    event.getEntry( entry );
+
+    // Print some event information
+    const xAOD::EventInfo* evtInfo = 0;
+    if(event.retrieve( evtInfo, "EventInfo" ) != StatusCode::SUCCESS){
+      continue;
+    }
+    if(ievent!=-1 && static_cast <int> (evtInfo->eventNumber())!=ievent) {
+      continue;
+    }
+
+    // Get the jets
+    const xAOD::JetContainer* myJets = 0;
+    if( event.retrieve( myJets, "AntiKt10LCTopoTrimmedPtFrac5SmallR20Jets" ) != StatusCode::SUCCESS)
+      continue ;
+
+    // Loop over jet container
+    std::pair< xAOD::JetContainer*, xAOD::ShallowAuxContainer* > jets_shallowCopy = xAOD::shallowCopyContainer( *myJets );
+    std::unique_ptr<xAOD::JetContainer> shallowJets(jets_shallowCopy.first);
+    std::unique_ptr<xAOD::ShallowAuxContainer> shallowAux(jets_shallowCopy.second);
+    idx=0;
+    for( xAOD::Jet* jetSC : *shallowJets ){
+      
+      ANA_CHECK( m_Tagger->tag( *jetSC ) );
+      if(verbose) {
+        std::cout << "Testing top Tagger " << std::endl;
+        std::cout << "jet pt              = " << jetSC->pt() << std::endl;
+        std::cout << "RunningTag : " << jetSC->auxdata<bool>("DNNTaggerTopQuarkContained80_Tagged") << std::endl;
+        std::cout << "Printing jet score : " << jetSC->auxdata<float>("DNNTaggerTopQuarkContained80_Score") << std::endl;
+        std::cout << "result masspass     = " << jetSC->auxdata<bool>("DNNTaggerTopQuarkContained80_PassMass") << std::endl;
+      }
+      truthLabel = jetSC->auxdata<int>("R10TruthLabel_R21Consolidated");
+
+      pass = jetSC->getAttribute<bool>("DNNTaggerTopQuarkContained80_Tagged");
+      sf = jetSC->auxdata<float>("DNNTaggerTopQuarkContained80_SF");
+      pt = jetSC->pt();
+      m  = jetSC->m();
+      eta = jetSC->eta();
+
+      Tree->Fill();
+      idx++;
+      if ( m_isMC ){
+        if ( pt/1.e3 > 350 && std::abs(jetSC->eta()) < 2.0 ) {
+          bool validForUncTool = ( pt/1.e3 >= 150 && pt/1.e3 < 2500 );
+          validForUncTool &= ( m/pt >= 0 && m/pt <= 1 );
+          validForUncTool &= ( std::abs(eta) < 2 );
+          std::cout << "Pass: " << pass << std::endl;
+          std::cout << "Nominal SF=" << sf << " truthLabel=" << truthLabel << " (1: t->qqb) " 
+            <<  jetSC->auxdata<float>("DNNTaggerTopQuarkContained80_effSF") 
+            << " "
+            <<  jetSC->auxdata<float>("DNNTaggerTopQuarkContained80_efficiency") 
+            << std::endl;
+          if( validForUncTool ){
+            for ( CP::SystematicSet sysSet : m_jetUnc_sysSets ){
+              ANA_CHECK( m_Tagger->tag( *jetSC ) );
+              ANA_CHECK( m_jetUncToolSF->applySystematicVariation(sysSet) );
+              ANA_CHECK( m_jetUncToolSF->applyCorrection(*jetSC) );
+              std::cout << sysSet.name() << " " << jetSC->auxdata<float>("DNNTaggerTopQuarkContained80_SF") << std::endl;
+            }
+          }
+        }
+      }
+    }
+
+    Info( APP_NAME, "===>>>  done processing event #%i, run #%i %i events processed so far  <<<===", static_cast< int >( evtInfo->eventNumber() ), static_cast< int >( evtInfo->runNumber() ), static_cast< int >( entry + 1 ) );
+  }
+
+  ////////////////////////////////////////////
+  /////////// END TOOL SPECIFIC //////////////
+  ////////////////////////////////////////////
+
+  // write the tree to the output file
+  outputFile->cd();
+  Tree->Write();
+  outputFile->Close();
+
+  // cleanup
+  delete chain;
+
+  // print the branches that were used for help with smart slimming
+  std::cout<<std::endl<<std::endl;
+  std::cout<<"Smart Slimming Checker :"<<std::endl;
+  xAOD::IOStats::instance().stats().printSmartSlimmingBranchList();
+  std::cout<<std::endl<<std::endl;
+
+  return 0;
+
+}
+
diff --git a/Reconstruction/Jet/BoostedJetTaggers/util/test_JetQGTagger.cxx b/Reconstruction/Jet/BoostedJetTaggers/util/test_JetQGTagger.cxx
new file mode 100644
index 000000000000..9a44ab129a3b
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/util/test_JetQGTagger.cxx
@@ -0,0 +1,213 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+// System include(s):
+#include <string>
+
+// ROOT include(s):
+#include <TFile.h>
+#include <TString.h>
+#include <TTree.h>
+#include <TChain.h>
+
+// Infrastructure include(s):
+#ifdef ROOTCORE
+#   include "xAODRootAccess/Init.h"
+#   include "xAODRootAccess/TEvent.h"
+#endif // ROOTCORE
+
+// EDM include(s):
+#include "xAODCore/ShallowAuxContainer.h"
+#include "xAODCore/ShallowCopy.h"
+#include "xAODCore/tools/IOStats.h"
+
+// Tool testing include(s):
+#include "BoostedJetTaggers/JetQGTagger.h"
+
+// messaging
+ANA_MSG_HEADER(Test)
+ANA_MSG_SOURCE(Test, "BoostedJetTaggers")
+using namespace Test;
+
+int main( int argc, char* argv[] ) {
+
+  ANA_CHECK_SET_TYPE (int); // makes ANA_CHECK return ints if exiting function
+
+  // The application's name:
+  char* APP_NAME = argv[ 0 ];
+
+  // arguments
+  TString fileName = "/eos/atlas/atlascerngroupdisk/perf-jets/ReferenceFiles/mc16_13TeV.361028.Pythia8EvtGen_A14NNPDF23LO_jetjet_JZ8W.deriv.DAOD_FTAG1.e3569_s3126_r9364_r9315_p3260/DAOD_FTAG1.12133096._000074.pool.root.1";
+  int  ievent=-1;
+  int  nevents=-1;
+  bool verbose=false;
+
+
+  Info( APP_NAME, "==============================================" );
+  Info( APP_NAME, "Usage: $> %s [xAOD file name]", APP_NAME );
+  Info( APP_NAME, " $> %s       | Run on default file", APP_NAME );
+  Info( APP_NAME, " $> %s -f X  | Run on xAOD file X", APP_NAME );
+  Info( APP_NAME, " $> %s -n X  | X = number of events you want to run on", APP_NAME );
+  Info( APP_NAME, " $> %s -e X  | X = specific number of the event to run on - for debugging", APP_NAME );
+  Info( APP_NAME, " $> %s -v    | run in verbose mode   ", APP_NAME );
+  Info( APP_NAME, "==============================================" );
+
+  // Check if we received a file name:
+  if( argc < 2 ) {
+    Info( APP_NAME, "No arguments - using default file" );
+    Info( APP_NAME, "Executing on : %s", fileName.Data() );
+  }
+
+  ////////////////////////////////////////////////////
+  //:::  parse the options
+  ////////////////////////////////////////////////////
+  std::string options;
+  for( int i=0; i<argc; i++){
+    options+=(argv[i]);
+  }
+
+  if(options.find("-f")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-f")==0){
+        fileName = argv[ipos+1];
+        Info( APP_NAME, "Argument (-f) : Running on file # %s", fileName.Data() );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-event")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-event")==0){
+        ievent = atoi(argv[ipos+1]);
+        Info( APP_NAME, "Argument (-event) : Running only on event # %i", ievent );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-n")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-n")==0){
+        nevents = atoi(argv[ipos+1]);
+        Info( APP_NAME, "Argument (-n) : Running on NEvents = %i", nevents );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-v")!=std::string::npos){
+    verbose=true;
+    Info( APP_NAME, "Argument (-v) : Setting verbose");
+  }
+
+
+  ////////////////////////////////////////////////////
+  //:::  initialize the application and get the event
+  ////////////////////////////////////////////////////
+  ANA_CHECK( xAOD::Init( APP_NAME ) );
+  StatusCode::enableFailure();
+
+  // Open the input file:
+  TFile* ifile( TFile::Open( fileName, "READ" ) );
+  if( !ifile ) Error( APP_NAME, "Cannot find file %s",fileName.Data() );
+
+  TChain *chain = new TChain ("CollectionTree","CollectionTree");
+  chain->Add(fileName);
+
+  // Create a TEvent object:
+  xAOD::TEvent event( (TTree*)chain, xAOD::TEvent::kAthenaAccess );
+  Info( APP_NAME, "Number of events in the file: %i", static_cast< int >( event.getEntries() ) );
+
+  // Create a transient object store. Needed for the tools.
+  xAOD::TStore store;
+
+  // Decide how many events to run over:
+  Long64_t entries = event.getEntries();
+
+  // Fill a validation true with the tag return value
+  TFile* outputFile = TFile::Open( "output_JetQGTagger.root", "recreate" );
+  int pass;
+  TTree* Tree = new TTree( "tree", "test_tree" );
+  Tree->Branch( "pass", &pass, "pass/I" );
+
+  ////////////////////////////////////////////
+  /////////// START TOOL SPECIFIC ////////////
+  ////////////////////////////////////////////
+
+  ////////////////////////////////////////////////////
+  //::: Tool setup
+  // setup the tool handle as per the
+  // recommendation by ASG - https://twiki.cern.ch/twiki/bin/view/AtlasProtected/AthAnalysisBase#How_to_use_AnaToolHandle
+  ////////////////////////////////////////////////////
+  std::cout<<"Initializing QG Tagger"<<std::endl;
+  asg::AnaToolHandle<CP::JetQGTagger> m_Tagger; //!
+  ASG_SET_ANA_TOOL_TYPE( m_Tagger, CP::JetQGTagger);
+  m_Tagger.setName("MyTagger");
+  if(verbose) ANA_CHECK( m_Tagger.setProperty("OutputLevel", MSG::DEBUG) );
+  ANA_CHECK( m_Tagger.setProperty( "ConfigFile",   "SmoothedWZTaggers/SmoothedContainedWTagger_AntiKt10LCTopoTrimmed_FixedSignalEfficiency50_MC15c_20161215.dat") );
+  ANA_CHECK( m_Tagger.retrieve() );
+
+  ////////////////////////////////////////////////////
+  // Loop over the events
+  ////////////////////////////////////////////////////
+  for( Long64_t entry = 0; entry < entries; ++entry ) {
+
+    if( nevents!=-1 && entry > nevents ) break;
+    // Tell the object which entry to look at:
+    event.getEntry( entry );
+
+    // Print some event information
+    const xAOD::EventInfo* evtInfo = 0;
+    if(event.retrieve( evtInfo, "EventInfo" ) != StatusCode::SUCCESS){
+      continue;
+    }
+    if(ievent!=-1 && static_cast <int> (evtInfo->eventNumber())!=ievent) {
+      continue;
+    }
+
+    // Get the jets
+    const xAOD::JetContainer* myJets = 0;
+    if( event.retrieve( myJets, "AntiKt10LCTopoTrimmedPtFrac5SmallR20Jets" ) != StatusCode::SUCCESS)
+      continue ;
+
+    // Loop over jet container
+    for(const xAOD::Jet* jet : * myJets ){
+
+      ANA_CHECK( m_Tagger->tag( *jet ) );
+      if(verbose) {
+        std::cout << "Testing W Tagger " << std::endl;
+        std::cout << "RunningTag : " << jet->auxdata<bool>("Tagged") << std::endl;
+      }
+
+      pass = jet->auxdata<bool>("Tagged");
+
+      Tree->Fill();
+    }
+
+    Info( APP_NAME, "===>>>  done processing event #%i, run #%i %i events processed so far  <<<===", static_cast< int >( evtInfo->eventNumber() ), static_cast< int >( evtInfo->runNumber() ), static_cast< int >( entry + 1 ) );
+  }
+
+  ////////////////////////////////////////////
+  /////////// END TOOL SPECIFIC //////////////
+  ////////////////////////////////////////////
+
+  // write the tree to the output file
+  outputFile->cd();
+  Tree->Write();
+  outputFile->Close();
+
+  // cleanup
+  delete chain;
+
+  // print the branches that were used for help with smart slimming
+  std::cout<<std::endl<<std::endl;
+  std::cout<<"Smart Slimming Checker :"<<std::endl;
+  xAOD::IOStats::instance().stats().printSmartSlimmingBranchList();
+  std::cout<<std::endl<<std::endl;
+
+  return 0;
+
+}
+
diff --git a/Reconstruction/Jet/BoostedJetTaggers/util/test_JetQGTaggerBDT.cxx b/Reconstruction/Jet/BoostedJetTaggers/util/test_JetQGTaggerBDT.cxx
new file mode 100644
index 000000000000..bc84f4459d66
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/util/test_JetQGTaggerBDT.cxx
@@ -0,0 +1,272 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+// System include(s):
+#include <string>
+
+// ROOT include(s):
+#include <TFile.h>
+#include <TString.h>
+#include <TTree.h>
+#include <TChain.h>
+
+// Infrastructure include(s):
+#ifdef ROOTCORE
+#   include "xAODRootAccess/Init.h"
+#   include "xAODRootAccess/TEvent.h"
+#endif // ROOTCORE
+
+// EDM include(s):
+#include "xAODCore/ShallowAuxContainer.h"
+#include "xAODCore/ShallowCopy.h"
+#include "xAODCore/tools/IOStats.h"
+
+// Tool testing include(s):
+#include "BoostedJetTaggers/JetQGTaggerBDT.h"
+
+// messaging
+ANA_MSG_HEADER(Test)
+ANA_MSG_SOURCE(Test, "BoostedJetTaggers")
+using namespace Test;
+
+int main( int argc, char* argv[] ) {
+
+  ANA_CHECK_SET_TYPE (int); // makes ANA_CHECK return ints if exiting function
+
+  // The application's name:
+  char* APP_NAME = argv[ 0 ];
+
+  // arguments
+  TString fileName = "/eos/atlas/atlascerngroupdisk/perf-jets/ReferenceFiles/mc16_13TeV.361028.Pythia8EvtGen_A14NNPDF23LO_jetjet_JZ8W.deriv.DAOD_FTAG1.e3569_s3126_r9364_r9315_p3260/DAOD_FTAG1.12133096._000074.pool.root.1";
+  int  ievent=-1;
+  int  nevents=-1;
+  bool verbose=false;
+
+
+  Info( APP_NAME, "==============================================" );
+  Info( APP_NAME, "Usage: $> %s [xAOD file name]", APP_NAME );
+  Info( APP_NAME, " $> %s       | Run on default file", APP_NAME );
+  Info( APP_NAME, " $> %s -f X  | Run on xAOD file X", APP_NAME );
+  Info( APP_NAME, " $> %s -n X  | X = number of events you want to run on", APP_NAME );
+  Info( APP_NAME, " $> %s -e X  | X = specific number of the event to run on - for debugging", APP_NAME );
+  Info( APP_NAME, " $> %s -v    | run in verbose mode   ", APP_NAME );
+  Info( APP_NAME, "==============================================" );
+
+  // Check if we received a file name:
+  if( argc < 2 ) {
+    Info( APP_NAME, "No arguments - using default file" );
+    Info( APP_NAME, "Executing on : %s", fileName.Data() );
+  }
+
+  ////////////////////////////////////////////////////
+  //:::  parse the options
+  ////////////////////////////////////////////////////
+  std::string options;
+  for( int i=0; i<argc; i++){
+    options+=(argv[i]);
+  }
+
+  if(options.find("-f")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-f")==0){
+        fileName = argv[ipos+1];
+        Info( APP_NAME, "Argument (-f) : Running on file # %s", fileName.Data() );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-event")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-event")==0){
+        ievent = atoi(argv[ipos+1]);
+        Info( APP_NAME, "Argument (-event) : Running only on event # %i", ievent );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-n")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-n")==0){
+        nevents = atoi(argv[ipos+1]);
+        Info( APP_NAME, "Argument (-n) : Running on NEvents = %i", nevents );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-v")!=std::string::npos){
+    verbose=true;
+    Info( APP_NAME, "Argument (-v) : Setting verbose");
+  }
+
+
+  ////////////////////////////////////////////////////
+  //:::  initialize the application and get the event
+  ////////////////////////////////////////////////////
+  if(! xAOD::Init( APP_NAME ) )
+    return 1;
+  StatusCode::enableFailure();
+
+  // Open the input file:
+  std::unique_ptr<TFile> ifile( TFile::Open( fileName, "READ" ) );
+  if( !ifile ){
+    Error( APP_NAME, "Cannot find file %s",fileName.Data() );
+    return 1;
+  }
+  ifile->Close();
+  ifile.reset( TFile::Open( fileName, "READ" ) );
+
+  // Create a TEvent object:
+  xAOD::TEvent event( ifile.get(), xAOD::TEvent::kAthenaAccess );
+  Info( APP_NAME, "Number of events in the file: %i", static_cast< int >( event.getEntries() ) );
+
+  // Create a transient object store. Needed for the tools.
+  xAOD::TStore store;
+
+  // Decide how many events to run over:
+  Long64_t entries = event.getEntries();
+
+  // Fill a validation true with the tag return value
+  std::unique_ptr<TFile> outputFile(TFile::Open( "output_JetQGTaggerBDT.root", "recreate" ));
+  int pass;
+  TTree* Tree = new TTree( "tree", "test_tree" );
+  Tree->SetDirectory( outputFile.get() );
+  Tree->Branch( "pass", &pass, "pass/I" );
+
+  ////////////////////////////////////////////
+  /////////// START TOOL SPECIFIC ////////////
+  ////////////////////////////////////////////
+
+  ////////////////////////////////////////////////////
+  //::: Tool setup
+  // setup the tool handle as per the
+  // recommendation by ASG - https://twiki.cern.ch/twiki/bin/view/AtlasProtected/AthAnalysisBase#How_to_use_AnaToolHandle
+  ////////////////////////////////////////////////////
+  std::cout<<"Initializing QG BDT Tagger"<<std::endl;
+  asg::AnaToolHandle<CP::JetQGTaggerBDT> m_Tagger; //!
+  m_Tagger.setName("MyTagger");
+  if(verbose) ANA_CHECK( m_Tagger.setProperty("OutputLevel", MSG::DEBUG) );
+  if(! m_Tagger.setProperty( "ConfigFile", "JetQGTaggerBDT/JetQGTaggerBDT50Gluon.dat") )  return 1;
+  if(! m_Tagger.setProperty( "UseJetVars", 0) )  return 1;
+  if(! m_Tagger.retrieve() )  return 1;
+
+  ////////////////////////////////////////////////////
+  // Loop over the events
+  ////////////////////////////////////////////////////
+
+  //weighted number of quark, gluon jets and tags
+  float w_nGluon = 0.;
+  float w_nQuark = 0.;
+  float w_nGluonTaggedANDisGluon = 0.;
+  float w_nQuarkTaggedANDisQuark = 0.;
+  float w_nGluonTaggedANDisQuark = 0.;
+  float w_nQuarkTaggedANDisGluon = 0.;
+  float eventweight = 0.;
+
+  for( Long64_t entry = 0; entry < entries; ++entry ) {
+
+    if( nevents!=-1 && entry > nevents ) break;
+    // Tell the object which entry to look at:
+    event.getEntry( entry );
+
+    // Print some event information
+    const xAOD::EventInfo* evtInfo = 0;
+    if( ! event.retrieve( evtInfo, "EventInfo" ).isSuccess() ) {
+      continue;
+    }
+    if(ievent!=-1 && static_cast <int> (evtInfo->eventNumber())!=ievent) {
+      continue;
+    }
+    eventweight = evtInfo->mcEventWeight();
+
+    // Get the jets
+    const xAOD::JetContainer* myJets = 0;
+    if( ! event.retrieve( myJets, "AntiKt4EMTopoJets" ).isSuccess() ) {
+      continue ;
+    }
+
+    // Loop over jet container
+    for(const xAOD::Jet* jet : * myJets ){
+      int truthlabel = jet->getAttribute<int>("PartonTruthLabelID");
+      if(jet->pt()<20000 || TMath::Abs(jet->eta())>2.5 || truthlabel==-1 || truthlabel==5)
+    	continue;
+      if(verbose) std::cout<<std::endl;
+
+      ANA_CHECK( m_Tagger->tag( *jet ) );
+      if(verbose) {
+        std::cout << "Testing QG BDT Tagger " << std::endl;
+        std::cout << "RunningTag : " << jet->auxdata<bool>("Tagged") << " jet truth label: " << truthlabel << std::endl;
+      }
+      
+      //--------------------------------------------------------------------------------
+      switch (truthlabel) {
+      case -1:
+        break;
+      case 1:
+      case 2:
+      case 3:
+      case 4:
+        w_nQuark += eventweight;
+        if(jet->auxdata<bool>("Tagged")==1){
+          w_nQuarkTaggedANDisQuark += eventweight;
+        }
+        else{
+          w_nGluonTaggedANDisQuark += eventweight;
+        }
+        break;
+      case 5:
+        break;
+      case 21:
+        w_nGluon += eventweight;
+        if(jet->auxdata<bool>("Tagged")==1){
+          w_nQuarkTaggedANDisGluon += eventweight;
+        }
+        else{
+          w_nGluonTaggedANDisGluon += eventweight;
+        }
+        break;
+      default:
+        break;
+      }
+      //--------------------------------------------------------------------------------
+
+      pass = jet->auxdata<bool>("Tagged");
+
+      Tree->Fill();
+    }
+
+    if( nevents!=-1 && entry%100 == 0) Info( APP_NAME, "===>>>  done processing event #%i, run #%i %i events processed so far  <<<===", static_cast< int >( evtInfo->eventNumber() ), static_cast< int >( evtInfo->runNumber() ), static_cast< int >( entry + 1 ) );
+  }
+  ////////////////////////////////////////////
+  /////////// END TOOL SPECIFIC //////////////
+  ////////////////////////////////////////////
+
+  if(verbose){
+    std::cout<<"gluons: "<<w_nGluon<<"\n";
+    std::cout<<"lights: "<<w_nQuark<<"\n";
+    std::cout<<"efficiencies for gluon WP:"<<"\n";
+    std::cout<<"gluon efficiency: "<<w_nGluonTaggedANDisGluon/w_nGluon<<"\n";
+    std::cout<<"quark efficiency: "<<w_nGluonTaggedANDisQuark/w_nQuark<<"\n";
+    std::cout<<"efficiencies for quark WP:"<<"\n";
+    std::cout<<"quark efficiency: "<<w_nQuarkTaggedANDisQuark/w_nQuark<<"\n";
+    std::cout<<"gluon efficiency: "<<w_nQuarkTaggedANDisGluon/w_nGluon<<"\n";
+  }
+
+  // write the tree to the output file
+  outputFile->cd();
+  Tree->Write();
+  outputFile->Close();
+
+  // print the branches that were used for help with smart slimming
+  std::cout<<std::endl<<std::endl;
+  std::cout<<"Smart Slimming Checker :"<<std::endl;
+  xAOD::IOStats::instance().stats().printSmartSlimmingBranchList();
+  std::cout<<std::endl<<std::endl;
+
+  return 0;
+
+}
+
diff --git a/Reconstruction/Jet/BoostedJetTaggers/util/test_SmoothedWZTagger.cxx b/Reconstruction/Jet/BoostedJetTaggers/util/test_SmoothedWZTagger.cxx
new file mode 100644
index 000000000000..11c5f2866a5a
--- /dev/null
+++ b/Reconstruction/Jet/BoostedJetTaggers/util/test_SmoothedWZTagger.cxx
@@ -0,0 +1,258 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+// System include(s):
+#include <string>
+
+// ROOT include(s):
+#include <TFile.h>
+#include <TString.h>
+#include <TTree.h>
+#include <TChain.h>
+
+// Infrastructure include(s):
+#ifdef ROOTCORE
+#   include "xAODRootAccess/Init.h"
+#   include "xAODRootAccess/TEvent.h"
+#endif // ROOTCORE
+
+// EDM include(s):
+#include "xAODCore/ShallowAuxContainer.h"
+#include "xAODCore/ShallowCopy.h"
+#include "xAODCore/tools/IOStats.h"
+
+// Tool testing include(s):
+#include "BoostedJetTaggers/SmoothedWZTagger.h"
+
+#include "AsgMessaging/MessageCheck.h"
+
+// messaging
+ANA_MSG_HEADER(Test)
+ANA_MSG_SOURCE(Test, "BoostedJetTaggers")
+using namespace Test;
+
+int main( int argc, char* argv[] ) {
+
+  ANA_CHECK_SET_TYPE (int); // makes ANA_CHECK return ints if exiting function
+
+  // The application's name:
+  char* APP_NAME = argv[ 0 ];
+
+  // arguments
+  TString fileName = "/eos/atlas/atlascerngroupdisk/perf-jets/ReferenceFiles/mc16_13TeV.361028.Pythia8EvtGen_A14NNPDF23LO_jetjet_JZ8W.deriv.DAOD_FTAG1.e3569_s3126_r9364_r9315_p3260/DAOD_FTAG1.12133096._000074.pool.root.1";
+  int  ievent=-1;
+  int  nevents=-1;
+  bool m_isMC=true;
+  bool verbose=false;
+
+
+  Info( APP_NAME, "==============================================" );
+  Info( APP_NAME, "Usage: $> %s [xAOD file name]", APP_NAME );
+  Info( APP_NAME, " $> %s       | Run on default file", APP_NAME );
+  Info( APP_NAME, " $> %s -f X  | Run on xAOD file X", APP_NAME );
+  Info( APP_NAME, " $> %s -n X  | X = number of events you want to run on", APP_NAME );
+  Info( APP_NAME, " $> %s -e X  | X = specific number of the event to run on - for debugging", APP_NAME );
+  Info( APP_NAME, " $> %s -d X  | X = dataset ID", APP_NAME );
+  Info( APP_NAME, " $> %s -m X  | X = isMC", APP_NAME );
+  Info( APP_NAME, " $> %s -v    | run in verbose mode   ", APP_NAME );
+  Info( APP_NAME, "==============================================" );
+
+  // Check if we received a file name:
+  if( argc < 2 ) {
+    Info( APP_NAME, "No arguments - using default file" );
+    Info( APP_NAME, "Executing on : %s", fileName.Data() );
+  }
+
+  ////////////////////////////////////////////////////
+  //:::  parse the options
+  ////////////////////////////////////////////////////
+  std::string options;
+  for( int i=0; i<argc; i++){
+    options+=(argv[i]);
+  }
+
+  if(options.find("-f")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-f")==0){
+        fileName = argv[ipos+1];
+        Info( APP_NAME, "Argument (-f) : Running on file # %s", fileName.Data() );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-event")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-event")==0){
+        ievent = atoi(argv[ipos+1]);
+        Info( APP_NAME, "Argument (-event) : Running only on event # %i", ievent );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-m")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-m")==0){
+        m_isMC = atoi(argv[ipos+1]);
+        Info( APP_NAME, "Argument (-m) : IsMC = %i", m_isMC );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-n")!=std::string::npos){
+    for( int ipos=0; ipos<argc ; ipos++ ) {
+      if(std::string(argv[ipos]).compare("-n")==0){
+        nevents = atoi(argv[ipos+1]);
+        Info( APP_NAME, "Argument (-n) : Running on NEvents = %i", nevents );
+        break;
+      }
+    }
+  }
+
+  if(options.find("-v")!=std::string::npos){
+    verbose=true;
+    Info( APP_NAME, "Argument (-v) : Setting verbose");
+  }
+
+
+  ////////////////////////////////////////////////////
+  //:::  initialize the application and get the event
+  ////////////////////////////////////////////////////
+  ANA_CHECK( xAOD::Init( APP_NAME ) );
+  StatusCode::enableFailure();
+
+  // Open the input file:
+  TFile* ifile( TFile::Open( fileName, "READ" ) );
+  if( !ifile ) Error( APP_NAME, "Cannot find file %s",fileName.Data() );
+
+  TChain *chain = new TChain ("CollectionTree","CollectionTree");
+  chain->Add(fileName);
+
+  // Create a TEvent object:
+  xAOD::TEvent event( (TTree*)chain, xAOD::TEvent::kAthenaAccess );
+  Info( APP_NAME, "Number of events in the file: %i", static_cast< int >( event.getEntries() ) );
+
+  // Create a transient object store. Needed for the tools.
+  xAOD::TStore store;
+
+  // Decide how many events to run over:
+  Long64_t entries = event.getEntries();
+
+  // Fill a validation true with the tag return value
+  std::unique_ptr<TFile> outputFile(TFile::Open("output_SmoothedWZTagger.root", "recreate"));
+  int pass,truthLabel,ntrk;
+  float sf,pt,eta,m;
+  TTree* Tree = new TTree( "tree", "test_tree" );
+  Tree->Branch( "pass", &pass, "pass/I" );
+  Tree->Branch( "sf", &sf, "sf/F" );
+  Tree->Branch( "pt", &pt, "pt/F" );
+  Tree->Branch( "m", &m, "m/F" );
+  Tree->Branch( "eta", &eta, "eta/F" );
+  Tree->Branch( "ntrk", &ntrk, "ntrk/I" );
+  Tree->Branch( "truthLabel", &truthLabel, "truthLabel/I" );
+  
+  ////////////////////////////////////////////
+  /////////// START TOOL SPECIFIC ////////////
+  ////////////////////////////////////////////
+
+  ////////////////////////////////////////////////////
+  //::: Tool setup
+  // setup the tool handle as per the
+  // recommendation by ASG - https://twiki.cern.ch/twiki/bin/view/AtlasProtected/AthAnalysisBase#How_to_use_AnaToolHandle
+  ////////////////////////////////////////////////////
+  std::cout<<"Initializing WZ Tagger"<<std::endl;
+  asg::AnaToolHandle<SmoothedWZTagger> m_Tagger; //!
+  ASG_SET_ANA_TOOL_TYPE( m_Tagger, SmoothedWZTagger);
+  m_Tagger.setName("MyTagger");
+  if(verbose) ANA_CHECK( m_Tagger.setProperty("OutputLevel", MSG::DEBUG) );
+  //ANA_CHECK( m_Tagger.setProperty( "CalibArea", "SmoothedWZTaggers/Rel21/") );
+  //ANA_CHECK( m_Tagger.setProperty( "ConfigFile",   "SmoothedContainedWTagger_AntiKt10LCTopoTrimmed_FixedSignalEfficiency50_MC16d_20190410.dat") );
+  ANA_CHECK( m_Tagger.setProperty( "CalibArea", "Local") );
+  ANA_CHECK( m_Tagger.setProperty( "ConfigFile",   "SmoothedWZTaggers/temp_SmoothedContainedWTagger_AntiKt10LCTopoTrimmed_FixedSignalEfficiency50_MC16d.dat") );
+  ANA_CHECK( m_Tagger.setProperty( "IsMC", m_isMC ) );
+  ANA_CHECK( m_Tagger.retrieve() );
+
+  ////////////////////////////////////////////////////
+  // Loop over the events
+  ////////////////////////////////////////////////////
+  for( Long64_t entry = 0; entry < entries; ++entry ) {
+
+    if( nevents!=-1 && entry > nevents ) break;
+    // Tell the object which entry to look at:
+    event.getEntry( entry );
+
+    // Print some event information
+    const xAOD::EventInfo* evtInfo = 0;
+    if(event.retrieve( evtInfo, "EventInfo" ) != StatusCode::SUCCESS){
+      continue;
+    }
+    if(ievent!=-1 && static_cast <int> (evtInfo->eventNumber())!=ievent) {
+      continue;
+    }
+
+    // Get the jets
+    const xAOD::JetContainer* myJets = 0;
+    if( event.retrieve( myJets, "AntiKt10LCTopoTrimmedPtFrac5SmallR20Jets" ) != StatusCode::SUCCESS)
+      continue ;
+
+    // Loop over jet container
+    std::pair< xAOD::JetContainer*, xAOD::ShallowAuxContainer* > jets_shallowCopy = xAOD::shallowCopyContainer( *myJets );
+    std::unique_ptr<xAOD::JetContainer> shallowJets(jets_shallowCopy.first);
+    std::unique_ptr<xAOD::ShallowAuxContainer> shallowAux(jets_shallowCopy.second);
+    for( xAOD::Jet* jetSC : *shallowJets ){
+
+      ANA_CHECK( m_Tagger->tag( *jetSC ) );
+      if(verbose) {
+        std::cout << "Testing W Tagger " << std::endl;
+        std::cout << "jet pt              = " << jetSC->pt() << std::endl;
+        std::cout << "jet ntrk            = " << jetSC->auxdata<int>("SmoothWContained50_ParentJetNTrkPt500") << std::endl;
+        std::cout << "RunningTag : " << jetSC->auxdata<bool>("SmoothWContained50_Tagged") << std::endl;
+        std::cout << "result d2pass       = " << jetSC->auxdata<bool>("SmoothWContained50_PassD2") << std::endl;
+        std::cout << "result ntrkpass     = " << jetSC->auxdata<bool>("SmoothWContained50_PassNtrk") << std::endl;
+        std::cout << "result masspass     = " << jetSC->auxdata<bool>("SmoothWContained50_PassMass") << std::endl;
+      }
+      truthLabel = jetSC->auxdata<int>("R10TruthLabel_R21Consolidated");
+
+      pass = jetSC->auxdata<bool>("SmoothWContained50_Tagged");
+      pt = jetSC->pt();
+      m  = jetSC->m();
+      eta = jetSC->eta();
+      ntrk = jetSC->auxdata<int>("ParentJetNTrkPt500");
+      sf = jetSC->auxdata<float>("SmoothWContained50_SF");
+      std::cout << "pass " << pass
+		<< " truthLabel " << truthLabel
+		<< " sf " << sf
+		<< " eff " << jetSC->auxdata<float>("SmoothWContained50_effMC")
+		<< std::endl;
+
+      Tree->Fill();
+    }
+
+    Info( APP_NAME, "===>>>  done processing event #%i, run #%i %i events processed so far  <<<===", static_cast< int >( evtInfo->eventNumber() ), static_cast< int >( evtInfo->runNumber() ), static_cast< int >( entry + 1 ) );
+  }
+
+  ////////////////////////////////////////////
+  /////////// END TOOL SPECIFIC //////////////
+  ////////////////////////////////////////////
+
+  // write the tree to the output file
+  outputFile->cd();
+  Tree->Write();
+  outputFile->Close();
+
+  // cleanup
+  delete chain;
+
+  // print the branches that were used for help with smart slimming
+  std::cout<<std::endl<<std::endl;
+  std::cout<<"Smart Slimming Checker :"<<std::endl;
+  xAOD::IOStats::instance().stats().printSmartSlimmingBranchList();
+  std::cout<<std::endl<<std::endl;
+
+  return 0;
+
+}
+
-- 
GitLab


From d1b9add7790e65dab501d1b0970df514045e25a2 Mon Sep 17 00:00:00 2001
From: Adam Edward Barton <adam.edward.barton@cern.ch>
Date: Wed, 16 Dec 2020 10:16:12 +0000
Subject: [PATCH 066/225] Initial migration of BPHY Derivations to master

---
 .../BPhysTools/BPhysTools/BPhysBlindingTool.h |  278 +++
 .../BPhysTools/BPhysTools/BPhysToolsDict.h    |   16 +
 .../BPhysTools/BPhysTrackVertexMapTool.h      |  196 ++
 .../BPhysTools/IBPhysBlindingTool.h           |   79 +
 .../BPhysTools/IBPhysTrackVertexMapTool.h     |  109 +
 .../BPhysTools/BPhysTools/SimpleEncrypter.h   |  244 ++
 .../BPhys/BPhysTools/BPhysTools/selection.xml |   10 +
 .../BPhys/BPhysTools/CMakeLists.txt           |   84 +
 .../BPhysTools/Root/BPhysBlindingTool.cxx     |  464 ++++
 .../Root/BPhysTrackVertexMapTool.cxx          |  664 +++++
 .../BPhys/BPhysTools/Root/SimpleEncrypter.cxx |  516 ++++
 .../src/components/BPhysTools_entries.cxx     |    4 +
 .../BPhysTools/util/createBlindingKeys.cxx    |   83 +
 .../DerivationFrameworkBPhys/CMakeLists.txt   |   26 +
 .../AugOriginalCounts.h                       |   91 +
 .../BMuonTrackIsoTool.h                       |  111 +
 .../BPhysAddMuonBasedInvMass.h                |  304 +++
 .../BPhysConversionFinder.h                   |   76 +
 .../BPhysMetadataBase.h                       |  100 +
 .../BPhysPVCascadeTools.h                     |  159 ++
 .../BPhysPVThinningTool.h                     |   53 +
 .../DerivationFrameworkBPhys/BPhysPVTools.h   |  108 +
 .../BPhysVarBlinder.h                         |   76 +
 .../BPhysVertexTrackBase.h                    |  303 +++
 .../BTrackVertexMapLogger.h                   |   49 +
 .../BVertexClosestTrackTool.h                 |  149 ++
 .../BVertexTrackIsoTool.h                     |  119 +
 .../BmumuThinningTool.h                       |  441 ++++
 .../DerivationFrameworkBPhys/Bmumu_metadata.h |   42 +
 .../Bmumu_reco_mumu.h                         |   73 +
 .../DerivationFrameworkBPhys/Cascade3Plus1.h  |   99 +
 .../DerivationFrameworkBPhys/CascadeTools.h   |   87 +
 .../DerivationFrameworkBPhys/CfAthAlgTool.h   |   86 +
 .../DerivationFrameworkBPhys/FourMuonTool.h   |  188 ++
 .../JpsiPlusDpstCascade.h                     |   96 +
 .../JpsiPlusDs1Cascade.h                      |  105 +
 .../JpsiPlusDsCascade.h                       |   91 +
 .../JpsiPlusV0Cascade.h                       |   94 +
 .../DerivationFrameworkBPhys/LocalVector.h    |   72 +
 .../MuonExtrapolationTool.h                   |   59 +
 .../DerivationFrameworkBPhys/ReVertex.h       |   98 +
 .../DerivationFrameworkBPhys/Reco_4mu.h       |   63 +
 .../DerivationFrameworkBPhys/Reco_V0Finder.h  |   63 +
 .../DerivationFrameworkBPhys/Reco_Vertex.h    |   54 +
 .../DerivationFrameworkBPhys/Select_Bmumu.h   |  116 +
 .../Select_onia2mumu.h                        |   71 +
 .../Thin_vtxDuplicates.h                      |   37 +
 .../DerivationFrameworkBPhys/Thin_vtxTrk.h    |   54 +
 .../TriggerCountToMetadata.h                  |   51 +
 .../VertexCaloIsolation.h                     |   89 +
 .../VertexPlus1TrackCascade.h                 |   74 +
 .../VertexTrackIsolation.h                    |   52 +
 .../python/BPhysPyHelpers.py                  |   84 +
 .../python/__init__.py                        |    2 +
 .../DerivationFrameworkBPhys/share/BPHY1.py   |  274 ++
 .../DerivationFrameworkBPhys/share/BPHY10.py  |  477 ++++
 .../DerivationFrameworkBPhys/share/BPHY11.py  |  506 ++++
 .../DerivationFrameworkBPhys/share/BPHY12.py  |  389 +++
 .../DerivationFrameworkBPhys/share/BPHY13.py  |  483 ++++
 .../DerivationFrameworkBPhys/share/BPHY14.py  |  329 +++
 .../DerivationFrameworkBPhys/share/BPHY15.py  |  855 +++++++
 .../DerivationFrameworkBPhys/share/BPHY16.py  |  288 +++
 .../DerivationFrameworkBPhys/share/BPHY17.py  |  316 +++
 .../DerivationFrameworkBPhys/share/BPHY18.py  |  506 ++++
 .../DerivationFrameworkBPhys/share/BPHY19.py  |  313 +++
 .../DerivationFrameworkBPhys/share/BPHY2.py   |  332 +++
 .../DerivationFrameworkBPhys/share/BPHY20.py  |  775 ++++++
 .../DerivationFrameworkBPhys/share/BPHY21.py  |  329 +++
 .../DerivationFrameworkBPhys/share/BPHY22.py  |   22 +
 .../DerivationFrameworkBPhys/share/BPHY3.py   |  284 +++
 .../DerivationFrameworkBPhys/share/BPHY4.py   |  155 ++
 .../DerivationFrameworkBPhys/share/BPHY5.py   |  558 +++++
 .../DerivationFrameworkBPhys/share/BPHY6.py   |  344 +++
 .../DerivationFrameworkBPhys/share/BPHY7.py   |  648 +++++
 .../DerivationFrameworkBPhys/share/BPHY8.py   | 2200 +++++++++++++++++
 .../DerivationFrameworkBPhys/share/BPHY9.py   |  398 +++
 .../SaveExtraMetadataInMerge_jobOFragment.py  |   53 +
 .../share/configureConversionFinder.py        |   69 +
 .../share/configureSimpleV0Finder.py          |  201 ++
 .../share/configureV0Finder.py                |  202 ++
 .../share/configureVertexing.py               |  148 ++
 .../src/AugOriginalCounts.cxx                 |  150 ++
 .../src/BMuonTrackIsoTool.cxx                 |  448 ++++
 .../src/BPhysAddMuonBasedInvMass.cxx          |  702 ++++++
 .../src/BPhysConversionFinder.cxx             |  589 +++++
 .../src/BPhysMetadataBase.cxx                 |  270 ++
 .../src/BPhysPVCascadeTools.cxx               |  475 ++++
 .../src/BPhysPVThinningTool.cxx               |  134 +
 .../src/BPhysPVTools.cxx                      |  545 ++++
 .../src/BPhysVarBlinder.cxxNoCompile          |   72 +
 .../src/BPhysVertexTrackBase.cxx              | 1480 +++++++++++
 .../src/BTrackVertexMapLogger.cxx             |  104 +
 .../src/BVertexClosestTrackTool.cxx           |  672 +++++
 .../src/BVertexTrackIsoTool.cxx               |  511 ++++
 .../src/BmumuThinningTool.cxx_NoCompile       | 1167 +++++++++
 .../src/Bmumu_metadata.cxx                    |  238 ++
 .../src/Bmumu_reco_mumu.cxx                   |  177 ++
 .../src/Cascade3Plus1.cxx                     |  524 ++++
 .../src/CascadeTools.cxx                      |  608 +++++
 .../src/CfAthAlgTool.cxx                      |  178 ++
 .../src/FourMuonTool.cxx                      |  449 ++++
 .../src/JpsiPlusDpstCascade.cxx               |  724 ++++++
 .../src/JpsiPlusDs1Cascade.cxx                |  905 +++++++
 .../src/JpsiPlusDsCascade.cxx                 |  702 ++++++
 .../src/JpsiPlusV0Cascade.cxx                 |  576 +++++
 .../src/MuonExtrapolationTool.cxx             |  182 ++
 .../DerivationFrameworkBPhys/src/ReVertex.cxx |  284 +++
 .../DerivationFrameworkBPhys/src/Reco_4mu.cxx |  269 ++
 .../src/Reco_V0Finder.cxx                     |  307 +++
 .../src/Reco_Vertex.cxx                       |  163 ++
 .../src/Select_Bmumu.cxx                      |  563 +++++
 .../src/Select_onia2mumu.cxx                  |  197 ++
 .../src/Thin_vtxDuplicates.cxx                |  176 ++
 .../src/Thin_vtxTrk.cxx                       |  200 ++
 .../src/TriggerCountToMetadata.cxx            |   62 +
 .../src/VertexCaloIsolation.cxx               |  583 +++++
 .../src/VertexPlus1TrackCascade.cxx           |  215 ++
 .../src/VertexTrackIsolation.cxx              |  274 ++
 .../DerivationFrameworkBPhys_entries.cxx      |   74 +
 119 files changed, 34315 insertions(+)
 create mode 100644 PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/BPhysBlindingTool.h
 create mode 100644 PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/BPhysToolsDict.h
 create mode 100644 PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/BPhysTrackVertexMapTool.h
 create mode 100644 PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/IBPhysBlindingTool.h
 create mode 100644 PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/IBPhysTrackVertexMapTool.h
 create mode 100644 PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/SimpleEncrypter.h
 create mode 100644 PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/selection.xml
 create mode 100644 PhysicsAnalysis/BPhys/BPhysTools/CMakeLists.txt
 create mode 100644 PhysicsAnalysis/BPhys/BPhysTools/Root/BPhysBlindingTool.cxx
 create mode 100644 PhysicsAnalysis/BPhys/BPhysTools/Root/BPhysTrackVertexMapTool.cxx
 create mode 100644 PhysicsAnalysis/BPhys/BPhysTools/Root/SimpleEncrypter.cxx
 create mode 100644 PhysicsAnalysis/BPhys/BPhysTools/src/components/BPhysTools_entries.cxx
 create mode 100644 PhysicsAnalysis/BPhys/BPhysTools/util/createBlindingKeys.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/CMakeLists.txt
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/AugOriginalCounts.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BMuonTrackIsoTool.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysAddMuonBasedInvMass.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysConversionFinder.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysMetadataBase.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysPVCascadeTools.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysPVThinningTool.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysPVTools.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysVarBlinder.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysVertexTrackBase.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BTrackVertexMapLogger.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BVertexClosestTrackTool.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BVertexTrackIsoTool.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BmumuThinningTool.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Bmumu_metadata.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Bmumu_reco_mumu.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Cascade3Plus1.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/CascadeTools.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/CfAthAlgTool.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/FourMuonTool.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/JpsiPlusDpstCascade.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/JpsiPlusDs1Cascade.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/JpsiPlusDsCascade.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/JpsiPlusV0Cascade.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/LocalVector.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/MuonExtrapolationTool.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/ReVertex.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Reco_4mu.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Reco_V0Finder.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Reco_Vertex.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Select_Bmumu.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Select_onia2mumu.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Thin_vtxDuplicates.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Thin_vtxTrk.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/TriggerCountToMetadata.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/VertexCaloIsolation.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/VertexPlus1TrackCascade.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/VertexTrackIsolation.h
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/python/BPhysPyHelpers.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/python/__init__.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY1.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY10.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY11.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY12.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY13.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY14.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY15.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY16.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY17.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY18.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY19.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY2.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY20.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY21.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY22.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY3.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY4.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY5.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY6.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY7.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY8.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY9.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/SaveExtraMetadataInMerge_jobOFragment.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/configureConversionFinder.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/configureSimpleV0Finder.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/configureV0Finder.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/configureVertexing.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/AugOriginalCounts.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BMuonTrackIsoTool.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysAddMuonBasedInvMass.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysConversionFinder.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysMetadataBase.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysPVCascadeTools.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysPVThinningTool.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysPVTools.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysVarBlinder.cxxNoCompile
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysVertexTrackBase.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BTrackVertexMapLogger.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BVertexClosestTrackTool.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BVertexTrackIsoTool.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BmumuThinningTool.cxx_NoCompile
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Bmumu_metadata.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Bmumu_reco_mumu.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Cascade3Plus1.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/CascadeTools.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/CfAthAlgTool.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/FourMuonTool.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/JpsiPlusDpstCascade.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/JpsiPlusDs1Cascade.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/JpsiPlusDsCascade.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/JpsiPlusV0Cascade.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/MuonExtrapolationTool.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/ReVertex.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Reco_4mu.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Reco_V0Finder.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Reco_Vertex.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Select_Bmumu.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Select_onia2mumu.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Thin_vtxDuplicates.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Thin_vtxTrk.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/TriggerCountToMetadata.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/VertexCaloIsolation.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/VertexPlus1TrackCascade.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/VertexTrackIsolation.cxx
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/components/DerivationFrameworkBPhys_entries.cxx

diff --git a/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/BPhysBlindingTool.h b/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/BPhysBlindingTool.h
new file mode 100644
index 000000000000..c7aed623cecb
--- /dev/null
+++ b/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/BPhysBlindingTool.h
@@ -0,0 +1,278 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+
+/**
+ * @file   BPhysBlindingTool.h
+ * @author Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch>
+ *
+ * @brief  Dual-use tool for blinding and unblinding certain float values
+ */
+
+// $Id: $
+#ifndef BPHYSTOOLS_BPHYSBLINDINGTOOL_H
+#define BPHYSTOOLS_BPHYSBLINDINGTOOL_H
+
+// Framework includes
+#include "AsgTools/AsgTool.h"
+
+// System include(s):
+#include <memory>
+
+// Local includes
+#include "BPhysTools/IBPhysBlindingTool.h"
+#include "BPhysTools/SimpleEncrypter.h"
+
+
+// EDM includes
+#include "xAODTracking/VertexAuxContainer.h"
+
+namespace xAOD {
+  ///
+  /// @class  BPhysBlindingToll
+  /// @author Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch>
+  ///
+  /// Dual-use tool for blinding and unblinding certain float values
+  /// provided as variables in a container.
+  ///
+  /// This tool can be used in two ways:
+  /// 1. As a tool to blind or unblind arbitrary positive float values
+  ///    using doBlind(float val) or doUnblind(float val).
+  ///    For this mode to work only the corresponding key
+  ///    (JO BlindingKey or UnblindingKey) needs to be set.
+  /// 2. As a tool to blind a list of variables (VarToBlindNames)
+  ///    for a certain xAOD::VertexContainer's vertices.
+  ///    Since this only works for positive float values,
+  ///    an the values may be scaled by a factor and an
+  ///    offset may be added to the values, specified separately for
+  ///    each variable (BlindingFactors, BlindingOffsets).
+  ///    In addition a negative sign may be added to the resulting blinded
+  ///    value (NegativeSigns) as a convenience.
+  ///    If this tool is used for unblinding the same values for
+  ///    BlindingFactors, BlindingOffsets and NegativeSigns need to be
+  ///    provided.
+  ///    Depending on the mode, the BlindingKey or Unblindingkey need
+  ///    to be set.
+  ///
+  ///    @Note: Key pairs may be produced using the createBlindingKeys
+  ///           utility.
+  ///
+  /// Job options:
+  ///  - BlindingKey
+  ///    Hex string providing the (public) blinding key.
+  ///  - UnblindingKey
+  ///    Hex string providing the (private) unblinding key.
+  ///  - VertexContainerName
+  ///    Name of the vertex container to be used
+  ///  - BlindingFlag
+  ///    Flag to indicate candidates for blinding ("pass_XXXX")
+  ///    Blind values for all candidates if empty.
+  ///  - VarToBlindNames
+  ///    String with list of float variables to blind (delimiter: .)
+  ///  - BlindingOffsets
+  ///    Offsets applied to values before blinding
+  ///    List must have same length as VarToBlindNames or zero.
+  ///  - BlindingFactors
+  ///    Scale factors applied before blinding
+  ///    List must have same length as VarToBlindNames or zero.
+  ///  - NegativeSigns
+  ///    Flip signs to negative range?
+  ///    List must have same length as VarToBlindNames or zero.
+  ///
+  ///
+  class BPhysBlindingTool :
+    public asg::AsgTool, virtual public xAOD::IBPhysBlindingTool {
+    
+    /// Declare the correct constructor for Athena
+    ASG_TOOL_CLASS( BPhysBlindingTool, xAOD::IBPhysBlindingTool )
+    
+   public:
+    ///
+    /// @brief Regular AsgTool constructor
+    BPhysBlindingTool(const std::string& name = "BPhysBlindingTool");
+    ///
+    /// @brief Method initialising the tool
+    virtual StatusCode initialize() override;
+
+    ///
+    /// @brief Method finalizing the tool
+    virtual StatusCode finalize() override;
+
+    ///
+    /// @brief Simply blind one positive float value
+    ///
+    /// @param[in] val : positive float value to blind.
+    ///
+    /// @returns Blinded positive float value; same value as input on error.
+    virtual float doBlind(const float& val) override;
+
+    ///
+    /// @name Methods to be called by user classes
+    /// @{
+    ///
+    /// @brief Simply unblind one positive float value
+    ///
+    /// @param[in] val : Blinded positive float value.
+    ///
+    /// @returns Unblinded positive float value; same value as input on error.
+    virtual float doUnblind(const float& val) override;
+
+    ///
+    /// @brief Simply blind one (positive) float value with corrections
+    ///
+    /// @param[in] val          : float value to blind.
+    /// @param[in] negativeSign : flip sign after blinding
+    /// @param[in] offset       : before blinding, shift by offset
+    /// @param[in] factor       : before blinding, stretch by factor
+    ///
+    /// @returns Blinded float value; same value as input on error.
+    virtual float doBlind(const float& val,
+                          const bool&  negativeSign,
+                          const float& offset,
+                          const float& factor) override;
+
+    ///
+    /// @name Methods to be called by user classes
+    /// @{
+    ///
+    /// @brief Simply unblind one (positive) float value with corrections
+    ///
+    /// @param[in] val          : Blinded float value.
+    /// @param[in] negativeSign : flip sign before unblinding
+    /// @param[in] offset       : after unblinding, shift by offset
+    /// @param[in] factor       : after unblinding, stretch by factor
+    ///
+    /// @returns Unblinded positive float value; same value as input on error.
+    virtual float doUnblind(const float& val,
+                            const bool&  negativeSign,
+                            const float& offset,
+                            const float& factor) override;
+
+    /// 
+    /// @brief Perform blinding of requested variables
+    virtual StatusCode doBlind() override;
+
+    /// 
+    /// @brief Perform unblinding of requested variables
+    virtual StatusCode doUnblind() override;
+
+  protected:
+    ///
+    /// @name Perform blinding or unblinding action
+    ///
+    virtual StatusCode doBlindingAction(bool unblind=false);
+    ///
+    /// @name Utility methods
+    /// @{
+    ///
+    /// @brief Check whether an element is marked as passing a hypothesis.
+    /// 
+    virtual bool pass(const SG::AuxElement& em, std::string hypo);
+    
+    ///
+    /// @brief Tokenize a string using certain separators
+    ///
+    virtual std::vector<std::string> getTokens(std::string input,
+                                               std::string seperators);
+    ///
+    /// @brief Convert vector of floats to string
+    ///
+    virtual std::string vecToString(const std::vector<float>& v) const;
+    ///
+    /// @brief Convert vector of bools to string
+    ///
+    virtual std::string vecToString(const std::vector<bool>& v) const;
+    ///
+    /// @name Cache current event.
+    ///
+    virtual StatusCode cacheEvent();
+    /// @}
+    
+  protected:      
+    ///
+    /// @name Job options
+    /// @{
+    ///
+    /// @brief Vertex container name
+    std::string m_vertexContainerName;
+    ///
+    /// @brief List of variables to blind
+    ///
+    /// (as concatenated string using . as delimiter) 
+    std::string m_varToBlindNames;
+    ///
+    /// @brief Flag to indicate candidates for blinding
+    ///
+    /// Left empty: Blind values for all candidates.
+    std::string m_blindingFlag;
+    /// 
+    /// @brief Offsets applied to values before blinding
+    ///
+    /// List must have same length as VarToBlindNames or zero.
+    /// Applied before blinding/after unblinding.
+    std::vector<float> m_vOffsets;
+    ///
+    /// @brief Scale factors applied before blinding
+    ///
+    /// List must have same length as VarToBlindNames or zero.
+    /// Applied before blinding/after unblinding.
+    std::vector<float> m_vFactors;
+    ///
+    /// @brief Flip signs to negative range?
+    ///
+    /// List must have same length as VarToBlindNames or zero.
+    /// Applied after blinding/before unblinding.
+    std::vector<bool> m_vNegSigns;
+    ///
+    /// @brief Key for blinding
+    std::string m_blindKey;
+    ///
+    /// @brief Key for unblinding
+    std::string m_unblindKey;
+    /// @}
+
+    ///
+    /// @name Containers
+    /// @{
+    xAOD::VertexContainer*    m_vtxContainer;    //!
+    xAOD::VertexAuxContainer* m_vtxAuxContainer; //!
+    /// @}
+
+    ///
+    /// @name Event caching
+    /// @{
+    int m_cachedRun;    //!
+    int m_cachedEvent;  //!
+    /// @}
+
+    ///
+    ///
+    /// @name Counters
+    /// @{
+    long m_eventsForBlindingSeen;       //!
+    long m_candidatesForBlindingSeen;   //!
+    long m_eventsForUnblindingSeen;     //!
+    long m_candidatesForUnblindingSeen; //!
+    long m_eventsBlinded;               //!
+    long m_candidatesBlinded;           //!
+    long m_eventsUnblinded;             //!
+    long m_candidatesUnblinded;         //!
+    /// @}
+  private:
+    ///
+    /// @brief Vector of variable names
+    ///
+    std::vector<std::string> m_vVarNames; //!
+
+    ///
+    /// @brief Instance of SimpleEncrypter
+    ///
+    SimpleEncrypter m_senc; //!
+    
+  }; // class BPhysBlindingTool
+
+} // namespace xAOD
+
+#endif // BPHYSTOOLS_BPHYSBLINDINGTOOL_H
diff --git a/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/BPhysToolsDict.h b/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/BPhysToolsDict.h
new file mode 100644
index 000000000000..bf760bccff1e
--- /dev/null
+++ b/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/BPhysToolsDict.h
@@ -0,0 +1,16 @@
+// This file's extension implies that it's C, but it's really -*- C++ -*-.
+
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+
+/**
+ * @file   BPhysTools/BPhysToolsDict.h
+ * @author Wolfgang Walkowiak <wolfgang.walkowiak@cern.ch>
+ * @date   Mar 2018
+ * @brief  Dictionary header for BPhysTools.
+ */
+
+#include "BPhysTools/BPhysBlindingTool.h"
+#include "BPhysTools/BPhysTrackVertexMapTool.h"
+#include "BPhysTools/SimpleEncrypter.h"
diff --git a/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/BPhysTrackVertexMapTool.h b/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/BPhysTrackVertexMapTool.h
new file mode 100644
index 000000000000..597539c71b99
--- /dev/null
+++ b/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/BPhysTrackVertexMapTool.h
@@ -0,0 +1,196 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id: $
+#ifndef BPHYSTOOLS_BPHYSTRACKVERTEXMAPTOOL_H
+#define BPHYSTOOLS_BPHYSTRACKVERTEXMAPTOOL_H
+
+// Framework includes
+#include "BPhysTools/IBPhysTrackVertexMapTool.h"
+#include "AsgTools/AsgTool.h"
+
+// System include(s):
+#include <memory>
+
+// EDM includes
+#include "xAODTracking/TrackParticleAuxContainer.h"
+#include "xAODTracking/VertexAuxContainer.h"
+
+namespace xAOD {
+  ///
+  /// Dual-use tool createing a track-to-vertex map from
+  /// the vertex-to-track information.
+  ///
+  /// Job options provided by this class:
+  /// - VertexContainerName        -- name of container for secondary vertices
+  /// - RefPVContainerName         -- name of container for refitted PVs
+  /// - PVContainerName            -- name of container for primary vertices
+  /// - TrackParticleContainerName -- name of container for TrackParticles
+  /// - DebugTrkToVtxMaxEvents     -- Maximum number of events to produce
+  ///                                 detailed log output for the
+  ///                                 track-to-vertex association maps.
+  ///                                 Set to -1 for infinity.
+  /// - DumpPrefix                 -- Line prefix for log dump lines.
+  /// - HypoName                   -- Hypothesis name
+  ///                                 (for picking up inv. mass values)
+  ///                                 May be a set of hypo names to be
+  ///                                 tested, delimited by '|'.
+  ///
+  /// @author Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch>
+  ///
+  /// $Revision:$
+  /// $Date: $
+  ///
+  class BPhysTrackVertexMapTool :
+    public asg::AsgTool, virtual public xAOD::IBPhysTrackVertexMapTool {
+    
+    /// Declare the correct constructor for Athena
+    ASG_TOOL_CLASS( BPhysTrackVertexMapTool, xAOD::IBPhysTrackVertexMapTool )
+    
+   public:
+    /// Regular AsgTool constructor
+    BPhysTrackVertexMapTool(const std::string& name =
+			    "BPhysTrackVertexMapTool");
+
+    /// Function initialising the tool
+    virtual StatusCode initialize() override;
+    
+    /// Function being excuted for each event 
+    virtual StatusCode logEvent() override;
+
+    /// Function finalizing the tool
+    virtual StatusCode finalize() override;
+
+    /// Function indicating whether log counter allows logging of current event
+    virtual bool doLog() const override;
+
+    /// convenience method to wrap output lines by a prefix
+    static std::string wrapLines(std::string lines, std::string prefix);
+
+  protected:
+    /// @name Functions to be called by user classes
+    /// @{
+    /// fill cache for current event
+    virtual StatusCode cacheEvent() override;
+
+    /// obtain primary vertices for a given ID track (may return empty vector)
+    virtual std::vector<const xAOD::Vertex*>
+    pvsForIDTrack(const xAOD::TrackParticle* track) const override;
+    
+    /// obtain refitted primary vertices for a given ID track
+    /// (may return empty vector)
+    virtual std::vector<const xAOD::Vertex*>
+    refPVsForIDTrack(const xAOD::TrackParticle* track) const override;
+    
+    /// obtain secondary vertices for a given ID track (may return empty vector)
+    virtual std::vector<const xAOD::Vertex*>
+    svsForIDTrack(const xAOD::TrackParticle* track) const override;
+    
+    // track-vertex association related
+    virtual std::string idTrackToString(const xAOD::TrackParticle* track,
+					unsigned int indent=0,
+					bool withPV=false,
+					bool withRefPV=false,
+					bool withSV=false) override;
+    
+    virtual std::string pvToString(const xAOD::Vertex* vtx,
+				   unsigned int indent=0,
+				   bool withTracks=false) override;
+    
+    virtual std::string refPVToString(const xAOD::Vertex* vtx,
+				      unsigned int indent=0,
+				      bool withTracks=false) override;
+    virtual std::string svToString(const xAOD::Vertex* vtx,
+				   unsigned int indent=0,
+				   bool withTracks=false,
+				   bool withMasses=false) override;
+    virtual std::string idTracksToString(const xAOD::TrackParticleContainer*
+					 tpc,
+					 unsigned int indent=0,
+					 bool withPV=false,
+					 bool withRefPV=false,
+					 bool withSV=false) override;
+    
+    virtual std::string pvsToString(const xAOD::VertexContainer* pvc,
+				    unsigned int indent=0,
+				    bool withTracks=false) override;
+    virtual std::string refPVsToString(const xAOD::VertexContainer* rpvc,
+				       unsigned int indent=0,
+				       bool withTracks=false) override;
+    virtual std::string svsToString(const xAOD::VertexContainer* svc,
+				    unsigned int indent=0,
+				    bool withTracks=false,
+				    bool withMasses=false) override;
+    virtual std::string summaryToString(std::string prefix) override;
+    /// @}
+
+  protected:
+    virtual float getFloat(std::string name, const xAOD::Vertex* b);
+
+    virtual std::vector<std::string> getTokens(std::string input,
+					       std::string seperators);
+
+
+  private:
+    // track-vertex association related
+    typedef std::map<const xAOD::TrackParticle*,
+		     std::vector<const xAOD::Vertex*> > TrackToVertexMap_t;
+    
+    virtual void initTrackVertexMaps(const xAOD::TrackParticleContainer* tpc,
+				     const xAOD::VertexContainer* pvc, 
+				     const xAOD::VertexContainer* rpvc,
+				     const xAOD::VertexContainer* svc);
+    virtual void addVertexToTrackVertexMap(TrackToVertexMap_t& map,
+					   const xAOD::TrackParticle* track,
+					   const xAOD::Vertex* vtx);
+    virtual std::string pvName(const xAOD::Vertex* vtx);
+    virtual std::string refPVName(const xAOD::Vertex* vtx);
+    virtual std::string svName(const xAOD::Vertex* vtx);
+    virtual std::string idTrackName(const xAOD::TrackParticle* vtx);
+    
+  protected:      
+    // job options
+    std::string  m_vertexContainerName;
+    std::string  m_refPVContainerName;
+    std::string  m_pvContainerName;
+    std::string  m_trackParticleContainerName;
+    int          m_debugTrkToVtxMaxEvents;
+    std::string  m_dumpPrefix;
+    std::string  m_hypoName;
+    
+    // containers
+    const xAOD::TrackParticleContainer*    m_tracks;
+    const xAOD::TrackParticleAuxContainer* m_tracksAux;
+    const xAOD::VertexContainer*           m_pvtxContainer;
+    const xAOD::VertexContainer*           m_svtxContainer;
+    const xAOD::VertexAuxContainer*        m_svtxAuxContainer;
+    const xAOD::VertexContainer*           m_refPVContainer;
+    const xAOD::VertexAuxContainer*        m_refPVAuxContainer;
+    
+    unsigned int m_nEvtsSeen;
+
+    int          m_cachedRun;
+    int          m_cachedEvent;
+    
+  private:
+    // track-vertex association related
+    typedef std::map<const xAOD::Vertex*, std::string> VertexNameMap_t;
+    VertexNameMap_t m_pvNameMap;
+    VertexNameMap_t m_refPVNameMap;
+    VertexNameMap_t m_svNameMap;
+    
+    typedef std::map<const xAOD::TrackParticle*, std::string> TrackNameMap_t;
+    TrackNameMap_t  m_idTrackNameMap;
+
+    TrackToVertexMap_t m_idTrackToPVMap;
+    TrackToVertexMap_t m_idTrackToRefPVMap;
+    TrackToVertexMap_t m_idTrackToSVMap;
+        
+  }; // class BPhysTrackVertexMapTool
+
+} // namespace xAOD
+
+#endif // BPHYSTOOLS_BPHYSTRACKVERTEXMAPTOOL_H
diff --git a/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/IBPhysBlindingTool.h b/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/IBPhysBlindingTool.h
new file mode 100644
index 000000000000..8891bb12cd77
--- /dev/null
+++ b/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/IBPhysBlindingTool.h
@@ -0,0 +1,79 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+
+/**
+ * @file   IBPhysBlindingTool.h
+ * @author Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch>
+ *
+ * @brief  Interface for dual-use tool for (un-)blinding of float values.
+ */
+
+#ifndef BPHYSTOOLS_IBPHYSBLINDINGTOOL_H
+#define BPHYSTOOLS_IBPHYSBLINDINGTOOL_H
+
+// Framework includes
+#include "AsgTools/IAsgTool.h"
+
+// System include(s):
+#include <string>
+#include <vector>
+
+// EDM includes
+#include "xAODTracking/VertexContainer.h"
+
+namespace xAOD {
+  ///
+  /// Interface for dual-use tool for blinding and unblinding
+  /// certain float values provided as variables in a container. 
+  ///
+  /// @author Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch>
+  ///
+  ///
+  class IBPhysBlindingTool : virtual public asg::IAsgTool {
+
+  public:
+    /// Declare the correct interface for Athena
+    ASG_TOOL_INTERFACE( xAOD::IBPhysBlindingTool )
+
+    /// @ brief Function finalizing the tool
+    virtual StatusCode finalize() = 0;
+
+    ///
+    /// @name Methods to be called by user classes
+    /// @{
+    ///
+    /// @brief Simply blind one positive float value
+    virtual float doBlind(const float& val) = 0;
+
+    ///
+    /// @brief Simply unblind one positive float value
+    virtual float doUnblind(const float& val) = 0;
+    
+    ///
+    /// @brief Simply blind one (positive) float value with corretions
+    virtual float doBlind(const float& val, const bool& negativeSign,
+                          const float& offset, const float& factor) = 0;
+
+    ///
+    /// @brief Simply unblind one (positive) float value with corrections
+    virtual float doUnblind(const float& val, const bool& negativeSign,
+                            const float& offset, const float& factor) = 0;
+
+    /// 
+    /// @brief Perform blinding of requested variables
+    virtual StatusCode doBlind() = 0;
+
+    /// 
+    /// @brief Perform unblinding of requested variables
+    virtual StatusCode doUnblind() = 0;
+    
+    /// @}
+
+  }; // class IBPhysBlindingTool
+
+} // namespace xAOD
+
+#endif // BPHYSTOOLS_IBPHYSBLINDINGTOOL_H
diff --git a/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/IBPhysTrackVertexMapTool.h b/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/IBPhysTrackVertexMapTool.h
new file mode 100644
index 000000000000..bb0857657df6
--- /dev/null
+++ b/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/IBPhysTrackVertexMapTool.h
@@ -0,0 +1,109 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id: $
+#ifndef BPHYSTOOLS_IBPHYSTRACKVERTEXMAPTOOL_H
+#define BPHYSTOOLS_IBPHYSTRACKVERTEXMAPTOOL_H
+
+// Framework includes
+#include "AsgTools/IAsgTool.h"
+
+// System include(s):
+#include <string>
+#include <memory>
+#include <vector>
+
+// EDM includes
+#include "xAODTracking/TrackParticleContainer.h"
+#include "xAODTracking/VertexContainer.h"
+
+namespace xAOD {
+  ///
+  /// Interface for dual-use tool createing a track-to-vertex map from
+  /// the vertex-to-track information.
+  ///
+  /// @author Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch>
+  ///
+  /// $Revision:$
+  /// $Date: $
+  ///
+  class IBPhysTrackVertexMapTool : virtual public asg::IAsgTool {
+
+  public:
+    /// Declare the correct interface for Athena
+    ASG_TOOL_INTERFACE( xAOD::IBPhysTrackVertexMapTool )
+
+    /// Function being excuted for each event 
+    virtual StatusCode logEvent() = 0;
+
+    /// Function finalizing the tool
+    virtual StatusCode finalize() = 0;
+
+    /// Function indicating whether log counter allows logging of current event
+    virtual bool doLog() const = 0;
+
+  public:
+    /// @name Functions to be called by user classes
+    /// @{
+    /// fill cache for current event
+    virtual StatusCode cacheEvent() = 0;
+
+    /// obtain primary vertices for a given ID track (may return empty vector)
+    virtual std::vector<const xAOD::Vertex*>
+    pvsForIDTrack(const xAOD::TrackParticle* track) const = 0;
+    
+    /// obtain refitted primary vertices for a given ID track
+    /// (may return empty vector)
+    virtual std::vector<const xAOD::Vertex*>
+    refPVsForIDTrack(const xAOD::TrackParticle* track) const = 0;
+    
+    /// obtain secondary vertices for a given ID track (may return empty vector)
+    virtual std::vector<const xAOD::Vertex*>
+    svsForIDTrack(const xAOD::TrackParticle* track) const = 0;
+    
+    // track-vertex association related
+    virtual std::string idTrackToString(const xAOD::TrackParticle* track,
+					unsigned int indent=0,
+					bool withPV=false,
+					bool withRefPV=false,
+					bool withSV=false) = 0;
+    
+    virtual std::string pvToString(const xAOD::Vertex* vtx,
+				   unsigned int indent=0,
+				   bool withTracks=false) = 0;
+    
+    virtual std::string refPVToString(const xAOD::Vertex* vtx,
+				      unsigned int indent=0,
+				      bool withTracks=false) = 0;
+    virtual std::string svToString(const xAOD::Vertex* vtx,
+				   unsigned int indent=0,
+				   bool withTracks=false,
+				   bool withMasses=false) = 0;
+    virtual std::string idTracksToString(const xAOD::TrackParticleContainer*
+					 tpc,
+					 unsigned int indent=0,
+					 bool withPV=false,
+					 bool withRefPV=false,
+					 bool withSV=false) = 0;
+    
+    virtual std::string pvsToString(const xAOD::VertexContainer* pvc,
+				    unsigned int indent=0,
+				    bool withTracks=false) = 0;
+    virtual std::string refPVsToString(const xAOD::VertexContainer* rpvc,
+				       unsigned int indent=0,
+				       bool withTracks=false) =0;
+    virtual std::string svsToString(const xAOD::VertexContainer* svc,
+				    unsigned int indent=0,
+				    bool withTracks=false,
+				    bool withMasses=false) = 0;
+    virtual std::string summaryToString(std::string prefix) = 0;
+    /// @}
+
+  }; // class IBPhysTrackVertexMapTool
+
+} // namespace xAOD
+
+#endif // BPHYSTOOLS_IBPHYSTRACKVERTEXMAPTOOL_H
diff --git a/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/SimpleEncrypter.h b/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/SimpleEncrypter.h
new file mode 100644
index 000000000000..59c351aa638a
--- /dev/null
+++ b/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/SimpleEncrypter.h
@@ -0,0 +1,244 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+
+/**
+ * @file   SimpleEncrypter.h
+ * @author Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch>
+ *
+ * @brief  Provide simple asymmetric encryption for blinding of float values.
+ */
+
+#ifndef BPHYSTOOLS_SIMPLEENCRYPTER_H
+#define BPHYSTOOLS_SIMPLEENCRYPTER_H
+
+// Framework includes
+#include "AsgMessaging/AsgMessaging.h"
+
+// System includes
+#include <string>
+#include <set>
+
+namespace xAOD {
+  ///
+  /// @class  SimpleEncrypter
+  /// @author Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+  ///
+  /// @brief  Provide simple asymmetric encryption for blinding of float values.
+  ///
+  /// Provides asymmetric key encryption for blinding of positive float
+  /// values.  Internally it uses a simple RSA encryption of bits in
+  /// the floating point numbers.
+  /// This class is used by the BPhysBlindingTool.
+  ///
+  class SimpleEncrypter : public asg::AsgMessaging {
+    
+  public:
+    /// @brief Useful typedefs
+    typedef long long int          LLI_t;
+    typedef unsigned long long int ULLI_t;
+
+    ///
+    /// @brief Main constructor
+    ///
+    /// @param[in] name of instance
+    ///
+    SimpleEncrypter(const std::string& name = "SimpleEncrypter");
+
+    ///
+    /// @brief Default destructor
+    ///
+    virtual ~SimpleEncrypter();
+
+    ///
+    /// @brief Generate private and public keys
+    ///
+    /// @returns key pair as string: [private key, public key]
+    ///
+    virtual std::pair<std::string, std::string> genKeyPair();
+    
+    ///
+    /// @brief Set private key
+    ///
+    /// @param[in] hex string with private key
+    ///
+    virtual void setPrivKey(std::string keystr);
+
+    ///
+    /// @brief Set public key
+    ///
+    /// @param[in] hex string with public key
+    ///
+    virtual void setPubKey(std::string keystr);
+
+    ///
+    /// @brief Get private key
+    ///
+    /// @returns hex string with private key
+    ///
+    virtual std::string getPrivKey() const;
+
+    ///
+    /// @brief Get public key
+    ///
+    /// @returns hex string with public key
+    ///
+    virtual std::string getPubKey() const;
+
+    ///
+    /// @brief Encrypt a positive integer value
+    ///
+    /// @param[in] unsigned integer value to be encrypted
+    ///
+    /// @returns encrypted unsigned integer value
+    ///
+    virtual ULLI_t encrypt(ULLI_t x);
+    
+    ///
+    /// @brief Decrypt a positive integer value
+    ///
+    /// @param[in] unsigned integer value to be decrypted
+    ///
+    /// @returns encrypted unsigned integer value
+    ///
+    virtual ULLI_t decrypt(ULLI_t x);
+    
+    ///
+    /// @brief Encrypt a positive float value
+    ///
+    /// @param[in] positive float value to be encrypted
+    ///
+    /// @returns encrypted float value
+    ///
+    virtual float encrypt(float x);
+    
+    ///
+    /// @brief Decrypt a positive float value
+    ///
+    /// @param[in] positive float value to be decrypted
+    ///
+    /// @returns encrypted float value
+    ///
+    virtual float decrypt(float x);
+    
+
+  private:
+    ///
+    /// @name Key generation utilities
+    /// @{
+    ///
+    /// @brief Internally generate numeric representation of key pair
+    ///
+    virtual void genKeyPairInternal();
+    ///
+    /// @brief Find a prime number
+    ///
+    virtual ULLI_t genPrime() const;
+    ///
+    /// @brief Check for being a prime number
+    ///
+    virtual bool isPrime(ULLI_t n) const;
+    ///
+    /// @brief Find greatest common denominator
+    ///
+    virtual ULLI_t greatestCommonDenominator(ULLI_t n1, ULLI_t n2) const;
+    ///
+    /// @brief Find a coprime number
+    ///
+    virtual ULLI_t genCoprime(ULLI_t n) const;
+    ///
+    /// @brief Find decryption exponent
+    ///
+    virtual ULLI_t genDecryptionExponent(ULLI_t phi, ULLI_t e) const;
+    ///
+    /// @}
+    ///
+    /// @name Key conversion utilities
+    /// @{
+    ///
+    /// @brief Convert key to hex string
+    ///    
+    virtual std::string keyToString(ULLI_t a, ULLI_t b) const;
+    ///
+    /// @brief Decode hex string to two integers
+    ///
+    virtual std::pair<ULLI_t, ULLI_t> decodeKeyString(std::string str) const;
+    /// @}
+    ///
+    /// @name float <-> int conversion utilities
+    /// @{
+    ///
+    /// @brief Interpret bits of floating point number as integer
+    ///    
+    virtual ULLI_t floatBitsToInt(float val) const;
+    ///
+    /// @brief Interpret bits of integer as floating point number
+    ///    
+    virtual float intBitsToFloat(ULLI_t val) const;
+    /// @}
+    ///
+    /// @name Internal en-/decryption methods
+    /// @{
+    ///
+    /// @brief Encrypt using format preserving encryption w.r.t. RSA modulus
+    ///
+    ULLI_t encryptFPECycle(ULLI_t a) const;
+    ///
+    /// @brief Decrypt using format preserving encryption w.r.t. RSA modulus
+    ///
+    ULLI_t decryptFPECycle(ULLI_t a) const; 
+    ///
+    /// @brief Encrypt integer (internal)
+    ///
+    ULLI_t encryptInternal(ULLI_t x) const;
+    ///
+    /// @brief Decrypt integer (internal)
+    ///
+    ULLI_t decryptInternal(ULLI_t x) const;
+    ///
+    /// @brief Exponentiate a with d observing modulus n
+    ///
+    ULLI_t powerMod(ULLI_t a, ULLI_t d, ULLI_t n) const;
+    ///
+    /// @brief Check setup readiness for encryption
+    ///
+    bool isOkForEnc();
+    ///
+    /// @brief Check setup readiness for decryption
+    ///
+    bool isOkForDec();
+    ///
+    /// @}
+    
+  private:
+    ///
+    /// @name Internal static consts
+    ///
+    /// @brief Approximate range for prime numbers to be generated in
+    static const ULLI_t m_MAXRANGE;
+    static const ULLI_t m_MINRANGE;
+    /// @brief maximum number of hex digits for key parts
+    static const unsigned int m_MAXHEXDIGITS;
+    
+    ///
+    /// @name Internal member variables
+    ///
+    /// RSA modulus: common part of both keys
+    ULLI_t m_n;
+    /// encryption exponent: public key part II
+    ULLI_t m_e;
+    /// decryption exponent: private key part II
+    ULLI_t m_d;
+
+    /// indicates that keys are set and range checks are ok
+    bool   m_isOkForEnc;
+    bool   m_isOkForDec;
+
+  }; // class
+  
+} // namespace xAOD
+
+#endif // BPHYSTOOLS_SIMPLEENCRYPTER_H
+
diff --git a/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/selection.xml b/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/selection.xml
new file mode 100644
index 000000000000..a6539c15eec7
--- /dev/null
+++ b/PhysicsAnalysis/BPhys/BPhysTools/BPhysTools/selection.xml
@@ -0,0 +1,10 @@
+<!--
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+-->
+
+<lcgdict>
+  <!-- BPhysTools -->
+  <class name="xAOD::BPhysBlindingTool" />
+  <class name="xAOD::BPhysTrackVertexMapTool" />
+  <class name="xAOD::SimpleEncrypter" />
+</lcgdict>
diff --git a/PhysicsAnalysis/BPhys/BPhysTools/CMakeLists.txt b/PhysicsAnalysis/BPhys/BPhysTools/CMakeLists.txt
new file mode 100644
index 000000000000..4229cef3b693
--- /dev/null
+++ b/PhysicsAnalysis/BPhys/BPhysTools/CMakeLists.txt
@@ -0,0 +1,84 @@
+#
+# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+#
+
+# $Id: CMakeLists.txt 805745 2017-05-31 17:23:48Z wwalko $
+#
+# Build configuration for the package.
+#
+#********************************************
+set(extra_dep)
+if( XAOD_STANDALONE )
+  set(extra_dep)
+else()
+  set( extra_dep
+         GaudiKernel
+         Control/AthenaKernel
+     )
+endif()
+#********************************************
+set(extra_libs)
+if( XAOD_STANDALONE )
+  set(extra_libs)
+else()
+  set( extra_libs
+         GaudiKernel
+         AthenaKernel
+     )
+endif()
+#********************************************
+# The name of the package:
+atlas_subdir( BPhysTools )
+
+
+# Used external(s):
+find_package( ROOT COMPONENTS Core Physics Matrix )
+find_package( Boost )
+
+# Build the main library of the package: 
+atlas_add_library( BPhysToolsLib
+		   BPhysTools/*.h Root/*.cxx src/*.cxx
+		   PUBLIC_HEADERS BPhysTools
+		   INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
+		   PRIVATE_INCLUDE_DIRS ${Boost_INCLUDE_DIRS}
+		   LINK_LIBRARIES ${ROOT_LIBRARIES} 
+		   xAODTracking
+		   xAODBPhysLib
+		   AsgTools
+       ${extra_libs}
+		   PRIVATE_LINK_LIBRARIES ${Boost_LIBRARIES}
+		   xAODEventInfo
+		   )
+
+if(NOT XAOD_STANDALONE)
+atlas_add_component( BPhysTools
+                     src/components/*.cxx
+                     INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
+		                 PRIVATE_INCLUDE_DIRS ${Boost_INCLUDE_DIRS}
+                     LINK_LIBRARIES ${ROOT_LIBRARIES} 
+		                 xAODTracking
+		                 xAODBPhysLib
+		                 AsgTools
+                     ${extra_libs}
+                     BPhysToolsLib
+		                 PRIVATE_LINK_LIBRARIES ${Boost_LIBRARIES}
+		                 xAODEventInfo
+		                 )
+endif()
+
+# Build the dictionary 
+atlas_add_dictionary( BPhysToolsDict
+  BPhysTools/BPhysToolsDict.h
+  BPhysTools/selection.xml
+  LINK_LIBRARIES BPhysToolsLib
+  )  
+
+
+# Executables in util subdirectory
+file (GLOB util_sources RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
+  "${CMAKE_CURRENT_SOURCE_DIR}/util/*.cxx")
+foreach (source ${util_sources})
+   string (REGEX REPLACE "util/(.*).cxx" "\\1" util ${source})
+   atlas_add_executable (${util} ${source} LINK_LIBRARIES BPhysToolsLib)
+endforeach (source ${util_sources})
+ 
diff --git a/PhysicsAnalysis/BPhys/BPhysTools/Root/BPhysBlindingTool.cxx b/PhysicsAnalysis/BPhys/BPhysTools/Root/BPhysBlindingTool.cxx
new file mode 100644
index 000000000000..269f66997923
--- /dev/null
+++ b/PhysicsAnalysis/BPhys/BPhysTools/Root/BPhysBlindingTool.cxx
@@ -0,0 +1,464 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+
+// system include:
+#include "boost/tokenizer.hpp"
+#include <boost/algorithm/string.hpp>
+#include <set>
+#include <cmath>
+
+// EDM includes:
+#include "xAODEventInfo/EventInfo.h"
+
+// ROOT includes
+#include "TString.h"
+
+// Local include(s):
+#include "BPhysTools/BPhysBlindingTool.h"
+
+namespace xAOD {
+
+  //--------------------------------------------------------------------------
+  // Constructor
+  //--------------------------------------------------------------------------
+  BPhysBlindingTool::BPhysBlindingTool( const std::string& name )
+    : asg::AsgTool( name ),
+      m_vtxContainer(nullptr), m_vtxAuxContainer(nullptr),
+      m_cachedRun(-1), m_cachedEvent(-1),
+      m_eventsForBlindingSeen(0),
+      m_candidatesForBlindingSeen(0),
+      m_eventsForUnblindingSeen(0),
+      m_candidatesForUnblindingSeen(0),
+      m_eventsBlinded(0),
+      m_candidatesBlinded(0),
+      m_eventsUnblinded(0),
+      m_candidatesUnblinded(0) {
+
+#ifdef ASGTOOL_ATHENA
+    declareInterface< IBPhysBlindingTool >( this );
+#endif // ASGTOOL_ATHENA
+
+    // Vertex container
+    declareProperty("VertexContainerName", m_vertexContainerName = "");
+
+    // List of variables to blind
+    // (as concatenated string using . as delimiter) 
+    declareProperty("VarToBlindNames", m_varToBlindNames = "");
+
+    // Flag to indicate candidates for blinding
+    // Left empty: Blind values for all candidates.
+    declareProperty("BlindingFlag"   , m_blindingFlag = "");
+    
+    // Offsets applied to values before blinding
+    // List must have same length as VarToBlindNames or zero.
+    declareProperty("BlindingOffsets", m_vOffsets);
+
+    // Scale factors applied before blinding
+    // List must have same length as VarToBlindNames or zero.
+    declareProperty("BlindingFactors", m_vFactors);
+
+    // Flip signs to negative range?
+    declareProperty("NegativeSigns"  , m_vNegSigns);
+    
+    // Key for blinding
+    declareProperty("BlindingKey"    , m_blindKey = "");
+    
+    // Key for unblinding
+    declareProperty("UnblindingKey"  , m_unblindKey = "");
+
+  }
+  //--------------------------------------------------------------------------
+  StatusCode BPhysBlindingTool::initialize() {
+    
+    // Greet the user:
+    ATH_MSG_DEBUG( "Initializing xAOD::BPhysBlindingTool" );
+
+    // Setup of variables
+    if ( m_vertexContainerName == "" ) {
+      ATH_MSG_INFO("No vertex container name provided.");
+    }
+
+    if ( m_varToBlindNames != ""  ) {
+      m_vVarNames = getTokens(m_varToBlindNames, ".,:;|");
+    }
+
+    // Blinding and unblinding keys
+    if ( m_blindKey == "" && m_unblindKey == "" ) {
+      ATH_MSG_ERROR("You must at least set a key for blinding or unblinding!");
+    } else {
+      if ( m_blindKey != "" ) {
+        m_senc.setPubKey(m_blindKey);
+        ATH_MSG_INFO("Setting blinding key.");
+      }
+      if ( m_unblindKey != "" ) {
+        m_senc.setPrivKey(m_unblindKey);
+        ATH_MSG_INFO("Setting unblinding key.");
+      }
+    }
+
+    // make sure offsets vector is of correct length
+    if ( m_vOffsets.size() < m_vVarNames.size() ) {
+      for (uint i=m_vOffsets.size(); i<m_vVarNames.size(); ++i) {
+        m_vOffsets.push_back(0.);
+      }
+      ATH_MSG_INFO("Extending BlindingOffsets list ...");
+    } else if ( m_vOffsets.size() > m_vVarNames.size() ) {
+      ATH_MSG_WARNING("BlindingOffsets list longer than VarToBlindNames.");
+    }
+    
+    // make sure scale factors vector is of correct length
+    if ( m_vFactors.size() < m_vVarNames.size() ) {
+      for (uint i=m_vFactors.size(); i<m_vVarNames.size(); ++i) {
+        m_vFactors.push_back(1.);
+      }
+      ATH_MSG_INFO("Extending BlindingOffsets list ...");
+    } else if ( m_vFactors.size() > m_vVarNames.size() ) {
+      ATH_MSG_WARNING("BlindingFactors list longer than VarToBlindNames.");
+    }
+
+    // make sure negative signs vector is of correct length
+    if ( m_vNegSigns.size() < m_vVarNames.size() ) {
+      for (uint i=m_vNegSigns.size(); i<m_vVarNames.size(); ++i) {
+        m_vNegSigns.push_back(1.);
+      }
+      ATH_MSG_INFO("Extending NegativeSigns list ...");
+    } else if ( m_vNegSigns.size() > m_vVarNames.size() ) {
+      ATH_MSG_WARNING("NegativeSigns list longer than VarToBlindNames.");
+    }
+
+    // some info for the job log
+    ATH_MSG_INFO("VertexContainerName        : " << m_vertexContainerName);
+    ATH_MSG_INFO("BlindingFlag               : " << m_blindingFlag);
+    ATH_MSG_INFO("VarToBlindNames            : " << m_varToBlindNames);
+    ATH_MSG_INFO("BlindingOffsets            : " << vecToString(m_vOffsets));
+    ATH_MSG_INFO("BlindingFactors            : " << vecToString(m_vFactors));
+    ATH_MSG_INFO("NegativeSigns              : " << vecToString(m_vNegSigns));
+    ATH_MSG_INFO("BlindingKey                : " << m_blindKey);
+    ATH_MSG_INFO("UnblindingKey              : " << m_unblindKey);
+
+    // Return gracefully:
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  StatusCode BPhysBlindingTool::finalize() {
+
+    ATH_MSG_DEBUG( "Finalizing xAOD::BPhysBlindingTool" );
+
+    ATH_MSG_INFO("Statistics for " << name() << ":");
+    ATH_MSG_INFO(Form("N_eventsForBlindingSeen       : %10ld",
+                      m_eventsForBlindingSeen));
+    ATH_MSG_INFO(Form("N_eventsBlinded               : %10ld",
+                      m_eventsBlinded));
+    ATH_MSG_INFO(Form("N_eventsForUnblindingSeen     : %10ld",
+                      m_eventsForUnblindingSeen));
+    ATH_MSG_INFO(Form("N_eventsUnblinded             : %10ld",
+                      m_eventsUnblinded));
+    ATH_MSG_INFO(Form("N_candidatesForBlindingSeen   : %10ld",
+                      m_candidatesForBlindingSeen));
+    ATH_MSG_INFO(Form("N_candidatesBlinded           : %10ld",
+                      m_candidatesBlinded));
+    ATH_MSG_INFO(Form("N_candidatesForUnblindingSeen : %10ld",
+                      m_candidatesForUnblindingSeen));
+    ATH_MSG_INFO(Form("N_candidatesUnblinded         : %10ld",
+                      m_candidatesUnblinded));
+
+    // Return gracefully:
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+  // Simply blind one positive float value
+  //--------------------------------------------------------------------------
+  float BPhysBlindingTool::doBlind(const float& val) {
+
+    return m_senc.encrypt(val);
+  }  
+  //--------------------------------------------------------------------------
+  // Simply unblind one positive float value
+  //--------------------------------------------------------------------------
+  float BPhysBlindingTool::doUnblind(const float& val) {
+
+    return m_senc.decrypt(val);
+  }
+  //--------------------------------------------------------------------------
+  // Simply blind one (positive) float value
+  //--------------------------------------------------------------------------
+  float BPhysBlindingTool::doBlind(const float& val,
+                                   const bool&  negativeSign,
+                                   const float& offset,
+                                   const float& factor) {
+
+    // adjustment if requested
+    float bval(val);
+    float cval = val*factor + offset;
+    if ( cval > 0. ) {
+      // perform actual blinding
+      bval = m_senc.encrypt(cval);
+      if (negativeSign) bval *= -1.;
+    } else {
+      ATH_MSG_WARNING("Blinding: Corrected value not positive: "
+                      << val << Form(" (%a) -> ", val)
+                      << cval << Form(" (%a)", cval));
+    } // if cval > 0
+
+    return bval;
+  }  
+  //--------------------------------------------------------------------------
+  // Simply unblind one (positive) float value
+  //--------------------------------------------------------------------------
+  float BPhysBlindingTool::doUnblind(const float& val,
+                                     const bool&  negativeSign,
+                                     const float& offset,
+                                     const float& factor) {
+
+    float bval(val), cval(val);
+    if (negativeSign) bval *= -1.;
+    // if ( bval > 0. || isnan(bval) ) {
+    if ( bval > 0. || !std::isnormal(bval) ) {
+      // perform actual unblinding
+      cval = m_senc.decrypt(bval);
+      if ( factor != 0. ) {
+        cval = (cval - offset)/factor;
+      } else {
+        ATH_MSG_WARNING("Unblinding: BlindingFactor == 0!: "
+                        << val << Form(" (%a)", val));
+      } // if m_vFactors[ivtx] != 0
+    } else {
+      ATH_MSG_WARNING("Unblinding: Corrected value not positive: "
+                      << val << Form(" (%a) -> ", val)
+                      << bval << Form(" (%a)", bval));
+    } // if bval > 0
+
+    return cval;
+  }
+  //--------------------------------------------------------------------------
+  // Perform blinding of requested variables 
+  //--------------------------------------------------------------------------
+  StatusCode BPhysBlindingTool::doBlind() {
+
+    if ( m_blindKey == "" ) {
+      ATH_MSG_WARNING("Can not blind without blinding key!");
+    } else {
+      ATH_CHECK( doBlindingAction(false) );
+    }
+    
+    // Return gracefully:
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  // Perform unblinding of requested variables 
+  //--------------------------------------------------------------------------
+  StatusCode BPhysBlindingTool::doUnblind() {
+    
+    if ( m_unblindKey == "" ) {
+      ATH_MSG_WARNING("Can not unblind without unblinding key!");
+    } else {
+      ATH_CHECK( doBlindingAction(true) );
+    }
+
+    // Return gracefully:
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+
+  //--------------------------------------------------------------------------
+  // Protected methods
+  //--------------------------------------------------------------------------
+
+  //--------------------------------------------------------------------------
+  // Perform blinding or unblinding action
+  //--------------------------------------------------------------------------
+  StatusCode BPhysBlindingTool::doBlindingAction(bool unblind) {
+
+    ATH_CHECK(cacheEvent());
+
+    // counters
+    if ( unblind ) {
+      ++m_eventsForUnblindingSeen;
+    } else {
+      ++m_eventsForBlindingSeen;
+    }
+    
+    if ( m_vVarNames.size() > 0 ) {
+      long candidatesBlinded(0);
+      long candidatesUnblinded(0);
+      // loop over vertices
+      // int ivtx(0);
+      for (xAOD::VertexContainer::const_iterator
+             vtxItr = m_vtxContainer->begin();
+           vtxItr != m_vtxContainer->end(); ++vtxItr) {
+        // counters
+        if ( unblind ) {
+          ++m_candidatesForUnblindingSeen;
+        } else {
+          ++m_candidatesForBlindingSeen;
+        }
+        const xAOD::Vertex* vtx = *vtxItr;
+        // check whether to apply (un-)blinding to this candidate
+        if ( m_blindingFlag == "" || pass(*vtx, m_blindingFlag) ) {
+          // counters
+          if ( unblind ) {
+            ++candidatesUnblinded;
+          } else {
+            ++candidatesBlinded;
+          }
+          // loop over variable names
+          for (size_t iv=0; iv<m_vVarNames.size(); ++iv) {
+            SG::AuxElement::Decorator<float> floatDec(m_vVarNames[iv]);
+            // check for variable
+            if ( floatDec.isAvailable(*vtx) ) {
+              float val = floatDec(*vtx);
+              if ( unblind ) {
+                // unblinding
+                floatDec(*vtx) = doUnblind(val, m_vNegSigns[iv],
+                                           m_vOffsets[iv], m_vFactors[iv]);
+                ATH_MSG_DEBUG("Unblind: " << val << Form(" (%a) -> ", val)
+                              << floatDec(*vtx)
+                              << Form(" (%a)", floatDec(*vtx)));
+              } else {
+                // blinding
+                floatDec(*vtx) = doBlind(val, m_vNegSigns[iv],
+                                         m_vOffsets[iv], m_vFactors[iv]);
+                ATH_MSG_DEBUG("Blind: " << val << Form(" (%a) -> ", val)
+                              << floatDec(*vtx)
+                              << Form(" (%a)", floatDec(*vtx)));
+              } // if unblind
+            } else {
+              ATH_MSG_WARNING("Missing variable " << m_vVarNames[iv]);
+            } // if isAvailable
+          } // for m_vVarNames
+        } // if blinding
+      } // for iv
+      // counters
+      if ( unblind ) {
+        m_candidatesUnblinded += candidatesUnblinded;
+        if ( candidatesUnblinded > 0 ) ++m_eventsUnblinded;
+      } else {
+        m_candidatesBlinded += candidatesBlinded;
+        if ( candidatesBlinded > 0 ) ++m_eventsBlinded;
+      }
+    } // if m_vVarNames.size()
+    
+    // Return gracefully:
+    return StatusCode::SUCCESS;    
+  }
+  //--------------------------------------------------------------------------
+  // Cache current event.
+  //
+  // Call this once per event.
+  // Repeated calls for the same run/event are not updating the cache again.
+  //--------------------------------------------------------------------------
+  StatusCode BPhysBlindingTool::cacheEvent() {
+
+    ATH_MSG_DEBUG("BPhysBlindingTool::cacheEvent -- begin");
+    
+    const xAOD::EventInfo* eventInfo = NULL;
+    ATH_CHECK(evtStore()->retrieve(eventInfo, "EventInfo"));
+
+    if ( m_cachedRun   != (int)eventInfo->runNumber() ||
+         m_cachedEvent != (int)eventInfo->eventNumber() ) {
+
+      // note update
+      m_cachedRun   = eventInfo->runNumber();
+      m_cachedEvent = eventInfo->eventNumber();
+
+      ATH_MSG_DEBUG("BPhysBlindingTool::cacheEvent: caching now: "
+                    << "run " << m_cachedRun << " event " << m_cachedEvent);
+
+      // retrieve vertices container
+      m_vtxContainer    = nullptr;
+      m_vtxAuxContainer = nullptr;
+
+      if ( evtStore()->transientContains<xAOD::VertexContainer>(m_vertexContainerName) ) {
+        ATH_MSG_DEBUG("In transient store: " << m_vertexContainerName);
+        ATH_CHECK(evtStore()->retrieve(m_vtxContainer,
+                                       m_vertexContainerName));
+        ATH_CHECK(evtStore()->retrieve(m_vtxAuxContainer,
+                                       m_vertexContainerName+"Aux."));
+      }  else {
+        ATH_MSG_DEBUG("Not in transient store: " << m_vertexContainerName);
+        const xAOD::VertexContainer*    constVtxContainer    = nullptr;
+        const xAOD::VertexAuxContainer* constVtxAuxContainer = nullptr;
+        ATH_CHECK(evtStore()->retrieve(constVtxContainer,
+                                       m_vertexContainerName));
+        ATH_CHECK(evtStore()->retrieve(constVtxAuxContainer,
+                                       m_vertexContainerName+"Aux."));
+        // create a copy
+        m_vtxContainer    = new xAOD::VertexContainer();
+        m_vtxAuxContainer = new xAOD::VertexAuxContainer();
+        m_vtxContainer->setStore(m_vtxAuxContainer);
+        for (const xAOD::Vertex* constVtx : *constVtxContainer) {
+          xAOD::Vertex* vtx = new xAOD::Vertex();
+          m_vtxContainer->push_back(vtx);
+          *vtx = *constVtx;
+        }
+        ATH_CHECK(evtStore()->record(m_vtxContainer,
+                                     m_vertexContainerName));
+        ATH_CHECK(evtStore()->record(m_vtxAuxContainer,
+                                     m_vertexContainerName+"Aux."));
+      }
+      
+      ATH_MSG_DEBUG("Found vertex collection with key "
+                    << m_vertexContainerName);
+
+    } // if new run/event
+    
+    ATH_MSG_DEBUG("BPhysBlindingTool::cacheEvent -- end");
+    
+    // Return gracefully:
+    return StatusCode::SUCCESS;
+  } 
+  //--------------------------------------------------------------------------
+  // Helper to check whether an element is marked as passing a specific
+  // hypothesis.
+  //--------------------------------------------------------------------------
+  bool BPhysBlindingTool::pass(const SG::AuxElement& em, std::string hypo) {
+    
+    if ( !boost::algorithm::starts_with(hypo, "passed_") )
+      hypo = "passed_" + hypo;
+    SG::AuxElement::Accessor<Char_t> flagAcc(hypo);
+    return flagAcc.isAvailable(em) && flagAcc(em) != 0;
+  }
+  //--------------------------------------------------------------------------
+  // Tokenize a string using certain separators
+  //--------------------------------------------------------------------------
+  std::vector<std::string>
+  BPhysBlindingTool::getTokens(std::string input, std::string seperators) {
+    
+    std::vector<std::string> tokens;
+    boost::char_separator<char> sep(seperators.c_str());
+    typedef boost::tokenizer<boost::char_separator<char> > Tokenizer_t;
+    Tokenizer_t tokenizer(input, sep);
+    for (auto& token : tokenizer) {
+      tokens.push_back(token);
+    }
+    return tokens;
+  }
+  //--------------------------------------------------------------------------
+  // Format vector of floats as string
+  //--------------------------------------------------------------------------
+  std::string BPhysBlindingTool::vecToString(const std::vector<float>& v)
+     const {
+     std::string str("[");
+     for (unsigned int i=0; i<v.size(); ++i) {
+       str += std::to_string(v[i]);
+       if ( i < v.size()-1 ) str += ",";
+     }
+     str += "]";
+     return str;
+  }
+  //--------------------------------------------------------------------------
+  // Format vector of bools as string
+  //--------------------------------------------------------------------------
+  std::string BPhysBlindingTool::vecToString(const std::vector<bool>& v)
+     const {
+     std::string str("[");
+     for (unsigned int i=0; i<v.size(); ++i) {
+       str += std::to_string(v[i]);
+       if ( i < v.size()-1 ) str += ",";
+     }
+     str += "]";
+     return str;
+  }
+  //--------------------------------------------------------------------------
+} // namespace xAOD
diff --git a/PhysicsAnalysis/BPhys/BPhysTools/Root/BPhysTrackVertexMapTool.cxx b/PhysicsAnalysis/BPhys/BPhysTools/Root/BPhysTrackVertexMapTool.cxx
new file mode 100644
index 000000000000..c0cf97b32de9
--- /dev/null
+++ b/PhysicsAnalysis/BPhys/BPhysTools/Root/BPhysTrackVertexMapTool.cxx
@@ -0,0 +1,664 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id: $
+
+// system include:
+#include "boost/format.hpp"
+#include "boost/tokenizer.hpp"
+
+// EDM includes:
+#include "xAODEventInfo/EventInfo.h"
+#include "xAODBPhys/BPhysHypoHelper.h"
+
+// Local include(s):
+#include "BPhysTools/BPhysTrackVertexMapTool.h"
+
+namespace xAOD {
+  
+  //--------------------------------------------------------------------------
+  // Static utility method to prefix every line by a certain string
+  //--------------------------------------------------------------------------
+  std::string BPhysTrackVertexMapTool::wrapLines(std::string lines,
+						 std::string prefix) {
+    
+    std::string ostr;
+    std::istringstream stream(lines);
+    std::string line;
+    while ( std::getline(stream, line) ) {
+      if ( !ostr.empty() ) ostr += "\n";
+      ostr += prefix + line;
+    }
+    return ostr;
+  }
+  //--------------------------------------------------------------------------
+  // Constructor
+  //--------------------------------------------------------------------------
+  BPhysTrackVertexMapTool::BPhysTrackVertexMapTool( const std::string& name )
+    : asg::AsgTool( name ),
+      m_tracks(NULL), m_tracksAux(NULL), m_pvtxContainer(NULL),
+      m_svtxContainer(NULL), m_svtxAuxContainer(NULL), m_refPVContainer(NULL),
+      m_refPVAuxContainer(NULL),
+      m_nEvtsSeen (0), m_cachedRun(-1), m_cachedEvent(-1) {
+
+#ifdef ASGTOOL_ATHENA
+    declareInterface< IBPhysTrackVertexMapTool >( this );
+#endif // ASGTOOL_ATHENA
+
+    // Necessary containers
+    declareProperty("VertexContainerName", m_vertexContainerName);
+    declareProperty("TrackParticleContainerName",
+		    m_trackParticleContainerName="InDetTrackParticles");
+    declareProperty("PVContainerName", m_pvContainerName = "PrimaryVertices");
+    declareProperty("RefPVContainerName", m_refPVContainerName);
+
+    // Maximum number of events to dump maps to log file for 
+    declareProperty("DebugTrkToVtxMaxEvents", m_debugTrkToVtxMaxEvents = 0);
+
+    // Prefix for log dump lines 
+    declareProperty("DumpPrefix", m_dumpPrefix="TTV> ");
+
+    // Hypothesis name (for mass value pickup)
+    declareProperty("HypoName", m_hypoName="__NONE__");
+  }
+  //--------------------------------------------------------------------------
+  StatusCode BPhysTrackVertexMapTool::initialize() {
+    
+    // Greet the user:
+    ATH_MSG_DEBUG( "Initializing xAOD::BPhysTrackVertexMapTool" );
+    
+    if ( m_vertexContainerName == "" ) {
+      ATH_MSG_ERROR("No vertex container name provided!");
+    }
+    if ( m_refPVContainerName == "" ) {
+      ATH_MSG_ERROR("No refitted PV container name provided!");
+    }
+    if ( m_trackParticleContainerName == "" ) {
+      ATH_MSG_ERROR("No track particle container name provided!");
+    }
+    if ( m_pvContainerName == "" ) {
+      ATH_MSG_ERROR("No PV container name provided!");
+    }
+    // some info for the job log
+    ATH_MSG_INFO("VertexContainerName        : " << m_vertexContainerName);
+    ATH_MSG_INFO("PVContainerName            : " << m_pvContainerName);
+    ATH_MSG_INFO("RefPVContainerName         : " << m_refPVContainerName);
+    ATH_MSG_INFO("TrackParticleContainerName : "
+		 << m_trackParticleContainerName);
+    ATH_MSG_INFO("DebugTrkToVtxMaxEvents     : " << m_debugTrkToVtxMaxEvents);
+    ATH_MSG_INFO("DumpPrefix                 : " << m_dumpPrefix);
+    ATH_MSG_INFO("HypoName                   : " << m_hypoName);
+    
+    // Return gracefully:
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  StatusCode BPhysTrackVertexMapTool::finalize() {
+
+    ATH_MSG_DEBUG( "Finalizing xAOD::BPhysTrackVertexMapTool" );
+
+    // Return gracefully:
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+  StatusCode BPhysTrackVertexMapTool::logEvent() {
+
+    ATH_MSG_DEBUG( "logEvent in xAOD::BPhysTrackVertexMapTool" );
+  
+    // read info into maps cache
+    ATH_CHECK(cacheEvent());
+    
+    // dump info from maps if requested
+    if ( doLog() ) {
+
+      ATH_MSG_INFO("Track-to-vertex association map:");
+      
+      std::cout << summaryToString(m_dumpPrefix) << std::endl;
+      
+    } // if requested
+
+    // increment counter
+    m_nEvtsSeen++;
+
+    // Return gracefully:
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  bool BPhysTrackVertexMapTool::doLog() const {
+
+    return ( m_debugTrkToVtxMaxEvents < 0 ||
+	     m_debugTrkToVtxMaxEvents > (int)m_nEvtsSeen );
+  }  
+  //--------------------------------------------------------------------------
+  //
+  // Cache maps for current event.
+  //
+  // Call this once per event.
+  // Repeated calls for the same run/event are not updating the cache again.
+  //
+  //--------------------------------------------------------------------------
+  StatusCode BPhysTrackVertexMapTool::cacheEvent() {
+
+    ATH_MSG_DEBUG("BPhysTrackVertexMapTool::cacheEvent -- begin");
+    
+    const xAOD::EventInfo* eventInfo = NULL;
+    ATH_CHECK(evtStore()->retrieve(eventInfo, "EventInfo"));
+
+    if ( m_cachedRun   != (int)eventInfo->runNumber() ||
+	 m_cachedEvent != (int)eventInfo->eventNumber() ) {
+
+      // note update
+      m_cachedRun   = eventInfo->runNumber();
+      m_cachedEvent = eventInfo->eventNumber();
+
+      ATH_MSG_DEBUG("BPhysTrackVertexMapTool::cacheEvent: caching now: "
+		    << "run " << m_cachedRun << " event " << m_cachedEvent);
+      
+      // retrieve primary vertices container
+      m_pvtxContainer = NULL;
+      ATH_CHECK(evtStore()->retrieve(m_pvtxContainer, m_pvContainerName));
+      ATH_MSG_DEBUG("Found PV collection with key " << m_pvContainerName);
+      
+      // retrieve ID track container
+      m_tracks    = NULL;
+      m_tracksAux = NULL;
+      ATH_CHECK(evtStore()->retrieve(m_tracks, m_trackParticleContainerName));
+      if (evtStore()->contains<xAOD::
+	  TrackParticleAuxContainer>(m_trackParticleContainerName+"Aux.")) {
+	ATH_CHECK(evtStore()->retrieve(m_tracksAux,
+				       m_trackParticleContainerName+"Aux."));
+      } else {
+	ATH_MSG_DEBUG("No aux track collection with key "
+		      << m_trackParticleContainerName+"Aux.");
+      }
+      ATH_MSG_DEBUG("Found track collection with key "
+		    << m_trackParticleContainerName);
+      
+      // vertex container and its auxilliary store
+      m_svtxContainer    = NULL;
+      m_svtxAuxContainer = NULL;
+      ATH_CHECK(evtStore()->retrieve(m_svtxContainer, m_vertexContainerName));
+      ATH_CHECK(evtStore()->retrieve(m_svtxAuxContainer,
+				     m_vertexContainerName+"Aux."));
+      ATH_MSG_DEBUG("Found SV collection with key " << m_vertexContainerName);
+      
+      // refitted primary vertex container and its auxilliary store
+      m_refPVContainer    = NULL;
+      m_refPVAuxContainer = NULL;
+      ATH_CHECK(evtStore()->retrieve(m_refPVContainer, m_refPVContainerName));
+      ATH_CHECK(evtStore()->retrieve(m_refPVAuxContainer,
+				     m_refPVContainerName+"Aux."));
+      ATH_MSG_DEBUG("Found refitted PV collection with key "
+		    << m_refPVContainerName);
+
+      // initialize track, PV and refPV maps
+      initTrackVertexMaps(m_tracks, m_pvtxContainer, m_refPVContainer, 
+			  m_svtxContainer);
+    } // if new run/event
+    
+    ATH_MSG_DEBUG("BPhysTrackVertexMapTool::cacheEvent -- end");
+    
+    // Return gracefully:
+    return StatusCode::SUCCESS;
+  } 
+  //--------------------------------------------------------------------------
+  //
+  // Retrieve primary vertices for ID track from map.
+  //
+  //--------------------------------------------------------------------------
+  std::vector<const xAOD::Vertex*>
+  BPhysTrackVertexMapTool::pvsForIDTrack(const xAOD::TrackParticle* track)
+    const {
+    
+    TrackToVertexMap_t::const_iterator it = m_idTrackToPVMap.find(track);
+
+    if ( it != m_idTrackToPVMap.end() ) {
+      return it->second;
+    } else {
+      std::vector<const xAOD::Vertex*> dummy;
+      return dummy;
+    }
+  }
+  //--------------------------------------------------------------------------
+  //
+  // Retrieve refitted primary vertices for ID track from map.
+  //
+  //--------------------------------------------------------------------------
+  std::vector<const xAOD::Vertex*>
+  BPhysTrackVertexMapTool::refPVsForIDTrack(const xAOD::TrackParticle* track)
+    const {
+    
+    TrackToVertexMap_t::const_iterator it = m_idTrackToRefPVMap.find(track);
+
+    if ( it != m_idTrackToRefPVMap.end() ) {
+      return it->second;
+    } else {
+      std::vector<const xAOD::Vertex*> dummy;
+      return dummy;
+    }
+  }
+  //--------------------------------------------------------------------------
+  //
+  // Retrieve secondary vertices for ID track from map.
+  //
+  //--------------------------------------------------------------------------
+  std::vector<const xAOD::Vertex*>
+  BPhysTrackVertexMapTool::svsForIDTrack(const xAOD::TrackParticle* track)
+    const {
+    
+    TrackToVertexMap_t::const_iterator it = m_idTrackToSVMap.find(track);
+
+    if ( it != m_idTrackToSVMap.end() ) {
+      return it->second;
+    } else {
+      std::vector<const xAOD::Vertex*> dummy;
+      return dummy;
+    }
+  }
+  //--------------------------------------------------------------------------
+  //
+  // Initialize ID tracks, PV and refPV related maps.
+  //
+  //--------------------------------------------------------------------------
+  void BPhysTrackVertexMapTool
+  ::initTrackVertexMaps(const xAOD::TrackParticleContainer* tpc,
+			const xAOD::VertexContainer*        pvc, 
+			const xAOD::VertexContainer*        rpvc, 
+			const xAOD::VertexContainer*        svc) {
+
+    // clear previous entries
+    m_pvNameMap.clear();
+    m_refPVNameMap.clear();
+    m_svNameMap.clear();
+    m_idTrackNameMap.clear();
+    m_idTrackToPVMap.clear();
+    m_idTrackToRefPVMap.clear();
+    m_idTrackToSVMap.clear();
+
+    // initialize maps for PVs
+    for (xAOD::VertexContainer::const_iterator vtxItr = pvc->begin();
+	 vtxItr != pvc->end(); ++vtxItr) {
+      const xAOD::Vertex* vtx = *vtxItr;
+      pvName(vtx);
+      for (size_t i = 0; i < vtx->nTrackParticles(); ++i) {
+	const xAOD::TrackParticle* track = vtx->trackParticle(i);
+	// m_idTrackToPVMap[track] = vtx;
+	addVertexToTrackVertexMap(m_idTrackToPVMap, track, vtx);
+      }
+    }
+    // initialize maps for refitted PVs
+    for (xAOD::VertexContainer::const_iterator vtxItr = rpvc->begin();
+	 vtxItr != rpvc->end(); ++vtxItr) {
+      const xAOD::Vertex* vtx = *vtxItr;
+      refPVName(vtx);
+      for (size_t i = 0; i < vtx->nTrackParticles(); ++i) {
+	const xAOD::TrackParticle* track = vtx->trackParticle(i);
+	// m_idTrackToRefPVMap[track] = vtx;
+	addVertexToTrackVertexMap(m_idTrackToRefPVMap, track, vtx);
+      }
+    }
+
+    // initialize maps for SVs
+    for (xAOD::VertexContainer::const_iterator vtxItr = svc->begin();
+	 vtxItr != svc->end(); ++vtxItr) {
+      const xAOD::Vertex* vtx = *vtxItr;
+      svName(vtx);
+      for (size_t i = 0; i < vtx->nTrackParticles(); ++i) {
+	const xAOD::TrackParticle* track = vtx->trackParticle(i);
+	// m_idTrackToSVMap[track] = vtx;
+	addVertexToTrackVertexMap(m_idTrackToSVMap, track, vtx);
+      }
+    }
+    // initialize maps for ID tracks
+    for (xAOD::TrackParticleContainer::const_iterator trkItr = tpc->begin();
+	 trkItr != tpc->end(); ++trkItr) {
+      const xAOD::TrackParticle* track = *trkItr;
+      idTrackName(track);
+    }
+  }
+  //--------------------------------------------------------------------------
+  //
+  // Add vertex to track-to-vertex map with vector of vertices.
+  //
+  //--------------------------------------------------------------------------
+  void BPhysTrackVertexMapTool
+  ::addVertexToTrackVertexMap(TrackToVertexMap_t& map,
+			      const xAOD::TrackParticle* track,
+			      const xAOD::Vertex* vtx) {
+
+    TrackToVertexMap_t::const_iterator it = map.find(track);
+
+    if ( it == map.end() ) {
+      map[track] = std::vector<const xAOD::Vertex*>();
+    }
+    map[track].push_back(vtx);
+  }
+  //--------------------------------------------------------------------------
+  // Lookup name for PV -- add as next if not yet known
+  //--------------------------------------------------------------------------
+  std::string BPhysTrackVertexMapTool::pvName(const xAOD::Vertex* vtx) {
+    
+    if ( m_pvNameMap.find(vtx) == m_pvNameMap.end() ) {
+      boost::format f("PV%03d");
+      f % m_pvNameMap.size();
+      m_pvNameMap[vtx] = f.str();
+    }
+    return m_pvNameMap[vtx];
+  }
+  //--------------------------------------------------------------------------
+  // Lookup name for refitted PV -- add as next if not yet known
+  //--------------------------------------------------------------------------
+  std::string BPhysTrackVertexMapTool::refPVName(const xAOD::Vertex* vtx) {
+    
+    if ( m_refPVNameMap.find(vtx) == m_refPVNameMap.end() ) {
+      boost::format f("RV%03d"); 
+      f % m_refPVNameMap.size();
+      m_refPVNameMap[vtx] = f.str();
+    }
+    return m_refPVNameMap[vtx];
+  }
+  //--------------------------------------------------------------------------
+  // Lookup name for SV -- add as next if not yet known
+  //--------------------------------------------------------------------------
+  std::string BPhysTrackVertexMapTool::svName(const xAOD::Vertex* vtx) {
+    
+    if ( m_svNameMap.find(vtx) == m_svNameMap.end() ) {
+      boost::format f("SV%03d");
+      f % m_svNameMap.size();
+      m_svNameMap[vtx] = f.str();
+    }
+    return m_svNameMap[vtx];
+  }
+  //--------------------------------------------------------------------------
+  // Lookup name for ID track -- add as next if not yet known
+  //--------------------------------------------------------------------------
+  std::string 
+  BPhysTrackVertexMapTool::idTrackName(const xAOD::TrackParticle* track) {
+    
+    if ( m_idTrackNameMap.find(track) == m_idTrackNameMap.end() ) {
+      boost::format f("T%04d");
+      f % m_idTrackNameMap.size();
+      m_idTrackNameMap[track] = f.str();
+    }
+    return m_idTrackNameMap[track];
+  }
+  //--------------------------------------------------------------------------
+  // Print Track information to string -- optionally adding PVs or refPVs
+  //--------------------------------------------------------------------------
+  std::string 
+  BPhysTrackVertexMapTool::idTrackToString(const xAOD::TrackParticle* track,
+					   unsigned int indent,
+					   bool withPV, bool withRefPV,
+					   bool withSV) {
+    
+    std::string sind(indent, ' ');
+    boost::format f1("%s %-5s %p (%10.4f, %10.4f, %10.4f) VL %p");
+    f1 % sind % idTrackName(track) % track 
+      % track->pt() % track->eta() % track->phi(); //% track->vertex(); REMOVE IN MIGRATION TO MAKER
+    std::string str = f1.str();
+    if ( withPV ) {
+      TrackToVertexMap_t::iterator it = m_idTrackToPVMap.find(track);
+      if ( it != m_idTrackToPVMap.end() ) {
+	for ( auto vtx : it->second ) {
+	  str += "\n" + pvToString(vtx, indent+2, false);
+	}
+      } else {
+	boost::format f2("\n%s  %s");
+	f2 % sind % "NOPV";
+	str += f2.str();
+	    
+      }
+    }
+    if ( withRefPV ) {
+      TrackToVertexMap_t::iterator it = m_idTrackToRefPVMap.find(track);
+      if ( it != m_idTrackToRefPVMap.end() ) {
+	for ( auto vtx : it->second ) {
+	  str += "\n" + refPVToString(vtx, indent+2, false);
+	}
+      } else {
+	boost::format f2("\n%s  %s");
+	f2 % sind % "NORV";
+	str += f2.str();
+      }
+    }
+    if ( withSV ) {
+      TrackToVertexMap_t::iterator it = m_idTrackToSVMap.find(track);
+      if ( it != m_idTrackToSVMap.end() ) {
+	for ( auto vtx : it->second ) {
+	  str += "\n" + svToString(vtx, indent+2, false);
+	}
+      } else {
+	boost::format f2("\n%s  %s");
+	f2 % sind % "NOSV";
+	str += f2.str();
+      }
+    }
+    return str;
+  }  
+  //--------------------------------------------------------------------------
+  // Print PV information to string -- optionally adding tracks
+  //--------------------------------------------------------------------------
+  std::string 
+  BPhysTrackVertexMapTool::pvToString(const xAOD::Vertex* vtx,
+				      unsigned int indent,
+				      bool withTracks) {
+
+    std::string sind(indent, ' ');
+    boost::format f1("%s %-5s %p (%10.4f, %10.4f, %10.4f) NT %4d VT %d");
+    f1 % sind % pvName(vtx) % vtx % vtx->x() % vtx->y() % vtx->z()
+      % vtx->nTrackParticles() % vtx->vertexType();
+    std::string str = f1.str();
+    if ( withTracks ) {
+      for (size_t i=0; i < vtx->nTrackParticles(); ++i) {
+	boost::format f2("\n%s  %4d %s");
+	f2 % sind % i 
+	  % idTrackToString(vtx->trackParticle(i), 0, false, false);
+	str += f2.str();
+      } // for
+    }
+
+    return str;
+  }
+  //--------------------------------------------------------------------------
+  // Print refitted PV information to string -- optionally adding tracks
+  //--------------------------------------------------------------------------
+  std::string 
+  BPhysTrackVertexMapTool::refPVToString(const xAOD::Vertex* vtx,
+					 unsigned int indent,
+					 bool withTracks) {
+
+    std::string sind(indent, ' ');
+    boost::format f1("%s %-5s %p (%10.4f, %10.4f, %10.4f) NT %4d VT %d");
+    f1 % sind % refPVName(vtx) % vtx % vtx->x() % vtx->y() % vtx->z()
+      % vtx->nTrackParticles() % vtx->vertexType();
+    std::string str = f1.str();
+    if ( withTracks ) {
+      for (size_t i=0; i < vtx->nTrackParticles(); ++i) {
+	boost::format f2("\n%s  %4d %s");
+	f2 % sind % i 
+	  % idTrackToString(vtx->trackParticle(i), 0, false, false);
+	str += f2.str();
+      } // for
+    }
+
+    return str;
+  }
+  //--------------------------------------------------------------------------
+  // Print SV information to string -- optionally adding tracks
+  //--------------------------------------------------------------------------
+  std::string 
+  BPhysTrackVertexMapTool::svToString(const xAOD::Vertex* vtx,
+				      unsigned int indent,
+				      bool withTracks,
+				      bool withMasses) {
+    
+    std::string sind(indent, ' ');
+    boost::format f1("%s %-5s %p (%10.4f, %10.4f, %10.4f) NT %4d VT %d");
+    f1 % sind % svName(vtx) % vtx % vtx->x() % vtx->y() % vtx->z()
+      % vtx->nTrackParticles() % vtx->vertexType();
+    std::string str = f1.str();
+    if ( withMasses && m_hypoName != "__NONE__" ) {
+      // vector of possible hypo names
+      std::vector<std::string> hypoNames = getTokens(m_hypoName, "|;/");
+      for ( auto hypoName : hypoNames ) {
+	BPhysHypoHelper bhh(hypoName, vtx);
+	float bMass       = bhh.mass();
+	float bMassErr    = bhh.massErr();
+	float bMucMass    = getFloat(hypoName+"_MUCALC_mass", vtx);
+	float bMucMassErr = getFloat(hypoName+"_MUCALC_massErr", vtx);
+	if ( bMass > 0. || bMassErr > 0.
+	     || bMucMass > 0. || bMucMassErr > 0. ) {
+	  boost::format f3("\n%s  %-10s : mass     : (%15.4f +/- %15.4f) MeV");
+	  
+	  boost::format f4("\n%s  %-10s : m(MUCALC): (%15.4f +/- %15.4f) MeV");
+	  f3 % sind % hypoName % bMass    % bMassErr;
+	  f4 % sind % hypoName % bMucMass % bMucMassErr;
+	  str += f3.str() + f4.str();
+	} // if one > 0.
+      } // for hypoNames
+    } // if withMasses
+    if ( withTracks ) {
+      for (size_t i=0; i < vtx->nTrackParticles(); ++i) {
+	boost::format f2("\n%s  %4d %s");
+	f2 % sind % i 
+	  % idTrackToString(vtx->trackParticle(i), 0, false, false);
+	str += f2.str();
+      } // for
+    }
+    return str;
+  }
+  //--------------------------------------------------------------------------
+  // Print track container information to string 
+  // -- optionally adding PVs and refitted PVs
+  //--------------------------------------------------------------------------
+  std::string 
+  BPhysTrackVertexMapTool::idTracksToString(const xAOD::TrackParticleContainer*
+					    tpc,
+					    unsigned int indent,
+					    bool withPV,
+					    bool withRefPV,
+					    bool withSV) {
+
+    std::string str;
+    std::string sind(indent, ' ');
+    str += sind + "ID tracks: (" + std::to_string(tpc->size()) + ")\n";
+    str += sind + std::string(80-indent, '-');
+    // loop over ID tracks
+    for (xAOD::TrackParticleContainer::const_iterator trkItr = tpc->begin();
+	 trkItr != tpc->end(); ++trkItr) {
+      const xAOD::TrackParticle* track = *trkItr;
+      str += "\n" 
+	+ idTrackToString(track, indent+2, withPV, withRefPV, withSV);
+    }
+    return str;
+  }
+  //--------------------------------------------------------------------------
+  // Print PV container information to string -- optionally adding tracks
+  //--------------------------------------------------------------------------
+  std::string 
+  BPhysTrackVertexMapTool::pvsToString(const xAOD::VertexContainer* pvc,
+				       unsigned int indent,
+				       bool withTracks) {
+
+    std::string str;
+    std::string sind(indent, ' ');
+    str += sind + "Primary vertices: (" + std::to_string(pvc->size()) + ")\n";
+    str += sind + std::string(80-indent, '-');
+    for (xAOD::VertexContainer::const_iterator vtxItr = pvc->begin();
+	 vtxItr != pvc->end(); ++vtxItr) {
+      const xAOD::Vertex* vtx = *vtxItr;
+      str += "\n" + pvToString(vtx, indent+2, withTracks);
+    } // for    
+
+    return str;
+  }
+  //--------------------------------------------------------------------------
+  // Print refitted PV container information to string 
+  // -- optionally adding tracks
+  //--------------------------------------------------------------------------
+  std::string 
+  BPhysTrackVertexMapTool::refPVsToString(const xAOD::VertexContainer* rpvc,
+					  unsigned int indent,
+					  bool withTracks) {
+
+    std::string str;
+    std::string sind(indent, ' ');
+    str += sind + "Refitted primary vertices: (" + std::to_string(rpvc->size()) + ")\n";
+    str += sind + std::string(80-indent, '-');
+    for (xAOD::VertexContainer::const_iterator vtxItr = rpvc->begin();
+	 vtxItr != rpvc->end(); ++vtxItr) {
+      const xAOD::Vertex* vtx = *vtxItr;
+      str += "\n" + refPVToString(vtx, indent+2, withTracks);
+    } // for    
+
+    return str;
+  }
+  //--------------------------------------------------------------------------
+  // Print SV container information to string -- optionally adding tracks
+  //--------------------------------------------------------------------------
+  std::string 
+  BPhysTrackVertexMapTool::svsToString(const xAOD::VertexContainer* svc,
+				       unsigned int indent,
+				       bool withTracks,
+				       bool withMasses) {
+
+    std::string str;
+    std::string sind(indent, ' ');
+    str += sind + "Secondary vertices: (" + std::to_string(svc->size()) + ")\n";
+    str += sind + std::string(80-indent, '-');
+    for (xAOD::VertexContainer::const_iterator vtxItr = svc->begin();
+	 vtxItr != svc->end(); ++vtxItr) {
+      const xAOD::Vertex* vtx = *vtxItr;
+      str += "\n" + svToString(vtx, indent+2, withTracks, withMasses);
+    } // for    
+
+    return str;
+  }
+  //--------------------------------------------------------------------------
+  // Print a summary of all maps to string -- optionally adding a prefix
+  //--------------------------------------------------------------------------
+  std::string BPhysTrackVertexMapTool::summaryToString(std::string prefix) {
+
+    boost::format form("%s\n\nRun: %d  Event: %d\n\n");
+    form % name() % m_cachedRun % m_cachedEvent;
+    std::string dstr = 
+      wrapLines("\n"+form.str() +
+		pvsToString(m_pvtxContainer, 0, true) + "\n\n" +
+		refPVsToString(m_refPVContainer, 0, true) + "\n\n" +
+		svsToString(m_svtxContainer, 0, true, true) + "\n\n" +
+		idTracksToString(m_tracks, 0, true, true, true) + "\n",
+		prefix);
+
+    return dstr;
+  }
+  //--------------------------------------------------------------------------
+  // Pick up a float from StoreGate.
+  //--------------------------------------------------------------------------
+  float BPhysTrackVertexMapTool::getFloat(std::string name,
+					  const xAOD::Vertex* b) {
+
+    float res = -999999.;
+
+    SG::AuxElement::Accessor<float> floatAcc(name);
+    if ( floatAcc.isAvailable(*b) ) res = floatAcc(*b);
+
+    return res;
+  } 
+  //--------------------------------------------------------------------------
+  // Tokenize a string using certain separators
+  //--------------------------------------------------------------------------
+  std::vector<std::string> BPhysTrackVertexMapTool
+  ::getTokens(std::string input, std::string seperators) {
+
+    std::vector<std::string> tokens;
+    boost::char_separator<char> sep(seperators.c_str());
+    typedef boost::tokenizer<boost::char_separator<char> > Tokenizer_t;
+    Tokenizer_t tokenizer(input, sep);
+    for (auto& token : tokenizer) {
+      tokens.push_back(token);
+    }
+    return tokens;
+  }
+  //--------------------------------------------------------------------------
+} // namespace xAOD
diff --git a/PhysicsAnalysis/BPhys/BPhysTools/Root/SimpleEncrypter.cxx b/PhysicsAnalysis/BPhys/BPhysTools/Root/SimpleEncrypter.cxx
new file mode 100644
index 000000000000..77cc5475f192
--- /dev/null
+++ b/PhysicsAnalysis/BPhys/BPhysTools/Root/SimpleEncrypter.cxx
@@ -0,0 +1,516 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+
+// system include:
+#include <climits>
+#include <vector>
+#include <algorithm>
+#include <cstdlib>
+#include <ctime>
+#include <cmath>
+
+// ROOT includes
+#include <TString.h>
+
+// Local include(s):
+#include "BPhysTools/SimpleEncrypter.h"
+
+namespace xAOD {
+
+  //--------------------------------------------------------------------------
+  // Private static constants
+  //--------------------------------------------------------------------------
+  const SimpleEncrypter::ULLI_t SimpleEncrypter::m_MAXRANGE =
+    (SimpleEncrypter::ULLI_t)pow(std::numeric_limits<ULLI_t>::max(), 0.25);
+  const SimpleEncrypter::ULLI_t SimpleEncrypter::m_MINRANGE =
+    (SimpleEncrypter::ULLI_t)SimpleEncrypter::m_MAXRANGE/10;
+  const unsigned int SimpleEncrypter::m_MAXHEXDIGITS =
+    (unsigned int)(log(pow(SimpleEncrypter::m_MAXRANGE,2))/log(16.))+3;
+  
+  //--------------------------------------------------------------------------
+  // Public methods
+  //--------------------------------------------------------------------------
+
+  //--------------------------------------------------------------------------
+  // Constructor
+  //--------------------------------------------------------------------------
+  SimpleEncrypter::SimpleEncrypter(const std::string& name) :
+    asg::AsgMessaging(name), m_n(0), m_e(0), m_d(0),
+    m_isOkForEnc(false), m_isOkForDec(false) {
+
+    // initialize random number generator
+    srand(static_cast<unsigned>(time(0)));
+  }
+  
+  //--------------------------------------------------------------------------
+  // Destructor
+  //--------------------------------------------------------------------------
+  SimpleEncrypter::~SimpleEncrypter() {
+
+  }
+  
+  //--------------------------------------------------------------------------
+  // Generation of key pair as pair of hex strings
+  //--------------------------------------------------------------------------
+  std::pair<std::string, std::string> SimpleEncrypter::genKeyPair() {
+
+    // default preset
+    std::pair<std::string, std::string> keys =
+      std::make_pair("__NO_PRIV_KEY__", "__NO_PUB_KEY__");
+
+    // generate keys
+    genKeyPairInternal();
+
+    if ( isOkForEnc() && isOkForDec() ) {
+      keys = std::make_pair(getPrivKey(), getPubKey());
+    }
+    return keys;
+  }
+
+  //--------------------------------------------------------------------------
+  // Set private key
+  //--------------------------------------------------------------------------
+  void SimpleEncrypter::setPrivKey(std::string keystr) {
+  
+    std::pair<ULLI_t, ULLI_t> keys = decodeKeyString(keystr);
+    
+    if ( m_n > 0 && m_n != keys.first ) {
+      ATH_MSG_WARNING("RSA module already set!");
+    }
+    m_n = keys.first;
+    m_d = keys.second;
+    m_isOkForDec = false;
+  }
+  //--------------------------------------------------------------------------
+  // Set public key
+  //--------------------------------------------------------------------------
+  void SimpleEncrypter::setPubKey(std::string keystr) {
+  
+    std::pair<ULLI_t, ULLI_t> keys = decodeKeyString(keystr);
+    
+    if ( m_n > 0 && m_n != keys.second ) {
+      ATH_MSG_WARNING("RSA module already set!");
+    }
+    m_e = keys.first;
+    m_n = keys.second;
+    m_isOkForEnc = false;
+  }
+  //--------------------------------------------------------------------------
+  // Get private key
+  //--------------------------------------------------------------------------
+  std::string SimpleEncrypter::getPrivKey() const {
+  
+    return keyToString(m_n, m_d);
+  }
+  //--------------------------------------------------------------------------
+  // Get public key
+  //--------------------------------------------------------------------------
+  std::string SimpleEncrypter::getPubKey() const {
+
+    return keyToString(m_e, m_n);    
+  }
+  //--------------------------------------------------------------------------
+  // Encrypt unsigned integer value
+  //--------------------------------------------------------------------------
+  SimpleEncrypter::ULLI_t SimpleEncrypter::encrypt(ULLI_t a) {
+
+    ULLI_t b = a;
+
+    if ( isOkForEnc() ) {
+      b = encryptFPECycle(a);
+    }
+    return b;
+  }
+  //--------------------------------------------------------------------------
+  // Decrypt unsigned integer value
+  //--------------------------------------------------------------------------
+  SimpleEncrypter::ULLI_t SimpleEncrypter::decrypt(ULLI_t a) {
+
+    ULLI_t b = a;
+
+    if ( isOkForDec() ) {
+      b = decryptFPECycle(a);
+    }
+    return b;
+  }
+  //--------------------------------------------------------------------------
+  // Encrypt positive float value
+  //--------------------------------------------------------------------------
+  float SimpleEncrypter::encrypt(float a) {
+
+    float b = a;
+
+    if ( a > 0. ) {
+      if ( isOkForEnc() ) {
+        ULLI_t ia = floatBitsToInt(a);
+        ULLI_t ib = encryptFPECycle(ia);
+        b = intBitsToFloat(ib);
+      }
+    } else {
+      ATH_MSG_WARNING("Encrypt: Float value not positive: "
+                      << a << Form(" (%a) !", a));
+    } // if a > 0
+    return b;
+  }
+
+  //--------------------------------------------------------------------------
+  // Decrypt positive float value
+  //--------------------------------------------------------------------------
+  float SimpleEncrypter::decrypt(float a) {
+
+    float b = a;
+
+    // As nan is a valid encrypted value, decrypt it as well.
+    if ( a > 0. || std::isnan(a) ) {
+      if ( isOkForDec() ) {
+        ULLI_t ia = floatBitsToInt(a);
+        ULLI_t ib = decryptFPECycle(ia);
+        b = intBitsToFloat(ib);
+      }
+    } else {
+      ATH_MSG_WARNING("Decrypt: Float value not positive: "
+                      << a << Form(" (%a) !", a));
+    } // if a > 0
+    return b;
+  }
+
+  //--------------------------------------------------------------------------
+  // Private methods
+  //--------------------------------------------------------------------------
+
+  //--------------------------------------------------------------------------
+  // Generate numeric representation of the keys
+  //--------------------------------------------------------------------------
+  void SimpleEncrypter::genKeyPairInternal() {
+
+    // Generate prime numbers p != q
+    ULLI_t p(1);
+    ULLI_t q(1);
+    // Euler's phi function
+    ULLI_t phi(1);
+    
+    // reset encryption and decryption exponent
+    m_e = 0;
+    m_d = 0;
+    while ( p == q || m_e < 2 || m_e >= phi || m_d < 2
+            || m_e*m_d % phi != 1 ) {
+      double dlog2 = 0.;
+      while ( p == q || dlog2 < 0.1 || dlog2 > 30. ) {
+        p = genPrime();
+        q = genPrime();
+        dlog2 = fabs(log2(p)-log2(q));
+      } // inner while loop
+      phi = (p-1)*(q-1);
+      m_n = p*q;
+      m_e = genCoprime(phi);
+      m_d = genDecryptionExponent(phi, m_e);
+    } // outer while loop
+    m_isOkForDec = false;
+    m_isOkForEnc = false;
+  }
+  //--------------------------------------------------------------------------
+  // Find a prime number
+  //--------------------------------------------------------------------------
+  SimpleEncrypter::ULLI_t SimpleEncrypter::genPrime() const {
+    
+    ULLI_t t = (m_MINRANGE + rand()) % (m_MAXRANGE-1);
+    do {
+      t++;
+    } while ( !isPrime(t) || t < m_MINRANGE );
+    return t;
+  }
+  //--------------------------------------------------------------------------
+  // Test for being a prime number
+  //--------------------------------------------------------------------------
+  bool SimpleEncrypter::isPrime(ULLI_t n) const {
+    
+    bool isPrime = true;
+    if (n != 2) {
+      for (LLI_t i = 2; i < (LLI_t)sqrt(n) + 1; ++i) {
+        if (n % i == 0) {
+          isPrime = false;
+          break;
+        }
+      }
+    }
+    return isPrime;
+  }
+  //--------------------------------------------------------------------------
+  // Greatest common denominator
+  //--------------------------------------------------------------------------
+  SimpleEncrypter::ULLI_t
+  SimpleEncrypter::greatestCommonDenominator(ULLI_t n1, ULLI_t n2) const {
+
+    std::vector<LLI_t> r;
+    LLI_t i = 1;
+    r.push_back(std::max(n1, n2));
+    r.push_back(std::min(n1, n2));
+    while (r[i] != 0) {
+      ++i;
+      r.push_back(r[i-2] % r[i-1]);
+    }
+    return r[i-1];
+  }
+  //--------------------------------------------------------------------------
+  // Find coprime number
+  //--------------------------------------------------------------------------
+  SimpleEncrypter::ULLI_t SimpleEncrypter::genCoprime(ULLI_t n) const {
+    
+    // make sure coprime is larger than 5th Fermat number (2^16+1 = 65537)
+    ULLI_t i = (65537 + rand()) % (m_MAXRANGE -1);
+    do {
+      ++i;
+    } while (greatestCommonDenominator(n, i) != 1);
+    return i;
+  }
+  //--------------------------------------------------------------------------
+  // Find decryption exponent
+  //--------------------------------------------------------------------------
+  SimpleEncrypter::ULLI_t
+  SimpleEncrypter::genDecryptionExponent(ULLI_t phi, ULLI_t e) const {
+    
+    for (ULLI_t i=1; i<m_MAXRANGE; ++i) {
+      if ( ((phi * i + 1) % e) == 0 ) {
+        return (ULLI_t)((phi * i + 1) / e);
+      }
+    }
+    return 0;
+  }
+  //--------------------------------------------------------------------------
+  // Convert key to a hex string
+  //--------------------------------------------------------------------------
+  std::string SimpleEncrypter::keyToString(ULLI_t a, ULLI_t b) const {
+
+    // length of keys w.r.t. hex digits
+    unsigned int ra = (unsigned int)(log(a)/log(16.))+1;
+    unsigned int rb = (unsigned int)(log(b)/log(16.))+1;
+
+    // random numbers for padding
+    unsigned int r1 = rand() & ((1 << 4*(m_MAXHEXDIGITS-ra))-1);
+    unsigned int r2 = rand() & ((1 << 4*(m_MAXHEXDIGITS-rb))-1);
+
+    // format string
+    TString tstr = Form("%02x%02x%02x%0*x%0*llx%0*x%0*llx",
+                        m_MAXHEXDIGITS, ra, rb,
+                        m_MAXHEXDIGITS-ra, r1, ra, a,
+                        m_MAXHEXDIGITS-rb, r2, rb, b);
+    
+    return std::string(tstr.Data());
+  }
+  //--------------------------------------------------------------------------
+  // Convert hex string to two integers
+  //--------------------------------------------------------------------------
+  std::pair<SimpleEncrypter::ULLI_t, SimpleEncrypter::ULLI_t>
+  SimpleEncrypter::decodeKeyString(std::string hstr) const {
+    
+    std::pair<ULLI_t, ULLI_t> keys(0,0);
+    
+    TString str(hstr);
+    if (str.IsHex() && str.Length() > 3) {
+      str.ToLower();
+      unsigned int ndigits = strtoul(TString(str(0,2)).Data(), nullptr, 16);
+      unsigned int ra = strtoul(TString(str(2,2)).Data(), nullptr, 16); 
+      unsigned int rb = strtoul(TString(str(4,2)).Data(), nullptr, 16);
+      if ( str.Length() == (int)(2*ndigits + 6) ) {
+        keys.first  = strtoll(TString(str(ndigits+6-ra, ra)).Data(),
+                              nullptr, 16);
+        keys.second = strtoll(TString(str(2*ndigits+6-rb, rb)).Data(),
+                              nullptr, 16);
+      } else {
+        ATH_MSG_ERROR("Private/public key must be a hex string of " <<
+                      2*m_MAXHEXDIGITS+6 << " digits!");
+      } // if Length()
+    } else {
+      ATH_MSG_ERROR("Private/public key must be a hex string of " <<
+                    2*m_MAXHEXDIGITS+6 << " digits!");
+    } // if IsHex() ...
+    
+    return keys;
+  }
+  //--------------------------------------------------------------------------
+  // Interpret bits of positive floating point number as integer
+  //--------------------------------------------------------------------------
+  SimpleEncrypter::ULLI_t SimpleEncrypter::floatBitsToInt(float val) const {
+
+    ULLI_t res(0);
+
+    if ( val < 0. ) {
+      ATH_MSG_ERROR("Float value needs to be positive!");
+    } else {
+      // convert floating point number to ULLI_t if size fits
+      if ( sizeof(float) <= sizeof(ULLI_t) ) {
+        // check whether a quick conversion is possible
+        if ( sizeof(float) == sizeof(int) ) {
+          int* p = reinterpret_cast<int*>(&val);
+          res = *p;
+        } else {
+        // do a slow conversion
+          char* pval = reinterpret_cast<char*>(&val);
+          // loop over bytes
+          for (unsigned int i=0; i<sizeof(float); ++i) {
+            // loop over bits
+            for (unsigned int j=0; j<CHAR_BIT; ++j) {
+              unsigned int n = i*CHAR_BIT + j;
+              unsigned int bit = (*(pval+i) >> j) & 1;
+              if ( bit > 0 ) res |= 1 << n;
+            } // for bits
+          } // for bytes
+        } // if sizeof
+      } else {
+        ATH_MSG_ERROR("sizeof(float) > sizeof(ULLI_t): "
+                      << sizeof(float) << " > " << sizeof(LLI_t));
+      } // if sizeof
+    } // if val < 0.
+
+    return res;
+  }
+  //--------------------------------------------------------------------------
+  // Interpret bits of positive integer as floating point number
+  //--------------------------------------------------------------------------
+  float SimpleEncrypter::intBitsToFloat(ULLI_t val) const {
+
+    float res(0.);
+
+    // number of bits needed
+    unsigned int r = (int)(std::log2(val))+1;
+    
+    // convert ULLI_t to floating point number if size fits
+    if ( sizeof(float)*CHAR_BIT >= r ) {
+      // check whether a quick conversion is possible
+      if ( sizeof(float) == sizeof(int) ) {
+        float* p = reinterpret_cast<float*>(&val);
+        res = *p;
+      } else {
+        // do a slow conversion
+        char* pres = reinterpret_cast<char*>(&res);
+        // loop over bytes
+        for (unsigned int i=0; i<sizeof(float); ++i) {
+          // loop over bits
+          for (unsigned int j=0; j<CHAR_BIT; ++j) {
+            unsigned int n = i*CHAR_BIT + j;
+            unsigned int bit = (val >> n) & 1;
+            if ( bit > 0 ) *(pres+i) |= 1 << j;
+          } // for bits
+        } // for bytes
+      } // if sizeof
+    } else {
+      ATH_MSG_WARNING("sizeof(float)*CHAR_BIT < r: "
+                      << sizeof(float)*CHAR_BIT << " < " << r);
+    } // if sizeof
+    
+    return res;
+  }
+  //--------------------------------------------------------------------------
+  // Encrypt using format preserving encryption w.r.t. RSA modulus
+  // via cycling
+  //--------------------------------------------------------------------------
+  SimpleEncrypter::ULLI_t SimpleEncrypter::encryptFPECycle(ULLI_t a) const {
+    
+    ULLI_t enc = 0;
+    if ( a > 0 ) {
+      ULLI_t r = (int)(std::log2(m_n));
+      ULLI_t rmask = pow(2,r)-1;
+      ULLI_t c = a & rmask;
+      ULLI_t b = a - c;
+      do {
+        c = encryptInternal(c);
+      } while ( c > rmask );    
+      enc = b + c;
+    } // if
+    return enc;
+  }
+  //--------------------------------------------------------------------------
+  // Decrypt using format preserving encryption w.r.t. RSA modulus
+  // via cycling
+  //--------------------------------------------------------------------------
+  SimpleEncrypter::ULLI_t SimpleEncrypter::decryptFPECycle(ULLI_t enc) const {
+
+    ULLI_t dec = 0;
+    if ( enc > 0 ) {
+      ULLI_t r = (int)(std::log2(m_n));
+      ULLI_t rmask = pow(2,r)-1;
+      ULLI_t d = enc & rmask;
+      ULLI_t b = enc - d;
+      do {
+        d = decryptInternal(d);
+      } while ( d > rmask );
+      dec = d + b;
+    } // if
+    return dec;
+  }
+  //--------------------------------------------------------------------------
+  // Encrypt integer
+  //--------------------------------------------------------------------------
+  SimpleEncrypter::ULLI_t SimpleEncrypter::encryptInternal(ULLI_t x) const {
+    
+    return powerMod(x, m_e, m_n);
+  }
+  //--------------------------------------------------------------------------
+  // Decrypt integer
+  //--------------------------------------------------------------------------
+  SimpleEncrypter::ULLI_t SimpleEncrypter::decryptInternal(ULLI_t x) const {
+    
+    return powerMod(x, m_d, m_n);
+  }
+  //--------------------------------------------------------------------------
+  // Exponentiate a with d observing modulus n
+  //--------------------------------------------------------------------------
+  SimpleEncrypter::ULLI_t
+  SimpleEncrypter::powerMod(ULLI_t a, ULLI_t d, ULLI_t n) const {
+
+    int    bin[sizeof(ULLI_t)*CHAR_BIT];
+    ULLI_t dec[sizeof(ULLI_t)*CHAR_BIT];
+    
+    ULLI_t r = (ULLI_t)(std::log2(d))+1;
+    ULLI_t tmp = d;
+    // decompose exponent into binary number (reverse order!)
+    for (ULLI_t i=0; i < r; ++i) {
+      bin[r-i-1] = tmp % 2;
+      tmp = (LLI_t)(tmp/2);
+    } // for i
+    
+    // perform the exponentiation taking modulus into account
+    dec[0] = a;
+    for (ULLI_t i=1; i < r; ++i) {
+      ULLI_t d2 = dec[i-1]*dec[i-1] % n;
+      if ( bin[i] > 0 ) d2 *= a;
+      dec[i] = d2 % n;
+    } // for i
+    
+    return dec[r-1];
+  }
+  //--------------------------------------------------------------------------
+  // Check setup readiness for encryption
+  //--------------------------------------------------------------------------
+  bool SimpleEncrypter::isOkForEnc() {
+
+    if ( !m_isOkForEnc ) {
+      if ( m_n > 0 && m_e > 1 && m_e < m_n ) {
+        m_isOkForEnc = true;
+      } else {
+        ATH_MSG_ERROR("Setup not OK for encryption: public key set?");
+      }
+    } // if ! m_isOkForEnc
+    
+    return m_isOkForEnc;
+  }
+
+  //--------------------------------------------------------------------------
+  // Check setup readiness for decryption
+  //--------------------------------------------------------------------------
+  bool SimpleEncrypter::isOkForDec() {
+
+    if ( !m_isOkForDec ) {
+      if ( m_n > 0 && m_d > 1 && m_d < m_n ) {
+        m_isOkForDec = true;
+      } else {
+        ATH_MSG_ERROR("Setup not OK for decryption: private key set?");
+      }
+    } // if ! m_isOkForDec
+    
+    return m_isOkForDec;
+  }
+
+  //--------------------------------------------------------------------------
+} // namespace xAOD
diff --git a/PhysicsAnalysis/BPhys/BPhysTools/src/components/BPhysTools_entries.cxx b/PhysicsAnalysis/BPhys/BPhysTools/src/components/BPhysTools_entries.cxx
new file mode 100644
index 000000000000..2298acdeb109
--- /dev/null
+++ b/PhysicsAnalysis/BPhys/BPhysTools/src/components/BPhysTools_entries.cxx
@@ -0,0 +1,4 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
diff --git a/PhysicsAnalysis/BPhys/BPhysTools/util/createBlindingKeys.cxx b/PhysicsAnalysis/BPhys/BPhysTools/util/createBlindingKeys.cxx
new file mode 100644
index 000000000000..3be9cb51430f
--- /dev/null
+++ b/PhysicsAnalysis/BPhys/BPhysTools/util/createBlindingKeys.cxx
@@ -0,0 +1,83 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/**
+ * @file   creteBlindingKeys.cxx
+ * @author Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch>
+ *
+ * @brief  Utility to create a set of blinding keys
+ *
+ * @param[in] option: -c : perform a quick encoding/decoding check
+ */
+
+// system includes:
+#include <iostream>
+#include <iomanip>
+#include <set>
+#include <string>
+#include <cstdlib>
+#include <ctime>
+
+// Local include(s):
+#include "BPhysTools/SimpleEncrypter.h"
+
+int main(int argc, char* argv[]) {
+
+  // Enable check (-c flag)
+  bool doCheck(false);
+  int  nChecks(1);
+  if ( argc > 1 ) {
+    std::string arg(argv[1]);
+    if ( arg == "-c" ) doCheck = true;
+  }
+  if ( argc > 2 ) {
+    nChecks = atoi(argv[2]);
+  }
+  
+  // Helper object
+  xAOD::SimpleEncrypter senc;
+
+  // Create key pair
+  std::pair<std::string, std::string> keys = senc.genKeyPair();
+
+  std::cout << std::endl;
+  std::cout << "Blinding keys generated:" << std::endl;
+  std::cout << "  Private key: " << keys.first << std::endl;
+  std::cout << "  Public  key: " << keys.second << std::endl;
+  std::cout << std::endl;
+
+  // check that encryption works
+  if ( doCheck ) {
+    srand(static_cast<unsigned>(time(0)));
+    
+    std::cout << "Encryption test:" << std::endl;
+    int nOK(0);
+    for (int i=0; i<nChecks; ++i) {
+      float val = 10000.*
+        static_cast <float>(rand())/(static_cast <float> (RAND_MAX));
+      // float val = 5267.23;
+      float enc = senc.encrypt(val);
+      float dec = senc.decrypt(enc);
+      if ( dec == val ) ++nOK;
+      if ( i == 0 || dec != val ) {
+        std::cout << "  Test # " << i << std::endl;
+        std::cout << "    val = " << val << std::endl;
+        std::cout << "    enc = " << enc << std::endl;
+        std::cout << "    dec = " << dec << std::endl;
+        if ( dec == val ) {
+          std::cout << "  => worked!" << std::endl;
+        } else {
+          std::cout << "  => FAILED!" << std::endl;
+        }
+      } // if
+    } // for
+    std::cout << std::endl;
+    std::cout << "Summary:" << std::endl;
+    std::cout << "  nChecks: " << std::setw(12) << nChecks << std::endl;
+    std::cout << "  nOK    : " << std::setw(12) << nOK << std::endl;
+    std::cout << "  nFailed: " << std::setw(12) << nChecks - nOK << std::endl;
+  } // if
+  
+  exit(0);
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/CMakeLists.txt b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/CMakeLists.txt
new file mode 100644
index 000000000000..357dae19e36b
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/CMakeLists.txt
@@ -0,0 +1,26 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+################################################################################
+# Package: DerivationFrameworkBPhys
+################################################################################
+
+# Declare the package name:
+atlas_subdir( DerivationFrameworkBPhys )
+find_package( ROOT COMPONENTS Core MathCore )
+
+# Component(s) in the package:
+atlas_add_component( DerivationFrameworkBPhys
+   DerivationFrameworkBPhys/*.h src/*.cxx src/components/*.cxx
+   INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
+   LINK_LIBRARIES xAODMuon AthenaBaseComps JpsiUpsilonToolsLib
+   MuonSelectorToolsLib ${ROOT_LIBRARIES}
+   xAODTracking xAODBPhysLib AthenaKernel RecoToolInterfaces EventPrimitives
+   DerivationFrameworkInterfaces BPhysToolsLib TrackVertexAssociationToolLib
+   xAODBase xAODMetaData  AsgTools CaloInterfaceLib TrackToCaloLib
+   xAODEventInfo AthenaPoolUtilities xAODPrimitives TrigDecisionToolLib
+     BeamSpotConditionsData TrkVertexAnalysisUtilsLib ITrackToVertex
+   InDetTrackSelectionToolLib  InDetV0FinderLib)
+
+
+# Install files from the package:
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8})
+atlas_install_joboptions( share/*.py )
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/AugOriginalCounts.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/AugOriginalCounts.h
new file mode 100644
index 000000000000..47c5b166c795
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/AugOriginalCounts.h
@@ -0,0 +1,91 @@
+/* 
+   Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+/**
+ * @file   AugOriginalCounts.h
+ *
+ * @brief  Augmentation with primary vertex counts (before thinning)
+ */
+ 
+#ifndef DERIVATIONFRAMEWORKBPHYS_AUGORIGINALCOUNTS_H
+#define DERIVATIONFRAMEWORKBPHYS_AUGORIGINALCOUNTS_H
+ 
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "StoreGate/WriteDecorHandleKey.h"
+ 
+#include "xAODTracking/TrackParticleContainer.h"
+#include "xAODTracking/VertexContainer.h"
+#include "xAODEventInfo/EventInfo.h"
+
+#include <string>
+
+ 
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "xAODTracking/TrackParticleContainer.h"
+#include "xAODTracking/VertexContainer.h"
+#include <string>
+#include "xAODEventInfo/EventInfo.h"
+#include <StoreGate/WriteDecorHandleKey.h>
+
+namespace DerivationFramework {
+  ///
+  /// @class  AugOriginalCounts
+  ///
+  /// @brief  Augmentation with primary vertex counts (before thinning)
+  ///
+  /// This tool adds primary vertex counts and track counts
+  /// to the EventInfo container in order to preserve them in 
+  /// case the primary vertex or track collections are thinned.
+  ///
+  /// ### Job options
+  /// <table border="0">
+  /// <tr><th align="left">Name</td>
+  ///     <th align="left">Description</th></tr>
+  /// <tr><td>TrackContainer</td>
+  ///     <td>name of the TrackParticle container to be used</td>
+  /// </tr>
+  /// <tr><td>VertexContainer</td>
+  ///     <td>name of the Vertex container to be used</td>
+  /// </tr>
+  /// <tr><td>AddPVCountsByType</td>
+  ///     <td>add PV counts by PV type (default: false)</td>
+  /// </td>
+  /// </table>
+  ///
+  class AugOriginalCounts : public AthAlgTool, public IAugmentationTool {
+  public:
+    /// @brief Main constructor
+    AugOriginalCounts(const std::string& t, const std::string& n,
+		      const IInterface* p);
+    /// @brief Main method called for each event
+    virtual StatusCode addBranches() const override;
+    virtual StatusCode initialize() override;
+    private:
+    ///
+    /// @name job options
+    /// @{
+    SG::WriteDecorHandleKey<xAOD::EventInfo> m_OrigPVNTracks{this, "DO_NOT_SET1", "", "internal property"};
+    SG::WriteDecorHandleKey<xAOD::EventInfo> m_OrigNTracksKeys{this, "DO_NOT_SET2", "", "internal property"};
+    SG::WriteDecorHandleKey<xAOD::EventInfo> m_OrigNtype0{this, "DO_NOT_SET3", "", "internal property"};
+    SG::WriteDecorHandleKey<xAOD::EventInfo> m_OrigNtype1{this, "DO_NOT_SET4", "", "internal property"};
+    SG::WriteDecorHandleKey<xAOD::EventInfo> m_OrigNtype2{this, "DO_NOT_SET5", "", "internal property"};
+    SG::WriteDecorHandleKey<xAOD::EventInfo> m_OrigNtype3{this, "DO_NOT_SET6", "", "internal property"};
+    SG::WriteDecorHandleKey<xAOD::EventInfo> m_OrigNtypeUnknown{this, "DO_NOT_SET7", "", "internal property"};
+
+    SG::WriteDecorHandleKey<xAOD::VertexContainer> m_OrigSqrtPt2Sum{this, "DO_NOT_SET8", "", "internal property"};
+    SG::WriteDecorHandleKey<xAOD::VertexContainer> m_d_nPVTracks{this, "DO_NOT_SET9", "", "internal property"};
+    SG::ReadHandleKey<xAOD::TrackParticleContainer> m_TrackContainername;
+    SG::ReadHandleKey<xAOD::VertexContainer> m_PVContainername;
+    bool        m_addPVCountsByType;
+    bool        m_addNTracksToPVs;
+    bool        m_addSqrtPt2SumToPVs;
+    /// @}
+  };
+}
+ 
+#endif // DERIVATIONFRAMEWORKBPHYS_AUGORIGINALCOUNTS_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BMuonTrackIsoTool.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BMuonTrackIsoTool.h
new file mode 100644
index 000000000000..b670df14553e
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BMuonTrackIsoTool.h
@@ -0,0 +1,111 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//============================================================================
+// BMuonTrackIsoTool.h
+//============================================================================
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Changes:
+//
+// Add muon track isolation information for different configurations,
+// different track selections and different PV-to-SV association methods.
+//
+// For an usage example see BPHY8.py .
+//
+//============================================================================
+//
+#ifndef DERIVATIONFRAMEWORK_BMuonTrackIsoTool_H
+#define DERIVATIONFRAMEWORK_BMuonTrackIsoTool_H
+
+#include "DerivationFrameworkBPhys/BPhysVertexTrackBase.h"
+#include "xAODMuon/MuonContainer.h"
+#include "boost/multi_array.hpp"
+
+namespace InDet {
+  class IInDetTrackSelectionTool;
+}
+
+namespace DerivationFramework {
+  
+  class BMuonTrackIsoTool : virtual public BPhysVertexTrackBase {
+
+  private:
+    typedef BPhysVertexTrackBase super;
+    
+    //
+    // internal helper class
+    //
+  protected:
+    class MuIsoItem : public BaseItem {
+    
+  public:
+    MuIsoItem(std::string Name="_none_", std::string Bname="muiso",
+	      std::string Prefix="");
+    virtual ~MuIsoItem();
+	
+    virtual void        resetVals();
+    virtual void        copyVals(const BaseItem& item);
+    virtual void        copyVals(const MuIsoItem& item);
+    virtual void        fill(double isoValue=-2., int nTracks=-1,
+			     const xAOD::Muon* muon=NULL);
+    virtual std::string muIsoName();
+    virtual std::string nTracksName();
+    virtual std::string muLinkName();
+    
+  public:
+    mutable std::vector<float>  vIsoValues;
+    mutable std::vector<int>    vNTracks;
+    mutable MuonBag             vMuons;
+  }; // MuIsoItem
+    
+  public: 
+      BMuonTrackIsoTool(const std::string& t, const std::string& n,
+			const IInterface* p);
+
+  protected:
+      // Hook methods 
+      virtual StatusCode  initializeHook();
+      virtual StatusCode  finalizeHook();
+      
+      virtual StatusCode  addBranchesVCSetupHook(size_t ivc) const;
+
+      virtual StatusCode  addBranchesSVLoopHook(const xAOD::Vertex* vtx) const;
+
+      virtual StatusCode  calcValuesHook(const xAOD::Vertex* vtx,
+					 const unsigned int ipv,
+					 const unsigned int its,
+					 const unsigned int itt) const;
+      virtual bool        fastFillHook(const xAOD::Vertex* vtx,
+				       const int ipv) const;
+      
+  private:
+      virtual StatusCode  saveIsolation(const xAOD::Vertex* vtx) const;
+      virtual void        initResults();
+      virtual void        setResultsPrefix(std::string prefix) const;
+      
+      virtual std::string buildBranchName(unsigned int ic,
+					  unsigned int its,
+					  unsigned int ipv,
+					  unsigned int itt) const;
+      
+  private:      
+      // job options
+      std::string                      m_muonContainerName;
+      std::vector<double>              m_isoConeSizes;
+      std::vector<double>              m_isoTrkImpLogChi2Max;
+      std::vector<int>                 m_isoDoTrkImpLogChi2Cut;
+
+      // containers
+      mutable const xAOD::MuonContainer* m_muons;
+      
+      
+      // results array
+      typedef boost::multi_array<MuIsoItem, 4> MuIsoItem4_t;
+      mutable MuIsoItem4_t m_results;
+
+  }; // BMuonTrackIsoTool
+} // namespace
+
+#endif // DERIVATIONFRAMEWORK_BMuonTrackIsoTool_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysAddMuonBasedInvMass.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysAddMuonBasedInvMass.h
new file mode 100644
index 000000000000..3b87f7528241
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysAddMuonBasedInvMass.h
@@ -0,0 +1,304 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/** 
+ *  @file   BPhysAddMuonBasedInvMass.h
+ *  @author Wolfgang Walkowiak <wolfgang.walkowiak@cern.ch>
+ *
+ *  @brief  Augmentation with muon-information based invariant mass.
+ *
+ */  
+//
+#ifndef DERIVATIONFRAMEWORK_BPhysAddMuonBasedInvMass_H
+#define DERIVATIONFRAMEWORK_BPhysAddMuonBasedInvMass_H
+
+#include <string>
+#include <vector>
+#include <set>
+#include <map>
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "xAODBPhys/BPhysHelper.h"
+#include "EventPrimitives/EventPrimitives.h"
+#include "ITrackToVertex/ITrackToVertex.h"
+
+namespace DerivationFramework {
+  //
+  // typedefs -- to abbreviate long lines
+  //
+  typedef std::vector<const xAOD::TrackParticle*> TrackBag;
+  typedef std::vector<const xAOD::Muon*>          MuonBag;
+
+  ///
+  /// @class BPhysAddMuonBasedInvMass
+  /// @author Wolfgang Walkowiak <wolfgang.walkowiak@cern.ch>
+  ///
+  /// @brief Augment secondary vertices with muon-information-based mass.
+  /// 
+  ///  Add muon-information based invarient mass to secondary vertices using
+  ///  a four vector sum.  Optionally, it also calculates the minimum
+  ///  chi2 for all muon tracks of the secondary vertex candidate w.r.t.
+  ///  any primary vertex matching the selection criteria.
+  ///
+  ///  ### Job options provided by this class:
+  /// <table border="0">
+  /// <tr><th align="left">Name</th>         
+  ///     <th align="left">Description</th>
+  /// </tr>
+  /// <tr><td>BranchPrefix</td>
+  ///     <td>assign the prefix of added branches
+  ///         (possibly the derivation format's name)</td>
+  /// </tr>
+  /// <tr><td>VertexContainerName</td> 
+  ///     <td>name of container for vertices</td>
+  /// </tr>
+  /// <tr><td>TrkMasses</td>
+  ///     <td>ordered list of track masses
+  ///         (Important to keep proper order: J/psi muons go first!)</td>
+  /// </tr>
+  /// <tr><td>TrackToVertexTool</td>   
+  ///     <td>ToolHandle for track-to-vertex tool</td>
+  /// </tr>
+  /// <tr><td>AdjustToMuonKinematics</td>
+  ///     <td>Adjust the primary track particle's kinematics to the one of 
+  ///         the muon.</td>
+  /// </tr>
+  /// <tr><td valign="top">AddMinChi2ToAnyPVMode</td>
+  ///      <td>mode of minLogChi2ToAnyPV calculation: (default: 0)
+  ///          <table border="0"> 
+  ///            <tr><th align="left">Value</th>
+  ///                <th align="left">Explanation<th></tr>
+  ///            <tr><td>  0  </td><td>no such calculation</td></tr>
+  ///            <tr><td>  1  </td><td>use all PVs of requested
+  ///                                  type(s)</td></tr>
+  ///            <tr><td>  2  </td><td>exclude PVs associated to SVs</td></tr>
+  ///            <tr><td>  3  </td><td>replace PVs associated to SVs by 
+  ///                                  corresponding refitted PVs</td></tr>
+  ///          </table></td>
+  /// </tr>
+  /// <tr><td>PrimaryVertexContainerName</td>
+  ///     <td>name of container for primary vertices</td>
+  /// </tr>
+  /// <tr><td>MinNTracksInPV</td>
+  ///     <td>minimum number of tracks in PV
+  ///         for PV to be considered in calculation
+  ///         of minChi2MuToAnyPV variable.</td>
+  /// </tr>
+  /// <tr><td>PVTypesToConsider</td>
+  ///     <td>list of primary vertex types to consider
+  ///         (default: {1, 3})</td>
+  /// </tr>
+  /// <tr><td>DoVertexType</td>
+  ///     <td>PV-to-SV association types to be considered (bitwise variable,
+  ///         see xAODBPhys::BPhysHelper)<br>
+  ///         Note: only needed for AddMinChi2ToAnyPVMode > 1</td>
+  /// </tr>
+  /// </table>
+  ///                             
+  ///  @note
+  ///
+  ///  For a usage example see BPHY8.py .
+  /// 
+  class BPhysAddMuonBasedInvMass : virtual public AthAlgTool,
+    virtual public IAugmentationTool {
+
+  public:
+      ///
+      /// @brief Main contructor
+      /// 
+      BPhysAddMuonBasedInvMass(const std::string& t, const std::string& n,
+			       const IInterface* p);
+      
+      /// @brief Initialize augmentation tool.
+      virtual StatusCode initialize();
+      /// @brief Finalize augmentation tool.
+      virtual StatusCode finalize();
+      /// @brief Main method called for each event.
+      virtual StatusCode addBranches() const;
+
+  protected:
+      ///
+      /// @name Internal protected methods
+      /// @{
+      ///
+      /// @brief Calculate muon-information based mass values if available.
+      ///
+      /// @param[in] vtx secondary vertex
+      /// @param[in] trkMasses ordered vector of track mass values
+      /// @param[in] nMuRequested number of muons requested
+      /// @returns muon-information based invariant mass for secondary
+      ///          vertex and the corresponding uncertainty
+      /// 
+      std::pair<double, double> getMuCalcMass(xAOD::BPhysHelper& vtx,
+					      std::vector<double>
+					      trkMasses,
+					      int nMuRequested) const;
+      ///
+      /// @brief Obtain a set of tracks with muon track information if available
+      ///
+      /// @param[in] vtx secondary vertex
+      /// @returns   container of muon tracks, number of muons found
+      ///
+      std::pair<TrackBag, int> getTracksWithMuons(xAOD::BPhysHelper& vtx) const;
+      ///
+      /// @brief Calculate invariant mass and uncertainty from a set of tracks.
+      ///
+      /// Returns invariant mass and mass error given
+      /// a set of tracks, their mass hypotheses and a reference position. 
+      /// Each track must have a separate mass hypothesis in
+      /// the vector, and they must be in the same order as the tracks in the
+      /// track vector.  Otherwise it will go horribly wrong.
+      ///
+      /// @param[in] trksIn container with tracks to be considered
+      /// @param[in] massHypoTheses vector of mass hypotheses in the same
+      ///            order as the tracks
+      /// @param[in] pos position of the vertex
+      /// @returns   invariant mass value and uncertainty
+      ///
+      std::pair<double,double>
+	getInvariantMassWithError(TrackBag trksIn,
+				  std::vector<double> massHypotheses,
+				  const Amg::Vector3D& pos) const;
+      ///
+      /// @brief Determine minimum log chi2 of signal muon tracks w.r.t.
+      //         any primary vertex.
+      ///
+      /// Find minimum log chi2 distance of signal muons w.r.t any primary
+      /// vertex of required types and with a minimum number of tracks cut.
+      /// It also depends on the mode w.r.t. the treatment of the associated
+      /// primary vertex and the type of PV-to-SV association.
+      /// Returns this minimum chi2.
+      /// 
+      /// @param[in] vtx secondary vertex
+      /// @param[in] pvContainer container of primary vertices
+      /// @parma[in] pvtypes vector of primary vertex types to be considered
+      /// @param[in] minNTracksInPV minimum number of tracks in primary
+      ///            vertex for it to be considered
+      /// @param[in] mode mode of operation (possible values: 0, 1, 2 ,3)
+      /// @param[in] pv_type type of PV-to-SV association
+      /// @returns   minimum log chi2 = log(d0^2/d0e^+z0^2/z0e^2) w.r.t.
+      ///            any primary vertex
+      ///
+      double getMinChi2ToAnyPV(xAOD::BPhysHelper& vtx,
+			       const xAOD::VertexContainer* pvContainer,
+			       const std::vector<int>& pvtypes,
+			       const int minNTracksInPV,
+			       const int mode,
+			       const xAOD::BPhysHelper::pv_type&
+			       pvAssocType) const;
+      ///
+      /// @brief Calculate log chi2 value of a track w.r.t. a position.
+      ///
+      /// Calculate the log chi2 ( = log((d0/d0e)^2+(z0/z0e)^2) contribution
+      /// of a track at the position closest to the given PV.
+      ///
+      /// @param[in] track track considered
+      /// @param[in] pos   position considered
+      /// @returns   log chi2 value
+      ///
+      double getTrackPVChi2(const xAOD::TrackParticle& track,
+			    const Amg::Vector3D& pos) const;
+      ///
+      /// @brief Extract 3x3 momentum covariance matrix from a TrackParticle.
+      ///
+      /// Extract the 3x3 momentum covariance matrix in (x,y,z) notation
+      /// from the (phi, theta, qoverp) notation from a TrackParticle.
+      ///
+      /// @param[in] track TrackParticle considered
+      /// @returns   3x3 momentum covariance matrix
+      ///
+      AmgSymMatrix(3) getMomentumCov(const xAOD::TrackParticle* track) const;
+      /// 
+      /// @brief Extract 3x3 momentum covariance matrix from a Perigee.
+      ///
+      /// Extract the 3x3 momentum covariance matrix in (x,y,z) notation
+      /// from the (phi, theta, qoverp) notation from a Perigee.
+      ///
+      /// @param[in] perigee Trk::Perigee considered
+      /// @returns   3x3 momentum covariance matrix
+      ///
+      AmgSymMatrix(3) getMomentumCov(const Trk::Perigee* perigee) const;
+      /// 
+      /// @brief Extract 3x3 momentum covariance matrix from a track parameter
+      /// vector and 5x5 covariance matrix.
+      ///
+      /// Extract the 3x3 momentum covariance matrix in (x,y,z) notation
+      /// from the (phi, theta, qoverp) notation from a vector of
+      /// track parameters and the 5x5 error matrix.
+      ///
+      /// @param[in] pars 5-vector of track parameters
+      /// @param[in] cov  5x5 covariance matrix of track parameters
+      /// @returns   3x3 momentum covariance matrix
+      ///
+      AmgSymMatrix(3) getMomentumCov(const AmgVector(5)& pars,
+				     const AmgSymMatrix(5)& cov) const;
+      ///
+      /// @brief Find all muons associated to secondary vertex.
+      ///
+      /// Returns a vector of xAOD::Muon objects found
+      /// in this vertex and subsequent decay vertices.
+      /// Recursively calls itself if necessary.
+      ///
+      /// @param[in] vtx secondary vertex
+      /// @returns   container of muons found
+      ///
+      MuonBag findAllMuonsInDecay(xAOD::BPhysHelper& vtx) const;
+      ///
+      /// @brief Obtain a set of ID tracks for a set of muons.
+      ///
+      /// @param[in] muons container of muon objects
+      /// @returns   container of associated ID tracks
+      ///
+      TrackBag getIdTracksForMuons(MuonBag& muons) const;
+      ///
+      /// @brief Extract TrackParticle for Muon and adjust kinematics.
+      ///
+      /// Extract primary track particle from muon;
+      /// if configured adjust pt, eta and phi of it before returning
+      /// a pointer to it.
+      ///
+      /// @param[in] muon pointer to muon
+      /// @returns   TrackParticle pointer
+      ///
+      const xAOD::TrackParticle* adjustTrackParticle(const xAOD::Muon* muon)
+	const;
+      ///
+      /// @brief Initialize PV-to-SV association type vector.
+      ///
+      void initPvAssocTypeVec();
+      ///
+      /// @brief Clear the cache of adjusted TrackParticles.
+      ///
+      void clearAdjTpCache() const;
+      /// @}
+  private:      
+      /// @name job options
+      /// @{
+      std::string                      m_branchPrefix;
+      std::string                      m_vertexContainerName;
+      std::vector<double>              m_trkMasses;
+      ToolHandle<Reco::ITrackToVertex> m_trackToVertexTool;
+      bool                             m_adjustToMuonKinematics;
+      int                              m_addMinChi2ToAnyPVMode;
+      std::string                      m_pvContainerName;
+      int                              m_minNTracksInPV;
+      std::vector<int>                 m_pvTypesToConsider;
+      int                              m_doVertexType;
+      /// @}
+      ///
+      /// map original -> adjusted track particles
+      typedef std::map<const xAOD::TrackParticle*, const xAOD::TrackParticle*>
+	TpMap_t;
+      /// map of adjusted track particles as cache
+      mutable TpMap_t m_adjTpCache; 
+
+      /// cache for individual vertex types
+      std::vector<xAOD::BPhysHelper::pv_type> m_pvAssocTypes;
+
+  }; // class
+} // namespace
+
+#endif // DERIVATIONFRAMEWORK_BPhysAddMuonBasedInvMass_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysConversionFinder.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysConversionFinder.h
new file mode 100644
index 000000000000..50a429669624
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysConversionFinder.h
@@ -0,0 +1,76 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+///////////////////////////////////////////////////////////////////
+// BPhysConversionFinder.h, (c) ATLAS Detector software
+///////////////////////////////////////////////////////////////////
+// Author: A. Chisholm <andrew.chisholm@cern.ch>
+#ifndef DERIVATIONFRAMEWORK_BPHYSCONVERSIONFINDER_H
+#define DERIVATIONFRAMEWORK_BPHYSCONVERSIONFINDER_H
+
+#include <string>
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+
+#include "InDetConversionFinderTools/VertexPointEstimator.h"
+#include "InDetConversionFinderTools/ConversionPostSelector.h"
+#include "TrkVertexSeedFinderUtils/ITrkDistanceFinder.h"
+
+#include "TLorentzVector.h"
+
+namespace Trk
+{
+    class V0Tools;
+    class IVertexFitter;
+    class TrkVKalVrtFitter;
+}
+
+namespace InDet
+{
+    class VertexPointEstimator;
+    class TrackPairsSelector;
+    class ConversionPostSelector;
+}
+
+namespace DerivationFramework {
+
+class BPhysConversionFinder : public AthAlgTool, public IAugmentationTool {
+
+    public:
+
+        BPhysConversionFinder(const std::string& t, const std::string& n, const IInterface* p);
+
+        StatusCode initialize() override;
+        StatusCode finalize() override;
+
+        virtual StatusCode addBranches() const override;
+
+    private:
+
+        StatusCode doCascadeFit(const xAOD::Vertex * diMuonVertex, const xAOD::Vertex * convVertex, const double diMuonMassConstraint, TLorentzVector & fitMom, float & chiSq) const;
+
+        std::string m_diMuonCollectionToCheck;
+        std::vector<std::string> m_passFlagsToCheck;
+
+        ToolHandle <Trk::V0Tools> m_v0Tools;
+        ToolHandle <Trk::IVertexFitter> m_vertexFitter;
+        ToolHandle <InDet::VertexPointEstimator> m_vertexEstimator;
+        ToolHandle <Trk::ITrkDistanceFinder> m_distanceTool;
+        ToolHandle <InDet::ConversionPostSelector> m_postSelector;
+        ToolHandle <Trk::TrkVKalVrtFitter > m_cascadeFitter;
+
+        std::string m_inputTrackParticleContainerName;
+        std::string m_conversionContainerName;
+
+        float m_maxDistBetweenTracks;
+        float m_maxDeltaCotTheta;
+
+        bool m_requireDeltaM;
+        float m_maxDeltaM;
+
+  };
+}
+
+#endif // DERIVATIONFRAMEWORK_BPhysConversionFinder_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysMetadataBase.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysMetadataBase.h
new file mode 100644
index 000000000000..d4a5ffd90856
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysMetadataBase.h
@@ -0,0 +1,100 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+//============================================================================
+// BPhysMetadataBase.h
+//============================================================================
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Changes:
+// - w.w., 2017-01-22: Added use of BPhysMetaDataTool.
+// - w.w., 2019-12-05: Added long and vector<long> types
+//
+// Store JO metadata in the output file.
+//
+// It uses the BPhysMetaDataTool (default) or the IOVDbMetaDataTool to
+// store job option information as metadata in a specific branch whose
+// name needs to prefixed by the deriviation format name.
+// Note: Metadata stored by the IOVDbMetaDataTool is not readable on
+// 'RootCore' level.
+//
+// This is a base class.  Inherit from it to add the job options you want
+// to store.  For a usage example, see
+//   Bmumu_metadata.h / Bmumu_metadata.cxx
+// and
+//   BPHY8.py .
+//
+//============================================================================
+//
+#ifndef DERIVATIONFRAMEWORK_BPhysMetadataBase_H
+#define DERIVATIONFRAMEWORK_BPhysMetadataBase_H
+
+#include <string>
+#include <map>
+#include <vector>
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "GaudiKernel/ToolHandle.h"
+
+namespace DerivationFramework {
+
+  class BPhysMetadataBase : virtual public AthAlgTool,
+    virtual public IAugmentationTool {
+    public: 
+      BPhysMetadataBase(const std::string& t, const std::string& n,
+			const IInterface* p);
+
+      virtual StatusCode initialize();
+      virtual StatusCode finalize();
+      
+      virtual StatusCode addBranches() const;
+
+  protected:
+      virtual void recordPropertyI(const std::string& name, int         val);
+      virtual void recordPropertyL(const std::string& name, long        val);
+      virtual void recordPropertyD(const std::string& name, double      val);
+      virtual void recordPropertyB(const std::string& name, bool        val);
+      virtual void recordPropertyS(const std::string& name, const std::string& val);
+	
+      virtual void recordPropertyVI(const std::string& name, const std::vector<int>&    val);
+      virtual void recordPropertyVL(const std::string& name, const std::vector<long>&    val);
+      virtual void recordPropertyVD(const std::string& name, const std::vector<double>& val);
+      virtual void recordPropertyVB(const std::string& name, const std::vector<bool>&   val);
+      virtual void recordPropertyVS(const std::string& name,
+				    const std::vector<std::string>& val);
+	
+  private:
+      virtual StatusCode saveMetaDataBPhys()                      const;
+      virtual std::string buildFolderName(const std::string& fname="")   const;
+      virtual std::string vecToString(const std::vector<int>& v)         const;
+      virtual std::string vecToString(const std::vector<long>& v)        const;
+      virtual std::string vecToString(const std::vector<double>& v)      const;
+      virtual std::string vecToString(const std::vector<bool>& v)        const;
+      virtual std::string vecToString(const std::vector<std::string>& v) const;
+      
+  private:
+      /// Object accessing the output metadata store
+      mutable ServiceHandle< StoreGateSvc > m_outputMetaStore;
+      
+      // job options
+      std::string m_derivationName;
+      std::string m_mdFolderName;
+      std::string m_prefix;
+      
+      // maps for different types of JOs
+      std::map<std::string, int>                       m_propInt;
+      std::map<std::string, long>                      m_propLong;
+      std::map<std::string, double>                    m_propDouble;
+      std::map<std::string, bool>                      m_propBool;
+      std::map<std::string, std::string>               m_propString;
+      std::map<std::string, std::vector<int> >         m_propVInt;
+      std::map<std::string, std::vector<long> >        m_propVLong;
+      std::map<std::string, std::vector<double> >      m_propVDouble;
+      std::map<std::string, std::vector<bool> >        m_propVBool;
+      std::map<std::string, std::vector<std::string> > m_propVString;
+  }; // class
+} // namespace
+
+#endif // DERIVATIONFRAMEWORK_BPhysMetadataBase_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysPVCascadeTools.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysPVCascadeTools.h
new file mode 100644
index 000000000000..c1561102db76
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysPVCascadeTools.h
@@ -0,0 +1,159 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef DERIVATIONFRAMEWORK_PVCASCADETOOLS_H
+#define DERIVATIONFRAMEWORK_PVCASCADETOOLS_H
+
+#include "GaudiKernel/ToolHandle.h"
+#include "xAODBPhys/BPhysHypoHelper.h"
+#include "DerivationFrameworkBPhys/CascadeTools.h"
+#include "EventKernel/PdtPdg.h"
+
+#include <vector>
+// Authors: Adam Barton <abarton@SPAMMENOTTtttcern.ch>
+//          Eva Bouhova <bouhova@SPAMMENOTTtttcern.ch>
+
+
+//class CascadeTools;
+namespace Trk {
+  class V0Tools;
+  class VxCascadeInfo;
+}
+
+namespace Analysis{
+  class PrimaryVertexRefitter;
+}
+namespace InDet{
+class BeamSpotData;
+}
+
+namespace HepPDT{
+  class ParticleDataTable;
+}
+
+namespace DerivationFramework {
+  
+  class BPhysPVCascadeTools {
+  typedef ElementLink<xAOD::VertexContainer> VertexLink;
+  typedef std::vector<VertexLink> VertexLinkVector;
+  private:
+       const Trk::V0Tools *m_v0Tools;
+       const CascadeTools *m_cascadeTools;
+       const InDet::BeamSpotData *m_beamSpotData;
+
+       /// minimum number of tracks required in PVs considered
+       size_t m_PV_minNTracks;
+       
+  public:
+       bool m_copyAllVertices;
+       BPhysPVCascadeTools(const CascadeTools *cascadeTools);
+       BPhysPVCascadeTools(const CascadeTools *cascadeTools,
+                           const InDet::BeamSpotData*);
+         
+       
+       void ProcessVertex(const std::vector<TLorentzVector> &mom, Amg::MatrixX cov, xAOD::BPhysHypoHelper &vtx, xAOD::BPhysHelper::pv_type pvtype, double mass) const;
+    
+       static void FillBPhysHelperNULL(xAOD::BPhysHelper &vtx, const xAOD::VertexContainer* PvContainer,
+           xAOD::BPhysHelper::pv_type pvtype);
+       
+       ///Fills the BPhysHelper object with the standard parameters
+       void FillBPhysHelper(const std::vector<TLorentzVector> &mom, Amg::MatrixX cov, xAOD::BPhysHelper &vtx, const xAOD::Vertex* refPV,const xAOD::VertexContainer* refPvContainer,
+                    xAOD::BPhysHelper::pv_type pvtype, int) const;
+    
+       ///Returns the index integer of the vertex with the lowest Z in relation to the given vertex
+       size_t FindLowZIndex(const std::vector<TLorentzVector> &mom, const xAOD::BPhysHelper &Obj,
+			    const std::vector<const xAOD::Vertex*> &PVlist,
+			    const size_t PV_minNTracks=0) const;
+       ///Returns the index integer of the vertex with the lowest A0 in relation to the given vertex
+       size_t FindLowA0Index(const std::vector<TLorentzVector> &mom, const xAOD::BPhysHelper &Obj,
+			     const std::vector<const xAOD::Vertex*> &PVlist,
+			     const size_t PV_minNTracks=0) const;
+       
+       static size_t FindHighPtIndex(const std::vector<const xAOD::Vertex*> &PVlist);
+       
+       template< size_t NTracks> //NTracks = number of tracks in this type of vertex, if this is not known do not use this method
+       static bool VerticesMatchTracks(const xAOD::Vertex* v1, const xAOD::Vertex* v2); 
+
+       template< size_t NTracks>
+       static const xAOD::Vertex* FindVertex(const xAOD::VertexContainer* c, const xAOD::Vertex* v); 
+
+       /// Static method call with
+       /// DerivationFramework::BPhysDerHelpers::GetGoodPV
+       /// Returns a std::vector containing only PVs of type 1 and 3 - HighPt
+       /// and Pileup, which have at least PV_minNTracks tracks.
+       static std::vector<const xAOD::Vertex*> GetGoodPV(const xAOD::VertexContainer* pvContainer);
+       
+       /// Set the minimum number of tracks required for primary vertices to be
+       /// considered for primary vertex association to a secondary vertex.
+       /// Note that this requirement will not be applied for finding
+       /// the vertex with the highest pT sum (FindHighPtIndex()) since
+       /// it would possibly exclude this vertex which has been marked
+       /// earlier in the tool chain.
+       void SetMinNTracksInPV(size_t PV_minNTracks);
+
+       /// Get the current beamspot position either from cache or from
+       /// BeamCondSvc.
+       /// Before processing a new event, make sure to call
+       /// GetBeamSpot();
+       [[nodiscard]] const Amg::Vector3D& GetBeamSpot() const noexcept;
+
+       /// Find the index for the PV with the lowest distance in z of
+       /// the SV's DOCA point w.r.t. the beamline and the PV.
+       size_t FindLowZ0BAIndex(const std::vector<TLorentzVector> &mom, const xAOD::BPhysHelper &obj,
+			       const std::vector<const xAOD::Vertex*> &PVlist,
+			       const size_t PV_minNTracks=0) const;
+       /// Calculate the distance along z axis between the PV and
+       ///  SV's DOCA point w.r.t. the beamline.
+       double DistInZtoDOCA(const std::vector<TLorentzVector> &mom, const xAOD::BPhysHelper &obj,
+			    const xAOD::Vertex* vertex) const;
+       /// Point of DOCA w.r.t. the beamline backward extrapolated
+       /// along the B candidate's momentum direction. 
+       Amg::Vector3D DocaExtrapToBeamSpot(const std::vector<TLorentzVector> &mom, const xAOD::BPhysHelper &obj) const;
+
+       static void PrepareVertexLinks(Trk::VxCascadeInfo *result,  const xAOD::TrackParticleContainer* importedTrackCollection);
+
+       StatusCode FillCandwithRefittedVertices( bool refitPV,
+					      const xAOD::VertexContainer* pvContainer, xAOD::VertexContainer* refPvContainer,
+					      const Analysis::PrimaryVertexRefitter *pvRefitter, size_t in_PV_max, int DoVertexType,
+                                              Trk::VxCascadeInfo* casc, int index,
+                                              double mass, xAOD::BPhysHypoHelper &vtx);
+
+       static std::vector<const xAOD::TrackParticle*> CollectAllChargedTracks(const std::vector<xAOD::Vertex*> &cascadeVertices);
+       
+       static void SetVectorInfo(xAOD::BPhysHelper &, const Trk::VxCascadeInfo*);
+       static bool uniqueCollection(const std::vector<const xAOD::TrackParticle*>&);
+       static bool uniqueCollection(const std::vector<const xAOD::TrackParticle*>&, const std::vector<const xAOD::TrackParticle*>&);
+       static bool LinkVertices(SG::AuxElement::Decorator<VertexLinkVector> &decor, const std::vector<const xAOD::Vertex*>& vertices,
+                                                 const xAOD::VertexContainer* vertexContainer, const xAOD::Vertex* vert);
+       static double getParticleMass(const HepPDT::ParticleDataTable* pdt, int pdg);
+  }; // class BPhysPVCascadeTools
+
+} // namespace DerivationFramework
+
+
+//added by ab
+template< size_t NTracks>
+bool DerivationFramework::BPhysPVCascadeTools::VerticesMatchTracks(const xAOD::Vertex* v1, const xAOD::Vertex* v2)
+{
+    if(v1->nTrackParticles() != v2->nTrackParticles()) return false;
+    assert(v1->nTrackParticles() == NTracks);
+    std::array<const xAOD::TrackParticle*, NTracks> a1;
+    std::array<const xAOD::TrackParticle*, NTracks> a2;
+    for(size_t i=0;i<NTracks;i++){
+       a1[i] = v1->trackParticle(i);
+       a2[i] = v2->trackParticle(i);
+    }
+    std::sort(a1.begin(), a1.end());
+    std::sort(a2.begin(), a2.end());
+    return a1 == a2;
+}
+
+template< size_t NTracks>
+const xAOD::Vertex* DerivationFramework::BPhysPVCascadeTools::FindVertex(const xAOD::VertexContainer* c, const xAOD::Vertex* v){
+   for (const xAOD::Vertex* a : *c){
+      if(VerticesMatchTracks<NTracks>(a,v)) return a;
+   }
+   return nullptr;
+}
+#endif // DERIVATIONFRAMEWORK_PVCASCADETOOLS_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysPVThinningTool.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysPVThinningTool.h
new file mode 100644
index 000000000000..62d62d559433
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysPVThinningTool.h
@@ -0,0 +1,53 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+///////////////////////////////////////////////////////////////////
+// BPhysPVThinningTool.h
+///////////////////////////////////////////////////////////////////
+
+#ifndef DERIVATIONFRAMEWORK_BPhysPVThinningTool_H
+#define DERIVATIONFRAMEWORK_BPhysPVThinningTool_H 1
+
+#include "xAODTracking/VertexContainer.h"
+// Gaudi & Athena basics
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "StoreGate/ReadHandleKeyArray.h"
+#include "StoreGate/ThinningHandleKey.h"
+// DerivationFramework includes
+#include "DerivationFrameworkInterfaces/IThinningTool.h"
+
+namespace DerivationFramework {
+
+  
+  class BPhysPVThinningTool : public AthAlgTool, public IThinningTool {
+    
+  public: 
+    /** Constructor with parameters */
+    BPhysPVThinningTool( const std::string& t, const std::string& n, const IInterface* p );
+    
+    /** Destructor */
+    ~BPhysPVThinningTool();
+    
+    // Athena algtool's Hooks
+    virtual StatusCode  initialize() override;
+    virtual StatusCode  finalize() override;
+    
+    /** Check that the current event passes this filter */
+    virtual StatusCode doThinning() const override;
+ 
+  private:
+    StringProperty m_streamName{ this, "StreamName", "", "Name of the stream being thinned" };
+    SG::ReadHandleKeyArray<xAOD::VertexContainer> m_BPhyCandList;
+    SG::ThinningHandleKey<xAOD::TrackParticleContainer> m_TrackContainerName;
+    SG::ThinningHandleKey<xAOD::VertexContainer> m_PVContainerName;
+    mutable std::atomic<unsigned int> m_ntot;
+    mutable std::atomic<unsigned int> m_npass;
+    mutable std::atomic<unsigned int> m_tracks_kept;
+    bool m_keepTracks;
+  }; 
+  
+}
+
+
+#endif
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysPVTools.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysPVTools.h
new file mode 100644
index 000000000000..86412eb46d9a
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysPVTools.h
@@ -0,0 +1,108 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef DERIVATIONFRAMEWORK_PVTOOLS_H
+#define DERIVATIONFRAMEWORK_PVTOOLS_H
+
+#include "GaudiKernel/ToolHandle.h"
+#include "xAODBPhys/BPhysHelper.h"
+#include <vector>
+
+// Author: Adam Barton <abarton@SPAMMENOTTtttcern.ch>
+namespace InDet{
+class BeamSpotData;
+}
+namespace Trk {
+  class V0Tools;
+}
+namespace Analysis{
+  class PrimaryVertexRefitter;
+}
+
+
+namespace DerivationFramework {
+  
+  class BPhysPVTools {
+
+  private:
+       const Trk::V0Tools *m_v0Tools;
+       const InDet::BeamSpotData *m_beamSpotData;
+
+       /// minimum number of tracks required in PVs considered
+       size_t m_PV_minNTracks;
+
+       bool m_3dCalc;
+       
+  public:
+  
+       BPhysPVTools(const Trk::V0Tools *v0Tools);
+       BPhysPVTools(const Trk::V0Tools *v0Tools, const InDet::BeamSpotData*);
+       void SetSave3d(bool v) { m_3dCalc =v; }
+       StatusCode FillCandExistingVertices(xAOD::VertexContainer* vtxContainer, const xAOD::VertexContainer* pvContainer, int DoVertexType);
+       
+       static void FillBPhysHelperNULL(xAOD::BPhysHelper &vtx, const xAOD::VertexContainer* PvContainer,
+           xAOD::BPhysHelper::pv_type pvtype, bool do3d = false);
+       
+       StatusCode FillCandwithRefittedVertices(xAOD::VertexContainer* vtxContainer, const xAOD::VertexContainer* pvContainer,xAOD::VertexContainer* refPvContainer, const Analysis::PrimaryVertexRefitter* , size_t in_PV_max, int DoVertexType);
+       
+       void DecorateWithNULL(xAOD::VertexContainer* vtxContainer,const xAOD::VertexContainer* pvContainer, int DoVertexType) const;
+       
+       void DecorateWithDummyVertex(xAOD::VertexContainer* vtxContainer, const xAOD::VertexContainer* pvContainer, const xAOD::Vertex* Dummy, int DoVertexType, bool SetOrignal) const;
+       
+       ///Fills the BPhysHelper object with the standard parameters
+       void FillBPhysHelper(xAOD::BPhysHelper &vtx, const xAOD::Vertex* refPV,const xAOD::VertexContainer* refPvContainer,
+                    xAOD::BPhysHelper::pv_type pvtype, int) const;
+    
+       ///Returns the index integer of the vertex with the lowest Z in relation to the given vertex
+       size_t FindLowZIndex(const xAOD::BPhysHelper &Obj,
+			    const std::vector<const xAOD::Vertex*> &PVlist,
+			    const size_t PV_minNTracks=0) const;
+       ///Returns the index integer of the vertex with the lowest A0 in relation to the given vertex
+       size_t FindLowA0Index(const xAOD::BPhysHelper &Obj,
+			     const std::vector<const xAOD::Vertex*> &PVlist,
+			     const size_t PV_minNTracks=0) const;
+       
+       static size_t FindHighPtIndex(const std::vector<const xAOD::Vertex*> &PVlist);
+       
+       /// Static method call with
+       /// DerivationFramework::BPhysDerHelpers::GetGoodPV
+       /// Returns a std::vector containing only PVs of type 1 and 3 - HighPt
+       /// and Pileup, which have at least PV_minNTracks tracks.
+       static std::vector<const xAOD::Vertex*> GetGoodPV(const xAOD::VertexContainer* pvContainer);
+       
+       /// Set the minimum number of tracks required for primary vertices to be
+       /// considered for primary vertex association to a secondary vertex.
+       /// Note that this requirement will not be applied for finding
+       /// the vertex with the highest pT sum (FindHighPtIndex()) since
+       /// it would possibly exclude this vertex which has been marked
+       /// earlier in the tool chain.
+       void SetMinNTracksInPV(size_t PV_minNTracks);
+
+       /// Get the current beamspot position either from cache or from
+       /// BeamCondSvc.
+       /// Before processing a new event, make sure to call
+       /// GetBeamSpot();
+       [[nodiscard]] const Amg::Vector3D& GetBeamSpot() const noexcept;
+
+       /// Find the index for the PV with the lowest distance in z of
+       /// the SV's DOCA point w.r.t. the beamline and the PV.
+       size_t FindLowZ0BAIndex(const xAOD::BPhysHelper &obj,
+			       const std::vector<const xAOD::Vertex*> &PVlist,
+			       const size_t PV_minNTracks=0) const;
+       /// Calculate the distance along z axis between the PV and
+       ///  SV's DOCA point w.r.t. the beamline.
+       double DistInZtoDOCA(const xAOD::BPhysHelper &obj,
+			    const xAOD::Vertex* vertex) const;
+       /// Point of DOCA w.r.t. the beamline backward extrapolated
+       /// along the B candidate's momentum direction. 
+       Amg::Vector3D DocaExtrapToBeamSpot(const xAOD::BPhysHelper &obj) const;
+
+       static void PrepareVertexLinks(xAOD::Vertex* theResult,
+               const xAOD::TrackParticleContainer* importedTrackCollection);
+  }; // class BPhysPVTools
+
+} // namespace DerivationFramework
+
+
+#endif // DERIVATIONFRAMEWORK_PVTOOLS_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysVarBlinder.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysVarBlinder.h
new file mode 100644
index 000000000000..02e572a4f598
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysVarBlinder.h
@@ -0,0 +1,76 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+
+///
+/// @file   BPhysVarBlinder.h
+/// @author Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch>
+///
+/// @brief  Vertex variable(s) blinding tool
+///
+#ifndef DERIVATIONFRAMEWORK_BPhysVarBlinder_H
+#define DERIVATIONFRAMEWORK_BPhysVarBlinder_H
+
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "DerivationFrameworkBPhys/CfAthAlgTool.h"
+#include "GaudiKernel/ToolHandle.h"
+
+///
+/// forward declarations
+///
+namespace xAOD {
+  class BPhysBlindingTool;
+}
+namespace DerivationFramework {
+
+  ///
+  /// @class  BPhysVarBlinder
+  /// @author Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch>
+  ///
+  /// @ brief Vertex variable(s) blinding tool
+  ///
+  /// This is an AthAlgTool wrapper around the BPhysBlindingTool
+  /// from the package BPhysTools.
+  ///
+  /// Job options:
+  /// - BlindingTool   : ToolHandle for xAOD::BPhysBlindingTool
+  /// - EnableBlinding : Switch to easily en-/disable this tool 
+  ///
+  /// For an example configuration using this tool see BPHY8.py.
+  ///
+  class BPhysVarBlinder : public CfAthAlgTool, public IAugmentationTool {
+
+  public: 
+    ///
+    /// @brief Constructor
+    ///
+    BPhysVarBlinder(const std::string& t, const std::string& n,
+                    const IInterface* p);
+    ///
+    /// @brief Initialization
+    /// 
+    StatusCode initialize();
+    ///
+    /// @brief Finalization
+    ///
+    StatusCode finalize();
+    ///
+    /// @brief Perform blinding per event (if enabled)
+    ///
+    virtual StatusCode addBranches() const;
+      
+  private:
+    ///
+    /// @name Job options
+    /// @{
+    ///
+    /// @brief ToolHandle for blinding tool
+    ToolHandle<xAOD::BPhysBlindingTool> m_blindingTool;
+    ///
+    /// @brief Switch for enabling blinding 
+    bool   m_enableBlinding;
+    /// @}
+    
+  }; 
+}
+#endif // DERIVATIONFRAMEWORK_BPhysVarBlinder_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysVertexTrackBase.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysVertexTrackBase.h
new file mode 100644
index 000000000000..28a8f683152f
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BPhysVertexTrackBase.h
@@ -0,0 +1,303 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+//============================================================================
+// BPhysVertexTrackBase.h
+//============================================================================
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Changes:
+//
+// Base class for vertex-track related classes in need of
+// track-to-vertex association handling.
+//
+// For an usage example see BVertexTrackIsoTool and BPHY8.py .
+//
+//============================================================================
+//
+#ifndef DERIVATIONFRAMEWORK_BPhysVertexTrackBase_H
+#define DERIVATIONFRAMEWORK_BPhysVertexTrackBase_H
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "xAODEventInfo/EventInfo.h"
+#include "xAODBPhys/BPhysHelper.h"
+#include "EventPrimitives/EventPrimitives.h"
+#include "ITrackToVertex/ITrackToVertex.h"
+#include "TrackVertexAssociationTool/ITrackVertexAssociationTool.h"
+#include "xAODTracking/TrackParticleContainer.h"
+#include "xAODTracking/TrackParticleAuxContainer.h"
+#include "xAODTracking/VertexContainer.h"
+#include "xAODTracking/VertexAuxContainer.h"
+
+#include <string>
+#include <vector>
+#include <map>
+
+// forward declarations
+namespace InDet {
+  class IInDetTrackSelectionTool;
+}
+
+class TVector3;
+
+namespace DerivationFramework {
+  //
+  // typedefs -- to abbreviate long lines
+  //
+  typedef std::vector<const xAOD::TrackParticle*> TrackBag;
+  typedef std::vector<const xAOD::Muon*>          MuonBag;
+  typedef InDet::IInDetTrackSelectionTool         TrkSelTool;
+  
+  class BPhysVertexTrackBase : public AthAlgTool,
+    virtual public IAugmentationTool {
+
+  protected:
+    class BaseItem {
+      
+    public:
+      BaseItem(std::string Name="_none_", std::string Bname="iso",
+	       std::string Prefix="");
+      virtual ~BaseItem();
+      
+      virtual void        setup(std::string Name, std::string Bname="iso",
+				std::string Prefix="");
+      virtual void        setPrefix(std::string Prefix);
+      virtual void        resetVals();
+      virtual void        copyVals(const BaseItem& item) = 0;
+      virtual std::string buildName(std::string qualifier="",
+                                    std::string suffix="");
+      virtual std::string toString() const;
+      
+    public:
+      std::string     name;
+      std::string     bname;
+      std::string     prefix;
+    };
+
+  protected:
+    class TrackTypeCounter {
+
+    public:
+      TrackTypeCounter(BPhysVertexTrackBase& Parent, std::string Name);
+      virtual ~TrackTypeCounter();
+
+      virtual void addToCounter(uint64_t atype, uint64_t rtype=0,
+                                std::string prefix="", std::string suffix="",
+                                uint64_t counts=1);
+
+      virtual void addToCounter(std::string name, uint64_t atype=0,
+                                uint64_t counts=1);
+
+      virtual std::string countsToString(uint indent=0) const;
+      
+    public:
+      std::string name;
+
+    private:
+      typedef std::map<std::string, std::pair<uint64_t, uint64_t> >
+        NameCountMap_t;
+      NameCountMap_t        m_cnts;
+      BPhysVertexTrackBase& m_parent;
+    };
+    
+  public:
+      //
+      // enumeration for types of tracks to be considered
+      //
+      enum track_type {ASSOCPV, PVTYPE0, PVTYPE1, PVTYPE2, PVTYPE3, NONE,
+                       NULLVP,
+                       CAPVRFN3U0, CAPVNRN3U0, CAPVRF3DU0, CAPVNR3DU0,
+                       CAPVRFN3U1, CAPVNRN3U1, CAPVRF3DU1, CAPVNR3DU1,
+                       CAPVRFN3U2, CAPVNRN3U2, CAPVRF3DU2, CAPVNR3DU2,
+                       CAPVRFNNU3, CAPVNRNNU3, CAPVRFNNU4, CAPVNRNNU4,
+                       CAPVRFNNU5, CAPVNRNNU5, CAPVRFNNU6, CAPVNRNNU6,
+                       CAPVRFNNU7, CAPVNRNNU7, CAPVRFNNU8, CAPVNRNNU8,
+                       CAPVRFNNU9, CAPVNRNNU9 };
+      static const int          n_track_types;
+      static const std::string  track_type_str[];
+      static const uint64_t     track_type_bit[];
+  private:
+      static       uint64_t     s_track_type_all_cached;
+
+  public:
+      //
+      // convenience methods
+      //
+      static const std::string tts(track_type type);
+      static uint64_t          ttb(track_type type);
+      static uint64_t          ttall();
+      static uint64_t          ttallMin();
+      static uint64_t          rttor(const std::vector<uint64_t> &vtypes);
+      static std::string       wrapLines(std::string lines,
+					 std::string prefix);
+      static std::string trackToString(const xAOD::TrackParticle* track);
+
+  public:
+      //
+      // public methods called by the framework
+      //
+      BPhysVertexTrackBase(const std::string& t, const std::string& n,
+			   const IInterface* p);
+      
+      virtual StatusCode  initialize();
+      virtual StatusCode  finalize();
+      virtual StatusCode  addBranches() const;
+
+  protected:
+      //
+      // Hook methods -- need be be overwritten in the concrete class
+      //
+      virtual StatusCode  initializeHook();
+      virtual StatusCode  finalizeHook();
+      virtual StatusCode  addBranchesHook() const;
+      virtual StatusCode  addBranchesVCSetupHook(size_t ivc) const;
+      virtual StatusCode  addBranchesSVLoopHook(const xAOD::Vertex* vtx) const;
+      virtual StatusCode  calcValuesHook(const xAOD::Vertex* vtx,
+					 const unsigned int ipv,
+					 const unsigned int its,
+					 const unsigned int itt) const;
+      virtual bool        fastFillHook(const xAOD::Vertex* vtx,
+				       const int ipv) const;
+
+      //
+      // Methods to be called from within addBranchesSVLoopHook()
+      //
+      virtual StatusCode  calculateValues(const xAOD::Vertex* vtx) const;
+
+      //
+      // internal methods
+      //
+      // name string for vertex pointer and PV index
+      virtual std::string buildPvAssocCacheName(const xAOD::Vertex* vtx,
+						const int ipv) const;
+      
+      virtual void        initPvAssocTypeVec();
+      virtual TrackBag    findAllTracksInDecay(xAOD::BPhysHelper& vtx) const;
+      virtual void        findAllTracksInDecay(xAOD::BPhysHelper& vtx,
+					       TrackBag& tracks) const;
+      virtual MuonBag     findAllMuonsInDecay(xAOD::BPhysHelper& vtx) const;
+      virtual void        findAllMuonsInDecay(xAOD::BPhysHelper& vtx,
+					      MuonBag& muons) const;
+      virtual TrackBag    findAllMuonIdTracksInDecay(xAOD::BPhysHelper& vtx,
+						     MuonBag& muons) const;
+      virtual std::vector<TVector3>
+	findMuonRefTrackMomenta(xAOD::BPhysHelper& vtx, MuonBag& muons) const;
+
+      virtual TrackBag    selectTracks(const xAOD::TrackParticleContainer*
+				       inpTracks,
+				       xAOD::BPhysHelper& cand,
+				       const unsigned int ipv,
+				       const unsigned int its,
+				       const unsigned int itt) const;
+      virtual TrackBag    selectTracks(const xAOD::TrackParticleContainer*
+				       inpTracks,
+				       const TrackBag& exclTracks,
+				       xAOD::BPhysHelper& cand,
+				       const unsigned int ipv,
+				       const unsigned int its,
+				       const unsigned int itt) const;
+      virtual uint64_t detTrackTypes(const xAOD::TrackParticle* track,
+                                     const xAOD::Vertex* candPV,
+                                     const xAOD::Vertex* candRefPV) const;
+      virtual double   getTrackCandPVLogChi2(const xAOD::TrackParticle*
+                                             track,
+                                             const xAOD::Vertex* vtx,
+                                             bool doDCAin3D=false,
+                                             int chi2DefToUse=0) const;
+      virtual std::vector<double> getTrackLogChi2DCA(const xAOD::TrackParticle*
+                                                     track,
+                                                     const xAOD::Vertex* vtx,
+                                                     bool doDCAin3D=false,
+                                                     int chi2DefToUse=0)
+        const;
+      virtual std::string buildBranchBaseName(unsigned int its,
+                                              unsigned int ipv,
+                                              unsigned int itt,
+                                              std::string preSuffix="") const;
+      
+      virtual std::pair<const xAOD::Vertex*, double>
+        findMinChi2PV(const xAOD::TrackParticle* track,
+                      const xAOD::Vertex* candPV,
+                      const xAOD::Vertex* candRefPV,
+                      const std::vector<uint64_t>& pvtypes,
+                      const int minNTracksInPV,
+                      const bool useRefittedPvs,
+                      const bool doDCAin3D,
+                      const int chi2DefToUse) const;
+
+      virtual const xAOD::Vertex*
+        findAssocPV(const xAOD::TrackParticle* track,
+                    const xAOD::Vertex* candPV,
+                    const xAOD::Vertex* candRefPV,
+                    const std::vector<uint64_t>& pvtypes,
+                    const int minNTracksInPV,
+                    const bool useRefittedPvs) const;
+      
+  protected:      
+      // job options
+      std::vector<std::string>         m_branchPrefixes;
+      std::string                      m_branchBaseName;
+      std::string                      m_branchSuffix;
+      std::vector<std::string>         m_vertexContainerNames;
+      std::string                      m_trackParticleContainerName;
+      ToolHandleArray<TrkSelTool>      m_trackSelectionTools;
+      
+      ToolHandle<Reco::ITrackToVertex> m_trackToVertexTool;
+
+      ToolHandle<CP::ITrackVertexAssociationTool> m_tvaTool;
+
+      std::string                      m_pvContainerName;
+      std::vector<std::string>         m_refPVContainerNames;
+
+      int                              m_doVertexType;
+      std::vector<uint64_t>            m_useTrackTypes;
+      bool                             m_incPrecVerticesInDecay;
+      int                              m_minNTracksInPV;
+      std::vector<uint64_t>            m_pvTypesToConsider;
+      int                              m_debugTrackTypes;
+      std::vector<uint64_t>            m_debugTracksInEvents;
+
+      // working point of TVA tool
+      bool m_tvaToolHasWpLoose;
+
+      // containers
+      mutable const xAOD::TrackParticleContainer*    m_tracks;
+      mutable const xAOD::TrackParticleAuxContainer* m_tracksAux;
+      mutable const xAOD::VertexContainer*           m_pvtxContainer;
+      mutable const xAOD::VertexContainer*           m_svtxContainer;
+      mutable const xAOD::VertexAuxContainer*        m_svtxAuxContainer;
+      mutable const xAOD::VertexContainer*           m_refPVContainer;
+      mutable const xAOD::VertexAuxContainer*        m_refPVAuxContainer;
+      
+      // cache for individual vertex types
+      std::vector<xAOD::BPhysHelper::pv_type> m_pvAssocTypes;
+
+      mutable unsigned int m_nEvtsSeen;
+
+      // event info
+      mutable const xAOD::EventInfo* m_eventInfo;
+
+      // cache for similar PV-to-SV associations
+      typedef std::map<std::string, int> StringIntMap_t;
+      mutable StringIntMap_t m_pvAssocResMap;
+
+      // track types considered
+      uint64_t m_trackTypesUsed;
+
+      // track type counter map (for debugging)
+      std::unique_ptr<TrackTypeCounter> m_mttc;
+
+      // run and event numbers (see EventIDBase.h for types)
+      mutable unsigned int  m_runNumber;
+      mutable uint64_t      m_evtNumber;
+
+      // debug tracks in the current event?
+      mutable bool          m_debugTracksInThisEvent;
+      
+  }; // class
+} // namespace
+
+#endif // DERIVATIONFRAMEWORK_BPhysVertexTrackBase_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BTrackVertexMapLogger.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BTrackVertexMapLogger.h
new file mode 100644
index 000000000000..0b20390c590a
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BTrackVertexMapLogger.h
@@ -0,0 +1,49 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//============================================================================
+// BTrackVertexMapLogger.h
+//============================================================================
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Changes:
+//
+// Initiate dumps of track-to-vertex maps to log file which are provided
+// by BPhysTrackVertexMapTool instances.
+//
+// The BPhysTrackVertexMapTool instances need to be configured separately
+// and handed to this tool.
+//
+//============================================================================
+//
+#ifndef DERIVATIONFRAMEWORK_BTrackVertexMapLogger_H
+#define DERIVATIONFRAMEWORK_BTrackVertexMapLogger_H
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "BPhysTools/IBPhysTrackVertexMapTool.h"
+
+namespace DerivationFramework {
+  
+  class BTrackVertexMapLogger : virtual public AthAlgTool,
+    virtual public IAugmentationTool {
+  public: 
+      BTrackVertexMapLogger(const std::string& t, const std::string& n,
+			    const IInterface* p);
+      
+      virtual StatusCode initialize();
+      virtual StatusCode finalize();
+      
+      virtual StatusCode addBranches() const;
+      
+  private:
+      // job options
+      ToolHandleArray<xAOD::IBPhysTrackVertexMapTool> m_ttvmTools;
+      bool                                            m_enable;
+
+    }; // class
+} // namespace
+
+#endif // DERIVATIONFRAMEWORK_BTrackVertexMapLogger_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BVertexClosestTrackTool.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BVertexClosestTrackTool.h
new file mode 100644
index 000000000000..2b704516a23f
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BVertexClosestTrackTool.h
@@ -0,0 +1,149 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+//============================================================================
+// BVertexClosestTrackTool.h
+//============================================================================
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Changes:
+//
+// Add B vertex closest track information for different configurations,
+// different track selections and different PV-to-SV association methods.
+//
+// For an usage example see BPHY8.py .
+//
+//============================================================================
+//
+#ifndef DERIVATIONFRAMEWORK_BVertexClosestTrackTool_H
+#define DERIVATIONFRAMEWORK_BVertexClosestTrackTool_H
+
+#include "DerivationFrameworkBPhys/BPhysVertexTrackBase.h"
+#include "boost/multi_array.hpp"
+
+namespace InDet {
+  class IInDetTrackSelectionTool;
+}
+
+namespace DerivationFramework {
+  
+  class BVertexClosestTrackTool : virtual public BPhysVertexTrackBase {
+
+  private:
+    typedef BPhysVertexTrackBase super;
+    
+    //
+    // internal helper class
+    //
+  protected:
+    class CtItem : public BaseItem {
+
+      public:
+	CtItem(std::string Name="_none_",
+	       std::string Bname = "ctrk",
+	       std::string Prefix="",
+	       double Dca=-999., double DcaErr=-99.,
+	       double Zca=-999., double ZcaErr=-99.,
+         double VtxNDErr2=-99., double TrkNDErr2=-99.,
+         double Phi0Used=-999.,
+	       int NTrksChi2=0, xAOD::TrackParticle* CloseTrack=NULL,
+         TrackBag Tracks = {},
+         std::vector<std::vector<double> > Vtap = {},
+         std::vector<unsigned short> Selpat = {});
+
+	virtual ~CtItem();
+	
+	virtual void        setup(std::string Name="_none_",
+				  std::string Bname="ctrk",
+				  std::string Prefix="");
+	virtual void        setup(std::string Name, std::string Bname,
+				  std::string Prefix,
+				  double Dca, double DcaErr,
+				  double Zca, double ZcaErr,
+          double VtxNDErr2, double TrkNDErr2,
+          double Phi0Used,
+				  int NTrksChi2,
+          xAOD::TrackParticle* CloseTrack=NULL,
+          TrackBag Tracks = {},
+          std::vector<std::vector<double> > Vtap = {},
+          std::vector<unsigned short> Selpat = {});
+	virtual void        resetVals();
+	virtual void        copyVals(const BaseItem& item);
+	virtual void        copyVals(const CtItem& item);
+	virtual std::string dcaName();
+	virtual std::string dcaErrName();
+	virtual std::string zcaName();
+	virtual std::string zcaErrName();
+	virtual std::string vtxNDErr2Name();
+	virtual std::string trkNDErr2Name();
+	virtual std::string phi0UsedName();
+	virtual std::string nTrksChi2Name();
+	virtual std::string closeTrackName();
+  virtual std::string toString() const;
+
+  public:
+	mutable double             dca;
+	mutable double             dcaErr;
+	mutable double             zca;
+	mutable double             zcaErr;
+  mutable double             vtxNDErr2;
+  mutable double             trkNDErr2;
+  mutable double             phi0Used;
+	mutable int                nTrksChi2;
+	const xAOD::TrackParticle* closeTrack;
+  mutable TrackBag                          tracks;
+  mutable std::vector<std::vector<double> > vtap;
+  mutable std::vector<unsigned short>       selpat;
+
+  }; // CtItem
+      
+  public: 
+      BVertexClosestTrackTool(const std::string& t, const std::string& n,
+			      const IInterface* p);
+
+  protected:
+      // Hook methods 
+      virtual StatusCode  initializeHook();
+      virtual StatusCode  finalizeHook();
+
+      virtual StatusCode  addBranchesVCSetupHook(size_t ivc) const;
+      
+      virtual StatusCode  addBranchesSVLoopHook(const xAOD::Vertex* vtx) const;
+
+      virtual StatusCode  calcValuesHook(const xAOD::Vertex* vtx,
+					 const unsigned int ipv,
+					 const unsigned int its,
+					 const unsigned int itt) const;
+      virtual bool        fastFillHook(const xAOD::Vertex* vtx,
+				       const int ipv) const;
+  private:
+      virtual StatusCode  saveClosestTrack(const xAOD::Vertex* vtx) const;
+      virtual void        initResults();
+      virtual void        setResultsPrefix(std::string prefix) const;
+      virtual StatusCode  logCloseTracksDebugInfo() const;
+
+  private:      
+      // job options
+
+      std::vector<std::string> m_closeTrackChi2SetName;
+      std::vector<int>         m_closeTrackCorrChi2;
+      std::vector<bool>        m_minDCAin3D;
+      std::vector<double>      m_closeTrackMaxLogChi2;
+      std::vector<double>      m_nCloseTrackMaxLogChi2;
+
+      // results array
+      typedef boost::multi_array<CtItem, 4> CtItem4_t;
+      mutable CtItem4_t m_results;
+
+      // last run and event numbers seen
+      mutable unsigned int  m_lastRunNumber;
+      mutable uint64_t      m_lastEvtNumber;
+
+      // last secondary vertex (candidate) index
+      mutable unsigned int  m_svIdx;
+      
+  }; // BVertexClosestTrackTool
+} // namespace
+
+#endif // DERIVATIONFRAMEWORK_BVertexClosestTrackTool_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BVertexTrackIsoTool.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BVertexTrackIsoTool.h
new file mode 100644
index 000000000000..03e645b85146
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BVertexTrackIsoTool.h
@@ -0,0 +1,119 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//============================================================================
+// BVertexTrackIsoTool.h
+//============================================================================
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Changes:
+//
+// Add B vertex track isolation information for different configurations,
+// different track selections and different PV-to-SV association methods.
+//
+// For an usage example see BPHY8.py .
+//
+//============================================================================
+//
+#ifndef DERIVATIONFRAMEWORK_BVertexTrackIsoTool_H
+#define DERIVATIONFRAMEWORK_BVertexTrackIsoTool_H
+
+#include "DerivationFrameworkBPhys/BPhysVertexTrackBase.h"
+#include "boost/multi_array.hpp"
+
+namespace InDet {
+  class IInDetTrackSelectionTool;
+}
+
+namespace DerivationFramework {
+  
+  class BVertexTrackIsoTool : virtual public BPhysVertexTrackBase {
+    
+  private:
+    typedef BPhysVertexTrackBase super;
+    
+    //
+    // internal helper class
+    //
+  protected:
+    class IsoItem : public BaseItem {
+    
+  public:
+    IsoItem(std::string Name="_none_", std::string Bname="iso",
+	    std::string Prefix="",
+	    double IsoValue=-1., int NTracks=0);
+    virtual ~IsoItem();
+    
+    virtual void setup(std::string Name, std::string Bname="iso",
+		       std::string Prefix="");
+    virtual void setup(std::string Name, std::string Bname,
+		       std::string Prefix,
+		       double IsoValue, int NTracks=0);
+    virtual void resetVals();
+    virtual void copyVals(const BaseItem& item);
+    virtual void copyVals(const IsoItem& item);
+    virtual std::string isoName();
+    virtual std::string nTracksName();
+    
+  public:
+    mutable double  isoValue;
+    mutable int     nTracks;
+  }; // IsoItem
+
+  public: 
+      BVertexTrackIsoTool(const std::string& t, const std::string& n,
+			  const IInterface* p);
+
+  protected:
+      // Hook methods 
+      virtual StatusCode  initializeHook();
+      virtual StatusCode  finalizeHook();
+      
+      virtual StatusCode  addBranchesVCSetupHook(size_t ivc) const;
+
+      virtual StatusCode  addBranchesSVLoopHook(const xAOD::Vertex* vtx) const;
+
+      virtual StatusCode  calcValuesHook(const xAOD::Vertex* vtx,
+					 const unsigned int ipv,
+					 const unsigned int its,
+					 const unsigned int itt) const;
+      virtual bool        fastFillHook(const xAOD::Vertex* vtx,
+				       const int ipv) const;
+      
+  private:
+      virtual StatusCode  saveIsolation(const xAOD::Vertex* vtx) const;
+      virtual StatusCode  calculateIsolation(const xAOD::Vertex* vtx) const;
+      virtual StatusCode  calcIsolation(const IsoItem& iso,
+                                        const xAOD::Vertex* vtx,
+                                        const double coneSize,
+                                        const double logChi2Max,
+                                        const int doLogChi2,
+                                        const ToolHandle<TrkSelTool>& tSelTool,
+                                        const xAOD::BPhysHelper::pv_type
+                                        pvAssocType,
+                                        const int trackTypes ) const;
+
+      virtual void        initResults();
+      virtual void        setResultsPrefix(std::string prefix) const;
+      
+      virtual std::string buildBranchName(unsigned int ic,
+					  unsigned int its,
+					  unsigned int ipv,
+					  unsigned int itt) const;
+      
+  private:      
+      // job options
+      std::vector<double>              m_isoConeSizes;
+      std::vector<double>              m_isoTrkImpLogChi2Max;
+      std::vector<int>                 m_isoDoTrkImpLogChi2Cut;
+      bool                             m_useOptimizedAlgo;
+
+      // results array
+      typedef boost::multi_array<IsoItem, 4> IsoItem4_t;
+      mutable IsoItem4_t m_results;
+
+  }; // BVertexTrackIsoTool
+} // namespace
+
+#endif // DERIVATIONFRAMEWORK_BVertexTrackIsoTool_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BmumuThinningTool.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BmumuThinningTool.h
new file mode 100644
index 000000000000..bba64bb5fcb4
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/BmumuThinningTool.h
@@ -0,0 +1,441 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+/**
+ * @file   BmumuThinningTool.h
+ * @author Wolfgang Walkowiak <wolfgang.walkowiak@cern.ch>
+ *
+ * @brief  Primary vertex, track and muon thinning for Bmumu analysis.
+ */
+
+#ifndef DERIVATIONFRAMEWORK_BmumuThinningTool_H
+#define DERIVATIONFRAMEWORK_BmumuThinningTool_H
+
+#include "DerivationFrameworkBPhys/CfAthAlgTool.h"
+#include "DerivationFrameworkInterfaces/IThinningTool.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "xAODBPhys/BPhysHypoHelper.h"
+
+#include <string>
+
+class IThinningSvc;
+
+namespace SG {
+  class AuxElement;
+}
+
+namespace xAOD {
+  class AuxContainerBase;
+}
+
+namespace DerivationFramework {
+  ///
+  /// @class   BmumuThinningTool
+  /// @author Wolfgang Walkowiak <wolfgang.walkowiak@cern.ch>
+  ///
+  /// @brief  Primary vertex, track and muon thinning for Bmumu analysis.
+  ///
+  /// This class provides a thinning tool to thin the primary vertex,
+  /// the muon and calibrated muon collections as well as the inner
+  /// detector track selection depending on:
+  /// - the selected secondary vertices
+  /// - the selected PV-to-SV vertex association method
+  /// - additional track sub-collection (e.g. "closest tracks")
+  ///
+  /// This tool is primarily written for the B(s)->mumu analysis
+  /// and used by the BPHY8 derivation.
+  /// 
+  /// ### Job options
+  /// <table border="0">
+  /// <tr><th align="left">Name</td>
+  ///     <th align="left">Description</th></tr>
+  /// <tr><td valign="top">ThinningService</td>
+  ///     <td>Thinning service handle</td></tr>
+  /// <tr><td valign="top">TrackParticleContainerName</td>
+  ///     <td>TrackParticle container name
+  ///         (default: InDetTrackParticles)</td></tr>
+  /// <tr><td valign="top">VertexContainerNames</td>
+  ///     <td>List of secondary vertex container names</td></tr>
+  /// <tr><td valign="top">VertexPassFlags</td>
+  ///     <td>List of pass flags for the seconary vertices
+  ///         empty list lets all vertices pass.
+  ///         List length needs to be identical to length of
+  ///         VertexContainerNames list if AlignPassToVertexList
+  ///         is True</td></tr>
+  /// <tr><td valign="top">AlignPassToVertexList</td>
+  ///     <td>Align VertexPassFlags to VertexContainerNames list?
+  ///         This option causes a 1:1 correlation between the two lists,
+  ///         i.e. a flag is only applied to the corresponding container
+  ///         if this option is set to True. (default: false)</td></tr>
+  /// <tr><td valign="top">PVContainerName</td>
+  ///     <td>Primary vertex container name</td></tr>
+  /// <tr><td valign="top">RefPVContainerNames</td>
+  ///     <td>Refitted primary vertex container names.
+  ///         This list must be of same length and order as the
+  ///          m_vtxContNames list.
+  ///         (or empty: no thinning of refitted primary
+  ///          vertex containers)</td></tr>
+  /// <tr><td valign="top">MuonContainerName</td>
+  ///     <td> Name of the used muon container (default: "")</td></tr>
+  /// <tr><td valign="top">CalibMuonContainerName</td>
+  ///     <td>Name of the calibrated muons container (default: "")</td></tr>
+  /// <tr><td valign="top">CloseTrackBranchBaseName</td>
+  ///     <td>Closest track branch base name</td></tr>
+  /// <tr><td valign="top">CloseTrackBranchPrefixes</td>
+  ///     <td>Closest track branch prefixes</td></tr>
+  /// <tr><td valign="top">KeepTracksForSelectedPVs</td>
+  ///     <td>Keep tracks for selected (refitted) primary vertices?
+  ///         (default: false)</td></tr>
+  /// <tr><td valign="top">MatchCalibratedMuons</td>
+  ///     <td>Match vertex muons with calibrated muons?
+  ///         (default: false)</td></tr>
+  /// <tr><td valign="top">MarkMatchedMuons</td>
+  ///     <td>Mark orginal muons for matched calibrated muons as well?
+  ///         (only makes sense if MatchCalibratedMuons = True;
+  ///          default: false)</td></tr>
+  /// <tr><td valign="top">MarkMatchedCalMuons</td>
+  ///     <td>Mark calibrated muons for matched calibrated muons as well?
+  ///         (only makes sense if MatchedCalibratedMuons = False;
+  ///          default: false)</td></tr>
+  /// <tr><td valign="top">SyncMatchedMuonsBothWays</td>
+  ///     <td> Force syncing marked muons both ways?
+  ///          (default: false)</td></tr>
+  /// <tr><td valign="top">AllowFastMuonMaskSync</td>
+  ///     <td>Allow fast sync of myon masks?
+  ///         (Set to 'False' to force in-depth synchronization
+  ///          of muon masks. Default: false)</td></tr>
+  /// <tr><td valign="top">KeepCloseTracks</td>
+  ///     <td>Keep tracks for closest tracks? (default: false)</td></tr>
+  /// <tr><td valign="top">KeepTracksForMuons</td>
+  ///     <td>Keep tracks for selected muons? (default: false)</td></tr>
+  /// <tr><td valign="top">KeepTracksForCalMuons</td>
+  ///     <td>Keep tracks for selected calibrated muons?
+  ///         (default: false)</td></tr>
+  /// <tr><td valign="top">KeepMuonsForTracks</td>
+  ///     <td>Keep (original) muons for selected tracks?
+  ///         (default: false)</td></tr>
+  /// <tr><td valign="top">KeepCalMuonsForTracks</td>
+  ///     <td>Keep calibrated muons for selected tracks?
+  ///         (default: false)</td></tr>
+  /// <tr><td valign="top">ApplyAndForVertices</td>
+  ///     <td>Apply AND for mask matching for vertices?
+  ///         (default: false)</td></tr>
+  /// <tr><td valign="top">ApplyAndForTracks</td>
+  ///     <td>Apply AND for mask matching for tracks?
+  ///         (default: false)</td></tr>
+  /// <tr><td valign="top">ApplyAndForMuons</td>
+  ///     <td>Apply AND for mask matching for muons?
+  ///         (default: false)</td></tr>
+  /// <tr><td valign="top">ThinPVs"</td>
+  ///     <td>Thin primary vertex collection? (default: true)</td></tr>
+  /// <tr><td valign="top">ThinRefittedPVs"</td>
+  ///     <td>Thin refitted primary vertex collection?
+  ///         (default: true)</td></tr>
+  /// <tr><td valign="top">ThinTracks"</td>
+  ///     <td>Thin ID track collection?
+  ///         (default: true)</td></tr>
+  /// <tr><td valign="top">ThinMuons"</td>
+  ///     <td>Thin muon collections?
+  ///         (default: true)</td></tr>
+  /// </table>
+  ///
+  class BmumuThinningTool : public CfAthAlgTool, public IThinningTool {
+
+    // useful typedefs
+    typedef xAOD::BPhysHelper::pv_type pv_type;
+    typedef ElementLink<xAOD::TrackParticleContainer> TrackParticleLink;
+    
+  public:
+    /// @name pv_type to string map
+    //  Note: may later be migrated to xAODBPhys/BPhysHelper
+    static std::map<pv_type, std::string> PvTypeToVarNameMap;
+    
+  public:
+    /// @brief Main constructor
+    BmumuThinningTool(const std::string& t, const std::string& n,
+		      const IInterface* p);
+    /// @brief Default destructor
+    ~BmumuThinningTool();
+    /// @brief Initialize tool
+    StatusCode initialize();
+    /// @brief Finalize tool
+    StatusCode finalize();
+    /// @brief Main thinning method executed for each event
+    virtual StatusCode doThinning() const;
+
+  protected:
+    ///
+    /// @brief Helper checking for hypothesis passing
+    ///
+    /// Helper to check whether an element is marked as passing a specific
+    /// hypothesis.
+    ///
+    /// @param[in] em auxillary storage element
+    /// @param[in] hypo name of the hypothesis
+    /// @returns   true if hypothesis element contains true
+    ///
+    bool pass(const SG::AuxElement& em, std::string hypo) const;
+    ///
+    /// @brief Helper to get a TrackParticle link
+    ///
+    /// @param[in] vtx  secondary vertex containing link
+    /// @param[in] name name of the link
+    /// @returns   pointer to TrackParticle (NULL if not found)
+    ///
+    const xAOD::TrackParticle* getTrackParticle(const xAOD::Vertex* vtx,
+						std::string name) const;
+
+    template<typename TYPE>
+    StatusCode applyThinMask(SG::ThinningHandle<TYPE> &trkCont,
+           const std::vector<bool>& trkMask,
+           bool doAnd) const;
+
+
+    ///
+    /// @brief Mark muons matched to secondary vertices
+    ///
+    /// @param[in]     muCont      pointer to MuonContainer
+    /// @param[in,out] muMask      vector with mask per muon
+    /// @param[in]     vtx         secondary vertex
+    /// @param[in]     counterName name of counter
+    /// @returns       StatusCode
+    ///
+    StatusCode matchMuons(const xAOD::MuonContainer* muCont,
+			  std::vector<bool>& muMask,
+			  xAOD::BPhysHelper& vtx,
+			  std::string counterName) const;
+    ///
+    /// @name Sync-mark methods
+    ///
+    /// @{
+    ///
+    /// @brief Mark original muons for accepted calibrated muons
+    ///
+    /// @param[in]     muCont        pointer to MuonContainer of
+    ///                              (original) muons
+    /// @param[in]     cmuCont       pointer to MuonContainer of
+    ///                              calibrated muons
+    /// @param[in,out] muMask        mask for (original) muons
+    /// @param[in]     cmuMask       mask for calibrated muons
+    /// @param[in]     counterName   base name for counters
+    /// @param[in]     allowFastSync use fast synchronization method
+    /// @returns       StatusCode
+    ///
+    StatusCode markOrigMuons(const xAOD::MuonContainer* muCont,
+			     const xAOD::MuonContainer* cmuCont,
+			     std::vector<bool>& muMask,
+			     std::vector<bool>& cmuMask,
+			     std::string counterName,
+			     bool allowFastSync=true) const;
+    ///
+    /// @brief Mark calibrated muons for accepted (original) muons
+    ///
+    /// @param[in]     muCont        pointer to MuonContainer of
+    ///                              (original) muons
+    /// @param[in]     cmuCont       pointer to MuonContainer of
+    ///                              calibrated muons
+    /// @param[in]     muMask        mask for (original) muons
+    /// @param[in,out] cmuMask       mask for calibrated muons
+    /// @param[in]     counterName   base name for counters
+    /// @param[in]     allowFastSync use fast synchronization method
+    /// @returns       StatusCode
+    ///
+    StatusCode markCalibMuons(const xAOD::MuonContainer* muCont,
+			      const xAOD::MuonContainer* cmuCont,
+			      std::vector<bool>& muMask,
+			      std::vector<bool>& cmuMask,
+			      std::string counterName,
+			      bool allowFastSync) const;
+    ///
+    /// @brief Mark ID tracks of selected (original or calibrated) muons
+    /// 
+    /// @param[in]     trkPartCont   pointer to TrackParticle container
+    /// @param[in,out] trkMask       mask for tracks
+    /// @param[in]     muCont        pointer to MuonContainer
+    /// @param[in]     muMask        mask for muons
+    /// @param[in]     counterName   base name for counters
+    /// @returns       StatusCode
+    ///
+    StatusCode markTrksForSelMuons(const xAOD::TrackParticleContainer*
+				   trkPartCont,
+				   std::vector<bool>& trkMask,
+				   const xAOD::MuonContainer* muCont,
+				   std::vector<bool>& muMask,
+				   std::string counterName) const;
+    ///
+    /// @brief Mark muons for selected ID tracks
+    /// 
+    /// @param[in]     trkPartCont   pointer to TrackParticle container
+    /// @param[in]     trkMask       mask for tracks
+    /// @param[in,out] muCont        pointer to MuonContainer
+    /// @param[in]     muMask        mask for muons
+    /// @param[in]     counterName   base name for counters
+    /// @returns       StatusCode
+    ///
+    StatusCode markMuonsForSelTracks(const xAOD::TrackParticleContainer*
+				     trkPartCont,
+				     std::vector<bool>& trkMask,
+				     const xAOD::MuonContainer* muCont,
+				     std::vector<bool>& muMask,
+				     std::string counterName) const;
+    /// @}
+    ///
+
+    ///
+    /// @brief Obtain all auxillary elements matching a certain pattern.
+    ///
+    /// Helper to filter all names of auxillary elements of an aux container
+    /// according to a certain pattern.  The pattern must be a regular
+    /// expression pattern.
+    ///
+    /// @param[in] auxCont pointer to AuxContainer
+    /// @param[in] pattern regular expression pattern to be matched by names
+    /// @returns   vector<string> of auxillary element names
+    ///
+    std::vector<std::string>
+      filterAuxElements(const xAOD::AuxContainerBase* auxCont,
+			std::string pattern) const;
+    ///
+    /// @brief Determine aux elements to be looked at -- for (refitted) PVs
+    ///
+    /// @param[in]  auxCont    pointer to AuxContainer
+    /// @param[out] vLinkNames vector of aux element names selected
+    /// @param[out] vLinkTypes vector of PV-to-SV types corresponding to
+    ///                        aux element names selected
+    /// @param[in] pattern     regular expression pattern to be matched by names
+    ///
+    void selectAuxElements(const xAOD::AuxContainerBase* auxCont,
+			   std::vector<std::string>& vLinkNames,
+			   std::vector<pv_type>&     vLinkTypes,
+			   std::string pattern) const;    
+    ///
+    /// @brief Determine aux elements to be looked at -- for closest tracks
+    ///
+    /// @param[in]  auxCont    pointer to AuxContainer
+    /// @param[out] vLinkNames vector of aux element names selected
+    /// @param[in]  vPrefixes  vector of prefixes to be concatenated with
+    ///                        pattern for search
+    /// @param[out] vLinkTypes vector of PV-to-SV types corresponding to
+    ///                        aux element names selected
+    /// @param[in] pattern     regular expression pattern to be matched by names
+    ///
+    void selectAuxElements(const xAOD::AuxContainerBase* auxCont,
+			   std::vector<std::string>& vLinkNames,
+			   std::vector<std::string>  vPrefixes,
+			   std::vector<pv_type>&     vLinkTypes,
+			   std::string pattern) const;    
+    ///
+    /// @brief Dump a vector<str> to a string
+    ///
+    /// @param[in] vs      vector<string> to be dumped
+    /// @param[in] header  header string to be prepended
+    /// @param[in] nBlanks number of blanks to prepend each line with
+    ///
+    std::string dumpVS(const std::vector<std::string>& vs,
+		       const std::string header="",
+		       size_t nBlanks=0) const;
+    ///
+    /// @brief Wrap string at line breaks and print with
+    ///        appropriate message level
+    ///
+    /// @param[in] str  string to be printed
+    /// @param[in] lvl  MSG::Level chosen
+    /// 
+    void logWrappedMsg(const std::string& str, const MSG::Level lvl) const;
+    ///
+    /// @brief Check two masks for consistency
+    ///
+    /// This is a method returning debugging information.
+    ///
+    /// @param[in] mask1  first mask vector to be checked
+    /// @param[in] mask2  second mask vector to be checked
+    /// @param[in] name1  name of first mask vector
+    /// @param[in] name2  name of second mask vector
+    /// @param[in] header text to be prepended to output string
+    /// @returns   string with debugging information
+    ///
+    std::string checkMaskConsistency(const std::vector<bool>& mask1,
+				     const std::vector<bool>& mask2,
+				     const std::string name1,
+				     const std::string name2,
+				     const std::string header="") const;
+
+  private:
+    ///
+    /// @name Job options
+    /// @{
+    ServiceHandle<IThinningSvc> m_thinningSvc;
+    std::string                 m_trkPartContName;
+    std::vector<std::string>    m_vtxContNames;
+    std::vector<std::string>    m_vtxPassFlags;
+    std::string                 m_PVContName;
+    std::vector<std::string>    m_refPVContNames;
+    std::string                 m_muonContName;
+    std::string                 m_calMuonContName;
+    std::string                 m_ctBranchBaseName;
+    std::vector<std::string>    m_ctBranchPrefixes;
+    bool                        m_alignPassToVertexList;
+    bool                        m_keepPVTracks;
+    bool                        m_matchCalMuons;
+    bool                        m_markMuons;
+    bool                        m_markCalMuons;
+    bool                        m_syncMuonsBothWays;
+    bool                        m_keepCloseTracks;
+    bool                        m_keepSelMuonTracks;
+    bool                        m_keepSelCalMuonTracks;
+    bool                        m_keepSelTrackMuons;
+    bool                        m_keepSelTrackCalMuons;
+    bool                        m_allowFastMuonMaskSync;
+    bool                        m_thinPVs;
+    bool                        m_thinRefPVs;
+    bool                        m_thinTracks;
+    bool                        m_thinMuons;
+    bool                        m_vertexAnd;
+    bool                        m_trackAnd;
+    bool                        m_muonAnd;
+    /// @}
+    
+    ///
+    /// @name internal member variables
+    ///
+    /// process close tracks
+    bool m_doCloseTracks;
+    /// process primary vertices
+    bool m_doPVs;
+    /// process refitted primary vertices
+    bool m_doRefPVs;
+    /// process (original) muons
+    bool m_doMuons;
+    /// process refitted muons
+    bool m_doCalMuons;
+    /// process ID tracks
+    bool m_doTracks;
+    /// @}
+
+    /// 
+    /// @name aux element link name caches
+    ///
+    /// @{
+    ///
+    /// caching aux element link names (and pv types)
+    /// for original and refitted PVs
+    ///
+    mutable std::vector<std::vector<std::string> > m_vvOrigPVLinkNames;
+    mutable std::vector<std::vector<pv_type> >     m_vvOrigPVLinkTypes;
+    mutable std::vector<std::vector<std::string> > m_vvRefPVLinkNames;
+    mutable std::vector<std::vector<pv_type> >     m_vvRefPVLinkTypes;
+
+    ///
+    /// caching aux element link names (and pv types)
+    /// for closest tracks
+    mutable std::vector<std::vector<std::string> > m_vvCtLinkNames;
+    mutable std::vector<std::vector<pv_type> >     m_vvCtLinkTypes;
+    /// @}
+
+  };
+  
+} // namespace DerivationFramework
+
+#endif // DERIVATIONFRAMEWORK_BmumuThinningTool_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Bmumu_metadata.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Bmumu_metadata.h
new file mode 100644
index 000000000000..4e040a8ad14d
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Bmumu_metadata.h
@@ -0,0 +1,42 @@
+/* 
+   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/**
+ * @file   Bmumu_metadata.h
+ * @author Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch>
+ *
+ * @brief  Store JO metadata specific to the Bmumu analysis.
+ */
+
+#ifndef DERIVATIONFRAMEWORK_Bmumu_metadata_H
+#define DERIVATIONFRAMEWORK_Bmumu_metadata_H
+
+#include <string>
+#include <map>
+#include <vector>
+
+#include "DerivationFrameworkBPhys/BPhysMetadataBase.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "GaudiKernel/ToolHandle.h"
+
+namespace DerivationFramework {
+  ///
+  /// @class  Bmumu_metadata
+  /// @author Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+  ///
+  /// @brief  Store JO metadata specific to the Bmumu analysis.
+  ///
+  /// Store JO metadata specific to the Bmumu analysis in the output file.
+  /// This class inherits from BPhysMetadataBase.
+  ///
+  class Bmumu_metadata : virtual public BPhysMetadataBase {
+    public: 
+    /// @brief Main constructor
+    Bmumu_metadata(const std::string& t, const std::string& n,
+		     const IInterface* p);
+  }; // class
+} // namespace
+
+#endif // DERIVATIONFRAMEWORK_Bmumu_metadata_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Bmumu_reco_mumu.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Bmumu_reco_mumu.h
new file mode 100644
index 000000000000..efe1ab4ee914
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Bmumu_reco_mumu.h
@@ -0,0 +1,73 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+
+///////////////////////////////////////////////////////////////////
+// Bmumu_reco_mumu.h
+///////////////////////////////////////////////////////////////////
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Original author (Reco_mumu):
+//          Daniel Scheirich <daniel.scheirich@cern.ch>
+// 
+// Changes:
+// Basic dimuon reconstruction for the derivation framework.
+// This class inherits from CfAthAlgTool instead of AthAlgTool in order
+// to have access to the CutFlowSvc instance.
+//
+//============================================================================
+//
+#ifndef DERIVATIONFRAMEWORK_Bmumu_reco_mumu_H
+#define DERIVATIONFRAMEWORK_Bmumu_reco_mumu_H
+
+#include <string>
+
+#include "DerivationFrameworkBPhys/CfAthAlgTool.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "JpsiUpsilonTools/JpsiFinder.h"
+#include "JpsiUpsilonTools/PrimaryVertexRefitter.h"
+#include "BeamSpotConditionsData/BeamSpotData.h"
+
+/** forward declarations
+ */
+namespace Trk {
+  class V0Tools;
+}
+
+/** THE reconstruction tool
+ */
+namespace DerivationFramework {
+
+  class Bmumu_reco_mumu : public CfAthAlgTool, public IAugmentationTool {
+    public: 
+      Bmumu_reco_mumu(const std::string& t, const std::string& n,
+		      const IInterface* p);
+
+      StatusCode initialize();
+      StatusCode finalize();
+      
+      virtual StatusCode addBranches() const;
+      
+    private:
+      /** tools
+       */
+      ToolHandle<Trk::V0Tools>                    m_v0Tools;
+      ToolHandle<Analysis::JpsiFinder>            m_jpsiFinder;
+      ToolHandle<Analysis::PrimaryVertexRefitter> m_pvRefitter;
+      SG::ReadCondHandleKey<InDet::BeamSpotData> m_beamSpotKey { this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot" };
+      
+      /** job options
+       */
+      std::string m_outputVtxContainerName;
+      std::string m_pvContainerName;
+      std::string m_refPVContainerName;
+      bool        m_refitPV;
+      int         m_PV_max;
+      int         m_DoVertexType;
+      size_t      m_PV_minNTracks;
+      bool        m_do3d;
+  }; 
+}
+
+#endif // DERIVATIONFRAMEWORK_Bmumu_reco_mumu_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Cascade3Plus1.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Cascade3Plus1.h
new file mode 100644
index 000000000000..7ed5f72f719f
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Cascade3Plus1.h
@@ -0,0 +1,99 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef DERIVATIONFRAMEWORKBPHYS_CASCADE3PLUS1_H
+#define DERIVATIONFRAMEWORKBPHYS_CASCADE3PLUS1_H
+//*********************
+// Cascade3Plus1 header file
+//
+// Adam Barton <abarton@cern.ch>
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "GaudiKernel/ToolHandle.h"
+#include <vector>
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "xAODTracking/TrackParticle.h"
+#include "JpsiUpsilonTools/PrimaryVertexRefitter.h"
+#include "InDetConversionFinderTools/VertexPointEstimator.h"
+#include "BeamSpotConditionsData/BeamSpotData.h"
+
+namespace Trk {
+    class IVertexFitter;
+    class TrkVKalVrtFitter;
+    class VxTrackAtVertex;
+    class ITrackSelectorTool;
+    class VxCascadeInfo;
+    class V0Tools;
+}
+
+
+namespace DerivationFramework {
+    class CascadeTools;
+}
+
+namespace DerivationFramework {
+    static const InterfaceID IID_Cascade3Plus1("Cascade3Plus1", 1, 0);
+class Cascade3Plus1 : virtual public AthAlgTool, public IAugmentationTool
+{
+
+public:
+    static const InterfaceID& interfaceID() { return IID_Cascade3Plus1;}
+    Cascade3Plus1(const std::string& t, const std::string& n, const IInterface*  p);
+    virtual ~Cascade3Plus1();
+    virtual StatusCode initialize() override;
+    virtual StatusCode addBranches() const override;
+
+private:
+    static constexpr int s_topoN = 2;
+
+    ToolHandle < Trk::ITrackSelectorTool > m_trkSelector;
+    ToolHandle < Trk::TrkVKalVrtFitter > m_iVertexFitter;
+    ToolHandle < Trk::V0Tools >                      m_V0Tools;
+    ToolHandle < DerivationFramework::CascadeTools > m_CascadeTools;
+    ToolHandle < Analysis::PrimaryVertexRefitter >   m_pvRefitter;
+    ToolHandle < InDet::VertexPointEstimator > m_vertexEstimator;
+    SG::ReadCondHandleKey<InDet::BeamSpotData> m_beamSpotKey { this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot" };
+
+    std::unique_ptr<Trk::VxCascadeInfo> CascadeFit(std::array<const xAOD::TrackParticle*, 4> &Track)const;
+
+    std::vector<double> m_trackMasses;
+    std::vector<std::string> m_cascadeOutputsKeys;
+    double m_2trackmassMin = 979.45;
+    double m_2trackmassMax = 1059.45;
+    double m_3trackmassMin = 1800.47;
+    double m_3trackmassMax = 2168.47;
+    double m_4trackmassMin = 5200.0;
+    double m_4trackmassMax = 5450.0;
+    double m_3tracksMass = 1968.47;
+    double m_4tracksMass = 5366.79;
+    double m_2tracksMass = 0;
+
+    double m_4trackmassFinalMin = 0;
+    double m_4trackmassFinalMax = 0;
+    std::string m_hypoName;               //!< name of the mass hypothesis. E.g. Jpsi, Upsi, etc. Will be used as a prefix for decorations
+    std::string m_3TrackName;
+    int         m_PV_max;
+    int         m_DoVertexType;
+    size_t      m_PV_minNTracks;
+    std::string m_VxPrimaryCandidateName;   //!< Name of primary vertex container
+    std::string m_refPVContainerName;
+    double      m_Chi2NDFCut=0.;
+    float       m_3TrackChi2NDFCut=0.;
+    double      m_tauCut = -999999;
+    bool        m_refitPV;
+    bool        m_3TrackMassConstraint = false;
+    bool        m_2TrackMassConstraint = false;
+    bool        m_eliminateBad3Tracksfrom4Track = false;
+    bool        m_copyAllVertices = false;
+    std::bitset<4> m_muonTrackBit{0};
+    std::vector<int> m_requireMuonsOnTrack;
+    std::string m_3TrackVertexOutput;
+    std::unique_ptr<xAOD::Vertex> StandardFit(const std::vector<const xAOD::TrackParticle*> &inputTracks, const xAOD::TrackParticleContainer* importedTrackCollection) const;
+    std::vector<double> m_ptCutPerTrack;
+    std::array<double, 3> m_ptCutPerVertex;
+    const std::vector<const xAOD::TrackParticle*>& ApplyAdditionalCuts(const std::vector<const xAOD::TrackParticle*>&, 
+       const std::vector<const xAOD::TrackParticle*>&,
+       std::vector<const xAOD::TrackParticle*>&, size_t) const;
+};
+}
+
+#endif
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/CascadeTools.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/CascadeTools.h
new file mode 100644
index 000000000000..932b814d3d2a
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/CascadeTools.h
@@ -0,0 +1,87 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef DERIVATIONFRAMEWORKBPHYS_CASCADETOOLS_H
+#define DERIVATIONFRAMEWORKBPHYS_CASCADETOOLS_H
+//*********************
+// CascadeTools header file
+//
+// Eva Bouhova <e.bouhova@cern.ch>
+// Adam Barton <abarton@cern.ch>
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "CLHEP/Vector/LorentzVector.h"
+#include "xAODTracking/Vertex.h"
+
+
+namespace DerivationFramework {
+
+  static const InterfaceID IID_CascadeTools("CascadeTools", 1, 1);
+
+  class CascadeTools : public AthAlgTool{
+
+    public:
+
+/**
+ * Default constructor due to Athena interface
+ */
+    CascadeTools(const std::string& t, const std::string& n, const IInterface* p);
+    
+/**
+ * Virtual destructor
+ */
+    ~CascadeTools();
+
+/**
+ * Standard AlgTool methods
+ */
+    //Nothing done not needed
+    //StatusCode initialize() override;
+    //StatusCode finalize() override;
+
+/**   
+ * AlgTool interface methods 
+ */
+  static const InterfaceID& interfaceID()
+  {
+   return IID_CascadeTools;
+  }
+
+
+    Amg::Vector3D momentum(const std::vector<TLorentzVector> &particleMom) const;
+    Amg::Vector3D pca(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const;
+
+    double invariantMass(const std::vector<TLorentzVector> &moms, const std::vector<double> &masses) const;
+    double invariantMass(const std::vector<TLorentzVector> &moms) const;
+    double invariantMassError(const std::vector<TLorentzVector> &moms,  const Amg::MatrixX& cov, const std::vector<double> &masses) const;
+    double invariantMassError(const std::vector<TLorentzVector> &moms,  const Amg::MatrixX& cov) const;
+    double pT(const std::vector<TLorentzVector> &moms) const;
+    double pTError(const std::vector<TLorentzVector> &moms, const Amg::MatrixX& cov) const;
+    double lxy(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const;
+    double lxyError(const std::vector<TLorentzVector> &particleMom, const Amg::MatrixX& cov, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const;
+    double tau(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const;
+    double tauError(const std::vector<TLorentzVector> &particleMom, const Amg::MatrixX& cov, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const;
+    double tau(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV, double M) const;
+    double tauError(const std::vector<TLorentzVector> &particleMom, const Amg::MatrixX& cov, const xAOD::Vertex* SV, const xAOD::Vertex* PV, double M) const;
+    double a0z(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const;
+    double a0zError(const std::vector<TLorentzVector> &particleMom, const Amg::MatrixX& cov, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const;
+    double a0xy(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const;
+    double a0xyError(const std::vector<TLorentzVector> &particleMom, const Amg::MatrixX& cov, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const;
+    double a0(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const;
+    double a0Error(const std::vector<TLorentzVector> &particleMom, const Amg::MatrixX& cov, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const;
+    double cosTheta(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const;
+    double cosTheta_xy(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const;
+    double massProbability(double V0Mass, double mass, double massErr) const;
+    double vertexProbability(int ndf, double chi2) const;
+
+    Amg::MatrixX * convertCovMatrix(const xAOD::Vertex * vxCandidate) const;
+    Amg::MatrixX SetFullMatrix(int NTrk, const std::vector<float> & Matrix) const;
+
+  //private:
+
+  }; //end of class definitions
+
+} //end of namespace definitions
+
+
+#endif
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/CfAthAlgTool.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/CfAthAlgTool.h
new file mode 100644
index 000000000000..f5280c5ccde8
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/CfAthAlgTool.h
@@ -0,0 +1,86 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//============================================================================
+// CfAthAlgTool.h
+//============================================================================
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Changes:
+//
+// Wrapper around AthAlgTool to provide easy access to CutFlowSvc
+// and some utility methods for it.
+// Methods for accessing the CutFlowSvc are modelled after
+// AthFilterAlgorithm's implementation.
+//
+// This class inherits from AthAlgTool.  It should be inherited from.
+//
+//============================================================================
+//
+#ifndef DERIVATIONFRAMEWORK_CfAthAlgTool_H
+#define DERIVATIONFRAMEWORK_CfAthAlgTool_H
+
+#include "GaudiKernel/ToolHandle.h"
+#include "GaudiKernel/ServiceHandle.h"
+#include "AthenaKernel/ICutFlowSvc.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+
+#include <string>
+#include <map>
+
+namespace DerivationFramework {
+  
+  class CfAthAlgTool : public AthAlgTool {
+  public:
+    // constructor with parameters
+    CfAthAlgTool(const std::string& t, const std::string& n,
+		 const IInterface* p);
+    // destructor
+    virtual ~CfAthAlgTool();
+    
+    // return a handle to an ICutFlowSvc instance
+    ServiceHandle<ICutFlowSvc>& cutFlowSvc() const;
+    
+    // Initialization method invoked by the framework.
+    virtual StatusCode sysInitialize() override;
+
+    // add event to a named counter -- returns counts after adding
+    virtual bool addEvent(const std::string &name, double weight=1.) const;
+
+    // add to a named counter -- returns counts after adding
+    // if counts > 1 : same weight is added multiple times
+    virtual bool addToCounter(const std::string &name, uint64_t counts=1,
+			      double weight=1.) const;
+
+  protected:
+    // add a counter by name -- returns id if it already exists
+    virtual CutIdentifier getCounter(const std::string &name) const;
+
+    // returns counter name by id
+    virtual std::string getCounterNameById(CutIdentifier id) const;
+
+    // returns counter id by name
+    virtual CutIdentifier getCounterIdByName(const std::string &name) const;
+    
+  private:
+    // typedef for ServiceHandle<ICutFlowSvc>
+    typedef ServiceHandle<ICutFlowSvc> ICutFlowSvc_t;
+    // handle to the service holding tables of cut-flows for filtering algs.
+    mutable ICutFlowSvc_t m_cutFlowSvc;
+
+    // base name for counters
+    std::string m_ctbasename;
+
+    // map of counter names to counter ids
+    typedef std::map<std::string, CutIdentifier> NameIdMap_t;
+    mutable NameIdMap_t m_mctn;
+
+    // base counter
+    mutable CutIdentifier m_bid;
+    mutable bool          m_bidisset;
+    
+  }; // class
+} // namespace
+
+#endif // DERIVATIONFRAMEWORK_CfAthAlgTool_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/FourMuonTool.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/FourMuonTool.h
new file mode 100644
index 000000000000..88348740f02c
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/FourMuonTool.h
@@ -0,0 +1,188 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// ****************************************************************************
+// ----------------------------------------------------------------------------
+// FourMuonTool header file
+//
+// James Catmore <James.Catmore@cern.ch>
+
+// ----------------------------------------------------------------------------
+// ****************************************************************************
+#ifndef BPHY4TOOL_H
+#define BPHY4TOOL_H
+#include "AthenaBaseComps/AthAlgorithm.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "TrkVKalVrtFitter/TrkVKalVrtFitter.h"
+#include "InDetConversionFinderTools/InDetConversionFinderTools.h"
+#include "BeamSpotConditionsData/BeamSpotData.h"
+#include "xAODMuon/Muon.h"
+#include "xAODMuon/MuonContainer.h"
+
+#include <vector>
+#include <string>
+/////////////////////////////////////////////////////////////////////////////
+
+namespace Trk {
+    class IVertexFitter;
+    //    class VxCandidate;
+    //    class TrackParticleBase;
+    //    class VxTrackAtVertex;
+    //    class RecVertex;
+    class TrkV0VertexFitter;
+    class ITrackSelectorTool;
+    class V0Tools;
+    //    class ExtendedVxCandidate;
+}
+
+namespace InDet { class VertexPointEstimator; class BeamSpotData;}
+
+namespace DerivationFramework {
+    
+    static const InterfaceID IID_FourMuonTool("FourMuonTool", 1, 0);
+    
+    // Struct and enum to associate muon pairs with track pairs
+    // and make the program flow more straightforward
+    struct Combination
+    {
+        std::vector<const xAOD::Muon*> muons;
+        std::vector<unsigned int> quadIndices;
+        std::pair<unsigned int, unsigned int> pairIndices;
+        
+        std::string combinationCharges() {
+            std::string chargeStr = "";
+            if (muons.at(0)->charge() > 0) {chargeStr += "+";}
+            else {chargeStr += "-";}
+            if (muons.at(1)->charge() > 0) {chargeStr += "+";}
+            else {chargeStr += "-";}
+            if (muons.size()==4) {
+                if (muons.at(2)->charge() > 0) {chargeStr += "+";}
+                else {chargeStr += "-";}
+                if (muons.at(3)->charge() > 0) {chargeStr += "+";}
+                else {chargeStr += "-";}
+            }
+            return chargeStr;
+        }
+        
+        std::string combinationIndices() {
+            std::string indexStr = "";
+            std::stringstream ss;
+            if (muons.size()==2) {
+                ss.str(""); ss.clear();
+                ss << pairIndices.first;
+                indexStr+=ss.str();
+                ss.str(""); ss.clear();
+                ss << pairIndices.second;
+                indexStr+=ss.str();
+            }
+            if (muons.size()==4) {
+                for (unsigned int i=0; i<4; ++i) {
+                    ss.str(""); ss.clear();
+                    ss << quadIndices[i];
+                    indexStr+=ss.str();
+                }
+            }
+            return indexStr;
+        }
+
+        const xAOD::TrackParticle* GetMuonTrack(const xAOD::Muon* mu) const{
+            auto& link = mu->inDetTrackParticleLink();
+            return link.isValid() ? *link : nullptr;
+        }
+
+        std::vector<const xAOD::TrackParticle*> trackParticles(std::string specify) {
+            std::vector<const xAOD::TrackParticle*> theTracks;
+            bool oppCh(false);
+            if (muons.at(0)->charge()*muons.at(1)->charge() < 0) oppCh=true;
+            if (specify=="pair1") {
+                theTracks.push_back(GetMuonTrack(muons.at(0)));
+                theTracks.push_back(GetMuonTrack(muons.at(1)));
+            }
+            if (specify=="pair2") {
+                theTracks.push_back(GetMuonTrack(muons.at(2)));
+                theTracks.push_back(GetMuonTrack(muons.at(3)));
+            }
+            if (specify=="DC") {
+                if (oppCh) {
+                    theTracks.push_back(GetMuonTrack(muons.at(0)));
+                    theTracks.push_back(GetMuonTrack(muons.at(1)));
+                    theTracks.push_back(GetMuonTrack(muons.at(2)));
+                    theTracks.push_back(GetMuonTrack(muons.at(3)));
+                } else {
+                    theTracks.push_back(GetMuonTrack(muons.at(0)));
+                    theTracks.push_back(GetMuonTrack(muons.at(2)));
+                    theTracks.push_back(GetMuonTrack(muons.at(1)));
+                    theTracks.push_back(GetMuonTrack(muons.at(3)));
+                }
+            }
+            if (specify=="AC") {
+                theTracks.push_back(GetMuonTrack(muons.at(0)));
+                theTracks.push_back(GetMuonTrack(muons.at(3)));
+                theTracks.push_back(GetMuonTrack(muons.at(1)));
+                theTracks.push_back(GetMuonTrack(muons.at(2)));
+            }
+            if (specify=="SS") {
+                if (oppCh) {
+                    theTracks.push_back(GetMuonTrack(muons.at(0)));
+                    theTracks.push_back(GetMuonTrack(muons.at(2)));
+                    theTracks.push_back(GetMuonTrack(muons.at(1)));
+                    theTracks.push_back(GetMuonTrack(muons.at(3)));
+                } else {
+                    theTracks.push_back(GetMuonTrack(muons.at(0)));
+                    theTracks.push_back(GetMuonTrack(muons.at(1)));
+                    theTracks.push_back(GetMuonTrack(muons.at(2)));
+                    theTracks.push_back(GetMuonTrack(muons.at(3)));
+                }
+            }
+            return theTracks;
+        }
+        
+    };
+    
+    class FourMuonTool:  virtual public AthAlgTool
+    {
+    public:
+        FourMuonTool(const std::string& t, const std::string& n, const IInterface*  p);
+        ~FourMuonTool();
+        StatusCode initialize();
+        
+        static const InterfaceID& interfaceID() { return IID_FourMuonTool;}
+        
+        //-------------------------------------------------------------------------------------
+        //Doing Calculation and inline functions
+        StatusCode performSearch(xAOD::VertexContainer*& pairVxContainer, xAOD::VertexAuxContainer*& pairVxAuxContainer,
+                                 xAOD::VertexContainer*& quadVxContainer, xAOD::VertexAuxContainer*& quadVxAuxContainer, bool &acceptEvent) const;
+        xAOD::Vertex* fit(const std::vector<const xAOD::TrackParticle*>& ,const xAOD::TrackParticleContainer* importedTrackCollection, const Amg::Vector3D &beamSpot) const;
+        static std::vector<std::vector<unsigned int> > getQuadIndices(unsigned int length);
+        static std::vector<std::pair<unsigned int, unsigned int> > getPairIndices(unsigned int length);
+        static std::vector<std::vector<unsigned int> > mFromN(unsigned int m, unsigned int n);
+        static void combinatorics(unsigned int offset,
+                           unsigned int k,
+                           std::vector<unsigned int> &combination,
+                           std::vector<unsigned int> &mainList,
+                           std::vector<std::vector<unsigned int> > &allCombinations);
+        static void buildCombinations(const std::vector<const xAOD::Muon*> &muonsIn,
+                               std::vector<Combination> &pairs,
+                               std::vector<Combination> &quadruplets,
+                               unsigned int nSelectedMuons);
+        static bool passesQuadSelection(const std::vector<const xAOD::Muon*> &muonsIn);
+        //-------------------------------------------------------------------------------------
+        
+    private:
+        double m_ptCut;
+        double m_etaCut;
+        bool m_useV0Fitter;
+        SG::ReadHandleKey<xAOD::MuonContainer>          m_muonCollectionKey;
+        SG::ReadHandleKey<xAOD::TrackParticleContainer> m_TrkParticleCollection;
+        ToolHandle < Trk::IVertexFitter > m_iVertexFitter;
+        ToolHandle < Trk::IVertexFitter > m_iV0VertexFitter;
+        ToolHandle < Trk::V0Tools > m_V0Tools;
+        ToolHandle < Trk::ITrackSelectorTool > m_trkSelector;
+        ToolHandle < InDet::VertexPointEstimator > m_vertexEstimator;
+        SG::ReadCondHandleKey<InDet::BeamSpotData> m_beamSpotKey { this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot" };
+        SG::WriteDecorHandleKey<xAOD::MuonContainer> m_muonIndex{this, "muonIndexDec", "Muons.BPHY4MuonIndex"};
+
+    };
+} // end of namespace
+#endif
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/JpsiPlusDpstCascade.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/JpsiPlusDpstCascade.h
new file mode 100644
index 000000000000..7376be66ae17
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/JpsiPlusDpstCascade.h
@@ -0,0 +1,96 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef JPSIPLUSDPSTCASCADE_H
+#define JPSIPLUSDPSTCASCADE_H
+//*********************
+// JpsiPlusDpstCascade header file
+//
+// Eva Bouhova <e.bouhova@cern.ch>
+// Adam Barton <abarton@cern.ch>
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "JpsiUpsilonTools/PrimaryVertexRefitter.h"
+#include <vector>
+#include "BeamSpotConditionsData/BeamSpotData.h"
+
+namespace Trk {
+    class IVertexFitter;
+    class TrkVKalVrtFitter;
+    class IVertexCascadeFitter;
+    class VxCascadeInfo;
+    class V0Tools;
+    class ParticleDataTable;
+}
+
+namespace DerivationFramework {
+    class CascadeTools;
+}
+
+namespace DerivationFramework {
+
+    static const InterfaceID IID_JpsiPlusDpstCascade("JpsiPlusDpstCascade", 1, 0);
+
+    class JpsiPlusDpstCascade : virtual public AthAlgTool, public IAugmentationTool
+    {
+      public:
+        static const InterfaceID& interfaceID() { return IID_JpsiPlusDpstCascade;}
+        JpsiPlusDpstCascade(const std::string& t, const std::string& n, const IInterface*  p);
+        ~JpsiPlusDpstCascade();
+        virtual StatusCode initialize() override;
+        StatusCode performSearch(std::vector<Trk::VxCascadeInfo*> *cascadeinfoContainer ) const;
+        virtual StatusCode addBranches() const override;
+
+      private:
+        std::string m_vertexContainerKey;
+        std::string m_vertexD0ContainerKey;
+        std::vector<std::string> m_cascadeOutputsKeys;
+
+        std::string m_VxPrimaryCandidateName;   //!< Name of primary vertex container
+
+        double m_jpsiMassLower;
+        double m_jpsiMassUpper;
+        double m_jpsipiMassLower;
+        double m_jpsipiMassUpper;
+        double m_D0MassLower;
+        double m_D0MassUpper;
+        double m_DstMassLower;
+        double m_DstMassUpper;
+        double m_MassLower;
+        double m_MassUpper;
+        double m_vtx0MassHypo;      // mass hypothesis of vertex 0
+        double m_vtx1MassHypo;      // mass hypothesis of vertex 1
+        double m_vtx0Daug1MassHypo; // mass hypothesis of 1st daughter from vertex 0
+        double m_vtx0Daug2MassHypo; // mass hypothesis of 2nd daughter from vertex 0
+        double m_vtx0Daug3MassHypo; // mass hypothesis of 3rd daughter from vertex 0
+        double m_vtx1Daug1MassHypo; // mass hypothesis of 1st daughter from vertex 1
+        double m_vtx1Daug2MassHypo; // mass hypothesis of 2nd daughter from vertex 1
+
+
+        double m_mass_jpsi;
+        int    m_Dx_pid;
+        bool   m_constrD0;
+        bool   m_constrJpsi;
+        double m_chi2cut;
+
+        SG::ReadCondHandleKey<InDet::BeamSpotData> m_beamSpotKey { this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot" };
+        ToolHandle < Trk::TrkVKalVrtFitter >             m_iVertexFitter;
+        ToolHandle < Analysis::PrimaryVertexRefitter >   m_pvRefitter;
+        ToolHandle < Trk::V0Tools >                      m_V0Tools;
+        ToolHandle < DerivationFramework::CascadeTools > m_CascadeTools;
+
+        bool        m_refitPV;
+        std::string m_refPVContainerName;
+        std::string m_hypoName;               //!< name of the mass hypothesis. E.g. Jpsi, Upsi, etc. Will be used as a prefix for decorations
+        //This parameter will allow us to optimize the number of PVs under consideration as the probability
+        //of a useful primary vertex drops significantly the higher you go
+        int         m_PV_max;
+        int         m_DoVertexType;
+        size_t      m_PV_minNTracks;
+
+    };
+}
+
+#endif
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/JpsiPlusDs1Cascade.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/JpsiPlusDs1Cascade.h
new file mode 100644
index 000000000000..d923f5fe4f91
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/JpsiPlusDs1Cascade.h
@@ -0,0 +1,105 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef JPSIPLUSDS1CASCADE_H
+#define JPSIPLUSDS1CASCADE_H
+//*********************
+// JpsiPlusDs1Cascade header file
+//
+// Eva Bouhova <e.bouhova@cern.ch>
+// Adam Barton <abarton@cern.ch>
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "HepPDT/ParticleDataTable.hh"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "JpsiUpsilonTools/PrimaryVertexRefitter.h"
+#include <vector>
+#include "BeamSpotConditionsData/BeamSpotData.h"
+
+namespace Trk {
+    class IVertexFitter;
+    class TrkVKalVrtFitter;
+    class IVertexCascadeFitter;
+    class VxCascadeInfo;
+    class V0Tools;
+    class ParticleDataTable;
+}
+
+namespace DerivationFramework {
+    class CascadeTools;
+}
+
+namespace DerivationFramework {
+
+    static const InterfaceID IID_JpsiPlusDs1Cascade("JpsiPlusDs1Cascade", 1, 0);
+
+    class JpsiPlusDs1Cascade : virtual public AthAlgTool, public IAugmentationTool
+    {
+      public:
+        static const InterfaceID& interfaceID() { return IID_JpsiPlusDs1Cascade;}
+        JpsiPlusDs1Cascade(const std::string& t, const std::string& n, const IInterface*  p);
+        ~JpsiPlusDs1Cascade();
+        virtual StatusCode initialize() override;
+        StatusCode performSearch(std::vector<Trk::VxCascadeInfo*> *cascadeinfoContainer ) const;
+        virtual StatusCode addBranches() const override;
+
+      private:
+        std::string m_vertexContainerKey;
+        std::string m_vertexD0ContainerKey;
+        std::string m_vertexK0ContainerKey;
+        std::vector<std::string> m_cascadeOutputsKeys;
+
+        std::string m_VxPrimaryCandidateName;   //!< Name of primary vertex container
+
+        double m_jpsiMassLower;
+        double m_jpsiMassUpper;
+        double m_jpsipiMassLower;
+        double m_jpsipiMassUpper;
+        double m_D0MassLower;
+        double m_D0MassUpper;
+        double m_K0MassLower;
+        double m_K0MassUpper;
+        double m_DstMassLower;
+        double m_DstMassUpper;
+        double m_MassLower;
+        double m_MassUpper;
+        double m_vtx0MassHypo;      // mass hypothesis of vertex 0
+        double m_vtx1MassHypo;      // mass hypothesis of vertex 1
+        double m_vtx2MassHypo;      // mass hypothesis of vertex 2
+        double m_vtx0Daug1MassHypo; // mass hypothesis of 1st daughter from vertex 0
+        double m_vtx0Daug2MassHypo; // mass hypothesis of 2nd daughter from vertex 0
+        double m_vtx0Daug3MassHypo; // mass hypothesis of 3rd daughter from vertex 0
+        double m_vtx1Daug1MassHypo; // mass hypothesis of 1st daughter from vertex 1
+        double m_vtx1Daug2MassHypo; // mass hypothesis of 2nd daughter from vertex 1
+        double m_vtx2Daug1MassHypo; // mass hypothesis of 1st daughter from vertex 2
+        double m_vtx2Daug2MassHypo; // mass hypothesis of 2nd daughter from vertex 2
+
+        const HepPDT::ParticleDataTable* m_particleDataTable;
+        double m_mass_jpsi;
+        int    m_Dx_pid;
+        bool   m_constrD0;
+        bool   m_constrK0;
+        bool   m_constrJpsi;
+        double m_chi2cut;
+
+        SG::ReadCondHandleKey<InDet::BeamSpotData> m_beamSpotKey { this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot" };
+        ToolHandle < Trk::TrkVKalVrtFitter >             m_iVertexFitter;
+        ToolHandle < Analysis::PrimaryVertexRefitter >   m_pvRefitter;
+        ToolHandle < Trk::V0Tools >                      m_V0Tools;
+        ToolHandle < DerivationFramework::CascadeTools > m_CascadeTools;
+
+        bool        m_refitPV;
+        std::string m_refPVContainerName;
+        std::string m_hypoName;               //!< name of the mass hypothesis. E.g. Jpsi, Upsi, etc. Will be used as a prefix for decorations
+        //This parameter will allow us to optimize the number of PVs under consideration as the probability
+        //of a useful primary vertex drops significantly the higher you go
+        int         m_PV_max;
+        int         m_DoVertexType;
+        size_t      m_PV_minNTracks;
+
+        double getParticleMass(int particlecode) const;
+    };
+}
+
+#endif
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/JpsiPlusDsCascade.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/JpsiPlusDsCascade.h
new file mode 100644
index 000000000000..024fe6a73133
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/JpsiPlusDsCascade.h
@@ -0,0 +1,91 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef JPSIPLUSDSCASCADE_H
+#define JPSIPLUSDSCASCADE_H
+//*********************
+// JpsiPlusDsCascade header file
+//
+// Eva Bouhova <e.bouhova@cern.ch>
+// Adam Barton <abarton@cern.ch>
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "JpsiUpsilonTools/PrimaryVertexRefitter.h"
+#include <vector>
+#include "BeamSpotConditionsData/BeamSpotData.h"
+
+namespace Trk {
+    class IVertexFitter;
+    class TrkVKalVrtFitter;
+    class IVertexCascadeFitter;
+    class VxCascadeInfo;
+    class V0Tools;
+    class ParticleDataTable;
+}
+
+namespace DerivationFramework {
+    class CascadeTools;
+}
+
+namespace DerivationFramework {
+
+    static const InterfaceID IID_JpsiPlusDsCascade("JpsiPlusDsCascade", 1, 0);
+
+    class JpsiPlusDsCascade : virtual public AthAlgTool, public IAugmentationTool
+    {
+      public:
+        static const InterfaceID& interfaceID() { return IID_JpsiPlusDsCascade;}
+        JpsiPlusDsCascade(const std::string& t, const std::string& n, const IInterface*  p);
+        ~JpsiPlusDsCascade();
+        virtual StatusCode initialize() override;
+        StatusCode performSearch(std::vector<Trk::VxCascadeInfo*> *cascadeinfoContainer ) const;
+        virtual StatusCode addBranches() const override;
+
+      private:
+        std::string m_vertexContainerKey;
+        std::string m_vertexDxContainerKey;
+        std::vector<std::string> m_cascadeOutputsKeys;
+
+        std::string m_VxPrimaryCandidateName;   //!< Name of primary vertex container
+
+        double m_jpsiMassLower;
+        double m_jpsiMassUpper;
+        double m_DxMassLower;
+        double m_DxMassUpper;
+        double m_MassLower;
+        double m_MassUpper;
+        double m_vtx0MassHypo; // 1st vertex mass hypothesis
+        double m_vtx1MassHypo; // 2nd vertex mass hypothesis
+        double m_vtx0Daug1MassHypo; // mass hypothesis of 1st daughter from vertex 0
+        double m_vtx0Daug2MassHypo; // mass hypothesis of 2nd daughter from vertex 0
+        double m_vtx1Daug1MassHypo; // mass hypothesis of 1st daughter from vertex 1
+        double m_vtx1Daug2MassHypo; // mass hypothesis of 2nd daughter from vertex 1
+        double m_vtx1Daug3MassHypo; // mass hypothesis of 3rd daughter from vertex 1
+
+        double m_mass_jpsi;
+        int    m_Dx_pid;
+        bool   m_constrDx;
+        bool   m_constrJpsi;
+        double m_chi2cut;
+
+        SG::ReadCondHandleKey<InDet::BeamSpotData> m_beamSpotKey { this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot" };
+        ToolHandle < Trk::TrkVKalVrtFitter >             m_iVertexFitter;
+        ToolHandle < Analysis::PrimaryVertexRefitter >   m_pvRefitter;
+        ToolHandle < Trk::V0Tools >                      m_V0Tools;
+        ToolHandle < DerivationFramework::CascadeTools > m_CascadeTools;
+
+        bool        m_refitPV;
+        std::string m_refPVContainerName;
+        std::string m_hypoName;               //!< name of the mass hypothesis. E.g. Jpis, Upsi, etc. Will be used as a prefix for decorations
+        //This parameter will allow us to optimize the number of PVs under consideration as the probability
+        //of a useful primary vertex drops significantly the higher you go
+        int         m_PV_max;
+        int         m_DoVertexType;
+        size_t      m_PV_minNTracks;
+
+    };
+}
+
+#endif
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/JpsiPlusV0Cascade.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/JpsiPlusV0Cascade.h
new file mode 100644
index 000000000000..9720b3d6ca36
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/JpsiPlusV0Cascade.h
@@ -0,0 +1,94 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef JPSIPLUSV0CASCADE_H
+#define JPSIPLUSV0CASCADE_H
+//*********************
+// JpsiPlusV0Cascade header file
+//
+// Eva Bouhova <e.bouhova@cern.ch>
+// Adam Barton <abarton@cern.ch>
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "GaudiKernel/ToolHandle.h"
+
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "JpsiUpsilonTools/PrimaryVertexRefitter.h"
+#include <vector>
+#include "BeamSpotConditionsData/BeamSpotData.h"
+
+
+namespace Trk {
+    class IVertexFitter;
+    class TrkVKalVrtFitter;
+    class IVertexCascadeFitter;
+    class VxCascadeInfo;
+    class V0Tools;
+    class ParticleDataTable;
+}
+
+namespace DerivationFramework {
+    class CascadeTools;
+}
+
+
+namespace DerivationFramework {
+
+    static const InterfaceID IID_JpsiPlusV0Cascade("JpsiPlusV0Cascade", 1, 0);
+
+    class JpsiPlusV0Cascade : virtual public AthAlgTool, public IAugmentationTool
+    {
+
+        std::string m_vertexContainerKey;
+        std::string m_vertexV0ContainerKey;
+        std::vector<std::string> m_cascadeOutputsKeys;
+
+        std::string   m_VxPrimaryCandidateName;   //!< Name of primary vertex container
+
+        double m_jpsiMassLower;
+        double m_jpsiMassUpper;
+        double m_V0MassLower;
+        double m_V0MassUpper;
+        double m_MassLower;
+        double m_MassUpper;
+
+        double m_mass_muon;
+        double m_mass_pion;
+        double m_mass_proton;
+        double m_mass_lambda;
+        double m_mass_ks;
+        double m_mass_jpsi;
+        double m_mass_b0;
+        double m_mass_lambdaB;
+        int m_v0_pid;
+        bool m_constrV0;
+        bool m_constrJpsi;
+
+        SG::ReadCondHandleKey<InDet::BeamSpotData> m_beamSpotKey { this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot" };
+        ToolHandle < Trk::TrkVKalVrtFitter > m_iVertexFitter;
+        ToolHandle < Analysis::PrimaryVertexRefitter > m_pvRefitter;
+        ToolHandle < Trk::V0Tools > m_V0Tools;
+        ToolHandle < DerivationFramework::CascadeTools > m_CascadeTools;
+
+        bool        m_refitPV;
+        std::string m_refPVContainerName;
+        std::string m_hypoName;               //!< name of the mass hypothesis. E.g. Jpis, Upsi, etc. Will be used as a prefix for decorations
+        //This parameter will allow us to optimize the number of PVs under consideration as the probability
+        //of a useful primary vertex drops significantly the higher you go
+        int         m_PV_max;
+        int         m_DoVertexType;
+        size_t      m_PV_minNTracks;
+
+    public:
+        static const InterfaceID& interfaceID() { return IID_JpsiPlusV0Cascade;}
+        JpsiPlusV0Cascade(const std::string& t, const std::string& n, const IInterface*  p);
+        ~JpsiPlusV0Cascade();
+        StatusCode initialize() override;
+        StatusCode performSearch(std::vector<Trk::VxCascadeInfo*> *cascadeinfoContainer ) const;
+        virtual StatusCode addBranches() const override;
+    };
+}
+
+
+#endif
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/LocalVector.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/LocalVector.h
new file mode 100644
index 000000000000..1865c520e35f
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/LocalVector.h
@@ -0,0 +1,72 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef LOCALVECTOR_H
+#define LOCALVECTOR_H
+
+#include <array>
+#include <algorithm>
+#include <iterator>
+
+template <class A_Type, size_t SIZE>
+class LocalVector
+{
+protected:
+    std::array<A_Type, SIZE> m_memblock;
+    size_t m_x;
+public:
+    LocalVector() : m_x(0) { }
+    size_t size() const noexcept {
+        return m_x;
+    }
+    constexpr size_t max_size() const noexcept {
+        return SIZE;
+    }
+    typename std::array<A_Type, SIZE>::iterator begin() noexcept {
+        return m_memblock.begin();
+    }
+    typename std::array<A_Type, SIZE>::iterator end() noexcept {
+        auto it = m_memblock.begin();
+        std::advance(it, m_x);
+        return it;
+    }
+    typename std::array<A_Type, SIZE>::const_iterator begin() const noexcept {
+        return m_memblock.cbegin();
+    }
+    typename std::array<A_Type, SIZE>::const_iterator end() const noexcept {
+        auto it = m_memblock.cbegin();
+        std::advance(it, m_x);
+        return it;
+    }
+    A_Type& operator[]( size_t pos ) {
+        return m_memblock[pos];
+    }
+    const A_Type& operator[]( size_t pos ) const {
+        return m_memblock[pos];
+    }
+    bool contains(const A_Type& a) const {
+        return std::find(begin(), end(), a) != end();
+    }
+    void push_back(const A_Type& a) {
+        m_memblock[m_x++] = a;
+    }
+    void pop_back() {
+        --m_x;
+    }
+    void clear() noexcept {
+        m_x = 0;
+    }
+    A_Type& back(  ) {
+        return m_memblock[m_x-1];
+    }
+    const A_Type& back(  )   const {
+        return m_memblock[m_x-1];
+    }
+    A_Type& front(  ) {
+        return m_memblock.front();
+    }
+    const A_Type& front(  )   const {
+        return m_memblock.front();
+    }
+};
+#endif
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/MuonExtrapolationTool.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/MuonExtrapolationTool.h
new file mode 100644
index 000000000000..7464e520f107
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/MuonExtrapolationTool.h
@@ -0,0 +1,59 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+ */
+
+//////////////////////////////////////////////////////////////////////////////
+// MuonExtrapolationTool
+//////////////////////////////////////////////////////////////////////////////
+#ifndef MuonExtrapolationTool_H
+#define MuonExtrapolationTool_H
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "xAODTracking/TrackParticle.h"
+#include "xAODMuon/Muon.h"
+#include "TrkParameters/TrackParameters.h"
+
+namespace Trk { 
+  class IExtrapolator; 
+}
+
+namespace DerivationFramework {
+  class MuonExtrapolationTool : public AthAlgTool, public IAugmentationTool {
+    
+  public:  
+    MuonExtrapolationTool(const std::string& t, const std::string& n, const IInterface *p);
+  
+    virtual StatusCode initialize();
+    virtual StatusCode addBranches() const;
+
+    ToolHandle<Trk::IExtrapolator> m_extrapolator;
+  private:
+
+    /// run the extrapolation - only available in full athena
+    const Trk::TrackParameters* extrapolateToTriggerPivotPlane(const xAOD::TrackParticle& track) const;
+
+  // Utility method to handle extrapolation and decoration for one TrackParticle. 
+  // It looks for the decoration, and, if it is missing, runs track extrapolation, decorating the result
+  // to the particle to avoid repeating the process unnecessarily. 
+  // Returns success (true) or failure (false) of the procedure, fills eta and phi coordinates via reference
+  // If the extrapolation fails or the decoration is missing in AthAnalysis, it will *not* change eta and phi
+  // So you can set them to defaults before calling this guy, and they will be preserved in case of failure. 
+  // Will not run outside athena, because it requires the extrapolator
+    bool extrapolateAndDecorateTrackParticle(const xAOD::TrackParticle* particle, float & eta, float & phi) const;
+
+    // utility method: Obtains the track particle which we want to extrapolate into the MS. 
+    // Works for all kinds of probes. 
+    const xAOD::TrackParticle* getPreferredTrackParticle (const xAOD::IParticle* probe) const;
+
+    // these define the surfaces that we extrapolate to. 
+    // We approximate the pivot plane in the form of a cylinder surface and two disks
+    double m_endcapPivotPlaneZ;
+    double m_endcapPivotPlaneMinimumRadius;
+    double m_endcapPivotPlaneMaximumRadius;
+    double m_barrelPivotPlaneRadius;
+    double m_barrelPivotPlaneHalfLength;
+    std::string m_muonContainerName;
+  };
+}
+#endif // MuonExtrapolationTool_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/ReVertex.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/ReVertex.h
new file mode 100644
index 000000000000..853f03bcf72f
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/ReVertex.h
@@ -0,0 +1,98 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+// ****************************************************************************
+// ----------------------------------------------------------------------------
+// ReVertex header file
+//
+// Konstantin Beloborodov <Konstantin.Beloborodov@cern.ch>
+//
+// ----------------------------------------------------------------------------
+// ****************************************************************************
+
+#ifndef DERIVATIONFRAMEWORK_ReVertex_H
+#define DERIVATIONFRAMEWORK_ReVertex_H
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "xAODTracking/Vertex.h"
+#include "BeamSpotConditionsData/BeamSpotData.h"
+/** forward declarations
+ */
+namespace Trk {
+    class IVertexFitter;
+    class TrkV0VertexFitter;
+    class ITrackSelectorTool;
+    class V0Tools;
+    class TrkVKalVrtFitter;
+}
+
+namespace Analysis {
+    class PrimaryVertexRefitter;
+}
+
+namespace InDet { class VertexPointEstimator; }
+
+namespace DerivationFramework {
+
+class ReVertex : public AthAlgTool, public IAugmentationTool {
+public:
+
+    ReVertex(const std::string& t, const std::string& n, const IInterface* p);
+
+    virtual StatusCode initialize() override;
+    //virtual StatusCode finalize() override;
+
+    virtual StatusCode addBranches() const override;
+
+   void fitAndStore(xAOD::VertexContainer* vtxContainer,
+		    const xAOD::Vertex* v,
+		    const xAOD::VertexContainer    *InVtxContainer,
+		    const std::vector<const xAOD::TrackParticle*> &inputTracks,
+		    const xAOD::TrackParticleContainer* importedTrackCollection,
+		    const xAOD::VertexContainer* pvContainer) const;
+   xAOD::Vertex* fit(const std::vector<const xAOD::TrackParticle*> &inputTracks,
+		     const xAOD::Vertex* pv) const;
+private:
+    std::vector<int> m_TrackIndices;
+    ToolHandle < InDet::VertexPointEstimator > m_vertexEstimator;
+    ToolHandle < Trk::IVertexFitter > m_iVertexFitter;
+    Trk::TrkVKalVrtFitter* m_VKVFitter;
+    SG::WriteHandleKey<xAOD::VertexContainer> m_OutputContainerName;
+    SG::ReadHandleKey<xAOD::VertexContainer> m_inputContainerName;
+    SG::ReadHandleKey<xAOD::TrackParticleContainer> m_trackContainer;
+    SG::WriteHandleKey<xAOD::VertexContainer> m_refPVContainerName;
+    SG::ReadHandleKey<xAOD::VertexContainer> m_pvContainerName;
+
+
+    std::vector<double> m_trkMasses;
+    std::vector<int> m_indices;
+    double m_massConst;
+    double m_totalMassConst;
+    std::vector<std::string> m_hypoNames;
+
+    ToolHandle<Trk::V0Tools>                    m_v0Tools;
+    ToolHandle<Analysis::PrimaryVertexRefitter> m_pvRefitter;
+    SG::ReadCondHandleKey<InDet::BeamSpotData> m_beamSpotKey { this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot" };
+    int         m_PV_max;
+    int         m_DoVertexType;
+    size_t      m_PV_minNTracks;
+    bool        m_do3d;
+    bool        m_AddPVData;
+    bool        m_refitPV;
+    bool        m_doMassConst;
+    bool        m_startingpoint0;
+    
+    bool m_vertexFittingWithPV;
+
+   double m_BMassUpper;
+   double m_BMassLower;
+   double m_chi2cut;                 // chi2/Ndof of the final veretx
+   double m_trkDeltaZ;               // DeltaZ between the JPsi vertex and hadronic tracks Z0
+
+   bool m_useAdditionalTrack;
+};
+}
+
+#endif
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Reco_4mu.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Reco_4mu.h
new file mode 100644
index 000000000000..5b311a975fdd
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Reco_4mu.h
@@ -0,0 +1,63 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+///////////////////////////////////////////////////////////////////
+// Reco_4mu.h
+///////////////////////////////////////////////////////////////////
+
+#ifndef DERIVATIONFRAMEWORK_Reco_4mu_H
+#define DERIVATIONFRAMEWORK_Reco_4mu_H
+
+#include <string>
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DerivationFrameworkInterfaces/ISkimmingTool.h"
+#include "DerivationFrameworkBPhys/FourMuonTool.h"
+#include "JpsiUpsilonTools/PrimaryVertexRefitter.h"
+#include "xAODBPhys/BPhysHelper.h"
+
+/** forward declarations
+ */
+namespace Trk {
+  class V0Tools;
+}
+
+namespace xAOD {
+  class BPhysHypoHelper;
+}
+
+/** THE reconstruction tool
+ */
+namespace DerivationFramework {
+
+  class Reco_4mu : public AthAlgTool, public ISkimmingTool {
+    public: 
+      Reco_4mu(const std::string& t, const std::string& n, const IInterface* p);
+
+      StatusCode initialize();
+      StatusCode finalize();
+      
+      virtual bool eventPassesFilter() const;
+      
+    private:
+      /** tools
+       */
+      void ProcessVertex(xAOD::BPhysHypoHelper&, xAOD::BPhysHelper::pv_type, std::vector<double> trackMasses) const;
+      ToolHandle<Trk::V0Tools>                      m_v0Tools;
+      ToolHandle<DerivationFramework::FourMuonTool> m_fourMuonTool;
+      ToolHandle<Analysis::PrimaryVertexRefitter>   m_pvRefitter;
+      
+      /** job options
+       */
+      std::string m_pairName;
+      std::string m_quadName;
+      std::string m_pvContainerName;
+      std::string m_refPVContainerName;
+      bool        m_refitPV;
+      int m_PV_max;
+      int m_DoVertexType;
+  }; 
+}
+
+#endif // DERIVATIONFRAMEWORK_Reco_4mu_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Reco_V0Finder.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Reco_V0Finder.h
new file mode 100644
index 000000000000..ceb666c23931
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Reco_V0Finder.h
@@ -0,0 +1,63 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+///////////////////////////////////////////////////////////////////
+// Reco_V0Finder.h, (c) ATLAS Detector software
+///////////////////////////////////////////////////////////////////
+
+#ifndef DERIVATIONFRAMEWORK_V0FINDER_H
+#define DERIVATIONFRAMEWORK_V0FINDER_H
+
+#include <string>
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "InDetV0Finder/InDetV0FinderTool.h"
+#include "HepPDT/ParticleDataTable.hh"
+
+/** forward declarations
+ */
+namespace Trk
+{
+  class V0Tools;
+  class ParticleDataTable;
+}
+
+namespace DerivationFramework {
+
+  class Reco_V0Finder : public AthAlgTool, public IAugmentationTool {
+    public: 
+      Reco_V0Finder(const std::string& t, const std::string& n, const IInterface* p);
+
+      StatusCode initialize() override;
+      StatusCode finalize() override;
+      
+      virtual StatusCode addBranches() const override;
+      
+    private:
+      
+      std::vector<std::string> m_CollectionsToCheck;
+      ToolHandle <InDet::InDetV0FinderTool> m_v0FinderTool;
+      ToolHandle <Trk::V0Tools> m_V0Tools;
+      const HepPDT::ParticleDataTable *m_particleDataTable;
+
+      int           m_masses;                   //!< = 1 if using PDG values, = 2 if user set (1)
+      double        m_masspi;                   //!< pion mass (139.57 MeV)
+      double        m_massp;                    //!< proton mass (938.272 MeV)
+      double        m_masse;                    //!< electron mass (0.510999 MeV)
+      double        m_massK0S;                  //!< Kshort mass (497.672 MeV)
+      double        m_massLambda;               //!< Lambda mass (1115.68 MeV)
+
+      std::string   m_VxPrimaryCandidateName;   //!< Name of primary vertex container
+
+      std::string                          m_v0ContainerName;
+      std::string                          m_ksContainerName;
+      std::string                          m_laContainerName;
+      std::string                          m_lbContainerName;
+
+  }; 
+}
+
+#endif // DERIVATIONFRAMEWORK_Reco_dimuTrk_H
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Reco_Vertex.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Reco_Vertex.h
new file mode 100644
index 000000000000..57e82e2048e8
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Reco_Vertex.h
@@ -0,0 +1,54 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+///////////////////////////////////////////////////////////////////
+// Reco_Vertex.h
+///////////////////////////////////////////////////////////////////
+
+#ifndef DERIVATIONFRAMEWORK_Reco_Vertex_H
+#define DERIVATIONFRAMEWORK_Reco_Vertex_H
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "TrkVertexAnalysisUtils/V0Tools.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "JpsiUpsilonTools/ICandidateSearch.h"
+#include "JpsiUpsilonTools/PrimaryVertexRefitter.h"
+#include "BeamSpotConditionsData/BeamSpotData.h"
+#include "StoreGate/ReadHandleKeyArray.h"
+
+namespace DerivationFramework {
+
+  class Reco_Vertex : public AthAlgTool, public IAugmentationTool {
+    public: 
+      Reco_Vertex(const std::string& t, const std::string& n, const IInterface* p);
+
+      virtual StatusCode initialize();
+      
+      virtual StatusCode addBranches() const;
+      
+    private:
+      /** tools
+       */
+      ToolHandle<Trk::V0Tools>                    m_v0Tools;
+      ToolHandle<Analysis::ICandidateSearch>      m_SearchTool;
+      ToolHandle<Analysis::PrimaryVertexRefitter> m_pvRefitter;
+      SG::ReadCondHandleKey<InDet::BeamSpotData> m_beamSpotKey { this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot" };
+      
+      /** job options
+       */
+      SG::WriteHandleKey<xAOD::VertexContainer> m_outputVtxContainerName;
+      SG::ReadHandleKey<xAOD::VertexContainer> m_pvContainerName;
+      SG::WriteHandleKey<xAOD::VertexContainer> m_refPVContainerName;
+      bool        m_refitPV;
+      int         m_PV_max;
+      int         m_DoVertexType;
+      size_t      m_PV_minNTracks;
+      bool        m_do3d;
+      bool        m_checkCollections;
+      SG::ReadHandleKeyArray<xAOD::VertexContainer> m_CollectionsToCheck;
+  }; 
+}
+
+#endif // DERIVATIONFRAMEWORK_Reco_Vertex_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Select_Bmumu.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Select_Bmumu.h
new file mode 100644
index 000000000000..cf43240a3ac8
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Select_Bmumu.h
@@ -0,0 +1,116 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+
+//============================================================================
+// Select_Bmumu.h
+//============================================================================
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Changes:
+// 
+// Based on Select_onia2mumu.h.
+// Original author: Daniel Scheirich <daniel.scheirich@cern.ch>
+//
+// Select B candidates for the B(s)mumu analysis including for
+// the reference channels used.
+//
+// For an example see BPHY8.py .
+//
+// Job options provided by this class:
+//                           
+//============================================================================
+//
+#ifndef DERIVATIONFRAMEWORK_Select_Bmumu_H
+#define DERIVATIONFRAMEWORK_Select_Bmumu_H
+
+#include <string>
+
+#include "GaudiKernel/ToolHandle.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DerivationFrameworkBPhys/CfAthAlgTool.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "MuonAnalysisInterfaces/IMuonSelectionTool.h"
+#include "JpsiUpsilonTools/JpsiFinder.h"
+#include "xAODBPhys/BPhysHelper.h"
+
+/** forward declarations
+ */
+namespace Trk {
+  class V0Tools;
+}
+
+namespace xAOD {
+  class BPhysHypoHelper;
+}
+
+namespace SG {
+  class AuxElement;
+}
+
+/** THE candidate selection tool
+ */
+namespace DerivationFramework {
+
+  class Select_Bmumu : public CfAthAlgTool, public IAugmentationTool {
+    public: 
+      Select_Bmumu(const std::string& t, const std::string& n, const IInterface* p);
+
+      /** initialization and finalization
+       */
+      StatusCode initialize() override;
+      StatusCode finalize()   override;
+      
+      /** @brief: augmentation and selection
+       *  Retrieved vertices are augmented with usual information. 
+       *  Selection is performed and each candidate is decorated with the 
+       *  Char_t flag named "passed_"+name() to indicate whether if the candidate
+       *  passed the selection. This flag is then used by the event selection tool
+       *  and by the vertex thinning tool.
+       */
+      virtual StatusCode addBranches() const override;
+      
+    private:
+      void ProcessVertex(xAOD::BPhysHypoHelper&, xAOD::BPhysHelper::pv_type) const;
+      bool massCuts(float mass) const;
+      bool massInBlindedRegion(float mass) const;
+
+      bool checkAllMuonsTight(const std::vector<const xAOD::Muon*>& muons,
+                              int maxMuonsToCheck=-1) const;
+      
+      bool pass(const SG::AuxElement& em, std::string hypo) const;
+      bool setPass(const SG::AuxElement& em, std::string hypo, bool passVal) const;
+      bool setPassIfNotAvailable(SG::AuxElement& em, std::string hypo,
+				 bool passVal) const;
+      // std::vector<xAOD::Vertex*> getPrecedingVertices(const xAOD::Vertex* vtx);
+      
+      /** tools
+       */
+      ToolHandle<Trk::V0Tools>           m_v0Tools;
+      ToolHandle<CP::IMuonSelectionTool> m_muSelectionTool;
+      
+      /** job options
+       */
+      std::string m_hypoName;               //!< name of the mass hypothesis. E.g. Jpis, Upsi, etc. Will be used as a prefix for decorations
+      std::string m_inputVtxContainerName;  //!< name of the input container name
+      std::vector<double> m_trkMasses;      //!< track mass hypotheses
+      double m_massHypo;                    //!< vertex mass hypothesis
+      double m_massMax;                     //!< invariant mass range
+      double m_massMin;                     //!< invariant mass range
+      double m_chi2Max;                     //!< max chi2 cut
+      int m_DoVertexType;                   //!< Allows user to skip certain vertexes - bitwise test 7==all(111)
+      bool   m_do3d;                        //!< add 3d proper time
+      double m_blindMassMin;                //!< blinding mass range
+      double m_blindMassMax;                //!< blinding mass range
+      bool   m_doBlinding;                  //!< enable blinding range
+      bool   m_doCutBlinded;                //!< enable cutting blinded vertices
+      bool   m_blindOnlyAllMuonsTight;      //!< only blind candidates with all tight muons
+      bool   m_useMuCalcMass;               //!< also check against MUCALC mass
+
+      std::vector<std::string> m_subDecVtxContNames; //!< names of sub-decay vertex containers
+      std::vector<std::string> m_subDecVtxHypoCondNames; //!< hypo names for sub-decays to be considered
+      std::vector<std::string> m_subDecVtxHypoFlagNames; //!< names of hypo flags set on sub-decays if passing
+  }; 
+}
+
+#endif // DERIVATIONFRAMEWORK_Select_Bmumu_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Select_onia2mumu.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Select_onia2mumu.h
new file mode 100644
index 000000000000..f2157f8b24ea
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Select_onia2mumu.h
@@ -0,0 +1,71 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+///////////////////////////////////////////////////////////////////
+// Select_onia2mumu.h
+///////////////////////////////////////////////////////////////////
+
+#ifndef DERIVATIONFRAMEWORK_Select_onia2mumu_H
+#define DERIVATIONFRAMEWORK_Select_onia2mumu_H
+
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "JpsiUpsilonTools/JpsiFinder.h"
+#include "xAODBPhys/BPhysHelper.h"
+#include <string>
+
+/** forward declarations
+ */
+namespace Trk {
+  class V0Tools;
+}
+
+namespace xAOD {
+  class BPhysHypoHelper;
+}
+
+/** THE candidate selection tool
+ */
+namespace DerivationFramework {
+
+  class Select_onia2mumu : public AthAlgTool, public IAugmentationTool {
+    public: 
+      Select_onia2mumu(const std::string& t, const std::string& n, const IInterface* p);
+
+      /** inirialization and finalization
+       */
+      StatusCode initialize() override;
+      
+      /** @brief: augmentation and selection
+       *  Retrieved vertices are augmented with usual information. 
+       *  Selection is performed and each candidate is decorated with the 
+       *  Char_t flag named "passed_"+name() to indicate whether if the candidate
+       *  passed the selection. This flag is then used by the event selection tool
+       *  and by the vertex thinning tool.
+       */
+      virtual StatusCode addBranches() const override;
+
+    private:
+      void ProcessVertex(xAOD::BPhysHypoHelper&, xAOD::BPhysHelper::pv_type) const;
+      /** tools
+       */
+      ToolHandle<Trk::V0Tools> m_v0Tools;
+      
+      /** job options
+       */
+      std::string m_hypoName;               //!< name of the mass hypothesis. E.g. Jpis, Upsi, etc. Will be used as a prefix for decorations
+      SG::ReadHandleKey<xAOD::VertexContainer> m_inputVtxContainerName;  //!< name of the input container name
+      std::vector<double> m_trkMasses;      //!< track mass hypotheses
+      double m_massHypo;                    //!< vertex mass hypothesis
+      double m_massMax;                     //!< invariant mass range
+      double m_massMin;                     //!< invariant mass range
+      double m_chi2Max;                     //!< max chi2 cut
+      double m_lxyMin;                      //!< min lxy cut
+      int m_DoVertexType;                   //!< Allows user to skip certain vertexes - bitwise test 7==all(111)
+      bool m_do3d;
+  }; 
+}
+
+#endif // DERIVATIONFRAMEWORK_Select_onia2mumu_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Thin_vtxDuplicates.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Thin_vtxDuplicates.h
new file mode 100644
index 000000000000..77aa7c813869
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Thin_vtxDuplicates.h
@@ -0,0 +1,37 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef DERIVATIONFRAMEWORK_Thin_vtxDuplicates_H
+#define DERIVATIONFRAMEWORK_Thin_vtxDuplicates_H
+
+#include "xAODTracking/VertexContainer.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DerivationFrameworkInterfaces/IThinningTool.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "StoreGate/ThinningHandleKey.h"
+#include "StoreGate/ReadDecorHandleKeyArray.h"
+class IThinningSvc;
+
+namespace DerivationFramework {
+
+  class Thin_vtxDuplicates : public AthAlgTool, public IThinningTool {
+    public: 
+      Thin_vtxDuplicates(const std::string& t, const std::string& n, const IInterface* p);
+      ~Thin_vtxDuplicates();
+      virtual StatusCode initialize();
+      virtual StatusCode finalize();
+      virtual StatusCode doThinning() const;
+
+    private:
+      bool m_noFlags;
+      StringProperty m_streamName{ this, "StreamName", "", "Name of the stream being thinned" };
+      mutable std::atomic<unsigned int> m_nVtxTot, m_nVtxPass;
+      
+      SG::ThinningHandleKey< xAOD::VertexContainer >  m_vertexContainerNames;
+      SG::ReadDecorHandleKeyArray<xAOD::VertexContainer> m_passFlags;
+      bool m_and;
+  }; 
+}
+
+#endif 
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Thin_vtxTrk.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Thin_vtxTrk.h
new file mode 100644
index 000000000000..3222f0ffcfd5
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/Thin_vtxTrk.h
@@ -0,0 +1,54 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+///////////////////////////////////////////////////////////////////
+// Thin_vtxTrk.h
+///////////////////////////////////////////////////////////////////
+
+#ifndef DERIVATIONFRAMEWORK_Thin_vtxTrk_H
+#define DERIVATIONFRAMEWORK_Thin_vtxTrk_H
+
+#include "xAODTracking/TrackParticleContainer.h"
+#include "xAODTracking/VertexContainer.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DerivationFrameworkInterfaces/IThinningTool.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "StoreGate/ThinningHandleKey.h"
+#include "StoreGate/HandleKeyArray.h"
+#include "StoreGate/ReadDecorHandleKeyArray.h"
+#include <string>
+
+namespace SG{
+  template <class T>
+  using ThinningHandleKeyArray = HandleKeyArray<ReadHandle<T>, ThinningHandleKey<T>, Gaudi::DataHandle::Reader >;
+}
+
+namespace DerivationFramework {
+
+  class Thin_vtxTrk : public AthAlgTool, public IThinningTool {
+    public: 
+      Thin_vtxTrk(const std::string& t, const std::string& n, const IInterface* p);
+      ~Thin_vtxTrk();
+      StatusCode initialize();
+      StatusCode finalize();
+      virtual StatusCode doThinning() const;
+
+    private:
+      StringProperty m_streamName{ this, "StreamName", "", "Name of the stream being thinned" };
+      mutable std::atomic<unsigned int> m_ntot, m_npass;
+      double m_acceptanceR;
+      mutable std::atomic<unsigned int> m_nVtxTot, m_nVtxPass;
+      
+      SG::ThinningHandleKey<xAOD::TrackParticleContainer> m_trackParticleContainerName;
+      SG::ThinningHandleKeyArray<xAOD::VertexContainer>        m_vertexContainerName;
+      std::vector<std::string> m_passFlags;
+      SG::ReadDecorHandleKeyArray<xAOD::VertexContainer> m_passArray{this, "INTERNALARRAY", {}};
+      bool m_and;
+      bool m_trackAnd;
+      bool m_thinTracks;
+      bool m_noFlags;  //To take all entries, regardless of flags
+  }; 
+}
+
+#endif 
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/TriggerCountToMetadata.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/TriggerCountToMetadata.h
new file mode 100644
index 000000000000..69290703ebd6
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/TriggerCountToMetadata.h
@@ -0,0 +1,51 @@
+/*
+Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+//============================================================================
+// 
+// Author : Matteo Bedognetti <matteo.bedognetti@cern.ch.>
+// Changes:
+//
+// Store trigger counts for specific chains in the DAOD's MetaData.
+// This allows it to store information about triggers upon which events are NOT selected during the derivation
+//
+// Job options:
+// - TriggerList   -- a vector containing all triggers to store as strings
+// - TrigDecisionTool -- if one wants to pass this a specific TrigDecisionTool
+//
+//============================================================================
+//
+#ifndef DERIVATIONFRAMEWORK_TriggerCountToMetadata_H
+#define DERIVATIONFRAMEWORK_TriggerCountToMetadata_H
+
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "DerivationFrameworkBPhys/CfAthAlgTool.h"
+#include "TrigDecisionTool/TrigDecisionTool.h"
+
+#include <string>
+#include <vector>
+
+namespace Trig{
+	class TrigDecisionTool;
+}
+
+namespace DerivationFramework {
+
+  class TriggerCountToMetadata : virtual public CfAthAlgTool, virtual public IAugmentationTool {
+
+    public: 
+      TriggerCountToMetadata(const std::string& t, const std::string& n, const IInterface* p);
+      virtual StatusCode initialize() override;
+      virtual StatusCode addBranches() const override;
+
+    private: //Don't use protected for this one!
+
+      std::vector<std::string> m_triggerList;
+      ToolHandle<Trig::TrigDecisionTool> m_trigDecisionTool;
+      std::string m_folderName;
+
+  }; // class
+} // namespace
+
+#endif // DERIVATIONFRAMEWORK_TriggerCountToMetadata_H
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/VertexCaloIsolation.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/VertexCaloIsolation.h
new file mode 100644
index 000000000000..50e7b4d252da
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/VertexCaloIsolation.h
@@ -0,0 +1,89 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+///////////////////////////////////////////////////////////////////
+// VertexCaloIsolation.h  by Matteo Bedognetti
+///////////////////////////////////////////////////////////////////
+//
+// This code is based on CaloIsolationTool of IsolationTools package
+//
+// Etcone is determined as a topoCluster-isolation value minus Energy Density (ED) correction and minus the energy depositions of the muons
+// Muon's energy deposition is already stored in side the xAOD::Muon objects, but the muon-clusters are used to correct for the fact that they muons may have overlapping clusters
+// The muon-clusters are stored as well in connection with the muons themselves
+//
+// The idea of comparing topoClusters with muon-clusters to decide what part of the muon's deposition is of 
+// importance had to be abandoned because topCluster cells are not present in xAOD
+//
+// It enforces the fact that for muons no core-surface is removed for the energy-density correction (thus the corrections are independent from each other)
+//
+// "isReliable" flag reports of each isolation value if all particles crossing the cone have been correctly corrected for.
+// In the case of 2mu+ 1 track it mirrors the fact that the track does not extrapolate into the cone (as tracks have no muon-cluster from which to determine the core-correction)
+//
+#ifndef DERIVATIONFRAMEWORK_VertexCaloIsolation_H
+#define DERIVATIONFRAMEWORK_VertexCaloIsolation_H
+
+#include <string>
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "JpsiUpsilonTools/PrimaryVertexRefitter.h"
+//#include "MuonIdHelpers/MuonIdHelperTool.h"
+//#include "IsolationTool/CaloIsolationTool.h"
+//#include "TrkCaloExtension/CaloExtension.h"
+
+#include "RecoToolInterfaces/IParticleCaloExtensionTool.h"
+#include "RecoToolInterfaces/ICaloTopoClusterIsolationTool.h"
+
+//#include "TrackToCalo/CaloCellCollector.h"
+//#include "CaloInterface/ICaloNoiseTool.h"
+#include "xAODBPhys/BPhysHelper.h"
+//#include "xAODPrimitives/IsolationType.h" //
+
+
+/** THE reconstruction tool
+ */
+namespace DerivationFramework {
+
+  class VertexCaloIsolation : public AthAlgTool, public IAugmentationTool {
+    public: 
+      VertexCaloIsolation(const std::string& t, const std::string& n, const IInterface* p);
+
+      StatusCode initialize();
+      StatusCode finalize();
+      
+      StatusCode addBranches() const;
+      bool extrapolateTrack(TLorentzVector& extr_tp, const xAOD::IParticle& tp) const;
+      bool extrapolateMuon(TLorentzVector& extr_tp, const xAOD::CaloCluster* cluster) const;
+      xAOD::TrackParticle&  makeSlyTrack(xAOD::TrackParticle&, const TLorentzVector& candidate, const xAOD::Vertex* vertex, xAOD::BPhysHelper::pv_type vertexType) const;
+
+
+    private:
+
+	//ToolHandle<xAOD::ICaloCellIsolationTool> m_caloIsoTool;
+      ToolHandle<xAOD::ICaloTopoClusterIsolationTool> m_caloIsoTool;
+      std::string m_trackContainerName;
+      std::string m_vertexContainerName;
+      std::string m_caloClusterContainerName;
+      std::string m_cellContainerName;
+      std::string m_muonContainerName;
+      ToolHandle<Trk::IParticleCaloExtensionTool>              m_caloExtTool;
+      std::vector<unsigned int> m_cones;  //I cannot use xAOD::Iso::IsolationType as a type here, as it clashes with setProperty()
+      std::vector<std::string> m_passFlags;
+
+
+    //  ToolHandle <ICaloNoiseTool>                   m_caloNoiseTool;  //Removed to reduce requirements
+      //Rec::CaloCellCollector   m_cellCollector;		//Seems to be a plain class, so no need for handles
+
+      /// Number of sigma for calo cell noise cut
+      float m_sigmaCaloNoiseCut;
+
+  	  int m_vertexType;
+
+
+	      
+  }; 
+}
+
+#endif
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/VertexPlus1TrackCascade.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/VertexPlus1TrackCascade.h
new file mode 100644
index 000000000000..416b42c5a071
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/VertexPlus1TrackCascade.h
@@ -0,0 +1,74 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef VERTEXPLUS1TRACKCASCADE_H
+#define VERTEXPLUS1TRACKCASCADE_H
+//*********************
+// VertexPlus1Cascade header file
+//
+// Adam Barton <abarton@cern.ch>
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "xAODMuon/MuonContainer.h"
+#include "xAODTracking/TrackParticle.h"
+#include "xAODTracking/TrackParticleContainer.h"
+#include "xAODTracking/VertexContainer.h"
+#include <vector>
+
+
+namespace Trk {
+    class IVertexFitter;
+    class ITrackSelectorTool;
+    class TrkVKalVrtFitter;
+    class IVertexCascadeFitter;
+    class VxCascadeInfo;
+}
+
+namespace DerivationFramework {
+
+    static const InterfaceID IID_VertexPlus1TrackCascade("VertexPlus1TrackCascade", 1, 0);
+
+    class VertexPlus1TrackCascade : virtual public AthAlgTool
+    {
+        
+
+        SG::ReadHandleKey<xAOD::VertexContainer> m_vertexContainerKey;
+        SG::ReadHandleKey<xAOD::TrackParticleContainer> m_TrackPContainerKey;
+        SG::ReadHandleKey<xAOD::MuonContainer>  m_MuonsUsedInJpsiKey;
+
+        std::vector<double> m_massHypothesis;
+
+        std::vector<int> m_massConstraintTracksVtx1;
+        std::vector<int> m_massConstraintTracksVtx2;
+        double m_Vtx1MassConstraint;
+        double m_Vtx2MassConstraint;
+
+        double m_trkThresholdPt;
+        double m_trkMaxEta;
+//        double m_BThresholdPt;
+//        double m_BMassUpper;
+//        double m_BMassLower;
+
+        double m_roughMassLower;
+        double m_roughMassUpper;
+        ToolHandle < Trk::TrkVKalVrtFitter > m_iVertexFitter;
+        ToolHandle < Trk::ITrackSelectorTool > m_trkSelector;
+
+    public:
+        static const InterfaceID& interfaceID() { return IID_VertexPlus1TrackCascade;}
+        VertexPlus1TrackCascade(const std::string& t, const std::string& n, const IInterface*  p);
+        ~VertexPlus1TrackCascade();
+        StatusCode initialize() override;
+        StatusCode finalize() override;
+        static double getInvariantMass(const std::vector<const xAOD::TrackParticle*> &Tracks, const std::vector<double> &massHypotheses);
+        static bool isContainedIn(const xAOD::TrackParticle* theTrack, const xAOD::MuonContainer* theColl);
+        StatusCode performSearch(std::vector<Trk::VxCascadeInfo*> *cascadeinfoContainer ) const;
+
+    };
+}
+
+
+#endif
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/VertexTrackIsolation.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/VertexTrackIsolation.h
new file mode 100644
index 000000000000..603da6cef65c
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/DerivationFrameworkBPhys/VertexTrackIsolation.h
@@ -0,0 +1,52 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+///////////////////////////////////////////////////////////////////
+// VertexTrackIsolation.h,
+///////////////////////////////////////////////////////////////////
+
+#ifndef DERIVATIONFRAMEWORK_VertexTrackIsolation_H
+#define DERIVATIONFRAMEWORK_VertexTrackIsolation_H
+
+#include <string>
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
+#include "JpsiUpsilonTools/PrimaryVertexRefitter.h"
+//#include "MuonIdHelpers/MuonIdHelperTool.h"
+//#include "IsolationTool/TrackIsolationTool.h"
+#include "RecoToolInterfaces/ITrackIsolationTool.h"
+//#include "xAODPrimitives/IsolationType.h"
+#include <vector>
+/** THE reconstruction tool
+ */
+namespace DerivationFramework {
+
+  class VertexTrackIsolation : public AthAlgTool, public IAugmentationTool {
+    public: 
+      VertexTrackIsolation(const std::string& t, const std::string& n, const IInterface* p);
+
+      StatusCode initialize();
+      StatusCode finalize();
+      
+      virtual StatusCode addBranches() const;
+
+      bool isSame(const xAOD::Vertex* theVtx1, const xAOD::Vertex* theVtx2) const;
+      bool isContainedIn(const xAOD::Vertex* theVtx, const std::vector<const xAOD::Vertex*> &theColl) const;
+      
+    private:
+
+	ToolHandle<xAOD::ITrackIsolationTool> m_trackIsoTool;
+	std::string m_trackContainerName;
+	std::string m_vertexContainerName;
+	std::vector<unsigned int> m_cones;
+	std::vector<std::string> m_passFlags;
+	int m_vertexType; 	//Which type of primary vertices should be used? (7 = 0b111 are all at the moment)
+
+        bool m_doIsoPerTrk;
+        int m_removeDuplicate;
+  }; 
+}
+
+#endif
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/python/BPhysPyHelpers.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/python/BPhysPyHelpers.py
new file mode 100644
index 000000000000..c30320e4e2fc
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/python/BPhysPyHelpers.py
@@ -0,0 +1,84 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
+#====================================================================
+# BPhysPyHelpers.py
+#
+# Python helper classes for BPHY derivations.
+#
+# authors: W. Walkowiak <wolfgang.walkowiak@cern.ch>, 2016-05-19
+# changed:
+#
+# This file contains a set of Python helper classes for the
+# BPHY derivations.
+#
+# Available helper classes and methods:
+# - BPyWrapper -- wrap configurable to ensure default contents of
+#                 __slots__ dict are available as attributes
+#                 Usage example: see BPHY8.py
+#                 Note: Unfortunately, this doesn't quite work, since the
+#                 wrapped class is no longer recognized as Configurable
+# - BPhysEnsureAttributes(algtool)
+#               -- ensure default contents of __slots__ dict a
+#                  are available as attributes to the class
+# - BPhysFilterBranches(...)
+#               -- create list of isolation or closest track branches
+#                  to be thinned
+#
+#====================================================================
+
+#--------------------------------------------------------------------
+class BPyWrapper(object):
+    __slots__ = {'wclass' : object} 
+
+    def __init__(self, wclass, *args, **kargs):
+        object.__setattr__(self, 'wclass', wclass(*args, **kargs))
+        # the important part: make __slot__ variables attributes
+        for n,v in self.wclass.__slots__.items():
+            if not hasattr(self.wclass, n):
+                setattr(self.wclass, n, v)
+
+    def __getattr__(self, attr):
+        return self.wclass.__getattribute__(attr)
+      
+    def __setattr__(self, attr, value):
+        setattr(self.wclass, attr, value)
+  
+    def __call__(self, *args, **kwargs):
+        return self.wclass(*args, **kwargs)
+#--------------------------------------------------------------------
+#
+# ensure default contents of __slots__ dict are available as attributes
+#
+def BPhysEnsureAttributes(algtool):
+
+    for n,v in algtool.__slots__.items():
+        if not hasattr(algtool, n):
+            setattr(algtool, n, v)
+    return algtool
+#--------------------------------------------------------------------
+#
+# create list of isolation or closest track branches to be thinned
+# (used by BPHY8)
+#
+def BPhysFilterBranches(name, brPrefixList, brIncludeList, doVertexTypeList,
+                        categoryList, trackTypeList, coneOrChi2SetList,
+                        forCloseTrack=False):
+  res = ""
+  brIncludes =  [tuple(x.split('|',3)) for x in brIncludeList]
+  for bntup in brPrefixList:
+    bn, sep, bnsuf = bntup.partition('+')
+    for i, cstr in enumerate(coneOrChi2SetList):
+      for itt in trackTypeList:
+        ittstr = "T%010d" % itt
+        for itcstr in categoryList:
+          if brIncludes and not (cstr,str(itt),itcstr) in brIncludes:
+            for dvs in doVertexTypeList:
+              if forCloseTrack:
+                fbn = '_'.join(filter(None, [name,bn,ittstr,itcstr,
+                                             dvs,cstr,bnsuf]))
+              else:
+                fbn = '_'.join(filter(None, [name,bn,cstr,ittstr,
+                                             itcstr,dvs,bnsuf]))
+              res += ".-"+fbn
+  return res
+#--------------------------------------------------------------------
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/python/__init__.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/python/__init__.py
new file mode 100644
index 000000000000..74583d364ec2
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/python/__init__.py
@@ -0,0 +1,2 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY1.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY1.py
new file mode 100644
index 000000000000..6b20ae9dacb3
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY1.py
@@ -0,0 +1,274 @@
+#====================================================================
+# BPHY1.py
+# This an example job options script showing how to set up a 
+# derivation of the data using the derivation framework.  
+# It requires the reductionConf flag BPHY1 in Reco_tf.py   
+#====================================================================
+
+# Set up common services and job object. 
+# This should appear in ALL derivation job options
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+print (isSimulation)
+
+#====================================================================
+# AUGMENTATION TOOLS 
+#====================================================================
+## 1/ setup vertexing tools and services
+#include( "JpsiUpsilonTools/configureServices.py" )
+
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY1_VertexTools = BPHYVertexTools("BPHY1")
+
+#--------------------------------------------------------------------
+## 2/ Setup the vertex fitter tools (e.g. JpsiFinder, JpsiPlus1Track, etc).
+##    These are general tools independent of DerivationFramework that do the 
+##    actual vertex fitting and some pre-selection.
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder
+BPHY1JpsiFinder = Analysis__JpsiFinder(
+  name                        = "BPHY1JpsiFinder",
+  OutputLevel                 = INFO,
+  muAndMu                     = True,
+  muAndTrack                  = False,
+  TrackAndTrack               = False,
+  assumeDiMuons               = True,    # If true, will assume dimu hypothesis and use PDG value for mu mass
+  invMassUpper                = 100000.0,
+  invMassLower                = 0.0,
+  Chi2Cut                     = 200.,
+  oppChargesOnly	            = True,
+  atLeastOneComb              = True,
+  useCombinedMeasurement      = False, # Only takes effect if combOnly=True	
+  muonCollectionKey           = "Muons",
+  TrackParticleCollection     = "InDetTrackParticles",
+  V0VertexFitterTool          = BPHY1_VertexTools.TrkV0Fitter,             # V0 vertex fitter
+  useV0Fitter                 = False,                   # if False a TrkVertexFitterTool will be used
+  TrkVertexFitterTool         = BPHY1_VertexTools.TrkVKalVrtFitter,        # VKalVrt vertex fitter
+  TrackSelectorTool           = BPHY1_VertexTools.InDetTrackSelectorTool,
+  VertexPointEstimator        = BPHY1_VertexTools.VtxPointEstimator,
+  useMCPCuts                  = False )
+  
+ToolSvc += BPHY1JpsiFinder
+print      (BPHY1JpsiFinder)
+
+#--------------------------------------------------------------------
+## 3/ setup the vertex reconstruction "call" tool(s). They are part of the derivation framework.
+##    These Augmentation tools add output vertex collection(s) into the StoreGate and add basic 
+##    decorations which do not depend on the vertex mass hypothesis (e.g. lxy, ptError, etc).
+##    There should be one tool per topology, i.e. Jpsi and Psi(2S) do not need two instance of the
+##    Reco tool is the JpsiFinder mass window is wide enough.
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY1_Reco_mumu = DerivationFramework__Reco_Vertex(
+  name                   = "BPHY1_Reco_mumu",
+  VertexSearchTool             = BPHY1JpsiFinder,
+  OutputVtxContainerName = "BPHY1OniaCandidates",
+  PVContainerName        = "PrimaryVertices",
+  RefPVContainerName     = "BPHY1RefittedPrimaryVertices",
+  RefitPV                = True,
+  MaxPVrefit             = 100000,
+  DoVertexType           = 7)
+  
+ToolSvc += BPHY1_Reco_mumu
+print (BPHY1_Reco_mumu)
+
+#--------------------------------------------------------------------
+## 4/ setup the vertex selection and augmentation tool(s). These tools decorate the vertices with
+##    variables that depend on the vertex mass hypothesis, e.g. invariant mass, proper decay time, etc.
+##    Property HypothesisName is used as a prefix for these decorations.
+##    They also perform tighter selection, flagging the vertecis that passed. The flag is a Char_t branch
+##    named "passed_"+HypothesisName. It is used later by the "SelectEvent" and "Thin_vtxTrk" tools
+##    to determine which events and candidates should be kept in the output stream.
+##    Multiple instances of the Select_* tools can be used on a single input collection as long as they 
+##    use different "HypothesisName" flags.
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+
+## a/ augment and select Jpsi->mumu candidates
+BPHY1_Select_Jpsi2mumu = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY1_Select_Jpsi2mumu",
+  HypothesisName        = "Jpsi",
+  InputVtxContainerName = "BPHY1OniaCandidates",
+  VtxMassHypo           = 3096.916,
+  MassMin               = 2000.0,
+  MassMax               = 3600.0,
+  Chi2Max               = 200,
+  DoVertexType          = 7)
+  
+ToolSvc += BPHY1_Select_Jpsi2mumu
+print (BPHY1_Select_Jpsi2mumu)
+
+## b/ augment and select Psi(2S)->mumu candidates
+BPHY1_Select_Psi2mumu = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY1_Select_Psi2mumu",
+  HypothesisName        = "Psi",
+  InputVtxContainerName = "BPHY1OniaCandidates",
+  VtxMassHypo           = 3686.09,
+  MassMin               = 3300.0,
+  MassMax               = 4500.0,
+  Chi2Max               = 200,
+  DoVertexType          = 7)
+  
+ToolSvc += BPHY1_Select_Psi2mumu
+print (BPHY1_Select_Psi2mumu)
+
+# Added by ASC
+## c/ augment and select Upsilon(nS)->mumu candidates
+BPHY1_Select_Upsi2mumu = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY1_Select_Upsi2mumu",
+  HypothesisName        = "Upsi",
+  InputVtxContainerName = "BPHY1OniaCandidates",
+  VtxMassHypo           = 9460.30,
+  MassMin               = 7000.0,
+  MassMax               = 12500.0,
+  Chi2Max               = 200,
+  DoVertexType          = 7)
+  
+ToolSvc += BPHY1_Select_Upsi2mumu
+print (BPHY1_Select_Upsi2mumu)
+
+
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+streamName = derivationFlags.WriteDAOD_BPHY1Stream.StreamName
+fileName   = buildFileName( derivationFlags.WriteDAOD_BPHY1Stream )
+BPHY1Stream = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY1Stream.AcceptAlgs(["BPHY1Kernel"])
+# Special lines for thinning
+# Thinning service name must match the one passed to the thinning tools
+augStream = MSMgr.GetStream( streamName )
+
+
+
+#--------------------------------------------------------------------
+## 5/ select the event. We only want to keep events that contain certain vertices which passed certain selection.
+##    This is specified by the "SelectionExpression" property, which contains the expression in the following format:
+##
+##       "ContainerName.passed_HypoName > count"
+##
+##    where "ContainerName" is output container form some Reco_* tool, "HypoName" is the hypothesis name setup in some "Select_*"
+##    tool and "count" is the number of candidates passing the selection you want to keep. 
+
+expression = "count(BPHY1OniaCandidates.passed_Jpsi) > 0 || count(BPHY1OniaCandidates.passed_Psi) > 0 || count(BPHY1OniaCandidates.passed_Upsi) > 0"
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+BPHY1_SelectEvent = DerivationFramework__xAODStringSkimmingTool(name = "BPHY1_SelectEvent",
+                                                                expression = expression)
+ToolSvc += BPHY1_SelectEvent
+print (BPHY1_SelectEvent)
+
+#--------------------------------------------------------------------
+## 6/ track and vertex thinning. We want to remove all reconstructed secondary vertices
+##    which hasn't passed any of the selections defined by (Select_*) tools.
+##    We also want to keep only tracks which are associates with either muons or any of the
+##    vertices that passed the selection. Multiple thinning tools can perform the 
+##    selection. The final thinning decision is based OR of all the decisions (by default,
+##    although it can be changed by the JO).
+
+## a) thining out vertices that didn't pass any selection and idetifying tracks associated with 
+##    selected vertices. The "VertexContainerNames" is a list of the vertex containers, and "PassFlags"
+##    contains all pass flags for Select_* tools that must be satisfied. The vertex is kept is it 
+##    satisfy any of the listed selections.
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxTrk
+BPHY1Thin_vtxTrk = DerivationFramework__Thin_vtxTrk(
+  name                       = "BPHY1Thin_vtxTrk",
+  TrackParticleContainerName = "InDetTrackParticles",
+  StreamName = streamName,
+  VertexContainerNames       = ["BPHY1OniaCandidates"],
+  PassFlags                  = ["passed_Jpsi", "passed_Psi", "passed_Upsi"] )
+
+ToolSvc += BPHY1Thin_vtxTrk
+
+## b) thinning out tracks that are not attached to muons. The final thinning decision is based on the OR operation
+##    between decision from this and the previous tools.
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__MuonTrackParticleThinning
+BPHY1MuonTPThinningTool = DerivationFramework__MuonTrackParticleThinning(name                    = "BPHY1MuonTPThinningTool",
+                                                                         MuonKey                 = "Muons",
+                                                                         StreamName = streamName,
+                                                                         InDetTrackParticlesKey  = "InDetTrackParticles")
+ToolSvc += BPHY1MuonTPThinningTool
+
+# Added by ASC
+# Only save truth informtion directly associated with Onia
+from DerivationFrameworkMCTruth.DerivationFrameworkMCTruthConf import DerivationFramework__GenericTruthThinning
+BPHY1TruthThinTool = DerivationFramework__GenericTruthThinning(name                    = "BPHY1TruthThinTool",
+                                                        StreamName = streamName,
+                                                        ParticleSelectionString = "TruthParticles.pdgId == 443 || TruthParticles.pdgId == 100443 || TruthParticles.pdgId == 553 || TruthParticles.pdgId == 100553 || TruthParticles.pdgId == 200553",
+                                                        PreserveDescendants     = True,
+                                                        PreserveAncestors      = True)
+ToolSvc += BPHY1TruthThinTool
+print (BPHY1TruthThinTool)
+
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS  
+#====================================================================
+## 7/ IMPORTANT bit. Don't forget to pass the tools to the DerivationKernel! If you don't do that, they will not be 
+##    be executed!
+
+# Added by ASC
+BPHY1ThinningTools = [BPHY1Thin_vtxTrk, BPHY1MuonTPThinningTool]
+if globalflags.DataSource()=='geant4':
+    BPHY1ThinningTools.append(BPHY1TruthThinTool)
+
+# The name of the kernel (BPHY1Kernel in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+DerivationFrameworkJob += CfgMgr.DerivationFramework__DerivationKernel(
+  "BPHY1Kernel",
+   AugmentationTools = [BPHY1_Reco_mumu, BPHY1_Select_Jpsi2mumu, BPHY1_Select_Psi2mumu, BPHY1_Select_Upsi2mumu],
+   SkimmingTools     = [BPHY1_SelectEvent],
+   ThinningTools     = BPHY1ThinningTools
+   )
+
+
+
+#====================================================================
+# Slimming 
+#====================================================================
+
+# Added by ASC
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY1SlimmingHelper = SlimmingHelper("BPHY1SlimmingHelper")
+AllVariables = []
+StaticContent = []
+
+# Needed for trigger objects
+BPHY1SlimmingHelper.IncludeMuonTriggerContent = True
+BPHY1SlimmingHelper.IncludeBPhysTriggerContent = True
+
+## primary vertices
+AllVariables += ["PrimaryVertices"]
+StaticContent += ["xAOD::VertexContainer#BPHY1RefittedPrimaryVertices"]
+StaticContent += ["xAOD::VertexAuxContainer#BPHY1RefittedPrimaryVerticesAux."]
+
+## ID track particles
+AllVariables += ["InDetTrackParticles"]
+
+## combined / extrapolated muon track particles 
+## (note: for tagged muons there is no extra TrackParticle collection since the ID tracks
+##        are store in InDetTrackParticles collection)
+AllVariables += ["CombinedMuonTrackParticles"]
+AllVariables += ["ExtrapolatedMuonTrackParticles"]
+
+## muon container
+AllVariables += ["Muons"]
+
+## Jpsi candidates 
+StaticContent += ["xAOD::VertexContainer#%s"        % BPHY1_Reco_mumu.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY1_Reco_mumu.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY1_Reco_mumu.OutputVtxContainerName]
+
+# Added by ASC
+# Truth information for MC only
+if isSimulation:
+    AllVariables += ["TruthEvents","TruthParticles","TruthVertices","MuonTruthParticles"]
+
+BPHY1SlimmingHelper.AllVariables = AllVariables
+BPHY1SlimmingHelper.StaticContent = StaticContent
+BPHY1SlimmingHelper.AppendContentToStream(BPHY1Stream)
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY10.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY10.py
new file mode 100644
index 000000000000..2f9dcb083a9e
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY10.py
@@ -0,0 +1,477 @@
+#====================================================================
+# BPHY10.py
+# Bs>J/psiKK 
+# It requires the reductionConf flag BPHY10 in Reco_tf.py   
+#====================================================================
+
+# Set up common services and job object. 
+# This should appear in ALL derivation job options
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+print(isSimulation)
+
+
+#====================================================================
+# AUGMENTATION TOOLS 
+#====================================================================
+## 1/ setup vertexing tools and services
+#include( "JpsiUpsilonTools/configureServices.py" )
+
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY10_VertexTools = BPHYVertexTools("BPHY10")
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__AugOriginalCounts
+BPHY10_AugOriginalCounts = DerivationFramework__AugOriginalCounts(
+   name = "BPHY10_AugOriginalCounts",
+   VertexContainer = "PrimaryVertices",
+   TrackContainer = "InDetTrackParticles" )
+ToolSvc += BPHY10_AugOriginalCounts
+
+
+#--------------------------------------------------------------------
+## 2/ setup JpsiFinder tool
+##    These are general tools independent of DerivationFramework that do the 
+##    actual vertex fitting and some pre-selection.
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder
+BPHY10JpsiFinder = Analysis__JpsiFinder(
+    name                        = "BPHY10JpsiFinder",
+    OutputLevel                 = INFO,
+    muAndMu                     = True,
+    muAndTrack                  = False,
+    TrackAndTrack               = False,
+    assumeDiMuons               = True, 
+    invMassUpper                = 4000.0,
+    invMassLower                = 2600.0,
+    Chi2Cut                     = 200.,
+    oppChargesOnly	        = True,
+    combOnly		        = True,
+    atLeastOneComb              = False,
+    useCombinedMeasurement      = False, # Only takes effect if combOnly=True	
+    muonCollectionKey           = "Muons",
+    TrackParticleCollection     = "InDetTrackParticles",
+    V0VertexFitterTool          = BPHY10_VertexTools.TrkV0Fitter,             # V0 vertex fitter
+    useV0Fitter                 = False,                   # if False a TrkVertexFitterTool will be used
+    TrkVertexFitterTool         = BPHY10_VertexTools.TrkVKalVrtFitter,        # VKalVrt vertex fitter
+    TrackSelectorTool           = BPHY10_VertexTools.InDetTrackSelectorTool,
+    VertexPointEstimator        = BPHY10_VertexTools.VtxPointEstimator,
+    useMCPCuts                  = False)
+
+ToolSvc += BPHY10JpsiFinder
+print(BPHY10JpsiFinder)
+
+#--------------------------------------------------------------------
+## 3/ setup the vertex reconstruction "call" tool(s). They are part of the derivation framework.
+##    These Augmentation tools add output vertex collection(s) into the StoreGate and add basic 
+##    decorations which do not depend on the vertex mass hypothesis (e.g. lxy, ptError, etc).
+##    There should be one tool per topology, i.e. Jpsi and Psi(2S) do not need two instance of the
+##    Reco tool is the JpsiFinder mass window is wide enough.
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY10JpsiSelectAndWrite   = DerivationFramework__Reco_Vertex(
+    name                   = "BPHY10JpsiSelectAndWrite",
+    VertexSearchTool             = BPHY10JpsiFinder,
+    OutputVtxContainerName = "BPHY10JpsiCandidates",
+    PVContainerName        = "PrimaryVertices",
+    RefPVContainerName     = "SHOULDNOTBEUSED",
+    #    RefPVContainerName     = "BPHY10RefJpsiPrimaryVertices",
+    #    RefitPV                = True,
+    #    MaxPVrefit             = 10000,
+    DoVertexType = 1)
+
+ToolSvc += BPHY10JpsiSelectAndWrite
+print(BPHY10JpsiSelectAndWrite)
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+
+## a/ augment and select Jpsi->mumu candidates
+BPHY10_Select_Jpsi2mumu = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY10_Select_Jpsi2mumu",
+  HypothesisName        = "Jpsi",
+  InputVtxContainerName = "BPHY10JpsiCandidates",
+  VtxMassHypo           = 3096.916,
+  MassMin               = 2600.0,
+  MassMax               = 4000.0,
+  Chi2Max               = 200,
+  DoVertexType =1)
+
+  
+ToolSvc += BPHY10_Select_Jpsi2mumu
+print(BPHY10_Select_Jpsi2mumu)
+
+
+## 4/ setup a new vertexing tool (necessary due to use of mass constraint) 
+from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+BdKstVertexFit = Trk__TrkVKalVrtFitter(
+    name                = "BdKstVertexFit",
+    Extrapolator        = BPHY10_VertexTools.InDetExtrapolator,
+    FirstMeasuredPoint  = True,
+    MakeExtendedVertex  = True)
+
+ToolSvc += BdKstVertexFit
+print(BdKstVertexFit)
+
+## 5/ setup the Jpsi+2 track finder
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiPlus2Tracks
+BPHY10BdJpsiKst = Analysis__JpsiPlus2Tracks(
+    name                    = "BPHY10BdJpsiKst",
+    OutputLevel             = INFO,
+    kaonkaonHypothesis	    = False,
+    pionpionHypothesis      = False,
+    kaonpionHypothesis      = True,
+    trkThresholdPt          = 500.0,
+    trkMaxEta		    = 3.0,
+    BThresholdPt            = 5000.,
+    BMassLower              = 4300.0,
+    BMassUpper		    = 6300.0,
+    JpsiContainerKey	    = "BPHY10JpsiCandidates",
+    TrackParticleCollection = "InDetTrackParticles",
+    #MuonsUsedInJpsi	    = "Muons", #Don't remove all muons, just those in J/psi candidate (see the following cut)
+    ExcludeCrossJpsiTracks  = False,   #setting this to False rejects the muons from J/psi candidate
+    TrkVertexFitterTool	    = BdKstVertexFit,
+    TrackSelectorTool	    = BPHY10_VertexTools.InDetTrackSelectorTool,
+    VertexPointEstimator        = BPHY10_VertexTools.VtxPointEstimator,
+    UseMassConstraint	    = True,
+    #DiTrackMassUpper        = 1500.,
+    #DiTrackMassLower        = 500.,
+    Chi2Cut                 = 10.0,
+    DiTrackPt               = 500.,
+    TrkQuadrupletMassLower  = 3500.0,
+    TrkQuadrupletMassUpper  = 6800.0,
+    #FinalDiTrackMassUpper   = 1000.,
+    #FinalDiTrackMassLower   = 800.,
+    #TrkDeltaZ               = 20., #Normally, this cut should not be used since it is lifetime-dependent
+    FinalDiTrackPt          = 500.
+    )
+
+ToolSvc += BPHY10BdJpsiKst
+print(BPHY10BdJpsiKst)   
+
+
+## 6/ setup the combined augmentation/skimming tool for the BdKst
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex	
+BPHY10BdKstSelectAndWrite  = DerivationFramework__Reco_Vertex(
+    name                   = "BPHY10BdKstSelectAndWrite",
+    Jpsi2PlusTrackName     = BPHY10BdJpsiKst,
+    OutputVtxContainerName = "BPHY10BdJpsiKstCandidates",
+    PVContainerName        = "PrimaryVertices",
+    RefPVContainerName     = "BPHY10RefittedPrimaryVertices",
+    RefitPV                = True,
+    MaxPVrefit             = 10000,
+    DoVertexType = 7)
+
+ToolSvc += BPHY10BdKstSelectAndWrite 
+print(BPHY10BdKstSelectAndWrite)
+
+## b/ augment and select Bd->JpsiKst candidates
+#  set mass hypothesis (K pi)
+BPHY10_Select_Bd2JpsiKst = DerivationFramework__Select_onia2mumu(
+    name                       = "BPHY10_Select_Bd2JpsiKst",
+    HypothesisName             = "Bd",
+    InputVtxContainerName      = "BPHY10BdJpsiKstCandidates",
+    TrkMasses                  = [105.658, 105.658, 493.677, 139.570],
+    VtxMassHypo                = 5279.6,
+    MassMin                    = 100.0,      #no mass cuts here
+    MassMax                    = 100000.0,   #no mass cuts here
+    Chi2Max                    = 200)
+
+ToolSvc += BPHY10_Select_Bd2JpsiKst
+print(BPHY10_Select_Bd2JpsiKst)
+
+## c/ augment and select Bdbar->JpsiKstbar candidates
+# set mass hypothesis (pi K)
+BPHY10_Select_Bd2JpsiKstbar = DerivationFramework__Select_onia2mumu(
+    name                       = "BPHY10_Select_Bd2JpsiKstbar",
+    HypothesisName             = "Bdbar",
+    InputVtxContainerName      = "BPHY10BdJpsiKstCandidates",
+    TrkMasses                  = [105.658, 105.658, 139.570, 493.677],
+    VtxMassHypo                = 5279.6,
+    MassMin                    = 100.0,      #no mass cuts here
+    MassMax                    = 100000.0,   #no mass cuts here
+    Chi2Max                    = 200)
+
+ToolSvc += BPHY10_Select_Bd2JpsiKstbar
+print(BPHY10_Select_Bd2JpsiKstbar)
+
+
+## 7/ call the V0Finder if a Jpsi has been found
+doSimpleV0Finder = False
+if doSimpleV0Finder:
+  include("DerivationFrameworkBPhys/configureSimpleV0Finder.py")
+else:
+  include("DerivationFrameworkBPhys/configureV0Finder.py")
+
+BPHY10_V0FinderTools = BPHYV0FinderTools("BPHY10")
+print(BPHY10_V0FinderTools)
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_V0Finder
+BPHY10_Reco_V0Finder   = DerivationFramework__Reco_V0Finder(
+    name                   = "BPHY10_Reco_V0Finder",
+    V0FinderTool           = BPHY10_V0FinderTools.V0FinderTool,
+    #OutputLevel            = DEBUG,
+    V0ContainerName        = "BPHY10RecoV0Candidates",
+    KshortContainerName    = "BPHY10RecoKshortCandidates",
+    LambdaContainerName    = "BPHY10RecoLambdaCandidates",
+    LambdabarContainerName = "BPHY10RecoLambdabarCandidates",
+    CheckVertexContainers  = ['BPHY10JpsiCandidates'])
+
+ToolSvc += BPHY10_Reco_V0Finder
+print(BPHY10_Reco_V0Finder)
+
+## 8/ setup the cascade vertexing tool
+from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+JpsiV0VertexFit = Trk__TrkVKalVrtFitter(
+    name                 = "JpsiV0VertexFit",
+    #OutputLevel          = DEBUG,
+    Extrapolator         = BPHY10_VertexTools.InDetExtrapolator,
+    #FirstMeasuredPoint   = True,
+    FirstMeasuredPoint   = False,
+    CascadeCnstPrecision = 1e-6,
+    MakeExtendedVertex   = True)
+
+ToolSvc += JpsiV0VertexFit
+print(JpsiV0VertexFit)
+
+## 9/ setup the Jpsi+V0 finder
+## a/ Bd->JpsiKshort
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__JpsiPlusV0Cascade
+BPHY10JpsiKshort            = DerivationFramework__JpsiPlusV0Cascade(
+    name                    = "BPHY10JpsiKshort",
+    #OutputLevel             = DEBUG,
+    HypothesisName          = "Bd",
+    TrkVertexFitterTool     = JpsiV0VertexFit,
+    V0Hypothesis            = 310,
+    JpsiMassLowerCut        = 2800.,
+    JpsiMassUpperCut        = 4000.,
+    V0MassLowerCut          = 400.,
+    V0MassUpperCut          = 600.,
+    MassLowerCut            = 4300.,
+    MassUpperCut            = 6300.,
+    RefitPV                 = True,
+    RefPVContainerName      = "BPHY10RefittedPrimaryVertices",
+    JpsiVertices            = "BPHY10JpsiCandidates",
+    CascadeVertexCollections= ["BPHY10JpsiKshortCascadeSV2", "BPHY10JpsiKshortCascadeSV1"],
+    V0Vertices              = "BPHY10RecoV0Candidates")
+
+ToolSvc += BPHY10JpsiKshort
+print(BPHY10JpsiKshort)
+
+## b/ Lambda_b->JpsiLambda
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__JpsiPlusV0Cascade
+BPHY10JpsiLambda            = DerivationFramework__JpsiPlusV0Cascade(
+    name                    = "BPHY10JpsiLambda",
+    #OutputLevel             = DEBUG,
+    HypothesisName          = "Lambda_b",
+    TrkVertexFitterTool     = JpsiV0VertexFit,
+    V0Hypothesis            = 3122,
+    JpsiMassLowerCut        = 2800.,
+    JpsiMassUpperCut        = 4000.,
+    V0MassLowerCut          = 1050.,
+    V0MassUpperCut          = 1250.,
+    MassLowerCut            = 4600.,
+    MassUpperCut            = 6600.,
+    RefitPV                 = True,
+    RefPVContainerName      = "BPHY10RefittedPrimaryVertices",
+    JpsiVertices            = "BPHY10JpsiCandidates",
+    CascadeVertexCollections= ["BPHY10JpsiLambdaCascadeSV2", "BPHY10JpsiLambdaCascadeSV1"],
+    V0Vertices              = "BPHY10RecoV0Candidates")
+
+ToolSvc += BPHY10JpsiLambda
+print(BPHY10JpsiLambda)
+
+## c/ Lambda_bbar->JpsiLambdabar
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__JpsiPlusV0Cascade
+BPHY10JpsiLambdabar         = DerivationFramework__JpsiPlusV0Cascade(
+    name                    = "BPHY10JpsiLambdabar",
+    HypothesisName          = "Lambda_bbar",
+    #OutputLevel             = DEBUG,
+    TrkVertexFitterTool     = JpsiV0VertexFit,
+    V0Hypothesis            = -3122,
+    JpsiMassLowerCut        = 2800.,
+    JpsiMassUpperCut        = 4000.,
+    V0MassLowerCut          = 1050.,
+    V0MassUpperCut          = 1250.,
+    MassLowerCut            = 4600.,
+    MassUpperCut            = 6600.,
+    RefitPV                 = True,
+    RefPVContainerName      = "BPHY10RefittedPrimaryVertices",
+    JpsiVertices            = "BPHY10JpsiCandidates",
+    CascadeVertexCollections= ["BPHY10JpsiLambdabarCascadeSV2", "BPHY10JpsiLambdabarCascadeSV1"],
+    V0Vertices              = "BPHY10RecoV0Candidates")
+
+ToolSvc += BPHY10JpsiLambdabar
+print(BPHY10JpsiLambdabar)
+
+CascadeCollections = []
+CascadeCollections += BPHY10JpsiKshort.CascadeVertexCollections
+CascadeCollections += BPHY10JpsiLambda.CascadeVertexCollections
+CascadeCollections += BPHY10JpsiLambdabar.CascadeVertexCollections
+
+
+
+if not isSimulation: #Only Skim Data
+   from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+   BPHY10_SelectBdJpsiKstEvent = DerivationFramework__xAODStringSkimmingTool(
+     name = "BPHY10_SelectBdJpsiKstEvent",
+     #expression = "(count(BPHY10BdJpsiKstCandidates.passed_Bd > 0) + count(BPHY10BdJpsiKstCandidates.passed_BdBar > 0) + count(BPHY10RecoV0Candidates) + count(RecoKshortContainerName) + count(RecoLambdaContainerName) + count(RecoLambdabarContainerName) ) > 0")
+     expression = "(count(BPHY10BdJpsiKstCandidates.passed_Bd > 0) + count(BPHY10BdJpsiKstCandidates.passed_Bdbar > 0) + count(BPHY10JpsiKshortCascadeSV1.x > -999) + count(BPHY10JpsiLambdaCascadeSV1.x > -999) + count(BPHY10JpsiLambdabarCascadeSV1.x > -999) ) > 0")
+   
+   ToolSvc += BPHY10_SelectBdJpsiKstEvent
+   print(BPHY10_SelectBdJpsiKstEvent)
+
+
+
+   #====================================================================
+   # Make event selection based on an OR of the input skimming tools
+   #====================================================================
+      
+   from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__FilterCombinationOR
+   BPHY10SkimmingOR = CfgMgr.DerivationFramework__FilterCombinationOR(
+       "BPHY10SkimmingOR",
+       FilterList = [BPHY10_SelectBdJpsiKstEvent],)
+   ToolSvc += BPHY10SkimmingOR
+   print(BPHY10SkimmingOR)
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxTrk
+BPHY10_thinningTool_Tracks = DerivationFramework__Thin_vtxTrk(
+  name                       = "BPHY10_thinningTool_Tracks",
+  TrackParticleContainerName = "InDetTrackParticles",
+  VertexContainerNames       = ["BPHY10BdJpsiKstCandidates","BPHY10JpsiKshortCascadeSV1","BPHY10JpsiKshortCascadeSV2","BPHY10JpsiLambdaCascadeSV1","BPHY10JpsiLambdaCascadeSV2","BPHY10JpsiLambdabarCascadeSV1","BPHY10JpsiLambdabarCascadeSV2"],
+  PassFlags                  = ["passed_Bd", "passed_Bdbar"] )
+
+ToolSvc += BPHY10_thinningTool_Tracks
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__BPhysPVThinningTool
+BPHY10_thinningTool_PV = DerivationFramework__BPhysPVThinningTool(
+  name                       = "BPHY10_thinningTool_PV",
+  CandidateCollections       = ["BPHY10BdJpsiKstCandidates","BPHY10JpsiKshortCascadeSV1","BPHY10JpsiKshortCascadeSV2","BPHY10JpsiLambdaCascadeSV1","BPHY10JpsiLambdaCascadeSV2","BPHY10JpsiLambdabarCascadeSV1","BPHY10JpsiLambdabarCascadeSV2"],
+  KeepPVTracks  =True
+ )
+
+ToolSvc += BPHY10_thinningTool_PV
+
+
+## b) thinning out tracks that are not attached to muons. The final thinning decision is based on the OR operation
+##    between decision from this and the previous tools.
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__MuonTrackParticleThinning
+BPHY10MuonTPThinningTool = DerivationFramework__MuonTrackParticleThinning(
+    name                    = "BPHY10MuonTPThinningTool",
+    MuonKey                 = "Muons",
+    InDetTrackParticlesKey  = "InDetTrackParticles")
+ToolSvc += BPHY10MuonTPThinningTool
+
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS  
+#====================================================================
+
+thiningCollection = [] 
+
+print(thiningCollection)
+
+
+# The name of the kernel (BPHY10Kernel in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+DerivationFrameworkJob += CfgMgr.DerivationFramework__DerivationKernel(
+    "BPHY10Kernel",
+    AugmentationTools = [BPHY10JpsiSelectAndWrite,  BPHY10_Select_Jpsi2mumu,
+                         BPHY10BdKstSelectAndWrite, BPHY10_Select_Bd2JpsiKst, BPHY10_Select_Bd2JpsiKstbar,
+                         BPHY10_Reco_V0Finder, BPHY10JpsiKshort, BPHY10JpsiLambda, BPHY10JpsiLambdabar,
+                         BPHY10_AugOriginalCounts],
+    #Only skim if not MC
+    SkimmingTools     = [BPHY10SkimmingOR] if not isSimulation else [],
+    ThinningTools     = thiningCollection
+    )
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+streamName   = derivationFlags.WriteDAOD_BPHY10Stream.StreamName
+fileName     = buildFileName( derivationFlags.WriteDAOD_BPHY10Stream )
+BPHY10Stream  = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY10Stream.AcceptAlgs(["BPHY10Kernel"])
+
+# Special lines for thinning
+# Thinning service name must match the one passed to the thinning tools
+from AthenaServices.Configurables import ThinningSvc, createThinningSvc
+augStream = MSMgr.GetStream( streamName )
+evtStream = augStream.GetEventStream()
+
+BPHY10ThinningSvc = createThinningSvc( svcName="BPHY10ThinningSvc", outStreams=[evtStream] )
+svcMgr += BPHY10ThinningSvc
+
+#====================================================================
+# Slimming 
+#====================================================================
+
+# Added by ASC
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY10SlimmingHelper = SlimmingHelper("BPHY10SlimmingHelper")
+AllVariables  = []
+StaticContent = []
+
+# Needed for trigger objects
+BPHY10SlimmingHelper.IncludeMuonTriggerContent  = TRUE
+BPHY10SlimmingHelper.IncludeBPhysTriggerContent = TRUE
+
+## primary vertices
+AllVariables  += ["PrimaryVertices"]
+StaticContent += ["xAOD::VertexContainer#BPHY10RefittedPrimaryVertices"]
+StaticContent += ["xAOD::VertexAuxContainer#BPHY10RefittedPrimaryVerticesAux."]
+
+## ID track particles
+AllVariables += ["InDetTrackParticles"]
+
+## combined / extrapolated muon track particles 
+## (note: for tagged muons there is no extra TrackParticle collection since the ID tracks
+##        are store in InDetTrackParticles collection)
+AllVariables += ["CombinedMuonTrackParticles"]
+AllVariables += ["ExtrapolatedMuonTrackParticles"]
+
+## muon container
+AllVariables += ["Muons"] 
+
+
+## Jpsi candidates 
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY10JpsiSelectAndWrite.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY10JpsiSelectAndWrite.OutputVtxContainerName]
+
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY10BdKstSelectAndWrite.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY10BdKstSelectAndWrite.OutputVtxContainerName]
+
+StaticContent += ["xAOD::VertexContainer#%s"        %                 'BPHY10RecoV0Candidates']
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % 'BPHY10RecoV0Candidates']
+StaticContent += ["xAOD::VertexContainer#%s"        %                 'BPHY10RecoKshortCandidates']
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % 'BPHY10RecoKshortCandidates']
+StaticContent += ["xAOD::VertexContainer#%s"        %                 'BPHY10RecoLambdaCandidates']
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % 'BPHY10RecoLambdaCandidates']
+StaticContent += ["xAOD::VertexContainer#%s"        %                 'BPHY10RecoLambdabarCandidates']
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % 'BPHY10RecoLambdabarCandidates']
+
+for cascades in CascadeCollections:
+   StaticContent += ["xAOD::VertexContainer#%s"   %     cascades]
+   StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % cascades]
+
+# Tagging information (in addition to that already requested by usual algorithms)
+AllVariables += ["GSFTrackParticles", "MuonSpectrometerTrackParticles" ] 
+
+
+
+# Added by ASC
+# Truth information for MC only
+if isSimulation:
+    AllVariables += ["TruthEvents","TruthParticles","TruthVertices","MuonTruthParticles"]
+
+AllVariables = list(set(AllVariables)) # remove duplicates
+
+BPHY10SlimmingHelper.AllVariables = AllVariables
+BPHY10SlimmingHelper.StaticContent = StaticContent
+BPHY10SlimmingHelper.SmartCollections = []
+
+BPHY10SlimmingHelper.AppendContentToStream(BPHY10Stream)
+
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY11.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY11.py
new file mode 100644
index 000000000000..a0ea555b5e45
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY11.py
@@ -0,0 +1,506 @@
+#====================================================================
+# BPHY11.py
+# Lambda_b -> J/psi p K 
+# It requires the reductionConf flag BPHY11 in Reco_tf.py   
+#====================================================================
+
+# Set up common services and job object. 
+# This should appear in ALL derivation job options
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+print(isSimulation)
+
+
+#====================================================================
+# AUGMENTATION TOOLS 
+#====================================================================
+## 1/ setup vertexing tools and services
+#include( "JpsiUpsilonTools/configureServices.py" )
+
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY11_VertexTools = BPHYVertexTools("BPHY11")
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__AugOriginalCounts
+BPHY11_AugOriginalCounts = DerivationFramework__AugOriginalCounts(
+    name             = "BPHY11_AugOriginalCounts",
+    VertexContainer  = "PrimaryVertices",
+    TrackContainer   = "InDetTrackParticles" 
+)
+    
+ToolSvc += BPHY11_AugOriginalCounts
+
+
+#--------------------------------------------------------------------
+## 2/ setup JpsiFinder tool
+##    These are general tools independent of DerivationFramework that do the 
+##    actual vertex fitting and some pre-selection.
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder
+BPHY11_JpsiFinder = Analysis__JpsiFinder(
+    name                        = "BPHY11_JpsiFinder",
+    OutputLevel                 = INFO,
+    muAndMu                     = True,
+    muAndTrack                  = False,
+    TrackAndTrack               = False,
+    assumeDiMuons               = True, 
+    invMassUpper                = 3600.0,
+    invMassLower                = 2600.0,
+    Chi2Cut                     = 30.0,
+    oppChargesOnly	        = False,
+    allChargeCombinations	= True,
+    combOnly		        = False,
+    atLeastOneComb              = True,
+    useCombinedMeasurement      = False, # Only takes effect if combOnly=True	
+    muonCollectionKey           = "Muons",
+    TrackParticleCollection     = "InDetTrackParticles",
+    V0VertexFitterTool          = BPHY11_VertexTools.TrkV0Fitter,             # V0 vertex fitter
+    useV0Fitter                 = False,                   # if False a TrkVertexFitterTool will be used
+    TrkVertexFitterTool         = BPHY11_VertexTools.TrkVKalVrtFitter,        # VKalVrt vertex fitter
+    TrackSelectorTool           = BPHY11_VertexTools.InDetTrackSelectorTool,
+    VertexPointEstimator        = BPHY11_VertexTools.VtxPointEstimator,
+    useMCPCuts                  = False
+)
+
+ToolSvc += BPHY11_JpsiFinder
+print(BPHY11_JpsiFinder)
+
+#--------------------------------------------------------------------
+## 3/ setup the vertex reconstruction "call" tool(s). They are part of the derivation framework.
+##    These Augmentation tools add output vertex collection(s) into the StoreGate and add basic 
+##    decorations which do not depend on the vertex mass hypothesis (e.g. lxy, ptError, etc).
+##    There should be one tool per topology, i.e. Jpsi and Psi(2S) do not need two instance of the
+##    Reco tool is the JpsiFinder mass window is wide enough.
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY11_JpsiSelectAndWrite = DerivationFramework__Reco_Vertex(
+    name                   = "BPHY11_JpsiSelectAndWrite",
+    VertexSearchTool             = BPHY11_JpsiFinder,
+    OutputVtxContainerName = "BPHY11_JpsiCandidates",
+    PVContainerName        = "PrimaryVertices",
+    RefPVContainerName     = "SHOULDNOTBEUSED",
+    DoVertexType           = 1
+)
+
+ToolSvc += BPHY11_JpsiSelectAndWrite
+print(BPHY11_JpsiSelectAndWrite)
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+
+## a/ augment and select Jpsi->mumu candidates
+BPHY11_Select_Jpsi2mumu = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY11_Select_Jpsi2mumu",
+  HypothesisName        = "Jpsi",
+  InputVtxContainerName = "BPHY11_JpsiCandidates",
+  VtxMassHypo           = 3096.900,
+  MassMin               = 2600.0,
+  MassMax               = 3600.0,
+  Chi2Max               = 30.0,
+  DoVertexType          = 1
+)
+
+ToolSvc += BPHY11_Select_Jpsi2mumu
+print(BPHY11_Select_Jpsi2mumu)
+
+
+## 4/ setup a new vertexing tool (necessary due to use of mass constraint) 
+from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+LbJpsipKVertexFit = Trk__TrkVKalVrtFitter(
+    name                = "LbJpsipKVertexFit",
+    Extrapolator        = BPHY11_VertexTools.InDetExtrapolator,
+    FirstMeasuredPoint  = False,
+    MakeExtendedVertex  = True,
+    usePassWithTrkErrCnst = True
+)
+
+ToolSvc += LbJpsipKVertexFit
+print(LbJpsipKVertexFit)
+
+
+## 5/ setup the Jpsi+2 track finder
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiPlus2Tracks
+BPHY11_LbJpsipK = Analysis__JpsiPlus2Tracks(
+  name                      = "BPHY11_LbJpsipK",
+  OutputLevel               = INFO,
+  kaonkaonHypothesis	    = False,
+  pionpionHypothesis        = False,
+  kaonpionHypothesis        = False,
+  kaonprotonHypothesis      = True,
+  oppChargesOnly            = False,
+  trkThresholdPt	    = 1500.0,
+  trkMaxEta		    = 3.0,
+  BMassUpper		    = 6500.0,
+  BMassLower		    = 4000.0,
+#  DiTrackMassUpper          = 10000.,
+  DiTrackMassLower          = 1000.,
+  Chi2Cut                   = 200.0,
+  TrkQuadrupletMassUpper    = 7000.0,
+  TrkQuadrupletMassLower    = 4000.0,
+  JpsiContainerKey	    = "BPHY11_JpsiCandidates",
+  TrackParticleCollection   = "InDetTrackParticles",
+  MuonsUsedInJpsi	    = "Muons",
+  TrkVertexFitterTool	    = LbJpsipKVertexFit,
+  TrackSelectorTool	    = BPHY11_VertexTools.InDetTrackSelectorTool,
+  UseMassConstraint	    = True,
+  UseVertexFittingWithPV    = True,
+  VertexContainer           = "PrimaryVertices"
+)
+        
+ToolSvc += BPHY11_LbJpsipK
+print(BPHY11_LbJpsipK)    
+
+## 6/ setup the combined augmentation/skimming tool for the Bpm
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex	
+BPHY11_LbJpsipKSelectAndWrite = DerivationFramework__Reco_Vertex(
+  name                      = "BPHY11_LbJpsipKSelectAndWrite",
+  Jpsi2PlusTrackName        = BPHY11_LbJpsipK,
+  OutputVtxContainerName    = "LbJpsipKCandidates",
+  PVContainerName           = "PrimaryVertices",
+  RefPVContainerName        = "BPHY11_RefittedPrimaryVertices",
+  RefitPV                   = True,
+  MaxPVrefit                = 10000, 
+  DoVertexType              = 7
+)
+
+ToolSvc += BPHY11_LbJpsipKSelectAndWrite 
+print(BPHY11_LbJpsipKSelectAndWrite)
+
+## b/ augment and select Lb->JpsipK candidates
+BPHY11_Select_Lb2JpsipK = DerivationFramework__Select_onia2mumu(
+  name                      = "BPHY11_Select_Lb2JpsipK",
+  HypothesisName            = "Lb_pK",
+  InputVtxContainerName     = "LbJpsipKCandidates",
+  TrkMasses                 = [105.658, 105.658, 938.272, 493.677],
+  VtxMassHypo               = 5619.6,
+  MassMin                   = 4000.0,
+  MassMax                   = 6500.0,
+  Chi2Max                   = 200,
+  LxyMin                    = 0.3
+)
+
+ToolSvc += BPHY11_Select_Lb2JpsipK
+print(BPHY11_Select_Lb2JpsipK)
+
+
+## b/ augment and select Lb->JpsiKp candidates
+BPHY11_Select_Lb2JpsiKp = DerivationFramework__Select_onia2mumu(
+  name                      = "BPHY11_Select_Lb2JpsiKp",
+  HypothesisName            = "Lb_Kp",
+  InputVtxContainerName     = "LbJpsipKCandidates",
+  TrkMasses                 = [105.658, 105.658, 493.677, 938.272],
+  VtxMassHypo               = 5619.6,
+  MassMin                   = 4000.0,
+  MassMax                   = 6500.0,
+  Chi2Max                   = 200.0,
+  LxyMin                    = 0.3
+)
+
+ToolSvc += BPHY11_Select_Lb2JpsiKp
+print(BPHY11_Select_Lb2JpsiKp)
+
+#-------------------------------------------------------
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__ReVertex
+BPHY11_LbPlusTrk             = DerivationFramework__ReVertex(
+  name                       = "BPHY11_LbPlusTrk",
+  InputVtxContainerName      = "LbJpsipKCandidates",
+  HypothesisNames            = [ BPHY11_Select_Lb2JpsipK.HypothesisName, BPHY11_Select_Lb2JpsiKp.HypothesisName ],
+  TrackIndices               = [ 0, 1, 2, 3 ],
+  UseAdditionalTrack         = True,
+  UseMassConstraint          = True,
+  UseVertexFittingWithPV     = True,
+#  VertexMass                 = 5619.6,
+  SubVertexMass              = 3096.900,
+  MassInputParticles         = [ 105.658, 105.658, 139.57, 139.57, 139.57 ],
+  SubVertexTrackIndices      = [ 1, 2 ],
+  BMassUpper                 = 10000.0,
+  BMassLower                 = 4000.0,
+  Chi2Cut                    = 5.0,
+  TrkVertexFitterTool	     = LbJpsipKVertexFit,
+  OutputVtxContainerName     = "LbJpsipKTrkCandidates"
+)
+
+ToolSvc += BPHY11_LbPlusTrk
+print(BPHY11_LbPlusTrk)
+
+BPHY11_Select_LbPlusTrk     = DerivationFramework__Select_onia2mumu(
+  name                      = "BPHY11_Select_LbPlusTrk",
+  HypothesisName            = "LbPlusTrk",
+  InputVtxContainerName     = "LbJpsipKTrkCandidates",
+  TrkMasses                 = BPHY11_LbPlusTrk.MassInputParticles,
+  VtxMassHypo               = 5619.6,
+  MassMin                   = 4000.0,
+  MassMax                   = 10000.0,
+  Chi2Max                   = 50.0
+)
+
+ToolSvc += BPHY11_Select_LbPlusTrk
+print(BPHY11_Select_LbPlusTrk)
+
+#-------------------------------------------------------
+
+BPHY11_Lb_pK_ReFit           = DerivationFramework__ReVertex(
+  name                       = "BPHY11_Lb_pK_ReFit",
+  InputVtxContainerName      = "LbJpsipKCandidates",
+  HypothesisNames            = [ BPHY11_Select_Lb2JpsipK.HypothesisName ],
+  TrackIndices               = [ 0, 1, 2, 3 ],
+  UseMassConstraint          = True,
+  UseVertexFittingWithPV     = True,
+  VertexMass                 = 5619.6,
+  SubVertexMass              = 3096.900,
+  MassInputParticles         = [ 105.658, 105.658, 938.272, 493.677 ],
+  SubVertexTrackIndices      = [ 1, 2 ],
+  TrkVertexFitterTool	     = LbJpsipKVertexFit,
+  OutputVtxContainerName     = "LbJpsipKCandidatesReFit"
+)
+
+ToolSvc += BPHY11_Lb_pK_ReFit
+print(BPHY11_Lb_pK_ReFit)
+
+BPHY11_Select_Lb_pK_ReFit   = DerivationFramework__Select_onia2mumu(
+  name                      = "BPHY11_Select_Lb_pK_ReFit",
+  HypothesisName            = "Lb_pK_ReFit",
+  InputVtxContainerName     = "LbJpsipKCandidatesReFit",
+  TrkMasses                 = BPHY11_Lb_pK_ReFit.MassInputParticles,
+  VtxMassHypo               = 5619.6,
+  MassMin                   = 0.0,
+  MassMax                   = 1.0e10,
+  Chi2Max                   = 1.0e10
+)
+
+ToolSvc += BPHY11_Select_Lb_pK_ReFit
+print(BPHY11_Select_Lb_pK_ReFit)
+
+BPHY11_Lb_Kp_ReFit           = DerivationFramework__ReVertex(
+  name                       = "BPHY11_Lb_Kp_ReFit",
+  InputVtxContainerName      = "LbJpsipKCandidates",
+  HypothesisNames            = [ BPHY11_Select_Lb2JpsiKp.HypothesisName ],
+  TrackIndices               = [ 0, 1, 2, 3 ],
+  UseMassConstraint          = True,
+  UseVertexFittingWithPV     = True,
+  VertexMass                 = 5619.6,
+  SubVertexMass              = 3096.900,
+  MassInputParticles         = [ 105.658, 105.658, 493.677, 938.272 ],
+  SubVertexTrackIndices      = [ 1, 2 ],
+  TrkVertexFitterTool	     = LbJpsipKVertexFit,
+  OutputVtxContainerName     = "LbJpsiKpCandidatesReFit"
+)
+
+ToolSvc += BPHY11_Lb_Kp_ReFit
+print(BPHY11_Lb_Kp_ReFit)
+
+BPHY11_Select_Lb_Kp_ReFit   = DerivationFramework__Select_onia2mumu(
+  name                      = "BPHY11_Select_Lb_Kp_ReFit",
+  HypothesisName            = "Lb_Kp_ReFit",
+  InputVtxContainerName     = "LbJpsiKpCandidatesReFit",
+  TrkMasses                 = BPHY11_Lb_Kp_ReFit.MassInputParticles,
+  VtxMassHypo               = 5619.6,
+  MassMin                   = 0.0,
+  MassMax                   = 1.0e10,
+  Chi2Max                   = 1.0e10
+)
+
+ToolSvc += BPHY11_Select_Lb_Kp_ReFit
+print(BPHY11_Select_Lb_Kp_ReFit)
+  
+
+
+#from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__SelectEvent
+
+if not isSimulation: #Only Skim Data
+   from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+   BPHY11_SelectLdJpsipKEvent = DerivationFramework__xAODStringSkimmingTool(
+     name        = "BPHY11_SelectLdJpsipKEvent",
+     expression  = "count(LbJpsipKCandidates.passed_Lb_pK > 0) > 0"
+   )
+                                                    
+   ToolSvc += BPHY11_SelectLdJpsipKEvent
+   print(BPHY11_SelectLdJpsipKEvent)
+
+   BPHY11_SelectLdJpsiKpEvent = DerivationFramework__xAODStringSkimmingTool(
+     name        = "BPHY11_SelectLdJpsiKpEvent",
+     expression  = "count(LbJpsipKCandidates.passed_Lb_Kp > 0) > 0"
+   )
+                                                    
+   ToolSvc += BPHY11_SelectLdJpsiKpEvent
+   print(BPHY11_SelectLdJpsiKpEvent)
+
+   #====================================================================
+   # Make event selection based on an OR of the input skimming tools
+   #====================================================================
+
+   from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__FilterCombinationOR
+   BPHY11_SkimmingOR = CfgMgr.DerivationFramework__FilterCombinationOR(
+     "BPHY11_SkimmingOR",
+     FilterList = [BPHY11_SelectLdJpsipKEvent,BPHY11_SelectLdJpsiKpEvent],)
+     
+   ToolSvc += BPHY11_SkimmingOR
+   print(BPHY11_SkimmingOR)
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxTrk
+BPHY11_thinningTool_Tracks = DerivationFramework__Thin_vtxTrk(
+  name                       = "BPHY11_thinningTool_Tracks",
+  TrackParticleContainerName = "InDetTrackParticles",
+  VertexContainerNames       = ["LbJpsipKCandidates"],
+  PassFlags                  = ["passed_Lb_pK","passed_Lb_Kp"] 
+)
+
+ToolSvc += BPHY11_thinningTool_Tracks
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__BPhysPVThinningTool
+BPHY11_thinningTool_PV = DerivationFramework__BPhysPVThinningTool(
+  name                       = "BPHY11_thinningTool_PV",
+  CandidateCollections       = ["LbJpsipKCandidates"],
+  KeepPVTracks               = True
+)
+
+ToolSvc += BPHY11_thinningTool_PV
+
+
+## b) thinning out tracks that are not attached to muons. The final thinning decision is based on the OR operation
+##    between decision from this and the previous tools.
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__MuonTrackParticleThinning
+BPHY11_MuonTPThinningTool = DerivationFramework__MuonTrackParticleThinning(
+  name                       = "BPHY11_MuonTPThinningTool",
+  MuonKey                    = "Muons",
+  InDetTrackParticlesKey     = "InDetTrackParticles"
+)
+  
+ToolSvc += BPHY11_MuonTPThinningTool
+
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__EgammaTrackParticleThinning
+BPHY11_ElectronTPThinningTool = DerivationFramework__EgammaTrackParticleThinning(
+  name                       = "BPHY11_ElectronTPThinningTool",
+  SGKey                      = "Electrons",
+  GSFTrackParticlesKey       = "GSFTrackParticles",
+  InDetTrackParticlesKey     = "InDetTrackParticles",
+  SelectionString            = "",
+  BestMatchOnly              = True,
+  ConeSize                   = 0.3,
+  ApplyAnd                   = False
+)
+
+ToolSvc+=BPHY11_ElectronTPThinningTool
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS  
+#====================================================================
+
+BPHY11_ThiningCollection = [BPHY11_thinningTool_Tracks, 
+                            BPHY11_thinningTool_PV, 
+                            BPHY11_MuonTPThinningTool, 
+                            BPHY11_ElectronTPThinningTool] 
+print(BPHY11_ThiningCollection)
+
+
+# The name of the kernel (BPHY11_Kernel in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+DerivationFrameworkJob += CfgMgr.DerivationFramework__DerivationKernel(
+    "BPHY11_Kernel",
+    AugmentationTools = [BPHY11_JpsiSelectAndWrite,     BPHY11_Select_Jpsi2mumu,
+                         BPHY11_LbJpsipKSelectAndWrite, BPHY11_Select_Lb2JpsipK, BPHY11_Select_Lb2JpsiKp,
+                         BPHY11_LbPlusTrk, BPHY11_Select_LbPlusTrk,
+                         BPHY11_Lb_pK_ReFit, BPHY11_Select_Lb_pK_ReFit,
+                         BPHY11_Lb_Kp_ReFit, BPHY11_Select_Lb_Kp_ReFit,
+                         BPHY11_AugOriginalCounts],
+    #Only skim if not MC
+    SkimmingTools     = [BPHY11_SkimmingOR] if not isSimulation else [],
+    ThinningTools     = BPHY11_ThiningCollection
+)
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+streamName    = derivationFlags.WriteDAOD_BPHY11Stream.StreamName
+fileName      = buildFileName( derivationFlags.WriteDAOD_BPHY11Stream )
+BPHY11Stream  = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY11Stream.AcceptAlgs(["BPHY11_Kernel"])
+
+# Special lines for thinning
+# Thinning service name must match the one passed to the thinning tools
+from AthenaServices.Configurables import ThinningSvc, createThinningSvc
+augStream = MSMgr.GetStream( streamName )
+evtStream = augStream.GetEventStream()
+
+BPHY11_ThinningSvc = createThinningSvc( svcName="BPHY11_ThinningSvc", outStreams=[evtStream] )
+svcMgr += BPHY11_ThinningSvc
+
+#====================================================================
+# Slimming 
+#====================================================================
+
+# Added by ASC
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY11_SlimmingHelper = SlimmingHelper("BPHY11_SlimmingHelper")
+AllVariables  = []
+StaticContent = []
+
+# Needed for trigger objects
+BPHY11_SlimmingHelper.IncludeMuonTriggerContent  = TRUE
+BPHY11_SlimmingHelper.IncludeBPhysTriggerContent = TRUE
+
+## primary vertices
+AllVariables  += ["PrimaryVertices"]
+StaticContent += ["xAOD::VertexContainer#BPHY11_RefittedPrimaryVertices"]
+StaticContent += ["xAOD::VertexAuxContainer#BPHY11_RefittedPrimaryVerticesAux."]
+
+## ID track particles
+AllVariables += ["InDetTrackParticles"]
+
+## combined / extrapolated muon track particles 
+## (note: for tagged muons there is no extra TrackParticle collection since the ID tracks
+##        are store in InDetTrackParticles collection)
+AllVariables += ["CombinedMuonTrackParticles"]
+AllVariables += ["ExtrapolatedMuonTrackParticles"]
+
+## muon container
+AllVariables += ["Muons"] 
+
+## Jpsi candidates 
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY11_JpsiSelectAndWrite.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY11_JpsiSelectAndWrite.OutputVtxContainerName]
+
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY11_LbJpsipKSelectAndWrite.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY11_LbJpsipKSelectAndWrite.OutputVtxContainerName]
+
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY11_LbPlusTrk.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY11_LbPlusTrk.OutputVtxContainerName]
+
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY11_Lb_pK_ReFit.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY11_Lb_pK_ReFit.OutputVtxContainerName]
+
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY11_Lb_Kp_ReFit.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY11_Lb_Kp_ReFit.OutputVtxContainerName]
+
+
+
+# Tagging information (in addition to that already requested by usual algorithms)
+#AllVariables += ["Electrons"] 
+AllVariables += ["GSFTrackParticles"] 
+tagJetCollections = ['AntiKt4LCTopoJets']
+
+for jet_collection in tagJetCollections:
+    AllVariables += [jet_collection]
+    AllVariables += ["BTagging_%s"       % (jet_collection[:-4]) ]
+    AllVariables += ["BTagging_%sJFVtx"  % (jet_collection[:-4]) ]
+    AllVariables += ["BTagging_%sSecVtx" % (jet_collection[:-4]) ]
+
+
+
+
+# Added by ASC
+# Truth information for MC only
+if isSimulation:
+    AllVariables += ["TruthEvents","TruthParticles","TruthVertices","MuonTruthParticles"]
+    AllVariables += ["AntiKt4TruthJets","egammaTruthParticles"]
+
+BPHY11_SlimmingHelper.AllVariables = AllVariables
+BPHY11_SlimmingHelper.StaticContent = StaticContent
+BPHY11_SlimmingHelper.SmartCollections = ["Electrons" , "Photons"]
+
+BPHY11_SlimmingHelper.AppendContentToStream(BPHY11Stream)
+
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY12.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY12.py
new file mode 100644
index 000000000000..90f52acbc565
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY12.py
@@ -0,0 +1,389 @@
+#====================================================================
+# BPHY12.py
+# This an example job options script showing how to set up a 
+# derivation of the data using the derivation framework.  
+# It requires the reductionConf flag BPHY12 in Reco_tf.py   
+#====================================================================
+
+#====================================================================
+# FLAGS TO PERSONALIZE THE DERIVATION
+#====================================================================
+
+skimTruth = False
+
+# Set up common services and job object. 
+# This should appear in ALL derivation job options
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+print('is this simulation? ', isSimulation)
+
+#====================================================================
+# AUGMENTATION TOOLS 
+#====================================================================
+## 1/ setup vertexing tools and services
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY12_VertexTools = BPHYVertexTools("BPHY12")
+
+print('********************** VERTEX TOOLS ***********************')
+print(BPHY12_VertexTools)
+print(BPHY12_VertexTools.TrkV0Fitter)
+print('********************** END VERTEX TOOLS ***********************')
+
+#====================================================================
+# TriggerCounting for Kernel1 #Added by Matteo
+#====================================================================
+#List of trigggers to be counted (high Sig-eff*Lumi ones are in)
+triggersToMetadata= [
+"HLT_mu11_mu6_bBmumuxv2",
+"HLT_2mu10_bBmumuxv2",
+"HLT_2mu6_bBmumuxv2_L1LFV-MU6",
+"HLT_mu11_mu6_bBmumux_BpmumuKp",
+"HLT_2mu6_bBmumux_BpmumuKp_L1BPH-2M9-2MU6_BPH-2DR15-2MU6",
+
+"HLT_mu11_mu6_bDimu",
+"HLT_4mu4_bDimu6000"
+              ]
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__TriggerCountToMetadata
+BPHY12TriggerCountToMetadata = DerivationFramework__TriggerCountToMetadata(name = "BPHY12TriggerCount",
+                                                                          TriggerList = triggersToMetadata,
+                                                                          FolderName = "BPHY12")
+
+ToolSvc += BPHY12TriggerCountToMetadata
+
+#====================================================================
+# PRESELECTION for Kernel1 #Added by Matteo
+#====================================================================
+## 1/ Setup the skimming based on triggers
+##     
+
+triggerList = [
+"HLT_mu11_mu6_bBmumuxv2",
+"HLT_2mu10_bBmumuxv2",
+"HLT_2mu6_bBmumuxv2_L1LFV-MU6",
+"HLT_mu11_mu6_bBmumux_BpmumuKp",
+"HLT_2mu6_bBmumux_BpmumuKp_L1BPH-2M9-2MU6_BPH-2DR15-2MU6",
+"HLT_mu11_mu6_bDimu",
+"HLT_4mu4_bDimu6000"
+              ]
+
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__TriggerSkimmingTool
+BPHY12TriggerSkim = DerivationFramework__TriggerSkimmingTool(name = "BPHY12TriggerSkim",
+                                                            TriggerListOR = triggerList,
+                                                            TriggerListAND = [] )
+
+ToolSvc += BPHY12TriggerSkim
+
+#--------------------------------------------------------------------
+## 2/ Setup the vertex fitter tools (e.g. JpsiFinder, JpsiPlus1Track, etc).
+##    These are general tools independent of DerivationFramework that do the 
+##    actual vertex fitting and some pre-selection.
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder
+BPHY12DiMuonFinder = Analysis__JpsiFinder(
+    name                        = "BPHY12DiMuonFinder",
+    OutputLevel                 = INFO,
+    muAndMu                     = True,
+    muAndTrack                  = False,
+    TrackAndTrack               = False,
+    assumeDiMuons               = True,    # If true, will assume dimu hypothesis and use PDG value for mu mass
+    invMassUpper                = 100000.0,
+    invMassLower                = 0.0,
+    Chi2Cut                     = 200.,
+    oppChargesOnly	        = True,
+    atLeastOneComb              = True,
+    useCombinedMeasurement      = False, # Only takes effect if combOnly=True	
+    muonCollectionKey           = "Muons",
+    TrackParticleCollection     = "InDetTrackParticles",
+    V0VertexFitterTool          = BPHY12_VertexTools.TrkV0Fitter, # V0 vertex fitter
+    useV0Fitter                 = False, # if False a TrkVertexFitterTool will be used
+    TrkVertexFitterTool         = BPHY12_VertexTools.TrkVKalVrtFitter, # VKalVrt vertex fitter
+    TrackSelectorTool           = BPHY12_VertexTools.InDetTrackSelectorTool,
+    VertexPointEstimator        = BPHY12_VertexTools.VtxPointEstimator,
+    useMCPCuts                  = False )
+
+ToolSvc += BPHY12DiMuonFinder
+print(BPHY12DiMuonFinder)
+
+#--------------------------------------------------------------------
+## 3/ setup the vertex reconstruction "call" tool(s). They are part of the derivation framework.
+##    These Augmentation tools add output vertex collection(s) into the StoreGate and add basic 
+##    decorations which do not depend on the vertex mass hypothesis (e.g. lxy, ptError, etc).
+##    There should be one tool per topology, i.e. Jpsi and Psi(2S) do not need two instance of the
+##    Reco tool is the JpsiFinder mass window is wide enough.
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY12_Reco_DiMuon = DerivationFramework__Reco_Vertex(
+  name                   = "BPHY12_Reco_DiMuon",
+  VertexSearchTool             = BPHY12DiMuonFinder,
+  OutputVtxContainerName = "BPHY12DiMuonCandidates",
+  PVContainerName        = "PrimaryVertices",
+  RefPVContainerName     = "BPHY12RefittedPrimaryVertices",
+  RefitPV                = True,
+  MaxPVrefit             = 100000,
+  DoVertexType           = 7)
+  
+ToolSvc += BPHY12_Reco_DiMuon
+print(BPHY12_Reco_DiMuon)
+
+#--------------------------------------------------------------------
+## 4/ setup the vertex selection and augmentation tool(s). These tools decorate the vertices with
+##    variables that depend on the vertex mass hypothesis, e.g. invariant mass, proper decay time, etc.
+##    Property HypothesisName is used as a prefix for these decorations.
+##    They also perform tighter selection, flagging the vertecis that passed. The flag is a Char_t branch
+##    named "passed_"+HypothesisName. It is used later by the "SelectEvent" and "Thin_vtxTrk" tools
+##    to determine which events and candidates should be kept in the output stream.
+##    Multiple instances of the Select_* tools can be used on a single input collection as long as they 
+##    use different "HypothesisName" flags.
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+
+## a/ augment and select Jpsi->mumu candidates
+BPHY12_Select_DiMuons = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY12_Select_DiMuons",
+  HypothesisName        = "Jpsi",
+  InputVtxContainerName = "BPHY12DiMuonCandidates",
+  VtxMassHypo           = 3096.916,
+  MassMin               = 1.0,
+  MassMax               = 7000.0,
+  Chi2Max               = 200.,
+  DoVertexType          = 7)
+  
+ToolSvc += BPHY12_Select_DiMuons
+print(BPHY12_Select_DiMuons)
+
+## 4/ setup a new vertexing tool (necessary due to use of mass constraint)
+from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+BmumuKstVertexFit = Trk__TrkVKalVrtFitter(
+    name                = "BmumuKstVertexFit",
+    Extrapolator        = BPHY12_VertexTools.InDetExtrapolator,
+    FirstMeasuredPoint  = True,
+    MakeExtendedVertex  = True)
+
+ToolSvc += BmumuKstVertexFit
+print(BmumuKstVertexFit)
+
+## 5/ setup the Jpsi+2 track finder
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiPlus2Tracks
+BPHY12BmumuKstFinder = Analysis__JpsiPlus2Tracks(
+    name                    = "BPHY12BmumuKstFinder",
+    OutputLevel             = INFO, #can also be DEBUG, WARNING, VERBOSE
+    kaonkaonHypothesis      = False,
+    pionpionHypothesis      = False,
+    kaonpionHypothesis      = True,
+    trkThresholdPt          = 500.0, #minimum track pT in MeV
+    trkMaxEta               = 3.0, 
+    BThresholdPt            = 1000.,
+    BMassLower              = 3000.0, #OI makes no sense below Jpsi mass #same values as BPHY18 (original) - Bs->JpsiKK
+    BMassUpper              = 6500.0,
+    JpsiContainerKey        = "BPHY12DiMuonCandidates",
+    TrackParticleCollection = "InDetTrackParticles",
+    #MuonsUsedInJpsi         = "Muons", #Don't remove all muons, just those in J/psi candidate (see the following cut)
+    ExcludeCrossJpsiTracks  = False,   #setting this to False rejects the muons from J/psi candidate
+    TrkVertexFitterTool     = BmumuKstVertexFit,
+    TrackSelectorTool       = BPHY12_VertexTools.InDetTrackSelectorTool,
+    UseMassConstraint       = False, #Set to True, according to Bs->JpsiKK DAOD
+    DiTrackMassUpper        = 1110., #OI was 1500. Can eventually set these to be the K* mass?
+    DiTrackMassLower        = 690.,  #OI was 500
+    Chi2Cut                 = 15., #THIS IS CHI2/NDOF, checked the code!!!
+    DiTrackPt               = 500.,
+    TrkQuadrupletMassLower  = 1000.0, #Two electrons + two tracks (one K, one pi)
+    TrkQuadrupletMassUpper  = 100000.0, # same as BPHY18, original
+    #FinalDiTrackMassUpper   = 1000.,
+    #FinalDiTrackMassLower   = 800.,
+    #TrkDeltaZ               = 20., #Normally, this cut should not be used since it is lifetime-dependent
+    FinalDiTrackPt          = 500.,
+#OI    DoElectrons = True,
+    #UseGSFTrackIndices      = [0,1]
+    )
+
+ToolSvc += BPHY12BmumuKstFinder
+print(BPHY12BmumuKstFinder)   
+## 6/ setup the combined augmentation/skimming tool for the BeeKst
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex  
+BPHY12_Reco_BmumuKst  = DerivationFramework__Reco_Vertex(
+    name                   = "BPHY12_Reco_BmumuKst",
+    Jpsi2PlusTrackName     = BPHY12BmumuKstFinder,
+    OutputVtxContainerName = "BPHY12BmumuKstCandidates",
+    PVContainerName        = "PrimaryVertices",
+    RefPVContainerName     = "BPHY12RefittedPrimaryVertices",
+    RefitPV                = True,
+    MaxPVrefit             = 10000,
+    DoVertexType = 7)
+
+ToolSvc += BPHY12_Reco_BmumuKst 
+print(BPHY12_Reco_BmumuKst)
+
+## b/ augment and select B->eeKst candidates
+#  set mass hypothesis (K pi)
+BPHY12_Select_BmumuKst = DerivationFramework__Select_onia2mumu(
+    name                       = "BPHY12_Select_BmumuKst",
+    HypothesisName             = "Bd", #creates output variable pass_Bd
+    InputVtxContainerName      = "BPHY12BmumuKstCandidates",
+    TrkMasses                  = [105.658, 105.658, 493.677, 139.570],
+    VtxMassHypo                = 5279.6, #mass of B
+    MassMin                    = 1.0,      #no mass cuts here
+    MassMax                    = 10000.0,   #no mass cuts here
+    Chi2Max                    = 30.0) #THIS IS CHI2! NOT CHI2/NDOF! Careful!
+
+ToolSvc += BPHY12_Select_BmumuKst
+print(BPHY12_Select_BmumuKst)
+
+#--------------------------------------------------------------------
+## 5/ select the event. We only want to keep events that contain certain vertices which passed certain selection.
+##    This is specified by the "SelectionExpression" property, which contains the expression in the following format:
+##
+##       "ContainerName.passed_HypoName > count"
+##
+##    where "ContainerName" is output container form some Reco_* tool, "HypoName" is the hypothesis name setup in some "Select_*"
+##    tool and "count" is the number of candidates passing the selection you want to keep. 
+
+if skimTruth or not isSimulation: #Only Skim Data
+    expression = "count(BPHY12BmumuKstCandidates.passed_Bd) > 0"
+    from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+    BPHY12_SelectEvent = DerivationFramework__xAODStringSkimmingTool(name = "BPHY12_SelectEvent",
+                                                                expression = expression)
+    ToolSvc += BPHY12_SelectEvent
+    print(BPHY12_SelectEvent)
+
+    #====================================================================
+    # Make event selection based on an OR of the input skimming tools (though it seems we only have one here!)
+    #====================================================================
+    from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__FilterCombinationOR
+    BPHY12SkimmingOR = CfgMgr.DerivationFramework__FilterCombinationOR(
+        name       = "BPHY12SkimmingOR",
+        FilterList = [BPHY12_SelectEvent, BPHY12TriggerSkim]) #OR of all your different filters
+    ToolSvc += BPHY12SkimmingOR
+    print(BPHY12SkimmingOR)
+
+#--------------------------------------------------------------------
+## 6/ track and vertex thinning. We want to remove all reconstructed secondary vertices
+##    which hasn't passed any of the selections defined by (Select_*) tools.
+##    We also want to keep only tracks which are associates with either muons or any of the
+##    vertices that passed the selection. Multiple thinning tools can perform the 
+##    selection. The final thinning decision is based OR of all the decisions (by default,
+##    although it can be changed by the JO).
+
+## a) thining out vertices that didn't pass any selection and idetifying tracks associated with 
+##    selected vertices. The "VertexContainerNames" is a list of the vertex containers, and "PassFlags"
+##    contains all pass flags for Select_* tools that must be satisfied. The vertex is kept is it 
+##    satisfy any of the listed selections.
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxTrk
+BPHY12Thin_vtxTrk = DerivationFramework__Thin_vtxTrk(
+  name                       = "BPHY12Thin_vtxTrk",
+  TrackParticleContainerName = "InDetTrackParticles",
+  VertexContainerNames       = ["BPHY12BmumuKstCandidates"],
+  PassFlags                  = ["passed_Bd"] )
+
+ToolSvc += BPHY12Thin_vtxTrk
+
+## b) thinning out tracks that are not attached to muons. The final thinning decision is based on the OR operation
+##    between decision from this and the previous tools.
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__MuonTrackParticleThinning
+BPHY12MuonTPThinningTool = DerivationFramework__MuonTrackParticleThinning(name                    = "BPHY12MuonTPThinningTool",
+                                                                         MuonKey                 = "Muons",
+                                                                         InDetTrackParticlesKey  = "InDetTrackParticles")
+ToolSvc += BPHY12MuonTPThinningTool
+
+# Added by ASC
+# Only save truth informtion directly associated with Onia
+from DerivationFrameworkMCTruth.DerivationFrameworkMCTruthConf import DerivationFramework__GenericTruthThinning
+BPHY12TruthThinTool = DerivationFramework__GenericTruthThinning(name                    = "BPHY12TruthThinTool",
+                                                        ParticleSelectionString = "TruthParticles.pdgId == 511 || TruthParticles.pdgId == -511 || TruthParticles.pdgId == 531 || TruthParticles.pdgId == -531",
+                                                        PreserveDescendants     = True,
+                                                        PreserveAncestors      = True)
+ToolSvc += BPHY12TruthThinTool
+print(BPHY12TruthThinTool)
+
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS  
+#====================================================================
+## 7/ IMPORTANT bit. Don't forget to pass the tools to the DerivationKernel! If you don't do that, they will not be 
+##    be executed!
+
+# Added by ASC
+BPHY12ThinningTools = [BPHY12Thin_vtxTrk, BPHY12MuonTPThinningTool]
+if globalflags.DataSource()=='geant4':
+    BPHY12ThinningTools.append(BPHY12TruthThinTool)
+
+# The name of the kernel (BPHY12Kernel in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+DerivationFrameworkJob += CfgMgr.DerivationFramework__DerivationKernel(
+  "BPHY12Kernel",
+   AugmentationTools = [BPHY12_Reco_DiMuon, BPHY12_Select_DiMuons,
+                        BPHY12_Reco_BmumuKst, BPHY12_Select_BmumuKst],
+   SkimmingTools     = [BPHY12SkimmingOR] if skimTruth or not isSimulation else [],
+   ThinningTools     = BPHY12ThinningTools
+   )
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+streamName = derivationFlags.WriteDAOD_BPHY12Stream.StreamName
+fileName   = buildFileName( derivationFlags.WriteDAOD_BPHY12Stream )
+BPHY12Stream = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY12Stream.AcceptAlgs(["BPHY12Kernel"])
+# Special lines for thinning
+# Thinning service name must match the one passed to the thinning tools
+from AthenaServices.Configurables import ThinningSvc, createThinningSvc
+augStream = MSMgr.GetStream( streamName )
+evtStream = augStream.GetEventStream()
+svcMgr += createThinningSvc( svcName="BPHY12ThinningSvc", outStreams=[evtStream] )
+
+
+#====================================================================
+# Slimming 
+#====================================================================
+
+# Added by ASC
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY12SlimmingHelper = SlimmingHelper("BPHY12SlimmingHelper")
+AllVariables = []
+StaticContent = []
+
+# Needed for trigger objects
+BPHY12SlimmingHelper.IncludeMuonTriggerContent = True
+BPHY12SlimmingHelper.IncludeBPhysTriggerContent = True
+
+## primary vertices
+AllVariables += ["PrimaryVertices"]
+StaticContent += ["xAOD::VertexContainer#BPHY12RefittedPrimaryVertices"]
+StaticContent += ["xAOD::VertexAuxContainer#BPHY12RefittedPrimaryVerticesAux."]
+
+## ID track particles
+AllVariables += ["InDetTrackParticles"]
+
+## combined / extrapolated muon track particles 
+## (note: for tagged muons there is no extra TrackParticle collection since the ID tracks
+##        are store in InDetTrackParticles collection)
+AllVariables += ["CombinedMuonTrackParticles"]
+AllVariables += ["ExtrapolatedMuonTrackParticles"]
+
+## muon container
+AllVariables += ["Muons"]
+
+## Jpsi candidates 
+StaticContent += ["xAOD::VertexContainer#%s"        % BPHY12_Reco_DiMuon.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY12_Reco_DiMuon.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY12_Reco_DiMuon.OutputVtxContainerName]
+
+StaticContent += ["xAOD::VertexContainer#%s"        % BPHY12_Reco_BmumuKst.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY12_Reco_BmumuKst.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY12_Reco_BmumuKst.OutputVtxContainerName]
+
+# Added by ASC
+# Truth information for MC only
+if isSimulation:
+    AllVariables += ["TruthEvents","TruthParticles","TruthVertices","MuonTruthParticles"]
+
+BPHY12SlimmingHelper.AllVariables = AllVariables
+BPHY12SlimmingHelper.StaticContent = StaticContent
+BPHY12SlimmingHelper.AppendContentToStream(BPHY12Stream)
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY13.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY13.py
new file mode 100644
index 000000000000..b0549a616181
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY13.py
@@ -0,0 +1,483 @@
+#====================================================================
+# BPHY13.py (Based on BPHY8, BPHY16, and the old BPHY13)
+# Contact: xin.chen@cern.ch
+#====================================================================
+
+# Set up common services and job object. 
+# This should appear in ALL derivation job options
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+print(isSimulation)
+
+#====================================================================
+# AUGMENTATION TOOLS 
+#====================================================================
+## 1/ setup vertexing tools and services
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY13_VertexTools = BPHYVertexTools("BPHY13")
+
+#--------------------------------------------------------------------
+## 2/ Setup the vertex fitter tools (e.g. JpsiFinder, JpsiPlus1Track, etc).
+##    These are general tools independent of DerivationFramework that do the 
+##    actual vertex fitting and some pre-selection.
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder
+BPHY13JpsiFinder = Analysis__JpsiFinder(
+    name                        = "BPHY13JpsiFinder",
+    OutputLevel                 = INFO,
+    muAndMu                     = True,
+    muAndTrack                  = False,
+    TrackAndTrack               = False,
+    assumeDiMuons               = True,  # If true, will assume dimu hypothesis and use PDG value for mu mass
+    trackThresholdPt            = 2500.,
+    invMassUpper                = 12500.,
+    invMassLower                = 2000.,
+    Chi2Cut                     = 200.,
+    oppChargesOnly	        = True,
+    atLeastOneComb              = True,
+    useCombinedMeasurement      = False, # Only takes effect if combOnly=True	
+    muonCollectionKey           = "Muons",
+    TrackParticleCollection     = "InDetTrackParticles",
+    V0VertexFitterTool          = BPHY13_VertexTools.TrkV0Fitter, # V0 vertex fitter
+    useV0Fitter                 = False, # if False a TrkVertexFitterTool will be used
+    TrkVertexFitterTool         = BPHY13_VertexTools.TrkVKalVrtFitter, # VKalVrt vertex fitter
+    TrackSelectorTool           = BPHY13_VertexTools.InDetTrackSelectorTool,
+    VertexPointEstimator        = BPHY13_VertexTools.VtxPointEstimator,
+    useMCPCuts                  = False )
+
+ToolSvc += BPHY13JpsiFinder
+print(BPHY13JpsiFinder)
+
+#--------------------------------------------------------------------
+## 3/ setup the vertex reconstruction "call" tool(s). They are part of the derivation framework.
+##    These Augmentation tools add output vertex collection(s) into the StoreGate and add basic 
+##    decorations which do not depend on the vertex mass hypothesis (e.g. lxy, ptError, etc).
+##    There should be one tool per topology, i.e. Jpsi and Psi(2S) do not need two instance of the
+##    Reco tool if the JpsiFinder mass window is wide enough.
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY13_Reco_mumu = DerivationFramework__Reco_Vertex(
+    name                   = "BPHY13_Reco_mumu",
+    VertexSearchTool             = BPHY13JpsiFinder,
+    OutputVtxContainerName = "BPHY13OniaCandidates",
+    PVContainerName        = "PrimaryVertices",
+    RefPVContainerName     = "SHOULDNOTBEUSED",
+#    RefPVContainerName     = "BPHY13RefittedPrimaryVertices",
+#    RefitPV                = True,
+#    MaxPVrefit             = 10000,
+#https://gitlab.cern.ch/atlas/athena/-/blob/21.2/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysPVTools.cxx#L259
+# bit pattern: doZ0BA|doZ0|doA0|doPt
+    DoVertexType           = 1)
+  
+ToolSvc += BPHY13_Reco_mumu
+print(BPHY13_Reco_mumu)
+
+## 4/ setup a new vertexing tool (necessary due to use of mass constraint) 
+from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+BPHY13VertexFit = Trk__TrkVKalVrtFitter(
+    name                = "BPHY13VertexFit",
+    Extrapolator        = BPHY13_VertexTools.InDetExtrapolator,
+#    FirstMeasuredPoint  = True,
+    FirstMeasuredPoint  = False,
+    MakeExtendedVertex  = True)
+ToolSvc += BPHY13VertexFit
+print(BPHY13VertexFit)
+
+## 5/ setup the Jpsi+2 track finder
+# https://gitlab.cern.ch/atlas/athena/-/blob/21.2/PhysicsAnalysis/JpsiUpsilonTools/src/JpsiPlus2Tracks.cxx
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiPlus2Tracks
+BPHY13Plus2Tracks = Analysis__JpsiPlus2Tracks(
+    name = "BPHY13Plus2Tracks",
+    #           OutputLevel = DEBUG,
+    kaonkaonHypothesis		        = False,
+    pionpionHypothesis                  = False,
+    kaonpionHypothesis                  = False,
+    ManualMassHypo                      = [ 105.658, 105.658, 105.658, 105.658 ],
+    trkThresholdPt			= 1500.,
+    trkMaxEta			        = 2.5,
+    oppChargesOnly                      = False,
+    DiTrackMassUpper                    = 12500.,
+    DiTrackMassLower                    = 2000.,
+    TrkQuadrupletMassUpper              = 25000.,
+    TrkQuadrupletMassLower              = 0.,
+    Chi2Cut                             = 200.,
+    JpsiContainerKey                    = "BPHY13OniaCandidates",
+    TrackParticleCollection             = "InDetTrackParticles",
+    MuonsUsedInJpsi			= "Muons",
+    ExcludeJpsiMuonsOnly                = True,
+    RequireNMuonTracks                  = 1,
+    TrkVertexFitterTool		        = BPHY13VertexFit,
+    TrackSelectorTool		        = BPHY13_VertexTools.InDetTrackSelectorTool,
+    UseMassConstraint		        = False)
+
+ToolSvc += BPHY13Plus2Tracks
+print(BPHY13Plus2Tracks)    
+
+## 6/ setup the combined augmentation/skimming tool
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex	
+BPHY13FourTrackSelectAndWrite = DerivationFramework__Reco_Vertex(
+    name                     = "BPHY13FourTrackSelectAndWrite",
+    Jpsi2PlusTrackName       = BPHY13Plus2Tracks,
+    OutputVtxContainerName   = "BPHY13FourTrack",
+    PVContainerName          = "PrimaryVertices",
+    RefPVContainerName       = "BPHY13RefittedPrimaryVertices",
+    RefitPV                  = True,
+    MaxPVrefit               = 10000,
+    DoVertexType             = 7)
+
+ToolSvc += BPHY13FourTrackSelectAndWrite 
+print(BPHY13FourTrackSelectAndWrite)
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+
+BPHY13_Select_FourTrack      = DerivationFramework__Select_onia2mumu(
+    name                       = "BPHY13_Select_FourTrack",
+    HypothesisName             = "FourTracks",
+    InputVtxContainerName      = "BPHY13FourTrack",
+    TrkMasses                  = [105.658, 105.658, 105.658, 105.658],
+    VtxMassHypo                = 6900.0, # for decay time
+    MassMin                    = 0.,
+    MassMax                    = 25000.,
+    Chi2Max                    = 200.)
+
+ToolSvc += BPHY13_Select_FourTrack
+print(BPHY13_Select_FourTrack)
+
+
+#====================================================================
+# Isolation
+#====================================================================
+
+#Track isolation for candidates
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__VertexTrackIsolation
+BPHY13TrackIsolationDecorator = DerivationFramework__VertexTrackIsolation(
+  name                            = "BPHY13TrackIsolationDecorator",
+  OutputLevel                     = INFO,
+  TrackIsoTool                    = "xAOD::TrackIsolationTool",
+  TrackContainer                  = "InDetTrackParticles",
+  InputVertexContainer            = "BPHY13FourTrack",
+  PassFlags                       = ["passed_FourTracks"],
+  DoIsoPerTrk                     = True,
+  RemoveDuplicate                 = 2
+)
+
+ToolSvc += BPHY13TrackIsolationDecorator
+print(BPHY13TrackIsolationDecorator)
+
+
+#====================================================================
+# Revertex with mass constraint
+#====================================================================
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__ReVertex
+BPHY13_Revertex_2mu            = DerivationFramework__ReVertex(
+    name                       = "BPHY13_Revertex_2mu",
+    InputVtxContainerName      = "BPHY13FourTrack",
+    TrackIndices               = [ 0, 1 ],
+    RefitPV                    = True,
+    RefPVContainerName         = "BPHY13RefittedPrimaryVertices", # use existing refitted PVs
+    UseMassConstraint          = True,
+    VertexMass                 = 3096.916,
+    MassInputParticles         = [105.658, 105.658],
+    TrkVertexFitterTool	       = BPHY13VertexFit,
+    OutputVtxContainerName     = "BPHY13TwoMuon")
+
+ToolSvc += BPHY13_Revertex_2mu
+print(BPHY13_Revertex_2mu)
+
+BPHY13_Select_TwoMuon          = DerivationFramework__Select_onia2mumu(
+    name                       = "BPHY13_Select_TwoMuon",
+    HypothesisName             = "TwoMuons",
+    InputVtxContainerName      = "BPHY13TwoMuon",
+    TrkMasses                  = [105.658, 105.658],
+    VtxMassHypo                = 3096.916,
+    MassMin                    = 2000.,
+    MassMax                    = 3600.,
+    Chi2Max                    = 200)
+
+ToolSvc += BPHY13_Select_TwoMuon
+print(BPHY13_Select_TwoMuon)
+
+BPHY13_Revertex_2trk           = DerivationFramework__ReVertex(
+    name                       = "BPHY13_Revertex_2trk",
+    InputVtxContainerName      = "BPHY13FourTrack",
+    TrackIndices               = [ 2, 3 ],
+    RefitPV                    = True,
+    RefPVContainerName         = "BPHY13RefittedPrimaryVertices", # use existing refitted PVs
+    UseMassConstraint          = True,
+    VertexMass                 = 3096.916,
+    MassInputParticles         = [105.658, 105.658],
+    TrkVertexFitterTool	       = BPHY13VertexFit,
+    OutputVtxContainerName     = "BPHY13TwoTrack")
+
+ToolSvc += BPHY13_Revertex_2trk
+print(BPHY13_Revertex_2trk)
+
+BPHY13_Select_TwoTrack         = DerivationFramework__Select_onia2mumu(
+    name                       = "BPHY13_Select_TwoTrack",
+    HypothesisName             = "TwoTracks",
+    InputVtxContainerName      = "BPHY13TwoTrack",
+    TrkMasses                  = [105.658, 105.658],
+    VtxMassHypo                = 3096.916,
+    MassMin                    = 2000.,
+    MassMax                    = 3600.,
+    Chi2Max                    = 200)
+
+ToolSvc += BPHY13_Select_TwoTrack
+print(BPHY13_Select_TwoTrack)
+
+
+BPHY13_Revertex_2muHi          = DerivationFramework__ReVertex(
+    name                       = "BPHY13_Revertex_2muHi",
+    InputVtxContainerName      = "BPHY13FourTrack",
+    TrackIndices               = [ 0, 1 ],
+    RefitPV                    = True,
+    RefPVContainerName         = "BPHY13RefittedPrimaryVertices", # use existing refitted PVs
+    UseMassConstraint          = True,
+    VertexMass                 = 9460.30,
+    MassInputParticles         = [105.658, 105.658],
+    TrkVertexFitterTool	       = BPHY13VertexFit,
+    OutputVtxContainerName     = "BPHY13TwoMuonHi")
+
+ToolSvc += BPHY13_Revertex_2muHi
+print(BPHY13_Revertex_2muHi)
+
+BPHY13_Select_TwoMuonHi        = DerivationFramework__Select_onia2mumu(
+    name                       = "BPHY13_Select_TwoMuonHi",
+    HypothesisName             = "TwoMuonsHi",
+    InputVtxContainerName      = "BPHY13TwoMuonHi",
+    TrkMasses                  = [105.658, 105.658],
+    VtxMassHypo                = 9460.30,
+    MassMin                    = 8500.,
+    MassMax                    = 11000.,
+    Chi2Max                    = 200)
+
+ToolSvc += BPHY13_Select_TwoMuonHi
+print(BPHY13_Select_TwoMuonHi)
+
+BPHY13_Revertex_2trkHi         = DerivationFramework__ReVertex(
+    name                       = "BPHY13_Revertex_2trkHi",
+    InputVtxContainerName      = "BPHY13FourTrack",
+    TrackIndices               = [ 2, 3 ],
+    RefitPV                    = True,
+    RefPVContainerName         = "BPHY13RefittedPrimaryVertices", # use existing refitted PVs
+    UseMassConstraint          = True,
+    VertexMass                 = 9460.30,
+    MassInputParticles         = [105.658, 105.658],
+    TrkVertexFitterTool	       = BPHY13VertexFit,
+    OutputVtxContainerName     = "BPHY13TwoTrackHi")
+
+ToolSvc += BPHY13_Revertex_2trkHi
+print(BPHY13_Revertex_2trkHi)
+
+BPHY13_Select_TwoTrackHi       = DerivationFramework__Select_onia2mumu(
+    name                       = "BPHY13_Select_TwoTrackHi",
+    HypothesisName             = "TwoTracksHi",
+    InputVtxContainerName      = "BPHY13TwoTrackHi",
+    TrkMasses                  = [105.658, 105.658],
+    VtxMassHypo                = 9460.30,
+    MassMin                    = 8500.,
+    MassMax                    = 11000.,
+    Chi2Max                    = 200)
+
+ToolSvc += BPHY13_Select_TwoTrackHi
+print(BPHY13_Select_TwoTrackHi)
+
+
+BPHY13_Revertex_2muMed         = DerivationFramework__ReVertex(
+    name                       = "BPHY13_Revertex_2muMed",
+    InputVtxContainerName      = "BPHY13FourTrack",
+    TrackIndices               = [ 0, 1 ],
+    RefitPV                    = True,
+    RefPVContainerName         = "BPHY13RefittedPrimaryVertices", # use existing refitted PVs
+    UseMassConstraint          = True,
+    VertexMass                 = 3686.10,
+    MassInputParticles         = [105.658, 105.658],
+    TrkVertexFitterTool	       = BPHY13VertexFit,
+    OutputVtxContainerName     = "BPHY13TwoMuonMed")
+
+ToolSvc += BPHY13_Revertex_2muMed
+print(BPHY13_Revertex_2muMed)
+
+BPHY13_Select_TwoMuonMed       = DerivationFramework__Select_onia2mumu(
+    name                       = "BPHY13_Select_TwoMuonMed",
+    HypothesisName             = "TwoMuonsMed",
+    InputVtxContainerName      = "BPHY13TwoMuonMed",
+    TrkMasses                  = [105.658, 105.658],
+    VtxMassHypo                = 3686.10,
+    MassMin                    = 3300.0,
+    MassMax                    = 4500.0,
+    Chi2Max                    = 200)
+
+ToolSvc += BPHY13_Select_TwoMuonMed
+print(BPHY13_Select_TwoMuonMed)
+
+BPHY13_Revertex_2trkMed        = DerivationFramework__ReVertex(
+    name                       = "BPHY13_Revertex_2trkMed",
+    InputVtxContainerName      = "BPHY13FourTrack",
+    TrackIndices               = [ 2, 3 ],
+    RefitPV                    = True,
+    RefPVContainerName         = "BPHY13RefittedPrimaryVertices", # use existing refitted PVs
+    UseMassConstraint          = True,
+    VertexMass                 = 3686.10,
+    MassInputParticles         = [105.658, 105.658],
+    TrkVertexFitterTool	       = BPHY13VertexFit,
+    OutputVtxContainerName     = "BPHY13TwoTrackMed")
+
+ToolSvc += BPHY13_Revertex_2trkMed
+print(BPHY13_Revertex_2trkMed)
+
+BPHY13_Select_TwoTrackMed      = DerivationFramework__Select_onia2mumu(
+    name                       = "BPHY13_Select_TwoTrackMed",
+    HypothesisName             = "TwoTracksMed",
+    InputVtxContainerName      = "BPHY13TwoTrackMed",
+    TrkMasses                  = [105.658, 105.658],
+    VtxMassHypo                = 3686.10,
+    MassMin                    = 3300.,
+    MassMax                    = 4500.,
+    Chi2Max                    = 200)
+
+ToolSvc += BPHY13_Select_TwoTrackMed
+print(BPHY13_Select_TwoTrackMed)
+
+#--------------------------------------------------------------------
+## 7/ select the event. We only want to keep events that contain certain vertices which passed certain selection.
+##    This is specified by the "SelectionExpression" property, which contains the expression in the following format:
+##
+##       "ContainerName.passed_HypoName > count"
+##
+##    where "ContainerName" is output container from some Reco_* tool, "HypoName" is the hypothesis name setup in some "Select_*"
+##    tool and "count" is the number of candidates passing the selection you want to keep. 
+
+#expression = "count(BPHY13FourTrack.passed_FourTracks) > 0"
+expression = "count(BPHY13FourTrack.passed_FourTracks) > 0 && ( count(BPHY13TwoMuon.passed_TwoMuons) + count(BPHY13TwoTrack.passed_TwoTracks) > 1 || count(BPHY13TwoMuonMed.passed_TwoMuonsMed) + count(BPHY13TwoTrackMed.passed_TwoTracksMed) > 1 || count(BPHY13TwoMuon.passed_TwoMuons) + count(BPHY13TwoTrackMed.passed_TwoTracksMed) > 1 || count(BPHY13TwoMuonMed.passed_TwoMuonsMed) + count(BPHY13TwoTrack.passed_TwoTracks) > 1 || count(BPHY13TwoMuonHi.passed_TwoMuonsHi) + count(BPHY13TwoTrackHi.passed_TwoTracksHi) > 0 )"
+
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+BPHY13_SelectEvent = DerivationFramework__xAODStringSkimmingTool(name = "BPHY13_SelectEvent",
+                                                                 expression = expression)
+ToolSvc += BPHY13_SelectEvent
+print(BPHY13_SelectEvent)
+
+#--------------------------------------------------------------------
+## 8/ track and vertex thinning. We want to remove all reconstructed secondary vertices
+##    which hasn't passed any of the selections defined by (Select_*) tools.
+##    We also want to keep only tracks which are associates with either muons or any of the
+##    vertices that passed the selection. Multiple thinning tools can perform the 
+##    selection. The final thinning decision is based OR of all the decisions (by default,
+##    although it can be changed by the JO).
+
+## a) thining out vertices that didn't pass any selection and idetifying tracks associated with 
+##    selected vertices. The "VertexContainerNames" is a list of the vertex containers, and "PassFlags"
+##    contains all pass flags for Select_* tools that must be satisfied. The vertex is kept is it 
+##    satisfy any of the listed selections.
+
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS  
+#====================================================================
+## 9/ IMPORTANT bit. Don't forget to pass the tools to the DerivationKernel! If you don't do that, they will not be 
+##    be executed!
+
+
+# The name of the kernel (BPHY13Kernel in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+DerivationFrameworkJob += CfgMgr.DerivationFramework__DerivationKernel(
+  "BPHY13Kernel",
+   AugmentationTools = [BPHY13_Reco_mumu, BPHY13FourTrackSelectAndWrite, BPHY13_Select_FourTrack, BPHY13TrackIsolationDecorator, BPHY13_Revertex_2mu, BPHY13_Select_TwoMuon, BPHY13_Revertex_2trk, BPHY13_Select_TwoTrack, BPHY13_Revertex_2muHi, BPHY13_Select_TwoMuonHi, BPHY13_Revertex_2trkHi, BPHY13_Select_TwoTrackHi, BPHY13_Revertex_2muMed, BPHY13_Select_TwoMuonMed, BPHY13_Revertex_2trkMed, BPHY13_Select_TwoTrackMed],
+   SkimmingTools     = [BPHY13_SelectEvent]
+   )
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+streamName = derivationFlags.WriteDAOD_BPHY13Stream.StreamName
+fileName   = buildFileName( derivationFlags.WriteDAOD_BPHY13Stream )
+BPHY13Stream = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY13Stream.AcceptAlgs(["BPHY13Kernel"])
+# Special lines for thinning
+# Thinning service name must match the one passed to the thinning tools
+from AthenaServices.Configurables import ThinningSvc, createThinningSvc
+augStream = MSMgr.GetStream( streamName )
+evtStream = augStream.GetEventStream()
+svcMgr += createThinningSvc( svcName="BPHY13ThinningSvc", outStreams=[evtStream] )
+
+
+#====================================================================
+# Slimming 
+#====================================================================
+
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY13SlimmingHelper = SlimmingHelper("BPHY13SlimmingHelper")
+BPHY13_AllVariables = []
+BPHY13_StaticContent = []
+
+# Needed for trigger objects
+BPHY13SlimmingHelper.IncludeMuonTriggerContent = True
+BPHY13SlimmingHelper.IncludeBPhysTriggerContent = True
+
+## primary vertices
+BPHY13_AllVariables += ["PrimaryVertices"]
+BPHY13_StaticContent += ["xAOD::VertexContainer#BPHY13RefittedPrimaryVertices"]
+BPHY13_StaticContent += ["xAOD::VertexAuxContainer#BPHY13RefittedPrimaryVerticesAux."]
+
+## ID track particles
+BPHY13_AllVariables += ["InDetTrackParticles"]
+
+## combined / extrapolated muon track particles 
+## (note: for tagged muons there is no extra TrackParticle collection since the ID tracks
+##        are store in InDetTrackParticles collection)
+BPHY13_AllVariables += ["CombinedMuonTrackParticles"]
+BPHY13_AllVariables += ["ExtrapolatedMuonTrackParticles"]
+
+## muon container
+BPHY13_AllVariables += ["Muons"]
+
+
+BPHY13_StaticContent += ["xAOD::VertexContainer#%s"        % BPHY13FourTrackSelectAndWrite.OutputVtxContainerName]
+BPHY13_StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY13FourTrackSelectAndWrite.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+BPHY13_StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY13FourTrackSelectAndWrite.OutputVtxContainerName]
+
+BPHY13_StaticContent += ["xAOD::VertexContainer#%s"        % BPHY13_Revertex_2mu.OutputVtxContainerName]
+BPHY13_StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY13_Revertex_2mu.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+BPHY13_StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY13_Revertex_2mu.OutputVtxContainerName]
+
+BPHY13_StaticContent += ["xAOD::VertexContainer#%s"        % BPHY13_Revertex_2trk.OutputVtxContainerName]
+BPHY13_StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY13_Revertex_2trk.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+BPHY13_StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY13_Revertex_2trk.OutputVtxContainerName]
+
+BPHY13_StaticContent += ["xAOD::VertexContainer#%s"        % BPHY13_Revertex_2muHi.OutputVtxContainerName]
+BPHY13_StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY13_Revertex_2muHi.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+BPHY13_StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY13_Revertex_2muHi.OutputVtxContainerName]
+
+BPHY13_StaticContent += ["xAOD::VertexContainer#%s"        % BPHY13_Revertex_2trkHi.OutputVtxContainerName]
+BPHY13_StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY13_Revertex_2trkHi.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+BPHY13_StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY13_Revertex_2trkHi.OutputVtxContainerName]
+
+BPHY13_StaticContent += ["xAOD::VertexContainer#%s"        % BPHY13_Revertex_2muMed.OutputVtxContainerName]
+BPHY13_StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY13_Revertex_2muMed.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+BPHY13_StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY13_Revertex_2muMed.OutputVtxContainerName]
+
+BPHY13_StaticContent += ["xAOD::VertexContainer#%s"        % BPHY13_Revertex_2trkMed.OutputVtxContainerName]
+BPHY13_StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY13_Revertex_2trkMed.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+BPHY13_StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY13_Revertex_2trkMed.OutputVtxContainerName]
+
+
+# Truth information for MC only
+if isSimulation:
+    BPHY13_AllVariables += ["TruthEvents","TruthParticles","TruthVertices","MuonTruthParticles"]
+
+BPHY13SlimmingHelper.AllVariables = BPHY13_AllVariables
+BPHY13SlimmingHelper.StaticContent = BPHY13_StaticContent
+BPHY13SlimmingHelper.AppendContentToStream(BPHY13Stream)
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY14.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY14.py
new file mode 100644
index 000000000000..411fe0b4a3c4
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY14.py
@@ -0,0 +1,329 @@
+#====================================================================
+# BPHY14.py
+# This an example job options script showing how to set up a
+# derivation of the data using the derivation framework.
+# It requires the reductionConf flag BPHY14 in Reco_tf.py
+#====================================================================
+
+# Set up common services and job object.
+# This should appear in ALL derivation job options
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+
+print(isSimulation)
+
+
+#====================================================================
+# AUGMENTATION TOOLS
+#====================================================================
+## 1/ setup vertexing tools and services
+#include( "JpsiUpsilonTools/configureServices.py" )
+
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY14_VertexTools = BPHYVertexTools("BPHY14")
+
+#--------------------------------------------------------------------
+## 2/ Setup the vertex fitter tools (e.g. JpsiFinder, JpsiPlus1Track, etc).
+##    These are general tools independent of DerivationFramework that do the
+##    actual vertex fitting and some pre-selection.
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder
+BPHY14JpsiFinder = Analysis__JpsiFinder(
+                                        name                        = "BPHY14JpsiFinder",
+                                        OutputLevel                 = INFO,
+                                        muAndMu                     = True,
+                                        muAndTrack                  = False,
+                                        TrackAndTrack               = False,
+                                        assumeDiMuons               = True,    # If true, will assume dimu hypothesis and use PDG value for mu mass
+                                        invMassUpper                = 15000.0,
+                                        invMassLower                = 2000.,
+                                        Chi2Cut                     = 200.,
+                                        muonThresholdPt             = 2500.,
+                                        oppChargesOnly              = True,
+                                        atLeastOneComb              = False,
+                                        combOnly                    = True,
+                                        useCombinedMeasurement      = False, # Only takes effect if combOnly=True
+                                        muonCollectionKey           = "Muons",
+                                        TrackParticleCollection     = "InDetTrackParticles",
+                                        V0VertexFitterTool          = BPHY14_VertexTools.TrkV0Fitter,             # V0 vertex fitter
+                                        useV0Fitter                 = False,                   # if False a TrkVertexFitterTool will be used
+                                        TrkVertexFitterTool         = BPHY14_VertexTools.TrkVKalVrtFitter,        # VKalVrt vertex fitter
+                                        TrackSelectorTool           = BPHY14_VertexTools.InDetTrackSelectorTool,
+                                        VertexPointEstimator        = BPHY14_VertexTools.VtxPointEstimator,
+                                        useMCPCuts                  = False )
+
+ToolSvc += BPHY14JpsiFinder
+print(BPHY14JpsiFinder)
+
+#--------------------------------------------------------------------
+## 3/ setup the vertex reconstruction "call" tool(s). They are part of the derivation framework.
+##    These Augmentation tools add output vertex collection(s) into the StoreGate and add basic
+##    decorations which do not depend on the vertex mass hypothesis (e.g. lxy, ptError, etc).
+##    There should be one tool per topology, i.e. Jpsi and Psi(2S) do not need two instance of the
+##    Reco tool is the JpsiFinder mass window is wide enough.
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY14_Reco_mumu = DerivationFramework__Reco_Vertex(
+                                                  name                   = "BPHY14_Reco_mumu",
+                                                  VertexSearchTool             = BPHY14JpsiFinder,
+                                                  OutputVtxContainerName = "BPHY14OniaCandidates",
+                                                  PVContainerName        = "PrimaryVertices",
+                                                  RefPVContainerName     = "BPHY14RefittedPrimaryVertices",
+                                                  RefitPV                = True,
+                                                  MaxPVrefit             = 100000,
+                                                  DoVertexType           = 7)
+
+ToolSvc += BPHY14_Reco_mumu
+print(BPHY14_Reco_mumu)
+
+#--------------------------------------------------------------------
+## 4/ setup the vertex selection and augmentation tool(s). These tools decorate the vertices with
+##    variables that depend on the vertex mass hypothesis, e.g. invariant mass, proper decay time, etc.
+##    Property HypothesisName is used as a prefix for these decorations.
+##    They also perform tighter selection, flagging the vertecis that passed. The flag is a Char_t branch
+##    named "passed_"+HypothesisName. It is used later by the "SelectEvent" and "Thin_vtxTrk" tools
+##    to determine which events and candidates should be kept in the output stream.
+##    Multiple instances of the Select_* tools can be used on a single input collection as long as they
+##    use different "HypothesisName" flags.
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+
+## a/ augment and select Jpsi->mumu candidates
+BPHY14_Select_Jpsi2mumu = DerivationFramework__Select_onia2mumu(
+                                                                name                  = "BPHY14_Select_Jpsi2mumu",
+                                                                HypothesisName        = "Jpsi",
+                                                                InputVtxContainerName = "BPHY14OniaCandidates",
+                                                                VtxMassHypo           = 3096.916,
+                                                                MassMin               = 2000.0,
+                                                                MassMax               = 3600.0,
+                                                                Chi2Max               = 200,
+                                                                DoVertexType          = 7)
+
+ToolSvc += BPHY14_Select_Jpsi2mumu
+print(BPHY14_Select_Jpsi2mumu)
+
+## b/ augment and select Psi(2S)->mumu candidates
+BPHY14_Select_Psi2mumu = DerivationFramework__Select_onia2mumu(
+                                                               name                  = "BPHY14_Select_Psi2mumu",
+                                                               HypothesisName        = "Psi",
+                                                               InputVtxContainerName = "BPHY14OniaCandidates",
+                                                               VtxMassHypo           = 3686.09,
+                                                               MassMin               = 3300.0,
+                                                               MassMax               = 4500.0,
+                                                               Chi2Max               = 200,
+                                                               DoVertexType          = 7)
+
+ToolSvc += BPHY14_Select_Psi2mumu
+print(BPHY14_Select_Psi2mumu)
+
+# Added by ASC
+## c/ augment and select Upsilon(nS)->mumu candidates
+BPHY14_Select_Upsi2mumu = DerivationFramework__Select_onia2mumu(
+                                                                name                  = "BPHY14_Select_Upsi2mumu",
+                                                                HypothesisName        = "Upsi",
+                                                                InputVtxContainerName = "BPHY14OniaCandidates",
+                                                                VtxMassHypo           = 9460.30,
+                                                                MassMin               = 7000.0,
+                                                                MassMax               = 12500.0,
+                                                                Chi2Max               = 200,
+                                                                DoVertexType          = 7)
+
+ToolSvc += BPHY14_Select_Upsi2mumu
+print(BPHY14_Select_Upsi2mumu)
+
+#--------------------------------------------------------------------
+## 5/ select the event. We only want to keep events that contain certain vertices which passed certain selection.
+##    This is specified by the "SelectionExpression" property, which contains the expression in the following format:
+##
+##       "ContainerName.passed_HypoName > count"
+##
+##    where "ContainerName" is output container form some Reco_* tool, "HypoName" is the hypothesis name setup in some "Select_*"
+##    tool and "count" is the number of candidates passing the selection you want to keep.
+
+#====================================================================
+# Photon things
+#====================================================================
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+from DerivationFrameworkInDet.InDetCommon import *
+from DerivationFrameworkMuons.MuonsCommon import *
+from DerivationFrameworkJetEtMiss.JetCommon import *
+from DerivationFrameworkJetEtMiss.METCommon import *
+from DerivationFrameworkEGamma.EGammaCommon import *
+
+#photonRequirements = '(DFCommonPhotons_et >= 5*GeV) && (abs(DFCommonPhotons_eta) < 2.6)'# && (Photons.Loose)'
+photonRequirements = 'DFCommonPhotons_et > 5*GeV'
+
+
+expression = "(count(BPHY14OniaCandidates.passed_Jpsi) > 0 || count(BPHY14OniaCandidates.passed_Psi) > 0 || count(BPHY14OniaCandidates.passed_Upsi) > 0) && count("+photonRequirements+") >0"
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+BPHY14_SelectEvent = DerivationFramework__xAODStringSkimmingTool(name = "BPHY14_SelectEvent",
+                                                                 expression = expression)
+ToolSvc += BPHY14_SelectEvent
+print(BPHY14_SelectEvent)
+
+#--------------------------------------------------------------------
+## 6/ track and vertex thinning. We want to remove all reconstructed secondary vertices
+##    which hasn't passed any of the selections defined by (Select_*) tools.
+##    We also want to keep only tracks which are associates with either muons or any of the
+##    vertices that passed the selection. Multiple thinning tools can perform the
+##    selection. The final thinning decision is based OR of all the decisions (by default,
+##    although it can be changed by the JO).
+
+## a) thining out vertices that didn't pass any selection and idetifying tracks associated with
+##    selected vertices. The "VertexContainerNames" is a list of the vertex containers, and "PassFlags"
+##    contains all pass flags for Select_* tools that must be satisfied. The vertex is kept is it
+##    satisfy any of the listed selections.
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxTrk
+BPHY14Thin_vtxTrk = DerivationFramework__Thin_vtxTrk(
+                                                     name                       = "BPHY14Thin_vtxTrk",
+                                                     TrackParticleContainerName = "InDetTrackParticles",
+                                                     VertexContainerNames       = ["BPHY14OniaCandidates"],
+                                                     PassFlags                  = ["passed_Jpsi", "passed_Psi", "passed_Upsi"] )
+
+ToolSvc += BPHY14Thin_vtxTrk
+
+## b) thinning out tracks that are not attached to muons. The final thinning decision is based on the OR operation
+##    between decision from this and the previous tools.
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__MuonTrackParticleThinning
+BPHY14MuonTPThinningTool = DerivationFramework__MuonTrackParticleThinning(name                    = "BPHY14MuonTPThinningTool",
+                                                                          MuonKey                 = "Muons",
+                                                                          InDetTrackParticlesKey  = "InDetTrackParticles")
+ToolSvc += BPHY14MuonTPThinningTool
+
+
+# Tracks associated with Photons
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__EgammaTrackParticleThinning
+BPHY14PhotonTPThinningTool = DerivationFramework__EgammaTrackParticleThinning(name = "BPHY14PhotonTPThinningTool",
+                                                                              SGKey                  = "Photons",
+                                                                              GSFTrackParticlesKey   = "GSFTrackParticles",
+                                                                              InDetTrackParticlesKey = "InDetTrackParticles",
+                                                                              SelectionString        = photonRequirements,
+                                                                              BestMatchOnly          = False,
+                                                                              ConeSize               = 0.6,
+                                                                              ApplyAnd               = False)
+ToolSvc += BPHY14PhotonTPThinningTool
+
+
+
+
+# Added by ASC
+# Only save truth informtion directly associated with Onia
+from DerivationFrameworkMCTruth.DerivationFrameworkMCTruthConf import DerivationFramework__GenericTruthThinning
+BPHY14TruthThinTool = DerivationFramework__GenericTruthThinning(name                    = "BPHY14TruthThinTool",
+                                                                ParticleSelectionString = "TruthParticles.pdgId == 22 || TruthParticles.pdgId == 443 || TruthParticles.pdgId == 100443 || TruthParticles.pdgId == 553 || TruthParticles.pdgId == 100553 || TruthParticles.pdgId == 200553",
+                                                                PreserveDescendants     = True,
+                                                                PreserveAncestors      = True)
+ToolSvc += BPHY14TruthThinTool
+print(BPHY14TruthThinTool)
+
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS
+#====================================================================
+## 7/ IMPORTANT bit. Don't forget to pass the tools to the DerivationKernel! If you don't do that, they will not be
+##    be executed!
+
+# Added by ASC
+BPHY14ThinningTools = [BPHY14Thin_vtxTrk, BPHY14MuonTPThinningTool,BPHY14PhotonTPThinningTool]
+if globalflags.DataSource()=='geant4':
+    BPHY14ThinningTools.append(BPHY14TruthThinTool)
+
+# The name of the kernel (BPHY14Kernel in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+DerivationFrameworkJob += CfgMgr.DerivationFramework__DerivationKernel(
+                                                                       "BPHY14Kernel",
+                                                                       AugmentationTools = [BPHY14_Reco_mumu, BPHY14_Select_Jpsi2mumu, BPHY14_Select_Psi2mumu, BPHY14_Select_Upsi2mumu],
+                                                                       SkimmingTools     = [BPHY14_SelectEvent],
+                                                                       ThinningTools     = BPHY14ThinningTools
+                                                                       )
+
+#====================================================================
+# SET UP STREAM
+#====================================================================
+streamName = derivationFlags.WriteDAOD_BPHY14Stream.StreamName
+fileName   = buildFileName( derivationFlags.WriteDAOD_BPHY14Stream )
+BPHY14Stream = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY14Stream.AcceptAlgs(["BPHY14Kernel"])
+# Special lines for thinning
+# Thinning service name must match the one passed to the thinning tools
+from AthenaServices.Configurables import ThinningSvc, createThinningSvc
+augStream = MSMgr.GetStream( streamName )
+evtStream = augStream.GetEventStream()
+svcMgr += createThinningSvc( svcName="BPHY14ThinningSvc", outStreams=[evtStream] )
+
+
+#====================================================================
+# Slimming
+#====================================================================
+
+# Added by ASC
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY14SlimmingHelper = SlimmingHelper("BPHY14SlimmingHelper")
+BPHY14_AllVariables     = []
+BPHY14_StaticContent    = []
+BPHY14_SmartCollections = []
+BPHY14_ExtraVariables   = []
+
+# Needed for trigger objects
+BPHY14SlimmingHelper.IncludeMuonTriggerContent   = True
+BPHY14SlimmingHelper.IncludeBPhysTriggerContent  = True
+BPHY14SlimmingHelper.IncludeEGammaTriggerContent = True
+
+## primary vertices
+BPHY14_SmartCollections  += ["PrimaryVertices"]
+BPHY14_StaticContent += ["xAOD::VertexContainer#BPHY14RefittedPrimaryVertices"]
+BPHY14_StaticContent += ["xAOD::VertexAuxContainer#BPHY14RefittedPrimaryVerticesAux."]
+
+## ID track particles
+BPHY14_SmartCollections += ["InDetTrackParticles"]
+BPHY14_ExtraVariables += ["%s.vx.vy.vz" %  "InDetTrackParticles"]
+#BPHY14_AllVariables += ["InDetTrackParticles"]
+
+
+## combined / extrapolated muon track particles
+## (note: for tagged muons there is no extra TrackParticle collection since the ID tracks
+##        are store in InDetTrackParticles collection)
+BPHY14_AllVariables += ["CombinedMuonTrackParticles"]
+BPHY14_AllVariables += ["ExtrapolatedMuonTrackParticles"]
+
+## muon container
+BPHY14_SmartCollections += ["Muons"]
+BPHY14_ExtraVariables   += ["%s.etcone30.etcone40" %  "Muons"
+                            +".momentumBalanceSignificance"
+                            +".scatteringCurvatureSignificance"
+                            +".scatteringNeighbourSignificance"
+                            +".msInnerMatchDOF.msInnerMatchChi2"
+                            +".msOuterMatchDOF.msOuterMatchChi2"
+                            +".EnergyLoss.ParamEnergyLoss.MeasEnergyLoss"
+                            +".ET_Core" ]
+#BPHY14_AllVariables += ["Muons"]
+
+## Jpsi candidates
+BPHY14_StaticContent += ["xAOD::VertexContainer#%s"        % BPHY14_Reco_mumu.OutputVtxContainerName]
+BPHY14_StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY14_Reco_mumu.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+BPHY14_StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY14_Reco_mumu.OutputVtxContainerName]
+
+# Truth information for MC only
+if isSimulation:
+    BPHY14_StaticContent += ["xAOD::TruthParticleContainer#TruthMuons","xAOD::TruthParticleAuxContainer#TruthMuonsAux."]
+    BPHY14_StaticContent += ["xAOD::TruthParticleContainer#TruthPhotons","xAOD::TruthParticleAuxContainer#TruthPhotonsAux."]
+    BPHY14_AllVariables  += ["TruthEvents","TruthParticles","TruthVertices","MuonTruthParticles"]
+
+#Photon Information
+#AllVariables     += ["Photons"]
+BPHY14_SmartCollections += ["Photons"] #,"Muons","InDetTrackParticles","PrimaryVertices"]
+from DerivationFrameworkSM.STDMExtraContent import *
+BPHY14_ExtraVariables.extend(ExtraContentPhotons)
+
+
+BPHY14SlimmingHelper.AllVariables     = BPHY14_AllVariables
+BPHY14SlimmingHelper.StaticContent    = BPHY14_StaticContent
+BPHY14SlimmingHelper.SmartCollections = BPHY14_SmartCollections
+BPHY14SlimmingHelper.ExtraVariables   = BPHY14_ExtraVariables
+BPHY14SlimmingHelper.AppendContentToStream(BPHY14Stream)
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY15.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY15.py
new file mode 100644
index 000000000000..be74b9f13947
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY15.py
@@ -0,0 +1,855 @@
+#2018/11/24
+#====================================================================
+# BPHY15.py
+# Bc+>J/psiD_s+, Bc+>J/psiD+, Bc+>J/psiD*+, Bc+>J/psiD_s1+
+# It requires the reductionConf flag BPHY15 in Reco_tf.py   
+#====================================================================
+
+# Set up common services and job object. 
+# This should appear in ALL derivation job options
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+print(isSimulation)
+
+
+#====================================================================
+# AUGMENTATION TOOLS 
+#====================================================================
+## 1/ setup vertexing tools and services
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY15_VertexTools = BPHYVertexTools("BPHY15")
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__AugOriginalCounts
+BPHY15_AugOriginalCounts = DerivationFramework__AugOriginalCounts(
+   name = "BPHY15_AugOriginalCounts",
+   VertexContainer = "PrimaryVertices",
+   TrackContainer = "InDetTrackParticles" )
+ToolSvc += BPHY15_AugOriginalCounts
+
+
+#--------------------------------------------------------------------
+# 2/ Select J/psi>mu+mu-
+#--------------------------------------------------------------------
+## a/ setup JpsiFinder tool
+##    These are general tools independent of DerivationFramework that do the 
+##    actual vertex fitting and some pre-selection.
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder
+BPHY15JpsiFinder = Analysis__JpsiFinder(
+    name                       = "BPHY15JpsiFinder",
+    OutputLevel                = INFO,
+    muAndMu                    = True,
+    muAndTrack                 = False,
+    TrackAndTrack              = False,
+    assumeDiMuons              = True, 
+    muonThresholdPt            = 2700,
+    invMassUpper               = 3400.0,
+    invMassLower               = 2800.0,
+    Chi2Cut                    = 10.,
+    oppChargesOnly	           = True,
+    allMuons                   = True,
+    combOnly		               = False,
+    atLeastOneComb             = False,
+    useCombinedMeasurement     = False, # Only takes effect if combOnly=True	
+    muonCollectionKey          = "Muons",
+    TrackParticleCollection    = "InDetTrackParticles",
+    V0VertexFitterTool         = BPHY15_VertexTools.TrkV0Fitter,             # V0 vertex fitter
+    useV0Fitter                = False,                   # if False a TrkVertexFitterTool will be used
+    TrkVertexFitterTool        = BPHY15_VertexTools.TrkVKalVrtFitter,        # VKalVrt vertex fitter
+    TrackSelectorTool          = BPHY15_VertexTools.InDetTrackSelectorTool,
+    VertexPointEstimator       = BPHY15_VertexTools.VtxPointEstimator,
+    useMCPCuts                 = False)
+
+ToolSvc += BPHY15JpsiFinder
+print(BPHY15JpsiFinder)
+
+#--------------------------------------------------------------------
+## b/ setup the vertex reconstruction "call" tool(s). They are part of the derivation framework.
+##    These Augmentation tools add output vertex collection(s) into the StoreGate and add basic 
+##    decorations which do not depend on the vertex mass hypothesis (e.g. lxy, ptError, etc).
+##    There should be one tool per topology, i.e. Jpsi and Psi(2S) do not need two instance of the
+##    Reco tool is the JpsiFinder mass window is wide enough.
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY15JpsiSelectAndWrite = DerivationFramework__Reco_Vertex(
+    name                   = "BPHY15JpsiSelectAndWrite",
+    VertexSearchTool             = BPHY15JpsiFinder,
+    OutputVtxContainerName = "BPHY15JpsiCandidates",
+    PVContainerName        = "PrimaryVertices",
+    RefPVContainerName     = "SHOULDNOTBEUSED",
+    DoVertexType           = 1)
+
+ToolSvc += BPHY15JpsiSelectAndWrite
+print(BPHY15JpsiSelectAndWrite)
+
+#--------------------------------------------------------------------
+## c/ augment and select Jpsi->mumu candidates
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+BPHY15_Select_Jpsi2mumu = DerivationFramework__Select_onia2mumu(
+    name                  = "BPHY15_Select_Jpsi2mumu",
+    HypothesisName        = "Jpsi",
+    InputVtxContainerName = "BPHY15JpsiCandidates",
+    VtxMassHypo           = 3096.900,
+    MassMin               = 2600.0,
+    MassMax               = 3600.0,
+    Chi2Max               = 200,
+    LxyMin                = 0.1,
+    DoVertexType          = 1)
+  
+ToolSvc += BPHY15_Select_Jpsi2mumu
+print(BPHY15_Select_Jpsi2mumu)
+
+#--------------------------------------------------------------------
+# 3/ select B_c+->J/psi pi+
+#--------------------------------------------------------------------
+## a/ setup a new vertexing tool (necessary due to use of mass constraint) 
+from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+BcJpsipiVertexFit = Trk__TrkVKalVrtFitter(
+    name               = "BcJpsipiVertexFit",
+    Extrapolator       = BPHY15_VertexTools.InDetExtrapolator,
+    FirstMeasuredPoint = True,
+    MakeExtendedVertex = True)
+
+ToolSvc += BcJpsipiVertexFit
+print(BcJpsipiVertexFit)
+
+#--------------------------------------------------------------------
+## b/ setup the Jpsi+1 track finder
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiPlus1Track
+BPHY15BcJpsipi = Analysis__JpsiPlus1Track(
+    name                    = "BPHY15BcJpsipi",
+    OutputLevel             = INFO, #DEBUG,
+    pionHypothesis          = True, #False,
+    kaonHypothesis	    = False,#True,
+    trkThresholdPt	    = 2700,
+    trkMaxEta               = 2.7,
+    BThresholdPt            = 100.0,
+    BMassUpper	            = 6900.0,
+    BMassLower	            = 5600.0,
+    JpsiContainerKey        = "BPHY15JpsiCandidates",
+    TrackParticleCollection = "InDetTrackParticles",
+    MuonsUsedInJpsi         = "Muons",
+    TrkVertexFitterTool     = BcJpsipiVertexFit,
+    TrackSelectorTool       = BPHY15_VertexTools.InDetTrackSelectorTool,
+    UseMassConstraint       = True, 
+    Chi2Cut 	            = 5,
+    TrkTrippletMassUpper    = 6900,
+    TrkTrippletMassLower    = 5600)
+        
+ToolSvc += BPHY15BcJpsipi
+print(BPHY15BcJpsipi)    
+
+#--------------------------------------------------------------------
+## c/ setup the combined augmentation/skimming tool for the Bc+>J/psi pi+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY15BcJpsipiSelectAndWrite = DerivationFramework__Reco_Vertex(
+    name                   = "BPHY15BcJpsipiSelectAndWrite",
+    Jpsi1PlusTrackName     = BPHY15BcJpsipi,
+    OutputVtxContainerName = "BPHY15BcJpsipiCandidates",
+    PVContainerName        = "PrimaryVertices",
+    RefPVContainerName     = "BPHY15RefittedPrimaryVertices",
+    RefitPV                = True,
+    MaxPVrefit		   = 1000)
+
+ToolSvc += BPHY15BcJpsipiSelectAndWrite 
+print(BPHY15BcJpsipiSelectAndWrite)
+
+#--------------------------------------------------------------------
+## d/ augment and select B_c+>Jpsi pi+ candidates
+BPHY15_Select_Bc2Jpsipi = DerivationFramework__Select_onia2mumu(
+    name                  = "BPHY15_Select_Bc2Jpsipi",
+    HypothesisName        = "Bc",
+    InputVtxContainerName = "BPHY15BcJpsipiCandidates",
+    TrkMasses             = [105.658, 105.658, 139.571],
+    VtxMassHypo           = 6274.9,
+    MassMin               = 5600.0,
+    MassMax               = 6900.0,
+    Chi2Max               = 200)
+
+ToolSvc += BPHY15_Select_Bc2Jpsipi
+print(BPHY15_Select_Bc2Jpsipi)
+
+#--------------------------------------------------------------------
+# 4/ select J/psi pi+
+#--------------------------------------------------------------------
+## a/ setup the Jpsi+1 track finder
+BPHY15JpsipiFinder = Analysis__JpsiPlus1Track(
+    name                    = "BPHY15JpsipiFinder",
+    OutputLevel             = INFO, #DEBUG,
+    pionHypothesis          = True, #False,
+    kaonHypothesis	    = False,#True,
+    trkThresholdPt	    = 350.0,
+    trkMaxEta               = 2.7,
+    BThresholdPt            = 5000.0,
+    BMassUpper	            = 3600.0,
+    BMassLower	            = 3200.0,
+    TrkDeltaZ               = 20.,
+    TrkQuadrupletPt         = 5000,
+    JpsiContainerKey        = "BPHY15JpsiCandidates",
+    TrackParticleCollection = "InDetTrackParticles",
+    MuonsUsedInJpsi         = "Muons",
+    TrkVertexFitterTool     = BcJpsipiVertexFit,
+    TrackSelectorTool       = BPHY15_VertexTools.InDetTrackSelectorTool,
+    UseMassConstraint       = True, 
+    Chi2Cut 	            = 5,
+    TrkTrippletMassUpper    = 3600,
+    TrkTrippletMassLower    = 3200)
+        
+ToolSvc += BPHY15JpsipiFinder
+print(BPHY15JpsipiFinder)    
+
+#--------------------------------------------------------------------
+## b/ setup the combined augmentation/skimming tool for J/psi pi+
+BPHY15JpsipiSelectAndWrite = DerivationFramework__Reco_Vertex(
+    name                   = "BPHY15JpsipiSelectAndWrite",
+    Jpsi1PlusTrackName     = BPHY15JpsipiFinder,
+    OutputVtxContainerName = "BPHY15JpsipiCandidates",
+    PVContainerName        = "PrimaryVertices",
+    RefPVContainerName     = "SHOULDNOTBEUSED",
+   #RefitPV                = True,
+    MaxPVrefit		   = 1000)
+
+ToolSvc += BPHY15JpsipiSelectAndWrite 
+print(BPHY15JpsipiSelectAndWrite)
+
+#--------------------------------------------------------------------
+## c/ augment and select Jpsi pi+ candidates for the J/psi D*+ and J/psi D_s1+ modes
+BPHY15_Select_Jpsipi = DerivationFramework__Select_onia2mumu(
+    name                  = "BPHY15_Select_Jpsipi",
+    HypothesisName        = "Jpsipi",
+    TrkMasses             = [105.658, 105.658, 139.571],
+    InputVtxContainerName = "BPHY15JpsipiCandidates",
+    VtxMassHypo           = 3396.900,
+    MassMin               = 3200.0,
+    MassMax               = 3600.0,
+    Chi2Max               = 200,
+    LxyMin                = 0.1,
+    DoVertexType          = 1)
+  
+ToolSvc += BPHY15_Select_Jpsipi
+print(BPHY15_Select_Jpsipi)
+
+#--------------------------------------------------------------------
+# 5/ Select K+K-, pi+K- and K+pi-
+#--------------------------------------------------------------------
+## a/ Setup the vertex fitter tools
+BPHY15DiTrkFinder = Analysis__JpsiFinder(
+    name                       = "BPHY15DiTrkFinder",
+    OutputLevel                = INFO,
+    muAndMu                    = False,
+    muAndTrack                 = False,
+    TrackAndTrack              = True,
+    assumeDiMuons              = False,    # If true, will assume dimu hypothesis and use PDG value for mu mass
+    trackThresholdPt           = 900,
+    invMassUpper               = 1900.0,
+    invMassLower               = 280.0,
+    Chi2Cut                    = 10.,
+    oppChargesOnly	       = True,
+    atLeastOneComb             = False,
+    useCombinedMeasurement     = False, # Only takes effect if combOnly=True	
+    muonCollectionKey          = "Muons",
+    TrackParticleCollection    = "InDetTrackParticles",
+    V0VertexFitterTool         = BPHY15_VertexTools.TrkV0Fitter,             # V0 vertex fitter
+    useV0Fitter                = False,                   # if False a TrkVertexFitterTool will be used
+    TrkVertexFitterTool        = BPHY15_VertexTools.TrkVKalVrtFitter,        # VKalVrt vertex fitter
+    TrackSelectorTool          = BPHY15_VertexTools.InDetTrackSelectorTool,
+    VertexPointEstimator       = BPHY15_VertexTools.VtxPointEstimator,
+    useMCPCuts                 = False,
+    track1Mass                 = 139.571, # Not very important, only used to calculate inv. mass cut, leave it loose here
+    track2Mass                 = 139.571)
+  
+ToolSvc += BPHY15DiTrkFinder
+print(BPHY15DiTrkFinder)
+
+#--------------------------------------------------------------------
+## b/ setup the vertex reconstruction "call" tool(s).
+BPHY15DiTrkSelectAndWrite = DerivationFramework__Reco_Vertex(
+    name                   = "BPHY15DiTrkSelectAndWrite",
+    VertexSearchTool             = BPHY15DiTrkFinder,
+    OutputVtxContainerName = "BPHY15DiTrkCandidates",
+    PVContainerName        = "PrimaryVertices",
+    RefPVContainerName     = "SHOULDNOTBEUSED",
+    CheckCollections       = True,
+    CheckVertexContainers  = ['BPHY15JpsiCandidates'],
+    DoVertexType           = 1)
+  
+ToolSvc += BPHY15DiTrkSelectAndWrite
+print(BPHY15DiTrkSelectAndWrite)
+
+#--------------------------------------------------------------------
+## c/ augment and select D0 candidates
+BPHY15_Select_D0 = DerivationFramework__Select_onia2mumu(
+    name                  = "BPHY15_Select_D0",
+    HypothesisName        = "D0",
+    InputVtxContainerName = "BPHY15DiTrkCandidates",
+    TrkMasses             = [139.571, 493.677],
+    VtxMassHypo           = 1864.83,
+    MassMin               = 1864.83-170,
+    MassMax               = 1864.83+170,
+    LxyMin                = 0.15,
+    Chi2Max               = 200)
+
+ToolSvc += BPHY15_Select_D0
+print(BPHY15_Select_D0)
+
+#--------------------------------------------------------------------
+## d/ augment and select D0bar candidates
+BPHY15_Select_D0b = DerivationFramework__Select_onia2mumu(
+    name                  = "BPHY15_Select_D0b",
+    HypothesisName        = "D0b",
+    InputVtxContainerName = "BPHY15DiTrkCandidates",
+    TrkMasses             = [493.677, 139.571],
+    VtxMassHypo           = 1864.83,
+    MassMin               = 1864.83-170,
+    MassMax               = 1864.83+170,
+    LxyMin                = 0.15,
+    Chi2Max               = 200)
+
+ToolSvc += BPHY15_Select_D0b
+print(BPHY15_Select_D0b)
+
+#--------------------------------------------------------------------
+# 6/ select D_s+>K+K-pi+ and D+>K+pi-pi- candidates
+#--------------------------------------------------------------------
+## a/ setup a new vertexing tool (necessary due to use of mass constraint) 
+Dh3VertexFit = Trk__TrkVKalVrtFitter(
+    name                = "Dh3VertexFit",
+    Extrapolator        = BPHY15_VertexTools.InDetExtrapolator,
+    FirstMeasuredPoint  = True,
+    MakeExtendedVertex  = True)
+
+ToolSvc += Dh3VertexFit
+print(Dh3VertexFit)
+
+#--------------------------------------------------------------------
+## b/ setup the Jpsi+1 track finder
+BPHY15Dh3Finder = Analysis__JpsiPlus1Track(
+    name                    = "BPHY15Dh3Finder",
+    OutputLevel             = INFO,
+    pionHypothesis          = True,
+    kaonHypothesis          = False,
+    trkThresholdPt	    = 900.0,
+    trkMaxEta	            = 2.7, # is this value fine?? default would be 102.5
+    BThresholdPt            = 2000.0,
+   #BThresholdPt            = 3000.0,
+    BMassUpper              = 1800.0, # What is this??
+    BMassLower       	    = 500.0,
+    TrkDeltaZ               = 20.,
+    TrkTrippletMassUpper    = 1800,
+    TrkTrippletMassLower    = 500,
+    TrkQuadrupletPt         = 2000,
+   #TrkQuadrupletPt         = 3000,
+    JpsiContainerKey        = "BPHY15DiTrkCandidates",
+    TrackParticleCollection = "InDetTrackParticles",
+    MuonsUsedInJpsi         = "NONE", # ?
+    ExcludeCrossJpsiTracks  = False,
+    TrkVertexFitterTool     = Dh3VertexFit,
+    TrackSelectorTool       = BPHY15_VertexTools.InDetTrackSelectorTool,
+    UseMassConstraint       = False, 
+    Chi2Cut                 = 5) #Cut on chi2/Ndeg_of_freedom
+ 
+ToolSvc += BPHY15Dh3Finder
+print(BPHY15Dh3Finder)
+
+#--------------------------------------------------------------------
+## c/ setup the combined augmentation/skimming tool for the D(s)+
+BPHY15Dh3SelectAndWrite = DerivationFramework__Reco_Vertex(
+    name                   = "BPHY15Dh3SelectAndWrite",
+    OutputLevel            = INFO,
+    Jpsi1PlusTrackName     = BPHY15Dh3Finder,
+    OutputVtxContainerName = "BPHY15Dh3Candidates",
+    PVContainerName        = "PrimaryVertices",
+    RefPVContainerName     = "SHOULDNOTBEUSED",
+    MaxPVrefit             = 1000)
+
+ToolSvc += BPHY15Dh3SelectAndWrite 
+print(BPHY15Dh3SelectAndWrite)
+
+
+#--------------------------------------------------------------------
+## d/ augment and select D_s+/- candidates
+BPHY15_Select_Ds = DerivationFramework__Select_onia2mumu(
+    name                  = "BPHY15_Select_Ds",
+    HypothesisName        = "Ds",
+    TrkMasses             = [493.677, 493.677, 139.571],
+    InputVtxContainerName = "BPHY15Dh3Candidates",
+    VtxMassHypo           = 1968.28,
+    MassMin               = 1968.28-200,
+    MassMax               = 1968.28+200,
+    Chi2Max               = 200,
+    LxyMin                = 0.1,
+    DoVertexType          = 1)
+  
+ToolSvc += BPHY15_Select_Ds
+print(BPHY15_Select_Ds)
+
+#--------------------------------------------------------------------
+## e/ augment and select D+ candidates
+BPHY15_Select_Dp = DerivationFramework__Select_onia2mumu(
+    name                  = "BPHY15_Select_Dp",
+    HypothesisName        = "Dp",
+    TrkMasses             = [139.571, 493.677, 139.571],
+    InputVtxContainerName = "BPHY15Dh3Candidates",
+    VtxMassHypo           = 1869.59,
+    MassMin               = 1869.59-200,
+    MassMax               = 1869.59+200,
+    Chi2Max               = 200,
+    LxyMin                = 0.1,
+    DoVertexType          = 1)
+  
+ToolSvc += BPHY15_Select_Dp
+print(BPHY15_Select_Dp)
+
+#--------------------------------------------------------------------
+## c/ augment and select D- candidates
+BPHY15_Select_Dm = DerivationFramework__Select_onia2mumu(
+    name                  = "BPHY15_Select_Dm",
+    HypothesisName        = "Dm",
+    TrkMasses             = [493.677, 139.571, 139.571],
+    InputVtxContainerName = "BPHY15Dh3Candidates",
+    VtxMassHypo           = 1869.59,
+    MassMin               = 1869.59-200,
+    MassMax               = 1869.59+200,
+    Chi2Max               = 200,
+    LxyMin                = 0.1,
+    DoVertexType          = 1)
+  
+ToolSvc += BPHY15_Select_Dm
+print(BPHY15_Select_Dm)
+
+
+#--------------------------------------------------------------------
+# 7/ select Bc+>J/psi D_(s)+/-
+#--------------------------------------------------------------------
+## a/ setup the cascade vertexing tool
+BcJpsiDxVertexFit = Trk__TrkVKalVrtFitter(
+    name                 = "BcJpsiDxVertexFit",
+    Extrapolator         = BPHY15_VertexTools.InDetExtrapolator,
+   #FirstMeasuredPoint   = True,
+    FirstMeasuredPoint   = False,
+    CascadeCnstPrecision = 1e-6,
+    MakeExtendedVertex   = True)
+
+ToolSvc += BcJpsiDxVertexFit
+print(BcJpsiDxVertexFit)
+
+#--------------------------------------------------------------------
+## b/ setup the Jpsi Ds finder
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__JpsiPlusDsCascade
+BPHY15JpsiDs = DerivationFramework__JpsiPlusDsCascade(
+    name                     = "BPHY15JpsiDs",
+    HypothesisName           = "Bc",
+    TrkVertexFitterTool      = BcJpsiDxVertexFit,
+    DxHypothesis             = 431,
+    ApplyDxMassConstraint    = True,
+    ApplyJpsiMassConstraint  = True,
+    JpsiMassLowerCut         = 2600.,
+    JpsiMassUpperCut         = 3600.,
+    DxMassLowerCut           = 1968.28 - 200.,
+    DxMassUpperCut           = 1968.28 + 200.,
+    MassLowerCut             = 6274.90 - 600.,
+    MassUpperCut             = 6274.90 + 600.,
+    Chi2Cut 	             = 10,
+    RefitPV                  = True,
+    RefPVContainerName       = "BPHY15RefittedPrimaryVertices",
+    JpsiVertices             = "BPHY15JpsiCandidates",
+    CascadeVertexCollections = ["BcJpsiDsCascadeSV2", "BcJpsiDsCascadeSV1"],
+    DxVertices               = "BPHY15Dh3Candidates")
+
+ToolSvc += BPHY15JpsiDs
+print(BPHY15JpsiDs)
+
+#--------------------------------------------------------------------
+## c/ setup the Jpsi D+ finder
+BPHY15JpsiDp = DerivationFramework__JpsiPlusDsCascade(
+    name                     = "BPHY15JpsiDp",
+    HypothesisName           = "Bc",
+    TrkVertexFitterTool      = BcJpsiDxVertexFit,
+    DxHypothesis             = 411,
+    ApplyDxMassConstraint    = True,
+    ApplyJpsiMassConstraint  = True,
+    JpsiMassLowerCut         = 2600.,
+    JpsiMassUpperCut         = 3600.,
+    DxMassLowerCut           = 1869.59 - 180.,
+    DxMassUpperCut           = 1869.59 + 180.,
+    MassLowerCut             = 6274.90 - 600.,
+    MassUpperCut             = 6274.90 + 600.,
+    Chi2Cut 	             = 10,
+    RefitPV                  = True,
+    RefPVContainerName       = "BPHY15RefittedPrimaryVertices",
+    JpsiVertices             = "BPHY15JpsiCandidates",
+    CascadeVertexCollections = ["BcJpsiDpCascadeSV2", "BcJpsiDpCascadeSV1"],
+    DxVertices               = "BPHY15Dh3Candidates")
+
+ToolSvc += BPHY15JpsiDp
+print(BPHY15JpsiDp)
+
+#--------------------------------------------------------------------
+# 8/ select Bc+>J/psi D*+/-
+#--------------------------------------------------------------------
+## a/ setup the cascade vertexing tool
+BcJpsiDstVertexFit = Trk__TrkVKalVrtFitter(
+    name                 = "BcJpsiDstVertexFit",
+    Extrapolator         = BPHY15_VertexTools.InDetExtrapolator,
+   #FirstMeasuredPoint   = True,
+    FirstMeasuredPoint   = False,
+    CascadeCnstPrecision = 1e-6,
+    MakeExtendedVertex   = True)
+
+ToolSvc += BcJpsiDstVertexFit
+print(BcJpsiDstVertexFit)
+
+#--------------------------------------------------------------------
+## b/ setup Jpsi D*+ finder
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__JpsiPlusDpstCascade
+BPHY15JpsiDpst = DerivationFramework__JpsiPlusDpstCascade(
+    name                     = "BPHY15JpsiDpst",
+    HypothesisName           = "Bc",
+    TrkVertexFitterTool      = BcJpsiDstVertexFit,
+    DxHypothesis             = 421,
+    ApplyD0MassConstraint    = True,
+    ApplyJpsiMassConstraint  = True,
+    JpsiMassLowerCut         = 2600.,
+    JpsiMassUpperCut         = 3600.,
+    JpsipiMassLowerCut       = 2600.,
+    JpsipiMassUpperCut       = 6800.,
+    D0MassLowerCut           = 1864.83 - 200.,
+    D0MassUpperCut           = 1864.83 + 200.,
+    DstMassLowerCut          = 2010.26 - 300.,
+    DstMassUpperCut          = 2010.26 + 300.,
+    MassLowerCut             = 5400,
+    MassUpperCut             = 6274.90 + 600.,
+    Chi2Cut 	             = 10,
+    RefitPV                  = True,
+    RefPVContainerName       = "BPHY15RefittedPrimaryVertices",
+    JpsipiVertices           = "BPHY15JpsipiCandidates",
+    CascadeVertexCollections = ["BcJpsiDpstCascadeSV2", "BcJpsiDpstCascadeSV1"],
+    D0Vertices               = "BPHY15DiTrkCandidates")
+
+ToolSvc += BPHY15JpsiDpst
+print(BPHY15JpsiDpst)
+
+
+
+#--------------------------------------------------------------------
+# 9/ select K_S0>pi+pi- 
+#--------------------------------------------------------------------
+
+include("DerivationFrameworkBPhys/configureV0Finder.py")
+BPHY15_K0FinderTools = BPHYV0FinderTools("BPHY15")
+print(BPHY15_K0FinderTools)
+
+## a/ Setup the vertex fitter tools
+BPHY15K0Finder = Analysis__JpsiFinder(
+    name                       = "BPHY15K0Finder",
+    OutputLevel                = INFO,
+    muAndMu                    = False,
+    muAndTrack                 = False,
+    TrackAndTrack              = True,
+    assumeDiMuons              = False,    # If true, will assume dimu hypothesis and use PDG value for mu mass
+    trackThresholdPt           = 400,
+   #trackThresholdPt           = 500,
+    invMassUpper               = 600.0,
+    invMassLower               = 400.0,
+    Chi2Cut                    = 20,
+   #Chi2Cut                    = 5.,
+    oppChargesOnly	       = True,
+    atLeastOneComb             = False,
+    useCombinedMeasurement     = False, # Only takes effect if combOnly=True	
+    muonCollectionKey          = "Muons",
+    TrackParticleCollection    = "InDetTrackParticles",
+    V0VertexFitterTool         = BPHY15_VertexTools.TrkV0Fitter,             # V0 vertex fitter
+    useV0Fitter                = True,                   # if False a TrkVertexFitterTool will be used
+   #useV0Fitter                = False,                   # if False a TrkVertexFitterTool will be used
+    TrkVertexFitterTool        = BPHY15_VertexTools.TrkVKalVrtFitter,        # VKalVrt vertex fitter
+   #TrackSelectorTool          = BPHY15_VertexTools.InDetTrackSelectorTool,
+    TrackSelectorTool          = BPHY15_K0FinderTools.InDetV0VxTrackSelector,
+    VertexPointEstimator       = BPHY15_K0FinderTools.V0VtxPointEstimator,
+   #VertexPointEstimator       = BPHY15_VertexTools.VtxPointEstimator,
+    useMCPCuts                 = False,
+    track1Mass                 = 139.571, # Not very important, only used to calculate inv. mass cut, leave it loose here
+    track2Mass                 = 139.571)
+  
+ToolSvc += BPHY15K0Finder
+print(BPHY15K0Finder)
+
+#--------------------------------------------------------------------
+## b/ setup the vertex reconstruction "call" tool(s).
+BPHY15K0SelectAndWrite = DerivationFramework__Reco_Vertex(
+    name                   = "BPHY15K0SelectAndWrite",
+    VertexSearchTool             = BPHY15K0Finder,
+    OutputVtxContainerName = "BPHY15K0Candidates",
+    PVContainerName        = "PrimaryVertices",
+    RefPVContainerName     = "SHOULDNOTBEUSED",
+    CheckCollections       = True,
+    CheckVertexContainers  = ['BPHY15JpsipiCandidates','BPHY15DiTrkCandidates','BcJpsiDpstCascadeSV1'],
+    DoVertexType           = 1)
+  
+ToolSvc += BPHY15K0SelectAndWrite
+print(BPHY15K0SelectAndWrite)
+
+#--------------------------------------------------------------------
+## c/ augment and select K_S0 candidates
+BPHY15_Select_K0 = DerivationFramework__Select_onia2mumu(
+    name                  = "BPHY15_Select_K0",
+    HypothesisName        = "K0",
+    InputVtxContainerName = "BPHY15K0Candidates",
+    TrkMasses             = [139.571, 139.571],
+    VtxMassHypo           = 497.672,
+    MassMin               = 400,
+    MassMax               = 600,
+    LxyMin                = 0.2,
+    Chi2Max               = 200)
+
+ToolSvc += BPHY15_Select_K0
+print(BPHY15_Select_K0)
+
+#--------------------------------------------------------------------
+# 10/ select Bc+>J/psi D_s1+/-
+#--------------------------------------------------------------------
+## a/ setup the cascade vertexing tool
+BcJpsiDs1VertexFit = Trk__TrkVKalVrtFitter(
+    name                 = "BcJpsiDs1VertexFit",
+    Extrapolator         = BPHY15_VertexTools.InDetExtrapolator,
+   #FirstMeasuredPoint   = True,
+    FirstMeasuredPoint   = False,
+    CascadeCnstPrecision = 1e-6,
+    MakeExtendedVertex   = True)
+
+ToolSvc += BcJpsiDs1VertexFit
+print(BcJpsiDs1VertexFit)
+
+#--------------------------------------------------------------------
+## b/ setup Jpsi D_s1+ finder
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__JpsiPlusDs1Cascade
+BPHY15JpsiDps1 = DerivationFramework__JpsiPlusDs1Cascade(
+    name                     = "BPHY15JpsiDps1",
+    HypothesisName           = "Bc",
+    TrkVertexFitterTool      = BcJpsiDs1VertexFit,
+    DxHypothesis             = 421,
+    ApplyD0MassConstraint    = True,
+    ApplyK0MassConstraint    = True,
+    ApplyJpsiMassConstraint  = True,
+    JpsiMassLowerCut         = 2600.,
+    JpsiMassUpperCut         = 3600.,
+    JpsipiMassLowerCut       = 2600.,
+    JpsipiMassUpperCut       = 6800.,
+    D0MassLowerCut           = 1864.83 - 180.,
+    D0MassUpperCut           = 1864.83 + 180.,
+    K0MassLowerCut           = 400.,
+    K0MassUpperCut           = 600.,
+    DstMassLowerCut          = 2010.26 - 300.,
+    DstMassUpperCut          = 2010.26 + 300.,
+    MassLowerCut             = 6274.90 - 600,
+    MassUpperCut             = 6274.90 + 600.,
+    Chi2Cut 	             = 10,
+    RefitPV                  = True,
+    RefPVContainerName       = "BPHY15RefittedPrimaryVertices",
+    JpsipiVertices           = "BPHY15JpsipiCandidates",
+    CascadeVertexCollections = ["BcJpsiDps1CascadeSV3", "BcJpsiDps1CascadeSV2", "BcJpsiDps1CascadeSV1"],
+    K0Vertices               = "BPHY15K0Candidates",
+    D0Vertices               = "BPHY15DiTrkCandidates")
+
+ToolSvc += BPHY15JpsiDps1
+print(BPHY15JpsiDps1)
+
+#--------------------------------------------------------------------
+
+CascadeCollections = []
+
+CascadeCollections += BPHY15JpsiDs.CascadeVertexCollections
+CascadeCollections += BPHY15JpsiDp.CascadeVertexCollections
+
+CascadeCollections += BPHY15JpsiDpst.CascadeVertexCollections
+CascadeCollections += BPHY15JpsiDps1.CascadeVertexCollections
+
+#--------------------------------------------------------------------
+
+
+if not isSimulation: #Only Skim Data
+   from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+   BPHY15_SelectBcJpsipiEvent = DerivationFramework__xAODStringSkimmingTool(
+     name = "BPHY15_SelectBcJpsipiEvent",
+     expression = "( count(BPHY15BcJpsipiCandidates.passed_Bc > 0) + count(BcJpsiDsCascadeSV1.x > -999) + count(BcJpsiDpCascadeSV1.x > -999) + count(BcJpsiDpstCascadeSV1.x > -999) + count(BcJpsiDps1CascadeSV1.x > -999) ) > 0")
+   
+   ToolSvc += BPHY15_SelectBcJpsipiEvent
+   print(BPHY15_SelectBcJpsipiEvent)
+
+   #====================================================================
+   # Make event selection based on an OR of the input skimming tools
+   #====================================================================
+      
+   from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__FilterCombinationOR
+   BPHY15SkimmingOR = CfgMgr.DerivationFramework__FilterCombinationOR(
+       "BPHY15SkimmingOR",
+       FilterList = [BPHY15_SelectBcJpsipiEvent] )
+   ToolSvc += BPHY15SkimmingOR
+   print(BPHY15SkimmingOR)
+
+#--------------------------------------------------------------------
+##10/ track and vertex thinning. We want to remove all reconstructed secondary vertices
+##    which hasn't passed any of the selections defined by (Select_*) tools.
+##    We also want to keep only tracks which are associates with either muons or any of the
+##    vertices that passed the selection. Multiple thinning tools can perform the 
+##    selection. The final thinning decision is based OR of all the decisions (by default,
+##    although it can be changed by the JO).
+
+## a) thining out vertices that didn't pass any selection and idetifying tracks associated with 
+##    selected vertices. The "VertexContainerNames" is a list of the vertex containers, and "PassFlags"
+##    contains all pass flags for Select_* tools that must be satisfied. The vertex is kept is it 
+##    satisfy any of the listed selections.
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxTrk
+BPHY15_thinningTool_Tracks = DerivationFramework__Thin_vtxTrk(
+    name                       = "BPHY15_thinningTool_Tracks",
+    TrackParticleContainerName = "InDetTrackParticles",
+    VertexContainerNames       = ["BPHY15BcJpsipiCandidates", "BcJpsiDsCascadeSV1", "BcJpsiDsCascadeSV2", "BcJpsiDpCascadeSV1", "BcJpsiDpCascadeSV2", "BcJpsiDpstCascadeSV1", "BcJpsiDpstCascadeSV2", "BcJpsiDps1CascadeSV1", "BcJpsiDps1CascadeSV2", "BcJpsiDps1CascadeSV3"],
+    PassFlags                  = ["passed_Bc"])
+
+ToolSvc += BPHY15_thinningTool_Tracks
+print(BPHY15_thinningTool_Tracks)
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__BPhysPVThinningTool
+BPHY15_thinningTool_PV = DerivationFramework__BPhysPVThinningTool(
+    name                 = "BPHY15_thinningTool_PV",
+    CandidateCollections = ["BPHY15BcJpsipiCandidates", "BcJpsiDsCascadeSV1", "BcJpsiDsCascadeSV2", "BcJpsiDpCascadeSV1", "BcJpsiDpCascadeSV2", "BcJpsiDpstCascadeSV1", "BcJpsiDpstCascadeSV2", "BcJpsiDps1CascadeSV1", "BcJpsiDps1CascadeSV2", "BcJpsiDps1CascadeSV3"],
+    KeepPVTracks         = True)
+
+ToolSvc += BPHY15_thinningTool_PV
+print(BPHY15_thinningTool_PV)
+
+## b) thinning out tracks that are not attached to muons. The final thinning decision is based on the OR operation
+##    between decision from this and the previous tools.
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__MuonTrackParticleThinning
+BPHY15MuonTPThinningTool = DerivationFramework__MuonTrackParticleThinning(
+    name                   = "BPHY15MuonTPThinningTool",
+    MuonKey                = "Muons",
+    InDetTrackParticlesKey = "InDetTrackParticles")
+
+ToolSvc += BPHY15MuonTPThinningTool
+print(BPHY15MuonTPThinningTool)
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS  
+#====================================================================
+
+thiningCollection = [] 
+
+print(thiningCollection)
+
+# The name of the kernel (BPHY15Kernel in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+DerivationFrameworkJob += CfgMgr.DerivationFramework__DerivationKernel(
+    "BPHY15Kernel",
+    AugmentationTools = [BPHY15JpsiSelectAndWrite, BPHY15_Select_Jpsi2mumu,
+                         BPHY15BcJpsipiSelectAndWrite, BPHY15_Select_Bc2Jpsipi,
+                         BPHY15JpsipiSelectAndWrite, BPHY15_Select_Jpsipi,
+                         BPHY15DiTrkSelectAndWrite, BPHY15_Select_D0, BPHY15_Select_D0b,
+                         BPHY15Dh3SelectAndWrite, BPHY15_Select_Ds, BPHY15_Select_Dp, BPHY15_Select_Dm,
+                         BPHY15JpsiDs,
+                         BPHY15JpsiDp,
+                         BPHY15JpsiDpst,
+                         BPHY15K0SelectAndWrite, BPHY15_Select_K0,
+                         BPHY15JpsiDps1,
+                         BPHY15_AugOriginalCounts],
+    #Only skim if not MC
+    SkimmingTools     = [BPHY15SkimmingOR] if not isSimulation else [],
+    ThinningTools     = thiningCollection
+    )
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+streamName   = derivationFlags.WriteDAOD_BPHY15Stream.StreamName
+fileName     = buildFileName( derivationFlags.WriteDAOD_BPHY15Stream )
+BPHY15Stream  = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY15Stream.AcceptAlgs(["BPHY15Kernel"])
+
+# Special lines for thinning
+# Thinning service name must match the one passed to the thinning tools
+from AthenaServices.Configurables import ThinningSvc, createThinningSvc
+augStream = MSMgr.GetStream( streamName )
+evtStream = augStream.GetEventStream()
+
+BPHY15ThinningSvc = createThinningSvc( svcName="BPHY15ThinningSvc", outStreams=[evtStream] )
+svcMgr += BPHY15ThinningSvc
+
+#====================================================================
+# Slimming 
+#====================================================================
+
+# Added by ASC
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY15SlimmingHelper = SlimmingHelper("BPHY15SlimmingHelper")
+AllVariables  = []
+StaticContent = []
+
+# Needed for trigger objects
+BPHY15SlimmingHelper.IncludeMuonTriggerContent  = TRUE
+BPHY15SlimmingHelper.IncludeBPhysTriggerContent = TRUE
+
+## primary vertices
+AllVariables  += ["PrimaryVertices"]
+StaticContent += ["xAOD::VertexContainer#BPHY15RefittedPrimaryVertices"]
+StaticContent += ["xAOD::VertexAuxContainer#BPHY15RefittedPrimaryVerticesAux."]
+
+## ID track particles
+AllVariables += ["InDetTrackParticles"]
+
+## combined / extrapolated muon track particles 
+## (note: for tagged muons there is no extra TrackParticle collection since the ID tracks
+##        are store in InDetTrackParticles collection)
+AllVariables += ["CombinedMuonTrackParticles"]
+AllVariables += ["ExtrapolatedMuonTrackParticles"]
+
+## muon container
+AllVariables += ["Muons"] 
+
+
+## Jpsi candidates 
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY15JpsiSelectAndWrite.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY15JpsiSelectAndWrite.OutputVtxContainerName]
+
+## Bc+>J/psi pi+ candidates
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY15BcJpsipiSelectAndWrite.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY15BcJpsipiSelectAndWrite.OutputVtxContainerName]
+
+## K+K-, Kpi, D0/D0bar candidates
+#StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY15DiTrkSelectAndWrite.OutputVtxContainerName]
+#StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY15DiTrkSelectAndWrite.OutputVtxContainerName]
+
+## D_(s)+/- candidates
+#StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY15Dh3SelectAndWrite.OutputVtxContainerName]
+#StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY15Dh3SelectAndWrite.OutputVtxContainerName]
+
+## Jpsi pi+ candidates
+#StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY15JpsipiSelectAndWrite.OutputVtxContainerName]
+#StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY15JpsipiSelectAndWrite.OutputVtxContainerName]
+
+## K_S0 candidates
+#StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY15K0SelectAndWrite.OutputVtxContainerName]
+#StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY15K0SelectAndWrite.OutputVtxContainerName]
+
+## Bc+>J/psi D_(s)+/-, J/psi D*+/- and J/psi D_s1+/- candidates
+for cascades in CascadeCollections:
+   StaticContent += ["xAOD::VertexContainer#%s"   %     cascades]
+   StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % cascades]
+
+# Tagging information (in addition to that already requested by usual algorithms)
+AllVariables += ["GSFTrackParticles", "MuonSpectrometerTrackParticles" ] 
+
+# Added by ASC
+# Truth information for MC only
+if isSimulation:
+    AllVariables += ["TruthEvents","TruthParticles","TruthVertices","MuonTruthParticles"]
+
+AllVariables = list(set(AllVariables)) # remove duplicates
+
+BPHY15SlimmingHelper.AllVariables = AllVariables
+BPHY15SlimmingHelper.StaticContent = StaticContent
+BPHY15SlimmingHelper.SmartCollections = []
+
+BPHY15SlimmingHelper.AppendContentToStream(BPHY15Stream)
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY16.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY16.py
new file mode 100644
index 000000000000..44d8383d9432
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY16.py
@@ -0,0 +1,288 @@
+#====================================================================
+# BPHY16.py
+#====================================================================
+
+# Set up common services and job object. 
+# This should appear in ALL derivation job options
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+print(isSimulation)
+
+#====================================================================
+# AUGMENTATION TOOLS 
+#====================================================================
+## 1/ setup vertexing tools and services
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY16_VertexTools = BPHYVertexTools("BPHY16")
+
+#--------------------------------------------------------------------
+## 2/ Setup the vertex fitter tools (e.g. JpsiFinder, JpsiPlus1Track, etc).
+##    These are general tools independent of DerivationFramework that do the 
+##    actual vertex fitting and some pre-selection.
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder
+BPHY16JpsiFinder = Analysis__JpsiFinder(
+    name                        = "BPHY16JpsiFinder",
+    OutputLevel                 = INFO,
+    muAndMu                     = True,
+    muAndTrack                  = False,
+    TrackAndTrack               = False,
+    assumeDiMuons               = True,    # If true, will assume dimu hypothesis and use PDG value for mu mass
+    invMassUpper                = 12000.0,
+    invMassLower                = 8000.,
+    Chi2Cut                     = 20.,
+    oppChargesOnly	        = True,
+    atLeastOneComb              = True,
+    useCombinedMeasurement      = False, # Only takes effect if combOnly=True	
+    muonCollectionKey           = "Muons",
+    TrackParticleCollection     = "InDetTrackParticles",
+    V0VertexFitterTool          = BPHY16_VertexTools.TrkV0Fitter, # V0 vertex fitter
+    useV0Fitter                 = False, # if False a TrkVertexFitterTool will be used
+    TrkVertexFitterTool         = BPHY16_VertexTools.TrkVKalVrtFitter, # VKalVrt vertex fitter
+    TrackSelectorTool           = BPHY16_VertexTools.InDetTrackSelectorTool,
+    VertexPointEstimator        = BPHY16_VertexTools.VtxPointEstimator,
+    useMCPCuts                  = False )
+
+ToolSvc += BPHY16JpsiFinder
+print(BPHY16JpsiFinder)
+
+#--------------------------------------------------------------------
+## 3/ setup the vertex reconstruction "call" tool(s). They are part of the derivation framework.
+##    These Augmentation tools add output vertex collection(s) into the StoreGate and add basic 
+##    decorations which do not depend on the vertex mass hypothesis (e.g. lxy, ptError, etc).
+##    There should be one tool per topology, i.e. Jpsi and Psi(2S) do not need two instance of the
+##    Reco tool is the JpsiFinder mass window is wide enough.
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY16_Reco_mumu = DerivationFramework__Reco_Vertex(
+  name                   = "BPHY16_Reco_mumu",
+  VertexSearchTool             = BPHY16JpsiFinder,
+  OutputVtxContainerName = "BPHY16OniaCandidates",
+  PVContainerName        = "PrimaryVertices",
+  RefPVContainerName     = "BPHY16RefittedPrimaryVertices",
+  RefitPV                = True,
+  MaxPVrefit             = 100000,
+  DoVertexType           = 7)
+  
+ToolSvc += BPHY16_Reco_mumu
+print(BPHY16_Reco_mumu)
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+
+## a/ augment and select Jpsi->mumu candidates
+BPHY16_Select_Upsi = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY16_Select_Upsi",
+  HypothesisName        = "Upsilon",
+  InputVtxContainerName = "BPHY16OniaCandidates",
+  VtxMassHypo           = 9460.30,
+  MassMin               = 8000.,
+  MassMax               = 12000.,
+  Chi2Max               = 200,
+  DoVertexType          = 7)
+  
+ToolSvc += BPHY16_Select_Upsi
+print(BPHY16_Select_Upsi)
+
+
+## 4/ setup a new vertexing tool (necessary due to use of mass constraint) 
+from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+BPHY16VertexFit = Trk__TrkVKalVrtFitter(
+                                         name                = "BPHY16VertexFit",
+                                         Extrapolator        = BPHY16_VertexTools.InDetExtrapolator,
+                                         FirstMeasuredPoint  = True,
+                                         MakeExtendedVertex  = True)
+ToolSvc += BPHY16VertexFit
+print(BPHY16VertexFit)
+
+## 5/ setup the Jpsi+2 track finder
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiPlus2Tracks
+BPHY16Plus2Tracks = Analysis__JpsiPlus2Tracks(name = "BPHY16Plus2Tracks",
+#                                        OutputLevel = DEBUG,
+kaonkaonHypothesis			= False,
+pionpionHypothesis                      = False,
+kaonpionHypothesis                      = False,
+ManualMassHypo                          = [ 105.658, 105.658, 105.658, 105.658 ],
+trkThresholdPt			        = 0.0,
+trkMaxEta				= 3.0,
+BMassUpper		                = 50000.0,
+BMassLower			        = 0,
+oppChargesOnly                          = False,
+#DiTrackMassUpper = 1019.445 + 100.,
+#DiTrackMassLower = 1019.445 - 100.,
+Chi2Cut                             = 100.0,
+#TrkQuadrupletMassUpper      = 60000.0,
+#TrkQuadrupletMassLower      = 0.01,
+JpsiContainerKey                    = "BPHY16OniaCandidates",
+TrackParticleCollection             = "InDetTrackParticles",
+MuonsUsedInJpsi			    = "Muons",
+ExcludeJpsiMuonsOnly                = True,
+RequireNMuonTracks                  = 1,
+TrkVertexFitterTool		    = BPHY16VertexFit,
+TrackSelectorTool		    = BPHY16_VertexTools.InDetTrackSelectorTool,
+UseMassConstraint		    = False)
+
+ToolSvc += BPHY16Plus2Tracks
+print(BPHY16Plus2Tracks)    
+
+## 6/ setup the combined augmentation/skimming tool for the Bpm
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex	
+BPHY16FourTrackSelectAndWrite = DerivationFramework__Reco_Vertex(name           = "BPHY16FourTrackSelectAndWrite",
+                                                           Jpsi2PlusTrackName       = BPHY16Plus2Tracks,
+                                                           OutputVtxContainerName   = "BPHY16FourTrack",
+                                                           PVContainerName          = "PrimaryVertices",
+                                                           RefPVContainerName       = "BPHY16RefittedPrimaryVertices",
+                                                           RefitPV                  = True,
+                                                           MaxPVrefit               = 10000, DoVertexType = 7)
+ToolSvc += BPHY16FourTrackSelectAndWrite 
+print(BPHY16FourTrackSelectAndWrite)
+
+
+BPHY16_Select_FourTrack      = DerivationFramework__Select_onia2mumu(
+  name                       = "BPHY16_Select_FourTracks",
+  HypothesisName             = "FourTracks",
+  InputVtxContainerName      = "BPHY16FourTrack",
+  TrkMasses                  = [105.658, 105.658, 105.658, 105.658],
+  VtxMassHypo                = 18100.0,
+  MassMin                    = 0,
+  MassMax                    = 500000,
+  Chi2Max                    = BPHY16Plus2Tracks.Chi2Cut)
+
+ToolSvc += BPHY16_Select_FourTrack
+print(BPHY16_Select_FourTrack)
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__ReVertex
+BPHY16_Revertex      = DerivationFramework__ReVertex(
+  name                       = "BPHY16_ReVertex",
+  InputVtxContainerName      = "BPHY16FourTrack",
+  TrackIndices               = [ 2, 3 ],
+  TrkVertexFitterTool		    = BPHY16VertexFit,
+  OutputVtxContainerName     = "BPHY16TwoTrack"
+)
+
+ToolSvc += BPHY16_Revertex
+print(BPHY16_Revertex)
+
+BPHY16_Select_TwoTrack      = DerivationFramework__Select_onia2mumu(
+  name                       = "BPHY16_Select_TwoTracks",
+  HypothesisName             = "TwoTracks",
+  InputVtxContainerName      = "BPHY16TwoTrack",
+  TrkMasses                  = [105.658, 105.658],
+  VtxMassHypo                = 18100.0,
+  MassMin                    = 1,
+  MassMax                    = 500000,
+  Chi2Max                    = 90)
+
+ToolSvc += BPHY16_Select_TwoTrack
+print(BPHY16_Select_TwoTrack)
+
+expression = "count(BPHY16FourTrack.passed_FourTracks) > 0"
+
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+BPHY16_SelectEvent = DerivationFramework__xAODStringSkimmingTool(name = "BPHY16_SelectEvent",
+                                                                expression = expression)
+ToolSvc += BPHY16_SelectEvent
+print(BPHY16_SelectEvent)
+
+#--------------------------------------------------------------------
+## 6/ track and vertex thinning. We want to remove all reconstructed secondary vertices
+##    which hasn't passed any of the selections defined by (Select_*) tools.
+##    We also want to keep only tracks which are associates with either muons or any of the
+##    vertices that passed the selection. Multiple thinning tools can perform the 
+##    selection. The final thinning decision is based OR of all the decisions (by default,
+##    although it can be changed by the JO).
+
+## a) thining out vertices that didn't pass any selection and idetifying tracks associated with 
+##    selected vertices. The "VertexContainerNames" is a list of the vertex containers, and "PassFlags"
+##    contains all pass flags for Select_* tools that must be satisfied. The vertex is kept is it 
+##    satisfy any of the listed selections.
+
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS  
+#====================================================================
+## 7/ IMPORTANT bit. Don't forget to pass the tools to the DerivationKernel! If you don't do that, they will not be 
+##    be executed!
+
+
+# The name of the kernel (BPHY16Kernel in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+DerivationFrameworkJob += CfgMgr.DerivationFramework__DerivationKernel(
+  "BPHY16Kernel",
+   AugmentationTools = [BPHY16_Reco_mumu, BPHY16_Select_Upsi, BPHY16FourTrackSelectAndWrite, BPHY16_Select_FourTrack, BPHY16_Revertex, BPHY16_Select_TwoTrack],
+   SkimmingTools     = [BPHY16_SelectEvent]
+   )
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+streamName = derivationFlags.WriteDAOD_BPHY16Stream.StreamName
+fileName   = buildFileName( derivationFlags.WriteDAOD_BPHY16Stream )
+BPHY16Stream = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY16Stream.AcceptAlgs(["BPHY16Kernel"])
+# Special lines for thinning
+# Thinning service name must match the one passed to the thinning tools
+from AthenaServices.Configurables import ThinningSvc, createThinningSvc
+augStream = MSMgr.GetStream( streamName )
+evtStream = augStream.GetEventStream()
+svcMgr += createThinningSvc( svcName="BPHY16ThinningSvc", outStreams=[evtStream] )
+
+
+#====================================================================
+# Slimming 
+#====================================================================
+
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY16SlimmingHelper = SlimmingHelper("BPHY16SlimmingHelper")
+AllVariables = []
+StaticContent = []
+
+# Needed for trigger objects
+BPHY16SlimmingHelper.IncludeMuonTriggerContent = True
+BPHY16SlimmingHelper.IncludeBPhysTriggerContent = True
+
+## primary vertices
+AllVariables += ["PrimaryVertices"]
+StaticContent += ["xAOD::VertexContainer#BPHY16RefittedPrimaryVertices"]
+StaticContent += ["xAOD::VertexAuxContainer#BPHY16RefittedPrimaryVerticesAux."]
+
+## ID track particles
+AllVariables += ["InDetTrackParticles"]
+
+## combined / extrapolated muon track particles 
+## (note: for tagged muons there is no extra TrackParticle collection since the ID tracks
+##        are store in InDetTrackParticles collection)
+AllVariables += ["CombinedMuonTrackParticles"]
+AllVariables += ["ExtrapolatedMuonTrackParticles"]
+
+## muon container
+AllVariables += ["Muons"]
+
+
+StaticContent += ["xAOD::VertexContainer#%s"        % BPHY16_Reco_mumu.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY16_Reco_mumu.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY16_Reco_mumu.OutputVtxContainerName]
+
+StaticContent += ["xAOD::VertexContainer#%s"        % BPHY16FourTrackSelectAndWrite.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY16FourTrackSelectAndWrite.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY16FourTrackSelectAndWrite.OutputVtxContainerName]
+
+StaticContent += ["xAOD::VertexContainer#%s"        % BPHY16_Revertex.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY16_Revertex.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY16_Revertex.OutputVtxContainerName]
+
+
+# Truth information for MC only
+if isSimulation:
+    AllVariables += ["TruthEvents","TruthParticles","TruthVertices","MuonTruthParticles"]
+
+BPHY16SlimmingHelper.AllVariables = AllVariables
+BPHY16SlimmingHelper.StaticContent = StaticContent
+BPHY16SlimmingHelper.AppendContentToStream(BPHY16Stream)
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY17.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY17.py
new file mode 100644
index 000000000000..fcd3b47a2e68
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY17.py
@@ -0,0 +1,316 @@
+#====================================================================
+# BPHY17.py
+# This an example job options script showing how to set up a
+# derivation of the data using the derivation framework.
+# It requires the reductionConf flag BPHY17 in Reco_tf.py
+#====================================================================
+
+# Set up common services and job object.
+# This should appear in ALL derivation job options
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+isSimulation = globalflags.DataSource()=='geant4'
+
+print(isSimulation)
+
+
+#====================================================================
+# AUGMENTATION TOOLS
+#====================================================================
+## 1/ setup vertexing tools and services
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY17_VertexTools = BPHYVertexTools("BPHY17")
+
+from InDetTrackSelectorTool.InDetTrackSelectorToolConf import InDet__InDetDetailedTrackSelectorTool
+InDetTrackSelectorTool = InDet__InDetDetailedTrackSelectorTool(name = "BPHY17_CascadeTrackSelectorTool",
+        pTMin                = 1000.0,
+        IPd0Max              = 10000.0,
+        IPz0Max              = 10000.0,
+        z0Max                = 10000.0,
+        sigIPd0Max           = 10000.0,
+        sigIPz0Max           = 10000.0,
+        d0significanceMax    = -1.,
+        z0significanceMax    = -1.,
+        etaMax               = 9999.,
+        useTrackSummaryInfo  = True,
+        nHitBLayer           = 0,
+        nHitPix              = 1,
+        nHitBLayerPlusPix    = 1,
+        nHitSct              = 2,
+        nHitSi               = 3,
+        nHitTrt              = 0,
+        nHitTrtHighEFractionMax = 10000.0,
+        useSharedHitInfo     = False,
+        useTrackQualityInfo  = True,
+        fitChi2OnNdfMax      = 10000.0,
+        TrtMaxEtaAcceptance  = 1.9,
+        TrackSummaryTool     = BPHY17_VertexTools.InDetTrackSummaryTool,
+        Extrapolator         = BPHY17_VertexTools.InDetExtrapolator
+       )
+
+ToolSvc += InDetTrackSelectorTool
+print(InDetTrackSelectorTool)
+
+#BPHY17_VertexTools.TrkVKalVrtFitter.OutputLevel = DEBUG
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Cascade3Plus1
+BPHY17BsDsPi            = DerivationFramework__Cascade3Plus1(
+    name                    = "BPHY17BsDsPi",
+    TrackMassHyp            = [ 493.677, 493.677, 139.57018, 139.57018 ],
+    PTCutPerTrack           = [ 0,0,1500, 1500],
+    HypothesisName          = "Bs",
+    Track3Name              = "Ds",
+    TrackSelectorTool       = InDetTrackSelectorTool,
+    TrkVertexFitterTool     = BPHY17_VertexTools.TrkVKalVrtFitter,
+    PVContainerName          = "PrimaryVertices",
+    RefitPV                 = True,
+    #OutputLevel             = DEBUG,
+    RefPVContainerName      = "BPHY17RefittedPrimaryVertices",
+    CascadeVertexCollections= ["BPHY17CascadeVtx1", "BPHY17CascadeVtx2"],
+    ThreeVertexOutputContainer = "BPHY17DsKaonVertexes", EliminateBad3Tracksfrom4Track = True,
+    ThreeTrackChi2NDF = 6,
+    TwoTrackMassMin	= 1009.0,
+    TwoTrackMassMax	= 1031.0,
+    ThreeTrackMassMin = 1800.47,
+    ThreeTrackMassMax = 2100.0,
+    FourTrackMassMin = 5100.0,
+    FourTrackMassMax = 5600.0,
+    ThreeTracksMass	= 1968.47,
+    FourTracksMass	= 5366.79,
+    Chi2NDFCut     = 10,
+    FourTrackMassFinalMin = 5150.,
+    FourTrackMassFinalMax = 5650.0,
+    ThreeTrackMassConstraint = False,
+    CopyAllVertices  = False
+    )
+
+ToolSvc += BPHY17BsDsPi
+print(BPHY17BsDsPi)
+
+###
+BPHY17BsDsPiMuons            = DerivationFramework__Cascade3Plus1(
+    name                    = "BPHY17BsDsPiMuons",
+    TrackMassHyp            = [ 105.658374, 105.658374, 139.57018, 139.57018 ],
+    PTCutPerTrack           = [ 0,0,1500, 1500],
+    HypothesisName          = "Bs",
+    Track3Name              = "Ds",
+    TrackSelectorTool       = InDetTrackSelectorTool,
+    TrkVertexFitterTool     = BPHY17_VertexTools.TrkVKalVrtFitter,
+    PVContainerName          = "PrimaryVertices",
+    RefitPV                 = True,
+    #OutputLevel             = DEBUG,
+    RefPVContainerName      = "BPHY17RefittedPrimaryVerticesMuons",
+    CascadeVertexCollections= ["BPHY17CascadeMuonVtx1", "BPHY17CascadeMuonVtx2"],
+    ThreeVertexOutputContainer = "BPHY17DsMuonVertexes", EliminateBad3Tracksfrom4Track = True,
+    ThreeTrackChi2NDF = 10,
+    TwoTrackMassMin     =  860.0,
+    TwoTrackMassMax     = 1180.0,
+    ThreeTrackMassMin = 1800.47,
+    ThreeTrackMassMax = 2100.0,
+    FourTrackMassMin = 5100.0,
+    FourTrackMassMax = 5550.0,
+    ThreeTracksMass	= 1968.47,
+    FourTracksMass	= 5366.79,
+    Chi2NDFCut     = 10,
+    FourTrackMassFinalMin = 5150.,
+    FourTrackMassFinalMax = 5500.0,
+    ThreeTrackMassConstraint = False,
+    UseMuonsForTracks = [0, 1],
+    CopyAllVertices  = False
+    )
+
+ToolSvc += BPHY17BsDsPiMuons
+print(BPHY17BsDsPiMuons)
+
+###
+BPHY17BsDsMuSemiLepMuons            = DerivationFramework__Cascade3Plus1(
+    name                    = "BPHY17BsDsMuSemiLepMuons",
+    TrackMassHyp            = [ 105.658374, 105.658374, 139.57018, 105.658374 ],
+    PTCutPerTrack           = [ 0,0,1500, 0],
+    HypothesisName          = "Bs",
+    Track3Name              = "Ds",
+    TrackSelectorTool       = InDetTrackSelectorTool,
+    TrkVertexFitterTool     = BPHY17_VertexTools.TrkVKalVrtFitter,
+    PVContainerName          = "PrimaryVertices",
+    RefitPV                 = True,
+    #OutputLevel             = DEBUG,
+    RefPVContainerName      = "BPHY17RefittedPrimaryVerticesMuonsSemiLep",
+    CascadeVertexCollections= ["BPHY17CascadeMuonSemiLepVtx1", "BPHY17CascadeMuonSemiLepVtx2"],
+    ThreeVertexOutputContainer = "BPHY17DsMuonSemiLepVertexes", EliminateBad3Tracksfrom4Track = True,
+    ThreeTrackChi2NDF = 10,
+    TwoTrackMassMin     =  860.0,
+    TwoTrackMassMax     = 1180.0,
+    ThreeTrackMassMin = 1800.47,
+    ThreeTrackMassMax = 2100.0,
+    FourTrackMassMin = 0.,
+    FourTrackMassMax = 999999.0,
+    ThreeTracksMass	= 1968.47,
+    FourTracksMass	= 5366.79,
+    Chi2NDFCut     = 10,
+    FourTrackMassFinalMin = 0,
+    FourTrackMassFinalMax = 999999.0,
+    ThreeTrackMassConstraint = False,
+    UseMuonsForTracks = [0, 1, 3],
+    CopyAllVertices  = False
+    )
+
+ToolSvc += BPHY17BsDsMuSemiLepMuons
+print(BPHY17BsDsMuSemiLepMuons)
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+BPHY17_Select_DsPhiKK = DerivationFramework__Select_onia2mumu(
+  name                       = "BPHY17_Select_DsPhiKK",
+  HypothesisName             = "DsPhiKK",
+  InputVtxContainerName      = BPHY17BsDsPi.ThreeVertexOutputContainer,
+  TrkMasses                  = [493.677, 493.677, 139.57018],
+  VtxMassHypo                = 1968.47,
+  MassMin                    = 1000.0,
+  MassMax                    = 3000.0, Do3d = False, DoVertexType = 1,
+  Chi2Max                    = 200)
+
+ToolSvc += BPHY17_Select_DsPhiKK
+print(BPHY17_Select_DsPhiKK)
+
+BPHY17_Select_DsPhiMM = DerivationFramework__Select_onia2mumu(
+  name                       = "BPHY17_Select_DsPhiMM",
+  HypothesisName             = "DsPhiMM",
+  InputVtxContainerName      = BPHY17BsDsPiMuons.ThreeVertexOutputContainer,
+  TrkMasses                  = [105.658374, 105.658374, 139.57018],
+  VtxMassHypo                = 1968.47,
+  MassMin                    = 1000.0,
+  MassMax                    = 3000.0, Do3d = False, DoVertexType = 1,
+  Chi2Max                    = 200)
+
+ToolSvc += BPHY17_Select_DsPhiMM
+print(BPHY17_Select_DsPhiMM)
+
+
+BPHY17_Select_DsPhiMMSemi = DerivationFramework__Select_onia2mumu(
+  name                       = "BPHY17_Select_DsPhiMMSemi",
+  HypothesisName             = "DsPhiMMSemiLep",
+  InputVtxContainerName      = BPHY17BsDsMuSemiLepMuons.ThreeVertexOutputContainer,
+  TrkMasses                  = [105.658374, 105.658374, 139.57018],
+  VtxMassHypo                = 1968.47,
+  MassMin                    = 1000.0,
+  MassMax                    = 3000.0, Do3d = False, DoVertexType = 1,
+  Chi2Max                    = 200)
+
+ToolSvc += BPHY17_Select_DsPhiMMSemi
+print(BPHY17_Select_DsPhiMMSemi)
+
+###
+
+#--------------------------------------------------------------------
+## 5/ select the event. We only want to keep events that contain certain vertices which passed certain selection.
+##    This is specified by the "SelectionExpression" property, which contains the expression in the following format:
+##
+##       "ContainerName.passed_HypoName > count"
+##
+##    where "ContainerName" is output container form some Reco_* tool, "HypoName" is the hypothesis name setup in some "Select_*"
+##    tool and "count" is the number of candidates passing the selection you want to keep.
+
+expression = "count(%s.x > -999) > 0" % BPHY17BsDsPi.CascadeVertexCollections[0]
+expression += " || count(%s.x > -999) > 0" % BPHY17BsDsPiMuons.CascadeVertexCollections[0]
+expression += " || count(%s.x > -999) > 0" % BPHY17BsDsPi.ThreeVertexOutputContainer
+expression += " || count(%s.x > -999) > 0" % BPHY17BsDsPiMuons.ThreeVertexOutputContainer
+expression += " || count(%s.x > -999) > 0" % BPHY17BsDsMuSemiLepMuons.CascadeVertexCollections[0]
+expression += " || count(%s.x > -999) > 0" % BPHY17BsDsMuSemiLepMuons.ThreeVertexOutputContainer
+
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+BPHY17_SelectEvent = DerivationFramework__xAODStringSkimmingTool(name = "BPHY17_SelectEvent",
+                                                                expression = expression)
+ToolSvc += BPHY17_SelectEvent
+print(BPHY17_SelectEvent)
+
+MyVertexCollections = BPHY17BsDsPi.CascadeVertexCollections + BPHY17BsDsPiMuons.CascadeVertexCollections + BPHY17BsDsMuSemiLepMuons.CascadeVertexCollections + \
+                 [ BPHY17BsDsPi.ThreeVertexOutputContainer, BPHY17BsDsPiMuons.ThreeVertexOutputContainer, BPHY17BsDsMuSemiLepMuons.ThreeVertexOutputContainer ]
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxTrk
+BPHY17_thinningTool_Tracks = DerivationFramework__Thin_vtxTrk(
+  name                       = "BPHY17_thinningTool_Tracks",
+  TrackParticleContainerName = "InDetTrackParticles",
+  IgnoreFlags = True,
+  VertexContainerNames       = MyVertexCollections,
+  PassFlags                  = ["passed_DsPhiMM", "passed_DsPhiKK"] )
+
+ToolSvc += BPHY17_thinningTool_Tracks
+
+
+# Only save truth informtion directly associated with Onia
+from DerivationFrameworkMCTruth.DerivationFrameworkMCTruthConf import DerivationFramework__GenericTruthThinning
+BPHY17TruthThinTool = DerivationFramework__GenericTruthThinning(name                    = "BPHY17TruthThinTool",
+                                                        ParticleSelectionString = "TruthParticles.pdgId == 511 || TruthParticles.pdgId == -511 || TruthParticles.pdgId == 531 || TruthParticles.pdgId == -531",
+                                                        PreserveDescendants     = True,
+                                                        PreserveAncestors      = True)
+ToolSvc += BPHY17TruthThinTool
+print(BPHY17TruthThinTool)
+
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS
+#====================================================================
+## 7/ IMPORTANT bit. Don't forget to pass the tools to the DerivationKernel! If you don't do that, they will not be
+##    be executed!
+
+# Added by ASC
+BPHY17ThinningTools = [BPHY17_thinningTool_Tracks]
+if globalflags.DataSource()=='geant4':
+    BPHY17ThinningTools.append(BPHY17TruthThinTool)
+
+# The name of the kernel (BPHY17Kernel in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+DerivationFrameworkJob += CfgMgr.DerivationFramework__DerivationKernel(
+  "BPHY17Kernel",
+   AugmentationTools = [BPHY17BsDsPi, BPHY17BsDsPiMuons, BPHY17BsDsMuSemiLepMuons, BPHY17_Select_DsPhiKK, BPHY17_Select_DsPhiMM, BPHY17_Select_DsPhiMMSemi],
+   SkimmingTools     = [BPHY17_SelectEvent],
+   ThinningTools     = BPHY17ThinningTools,
+#   OutputLevel             = DEBUG
+   )
+
+#====================================================================
+# SET UP STREAM
+#====================================================================
+streamName = derivationFlags.WriteDAOD_BPHY17Stream.StreamName
+fileName   = buildFileName( derivationFlags.WriteDAOD_BPHY17Stream )
+BPHY17Stream = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY17Stream.AcceptAlgs(["BPHY17Kernel"])
+# Special lines for thinning
+# Thinning service name must match the one passed to the thinning tools
+from AthenaServices.Configurables import ThinningSvc, createThinningSvc
+augStream = MSMgr.GetStream( streamName )
+evtStream = augStream.GetEventStream()
+svcMgr += createThinningSvc( svcName="BPHY17ThinningSvc", outStreams=[evtStream] )
+
+
+#====================================================================
+# Slimming
+#====================================================================
+
+# Added by ASC
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY17SlimmingHelper = SlimmingHelper("BPHY17SlimmingHelper")
+AllVariables = []
+StaticContent = []
+
+# Needed for trigger objects
+BPHY17SlimmingHelper.IncludeBPhysTriggerContent = False
+BPHY17SlimmingHelper.IncludeMuonTriggerContent = False
+## primary vertices
+AllVariables += ["PrimaryVertices"]
+
+for f in MyVertexCollections + [BPHY17BsDsPi.RefPVContainerName, BPHY17BsDsPiMuons.RefPVContainerName + BPHY17BsDsMuSemiLepMuons.RefPVContainerName ]:
+   StaticContent += ["xAOD::VertexContainer#%s"        %                 f]
+   StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % f]
+
+## ID track particles
+AllVariables += ["InDetTrackParticles"]
+AllVariables += ["Muons"]
+
+# Truth information for MC only
+if isSimulation:
+    AllVariables += ["TruthEvents","TruthParticles","TruthVertices"]
+
+BPHY17SlimmingHelper.AllVariables = AllVariables
+BPHY17SlimmingHelper.StaticContent = StaticContent
+BPHY17SlimmingHelper.AppendContentToStream(BPHY17Stream)
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY18.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY18.py
new file mode 100644
index 000000000000..fdabaaacdfbd
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY18.py
@@ -0,0 +1,506 @@
+#====================================================================
+# BPHY18.py
+# B0 -> K*ee 
+# It requires the reductionConf flag BPHY18 in Reco_tf.py   
+#====================================================================
+
+
+#====================================================================
+# FLAGS TO PERSONALIZE THE DERIVATION
+#====================================================================
+
+onlyAugmentations = False  
+thinTruth = False
+skimTruth = False
+
+
+# Set up common services and job object. 
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+from DerivationFrameworkMuons.MuonsCommon import *
+from DerivationFrameworkJetEtMiss.JetCommon import *
+from DerivationFrameworkEGamma.EGammaCommon import *
+from DerivationFrameworkEGamma.ElectronsCPContent import *
+
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+print(isSimulation)
+
+
+#====================================================================
+# AUGMENTATION TOOLS 
+#====================================================================
+## 1/ setup vertexing tools and services
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY18_VertexTools = BPHYVertexTools("BPHY18")
+
+
+print('********************** VERTEX TOOLS ***********************')
+print(BPHY18_VertexTools)
+print(BPHY18_VertexTools.TrkV0Fitter)
+print('********************** END VERTEX TOOLS ***********************')
+
+#====================================================================
+# TriggerCounting for Kernel1 #Added by Matteo
+#====================================================================
+#List of trigggers to be counted (high Sig-eff*Lumi ones are in)
+triggersToMetadata = [
+"HLT_2e5_lhvloose_nod0_bBeexM6000t",  #37,143,877  inb
+"HLT_e5_lhvloose_nod0_bBeexM6000t",  #37,143,877
+"HLT_e5_lhvloose_nod0_bBeexM6000t_2mu4_nomucomb_L1BPH-0DR3-EM7J15_2MU4",   #37,312,506
+"HLT_e5_lhvloose_nod0_bBeexM6000t_mu6_nomucomb_L1BPH-0DR3-EM7J15_MU6",   #27,041,892
+"HLT_e5_lhvloose_nod0_bBeexM6000_mu6_nomucomb_L1BPH-0DR3-EM7J15_MU6",   #149,100	
+"HLT_e9_lhloose_bBeexM2700_2mu4_nomucomb_L1BPH-0DR3-EM7J15_2MU4",   #2,681,764
+"HLT_e9_lhloose_bBeexM2700_mu6_nomucomb_L1BPH-0DR3-EM7J15_MU6",   #1,979,362
+"HLT_e9_lhloose_bBeexM6000_2mu4_nomucomb_L1BPH-0DR3-EM7J15_2MU4",   #3,359,105
+"HLT_e9_lhloose_bBeexM6000_mu6_nomucomb_L1BPH-0DR3-EM7J15_MU6",   #2,426,663
+"HLT_e9_lhloose_e5_lhloose_bBeexM2700_2mu4_nomucomb_L1BPH-0M9-EM7-EM5_2MU4",   #2,950,935
+"HLT_e9_lhloose_e5_lhloose_bBeexM2700_mu6_nomucomb_L1BPH-0M9-EM7-EM5_MU6",   #2,928,030
+"HLT_e9_lhloose_e5_lhloose_bBeexM6000_2mu4_nomucomb_L1BPH-0M9-EM7-EM5_2MU4",   #3,647,507
+"HLT_e9_lhloose_e5_lhloose_bBeexM6000_mu6_nomucomb_L1BPH-0M9-EM7-EM5_MU6",   #3,605,371
+"HLT_e9_lhvloose_nod0_e5_lhvloose_nod0_bBeexM6000t_2mu4_nomucomb_L1BPH-0M9-EM7-EM5_2MU4",   #40,169,436
+"HLT_e9_lhvloose_nod0_e5_lhvloose_nod0_bBeexM6000t_mu6_nomucomb_L1BPH-0M9-EM7-EM5_MU6",   #37,312,506
+"HLT_e9_lhvloose_nod0_e5_lhvloose_nod0_bBeexM6000_mu6_nomucomb_L1BPH-0M9-EM7-EM5_MU6",   #677,340
+
+'HLT_3mu4_bDimu2700',  'HLT_3mu6_bDimu',  'HLT_mu6_2mu4_bDimu2700','HLT_mu11_mu6_bJpsimumu',  'HLT_3mu4_bJpsi', 'HLT_mu11_mu6_bDimu', 'HLT_2mu6_bBmumu_Lxy0_L1BPH-2M9-2MU6_BPH-2DR15-2MU6','HLT_2mu6_bJpsimumu_L1BPH-2M9-2MU6_BPH-2DR15-2MU6',   'HLT_2mu10_bBmumuxv2',  'HLT_mu6_mu4_bDimu',   'HLT_2mu6_bBmumuxv2_L1LFV-MU6', 'HLT_mu11_mu6_bJpsimumu_Lxy0',  'HLT_mu11_mu6_bDimu2700', 'HLT_mu11_mu6_bBmumux_BpmumuKp', 'HLT_mu6_mu4_bJpsimumu_Lxy0_L1BPH-2M9-MU6MU4_BPH-0DR15-MU6MU4',   'HLT_mu11_mu6_bBmumuxv2', 'HLT_mu6_2mu4_bJpsi', 'HLT_2mu6_bBmumux_BpmumuKp_L1BPH-2M9-2MU6_BPH-2DR15-2MU6', 'HLT_2mu6_bJpsimumu_Lxy0_L1BPH-2M9-2MU6_BPH-2DR15-2MU6', 'HLT_3mu6_bJpsi', 'HLT_mu11_mu6_bBmumu']
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__TriggerCountToMetadata
+BPHY18TriggerCountToMetadata = DerivationFramework__TriggerCountToMetadata(name = "BPHY18TriggerCount",
+                                                                           TriggerList = triggersToMetadata,
+                                                                           FolderName = "BPHY18")
+
+ToolSvc += BPHY18TriggerCountToMetadata
+
+#====================================================================
+# PRESELECTION for Kernel1 #Added by Matteo
+#====================================================================
+## 1/ Setup the skimming based on triggers
+##     
+
+triggerList = ["HLT_e5_lhvloose_nod0_bBeexM6000t_2mu4_nomucomb_L1BPH-0DR3-EM7J15_2MU4",   #37,312,506
+"HLT_e5_lhvloose_nod0_bBeexM6000t_mu6_nomucomb_L1BPH-0DR3-EM7J15_MU6",   #27,041,892
+"HLT_e5_lhvloose_nod0_bBeexM6000_mu6_nomucomb_L1BPH-0DR3-EM7J15_MU6",   #149,100	
+"HLT_e9_lhloose_bBeexM2700_2mu4_nomucomb_L1BPH-0DR3-EM7J15_2MU4",   #2,681,764
+"HLT_e9_lhloose_bBeexM2700_mu6_nomucomb_L1BPH-0DR3-EM7J15_MU6",   #1,979,362
+"HLT_e9_lhloose_bBeexM6000_2mu4_nomucomb_L1BPH-0DR3-EM7J15_2MU4",   #3,359,105
+"HLT_e9_lhloose_bBeexM6000_mu6_nomucomb_L1BPH-0DR3-EM7J15_MU6",   #2,426,663
+"HLT_e9_lhloose_e5_lhloose_bBeexM2700_2mu4_nomucomb_L1BPH-0M9-EM7-EM5_2MU4",   #2,950,935
+"HLT_e9_lhloose_e5_lhloose_bBeexM2700_mu6_nomucomb_L1BPH-0M9-EM7-EM5_MU6",   #2,928,030
+"HLT_e9_lhloose_e5_lhloose_bBeexM6000_2mu4_nomucomb_L1BPH-0M9-EM7-EM5_2MU4",   #3,647,507
+"HLT_e9_lhloose_e5_lhloose_bBeexM6000_mu6_nomucomb_L1BPH-0M9-EM7-EM5_MU6",   #3,605,371
+"HLT_e9_lhvloose_nod0_e5_lhvloose_nod0_bBeexM6000t_2mu4_nomucomb_L1BPH-0M9-EM7-EM5_2MU4",   #40,169,436
+"HLT_e9_lhvloose_nod0_e5_lhvloose_nod0_bBeexM6000t_mu6_nomucomb_L1BPH-0M9-EM7-EM5_MU6",   #37,312,506
+"HLT_e9_lhvloose_nod0_e5_lhvloose_nod0_bBeexM6000_mu6_nomucomb_L1BPH-0M9-EM7-EM5_MU6",   #677,340
+"HLT_2e5_lhvloose_nod0_bBeexM6000t",  #37,143,877  inb
+"HLT_e5_lhvloose_nod0_bBeexM6000t"  #37,143,877
+]	# Seeded + Unseeded BeeX triggers
+
+triggerList_unseeded = ["HLT_2e5_lhvloose_nod0_bBeexM6000t",  #37,143,877  inb
+"HLT_e5_lhvloose_nod0_bBeexM6000t"  #37,143,877
+]
+
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__TriggerSkimmingTool
+BPHY18TriggerSkim = DerivationFramework__TriggerSkimmingTool(name = "BPHY18TriggerSkim",
+                                                             TriggerListOR = triggerList,
+							                                 TriggerListORHLTOnly = triggerList_unseeded )
+
+ToolSvc += BPHY18TriggerSkim
+print(BPHY18TriggerSkim)
+
+#do not know what this does, but let's leave it for now, until we see if it's useful or not!
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__AugOriginalCounts
+BPHY18_AugOriginalCounts = DerivationFramework__AugOriginalCounts(name = "BPHY18_AugOriginalCounts",
+                                                                  VertexContainer = "PrimaryVertices",
+                                                                  TrackContainer = "InDetTrackParticles" )
+ToolSvc += BPHY18_AugOriginalCounts
+
+#lhvloose_nod0
+from ElectronPhotonSelectorTools.ElectronPhotonSelectorToolsConf import AsgElectronLikelihoodTool
+ElectronLHSelectorLHvloose_nod0 = AsgElectronLikelihoodTool("ElectronLHSelectorLHvloosenod0", 
+ConfigFile="ElectronPhotonSelectorTools/offline/mc16_20190328_nod0/ElectronLikelihoodVeryLooseOfflineConfig2017_Smooth_nod0.conf")
+ElectronLHSelectorLHvloose_nod0.primaryVertexContainer = "PrimaryVertices"
+ToolSvc += ElectronLHSelectorLHvloose_nod0
+print(ElectronLHSelectorLHvloose_nod0)
+
+# decorate electrons with the output of LH vloose nod0
+ElectronPassLHvloosenod0 = DerivationFramework__EGSelectionToolWrapper(name = "ElectronPassLHvloosenod0",
+                                                                       EGammaSelectionTool = ElectronLHSelectorLHvloose_nod0,
+                                                                       EGammaFudgeMCTool = "",
+                                                                       CutType = "",
+                                                                       StoreGateEntryName = "DFCommonElectronsLHVeryLoosenod0",
+                                                                       ContainerName = "Electrons")
+ToolSvc += ElectronPassLHvloosenod0
+print(ElectronPassLHvloosenod0)
+
+#--------------------------------------------------------------------
+## 2/ setup JpsiFinder tool
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder_ee
+BPHY18DiElectronFinder = Analysis__JpsiFinder_ee(
+    name                        = "BPHY18DiElectronFinder",
+    OutputLevel                 = INFO,
+    elAndEl                     = True,
+    elAndTrack                  = False,
+    TrackAndTrack               = False,
+    assumeDiElectrons           = True, 
+    elThresholdPt               = 4000.0,
+    invMassUpper                = 7000.0,
+    invMassLower                = 1.0,
+    Chi2Cut                     = 30.,
+    oppChargesOnly	            = False,
+    allChargeCombinations       = True,
+    useElectronTrackMeasurement = True, 
+    electronCollectionKey       = "Electrons",
+    TrackParticleCollection     = "GSFTrackParticles",
+    useEgammaCuts               = True, 
+    V0VertexFitterTool          = BPHY18_VertexTools.TrkV0Fitter,            
+    useV0Fitter                 = False,                  
+    TrkVertexFitterTool         = BPHY18_VertexTools.TrkVKalVrtFitter,      
+    TrackSelectorTool           = BPHY18_VertexTools.InDetTrackSelectorTool,
+    VertexPointEstimator        = BPHY18_VertexTools.VtxPointEstimator,
+    ElectronSelection 		      = "d0_or_nod0"
+    )
+
+ToolSvc += BPHY18DiElectronFinder
+print(BPHY18DiElectronFinder)
+
+#--------------------------------------------------------------------
+## 3/ setup the vertex reconstruction "call" tool(s).
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY18DiElectronSelectAndWrite = DerivationFramework__Reco_Vertex(
+    name                   = "BPHY18DiElectronSelectAndWrite",
+    VertexSearchTool             = BPHY18DiElectronFinder,
+    OutputVtxContainerName = "BPHY18DiElectronCandidates",
+    PVContainerName        = "PrimaryVertices",
+    RefPVContainerName     = "SHOULDNOTBEUSED",
+    DoVertexType           = 7
+    )
+
+ToolSvc += BPHY18DiElectronSelectAndWrite
+print(BPHY18DiElectronSelectAndWrite)
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+BPHY18_Select_DiElectrons = DerivationFramework__Select_onia2mumu(
+    name                  = "BPHY18_Select_DiElectrons",
+    HypothesisName        = "Jpsi",
+    InputVtxContainerName = "BPHY18DiElectronCandidates",
+    VtxMassHypo           = 3096.916,
+    MassMin               = 1.0,
+    MassMax               = 7000.0,
+    Chi2Max               = 30,
+    DoVertexType          = 7
+    )
+  
+ToolSvc += BPHY18_Select_DiElectrons
+print(BPHY18_Select_DiElectrons)
+
+## 4/ setup a new vertexing tool (necessary due to use of mass constraint)
+from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+BeeKstVertexFit = Trk__TrkVKalVrtFitter(
+    name                = "BeeKstVertexFit",
+    Extrapolator        = BPHY18_VertexTools.InDetExtrapolator,
+    FirstMeasuredPoint  = True,
+    MakeExtendedVertex  = True
+    )
+
+ToolSvc += BeeKstVertexFit
+print(BeeKstVertexFit)
+
+## 5/ setup the Jpsi+2 track finder
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiPlus2Tracks
+BPHY18BeeKst = Analysis__JpsiPlus2Tracks(
+    name                    = "BPHY18BeeKstFinder",
+    OutputLevel             = INFO,
+    kaonkaonHypothesis	    = False,
+    pionpionHypothesis      = False,
+    kaonpionHypothesis      = True,
+    oppChargesOnly          = False,
+    SameChargesOnly         = False,
+    trkThresholdPt          = 500.0,
+    trkMaxEta		        = 3.0, 
+    BThresholdPt            = 1000.,
+    BMassLower              = 3000.0,
+    BMassUpper		        = 6500.0,
+    JpsiContainerKey	    = "BPHY18DiElectronCandidates",
+    TrackParticleCollection = "InDetTrackParticles",
+    ExcludeCrossJpsiTracks  = False,   
+    TrkVertexFitterTool	    = BeeKstVertexFit,
+    TrackSelectorTool	    = BPHY18_VertexTools.InDetTrackSelectorTool,
+    UseMassConstraint	    = False, 
+    DiTrackMassUpper        = 1110., 
+    DiTrackMassLower        = 690.,  
+    Chi2Cut                 = 15.0, 
+    DiTrackPt               = 500.,
+    TrkQuadrupletMassLower  = 1000.0, 
+    TrkQuadrupletMassUpper  = 10000.0, 
+    FinalDiTrackPt          = 500.,
+    UseGSFTrackIndices      = [0,1]
+    )
+
+ToolSvc += BPHY18BeeKst
+print(BPHY18BeeKst)
+
+## 6/ setup the combined augmentation/skimming tool for the BeeKst
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex	
+BPHY18BeeKstSelectAndWrite  = DerivationFramework__Reco_Vertex(
+    name                   = "BPHY18BeeKstSelectAndWrite",
+    Jpsi2PlusTrackName     = BPHY18BeeKst,
+    OutputVtxContainerName = "BeeKstCandidates",
+    PVContainerName        = "PrimaryVertices",
+    RefPVContainerName     = "BPHY18RefittedPrimaryVertices",
+    RefitPV                = True,
+    MaxPVrefit             = 10000,
+    DoVertexType           = 7
+    )
+
+ToolSvc += BPHY18BeeKstSelectAndWrite 
+print(BPHY18BeeKstSelectAndWrite)
+
+## b/ augment and select B->eeKst candidates
+BPHY18_Select_BeeKst = DerivationFramework__Select_onia2mumu(
+    name                  = "BPHY18_Select_BeeKst",
+    HypothesisName        = "Bd", 
+    InputVtxContainerName = "BeeKstCandidates",
+    TrkMasses             = [0.511, 0.511, 493.677, 139.570],
+    VtxMassHypo           = 5279.6, 
+    MassMin               = 1.0,     
+    MassMax               = 10000.0,  
+    Chi2Max               = 30.0
+    ) 
+
+ToolSvc += BPHY18_Select_BeeKst
+print(BPHY18_Select_BeeKst)
+
+## c/ augment and select Bdbar->eeKstbar candidates
+BPHY18_Select_BeeKstbar = DerivationFramework__Select_onia2mumu(
+    name                  = "BPHY18_Select_Bd2JpsiKstbar",
+    HypothesisName        = "Bdbar", 
+    InputVtxContainerName = "BeeKstCandidates",
+    TrkMasses             = [0.511, 0.511, 139.570, 493.677],
+    VtxMassHypo           = 5279.6,
+    MassMin               = 1.0,      
+    MassMax               = 10000.0,   
+    Chi2Max               = 30.0
+    )
+
+ToolSvc += BPHY18_Select_BeeKstbar
+print(BPHY18_Select_BeeKstbar)
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__ReVertex
+BPHY18_diMeson_revertex = DerivationFramework__ReVertex(
+    name                   = "BPHY18_diMeson_revertex",
+    InputVtxContainerName  = "BeeKstCandidates",
+    TrackIndices           = [ 2, 3 ],
+    TrkVertexFitterTool    = BeeKstVertexFit,
+    OutputVtxContainerName = "BPHY18DiMeson"
+    )
+
+ToolSvc += BPHY18_diMeson_revertex
+print(BPHY18_diMeson_revertex)
+
+BPHY18_Select_Kpi = DerivationFramework__Select_onia2mumu(
+    name                  = "BPHY18_Select_Kpi",
+    HypothesisName        = "Kpi", 
+    InputVtxContainerName = "BPHY18DiMeson",
+    TrkMasses             = [ 493.677, 139.570 ],
+    VtxMassHypo           = 891.66, 
+    MassMin               = 1.0,     
+    MassMax               = 100000.0,  
+    Chi2Max               = 100.0
+    ) 
+
+ToolSvc += BPHY18_Select_Kpi
+print(BPHY18_Select_Kpi)
+
+BPHY18_Select_piK = DerivationFramework__Select_onia2mumu(
+    name                  = "BPHY18_Select_piK",
+    HypothesisName        = "piK", 
+    InputVtxContainerName = "BPHY18DiMeson",
+    TrkMasses             = [ 139.570, 493.677 ],
+    VtxMassHypo           = 891.66, 
+    MassMin               = 1.0,     
+    MassMax               = 100000.0,  
+    Chi2Max               = 100.0
+    ) 
+
+ToolSvc += BPHY18_Select_piK
+print(BPHY18_Select_piK)
+
+if True:
+    from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+    BPHY18_SelectBeeKstEvent = DerivationFramework__xAODStringSkimmingTool(
+        name = "BPHY18_SelectBeeKstEvent",
+        expression = "(count(BeeKstCandidates.passed_Bd > 0) + count(BeeKstCandidates.passed_Bdbar > 0)) > 0") 
+    ToolSvc += BPHY18_SelectBeeKstEvent
+    print(BPHY18_SelectBeeKstEvent)
+
+    #====================================================================
+    # Make event selection based on an OR of the input skimming tools
+    #====================================================================
+    from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__FilterCombinationAND
+    BPHY18SkimmingAND = CfgMgr.DerivationFramework__FilterCombinationAND(
+        "BPHY18SkimmingAND",
+        FilterList = [BPHY18_SelectBeeKstEvent, BPHY18TriggerSkim]) 
+    ToolSvc += BPHY18SkimmingAND
+    print(BPHY18SkimmingAND)
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxTrk
+BPHY18_thinningTool_Tracks = DerivationFramework__Thin_vtxTrk(
+    name                       = "BPHY18_thinningTool_Tracks",
+    TrackParticleContainerName = "InDetTrackParticles",
+    VertexContainerNames       = ["BeeKstCandidates"],
+    PassFlags                  = ["passed_Bd", "passed_Bdbar"] )
+
+BPHY18_thinningTool_GSFTracks = DerivationFramework__Thin_vtxTrk(
+    name                       = "BPHY18_thinningTool_GSFTracks",
+    TrackParticleContainerName = "GSFTrackParticles",
+    VertexContainerNames       = ["BeeKstCandidates"],
+    PassFlags                  = ["passed_Bd", "passed_Bdbar"] )
+
+ToolSvc += BPHY18_thinningTool_Tracks
+ToolSvc += BPHY18_thinningTool_GSFTracks
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__BPhysPVThinningTool
+BPHY18_thinningTool_PV = DerivationFramework__BPhysPVThinningTool(
+    name                 = "BPHY18_thinningTool_PV",
+    CandidateCollections = ["BeeKstCandidates"],
+    KeepPVTracks         = True
+    )
+ 
+ToolSvc += BPHY18_thinningTool_PV
+
+## b) thinning out tracks that are not attached to muons.
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__MuonTrackParticleThinning
+BPHY18MuonTPThinningTool = DerivationFramework__MuonTrackParticleThinning(
+    name                    = "BPHY18MuonTPThinningTool",
+    MuonKey                 = "Muons",
+    InDetTrackParticlesKey  = "InDetTrackParticles")
+ToolSvc += BPHY18MuonTPThinningTool
+
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__EgammaTrackParticleThinning
+BPHY18EgammaTPThinningTool = DerivationFramework__EgammaTrackParticleThinning(
+    name                   = "BPHY18EgammaTPThinningTool",
+    SGKey                  = "Electrons",
+    InDetTrackParticlesKey = "InDetTrackParticles")  
+ToolSvc += BPHY18EgammaTPThinningTool
+
+# Only save truth informtion directly associated with: mu Ds+ D+ D*+ Ds*+ D0 D*0 B+ B*+ B0 B*0 
+from DerivationFrameworkMCTruth.DerivationFrameworkMCTruthConf import DerivationFramework__GenericTruthThinning
+BPHY18TruthThinTool = DerivationFramework__GenericTruthThinning(name                    = "BPHY18TruthThinTool",
+                                                                ParticleSelectionString = "abs(TruthParticles.pdgId) == 11 || abs(TruthParticles.pdgId) == 13 || abs(TruthParticles.pdgId) == 10311 || abs(TruthParticles.pdgId) == 521 || abs(TruthParticles.pdgId) == 523 || TruthParticles.pdgId == 511 || TruthParticles.pdgId == 513",
+                                                                PreserveDescendants     = True,
+                                                                PreserveAncestors       = True)
+ToolSvc += BPHY18TruthThinTool
+
+# Only save truth neutrino and b/c quarks information
+from DerivationFrameworkMCTruth.DerivationFrameworkMCTruthConf import DerivationFramework__GenericTruthThinning
+BPHY18TruthThinNoChainTool = DerivationFramework__GenericTruthThinning(name                    = "BPHY18TruthThinNoChainTool",
+                                                                       ParticleSelectionString = "abs(TruthParticles.pdgId) == 5 || abs(TruthParticles.pdgId) == 12 || abs(TruthParticles.pdgId) == 14",
+                                                                       PreserveDescendants     = False,
+                                                                       PreserveAncestors       = False)
+ToolSvc += BPHY18TruthThinNoChainTool
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS  
+#====================================================================
+
+thinningCollection = [ BPHY18_thinningTool_Tracks,  BPHY18_thinningTool_GSFTracks,
+                       BPHY18_thinningTool_PV, #BPHY18_thinningTool_PV_GSF, 
+                       BPHY18EgammaTPThinningTool, BPHY18MuonTPThinningTool
+                     ]
+
+#if we're doing truth, add these [BPHY18TruthThinTool,BPHY18TruthThinNoChainTool] 
+if isSimulation:
+    thinningCollection += [BPHY18TruthThinTool,BPHY18TruthThinNoChainTool]
+
+print(thinningCollection)
+
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+DerivationFrameworkJob += CfgMgr.DerivationFramework__DerivationKernel(
+    "BPHY18Kernel",
+
+    AugmentationTools = [ ElectronPassLHvloosenod0,BPHY18DiElectronSelectAndWrite,  
+                          BPHY18_Select_DiElectrons,
+                          BPHY18BeeKstSelectAndWrite, BPHY18_Select_BeeKst, BPHY18_Select_BeeKstbar,
+                          BPHY18_diMeson_revertex, BPHY18_Select_Kpi, BPHY18_Select_piK ],
+
+    #Only skim if not MC
+    SkimmingTools     = [BPHY18SkimmingAND],
+    ThinningTools     = thinningCollection
+    )
+
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+streamName   = derivationFlags.WriteDAOD_BPHY18Stream.StreamName
+fileName     = buildFileName( derivationFlags.WriteDAOD_BPHY18Stream )
+BPHY18Stream  = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY18Stream.AcceptAlgs(["BPHY18Kernel"])
+
+# Special lines for thinning
+from AthenaServices.Configurables import ThinningSvc, createThinningSvc
+augStream = MSMgr.GetStream( streamName )
+evtStream = augStream.GetEventStream()
+
+BPHY18ThinningSvc = createThinningSvc( svcName="BPHY18ThinningSvc", outStreams=[evtStream] )
+svcMgr += BPHY18ThinningSvc
+
+#====================================================================
+# Slimming 
+#====================================================================
+
+# Added by ASC
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY18SlimmingHelper = SlimmingHelper("BPHY18SlimmingHelper")
+AllVariables   = []
+StaticContent  = []
+ExtraVariables = []
+BPHY18SlimmingHelper.SmartCollections = ["Electrons", "Muons", "InDetTrackParticles" ] 
+
+# Needed for trigger objects
+BPHY18SlimmingHelper.IncludeMuonTriggerContent   = False
+BPHY18SlimmingHelper.IncludeBPhysTriggerContent  = False
+BPHY18SlimmingHelper.IncludeEGammaTriggerContent = True
+
+## primary vertices
+AllVariables  += ["PrimaryVertices"]
+StaticContent += ["xAOD::VertexContainer#BPHY18RefittedPrimaryVertices"]
+StaticContent += ["xAOD::VertexAuxContainer#BPHY18RefittedPrimaryVerticesAux."]
+
+ExtraVariables += ["Muons.etaLayer1Hits.etaLayer2Hits.etaLayer3Hits.etaLayer4Hits.phiLayer1Hits.phiLayer2Hits.phiLayer3Hits.phiLayer4Hits",
+                   "Muons.numberOfTriggerEtaLayers.numberOfPhiLayers",
+                   "InDetTrackParticles.numberOfTRTHits.numberOfTRTHighThresholdHits.vx.vy.vz",
+                   "PrimaryVertices.chiSquared.covariance", "Electrons.deltaEta1.DFCommonElectronsLHVeryLoosenod0","egammaClusters.calE.calEta.calPhi.e_sampl.eta_sampl.etaCalo.phiCalo.ETACALOFRAME.PHICALOFRAME","HLT_xAOD__ElectronContainer_egamma_ElectronsAuxDyn.charge"]
+
+## Jpsi candidates 
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY18DiElectronSelectAndWrite.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY18DiElectronSelectAndWrite.OutputVtxContainerName]
+
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY18BeeKstSelectAndWrite.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY18BeeKstSelectAndWrite.OutputVtxContainerName]
+
+StaticContent += ["xAOD::VertexContainer#%s"        % BPHY18_diMeson_revertex.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY18_diMeson_revertex.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY18_diMeson_revertex.OutputVtxContainerName]
+
+AllVariables += [ "GSFTrackParticles"] 
+
+
+# Added by ASC
+# Truth information for MC only
+if isSimulation:
+    AllVariables += ["TruthEvents","TruthParticles","TruthVertices", "ElectronTruthParticles"]
+
+AllVariables = list(set(AllVariables)) # remove duplicates
+
+BPHY18SlimmingHelper.AllVariables = AllVariables
+BPHY18SlimmingHelper.ExtraVariables = ExtraVariables
+
+BPHY18SlimmingHelper.StaticContent = StaticContent
+
+from DerivationFrameworkEGamma.ElectronsCPDetailedContent import *
+BPHY18SlimmingHelper.ExtraVariables += ElectronsCPDetailedContent
+BPHY18SlimmingHelper.ExtraVariables += GSFTracksCPDetailedContent
+
+BPHY18SlimmingHelper.AppendContentToStream(BPHY18Stream)
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY19.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY19.py
new file mode 100644
index 000000000000..a8679449c86d
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY19.py
@@ -0,0 +1,313 @@
+#
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#
+#====================================================================
+# BPHY19.py
+# Derivation for dimuon + photon conversion (chi_c/b)
+# Contact: A. Chisholm <andrew.chisholm@cern.ch>
+#====================================================================
+
+# Set up common services and job object.
+# This should appear in ALL derivation job options
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+print(isSimulation)
+
+#--------------------------------------------------------------------
+# Setup the JpsiFinder vertex fitter tools
+#--------------------------------------------------------------------
+
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY19_VertexTools = BPHYVertexTools("BPHY19")
+
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder
+BPHY19JpsiFinder = Analysis__JpsiFinder(
+  name                        = "BPHY19JpsiFinder",
+  OutputLevel                 = INFO,
+  muAndMu                     = True,
+  muAndTrack                  = False,
+  TrackAndTrack               = False,
+  assumeDiMuons               = True,    # If true, will assume dimu hypothesis and use PDG value for mu mass
+  invMassUpper                = 100000.0,
+  invMassLower                = 0.0,
+  Chi2Cut                     = 200.,
+  oppChargesOnly              = True,
+  atLeastOneComb              = True,
+  useCombinedMeasurement      = False, # Only takes effect if combOnly=True
+  muonCollectionKey           = "Muons",
+  TrackParticleCollection     = "InDetTrackParticles",
+  V0VertexFitterTool          = BPHY19_VertexTools.TrkV0Fitter,             # V0 vertex fitter
+  useV0Fitter                 = False,                   # if False a TrkVertexFitterTool will be used
+  TrkVertexFitterTool         = BPHY19_VertexTools.TrkVKalVrtFitter,        # VKalVrt vertex fitter
+  TrackSelectorTool           = BPHY19_VertexTools.InDetTrackSelectorTool,
+  VertexPointEstimator        = BPHY19_VertexTools.VtxPointEstimator,
+  useMCPCuts                  = False )
+
+ToolSvc += BPHY19JpsiFinder
+print(BPHY19JpsiFinder)
+
+#--------------------------------------------------------------------
+# Setup the vertex reconstruction tools
+#--------------------------------------------------------------------
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+
+BPHY19_Reco_mumu = DerivationFramework__Reco_Vertex(
+  name                   = "BPHY19_Reco_mumu",
+  VertexSearchTool             = BPHY19JpsiFinder,
+  OutputVtxContainerName = "BPHY19OniaCandidates",
+  PVContainerName        = "PrimaryVertices",
+  RefPVContainerName     = "BPHY19RefittedPrimaryVertices",
+  RefitPV                = True,
+  MaxPVrefit             = 100000,
+  DoVertexType           = 7)
+
+ToolSvc += BPHY19_Reco_mumu
+print(BPHY19_Reco_mumu)
+
+#--------------------------------------------------------------------
+# Setup the vertex selection and augmentation tools
+#--------------------------------------------------------------------
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+
+# psi(nS)->mu+mu- candidates
+BPHY19_Select_Psi2mumu = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY19_Select_Psi2mumu",
+  HypothesisName        = "Psi",
+  InputVtxContainerName = "BPHY19OniaCandidates",
+  VtxMassHypo           = 3096.916,
+  MassMin               = 2000.0,
+  MassMax               = 4500.0,
+  Chi2Max               = 200,
+  DoVertexType          = 7)
+
+ToolSvc += BPHY19_Select_Psi2mumu
+print(BPHY19_Select_Psi2mumu)
+
+# Y(nS)->mu+mu- candidates
+BPHY19_Select_Upsi2mumu = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY19_Select_Upsi2mumu",
+  HypothesisName        = "Upsi",
+  InputVtxContainerName = "BPHY19OniaCandidates",
+  VtxMassHypo           = 9460.30,
+  MassMin               = 8000.0,
+  MassMax               = 12000.0,
+  Chi2Max               = 200,
+  DoVertexType          = 7)
+
+ToolSvc += BPHY19_Select_Upsi2mumu
+print(BPHY19_Select_Upsi2mumu)
+
+
+#--------------------------------------------------------------------
+# Configure the conversion finder
+#--------------------------------------------------------------------
+
+from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+BPHY19_CascadeVertexFitter = Trk__TrkVKalVrtFitter(
+    name                 = "BPHY19_CascadeVertexFit",
+    Extrapolator         = BPHY19_VertexTools.InDetExtrapolator,
+   #FirstMeasuredPoint   = True,
+    FirstMeasuredPoint   = False,
+    CascadeCnstPrecision = 1e-6,
+    MakeExtendedVertex   = True)
+
+ToolSvc += BPHY19_CascadeVertexFitter
+print(BPHY19_CascadeVertexFitter)
+
+include("DerivationFrameworkBPhys/configureConversionFinder.py")
+BPHY19_ConvTools = BPHYConversionFinderTools("BPHY19")
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__BPhysConversionFinder
+BPHY19_ConversionFinder   = DerivationFramework__BPhysConversionFinder(
+    name = "BPHY19_ConversionFinder",
+    VertexFitterTool = BPHY19_ConvTools.InDetSecVxFitterTool,
+    VertexEstimator = BPHY19_ConvTools.InDetSecVtxPointEstimator,
+    DistanceTool = BPHY19_ConvTools.InDetSecVxTrkDistanceFinder,
+    ConversionPostSelector = BPHY19_ConvTools.InDetSecVtxPostSelector,
+    CascadeFitter = BPHY19_CascadeVertexFitter,
+    InputTrackParticleContainerName = "InDetTrackParticles",
+    ConversionContainerName = "BPhysConversionCandidates",
+    DiMuonVertexContainer  = "BPHY19OniaCandidates",
+    PassFlagsToCheck  = ["passed_Psi","passed_Upsi"],
+    RequireDeltaM = True, # Only save conversion if it's a chi_c,b candidate (passes "MaxDeltaM" cut w.r.t. any di-muon candidate)
+    MaxDeltaM = 2000.0)
+
+ToolSvc += BPHY19_ConversionFinder
+print(BPHY19_ConversionFinder)
+
+#--------------------------------------------------------------------
+# Select the events to save
+#--------------------------------------------------------------------
+
+# Require at least one conversion AND one di-muon
+BPHY19_expression = "count(BPhysConversionCandidates.passed) > 0 && (count(BPHY19OniaCandidates.passed_Psi) > 0 || count(BPHY19OniaCandidates.passed_Upsi) > 0)"
+
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+BPHY19_SelectEvent = DerivationFramework__xAODStringSkimmingTool(name = "BPHY19_SelectEvent",
+                                                                expression = BPHY19_expression)
+ToolSvc += BPHY19_SelectEvent
+print(BPHY19_SelectEvent)
+
+#--------------------------------------------------------------------
+# Thin Collections
+#--------------------------------------------------------------------
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxTrk
+
+# Keep tracks from di-muon vertices
+BPHY19Thin_vtxTrk = DerivationFramework__Thin_vtxTrk(
+  name                       = "BPHY19Thin_vtxTrk",
+  TrackParticleContainerName = "InDetTrackParticles",
+  VertexContainerNames       = ["BPHY19OniaCandidates"],
+  PassFlags                  = ["passed_Psi", "passed_Upsi"] )
+
+ToolSvc += BPHY19Thin_vtxTrk
+
+# Keep tracks from conversions
+BPHY19Thin_ConvTrk = DerivationFramework__Thin_vtxTrk(
+  name                       = "BPHY19Thin_ConvTrk",
+  TrackParticleContainerName = "InDetTrackParticles",
+  VertexContainerNames       = ["BPhysConversionCandidates"],
+  PassFlags                  = ["passed"] )
+
+ToolSvc += BPHY19Thin_ConvTrk
+
+# Keep tracks from all muons
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__MuonTrackParticleThinning
+BPHY19MuonTPThinningTool = DerivationFramework__MuonTrackParticleThinning(name                    = "BPHY19MuonTPThinningTool",
+                                                                         MuonKey                 = "Muons",
+                                                                         InDetTrackParticlesKey  = "InDetTrackParticles")
+
+ToolSvc += BPHY19MuonTPThinningTool
+
+#--------------------------------------------------------------------
+# Truth Particle Thinning
+#--------------------------------------------------------------------
+
+BPHY19_TruthIDString = ""
+BPHY19_TruthIDString += "TruthParticles.pdgId == 443" #J/psi
+BPHY19_TruthIDString += " || "
+BPHY19_TruthIDString += "TruthParticles.pdgId == 100443" #psi(2S)
+BPHY19_TruthIDString += " || "
+BPHY19_TruthIDString += "TruthParticles.pdgId == 10441" #chi_c0(1P)
+BPHY19_TruthIDString += " || "
+BPHY19_TruthIDString += "TruthParticles.pdgId == 20443" #chi_c1(1P)
+BPHY19_TruthIDString += " || "
+BPHY19_TruthIDString += "TruthParticles.pdgId == 445" #chi_c2(1P)
+BPHY19_TruthIDString += " || "
+BPHY19_TruthIDString += "TruthParticles.pdgId == 553" #Y(1S)
+BPHY19_TruthIDString += " || "
+BPHY19_TruthIDString += "TruthParticles.pdgId == 100553" #Y(2S)
+BPHY19_TruthIDString += " || "
+BPHY19_TruthIDString += "TruthParticles.pdgId == 200553" #Y(3S)
+BPHY19_TruthIDString += " || "
+BPHY19_TruthIDString += "TruthParticles.pdgId == 10551" #chi_b0(1P)
+BPHY19_TruthIDString += " || "
+BPHY19_TruthIDString += "TruthParticles.pdgId == 110551" #chi_b0(2P)
+BPHY19_TruthIDString += " || "
+BPHY19_TruthIDString += "TruthParticles.pdgId == 210551" #chi_b0(3P)
+BPHY19_TruthIDString += " || "
+BPHY19_TruthIDString += "TruthParticles.pdgId == 20553" #chi_b1(1P)
+BPHY19_TruthIDString += " || "
+BPHY19_TruthIDString += "TruthParticles.pdgId == 120553" #chi_b1(2P)
+BPHY19_TruthIDString += " || "
+BPHY19_TruthIDString += "TruthParticles.pdgId == 220553" #chi_b1(3P)
+BPHY19_TruthIDString += " || "
+BPHY19_TruthIDString += "TruthParticles.pdgId == 555" #chi_b2(1P)
+BPHY19_TruthIDString += " || "
+BPHY19_TruthIDString += "TruthParticles.pdgId == 100555" #chi_b2(2P)
+BPHY19_TruthIDString += " || "
+BPHY19_TruthIDString += "TruthParticles.pdgId == 200555" #chi_b2(3P)
+
+print("PDG IDs to save:")
+print(BPHY19_TruthIDString)
+
+# Only save truth informtion directly associated with Onia
+from DerivationFrameworkMCTruth.DerivationFrameworkMCTruthConf import DerivationFramework__GenericTruthThinning
+BPHY19TruthThinTool = DerivationFramework__GenericTruthThinning(name                    = "BPHY19TruthThinTool",
+                                                        ParticleSelectionString = BPHY19_TruthIDString,
+                                                        PreserveDescendants     = True,
+                                                        PreserveAncestors      = True)
+ToolSvc += BPHY19TruthThinTool
+print(BPHY19TruthThinTool)
+
+#--------------------------------------------------------------------
+# Create the derivation kernel
+#--------------------------------------------------------------------
+
+BPHY19ThinningTools = [BPHY19Thin_vtxTrk, BPHY19MuonTPThinningTool, BPHY19Thin_ConvTrk]
+if isSimulation:
+    BPHY19ThinningTools.append(BPHY19TruthThinTool)
+
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+DerivationFrameworkJob += CfgMgr.DerivationFramework__DerivationKernel(
+  "BPHY19Kernel",
+   AugmentationTools = [BPHY19_Reco_mumu, BPHY19_Select_Psi2mumu, BPHY19_Select_Upsi2mumu,BPHY19_ConversionFinder],
+   SkimmingTools     = [BPHY19_SelectEvent],
+   ThinningTools     = BPHY19ThinningTools
+   )
+
+#--------------------------------------------------------------------
+# Create the stream
+#--------------------------------------------------------------------
+
+streamName = derivationFlags.WriteDAOD_BPHY19Stream.StreamName
+fileName   = buildFileName( derivationFlags.WriteDAOD_BPHY19Stream )
+BPHY19Stream = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY19Stream.AcceptAlgs(["BPHY19Kernel"])
+# Special lines for thinning
+# Thinning service name must match the one passed to the thinning tools
+from AthenaServices.Configurables import ThinningSvc, createThinningSvc
+augStream = MSMgr.GetStream( streamName )
+evtStream = augStream.GetEventStream()
+svcMgr += createThinningSvc( svcName="BPHY19ThinningSvc", outStreams=[evtStream] )
+
+#--------------------------------------------------------------------
+# Generic Collection Slimming
+#--------------------------------------------------------------------
+
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY19SlimmingHelper = SlimmingHelper("BPHY19SlimmingHelper")
+AllVariables = []
+StaticContent = []
+
+# Trigger informtion
+BPHY19SlimmingHelper.IncludeMuonTriggerContent = True
+BPHY19SlimmingHelper.IncludeBPhysTriggerContent = True
+
+## Primary vertices
+AllVariables += ["PrimaryVertices"]
+StaticContent += ["xAOD::VertexContainer#BPHY19RefittedPrimaryVertices"]
+StaticContent += ["xAOD::VertexAuxContainer#BPHY19RefittedPrimaryVerticesAux."]
+
+## ID track particles
+AllVariables += ["InDetTrackParticles"]
+AllVariables += ["CombinedMuonTrackParticles"]
+AllVariables += ["ExtrapolatedMuonTrackParticles"]
+
+## Muon container
+AllVariables += ["Muons"]
+
+## Di-muon candidates
+StaticContent += ["xAOD::VertexContainer#%s"        % BPHY19_Reco_mumu.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY19_Reco_mumu.OutputVtxContainerName]
+
+# Conversions
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY19_ConversionFinder.ConversionContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY19_ConversionFinder.ConversionContainerName]
+
+# Truth information for MC only
+if isSimulation:
+    AllVariables += ["TruthEvents","TruthParticles","TruthVertices","MuonTruthParticles"]
+
+BPHY19SlimmingHelper.AllVariables = AllVariables
+BPHY19SlimmingHelper.StaticContent = StaticContent
+BPHY19SlimmingHelper.AppendContentToStream(BPHY19Stream)
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY2.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY2.py
new file mode 100644
index 000000000000..ea9966593f4d
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY2.py
@@ -0,0 +1,332 @@
+#====================================================================
+# BPHY2.py
+# BPHY2 repurposed for students analysis of Bs->Upsilon phi Analysis
+# It requires the reductionConf flag BPHY2 in Reco_tf.py
+#====================================================================
+
+# Set up common services and job object.
+# This should appear in ALL derivation job options
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+print(isSimulation)
+
+
+#====================================================================
+# AUGMENTATION TOOLS
+#====================================================================
+
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY2_VertexTools = BPHYVertexTools("BPHY2")
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__AugOriginalCounts
+BPHY2_AugOriginalCounts = DerivationFramework__AugOriginalCounts(
+   name = "BPHY2_AugOriginalCounts",
+   VertexContainer = "PrimaryVertices",
+   TrackContainer = "InDetTrackParticles" )
+ToolSvc += BPHY2_AugOriginalCounts
+
+
+#--------------------------------------------------------------------
+## 2/ setup JpsiFinder tool
+##    These are general tools independent of DerivationFramework that do the
+##    actual vertex fitting and some pre-selection.
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder
+BPHY2JpsiFinder = Analysis__JpsiFinder(name                         = "BPHY2JpsiFinder",
+                                        OutputLevel                 = INFO,
+                                        muAndMu                     = True,
+                                        muAndTrack                  = False,
+                                        TrackAndTrack               = False,
+                                        assumeDiMuons               = True,
+                                        invMassUpper                = 4700.0,
+                                        invMassLower                = 2600.0,
+                                        Chi2Cut                     = 15.,
+                                        oppChargesOnly              = True,
+                                        combOnly                = True,
+                                        atLeastOneComb              = False,
+                                        useCombinedMeasurement      = False, # Only takes effect if combOnly=True
+                                        muonCollectionKey           = "Muons",
+                                        TrackParticleCollection     = "InDetTrackParticles",
+                                        V0VertexFitterTool          = BPHY2_VertexTools.TrkV0Fitter,             # V0 vertex fitter
+                                        useV0Fitter                 = False,                   # if False a TrkVertexFitterTool will be used
+                                        TrkVertexFitterTool         = BPHY2_VertexTools.TrkVKalVrtFitter,        # VKalVrt vertex fitter
+                                        TrackSelectorTool           = BPHY2_VertexTools.InDetTrackSelectorTool,
+                                        VertexPointEstimator        = BPHY2_VertexTools.VtxPointEstimator,
+                                        useMCPCuts                  = False)
+ToolSvc += BPHY2JpsiFinder
+print(BPHY2JpsiFinder)
+
+#--------------------------------------------------------------------
+## 3/ setup the vertex reconstruction "call" tool(s). They are part of the derivation framework.
+##    These Augmentation tools add output vertex collection(s) into the StoreGate and add basic
+##    decorations which do not depend on the vertex mass hypothesis (e.g. lxy, ptError, etc).
+##    There should be one tool per topology, i.e. Jpsi and Psi(2S) do not need two instance of the
+##    Reco tool is the JpsiFinder mass window is wide enough.
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY2JpsiSelectAndWrite = DerivationFramework__Reco_Vertex(name                 = "BPHY2JpsiSelectAndWrite",
+                                                       VertexSearchTool             = BPHY2JpsiFinder,
+                                                       OutputVtxContainerName = "BPHY2JpsiCandidates",
+                                                       PVContainerName        = "PrimaryVertices",
+                                                       RefPVContainerName     = "SHOULDNOTBEUSED",
+                                                       DoVertexType           =1)
+ToolSvc += BPHY2JpsiSelectAndWrite
+print(BPHY2JpsiSelectAndWrite)
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+
+
+
+## 4/ setup a new vertexing tool (necessary due to use of mass constraint)
+from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+BPHY2BsKKVertexFit = Trk__TrkVKalVrtFitter(
+                                         name                = "BPHY2BsKKVertexFit",
+                                         Extrapolator        = BPHY2_VertexTools.InDetExtrapolator,
+                                         FirstMeasuredPoint  = True,
+                                         MakeExtendedVertex  = True)
+ToolSvc += BPHY2BsKKVertexFit
+print(BPHY2BsKKVertexFit)
+
+
+
+## 5/ setup the Jpsi+2 track finder
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiPlus2Tracks
+BPHY2BsJpsiKK = Analysis__JpsiPlus2Tracks(name = "BPHY2BsJpsiKK",
+                                        OutputLevel = INFO,
+kaonkaonHypothesis      = True,
+pionpionHypothesis                      = False,
+kaonpionHypothesis                      = False,
+trkThresholdPt              = 800.0,
+trkMaxEta           = 3.0,
+BMassUpper            = 5800.0,
+BMassLower            = 5000.0,
+DiTrackMassUpper = 1019.445 + 100.,
+DiTrackMassLower = 1019.445 - 100.,
+Chi2Cut                     = 8.0,
+TrkQuadrupletMassUpper      = 6000.0,
+TrkQuadrupletMassLower      = 4800.0,
+JpsiContainerKey        = "BPHY2JpsiCandidates",
+TrackParticleCollection     = "InDetTrackParticles",
+MuonsUsedInJpsi         = "Muons",
+TrkVertexFitterTool       = BPHY2BsKKVertexFit,
+TrackSelectorTool       = BPHY2_VertexTools.InDetTrackSelectorTool,
+UseMassConstraint       = False)
+
+ToolSvc += BPHY2BsJpsiKK
+print(BPHY2BsJpsiKK)
+
+
+
+
+## 6/ setup the combined augmentation/skimming tool for the Bpm
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY2BsKKSelectAndWrite = DerivationFramework__Reco_Vertex(name                 = "BPHY2BsKKSelectAndWrite",
+                                                           VertexSearchTool       = BPHY2BsJpsiKK,
+                                                           OutputVtxContainerName   = "BPHY2BsJpsiKKCandidates",
+                                                           PVContainerName          = "PrimaryVertices",
+                                                           RefPVContainerName       = "BPHY2RefittedPrimaryVertices",
+                                                           RefitPV                  = True,
+                                                           MaxPVrefit               = 10000, DoVertexType = 7)
+ToolSvc += BPHY2BsKKSelectAndWrite
+print(BPHY2BsKKSelectAndWrite)
+
+
+## b/ augment and select Psi(2S)->mumu candidates
+BPHY2_Select_Psi2mumu = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY2_Select_Psi2mumu",
+  HypothesisName        = "Psi",
+  InputVtxContainerName = "BPHY2JpsiCandidates",
+  VtxMassHypo           = 3686.09,
+  MassMin               = 3300.0,
+  MassMax               = 4500.0,
+  Chi2Max               = 200,
+  DoVertexType          = 7)
+
+ToolSvc += BPHY2_Select_Psi2mumu
+print(BPHY2_Select_Psi2mumu)
+
+
+## a/ augment and select Jpsi->mumu candidates
+BPHY2_Select_Jpsi2mumu = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY2_Select_Jpsi2mumu",
+  HypothesisName        = "Jpsi",
+  InputVtxContainerName = "BPHY2JpsiCandidates",
+  VtxMassHypo           = 3096.916,
+  MassMin               = 2000.0,
+  MassMax               = 3600.0,
+  Chi2Max               = 200,
+  DoVertexType          = 7)
+
+ToolSvc += BPHY2_Select_Jpsi2mumu
+print(BPHY2_Select_Jpsi2mumu)
+
+## b/ augment and select Bs->JpsiKK candidates
+BPHY2_Select_Bs2JpsiKK = DerivationFramework__Select_onia2mumu(
+  name                       = "BPHY2_Select_Bs2JpsiKK",
+  HypothesisName             = "Bs",
+  InputVtxContainerName      = "BPHY2BsJpsiKKCandidates",
+  TrkMasses                  = [105.658, 105.658, 493.677, 493.677],
+  VtxMassHypo                = 5366.3,
+  MassMin                    = 5000.0,
+  MassMax                    = 5800.0,
+  Chi2Max                    = 200)
+
+ToolSvc += BPHY2_Select_Bs2JpsiKK
+print(BPHY2_Select_Bs2JpsiKK)
+
+#====================================================================
+# SET UP STREAM
+#====================================================================
+streamName   = derivationFlags.WriteDAOD_BPHY2Stream.StreamName
+fileName     = buildFileName( derivationFlags.WriteDAOD_BPHY2Stream )
+BPHY2Stream  = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY2Stream.AcceptAlgs(["BPHY2Kernel"])
+
+# Special lines for thinning
+# Thinning service name must match the one passed to the thinning tools
+augStream = MSMgr.GetStream( streamName )
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxTrk
+BPHY2_thinningTool_Tracks = DerivationFramework__Thin_vtxTrk(
+  name                       = "BPHY2_thinningTool_Tracks",
+  TrackParticleContainerName = "InDetTrackParticles",
+  StreamName = streamName,
+  VertexContainerNames       = ["BPHY2BsJpsiKKCandidates", "BPHY2JpsiCandidates"],
+  PassFlags                  = ["passed_Bs", "passed_Psi", "passed_Jpsi"] )
+
+ToolSvc += BPHY2_thinningTool_Tracks
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__BPhysPVThinningTool
+BPHY2_thinningTool_PV = DerivationFramework__BPhysPVThinningTool(
+  name                       = "BPHY2_thinningTool_PV",
+  CandidateCollections       = ["BPHY2BsJpsiKKCandidates"],
+  StreamName = streamName,
+  KeepPVTracks  =True)
+
+ToolSvc += BPHY2_thinningTool_PV
+
+if not isSimulation: #Only Skim Data
+   from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+
+   BPHY2_SelectBsJpsiKKEvent = DerivationFramework__xAODStringSkimmingTool(
+   name = "BPHY2_SelectBsJpsiKKEvent",
+   expression = "count(BPHY2BsJpsiKKCandidates.passed_Bs > 0) > 0")
+   ToolSvc += BPHY2_SelectBsJpsiKKEvent
+   print(BPHY2_SelectBsJpsiKKEvent)
+
+
+   #====================================================================
+   # Make event selection based on an OR of the input skimming tools
+   #====================================================================
+   from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__FilterCombinationOR
+   BPHY2SkimmingOR = CfgMgr.DerivationFramework__FilterCombinationOR("BPHY2SkimmingOR",
+                                                                 FilterList = [BPHY2_SelectBsJpsiKKEvent ])#, BPHY2_SelectBplJpsiKplEventBc
+   PassFlags = ["passed_Bs"]
+   ToolSvc += BPHY2SkimmingOR
+   print(BPHY2SkimmingOR)
+
+
+
+## b) thinning out tracks that are not attached to muons. The final thinning decision is based on the OR operation
+##    between decision from this and the previous tools.
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__MuonTrackParticleThinning
+BPHY2MuonTPThinningTool = DerivationFramework__MuonTrackParticleThinning(name                    = "BPHY2MuonTPThinningTool",
+                                                                         MuonKey                 = "Muons",
+                                                                         StreamName = streamName,
+                                                                         InDetTrackParticlesKey  = "InDetTrackParticles")
+ToolSvc += BPHY2MuonTPThinningTool
+
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS
+#====================================================================
+
+thiningCollection = [BPHY2_thinningTool_Tracks, BPHY2_thinningTool_PV, BPHY2MuonTPThinningTool]
+print(thiningCollection)
+
+BPHY2Seq = CfgMgr.AthSequencer("BPHY2Sequence")
+DerivationFrameworkJob += BPHY2Seq
+
+# The name of the kernel (BPHY2Kernel in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+BPHY2Seq += CfgMgr.DerivationFramework__DerivationKernel("BPHY2Kernel",
+                                                                       AugmentationTools = [ BPHY2JpsiSelectAndWrite,
+                                                                                            BPHY2BsKKSelectAndWrite,
+                                                                                           BPHY2_Select_Psi2mumu,
+                                                                                           BPHY2_Select_Jpsi2mumu,  BPHY2_Select_Bs2JpsiKK,
+                                                                                           BPHY2_AugOriginalCounts],
+                                                                       #Only skim if not MC
+                                                                       SkimmingTools     = [BPHY2SkimmingOR] if not isSimulation else [],
+                                                                       ThinningTools     = thiningCollection
+
+                                                                       )
+
+
+#====================================================================
+# Slimming
+#====================================================================
+
+# Added by ASC
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY2SlimmingHelper = SlimmingHelper("BPHY2SlimmingHelper")
+AllVariables  = []
+StaticContent = []
+
+# Needed for trigger objects
+BPHY2SlimmingHelper.IncludeMuonTriggerContent  = TRUE
+BPHY2SlimmingHelper.IncludeBPhysTriggerContent = TRUE
+SmartVar = []
+## primary vertices
+SmartVar  += ["PrimaryVertices"]
+StaticContent += ["xAOD::VertexContainer#BPHY2RefittedPrimaryVertices"]
+StaticContent += ["xAOD::VertexAuxContainer#BPHY2RefittedPrimaryVerticesAux."]
+
+
+
+## ID track particles
+AllVariables += ["InDetTrackParticles"]
+
+## combined / extrapolated muon track particles
+## (note: for tagged muons there is no extra TrackParticle collection since the ID tracks
+##        are store in InDetTrackParticles collection)
+AllVariables += ["CombinedMuonTrackParticles"]
+
+
+## muon container
+SmartVar += ["Muons"]
+
+
+## Jpsi candidates
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY2JpsiSelectAndWrite.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY2JpsiSelectAndWrite.OutputVtxContainerName]
+
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY2BsKKSelectAndWrite.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY2BsKKSelectAndWrite.OutputVtxContainerName]
+
+
+# Tagging information (in addition to that already requested by usual algorithms)
+AllVariables += ["MuonSpectrometerTrackParticles" ]
+
+
+
+
+
+# Added by ASC
+# Truth information for MC only
+if isSimulation:
+    AllVariables += ["TruthEvents","TruthParticles","TruthVertices","MuonTruthParticles" ]
+
+
+AllVariables = list(set(AllVariables)) # remove duplicates
+
+BPHY2SlimmingHelper.AllVariables = AllVariables
+BPHY2SlimmingHelper.StaticContent = StaticContent
+BPHY2SlimmingHelper.SmartCollections = SmartVar
+
+BPHY2SlimmingHelper.AppendContentToStream(BPHY2Stream)
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY20.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY20.py
new file mode 100644
index 000000000000..1e8f6f8fd313
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY20.py
@@ -0,0 +1,775 @@
+#====================================================================
+#
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#
+# BPHY20.py
+#
+# R_Jpsi analysis (currently muon channel only)
+#
+#====================================================================
+from AthenaCommon.AppMgr import ServiceMgr as svcMgr
+if not hasattr(svcMgr, 'ItemListSvc'): svcMgr += CfgMgr.ItemListSvc()
+svcMgr.ItemListSvc.OutputLevel = DEBUG
+
+#====================================================================
+# FLAGS TO PERSONALIZE THE DERIVATION
+#====================================================================
+
+onlyAugmentations = False  # Set to True to deactivate thinning and skimming, and only keep augmentations (to generate a sample with full xAOD plus all the extra)
+thinTruth = True
+addMuExtrapolationForTrigger = True
+
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+print(isSimulation)
+
+
+from DerivationFrameworkJetEtMiss.JetCommon import *
+from DerivationFrameworkJetEtMiss.METCommon import *
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+streamName = derivationFlags.WriteDAOD_BPHY20Stream.StreamName
+fileName   = buildFileName( derivationFlags.WriteDAOD_BPHY20Stream )
+
+BPHY20Stream = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY20Stream.AcceptAlgs(["BPHY20Kernel"])
+
+#====================================================================
+# AUGMENTATION TOOLS 
+#====================================================================
+## 1/ setup vertexing tools and services
+
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY20_VertexTools = BPHYVertexTools("BPHY20")
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__AugOriginalCounts
+BPHY20_AugOriginalCounts = DerivationFramework__AugOriginalCounts(
+   name = "BPHY20_AugOriginalCounts",
+   VertexContainer = "PrimaryVertices",
+   TrackContainer = "InDetTrackParticles" )
+ToolSvc += BPHY20_AugOriginalCounts
+
+#====================================================================
+# TriggerCounting for Kernel1 (from BPHY7)
+#====================================================================
+#List of trigggers to be counted (high Sig-eff*Lumi ones are in)
+triggersToMetadata= [
+### 2018
+"HLT_mu11_mu6_bJpsimumu",
+"HLT_2mu10_bJpsimumu",
+"HLT_mu6_2mu4_bJpsi",
+"HLT_3mu4_bJpsi",
+"HLT_mu11_mu6_bJpsimumu_Lxy0",
+"HLT_3mu6_bJpsi",
+"HLT_mu11_mu6_bJpsimumu_L1LFV-MU11",
+"HLT_2mu6_bJpsimumu_L1BPH-2M9-2MU6_BPH-2DR15-2MU6",
+"HLT_mu11_mu6_bJpsimumu_Lxy0_L1LFV-MU11",
+"HLT_2mu6_bJpsimumu_Lxy0_L1BPH-2M9-2MU6_BPH-2DR15-2MU6",
+"HLT_mu6_mu4_bJpsimumu_Lxy0_L1BPH-2M9-MU6MU4_BPH-0DR15-MU6MU4",
+"HLT_2mu4_bJpsimumu_Lxy0_L1BPH-2M9-2MU4_BPH-0DR15-2MU4",
+"HLT_mu6_mu4_bJpsimumu_L1BPH-2M9-MU6MU4_BPH-0DR15-MU6MU4",
+"HLT_mu10_bJpsi_TrkPEB",
+"HLT_mu6_bJpsi_TrkPEB",
+"HLT_2mu6_bJpsimumu",
+"HLT_mu6_mu2noL1_msonly_bJpsimumu_noid_PEB",
+
+### 2017
+#HLT_2mu10_bJpsimumu
+"HLT_2mu10_bJpsimumu_noL2",
+"HLT_2mu6_bJpsimumu",
+#HLT_2mu6_bJpsimumu_L1BPH-2M9-2MU6_BPH-2DR15-2MU6
+"HLT_2mu6_bJpsimumu_Lxy0",
+#HLT_2mu6_bJpsimumu_Lxy0_L1BPH-2M9-2MU6_BPH-2DR15-2MU6
+#HLT_3mu4_bJpsi
+#HLT_3mu6_bJpsi
+#HLT_mu10_bJpsi_TrkPEB
+"HLT_mu10_mu6_bJpsimumu",
+"HLT_mu10_mu6_bJpsimumu_Lxy0",
+#HLT_mu11_mu6_bJpsimumu
+#HLT_mu11_mu6_bJpsimumu_Lxy0
+"HLT_mu14_bJpsi_Trkloose",
+"HLT_mu14_bJpsi_TrkPEB",
+"HLT_mu20_2mu2noL1_JpsimumuFS",
+"HLT_mu20_2mu4_JpsimumuL2",
+"HLT_mu20_bJpsi_Trkloose",
+"HLT_mu20_bJpsi_TrkPEB",
+#HLT_mu6_bJpsi_TrkPEB
+#HLT_mu6_mu4_bJpsimumu_L1BPH-2M9-MU6MU4_BPH-0DR15-MU6MU4
+#HLT_mu6_mu4_bJpsimumu_Lxy0_L1BPH-2M9-MU6MU4_BPH-0DR15-MU6MU4
+
+### 2016
+#HLT_2mu10_bJpsimumu
+"HLT_2mu10_bJpsimumu_delayed",
+"HLT_2mu10_bJpsimumu_noL2",
+"HLT_2mu4_bJpsimumu_delayed_L1BPH-2M8-2MU4",
+"HLT_2mu4_bJpsimumu_L1BPH-2M8-2MU4",
+"HLT_2mu4_bJpsimumu_Lxy0_delayed_L1BPH-2M8-2MU4",
+"HLT_2mu6_bJpsimumu",
+"HLT_2mu6_bJpsimumu_delayed",
+"HLT_2mu6_bJpsimumu_delayed_L1BPH-2M9-2MU6_BPH-2DR15-2MU6",
+#HLT_2mu6_bJpsimumu_L1BPH-2M9-2MU6_BPH-2DR15-2MU6
+"HLT_2mu6_bJpsimumu_Lxy0",
+"HLT_2mu6_bJpsimumu_Lxy0_delayed",
+"HLT_2mu6_bJpsimumu_Lxy0_delayed_L1BPH-2M9-2MU6_BPH-2DR15-2MU6",
+#HLT_2mu6_bJpsimumu_Lxy0_L1BPH-2M9-2MU6_BPH-2DR15-2MU6
+#HLT_3mu4_bJpsi
+"HLT_3mu4_bJpsi_delayed",
+#HLT_3mu6_bJpsi
+"HLT_mu10_mu6_bJpsimumu",
+"HLT_mu10_mu6_bJpsimumu_delayed",
+"HLT_mu10_mu6_bJpsimumu_Lxy0",
+"HLT_mu10_mu6_bJpsimumu_Lxy0_delayed",
+"HLT_mu18_bJpsi_Trkloose",
+"HLT_mu20_2mu0noL1_JpsimumuFS",
+"HLT_mu20_2mu4_JpsimumuL2",
+#HLT_mu6_2mu4_bJpsi
+"HLT_mu6_2mu4_bJpsi_delayed",
+"HLT_mu6_mu4_bJpsimumu",
+"HLT_mu6_mu4_bJpsimumu_delayed",
+"HLT_mu6_mu4_bJpsimumu_delayed_L1BPH-2M8-MU6MU4_BPH-0DR15-MU6MU4",
+"HLT_mu6_mu4_bJpsimumu_delayed_L1MU6MU4-BO",
+"HLT_mu6_mu4_bJpsimumu_L12MU4-B",
+"HLT_mu6_mu4_bJpsimumu_L1BPH-2M8-MU6MU4_BPH-0DR15-MU6MU4",
+"HLT_mu6_mu4_bJpsimumu_L1MU6MU4-BO",
+"HLT_mu6_mu4_bJpsimumu_Lxy0",
+"HLT_mu6_mu4_bJpsimumu_Lxy0_delayed",
+"HLT_mu6_mu4_bJpsimumu_Lxy0_delayed_L1BPH-2M8-MU6MU4_BPH-0DR15-MU6MU4",
+"HLT_mu6_mu4_bJpsimumu_Lxy0_L1BPH-2M8-MU6MU4_BPH-0DR15-MU6MU4",
+
+### 2015
+#HLT_2mu10_bJpsimumu
+#HLT_2mu10_bJpsimumu_noL2
+"HLT_2mu10_l2msonly_bJpsimumu_noL2",
+"HLT_2mu4_bJpsimumu",
+"HLT_2mu4_bJpsimumu_noL2",
+"HLT_2mu4_l2msonly_bJpsimumu_noL2",
+#HLT_2mu6_bJpsimumu
+"HLT_2mu6_bJpsimumu_noL2",
+"HLT_2mu6_l2msonly_bJpsimumu_noL2",
+#HLT_3mu4_bJpsi
+#HLT_3mu6_bJpsi
+"HLT_mu10_mu10_l2msonly_bJpsimumu_noL2",
+"HLT_mu18_2mu0noL1_JpsimumuFS",
+"HLT_mu18_2mu4_JpsimumuL2",
+#HLT_mu18_bJpsi_Trkloose
+#HLT_mu20_2mu0noL1_JpsimumuFS
+#HLT_mu20_2mu4_JpsimumuL2
+"HLT_mu4_mu4_l2msonly_bJpsimumu_noL2",
+"HLT_mu6_l2msonly_mu4_bJpsimumu_noL2",
+"HLT_mu6_l2msonly_mu4_l2msonly_bJpsimumu_noL2",
+#HLT_mu6_mu4_bJpsimumu
+"HLT_mu6_mu4_bJpsimumu_noL2",
+"HLT_mu6_mu4_l2msonly_bJpsimumu_noL2",
+"HLT_mu6_mu6_l2msonly_bJpsimumu_noL2",
+
+"HLT_mu4","HLT_mu6","HLT_mu10","HLT_mu14","HLT_mu18","HLT_mu24" #5%
+
+ ]
+
+triggersToMetadata_filter = list( set(triggersToMetadata) )
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__TriggerCountToMetadata
+BPHY20TriggerCountToMetadata = DerivationFramework__TriggerCountToMetadata(name = "BPHY20TriggerCount",
+                                                                          TriggerList = triggersToMetadata_filter,
+                                                                          FolderName = "BPHY20")
+
+ToolSvc += BPHY20TriggerCountToMetadata
+
+#====================================================================
+# PRESELECTION for Kernel1 #Added by Matteo
+#====================================================================
+## 1/ Setup the skimming based on triggers
+##     
+
+triggerList = [ 
+## 2018
+"HLT_mu11_mu6_bJpsimumu",
+"HLT_2mu10_bJpsimumu",
+"HLT_mu6_2mu4_bJpsi",
+"HLT_3mu4_bJpsi",
+"HLT_mu11_mu6_bJpsimumu_Lxy0",
+"HLT_3mu6_bJpsi",
+"HLT_mu11_mu6_bJpsimumu_L1LFV-MU11",
+"HLT_2mu6_bJpsimumu_L1BPH-2M9-2MU6_BPH-2DR15-2MU6",
+"HLT_mu11_mu6_bJpsimumu_Lxy0_L1LFV-MU11",
+"HLT_2mu6_bJpsimumu_Lxy0_L1BPH-2M9-2MU6_BPH-2DR15-2MU6",
+"HLT_mu6_mu4_bJpsimumu_Lxy0_L1BPH-2M9-MU6MU4_BPH-0DR15-MU6MU4",
+"HLT_2mu4_bJpsimumu_Lxy0_L1BPH-2M9-2MU4_BPH-0DR15-2MU4",
+"HLT_mu6_mu4_bJpsimumu_L1BPH-2M9-MU6MU4_BPH-0DR15-MU6MU4",
+"HLT_mu10_bJpsi_TrkPEB",
+"HLT_mu6_bJpsi_TrkPEB",
+"HLT_2mu6_bJpsimumu",
+"HLT_mu6_mu2noL1_msonly_bJpsimumu_noid_PEB",
+
+
+"HLT_mu22_mu8noL1_TagandProbe",
+
+### 2017
+#HLT_2mu10_bJpsimumu
+"HLT_2mu10_bJpsimumu_noL2",
+"HLT_2mu6_bJpsimumu",
+#HLT_2mu6_bJpsimumu_L1BPH-2M9-2MU6_BPH-2DR15-2MU6
+"HLT_2mu6_bJpsimumu_Lxy0",
+#HLT_2mu6_bJpsimumu_Lxy0_L1BPH-2M9-2MU6_BPH-2DR15-2MU6
+#HLT_3mu4_bJpsi
+#HLT_3mu6_bJpsi
+#HLT_mu10_bJpsi_TrkPEB
+"HLT_mu10_mu6_bJpsimumu",
+"HLT_mu10_mu6_bJpsimumu_Lxy0",
+#HLT_mu11_mu6_bJpsimumu
+#HLT_mu11_mu6_bJpsimumu_Lxy0
+"HLT_mu14_bJpsi_Trkloose",
+"HLT_mu14_bJpsi_TrkPEB",
+"HLT_mu20_2mu2noL1_JpsimumuFS",
+"HLT_mu20_2mu4_JpsimumuL2",
+"HLT_mu20_bJpsi_Trkloose",
+"HLT_mu20_bJpsi_TrkPEB",
+#HLT_mu6_bJpsi_TrkPEB
+#HLT_mu6_mu4_bJpsimumu_L1BPH-2M9-MU6MU4_BPH-0DR15-MU6MU4
+#HLT_mu6_mu4_bJpsimumu_Lxy0_L1BPH-2M9-MU6MU4_BPH-0DR15-MU6MU4
+
+### 2016
+#HLT_2mu10_bJpsimumu
+"HLT_2mu10_bJpsimumu_delayed",
+"HLT_2mu10_bJpsimumu_noL2",
+"HLT_2mu4_bJpsimumu_delayed_L1BPH-2M8-2MU4",
+"HLT_2mu4_bJpsimumu_L1BPH-2M8-2MU4",
+"HLT_2mu4_bJpsimumu_Lxy0_delayed_L1BPH-2M8-2MU4",
+"HLT_2mu6_bJpsimumu",
+"HLT_2mu6_bJpsimumu_delayed",
+"HLT_2mu6_bJpsimumu_delayed_L1BPH-2M9-2MU6_BPH-2DR15-2MU6",
+#HLT_2mu6_bJpsimumu_L1BPH-2M9-2MU6_BPH-2DR15-2MU6
+"HLT_2mu6_bJpsimumu_Lxy0",
+"HLT_2mu6_bJpsimumu_Lxy0_delayed",
+"HLT_2mu6_bJpsimumu_Lxy0_delayed_L1BPH-2M9-2MU6_BPH-2DR15-2MU6",
+#HLT_2mu6_bJpsimumu_Lxy0_L1BPH-2M9-2MU6_BPH-2DR15-2MU6
+#HLT_3mu4_bJpsi
+"HLT_3mu4_bJpsi_delayed",
+#HLT_3mu6_bJpsi
+"HLT_mu10_mu6_bJpsimumu",
+"HLT_mu10_mu6_bJpsimumu_delayed",
+"HLT_mu10_mu6_bJpsimumu_Lxy0",
+"HLT_mu10_mu6_bJpsimumu_Lxy0_delayed",
+"HLT_mu18_bJpsi_Trkloose",
+"HLT_mu20_2mu0noL1_JpsimumuFS",
+"HLT_mu20_2mu4_JpsimumuL2",
+#HLT_mu6_2mu4_bJpsi
+"HLT_mu6_2mu4_bJpsi_delayed",
+"HLT_mu6_mu4_bJpsimumu",
+"HLT_mu6_mu4_bJpsimumu_delayed",
+"HLT_mu6_mu4_bJpsimumu_delayed_L1BPH-2M8-MU6MU4_BPH-0DR15-MU6MU4",
+"HLT_mu6_mu4_bJpsimumu_delayed_L1MU6MU4-BO",
+"HLT_mu6_mu4_bJpsimumu_L12MU4-B",
+"HLT_mu6_mu4_bJpsimumu_L1BPH-2M8-MU6MU4_BPH-0DR15-MU6MU4",
+"HLT_mu6_mu4_bJpsimumu_L1MU6MU4-BO",
+"HLT_mu6_mu4_bJpsimumu_Lxy0",
+"HLT_mu6_mu4_bJpsimumu_Lxy0_delayed",
+"HLT_mu6_mu4_bJpsimumu_Lxy0_delayed_L1BPH-2M8-MU6MU4_BPH-0DR15-MU6MU4",
+"HLT_mu6_mu4_bJpsimumu_Lxy0_L1BPH-2M8-MU6MU4_BPH-0DR15-MU6MU4",
+
+### 2015
+#HLT_2mu10_bJpsimumu
+#HLT_2mu10_bJpsimumu_noL2
+"HLT_2mu10_l2msonly_bJpsimumu_noL2",
+"HLT_2mu4_bJpsimumu",
+"HLT_2mu4_bJpsimumu_noL2",
+"HLT_2mu4_l2msonly_bJpsimumu_noL2",
+#HLT_2mu6_bJpsimumu
+"HLT_2mu6_bJpsimumu_noL2",
+"HLT_2mu6_l2msonly_bJpsimumu_noL2",
+#HLT_3mu4_bJpsi
+#HLT_3mu6_bJpsi
+"HLT_mu10_mu10_l2msonly_bJpsimumu_noL2",
+"HLT_mu18_2mu0noL1_JpsimumuFS",
+"HLT_mu18_2mu4_JpsimumuL2",
+#HLT_mu18_bJpsi_Trkloose
+#HLT_mu20_2mu0noL1_JpsimumuFS
+#HLT_mu20_2mu4_JpsimumuL2
+"HLT_mu4_mu4_l2msonly_bJpsimumu_noL2",
+"HLT_mu6_l2msonly_mu4_bJpsimumu_noL2",
+"HLT_mu6_l2msonly_mu4_l2msonly_bJpsimumu_noL2",
+#HLT_mu6_mu4_bJpsimumu
+"HLT_mu6_mu4_bJpsimumu_noL2",
+"HLT_mu6_mu4_l2msonly_bJpsimumu_noL2",
+"HLT_mu6_mu6_l2msonly_bJpsimumu_noL2" ,
+
+
+
+"HLT_mu4","HLT_mu6","HLT_mu10","HLT_mu14","HLT_mu18","HLT_mu24", #5%
+                
+             
+"HLT_.*mu11_mu6.*",     # Recent triggers
+"HLT_.*mu.*imedium.*",	# Trigger with looser isolation selection 
+"HLT_.*mu.*iloose.*",
+"HLT_.*mu6.*2mu4.*",
+"HLT_.*2mu.*",
+"HLT_.*mu11.*2mu4noL1.*",
+"HLT_.*2mu14_nomucomb.*",
+"HLT_.*bTau.*",		# Our tau triggers
+"HLT_.*bDimu2700.*",
+"HLT_.*bPhi.*"
+               ]    
+               
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__TriggerSkimmingTool
+BPHY20TriggerSkim = DerivationFramework__TriggerSkimmingTool(name = "BPHY20TriggerSkim",
+                                                            TriggerListOR = triggerList,
+                                                            TriggerListAND = [] )
+
+ToolSvc += BPHY20TriggerSkim
+
+#--------------------------------------------------------------------
+# 2/ Select J/psi>mu+mu-
+#--------------------------------------------------------------------
+## a/ setup JpsiFinder tool
+##    These are general tools independent of DerivationFramework that do the 
+##    actual vertex fitting and some pre-selection.
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder
+BPHY20JpsiFinder = Analysis__JpsiFinder(
+    name                       = "BPHY20JpsiFinder",
+    OutputLevel                = INFO,
+    muAndMu                    = True,
+    muAndTrack                 = False,
+    TrackAndTrack              = False,
+    assumeDiMuons              = True, 
+    muonThresholdPt            = 1000,
+    invMassUpper               = 4500.0,
+    invMassLower               = 2000.0,
+    Chi2Cut                    = 20.,
+    oppChargesOnly	        = True,
+#    allChargeCombinations	   = True,
+    combOnly                   = False,
+    atLeastOneComb             = True,
+    useCombinedMeasurement     = False, # Only takes effect if combOnly=True    
+    muonCollectionKey          = "Muons",
+    TrackParticleCollection    = "InDetTrackParticles",
+    V0VertexFitterTool         = BPHY20_VertexTools.TrkV0Fitter,             # V0 vertex fitter
+    useV0Fitter                = False,                   # if False a TrkVertexFitterTool will be used
+    TrkVertexFitterTool        = BPHY20_VertexTools.TrkVKalVrtFitter,        # VKalVrt vertex fitter
+    TrackSelectorTool          = BPHY20_VertexTools.InDetTrackSelectorTool,
+    VertexPointEstimator       = BPHY20_VertexTools.VtxPointEstimator,
+    useMCPCuts                 = False)
+
+ToolSvc += BPHY20JpsiFinder
+print(BPHY20JpsiFinder)
+
+#--------------------------------------------------------------------
+## b/ setup the vertex reconstruction "call" tool(s). They are part of the derivation framework.
+##    These Augmentation tools add output vertex collection(s) into the StoreGate and add basic 
+##    decorations which do not depend on the vertex mass hypothesis (e.g. lxy, ptError, etc).
+##    There should be one tool per topology, i.e. Jpsi and Psi(2S) do not need two instance of the
+##    Reco tool is the JpsiFinder mass window is wide enough.
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY20JpsiSelectAndWrite = DerivationFramework__Reco_Vertex(
+    name                   = "BPHY20JpsiSelectAndWrite",
+    VertexSearchTool             = BPHY20JpsiFinder,
+    OutputVtxContainerName = "BPHY20JpsiCandidates",
+    PVContainerName        = "PrimaryVertices",
+    RefPVContainerName     = "SHOULDNOTBEUSED",
+    DoVertexType           = 1)
+
+ToolSvc += BPHY20JpsiSelectAndWrite
+print(BPHY20JpsiSelectAndWrite)
+
+#--------------------------------------------------------------------
+## c/ augment and select Jpsi->mumu candidates
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+BPHY20_Select_Jpsi2mumu = DerivationFramework__Select_onia2mumu(
+    name                  = "BPHY20_Select_Jpsi2mumu",
+    HypothesisName        = "Jpsi",
+    InputVtxContainerName = "BPHY20JpsiCandidates",
+    VtxMassHypo           = 3096.900,
+    MassMin               = 2000.0,
+    MassMax               = 4500.0,
+    Chi2Max               = 20,
+    DoVertexType          = 1)
+  
+ToolSvc += BPHY20_Select_Jpsi2mumu
+print(BPHY20_Select_Jpsi2mumu)
+
+#--------------------------------------------------------------------
+# 3/ select B_c+->J/psi mu
+#--------------------------------------------------------------------
+## a/ setup a new vertexing tool (necessary due to use of mass constraint) 
+from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+BcJpsiMuVertexFit = Trk__TrkVKalVrtFitter(
+    name               = "BcJpsiMuVertexFit",
+    Extrapolator       = BPHY20_VertexTools.InDetExtrapolator,
+    FirstMeasuredPoint = True,
+    MakeExtendedVertex = True)
+
+ToolSvc += BcJpsiMuVertexFit
+print(BcJpsiMuVertexFit)
+
+#--------------------------------------------------------------------
+## b/ setup the Jpsi+1 track finder
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiPlus1Track
+BPHY20BcJpsiMu = Analysis__JpsiPlus1Track(
+    name                    = "BPHY20BcJpsiMu",
+    OutputLevel             = INFO, #DEBUG,
+    pionHypothesis          = True, #False,
+    kaonHypothesis        = False,#True,
+    trkThresholdPt        = 1000,
+    trkMaxEta               = 3.0,
+    BThresholdPt            = 1000.0,
+    BMassUpper                = 6900.0,
+    BMassLower                = 2000.0,
+    JpsiContainerKey        = "BPHY20JpsiCandidates",
+    TrackParticleCollection = "InDetTrackParticles",
+    MuonsUsedInJpsi         = "Muons",
+    ExcludeCrossJpsiTracks		= False,
+    TrkVertexFitterTool     = BcJpsiMuVertexFit,
+    TrackSelectorTool       = BPHY20_VertexTools.InDetTrackSelectorTool,
+    UseMassConstraint       = True, 
+    RequireNMuonTracks      = 1,
+    Chi2Cut                 = 1000, #5
+    TrkTrippletMassUpper    = 6900,
+    TrkTrippletMassLower    = 2000.0)
+        
+ToolSvc += BPHY20BcJpsiMu
+print(BPHY20BcJpsiMu)    
+
+#--------------------------------------------------------------------
+## c/ setup the combined augmentation/skimming tool for the Bc+>J/psi mu
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY20BcJpsiMuSelectAndWrite = DerivationFramework__Reco_Vertex(
+    name                   = "BPHY20BcJpsiMuSelectAndWrite",
+    OutputLevel            = INFO,
+    VertexSearchTool     = BPHY20BcJpsiMu,
+    OutputVtxContainerName = "BPHY20BcJpsiMuCandidates",
+    PVContainerName        = "PrimaryVertices",
+    RefPVContainerName     = "BPHY20RefittedPrimaryVertices",
+    RefitPV                = True,
+    MaxPVrefit           = 1000)
+
+ToolSvc += BPHY20BcJpsiMuSelectAndWrite 
+print(BPHY20BcJpsiMuSelectAndWrite)
+
+#--------------------------------------------------------------------
+## c/ augment and select B_c+>Jpsi mu candidates
+BPHY20_Select_Bc2JpsiMu = DerivationFramework__Select_onia2mumu(
+    name                  = "BPHY20_Select_Bc2JpsiMu",
+    HypothesisName        = "Bc",
+    InputVtxContainerName = "BPHY20BcJpsiMuCandidates",
+    TrkMasses             = [105.658, 105.658, 105.658],
+    VtxMassHypo           = 6274.9,
+    MassMin               = 2000.0,
+    MassMax               = 6900.0,
+    Chi2Max               = 1000)
+
+ToolSvc += BPHY20_Select_Bc2JpsiMu
+print(BPHY20_Select_Bc2JpsiMu)
+
+
+
+#====================================================================
+# Isolation
+#====================================================================
+
+
+#Track isolation for candidates
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__VertexTrackIsolation
+BPHY20TrackIsolationDecorator = DerivationFramework__VertexTrackIsolation(
+  name                            = "BPHY20TrackIsolationDecorator",
+  OutputLevel                     = INFO,
+  TrackIsoTool                       = "xAOD::TrackIsolationTool",
+  TrackContainer                  = "InDetTrackParticles",
+  InputVertexContainer            = "BPHY20BcJpsiMuCandidates",
+  PassFlags                       = ["passed_Bc"] )
+
+ToolSvc += BPHY20TrackIsolationDecorator
+
+#CaloIsolationTool explicitly declared to avoid pointless warnings (it works!!!)
+from IsolationTool.IsolationToolConf import xAOD__CaloIsolationTool
+BPHY20CaloIsolationTool = xAOD__CaloIsolationTool(
+  name                            = "BPHY20CaloIsolationTool",
+  OutputLevel                     = WARNING,                  
+  saveOnlyRequestedCorrections    = True,
+  IsoLeakCorrectionTool           = "" ) #Workaround for a bug in older versions
+
+ToolSvc += BPHY20CaloIsolationTool
+
+#Calo isolation for candidates
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__VertexCaloIsolation
+BPHY20CaloIsolationDecorator = DerivationFramework__VertexCaloIsolation(
+  name                            = "BPHY20CaloIsolationDecorator",
+  OutputLevel                     = INFO,                  
+  CaloIsoTool                     = BPHY20CaloIsolationTool,  #"xAOD::CaloIsolationTool",
+  TrackContainer                  = "InDetTrackParticles",
+  InputVertexContainer            = "BPHY20BcJpsiMuCandidates",
+  CaloClusterContainer            = "CaloCalTopoClusters",
+  ParticleCaloExtensionTool       = "Trk::ParticleCaloExtensionTool/ParticleCaloExtensionTool",
+  PassFlags                       = ["passed_Bc"] )
+
+ToolSvc += BPHY20CaloIsolationDecorator
+
+
+
+#====================================================================
+# Skimming tool to select only events with the correct vertices
+#====================================================================
+
+#--------------------------------------------------------------------
+## 9/ select the event. We only want to keep events that contain certain three-mu vertices which passed certain selection.
+##    Exactly like in the preselection, where only 2mu vertices are treated.
+
+#
+#expression = "count(BPHY20JpsiCandidates.x > -999.0)+count(BPHY20BcJpsiMuCandidates.x > -999.0)+ count(BPHY20BcJpsiMuCandidates.passed_Bc) >0 "
+
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+BPHY20_SelectBcJpsiMuEvent = DerivationFramework__xAODStringSkimmingTool(
+     name = "BPHY20_SelectBcJpsiMuEvent",
+     expression = "count(BPHY20BcJpsiMuCandidates.passed_Bc) >= 1 ")
+   
+ToolSvc += BPHY20_SelectBcJpsiMuEvent
+print(BPHY20_SelectBcJpsiMuEvent)
+
+  #====================================================================
+   # Make event selection based on an OR of the input skimming tools
+   #====================================================================
+      
+#   from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__FilterCombinationOR
+#   BPHY20SkimmingOR = CfgMgr.DerivationFramework__FilterCombinationOR(
+#       "BPHY20SkimmingOR",
+#       FilterList = [BPHY20_SelectBcJpsiMuEvent] )
+#   ToolSvc += BPHY20SkimmingOR
+#   print      BPHY20SkimmingOR   
+   
+
+#====================================================================
+# Add Extrapolation of muons to trigger layers
+#====================================================================
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__MuonExtrapolationTool 
+BPHY20_Extrap_Tool = DerivationFramework__MuonExtrapolationTool(   name = "BPHY20_ExtrapolationTool",   OutputLevel = INFO ) 
+
+ToolSvc += BPHY20_Extrap_Tool
+
+
+
+
+
+#====================================================================
+# Thinning Helper and various thinning tools
+#====================================================================
+
+#--------------------------------------------------------------------
+## 10/ Setup the thinning helper, only tool able to perform thinning of trigger navigation information
+
+from DerivationFrameworkCore.ThinningHelper import ThinningHelper
+BPHY20ThinningHelper = ThinningHelper( "BPHY20ThinningHelper" )
+BPHY20ThinningHelper.TriggerChains = 'HLT_.*mu.*' #triggerList    # . = any character; * = 0 or more times; + = 1 or more times; ? 0 or 1 times  "Regular_Expression"
+BPHY20ThinningHelper.AppendToStream( BPHY20Stream )
+
+
+#--------------------------------------------------------------------
+## 11/ track and vertex thinning. We want to remove all reconstructed secondary vertices
+##    which haven't passed any of the selections defined by (Select_*) tools.
+##    We also want to keep only tracks which are associates with either muons or any of the
+##    vertices that passed the selection. Multiple thinning tools can perform the 
+##    selection. The final thinning decision is based OR of all the decisions (by default,
+##    although it can be changed by the JO).
+
+## 12/ Cleans up, removing duplicate vertices. An issue caused by the logic of Jpsi+1 track in the case of 3-muon candidates
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxDuplicates
+BPHY20Thin_vtxDuplicates = DerivationFramework__Thin_vtxDuplicates(name                       = "BPHY20Thin_vtxDuplicates",
+                                                                  VertexContainerName       = "BPHY20BcJpsiMuCandidates",
+                                                                  PassFlags                  = ["passed_Bc"])
+
+ToolSvc += BPHY20Thin_vtxDuplicates
+
+## a) thining out vertices that didn't pass any selection and idetifying tracks associated with 
+##    selected vertices. The "VertexContainerNames" is a list of the vertex containers, and "PassFlags"
+##    contains all pass flags for Select_* tools that must be satisfied. The vertex is kept is it 
+##    satisfy any of the listed selections.
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxTrk
+BPHY20Thin_vtxTrk = DerivationFramework__Thin_vtxTrk(
+  name                       = "BPHY20Thin_vtxTrk",
+  OutputLevel                = INFO,
+  TrackParticleContainerName = "InDetTrackParticles",
+  AcceptanceRadius         = 1.,
+  VertexContainerNames       = ["BPHY20BcJpsiMuCandidates"],
+  PassFlags                  = ["passed_Bc"],
+  ApplyAnd                   = True )  # "and" requirement for Vertices
+
+ToolSvc += BPHY20Thin_vtxTrk
+
+
+## 13/ thinning out tracks that are not attached to muons. The final thinning decision is based on the OR operation
+##     between decision from this and the previous tools.
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__MuonTrackParticleThinning
+BPHY20MuonTPThinningTool = DerivationFramework__MuonTrackParticleThinning(name                    = "BPHY20MuonTPThinningTool",
+                                                                         MuonKey                 = "Muons",
+                                                                         InDetTrackParticlesKey  = "InDetTrackParticles")
+ToolSvc += BPHY20MuonTPThinningTool
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__BPhysPVThinningTool
+BPHY20_thinningTool_PV = DerivationFramework__BPhysPVThinningTool(name                       = "BPHY20_thinningTool_PV",
+                                                                 CandidateCollections       = ["BPHY20BcJpsiMuCandidates"],
+                                                                 KeepPVTracks  =True)
+
+ToolSvc += BPHY20_thinningTool_PV
+
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__TauTrackParticleThinning
+BPHY20TauTPThinningTool = DerivationFramework__TauTrackParticleThinning(name                    = "BPHY20TauTPThinningTool",
+                                                                       TauKey                 = "TauJets",
+                                                                       InDetTrackParticlesKey  = "InDetTrackParticles")
+ToolSvc += BPHY20TauTPThinningTool
+
+# Only save truth informtion directly associated with: mu Ds+ D+ D*+ Ds*+ D0 D*0 B+ B*+ B0 B*0 
+from DerivationFrameworkMCTruth.DerivationFrameworkMCTruthConf import DerivationFramework__GenericTruthThinning
+BPHY20TruthThinTool = DerivationFramework__GenericTruthThinning(name                    = "BPHY20TruthThinTool",
+                                                               ParticleSelectionString = "abs(TruthParticles.pdgId) == 13 || abs(TruthParticles.pdgId) == 15 || abs(TruthParticles.pdgId) == 541 || abs(TruthParticles.pdgId) == 431 || abs(TruthParticles.pdgId) == 411 || abs(TruthParticles.pdgId) == 413 || abs(TruthParticles.pdgId) == 433 || TruthParticles.pdgId == 421 || TruthParticles.pdgId == 423 || abs(TruthParticles.pdgId) == 521 || abs(TruthParticles.pdgId) == 523 || TruthParticles.pdgId == 511 || TruthParticles.pdgId == 513",
+                                                               PreserveDescendants     = True,
+                                                               PreserveAncestors      = True)
+ToolSvc += BPHY20TruthThinTool
+
+# Only save truth neutrino and b/c quarks information
+from DerivationFrameworkMCTruth.DerivationFrameworkMCTruthConf import DerivationFramework__GenericTruthThinning
+BPHY20TruthThinNoChainTool = DerivationFramework__GenericTruthThinning(name                    = "BPHY20TruthThinNoChainTool",
+                                                              ParticleSelectionString = "abs(TruthParticles.pdgId) == 4 || abs(TruthParticles.pdgId) == 5 || abs(TruthParticles.pdgId) == 12 || abs(TruthParticles.pdgId) == 14 || abs(TruthParticles.pdgId) == 16",
+                                                              PreserveDescendants     = False,
+                                                              PreserveAncestors      = False)
+ToolSvc += BPHY20TruthThinNoChainTool
+
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS  
+#====================================================================
+
+BPHY20ThinningTools = [ BPHY20MuonTPThinningTool, BPHY20Thin_vtxDuplicates, 
+                        BPHY20Thin_vtxTrk, BPHY20_thinningTool_PV,  
+                        BPHY20TauTPThinningTool]
+
+BPHY20SkimmingTools = [BPHY20_SelectBcJpsiMuEvent]
+
+BPHY20AugmentationTools = [BPHY20JpsiSelectAndWrite, BPHY20_Select_Jpsi2mumu,
+                           BPHY20BcJpsiMuSelectAndWrite, BPHY20_Select_Bc2JpsiMu,
+                           BPHY20_AugOriginalCounts,
+                           BPHY20TrackIsolationDecorator, BPHY20CaloIsolationDecorator]
+
+if addMuExtrapolationForTrigger:
+    BPHY20AugmentationTools.append(BPHY20_Extrap_Tool)
+
+Kernel1Tools = [BPHY20TriggerSkim]
+
+if isSimulation:
+    #BPHY20AugmentationTools.append(DFCommonTauTruthMatchingWrapper)
+    if thinTruth:
+       BPHY20ThinningTools.append(BPHY20TruthThinTool)
+       BPHY20ThinningTools.append(BPHY20TruthThinNoChainTool)
+
+#The sequence object. Is in principle just a wrapper which allows to run two kernels in sequence
+BPHY20_Sequence = CfgMgr.AthSequencer("BPHY20_Sequence")
+from DerivationFrameworkFlavourTag.FlavourTagCommon import FlavorTagInit
+FlavorTagInit(JetCollections=['AntiKt4EMPFlowJets'], Sequencer=BPHY20_Sequence)
+
+#onlyAugmentations implementation
+if onlyAugmentations:
+    Kernel1Tools = []
+    BPHY20SkimmingTools = []
+    BPHY20ThinningTools = []
+
+# Kernel n1 PRESELECTION
+# The name of the kernel (BPHY20Kernel1 in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+BPHY20_Sequence += CfgMgr.DerivationFramework__DerivationKernel("BPHY20Kernel_trigPresel",
+                                                               AugmentationTools = [BPHY20TriggerCountToMetadata] ,
+                                                               SkimmingTools     = Kernel1Tools)
+# Kernel n2 deep Derivation
+# The name of the kernel (BPHY20Kernel2 in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+BPHY20_Sequence += CfgMgr.DerivationFramework__DerivationKernel("BPHY20Kernel",
+                                                               AugmentationTools = BPHY20AugmentationTools,
+                                                               SkimmingTools     = BPHY20SkimmingTools, 
+                                                               ThinningTools     = BPHY20ThinningTools)
+
+#Vital, replaces the adding of kernels directly
+DerivationFrameworkJob += BPHY20_Sequence
+
+#====================================================================
+# Slimming 
+#====================================================================
+
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY20SlimmingHelper = SlimmingHelper("BPHY20SlimmingHelper")
+AllVariables  = []
+StaticContent = []
+
+
+
+SmartCollections = [
+                    "Photons", 
+                    "TauJets", 
+                    "AntiKt4EMTopoJets_BTagging201810", 
+                    "BTagging_AntiKt4EMTopo_201810", 
+                    "PrimaryVertices", 
+                    "Muons", 
+                    "InDetTrackParticles", 
+                    "MET_Reference_AntiKt4EMTopo"
+                    ]
+
+
+AllVariables = ["METAssoc_AntiKt4EMTopo",
+                 "MET_Core_AntiKt4EMTopo",
+                 "MET_Truth",
+                 "MET_Track",
+                 "MET_LocHadTopo"]
+
+AllVariables += ["Kt4EMTopoOriginEventShape",
+                 "Kt4EMTopoEventShape"]
+
+AllVariables += ["CombinedMuonTrackParticles",
+                 "ExtrapolatedMuonTrackParticles",
+                 "MuonSpectrometerTrackParticles"]
+
+
+ExtraVariables = ["Photons.pt.eta.phi.m",
+                  "Electrons.pt.eta.phi.m","TauJets.pt.eta.phi.m.IsTruthMatched.truthJetLink.truthParticleLink",
+                  "AntiKt4EMTopoJets_BTagging201810.JetPileupScaleMomentum_pt.JetPileupScaleMomentum_eta.JetPileupScaleMomentum_phi.JetPileupScaleMomentum_m", 
+                  "AntiKt4EMTopoJets_BTagging201810.JvtJvfcorr.HECFrac.LArQuality.HECQuality.NegativeE.AverageLArQF", 
+                  "AntiKt4EMTopoJets_BTagging201810.JetEtaJESScaleMomentum_pt.JetEtaJESScaleMomentum_eta.JetEtaJESScaleMomentum_phi.JetEtaJESScaleMomentum_m"]
+
+ExtraVariables += ["Muons.etaLayer1Hits.etaLayer2Hits.etaLayer3Hits.etaLayer4Hits.phiLayer1Hits.phiLayer2Hits.phiLayer3Hits.phiLayer4Hits",
+                   "Muons.numberOfTriggerEtaLayers.numberOfPhiLayers",
+                   "CombinedMuonTrackParticles.numberOfTRTHits.numberOfTRTHighThresholdHits", 
+                   "InDetTrackParticles.numberOfTRTHits.numberOfTRTHighThresholdHits.vx.vy.vz",
+                   "PrimaryVertices.chiSquared.covariance"]
+
+
+StaticContent =  ["xAOD::VertexContainer#BPHY20RefittedPrimaryVertices",
+                  "xAOD::VertexAuxContainer#BPHY20RefittedPrimaryVerticesAux."]
+
+
+## Jpsi candidates 
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY20JpsiSelectAndWrite.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY20JpsiSelectAndWrite.OutputVtxContainerName]
+
+## Bc+>J/psi Mu+ candidates
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY20BcJpsiMuSelectAndWrite.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY20BcJpsiMuSelectAndWrite.OutputVtxContainerName]
+
+
+# Truth information for MC only
+if isSimulation:
+    AllVariables += ["TruthEvents","TruthParticles","TruthVertices","MuonTruthParticles", "METMap_Truth"]
+    SmartCollections += ["AntiKt4TruthJets"] 
+
+# Needed for trigger objects
+BPHY20SlimmingHelper.IncludeMuonTriggerContent = True
+BPHY20SlimmingHelper.IncludeBPhysTriggerContent = True
+
+# Pass all lists to the SlimmingHelper
+BPHY20SlimmingHelper.ExtraVariables = ExtraVariables
+BPHY20SlimmingHelper.AllVariables = AllVariables
+BPHY20SlimmingHelper.StaticContent = StaticContent
+BPHY20SlimmingHelper.SmartCollections = SmartCollections
+BPHY20SlimmingHelper.AppendContentToStream(BPHY20Stream)
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY21.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY21.py
new file mode 100644
index 000000000000..def21d405a71
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY21.py
@@ -0,0 +1,329 @@
+#2019/11/18
+#====================================================================
+# BPHY21.py
+# W -> (J/psi + D_s) 
+# It requires the reductionConf flag BPHY21 in Reco_tf.py   
+#====================================================================
+
+# Set up common services and job object. 
+# This should appear in ALL derivation job options
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+print(isSimulation)
+
+
+#====================================================================
+# AUGMENTATION TOOLS 
+#====================================================================
+## 1/ setup vertexing tools and services
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY21_VertexTools = BPHYVertexTools("BPHY21")
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__AugOriginalCounts
+BPHY21_AugOriginalCounts = DerivationFramework__AugOriginalCounts(
+   name = "BPHY21_AugOriginalCounts",
+   VertexContainer = "PrimaryVertices",
+   TrackContainer = "InDetTrackParticles" )
+ToolSvc += BPHY21_AugOriginalCounts
+
+#====================================================================
+# TriggerCounting for Kernel1 
+#====================================================================
+#List of trigggers to be counted 
+BPHY21_triggersToMetadata= [
+                "HLT_2mu10",
+                "HLT_2mu10_nomucomb",
+                "HLT_2mu14",
+                "HLT_2mu14_nomucomb",
+                "HLT_mu18_mu8noL1",
+                "HLT_mu18_nomucomb_mu8noL1",
+                "HLT_mu20_mu8noL1",
+                "HLT_mu20_nomucomb_mu8noL1",
+                "HLT_mu22_mu8noL1",
+                "HLT_mu22_nomucomb_mu8noL1",
+                "HLT_mu20_mu8noL1",
+                "HLT_mu24_mu8noL1",
+                "HLT_mu10_mu6_bJpsimumu",
+                "HLT_mu22_mu8noL1_calotag_0eta010_L1MU1"
+              ]
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__TriggerCountToMetadata
+BPHY21_TriggerCountToMetadata = DerivationFramework__TriggerCountToMetadata(name = "BPHY21_TriggerCount",
+                                                                          TriggerList = BPHY21_triggersToMetadata,
+                                                                          FolderName = "BPHY21")
+
+ToolSvc += BPHY21_TriggerCountToMetadata
+
+#====================================================================
+
+
+#====================================================================
+#====================================================================
+## 1/ Setup the skimming based on triggers
+##     
+
+BPHY21_triggerList = [ 
+                "HLT_2mu10",
+                "HLT_2mu10_nomucomb",
+                "HLT_2mu14",
+                "HLT_2mu14_nomucomb",
+                "HLT_mu18_mu8noL1",
+                "HLT_mu18_nomucomb_mu8noL1",
+                "HLT_mu20_mu8noL1",
+                "HLT_mu20_nomucomb_mu8noL1",
+                "HLT_mu22_mu8noL1",
+                "HLT_mu22_nomucomb_mu8noL1",
+                "HLT_mu20_mu8noL1",
+                "HLT_mu24_mu8noL1",
+                "HLT_mu10_mu6_bJpsimumu",
+                "HLT_mu22_mu8noL1_calotag_0eta010_L1MU1"
+               ]  
+
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__TriggerSkimmingTool
+BPHY21_TriggerSkim = DerivationFramework__TriggerSkimmingTool(name = "BPHY21_TriggerSkim",
+                                                            TriggerListOR = BPHY21_triggerList)
+
+ToolSvc += BPHY21_TriggerSkim
+
+
+#--------------------------------------------------------------------
+# 2/ Select J/psi>mu+mu-
+#--------------------------------------------------------------------
+## a/ setup JpsiFinder tool
+##    These are general tools independent of DerivationFramework that do the 
+##    actual vertex fitting and some pre-selection.
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder
+BPHY21_JpsiFinder = Analysis__JpsiFinder(
+    name                       = "BPHY21_JpsiFinder",
+    OutputLevel                = INFO,
+    muAndMu                    = True,
+    muAndTrack                 = False,
+    TrackAndTrack              = False,
+    assumeDiMuons              = True, 
+    muonThresholdPt            = 2700,
+    invMassUpper               = 3400.0,
+    invMassLower               = 2800.0,
+    Chi2Cut                    = 10.,
+    oppChargesOnly             = True,
+    combOnly                   = True,
+    atLeastOneComb             = False,
+    useCombinedMeasurement     = False, # Only takes effect if combOnly=True    
+    muonCollectionKey          = "Muons",
+    TrackParticleCollection    = "InDetTrackParticles",
+    V0VertexFitterTool         = BPHY21_VertexTools.TrkV0Fitter,             # V0 vertex fitter
+    useV0Fitter                = False,                   # if False a TrkVertexFitterTool will be used
+    TrkVertexFitterTool        = BPHY21_VertexTools.TrkVKalVrtFitter,        # VKalVrt vertex fitter
+    TrackSelectorTool          = BPHY21_VertexTools.InDetTrackSelectorTool,
+    VertexPointEstimator       = BPHY21_VertexTools.VtxPointEstimator,
+    useMCPCuts                 = False)
+
+ToolSvc += BPHY21_JpsiFinder
+print(BPHY21_JpsiFinder)
+
+#--------------------------------------------------------------------
+## b/ setup the vertex reconstruction "call" tool(s). They are part of the derivation framework.
+##    These Augmentation tools add output vertex collection(s) into the StoreGate and add basic 
+##    decorations which do not depend on the vertex mass hypothesis (e.g. lxy, ptError, etc).
+##    There should be one tool per topology, i.e. Jpsi and Psi(2S) do not need two instance of the
+##    Reco tool is the JpsiFinder mass window is wide enough.
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY21_JpsiSelectAndWrite = DerivationFramework__Reco_Vertex(
+    name                   = "BPHY21_JpsiSelectAndWrite",
+    VertexSearchTool             = BPHY21_JpsiFinder,
+    OutputVtxContainerName = "BPHY21_JpsiCandidates",
+    PVContainerName        = "PrimaryVertices",
+    RefPVContainerName     = "SHOULDNOTBEUSED",
+    DoVertexType           = 1)
+
+ToolSvc += BPHY21_JpsiSelectAndWrite
+print(BPHY21_JpsiSelectAndWrite)
+
+#--------------------------------------------------------------------
+## c/ augment and select Jpsi->mumu candidates
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+BPHY21_Select_Jpsi2mumu = DerivationFramework__Select_onia2mumu(
+    name                  = "BPHY21_Select_Jpsi2mumu",
+    HypothesisName        = "Jpsi",
+    InputVtxContainerName = "BPHY21_JpsiCandidates",
+    VtxMassHypo           = 3096.900,
+    MassMin               = 2600.0,
+    MassMax               = 3600.0,
+    Chi2Max               = 200,
+    LxyMin                = 0.1,
+    DoVertexType          = 1)
+  
+ToolSvc += BPHY21_Select_Jpsi2mumu
+print(BPHY21_Select_Jpsi2mumu)
+
+
+#--------------------------------------------------------------------
+
+BPHY21_CascadeCollections = []
+
+
+#--------------------------------------------------------------------
+
+
+if not isSimulation: #Only Skim Data
+   from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+   BPHY21_SelectJpsiEvent = DerivationFramework__xAODStringSkimmingTool(
+     name = "BPHY21_SelectJpsiEvent",
+     expression = "count(BPHY21_JpsiCandidates.passed_Jpsi) > 0")
+   
+   ToolSvc += BPHY21_SelectJpsiEvent
+   print(BPHY21_SelectJpsiEvent)
+
+   #====================================================================
+   # Make event selection based on an OR of the input skimming tools
+   #====================================================================
+      
+   from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__FilterCombinationOR
+   BPHY21_SkimmingOR = CfgMgr.DerivationFramework__FilterCombinationOR(
+       "BPHY21_SkimmingOR",
+       FilterList = [ BPHY21_TriggerSkim, BPHY21_SelectJpsiEvent] )
+   ToolSvc += BPHY21_SkimmingOR
+   print(BPHY21_SkimmingOR)
+
+#--------------------------------------------------------------------
+##10/ track and vertex thinning. We want to remove all reconstructed secondary vertices
+##    which hasn't passed any of the selections defined by (Select_*) tools.
+##    We also want to keep only tracks which are associates with either muons or any of the
+##    vertices that passed the selection. Multiple thinning tools can perform the 
+##    selection. The final thinning decision is based OR of all the decisions (by default,
+##    although it can be changed by the JO).
+
+## a) thining out vertices that didn't pass any selection and idetifying tracks associated with 
+##    selected vertices. The "VertexContainerNames" is a list of the vertex containers, and "PassFlags"
+##    contains all pass flags for Select_* tools that must be satisfied. The vertex is kept is it 
+##    satisfy any of the listed selections.
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxTrk
+BPHY21_thinningTool_Tracks = DerivationFramework__Thin_vtxTrk(
+    name                       = "BPHY21_thinningTool_Tracks",
+    TrackParticleContainerName = "InDetTrackParticles",
+    VertexContainerNames       = ["BPHY21_JpsiCandidates"],
+    PassFlags                  = ["passed_Jpsi"])
+
+ToolSvc += BPHY21_thinningTool_Tracks
+print(BPHY21_thinningTool_Tracks)
+'''
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__BPhysPVThinningTool
+BPHY21_thinningTool_PV = DerivationFramework__BPhysPVThinningTool(
+    name                 = "BPHY21_thinningTool_PV",
+    CandidateCollections = ["BPHY21_JpsiCandidates"],
+    KeepPVTracks         = True)
+
+ToolSvc += BPHY21_thinningTool_PV
+print      BPHY21_thinningTool_PV
+'''
+## b) thinning out tracks that are not attached to muons. The final thinning decision is based on the OR operation
+##    between decision from this and the previous tools.
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__MuonTrackParticleThinning
+BPHY21_MuonTPThinningTool = DerivationFramework__MuonTrackParticleThinning(
+    name                   = "BPHY21_MuonTPThinningTool",
+    MuonKey                = "Muons",
+    InDetTrackParticlesKey = "InDetTrackParticles")
+
+ToolSvc += BPHY21_MuonTPThinningTool
+print(BPHY21_MuonTPThinningTool)
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS  
+#====================================================================
+
+BPHY21_thiningCollection = [] 
+
+print(BPHY21_thiningCollection)
+
+# The name of the kernel (BPHY21_Kernel in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+DerivationFrameworkJob += CfgMgr.DerivationFramework__DerivationKernel(
+    "BPHY21_Kernel",
+    AugmentationTools = [BPHY21_JpsiSelectAndWrite, BPHY21_Select_Jpsi2mumu,
+                        
+                         BPHY21_AugOriginalCounts],
+    #Only skim if not MC
+    SkimmingTools     = [BPHY21_SkimmingOR] if not isSimulation else [],
+    ThinningTools     = BPHY21_thiningCollection
+    )
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+BPHY21_streamName   = derivationFlags.WriteDAOD_BPHY21Stream.StreamName
+BPHY21_fileName     = buildFileName( derivationFlags.WriteDAOD_BPHY21Stream )
+BPHY21_Stream  = MSMgr.NewPoolRootStream( BPHY21_streamName, BPHY21_fileName )
+BPHY21_Stream.AcceptAlgs(["BPHY21_Kernel"])
+
+# Special lines for thinning
+# Thinning service name must match the one passed to the thinning tools
+from AthenaServices.Configurables import ThinningSvc, createThinningSvc
+BPHY21_augStream = MSMgr.GetStream( BPHY21_streamName )
+BPHY21_evtStream = BPHY21_augStream.GetEventStream()
+
+BPHY21_ThinningSvc = createThinningSvc( svcName="BPHY21_ThinningSvc", outStreams=[BPHY21_evtStream] )
+svcMgr += BPHY21_ThinningSvc
+
+#====================================================================
+# Slimming 
+#====================================================================
+
+# Added by ASC
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY21_SlimmingHelper = SlimmingHelper("BPHY21_SlimmingHelper")
+BPHY21_AllVariables  = []
+BPHY21_StaticContent = []
+
+# Needed for trigger objects
+BPHY21_SlimmingHelper.IncludeMuonTriggerContent  = TRUE
+BPHY21_SlimmingHelper.IncludeBPhysTriggerContent = TRUE
+
+## primary vertices
+BPHY21_AllVariables  += ["PrimaryVertices"]
+BPHY21_StaticContent += ["xAOD::VertexContainer#BPHY21_RefittedPrimaryVertices"]
+BPHY21_StaticContent += ["xAOD::VertexAuxContainer#BPHY21_RefittedPrimaryVerticesAux."]
+
+## ID track particles
+BPHY21_AllVariables += ["InDetTrackParticles"]
+
+## combined / extrapolated muon track particles 
+## (note: for tagged muons there is no extra TrackParticle collection since the ID tracks
+##        are store in InDetTrackParticles collection)
+BPHY21_AllVariables += ["CombinedMuonTrackParticles"]
+BPHY21_AllVariables += ["ExtrapolatedMuonTrackParticles"]
+
+## muon container
+BPHY21_AllVariables += ["Muons"] 
+
+
+## Jpsi candidates 
+BPHY21_StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY21_JpsiSelectAndWrite.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+BPHY21_StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY21_JpsiSelectAndWrite.OutputVtxContainerName]
+
+
+# Tagging information (in addition to that already requested by usual algorithms)
+#AllVariables += ["GSFTrackParticles", "MuonSpectrometerTrackParticles" ] 
+
+# Added by ASC
+# Truth information for MC only
+if isSimulation:
+    BPHY21_AllVariables += ["TruthEvents","TruthParticles","TruthVertices","MuonTruthParticles"]
+
+
+BPHY21_AllVariables = list(set(BPHY21_AllVariables)) # remove duplicates
+
+BPHY21_SlimmingHelper.AllVariables = BPHY21_AllVariables
+BPHY21_SlimmingHelper.StaticContent = BPHY21_StaticContent
+BPHY21_SlimmingHelper.SmartCollections = []
+
+BPHY21_SlimmingHelper.AppendContentToStream(BPHY21_Stream)
+
+#====================================================================
+# END OF BPHY21.py
+#====================================================================
\ No newline at end of file
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY22.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY22.py
new file mode 100644
index 000000000000..791a4f5b028b
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY22.py
@@ -0,0 +1,22 @@
+#====================================================================
+# BPHY22.py
+# This an example job options script showing how to set up a
+# derivation of the data using the derivation framework.
+# It requires the reductionConf flag BPHY12 in Reco_tf.py
+#====================================================================
+
+# Set up common services and job object.
+# This should appear in ALL derivation job options
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+# This is a dummy file thus just printing something
+
+print("")
+print("BPHY22 dummy file ... doing nothing.")
+print("")
+print("Please make sure that all local variables in this python")
+print("script are prefixed by BPHY22_ in order to avoid collisions")
+print("in case this derivation format is run in a train with others.")
+print("Please ensure that it is python3 compatible e.g. by using")
+print("print() instead of just print withouth parentheses.")
+print("")
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY3.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY3.py
new file mode 100644
index 000000000000..20f698482801
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY3.py
@@ -0,0 +1,284 @@
+#====================================================================
+# BPHY3.py
+# This an example job options script showing how to set up a 
+# derivation of the data using the derivation framework.  
+# It requires the reductionConf flag BPHY3 in Reco_tf.py   
+#====================================================================
+
+# Set up common services and job object. 
+# This should appear in ALL derivation job options
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+print(isSimulation)
+
+#====================================================================
+# AUGMENTATION TOOLS 
+#====================================================================
+## 1/ setup vertexing tools and services
+#include( "JpsiUpsilonTools/configureServices.py" )
+
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY3_VertexTools = BPHYVertexTools("BPHY3")
+
+#--------------------------------------------------------------------
+## 2/ Setup the vertex fitter tools (e.g. JpsiFinder, JpsiPlus1Track, etc).
+##    These are general tools independent of DerivationFramework that do the 
+##    actual vertex fitting and some pre-selection.
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder
+BPHY3JpsiFinder = Analysis__JpsiFinder(
+  name                        = "BPHY3JpsiFinder",
+  OutputLevel                 = INFO,
+  muAndMu                     = False,
+  muAndTrack                  = False,
+  TrackAndTrack               = True,
+  assumeDiMuons               = False,    # If true, will assume dimu hypothesis and use PDG value for mu mass
+  invMassUpper                = 10000.0,
+  invMassLower                = 0.0,
+  Chi2Cut                     = 100.,
+  oppChargesOnly	            = True,
+  atLeastOneComb              = False,
+  useCombinedMeasurement      = False, # Only takes effect if combOnly=True	
+  muonCollectionKey           = "Muons",
+  TrackParticleCollection     = "InDetTrackParticles",
+  V0VertexFitterTool          = BPHY3_VertexTools.TrkV0Fitter,             # V0 vertex fitter
+  useV0Fitter                 = False,                   # if False a TrkVertexFitterTool will be used
+  TrkVertexFitterTool         = BPHY3_VertexTools.TrkVKalVrtFitter,        # VKalVrt vertex fitter
+  TrackSelectorTool           = BPHY3_VertexTools.InDetTrackSelectorTool,
+  VertexPointEstimator        = BPHY3_VertexTools.VtxPointEstimator,
+  useMCPCuts                  = False,
+  track1Mass                  = 139.57, # Not very important, only used to calculate inv. mass cut, leave it loose here
+  track2Mass                  = 139.57)
+  
+ToolSvc += BPHY3JpsiFinder
+print(BPHY3JpsiFinder)
+
+#--------------------------------------------------------------------
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY3_Reco_diTrk = DerivationFramework__Reco_Vertex(
+  name                   = "BPHY3_Reco_diTrk",
+  VertexSearchTool             = BPHY3JpsiFinder,
+  OutputVtxContainerName = "BPHY3VertexCandidates",
+  PVContainerName        = "PrimaryVertices",
+  RefPVContainerName     = "BPHY3RefittedPrimaryVertices")
+  
+ToolSvc += BPHY3_Reco_diTrk
+print(BPHY3_Reco_diTrk)
+#--------------------------------------------------------------------
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+
+#--------------------------------------------------------------------
+## a/ augment and select X->pi+pi- candidates
+BPHY3_Select_PiPi = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY3_Select_PiPi",
+  HypothesisName        = "PiPi",
+  InputVtxContainerName = "BPHY3VertexCandidates",
+  TrkMasses             = [139.57,139.57],
+  VtxMassHypo           = 497.614,
+  MassMin               = 300.0,
+  MassMax               = 700.0,
+  Chi2Max               = 20)
+  
+ToolSvc += BPHY3_Select_PiPi
+print(BPHY3_Select_PiPi)
+#--------------------------------------------------------------------
+
+#--------------------------------------------------------------------
+## a/ augment and select X->piK candidates
+BPHY3_Select_PiK = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY3_Select_PiK",
+  HypothesisName        = "PiK",
+  InputVtxContainerName = "BPHY3VertexCandidates",
+  TrkMasses             = [139.57,493.677],
+  VtxMassHypo           = 892.,
+  MassMin               = 0.0,
+  MassMax               = 3500.0,
+  Chi2Max               = 10)
+  
+ToolSvc += BPHY3_Select_PiK
+print(BPHY3_Select_PiK)
+#--------------------------------------------------------------------
+
+#--------------------------------------------------------------------
+## a/ augment and select X->KPi candidates
+BPHY3_Select_KPi = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY3_Select_KPi",
+  HypothesisName        = "KPi",
+  InputVtxContainerName = "BPHY3VertexCandidates",
+  TrkMasses             = [493.677,139.57],
+  VtxMassHypo           = 892.,
+  MassMin               = 0.0,
+  MassMax               = 3500.0,
+  Chi2Max               = 10)
+  
+ToolSvc += BPHY3_Select_KPi
+print(BPHY3_Select_KPi)
+#--------------------------------------------------------------------
+
+
+#--------------------------------------------------------------------
+## a/ augment and select X->K+K- candidates
+BPHY3_Select_KK = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY3_Select_KK",
+  HypothesisName        = "KK",
+  InputVtxContainerName = "BPHY3VertexCandidates",
+  TrkMasses             = [493.677,493.677],
+  VtxMassHypo           = 1019.461,
+  MassMin               = 0.0,
+  MassMax               = 1100.0,
+  Chi2Max               = 20)
+  
+ToolSvc += BPHY3_Select_KK
+print(BPHY3_Select_KK)
+#--------------------------------------------------------------------
+
+#--------------------------------------------------------------------
+## a/ augment and select X->ppbar candidates
+BPHY3_Select_PP = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY3_Select_PP",
+  HypothesisName        = "PP",
+  InputVtxContainerName = "BPHY3VertexCandidates",
+  TrkMasses             = [938.272,938.272],
+  VtxMassHypo           = 3096.916,
+  MassMin               = 2800.0,
+  MassMax               = 3600.0,
+  Chi2Max               = 1)
+  
+ToolSvc += BPHY3_Select_PP
+print(BPHY3_Select_PP)
+#--------------------------------------------------------------------
+
+
+#--------------------------------------------------------------------
+## 5/ select the event. We only want to keep events that contain certain vertices which passed certain selection.
+##    This is specified by the "SelectionExpression" property, which contains the expression in the following format:
+##
+##       "ContainerName.passed_HypoName > count"
+##
+##    where "ContainerName" is output container form some Reco_* tool, "HypoName" is the hypothesis name setup in some "Select_*"
+##    tool and "count" is the number of candidates passing the selection you want to keep. 
+
+expression = "count(BPHY3VertexCandidates.passed_PiPi) > 0 || count(BPHY3VertexCandidates.passed_KPi) > 0 || count(BPHY3VertexCandidates.passed_PiK) > 0 || count(BPHY3VertexCandidates.passed_KK) > 0 || count(BPHY3VertexCandidates.passed_PP) > 0"
+
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+BPHY3_SelectEvent = DerivationFramework__xAODStringSkimmingTool(name = "BPHY3_SelectEvent",
+                                                                expression = expression)
+ToolSvc += BPHY3_SelectEvent
+print(BPHY3_SelectEvent)
+
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+streamName = derivationFlags.WriteDAOD_BPHY3Stream.StreamName
+fileName   = buildFileName( derivationFlags.WriteDAOD_BPHY3Stream )
+BPHY3Stream = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY3Stream.AcceptAlgs(["BPHY3Kernel"])
+# Special lines for thinning
+# Thinning service name must match the one passed to the thinning tools
+augStream = MSMgr.GetStream( streamName )
+evtStream = augStream.GetEventStream()
+
+
+
+
+#--------------------------------------------------------------------
+## 6/ track and vertex thinning. We want to remove all reconstructed secondary vertices
+##    which hasn't passed any of the selections defined by (Select_*) tools.
+##    We also want to keep only tracks which are associates with either muons or any of the
+##    vertices that passed the selection. Multiple thinning tools can perform the 
+##    selection. The final thinning decision is based OR of all the decisions (by default,
+##    although it can be changed by the JO).
+
+## a) thining out vertices that didn't pass any selection and idetifying tracks associated with 
+##    selected vertices. The "VertexContainerNames" is a list of the vertex containers, and "PassFlags"
+##    contains all pass flags for Select_* tools that must be satisfied. The vertex is kept is it 
+##    satisfy any of the listed selections.
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxTrk
+BPHY3Thin_vtxTrk = DerivationFramework__Thin_vtxTrk(
+  name                       = "BPHY3Thin_vtxTrk",
+  TrackParticleContainerName = "InDetTrackParticles",
+  VertexContainerNames       = ["BPHY3VertexCandidates"],
+  StreamName = streamName,
+  PassFlags                  = ["passed_PiPi","passed_KPi","passed_PiK","passed_KK","passed_PP"])
+
+ToolSvc += BPHY3Thin_vtxTrk
+
+
+
+# Added by ASC
+# Only save truth informtion directly associated with Onia
+#from DerivationFrameworkMCTruth.DerivationFrameworkMCTruthConf import DerivationFramework__GenericTruthThinning
+#BPHY1TruthThinTool = DerivationFramework__GenericTruthThinning(name                    = "BPHY1TruthThinTool",
+#                                                        ParticleSelectionString = "TruthParticles.pdgId == 443 || TruthParticles.pdgId == 100443",
+#                                                        PreserveDescendants     = True,
+#                                                        PreserveAncestors      = True)
+#ToolSvc += BPHY1TruthThinTool
+#print BPHY1TruthThinTool
+
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS  
+#====================================================================
+## 7/ IMPORTANT bit. Don't forget to pass the tools to the DerivationKernel! If you don't do that, they will not be 
+##    be executed!
+
+# Added by ASC
+BPHY3ThinningTools = [BPHY3Thin_vtxTrk]
+#if globalflags.DataSource()=='geant4':
+#    BPHY3ThinningTools.append(BPHY3TruthThinTool)
+
+# The name of the kernel (BPHY1Kernel in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+DerivationFrameworkJob += CfgMgr.DerivationFramework__DerivationKernel(
+  "BPHY3Kernel",
+   AugmentationTools = [BPHY3_Reco_diTrk,BPHY3_Select_PiPi,BPHY3_Select_KPi,BPHY3_Select_PiK,BPHY3_Select_KK,BPHY3_Select_PP],
+   SkimmingTools     = [BPHY3_SelectEvent],
+   ThinningTools     = BPHY3ThinningTools
+
+   )
+
+
+
+#====================================================================
+# Slimming 
+#====================================================================
+
+# Added by ASC
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY3SlimmingHelper = SlimmingHelper("BPHY3SlimmingHelper")
+AllVariables = []
+StaticContent = []
+
+# Needed for trigger objects
+#BPHY3SlimmingHelper.IncludeMuonTriggerContent = True
+#BPHY3SlimmingHelper.IncludeBPhysTriggerContent = True
+
+## primary vertices
+AllVariables += ["PrimaryVertices"]
+#StaticContent += ["xAOD::VertexContainer#BPHY3RefittedPrimaryVertices"]
+#StaticContent += ["xAOD::VertexAuxContainer#BPHY3RefittedPrimaryVerticesAux."]
+
+## ID track particles
+AllVariables += ["InDetTrackParticles"]
+
+## Vertex candidates 
+StaticContent += ["xAOD::VertexContainer#%s"        % BPHY3_Reco_diTrk.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY3_Reco_diTrk.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY3_Reco_diTrk.OutputVtxContainerName]
+
+# Added by ASC
+# Truth information for MC only
+#if isSimulation:
+#    AllVariables += ["TruthEvents","TruthParticles","TruthVertices","MuonTruthParticles"]
+
+BPHY3SlimmingHelper.AllVariables = AllVariables
+BPHY3SlimmingHelper.StaticContent = StaticContent
+BPHY3SlimmingHelper.AppendContentToStream(BPHY3Stream)
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY4.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY4.py
new file mode 100644
index 000000000000..9a973b28e4d5
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY4.py
@@ -0,0 +1,155 @@
+#====================================================================
+# BPHY4.py
+#====================================================================
+#ServiceMgr.MessageSvc.debugLimit=100000000
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+print(isSimulation)
+
+#====================================================================
+# AUGMENTATION TOOLS 
+#====================================================================
+## 1/ setup vertexing tools and services
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY4_VertexTools = BPHYVertexTools("BPHY4")
+
+#--------------------------------------------------------------------
+## 2/ Setup the vertex fitter tools 
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__FourMuonTool
+BPHY4FourMuonTool = DerivationFramework__FourMuonTool(
+  name                        = "BPHY4FourMuonTool",
+  OutputLevel                 = INFO,
+  ptCut                       = 2500.0,
+  etaCut                      = 2.5,
+  muonCollectionKey           = "Muons",
+  TrackParticleCollection     = "InDetTrackParticles",
+  V0VertexFitterTool          = BPHY4_VertexTools.TrkV0Fitter,             # V0 vertex fitter
+  useV0Fitter                 = False,                   # if False a TrkVertexFitterTool will be used
+  TrkVertexFitterTool         = BPHY4_VertexTools.TrkVKalVrtFitter,        # VKalVrt vertex fitter
+  TrackSelectorTool           = BPHY4_VertexTools.InDetTrackSelectorTool,
+  VertexPointEstimator        = BPHY4_VertexTools.VtxPointEstimator)
+  
+ToolSvc += BPHY4FourMuonTool
+print(BPHY4FourMuonTool)
+
+#--------------------------------------------------------------------
+## 3/ setup the vertex reconstruction "call" tool(s). 
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_4mu
+BPHY4_Reco_4mu = DerivationFramework__Reco_4mu(
+  name                    = "BPHY4_Reco_4mu",
+  OutputLevel             = INFO,
+  FourMuonTool            = BPHY4FourMuonTool,
+  PairContainerName       = "BPHY4Pairs",
+  QuadrupletContainerName = "BPHY4Quads",
+  PVContainerName         = "PrimaryVertices",
+  RefPVContainerName      = "BPHY4RefittedPrimaryVertices",
+  RefitPV                 = True,
+  MaxPVrefit              = 100000,
+  DoVertexType            = 7)
+  
+ToolSvc += BPHY4_Reco_4mu
+print(BPHY4_Reco_4mu)
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+streamName = derivationFlags.WriteDAOD_BPHY4Stream.StreamName
+fileName   = buildFileName( derivationFlags.WriteDAOD_BPHY4Stream )
+BPHY4Stream = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY4Stream.AcceptAlgs(["BPHY4Kernel"])
+# Special lines for thinning
+# Thinning service name must match the one passed to the thinning tools
+
+augStream = MSMgr.GetStream( streamName )
+
+
+#--------------------------------------------------------------------
+## thinning out tracks that are not attached to muons/electrons. The final thinning decision is based on the OR operation
+## between decision from this and the previous tools.
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__MuonTrackParticleThinning
+BPHY4MuonTPThinningTool = DerivationFramework__MuonTrackParticleThinning(name                    = "BPHY4MuonTPThinningTool",
+                                                                         MuonKey                 = "Muons",
+                                                                         StreamName = streamName,
+                                                                         InDetTrackParticlesKey  = "InDetTrackParticles")
+ToolSvc += BPHY4MuonTPThinningTool
+BPHY4ThinningTools = [BPHY4MuonTPThinningTool]
+
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__EgammaTrackParticleThinning
+BPHY4ElectronTPThinningTool = DerivationFramework__EgammaTrackParticleThinning(name                    = "BPHY4ElectronTPThinningTool",
+                                                                               SGKey                   = "Electrons",
+                                                                               GSFTrackParticlesKey    = "GSFTrackParticles",
+                                                                               StreamName = streamName,
+                                                                               InDetTrackParticlesKey  = "InDetTrackParticles")
+ToolSvc += BPHY4ElectronTPThinningTool
+BPHY4ThinningTools += [BPHY4ElectronTPThinningTool]
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS  
+#====================================================================
+
+# The name of the kernel (BPHY4Kernel in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+DerivationFrameworkJob += CfgMgr.DerivationFramework__DerivationKernel(
+  "BPHY4Kernel",
+   SkimmingTools     = [BPHY4_Reco_4mu],
+   ThinningTools     = BPHY4ThinningTools
+   )
+
+
+
+#====================================================================
+# Slimming 
+#====================================================================
+
+# Added by ASC
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY4SlimmingHelper = SlimmingHelper("BPHY4SlimmingHelper")
+BPHY4AllVariables = []
+BPHY4SmartVariables = []
+BPHY4StaticContent = []
+
+# Needed for trigger objects
+BPHY4SlimmingHelper.IncludeMuonTriggerContent = True
+BPHY4SlimmingHelper.IncludeBPhysTriggerContent = True
+
+## primary vertices
+BPHY4AllVariables += ["PrimaryVertices"]
+BPHY4StaticContent += ["xAOD::VertexContainer#BPHY4RefittedPrimaryVertices"]
+BPHY4StaticContent += ["xAOD::VertexAuxContainer#BPHY4RefittedPrimaryVerticesAux."]
+
+## ID track particles
+BPHY4AllVariables += ["InDetTrackParticles"]
+BPHY4SmartVariables += ["InDetTrackParticles"]
+
+## combined / extrapolated muon track particles 
+## (note: for tagged muons there is no extra TrackParticle collection since the ID tracks
+##        are store in InDetTrackParticles collection)
+BPHY4AllVariables += ["CombinedMuonTrackParticles"]
+BPHY4AllVariables += ["ExtrapolatedMuonTrackParticles"]
+
+## muon container
+BPHY4AllVariables += ["Muons"]
+BPHY4SmartVariables += ["Muons"]
+
+## Electron container
+BPHY4SmartVariables += ["Electrons"] 
+
+## Pair/quad candidates 
+BPHY4StaticContent += ["xAOD::VertexContainer#%s"        % BPHY4_Reco_4mu.PairContainerName]
+BPHY4StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY4_Reco_4mu.PairContainerName]
+BPHY4StaticContent += ["xAOD::VertexContainer#%s"        % BPHY4_Reco_4mu.QuadrupletContainerName]
+BPHY4StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY4_Reco_4mu.QuadrupletContainerName]
+
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+BPHY4StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY4_Reco_4mu.PairContainerName]
+BPHY4StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY4_Reco_4mu.QuadrupletContainerName]
+
+BPHY4SlimmingHelper.AllVariables = BPHY4AllVariables
+BPHY4SlimmingHelper.StaticContent = BPHY4StaticContent
+BPHY4SlimmingHelper.SmartCollections = BPHY4SmartVariables
+BPHY4SlimmingHelper.AppendContentToStream(BPHY4Stream)
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY5.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY5.py
new file mode 100644
index 000000000000..0b041d9fc3e3
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY5.py
@@ -0,0 +1,558 @@
+#====================================================================
+# BPHY5.py
+# Bs>J/psiKK 
+# It requires the reductionConf flag BPHY5 in Reco_tf.py   
+#====================================================================
+
+# Set up common services and job object. 
+# This should appear in ALL derivation job options
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+print( isSimulation )
+
+
+#====================================================================
+# AUGMENTATION TOOLS 
+#====================================================================
+## 1/ setup vertexing tools and services
+#include( "JpsiUpsilonTools/configureServices.py" )
+
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY5_VertexTools = BPHYVertexTools("BPHY5")
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__AugOriginalCounts
+BPHY5_AugOriginalCounts = DerivationFramework__AugOriginalCounts(
+   name = "BPHY5_AugOriginalCounts",
+   VertexContainer = "PrimaryVertices",
+   TrackContainer = "InDetTrackParticles" )
+ToolSvc += BPHY5_AugOriginalCounts
+
+
+#--------------------------------------------------------------------
+## 2/ setup JpsiFinder tool
+##    These are general tools independent of DerivationFramework that do the 
+##    actual vertex fitting and some pre-selection.
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder
+BPHY5JpsiFinder = Analysis__JpsiFinder(name                         = "BPHY5JpsiFinder",
+                                        OutputLevel                 = INFO,
+                                        muAndMu                     = True,
+                                        muAndTrack                  = False,
+                                        TrackAndTrack               = False,
+                                        assumeDiMuons               = True, 
+                                        invMassUpper                = 3600.0,
+                                        invMassLower                = 2600.0,
+                                        Chi2Cut                     = 30.,
+                                        oppChargesOnly	            = True,
+                                        combOnly		            = True,
+                                        atLeastOneComb              = False,
+                                        useCombinedMeasurement      = False, # Only takes effect if combOnly=True	
+                                        muonCollectionKey           = "Muons",
+                                        TrackParticleCollection     = "InDetTrackParticles",
+                                        V0VertexFitterTool          = BPHY5_VertexTools.TrkV0Fitter,             # V0 vertex fitter
+                                        useV0Fitter                 = False,                   # if False a TrkVertexFitterTool will be used
+                                        TrkVertexFitterTool         = BPHY5_VertexTools.TrkVKalVrtFitter,        # VKalVrt vertex fitter
+                                        TrackSelectorTool           = BPHY5_VertexTools.InDetTrackSelectorTool,
+                                        VertexPointEstimator        = BPHY5_VertexTools.VtxPointEstimator,
+                                        useMCPCuts                  = False)
+ToolSvc += BPHY5JpsiFinder
+print      (BPHY5JpsiFinder)
+
+#--------------------------------------------------------------------
+## 3/ setup the vertex reconstruction "call" tool(s). They are part of the derivation framework.
+##    These Augmentation tools add output vertex collection(s) into the StoreGate and add basic 
+##    decorations which do not depend on the vertex mass hypothesis (e.g. lxy, ptError, etc).
+##    There should be one tool per topology, i.e. Jpsi and Psi(2S) do not need two instance of the
+##    Reco tool is the JpsiFinder mass window is wide enough.
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY5JpsiSelectAndWrite = DerivationFramework__Reco_Vertex(name                 = "BPHY5JpsiSelectAndWrite",
+                                                       VertexSearchTool             = BPHY5JpsiFinder,
+                                                       OutputVtxContainerName = "BPHY5JpsiCandidates",
+                                                       PVContainerName        = "PrimaryVertices",
+                                                       RefPVContainerName     = "SHOULDNOTBEUSED",
+                                                       DoVertexType           =1)
+ToolSvc += BPHY5JpsiSelectAndWrite
+print (BPHY5JpsiSelectAndWrite)
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+
+## a/ augment and select Jpsi->mumu candidates
+BPHY5_Select_Jpsi2mumu = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY5_Select_Jpsi2mumu",
+  HypothesisName        = "Jpsi",
+  InputVtxContainerName = "BPHY5JpsiCandidates",
+  VtxMassHypo           = 3096.916,
+  MassMin               = 2000.0,
+  MassMax               = 3600.0,
+  Chi2Max               = 200, Do3d = False,
+  DoVertexType =1)
+
+  
+ToolSvc += BPHY5_Select_Jpsi2mumu
+print      (BPHY5_Select_Jpsi2mumu)
+
+
+
+
+## 4/ setup a new vertexing tool (necessary due to use of mass constraint) 
+from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+BsKKVertexFit = Trk__TrkVKalVrtFitter(
+                                         name                = "BsKKVertexFit",
+                                         Extrapolator        = BPHY5_VertexTools.InDetExtrapolator,
+                                         FirstMeasuredPoint  = False,
+                                         MakeExtendedVertex  = True)
+ToolSvc += BsKKVertexFit
+print      (BsKKVertexFit)
+
+from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+BplKplVertexFit = Trk__TrkVKalVrtFitter(
+                                         name                = "BplKplVertexFit",
+                                         Extrapolator        = BPHY5_VertexTools.InDetExtrapolator,
+                                         FirstMeasuredPoint  = False,
+                                         MakeExtendedVertex  = True)
+ToolSvc += BplKplVertexFit
+print      (BplKplVertexFit)
+
+#Add the B to pi pi Jpsi X final states
+from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+BpipiXVertexFit = Trk__TrkVKalVrtFitter(
+                                         name                = "BpipiXVertexFit",
+                                         Extrapolator        = BPHY5_VertexTools.InDetExtrapolator,
+                                         FirstMeasuredPoint  = False,
+                                         MakeExtendedVertex  = True)
+ToolSvc += BpipiXVertexFit
+print      (BpipiXVertexFit)
+
+## 5/ setup the Jpsi+2 track finder
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiPlus2Tracks
+BPHY5BsJpsiKK = Analysis__JpsiPlus2Tracks(name = "BPHY5BsJpsiKK",
+                                        OutputLevel = INFO,
+kaonkaonHypothesis			= True,
+pionpionHypothesis                      = False,
+kaonpionHypothesis                      = False,
+trkThresholdPt			        = 800.0,
+trkMaxEta				    = 3.0,
+BMassUpper				    = 5800.0,
+BMassLower				    = 5000.0,
+#DiTrackMassUpper = 1019.445 + 100.,
+#DiTrackMassLower = 1019.445 - 100.,
+Chi2Cut                     = 15.0,
+TrkQuadrupletMassUpper      = 6000.0,
+TrkQuadrupletMassLower      = 4800.0,
+JpsiContainerKey		    = "BPHY5JpsiCandidates",
+TrackParticleCollection     = "InDetTrackParticles",
+MuonsUsedInJpsi			    = "Muons",
+TrkVertexFitterTool		    = BsKKVertexFit,
+TrackSelectorTool		    = BPHY5_VertexTools.InDetTrackSelectorTool,
+UseMassConstraint		    = True)
+        
+ToolSvc += BPHY5BsJpsiKK
+print      (BPHY5BsJpsiKK)
+
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiPlus2Tracks
+BPHY5BdJpsiKst = Analysis__JpsiPlus2Tracks(
+    name                    = "BPHY5BdJpsiKst",
+    OutputLevel             = INFO,
+    kaonkaonHypothesis      = False,
+    pionpionHypothesis      = False,
+    kaonpionHypothesis      = True,
+    trkThresholdPt          = 800.0,
+    trkMaxEta               = 3.0,
+    BThresholdPt            = 5000.,
+    BMassLower              = 4300.0,
+    BMassUpper              = 6300.0,
+    JpsiContainerKey        = "BPHY5JpsiCandidates",
+    TrackParticleCollection = "InDetTrackParticles",
+    #MuonsUsedInJpsi      = "Muons", #Don't remove all muons, just those in J/psi candidate (see the following cut)
+    ExcludeCrossJpsiTracks  = False,   #setting this to False rejects the muons from J/psi candidate
+    TrkVertexFitterTool     = BsKKVertexFit,
+    TrackSelectorTool     = BPHY5_VertexTools.InDetTrackSelectorTool,
+    VertexPointEstimator        = BPHY5_VertexTools.VtxPointEstimator,
+    UseMassConstraint     = True,
+    Chi2Cut                 = 15.0,
+    TrkQuadrupletMassLower  = 3500.0,
+    TrkQuadrupletMassUpper  = 6800.0,
+    )
+
+ToolSvc += BPHY5BdJpsiKst
+print      (BPHY5BdJpsiKst)
+
+
+## 5a/ setup the Jpsi+1 track finder
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiPlus1Track
+BPHY5BplJpsiKpl = Analysis__JpsiPlus1Track(name = "BPHY5BplJpsiKpl",
+OutputLevel             = INFO,#DEBUG,
+pionHypothesis			= True,
+kaonHypothesis			= True,
+trkThresholdPt			= 750.0,
+trkMaxEta			= 3.0,
+BThresholdPt			= 4000.0,
+BMassUpper			= 7000.0,
+BMassLower			= 4500.0,
+Chi2Cut                         = 15.0,
+TrkTrippletMassUpper            = 8000,
+TrkTrippletMassLower            = 4000,
+JpsiContainerKey		= "BPHY5JpsiCandidates",
+TrackParticleCollection         = "InDetTrackParticles",
+MuonsUsedInJpsi			= "Muons",
+TrkVertexFitterTool		= BplKplVertexFit,
+TrackSelectorTool		= BPHY5_VertexTools.InDetTrackSelectorTool,
+UseMassConstraint		= True,
+ExcludeCrossJpsiTracks              = False,
+ExcludeJpsiMuonsOnly                = True)
+        
+ToolSvc += BPHY5BplJpsiKpl
+print      (BPHY5BplJpsiKpl)
+
+## 5b/ setup the Jpsi+pi+pi+X track finder
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiPlus2Tracks
+BPHY5BJpsipipiX = Analysis__JpsiPlus2Tracks(name = "BPHY5BJpsipipiX",
+                                        OutputLevel = INFO,
+kaonkaonHypothesis			= False,
+pionpionHypothesis                      = True,
+kaonpionHypothesis                      = False,
+trkThresholdPt			        = 800.0,
+trkMaxEta				    = 3.0,
+BMassUpper				    = 5800.0,
+BMassLower				    = 3400.0,
+#DiTrackMassUpper = 1019.445 + 100.,
+#DiTrackMassLower = 1019.445 - 100.,
+Chi2Cut                     = 15.0,
+TrkQuadrupletMassUpper      = 5800.0,
+TrkQuadrupletMassLower      = 3400.0,
+JpsiContainerKey		    = "BPHY5JpsiCandidates",
+TrackParticleCollection     = "InDetTrackParticles",
+MuonsUsedInJpsi			    = "Muons",
+TrkVertexFitterTool		    = BpipiXVertexFit,
+TrackSelectorTool		    = BPHY5_VertexTools.InDetTrackSelectorTool,
+UseMassConstraint		    = True,
+ExcludeCrossJpsiTracks              = False,
+ExcludeJpsiMuonsOnly                = True)
+
+ToolSvc += BPHY5BJpsipipiX
+print      (BPHY5BJpsipipiX)
+
+## 6/ setup the combined augmentation/skimming tool for the Bpm
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY5BsKKSelectAndWrite = DerivationFramework__Reco_Vertex(name                 = "BPHY5BsKKSelectAndWrite",
+                                                           VertexSearchTool       = BPHY5BsJpsiKK,
+                                                           OutputVtxContainerName   = "BPHY5BsJpsiKKCandidates",
+                                                           PVContainerName          = "PrimaryVertices",
+                                                           RefPVContainerName       = "BPHY5RefittedPrimaryVertices",
+                                                           RefitPV                  = True, Do3d = False,
+                                                           MaxPVrefit               = 10000, DoVertexType = 7)
+ToolSvc += BPHY5BsKKSelectAndWrite 
+print      (BPHY5BsKKSelectAndWrite)
+
+BPHY5BplKplSelectAndWrite = DerivationFramework__Reco_Vertex(name				     	= "BPHY5BplKplSelectAndWrite",
+															  VertexSearchTool	    =  BPHY5BplJpsiKpl,
+															  OutputVtxContainerName 	= "BPHY5BpmJpsiKpmCandidates",
+                                                              PVContainerName           = "PrimaryVertices",
+                                                              RefPVContainerName        = "BPHY5RefBplJpsiKplPrimaryVertices",                                                              
+                                                              RefitPV                   = True,
+                                                              MaxPVrefit                = 10000 )
+ToolSvc += BPHY5BplKplSelectAndWrite
+print      (BPHY5BplKplSelectAndWrite)
+
+BPHY5BpipiXSelectAndWrite = DerivationFramework__Reco_Vertex(name                 = "BPHY5BpipiXSelectAndWrite",
+                                                           VertexSearchTool       = BPHY5BJpsipipiX,
+                                                           OutputVtxContainerName   = "BPHY5BJpsipipiXCandidates",
+                                                           PVContainerName          = "PrimaryVertices",
+                                                           RefPVContainerName       = "BPHY5RefittedBPipiPrimaryVertices",
+                                                           RefitPV                  = True, Do3d = False,
+                                                           MaxPVrefit               = 10000, DoVertexType = 7)
+ToolSvc += BPHY5BpipiXSelectAndWrite
+print      (BPHY5BpipiXSelectAndWrite)
+
+BPHY5BdKstSelectAndWrite  = DerivationFramework__Reco_Vertex(
+    name                   = "BPHY5BdKstSelectAndWrite",
+    VertexSearchTool     = BPHY5BdJpsiKst,
+    OutputVtxContainerName = "BPHY5BdJpsiKstCandidates",
+    PVContainerName        = "PrimaryVertices",
+    RefPVContainerName     = "BPHY5RefittedKstPrimaryVertices",
+    RefitPV                = True,
+    MaxPVrefit             = 10000,
+    DoVertexType = 7)
+ToolSvc += BPHY5BdKstSelectAndWrite
+print (BPHY5BdKstSelectAndWrite)
+## b/ augment and select Bd->JpsiKst candidates
+#  set mass hypothesis (K pi)
+BPHY5_Select_Bd2JpsiKst = DerivationFramework__Select_onia2mumu(
+    name                       = "BPHY5_Select_Bd2JpsiKst",
+    HypothesisName             = "Bd",
+    InputVtxContainerName      = "BPHY5BdJpsiKstCandidates",
+    TrkMasses                  = [105.658, 105.658, 493.677, 139.570],
+    VtxMassHypo                = 5279.6,
+    MassMin                    = 100.0,      #no mass cuts here
+    MassMax                    = 100000.0,   #no mass cuts here
+    Chi2Max                    = 200)
+
+ToolSvc += BPHY5_Select_Bd2JpsiKst
+print      (BPHY5_Select_Bd2JpsiKst)
+
+## c/ augment and select Bdbar->JpsiKstbar candidates
+# set mass hypothesis (pi K)
+BPHY5_Select_Bd2JpsiKstbar = DerivationFramework__Select_onia2mumu(
+    name                       = "BPHY5_Select_Bd2JpsiKstbar",
+    HypothesisName             = "Bdbar",
+    InputVtxContainerName      = "BPHY5BdJpsiKstCandidates",
+    TrkMasses                  = [105.658, 105.658, 139.570, 493.677],
+    VtxMassHypo                = 5279.6,
+    MassMin                    = 100.0,      #no mass cuts here
+    MassMax                    = 100000.0,   #no mass cuts here
+    Chi2Max                    = 200)
+
+ToolSvc += BPHY5_Select_Bd2JpsiKstbar
+print      (BPHY5_Select_Bd2JpsiKstbar)
+
+
+## b/ augment and select Bs->JpsiKK candidates
+BPHY5_Select_Bs2JpsiKK = DerivationFramework__Select_onia2mumu(
+  name                       = "BPHY5_Select_Bs2JpsiKK",
+  HypothesisName             = "Bs",
+  InputVtxContainerName      = "BPHY5BsJpsiKKCandidates",
+  TrkMasses                  = [105.658, 105.658, 493.677, 493.677],
+  VtxMassHypo                = 5366.3,
+  MassMin                    = 5000.0,
+  MassMax                    = 5800.0, Do3d = False,
+  Chi2Max                    = 200)
+
+ToolSvc += BPHY5_Select_Bs2JpsiKK
+print      (BPHY5_Select_Bs2JpsiKK)
+
+BPHY5_Select_Bpl2JpsiKpl     = DerivationFramework__Select_onia2mumu(
+  name                       = "BPHY5_Select_Bpl2JpsiKpl",
+  HypothesisName             = "Bplus",
+  InputVtxContainerName      = "BPHY5BpmJpsiKpmCandidates",
+  TrkMasses                  = [105.658, 105.658, 493.677],
+  VtxMassHypo                = 5279.26,
+  MassMin                    = 5279.26 - 500, Do3d = False,
+  MassMax                    = 5279.26 + 500,
+  Chi2Max                    = 200 )
+
+ToolSvc += BPHY5_Select_Bpl2JpsiKpl
+print      (BPHY5_Select_Bpl2JpsiKpl)
+
+BPHY5_Select_Bpl2JpsiPi      = DerivationFramework__Select_onia2mumu(
+  name                       = "BPHY5_Select_Bpl2JpsiPi",
+  HypothesisName             = "Bc",
+  InputVtxContainerName      = "BPHY5BpmJpsiKpmCandidates",
+  TrkMasses                  = [105.658, 105.658, 139.570],
+  VtxMassHypo                = 6275.1, Do3d = False,
+  MassMin                    = 6275.1 - 500,
+  MassMax                    = 6275.1 + 500,
+  Chi2Max                    = 200 )
+
+ToolSvc += BPHY5_Select_Bpl2JpsiPi
+print      (BPHY5_Select_Bpl2JpsiPi)
+
+BPHY5_Select_B2JpsipipiX = DerivationFramework__Select_onia2mumu(
+  name                       = "BPHY5_Select_B2JpsipipiX",
+  HypothesisName             = "pipiJpsi",
+  InputVtxContainerName      = "BPHY5BJpsipipiXCandidates",
+  TrkMasses                  = [105.658, 105.658, 139.570, 139.570],
+  VtxMassHypo                = 4260,
+  MassMin                    = 3400.0,
+  MassMax                    = 5800.0, Do3d = False,
+  Chi2Max                    = 200)
+
+ToolSvc += BPHY5_Select_B2JpsipipiX
+print      (BPHY5_Select_B2JpsipipiX)
+
+#expression = "count(BPHY5BpmJpsiKpmCandidates.passed_Bplus) > 0"
+#from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+#BPHY5_SelectEvent = DerivationFramework__xAODStringSkimmingTool(name = "BPHY5_SelectEvent",
+#                                                                expression = expression)
+#ToolSvc += BPHY5_SelectEvent
+#print BPHY5_SelectEvent
+
+
+#from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__SelectEvent
+
+if not isSimulation: #Only Skim Data
+   from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+   BPHY5_SelectBsJpsiKKEvent = DerivationFramework__xAODStringSkimmingTool(
+     name = "BPHY5_SelectBsJpsiKKEvent",
+     expression = "count(BPHY5BsJpsiKKCandidates.passed_Bs > 0) > 0")
+                                                    
+   ToolSvc += BPHY5_SelectBsJpsiKKEvent
+   print (BPHY5_SelectBsJpsiKKEvent)
+
+   BPHY5_SelectBplJpsiKplEvent = DerivationFramework__xAODStringSkimmingTool(name = "BPHY5_SelectBplJpsiKplEvent",
+                                                                    expression = "count(BPHY5BpmJpsiKpmCandidates.passed_Bplus>0) > 0")
+   ToolSvc += BPHY5_SelectBplJpsiKplEvent
+   print      (BPHY5_SelectBplJpsiKplEvent)
+
+   BPHY5_SelectBplJpsiKplEventBc = DerivationFramework__xAODStringSkimmingTool(name = "BPHY5_SelectBplJpsiKplEventBc",
+                                                                    expression = "count(BPHY5BpmJpsiKpmCandidates.passed_Bc>0) > 0")
+   ToolSvc += BPHY5_SelectBplJpsiKplEventBc
+   print      (BPHY5_SelectBplJpsiKplEventBc)
+   
+   BPHY5_SelectBdKstarEventBd = DerivationFramework__xAODStringSkimmingTool(name = "BPHY5_SelectBdKstarEventBd",
+                                                                    expression = "count(BPHY5BdJpsiKstCandidates.passed_Bd>0) > 0")
+   ToolSvc += BPHY5_SelectBdKstarEventBd
+   print      (BPHY5_SelectBdKstarEventBd)
+
+   BPHY5_SelectBdKstarEventBdBar = DerivationFramework__xAODStringSkimmingTool(name = "BPHY5_SelectBdKstarEventBdbar",
+                                                                    expression = "count(BPHY5BdJpsiKstCandidates.passed_Bdbar>0) > 0")
+   ToolSvc += BPHY5_SelectBdKstarEventBdBar
+   print      (BPHY5_SelectBdKstarEventBdBar)
+   #====================================================================
+   # Make event selection based on an OR of the input skimming tools
+   #====================================================================
+   from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__FilterCombinationOR
+   BPHY5SkimmingOR = CfgMgr.DerivationFramework__FilterCombinationOR("BPHY5SkimmingOR",
+                                         FilterList = [BPHY5_SelectBsJpsiKKEvent, BPHY5_SelectBplJpsiKplEvent, BPHY5_SelectBplJpsiKplEventBc,
+                                         BPHY5_SelectBdKstarEventBd, BPHY5_SelectBdKstarEventBdBar])
+   ToolSvc += BPHY5SkimmingOR
+   print      (BPHY5SkimmingOR)
+
+
+## b) thinning out tracks that are not attached to muons. The final thinning decision is based on the OR operation
+##    between decision from this and the previous tools.
+
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS  
+#====================================================================
+
+thiningCollection = [] 
+print (thiningCollection)
+
+import DerivationFrameworkJetEtMiss.JetCommon
+bphy5Seq = CfgMgr.AthSequencer("BPHY5Sequence")
+DerivationFrameworkJob += bphy5Seq
+
+# The name of the kernel (BPHY5Kernel in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+bphy5Seq += CfgMgr.DerivationFramework__DerivationKernel("BPHY5Kernel",
+                                                                       AugmentationTools = [BPHY5JpsiSelectAndWrite,  BPHY5_Select_Jpsi2mumu,
+                                                                                            BPHY5BsKKSelectAndWrite,  BPHY5_Select_Bs2JpsiKK,
+                                                                                            BPHY5BplKplSelectAndWrite, BPHY5BpipiXSelectAndWrite, BPHY5_Select_Bpl2JpsiKpl, BPHY5_Select_Bpl2JpsiPi, BPHY5_Select_B2JpsipipiX,
+                                                                                            BPHY5BdKstSelectAndWrite, BPHY5_Select_Bd2JpsiKst, BPHY5_Select_Bd2JpsiKstbar,
+                                                                                            BPHY5_AugOriginalCounts],
+                                                                       #Only skim if not MC
+                                                                       SkimmingTools     = [BPHY5SkimmingOR] if not isSimulation else [],
+                                                                       ThinningTools     = thiningCollection
+                                                                       
+                                                                       )
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+streamName   = derivationFlags.WriteDAOD_BPHY5Stream.StreamName
+fileName     = buildFileName( derivationFlags.WriteDAOD_BPHY5Stream )
+BPHY5Stream  = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY5Stream.AcceptAlgs(["BPHY5Kernel"])
+
+# Special lines for thinning
+# Thinning service name must match the one passed to the thinning tools
+#from AthenaServices.Configurables import ThinningSvc, createThinningSvc
+augStream = MSMgr.GetStream( streamName )
+evtStream = augStream.GetEventStream()
+
+#BPHY5ThinningSvc = createThinningSvc( svcName="BPHY5ThinningSvc", outStreams=[evtStream] )
+#svcMgr += BPHY5ThinningSvc
+
+#====================================================================
+# Slimming 
+#====================================================================
+
+# Added by ASC
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY5SlimmingHelper = SlimmingHelper("BPHY5SlimmingHelper")
+AllVariables  = []
+StaticContent = []
+
+# Needed for trigger objects
+BPHY5SlimmingHelper.IncludeMuonTriggerContent  = TRUE
+BPHY5SlimmingHelper.IncludeBPhysTriggerContent = TRUE
+
+## primary vertices
+AllVariables  += ["PrimaryVertices"]
+StaticContent += ["xAOD::VertexContainer#BPHY5RefittedPrimaryVertices"]
+StaticContent += ["xAOD::VertexAuxContainer#BPHY5RefittedPrimaryVerticesAux."]
+StaticContent += ["xAOD::VertexContainer#BPHY5RefBplJpsiKplPrimaryVertices"]
+StaticContent += ["xAOD::VertexAuxContainer#BPHY5RefBplJpsiKplPrimaryVerticesAux."]
+StaticContent += ["xAOD::VertexContainer#BPHY5RefittedBPipiPrimaryVertices"]
+StaticContent += ["xAOD::VertexAuxContainer#BPHY5RefittedBPipiPrimaryVerticesAux."]
+StaticContent += ["xAOD::VertexContainer#BPHY5RefittedKstPrimaryVertices"]
+StaticContent += ["xAOD::VertexAuxContainer#BPHY5RefittedKstPrimaryVerticesAux."]
+
+## ID track particles
+AllVariables += ["InDetTrackParticles"]
+
+## combined / extrapolated muon track particles 
+## (note: for tagged muons there is no extra TrackParticle collection since the ID tracks
+##        are store in InDetTrackParticles collection)
+AllVariables += ["CombinedMuonTrackParticles"]
+AllVariables += ["ExtrapolatedMuonTrackParticles"]
+
+## muon container
+AllVariables += ["Muons"] 
+
+
+## Jpsi candidates 
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY5JpsiSelectAndWrite.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY5JpsiSelectAndWrite.OutputVtxContainerName]
+
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY5BsKKSelectAndWrite.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY5BsKKSelectAndWrite.OutputVtxContainerName]
+
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY5BplKplSelectAndWrite.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY5BplKplSelectAndWrite.OutputVtxContainerName]
+
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY5BpipiXSelectAndWrite.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY5BpipiXSelectAndWrite.OutputVtxContainerName]
+
+StaticContent += ["xAOD::VertexContainer#%s"        %                 BPHY5BdKstSelectAndWrite.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY5BdKstSelectAndWrite.OutputVtxContainerName]
+
+# Tagging information (in addition to that already requested by usual algorithms)
+#AllVariables += ["Electrons"] 
+AllVariables += ["GSFTrackParticles", "Electrons" , "Photons", "MuonSpectrometerTrackParticles" ]
+tagJetCollections = ['AntiKt4LCTopoJets', 'AntiKt4EMTopoJets', 'AntiKt4PV0TrackJets']
+
+AllVariables += [ "Kt4LCTopoOriginEventShape", "Kt4EMTopoOriginEventShape" ]
+SmartVar = ["Photons" ] #[ tagJetCollections ]
+
+
+
+
+for jet_collection in tagJetCollections:
+    AllVariables   += [jet_collection]
+    AllVariables   += ["BTagging_%s"       % (jet_collection[:-4]) ]
+    AllVariables   += ["BTagging_%sJFVtx"  % (jet_collection[:-4]) ]
+    AllVariables   += ["BTagging_%sSecVtx" % (jet_collection[:-4]) ]
+
+#addStandardJets("AntiKt", 0.4, "PV0Track", 2000, mods="track_ungroomed", algseq=bphy5Seq, outputGroup="BPHY5")
+
+
+# Added by ASC
+# Truth information for MC only
+if isSimulation:
+    AllVariables += ["TruthEvents","TruthParticles","TruthVertices","MuonTruthParticles", "egammaTruthParticles" ]
+    AllVariables += ["AntiKt4TruthJets", "AntiKt4TruthWZJets" ]
+#    addStandardJets("AntiKt", 0.4, "Truth", 5000, mods="truth_ungroomed", algseq=bphy5Seq, outputGroup="BPHY5")
+#    addStandardJets("AntiKt", 0.4, "TruthWZ", 5000, mods="truth_ungroomed", algseq=bphy5Seq, outputGroup="BPHY5")
+    tagJetCollections += [ "AntiKt4TruthJets", "AntiKt4TruthWZJets"  ]
+
+from DerivationFrameworkJetEtMiss.ExtendedJetCommon import replaceAODReducedJets
+replaceAODReducedJets(tagJetCollections, bphy5Seq  ,  "BPHY5" )
+
+
+AllVariables = list(set(AllVariables)) # remove duplicates
+
+BPHY5SlimmingHelper.AllVariables = AllVariables
+BPHY5SlimmingHelper.StaticContent = StaticContent
+BPHY5SlimmingHelper.SmartCollections = SmartVar
+
+BPHY5SlimmingHelper.AppendContentToStream(BPHY5Stream)
+
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY6.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY6.py
new file mode 100644
index 000000000000..23b5bb5095df
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY6.py
@@ -0,0 +1,344 @@
+#====================================================================
+# BPHY6.py
+# This an example job options script showing how to set up a 
+# derivation of the data using the derivation framework.  
+# It requires the reductionConf flag BPHY6 in Reco_tf.py   
+#====================================================================
+
+# Set up common services and job object. 
+# This should appear in ALL derivation job options
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+print(isSimulation)
+#====================================================================
+# AUGMENTATION TOOLS 
+#====================================================================
+## 1/ setup vertexing tools and services
+#include( "JpsiUpsilonTools/configureServices.py" )
+
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY6_VertexTools = BPHYVertexTools("BPHY6")
+
+
+# General Variables
+dimuon_chi2_max = 50.
+dimuon_mass_min = 100.
+dimuon_mass_max = 150e3
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__MuonExtrapolationTool
+BPHY6_Extrap_Tool = DerivationFramework__MuonExtrapolationTool(
+  name = "BPHY6_ExtrapolationTool",
+  OutputLevel = INFO )
+ToolSvc += BPHY6_Extrap_Tool
+ 
+
+
+#--------------------------------------------------------------------
+## 2/ Setup the vertex fitter tools (e.g. JpsiFinder, JpsiPlus1Track, etc).
+##    These are general tools independent of DerivationFramework that do the 
+##    actual vertex fitting and some pre-selection.
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder
+BPHY6JpsiFinder = Analysis__JpsiFinder(
+  name                        = "BPHY6JpsiFinder",
+  OutputLevel                 = INFO,
+  muAndMu                     = True,
+  muAndTrack                  = False,
+  TrackAndTrack               = False,
+  assumeDiMuons               = True,    # If true, will assume dimu hypothesis and use PDG value for mu mass
+  invMassUpper                = dimuon_mass_max,
+  invMassLower                = dimuon_mass_min,
+  Chi2Cut                     = dimuon_chi2_max,
+  oppChargesOnly	          = True,
+  atLeastOneComb              = True,
+  useCombinedMeasurement      = False, # Only takes effect if combOnly=True	
+  muonCollectionKey           = "Muons",
+  TrackParticleCollection     = "InDetTrackParticles",
+  V0VertexFitterTool          = BPHY6_VertexTools.TrkV0Fitter,             # V0 vertex fitter
+  useV0Fitter                 = False,                   # if False a TrkVertexFitterTool will be used
+  TrkVertexFitterTool         = BPHY6_VertexTools.TrkVKalVrtFitter,        # VKalVrt vertex fitter
+  TrackSelectorTool           = BPHY6_VertexTools.InDetTrackSelectorTool,
+  VertexPointEstimator        = BPHY6_VertexTools.VtxPointEstimator,
+  useMCPCuts                  = False )
+  
+ToolSvc += BPHY6JpsiFinder
+print(BPHY6JpsiFinder)
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+
+
+
+BPHY6_Reco_mumu = DerivationFramework__Reco_Vertex(
+  name                   = "BPHY6_Reco_mumu",
+  VertexSearchTool             = BPHY6JpsiFinder,
+  OutputVtxContainerName = "BPHY6OniaCandidates",
+  PVContainerName        = "PrimaryVertices",
+  RefPVContainerName     = "BPHY6RefittedPrimaryVertices")
+  
+ToolSvc += BPHY6_Reco_mumu
+print(BPHY6_Reco_mumu)
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+
+## a/ augment and select Jpsi->mumu candidates
+BPHY6_Select_Jpsi2mumu = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY6_Select_Jpsi2mumu",
+  HypothesisName        = "Jpsi",
+  InputVtxContainerName = "BPHY6OniaCandidates",
+  VtxMassHypo           = 3096.916,
+  MassMin               = 2700.0,
+  MassMax               = 3500.0,
+  Chi2Max               = 20)
+  
+ToolSvc += BPHY6_Select_Jpsi2mumu
+print(BPHY6_Select_Jpsi2mumu)
+
+
+## b/ augment and select Psi(2S)->mumu candidates
+BPHY6_Select_Psi2mumu = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY6_Select_Psi2mumu",
+  HypothesisName        = "Psi",
+  InputVtxContainerName = "BPHY6OniaCandidates",
+  VtxMassHypo           = 3686.09,
+  MassMin               = 3200.0,
+  MassMax               = 4200.0,
+  Chi2Max               = 20)
+  
+ToolSvc += BPHY6_Select_Psi2mumu
+print(BPHY6_Select_Psi2mumu)
+
+# Added by ASC
+## c/ augment and select Upsilon(nS)->mumu candidates
+BPHY6_Select_Upsi2mumu = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY6_Select_Upsi2mumu",
+  HypothesisName        = "Upsi",
+  InputVtxContainerName = "BPHY6OniaCandidates",
+  VtxMassHypo           = 9460.30,
+  MassMin               = 8000.0,
+  MassMax               = 12000.0,
+  Chi2Max               = 20)
+  
+ToolSvc += BPHY6_Select_Upsi2mumu
+print(BPHY6_Select_Upsi2mumu)
+
+BPHY6_Select_Bmumu2mumu = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY6_Select_Bmumu2mumu",
+  HypothesisName        = "Bmumu",
+  InputVtxContainerName = "BPHY6OniaCandidates",
+  VtxMassHypo           = 5366.77,
+  MassMin               = 4200.0,
+  MassMax               = 8000.0,
+  Chi2Max               = 20)
+  
+ToolSvc += BPHY6_Select_Bmumu2mumu
+print(BPHY6_Select_Bmumu2mumu)
+
+BPHY6_Select_Zmumu2mumu = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY6_Select_Zmumu2mumu",
+  HypothesisName        = "Zmumu",
+  InputVtxContainerName = "BPHY6OniaCandidates",
+  VtxMassHypo           = 91187.6,
+  MassMin               = 60000.0,
+  MassMax               = 120000.0,
+  Chi2Max               = 20)
+  
+ToolSvc += BPHY6_Select_Zmumu2mumu
+print(BPHY6_Select_Zmumu2mumu)
+
+BPHY6_Select_Onia2mumu = DerivationFramework__Select_onia2mumu(
+  name                  = "BPHY6_Select_Onia2mumu",
+  HypothesisName        = "Onia",
+  InputVtxContainerName = "BPHY6OniaCandidates",
+  VtxMassHypo           = 3096.916,
+  MassMin               = dimuon_mass_min,
+  MassMax               = dimuon_mass_max,
+  Chi2Max               = 20)
+  
+ToolSvc += BPHY6_Select_Onia2mumu
+print(BPHY6_Select_Onia2mumu)
+
+
+
+trigger_list = [r'HLT_\d?mu\d+']
+
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__TriggerSkimmingTool
+BPHY6TrigSkimmingTool = DerivationFramework__TriggerSkimmingTool(   name                    = "BPHY6TrigSkimmingTool",
+                                                                TriggerListOR               = trigger_list )
+ToolSvc += BPHY6TrigSkimmingTool
+
+
+
+expression = "count(BPHY6OniaCandidates.passed_Onia) > 0 "
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+BPHY6_SelectEvent = DerivationFramework__xAODStringSkimmingTool(name = "BPHY6_SelectEvent",
+                                                                expression = expression)
+ToolSvc += BPHY6_SelectEvent
+print(BPHY6_SelectEvent)
+
+#--------------------------------------------------------------------
+## 6/ track and vertex thinning. We want to remove all reconstructed secondary vertices
+##    which hasn't passed any of the selections defined by (Select_*) tools.
+##    We also want to keep only tracks which are associates with either muons or any of the
+##    vertices that passed the selection. Multiple thinning tools can perform the 
+##    selection. The final thinning decision is based OR of all the decisions (by default,
+##    although it can be changed by the JO).
+
+## a) thining out vertices that didn't pass any selection and idetifying tracks associated with 
+##    selected vertices. The "VertexContainerNames" is a list of the vertex containers, and "PassFlags"
+##    contains all pass flags for Select_* tools that must be satisfied. The vertex is kept is it 
+##    satisfy any of the listed selections.
+
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+streamName = derivationFlags.WriteDAOD_BPHY6Stream.StreamName
+fileName   = buildFileName( derivationFlags.WriteDAOD_BPHY6Stream )
+BPHY6Stream = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY6Stream.AcceptAlgs(["BPHY6Kernel"])
+# Special lines for thinning
+# Thinning service name must match the one passed to the thinning tools
+augStream = MSMgr.GetStream( streamName )
+evtStream = augStream.GetEventStream()
+
+
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxTrk
+BPHY6Thin_vtxTrk = DerivationFramework__Thin_vtxTrk(
+  name                       = "BPHY6Thin_vtxTrk",
+  TrackParticleContainerName = "InDetTrackParticles",
+  StreamName = streamName,
+  VertexContainerNames       = ["BPHY6OniaCandidates"],
+  PassFlags                  = ["passed_Onia"], )
+
+ToolSvc += BPHY6Thin_vtxTrk
+
+
+## b) thinning out tracks that are not attached to muons. The final thinning decision is based on the OR operation
+##    between decision from this and the previous tools.
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__MuonTrackParticleThinning
+BPHY6MuonTPThinningTool = DerivationFramework__MuonTrackParticleThinning(name                    = "BPHY6MuonTPThinningTool",
+                                                                         MuonKey                 = "Muons",
+                                                                         StreamName = streamName,
+                                                                         InDetTrackParticlesKey  = "InDetTrackParticles")
+ToolSvc += BPHY6MuonTPThinningTool
+
+# Added by ASC
+# Only save truth informtion directly associated with Onia
+from DerivationFrameworkMCTruth.DerivationFrameworkMCTruthConf import DerivationFramework__GenericTruthThinning
+BPHY6TruthThinTool = DerivationFramework__GenericTruthThinning(name             = "BPHY6TruthThinTool",
+                                                        ParticleSelectionString = "TruthParticles.pdgId == 443 || TruthParticles.pdgId == 100443 || TruthParticles.pdgId == 553 || TruthParticles.pdgId == 100553 || TruthParticles.pdgId == 200553 || TruthParticles.pdgId == 23 || TruthParticles.pdgId == 531 || TruthParticles.pdgId == 511 || TruthParticles.pdgId == 521 || TruthParticles.pdgId == 541",
+                                                        PreserveDescendants     = True,
+                                                        PreserveAncestors       = True)
+ToolSvc += BPHY6TruthThinTool
+print(BPHY6TruthThinTool)
+
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS  
+#====================================================================
+## 7/ IMPORTANT bit. Don't forget to pass the tools to the DerivationKernel! If you don't do that, they will not be 
+##    be executed!
+
+# Added by ASC
+BPHY6ThinningTools = [BPHY6Thin_vtxTrk, BPHY6MuonTPThinningTool]
+if globalflags.DataSource()=='geant4':
+    BPHY6ThinningTools.append(BPHY6TruthThinTool)
+
+
+# Build a tool to apply the OR combination of the String expression skimming tool, and the Trigger Skimming Tool
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__FilterCombinationOR
+SkimmingORTool = CfgMgr.DerivationFramework__FilterCombinationOR("BPHY6SkimmingOR",
+                                                                  FilterList = [BPHY6_SelectEvent,BPHY6TrigSkimmingTool],)
+ToolSvc += SkimmingORTool
+print(SkimmingORTool)
+
+# The name of the kernel (BPHY6Kernel in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+DerivationFrameworkJob += CfgMgr.DerivationFramework__DerivationKernel(
+  "BPHY6Kernel",
+   AugmentationTools = [BPHY6_Reco_mumu,
+                        BPHY6_Select_Jpsi2mumu, BPHY6_Select_Psi2mumu, BPHY6_Select_Upsi2mumu,BPHY6_Select_Bmumu2mumu,
+                        BPHY6_Select_Zmumu2mumu,BPHY6_Select_Onia2mumu, BPHY6_Extrap_Tool],
+   SkimmingTools     =  [SkimmingORTool],
+   #   ThinningTools     = [BPHY6Thin_vtxTrk, BPHY6MuonTPThinningTool]
+   ThinningTools     = BPHY6ThinningTools
+
+   )
+
+
+
+
+#====================================================================
+# Slimming 
+#====================================================================
+
+# Added by ASC
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY6SlimmingHelper = SlimmingHelper("BPHY6SlimmingHelper")
+AllVariables = []
+StaticContent = []
+
+# Needed for trigger objects
+BPHY6SlimmingHelper.IncludeMuonTriggerContent = True
+BPHY6SlimmingHelper.IncludeBPhysTriggerContent = True
+
+AllVariables += ["LVL1MuonRoIs"]
+
+## primary vertices
+AllVariables += ["PrimaryVertices"]
+StaticContent += ["xAOD::VertexContainer#BPHY6RefittedPrimaryVertices"]
+StaticContent += ["xAOD::VertexAuxContainer#BPHY6RefittedPrimaryVerticesAux."]
+
+## ID track particles
+AllVariables += ["InDetTrackParticles"]
+
+AllVariables += ["HLT_xAOD__TrackParticleContainer_InDetTrigTrackingxAODCnv_Muon_EFID"]
+AllVariables += ["HLT_xAOD__TrackParticleContainer_InDetTrigTrackingxAODCnv_Muon_IDTrig"]
+AllVariables += ["HLT_xAOD__TrackParticleContainer_InDetTrigTrackingxAODCnv_Muon_FTF"]
+AllVariables += ["HLT_xAOD__TrackParticleContainer_InDetTrigTrackingxAODCnv_Bphysics_FTF"]
+AllVariables += ["HLT_xAOD__TrackParticleContainer_InDetTrigTrackingxAODCnv_Bphysics_IDTrig"]
+
+
+
+## combined / extrapolated muon track particles 
+## (note: for tagged muons there is no extra TrackParticle collection since the ID tracks
+##        are store in InDetTrackParticles collection)
+AllVariables += ["CombinedMuonTrackParticles"]
+AllVariables += ["ExtrapolatedMuonTrackParticles"]
+AllVariables += ["MuonSpectrometerTrackParticles"]
+
+## muon container
+AllVariables += ["Muons"]
+AllVariables += ["HLT_xAOD__L2StandAloneMuonContainer_MuonL2SAInfo"]
+AllVariables += ["HLT_xAOD__L2CombinedMuonContainer_MuonL2CBInfo"]
+AllVariables += ["HLT_xAOD__MuonContainer_MuonEFInfo"]
+
+
+AllVariables += ["HLT_xAOD__TrigBphysContainer_L2BMuMuXFex" ]
+AllVariables += ["HLT_xAOD__TrigBphysContainer_EFBMuMuXFex" ]
+AllVariables += ["HLT_xAOD__TrigBphysContainer_L2BMuMuFex"  ]
+AllVariables += ["HLT_xAOD__TrigBphysContainer_EFBMuMuFex"  ]
+AllVariables += ["HLT_xAOD__TrigBphysContainer_L2TrackMass" ]
+AllVariables += ["HLT_xAOD__TrigBphysContainer_EFTrackMass" ]
+AllVariables += ["HLT_xAOD__TrigBphysContainer_L2MultiMuFex"]
+AllVariables += ["HLT_xAOD__TrigBphysContainer_EFMultiMuFex"]
+
+
+## Jpsi candidates 
+StaticContent += ["xAOD::VertexContainer#%s"        % BPHY6_Reco_mumu.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY6_Reco_mumu.OutputVtxContainerName]
+
+if isSimulation:
+    AllVariables += ["TruthEvents","TruthParticles","TruthVertices","MuonTruthParticles"]
+
+BPHY6SlimmingHelper.AllVariables = AllVariables
+BPHY6SlimmingHelper.StaticContent = StaticContent
+BPHY6SlimmingHelper.AppendContentToStream(BPHY6Stream)
+
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY7.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY7.py
new file mode 100644
index 000000000000..b53b1a403bc9
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY7.py
@@ -0,0 +1,648 @@
+#====================================================================
+# BPHY7.py
+# 
+# https://twiki.cern.ch/twiki/bin/view/AtlasProtected/LfvBphy7 
+#====================================================================
+
+
+#====================================================================
+# FLAGS TO PERSONALIZE THE DERIVATION
+#====================================================================
+
+onlyAugmentations = False  # Set to True to deactivate thinning and skimming, and only keep augmentations (to generate a sample with full xAOD plus all the extra)
+thinTruth = True
+addMuExtrapolationForTrigger = True
+
+
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+isSimulation = False
+if globalflags.DataSource()=='geant4':
+    isSimulation = True
+
+from DerivationFrameworkJetEtMiss.JetCommon import *
+from DerivationFrameworkJetEtMiss.METCommon import *
+
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+streamName = derivationFlags.WriteDAOD_BPHY7Stream.StreamName
+fileName   = buildFileName( derivationFlags.WriteDAOD_BPHY7Stream )
+
+BPHY7Stream = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY7Stream.AcceptAlgs(["BPHY7Kernel2"])
+
+## 0/ setup vertexing tools and services
+#include( "JpsiUpsilonTools/configureServices.py" )
+
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY7_VertexTools = BPHYVertexTools("BPHY7")
+
+
+#====================================================================
+# TriggerCounting for Kernel1 #Added by Matteo
+#====================================================================
+#List of trigggers to be counted (high Sig-eff*Lumi ones are in)
+triggersToMetadata= ["HLT_2mu10",
+                     "HLT_2mu10_bJpsimumu",
+                     "HLT_2mu10_bJpsimumu_delayed",
+                     "HLT_2mu10_l2msonly",
+                     "HLT_2mu10_nomucomb",
+                     "HLT_2mu14",
+                     "HLT_2mu14_nomucomb",
+                     "HLT_2mu4",
+                     "HLT_2mu4_bBmumuxv2",
+                     "HLT_2mu4_bDimu_noinvm_novtx_ss",
+                     "HLT_2mu6",
+                     "HLT_2mu6_10invm30_pt2_z10",
+                     "HLT_2mu6_bBmumu",
+                     "HLT_2mu6_bBmumux_Taumumux",
+                     "HLT_2mu6_bBmumuxv2",
+                     "HLT_2mu6_bBmumuxv2_delayed",
+                     "HLT_2mu6_bDimu_noinvm_novtx_ss",
+                     "HLT_2mu6_bJpsimumu",
+                     "HLT_2mu6_bJpsimumu_delayed",
+                     "HLT_2mu6_bJpsimumu_Lxy0_delayed",
+                     "HLT_2mu6_nomucomb_bPhi",
+                     "HLT_2mu6_nomucomb_mu4_nomucomb_bTau_L12MU6_3MU4",
+                     "HLT_3mu4",
+                     "HLT_3mu4_bDimu",
+                     "HLT_3mu4_bDimu2700",
+                     "HLT_3mu4_bTau",
+                     "HLT_3mu4_l2msonly",
+                     "HLT_3mu4_nomucomb_bTau",
+                     "HLT_3mu4_nomucomb_delayed",
+                     "HLT_3mu6",
+                     "HLT_3mu6_bTau",
+                     "HLT_3mu6_msonly",
+                     "HLT_mu10_mu6_bBmumux_BcmumuDsloose_delayed",
+                     "HLT_mu10_mu6_bBmumux_Taumumux",
+                     "HLT_mu10_mu6_bBmumux_Taumumux_noL2",
+                     "HLT_mu10_mu6_bBmumuxv2",
+                     "HLT_mu10_mu6_bBmumuxv2_delayed",
+                     "HLT_mu10_mu6_bJpsimumu",
+                     "HLT_mu10_mu6_bJpsimumu_Lxy0",
+                     "HLT_mu10_mu6_bJpsimumu_Lxy0_delayed",
+                     "HLT_mu10_mu6_bUpsimumu",
+                     "HLT_mu11_mu6_bBmumu",
+                     "HLT_mu11_mu6_bBmumux_BpmumuKp",
+                     "HLT_mu11_mu6_bBmumuxv2",
+                     "HLT_mu11_mu6_bDimu",
+                     "HLT_mu11_mu6_bDimu2700",
+                     "HLT_mu11_mu6_bDimu2700_Lxy0",
+                     "HLT_mu11_mu6_bDimu_Lxy0",
+                     "HLT_mu11_mu6_bJpsimumu",
+                     "HLT_mu11_mu6_bJpsimumu_Lxy0",
+                     "HLT_mu11_mu6_bPhi",
+                     "HLT_mu11_mu6_bTau",
+                     "HLT_mu11_mu6_bUpsimumu",
+                     "HLT_mu11_mu6noL1_bPhi_L1MU11_2MU6",
+                     "HLT_mu10_mu6_bDimu",
+                     "HLT_2mu6_bBmumu_Lxy0_L1BPH-2M9-2MU6_BPH-2DR15-2MU6",
+                     "HLT_2mu6_bJpsimumu_Lxy0_L1BPH-2M9-2MU6_BPH-2DR15-2MU6",
+                     "HLT_2mu10_bDimu",
+                     "HLT_mu11_2mu4noL1_nscan03_L1MU11_2MU6",
+                     "HLT_mu11_L1MU10_2mu4noL1_nscan03_L1MU10_2MU6",
+                     "HLT_mu11_nomucomb_2mu4noL1_nscan03_L1MU11_2MU6",
+                     "HLT_mu11_nomucomb_2mu4noL1_nscan03_L1MU11_2MU6_bTau",
+                     "HLT_mu11_nomucomb_mu6noL1_nscan03_L1MU11_2MU6",
+                     "HLT_mu11_nomucomb_mu6noL1_nscan03_L1MU11_2MU6_bTau",
+                     "HLT_mu11_nomucomb_mu6noL1_nscan03_L1MU11_2MU6_bTau_delayed",
+                     "HLT_mu18_2mu4noL1",
+                     "HLT_mu18_mu8noL1",
+                     "HLT_mu20_2mu4noL1",
+                     "HLT_mu20_l2idonly_mu6noL1_nscan03",
+                     "HLT_mu20_l2idonly_mu6noL1_nscan03_bTau",
+                     "HLT_mu20_msonly_mu6noL1_msonly_nscan05",
+                     "HLT_mu20_mu8noL1",
+                     "HLT_mu20_nomucomb_mu6noL1_nscan03",
+                     "HLT_mu20_nomucomb_mu6noL1_nscan03_bTau",
+                     "HLT_mu22_2mu4noL1",
+                     "HLT_mu22_mu8noL1",
+                     "HLT_mu24_2mu4noL1",
+                     "HLT_mu24_imedium",
+                     "HLT_mu24_mu8noL1",
+                     "HLT_mu26_ivarmedium",
+                     "HLT_mu26i",
+                     "HLT_mu50",
+                     "HLT_mu6_2mu4",
+                     "HLT_mu6_2mu4_bJpsi_delayed",
+                     "HLT_mu6_2mu4_bTau_noL2",
+                     "HLT_mu6_l2msonly_2mu4_l2msonly_L1MU6_3MU4",
+                     "HLT_mu6_mu4_bBmumuxv2",
+                     "HLT_mu6_mu4_bBmumuxv2_delayed",
+                     "HLT_mu6_mu4_bDimu_noinvm_novtx_ss",
+                     "HLT_mu6_nomucomb_2mu4_nomucomb_bTau_L1MU6_3MU4",
+                     "HLT_mu6_nomucomb_2mu4_nomucomb_delayed_L1MU6_3MU4",
+                     "HLT_mu20_mu6noL1_bTau",
+                     "HLT_2mu6_mu4_bTau_L12MU6_3MU4",
+                     "HLT_mu6_2mu4_bTau_L1MU6_3MU4",
+                     "HLT_mu11_2mu4noL1_bTau_L1MU11_2MU6",
+                     "HLT_mu11_mu6noL1_bTau_L1MU11_2MU6",
+                     "HLT_3mu4_bPhi",
+                     "HLT_mu11_mu6_bPhi",
+                     "HLT_mu11_nomucomb_mu6_nomucomb_bPhi",
+                     "HLT_mu11_nomucomb_mu6noL1_nscan03_L1MU11_2MU6_bPhi",
+                     "HLT_mu6_2mu4_bTau_L1MU6_3MU4",
+                     "HLT_mu20_mu6btrk_bTauTight",
+                     "HLT_mu20_2mu2btrk_bTauTight",
+                     "HLT_mu11_2mu2btrk_bTauTight_L1MU11_2MU6",
+                     "HLT_3mu4_bPhi",
+                     "HLT_mu11_mu6_bPhi",
+                     "HLT_mu11_mu6noL1_bPhi_L1MU11_2MU6",
+                     "HLT_mu11_mu6_bPhi_L1LFV-MU11",
+                     "HLT_2mu6_bPhi_L1LFV-MU6" ]
+
+
+
+
+triggersToMetadata_filter = list( set(triggersToMetadata) )
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__TriggerCountToMetadata
+BPHY7TriggerCountToMetadata = DerivationFramework__TriggerCountToMetadata(name = "BPHY7TriggerCount",
+                                                                          TriggerList = triggersToMetadata_filter,
+                                                                          FolderName = "BPHY7")
+
+ToolSvc += BPHY7TriggerCountToMetadata
+
+#====================================================================
+# PRESELECTION for Kernel1 #Added by Matteo
+#====================================================================
+## 1/ Setup the skimming based on triggers
+##     
+
+triggerList = [ "HLT_2mu10",
+                "HLT_2mu10_l2msonly",
+                "HLT_2mu10_nomucomb",
+                "HLT_2mu14",
+                "HLT_mu50",
+                "HLT_2mu14_l2msonly",
+                "HLT_2mu14_nomucomb",
+                "HLT_2mu6_l2msonly_mu4_l2msonly_L12MU6_3MU4",
+                "HLT_2mu6_nomucomb_mu4_nomucomb_L12MU6_3MU4",
+                "HLT_mu6_2mu4",
+                "HLT_mu6_l2msonly_2mu4_l2msonly_L1MU6_3MU4",
+                "HLT_mu6_nomucomb_2mu4_nomucomb_L1MU6_3MU4",
+                "HLT_3mu6",
+                "HLT_3mu6_msonly",
+                "HLT_3mu6_nomucomb",
+                "HLT_mu4","HLT_mu6","HLT_mu10","HLT_mu18",
+                "HLT_mu14",
+                "HLT_mu24",
+                "HLT_mu24_L1MU15",
+                "HLT_2mu4",
+                "HLT_2mu6",
+                "HLT_mu20_L1MU15",
+                "HLT_mu18_2mu4noL1",
+                "HLT_mu18_nomucomb_2mu4noL1",
+                "HLT_mu20_2mu4noL1",
+                "HLT_mu20_l2idonly_2mu4noL1",
+                "HLT_mu20_nomucomb_2mu4noL1",
+                "HLT_mu18_mu8noL1",
+                "HLT_mu18_nomucomb_mu8noL1",
+                "HLT_mu20_mu8noL1",
+                "HLT_mu20_l2idonly_2mu4noL1",
+                "HLT_mu20_nomucomb_mu8noL1",
+                "HLT_mu22_mu8noL1",
+                "HLT_mu22_l2idonly_2mu4noL1",
+                "HLT_mu22_nomucomb_mu8noL1",
+                "HLT_mu22_2mu4noL1",
+                "HLT_mu22_nomucomb_2mu4noL1",
+                "HLT_mu20_2mu4noL1", "HLT_mu20_mu8noL1",
+                "HLT_mu14_tau25_medium1_tracktwo",
+                "HLT_mu14_tau35_medium1_tracktwo",
+                "HLT_mu14_tau25_medium1_tracktwo_xe50",
+                "HLT_mu14_tau35_medium1_tracktwo_L1TAU20",
+                "HLT_mu24_mu8noL1",
+                "HLT_mu6_nomucomb_2mu4_nomucomb_delayed_L1MU6_3MU4", 
+                "HLT_2mu6_bBmumuxv2_delayed", 
+                "HLT_2mu4_bDimu_noinvm_novtx_ss", 
+                "HLT_2mu6_bDimu_noinvm_novtx_ss", 
+                "HLT_mu24_2mu4noL1", 
+                "HLT_mu10_mu6_bUpsimumu", 
+                "HLT_mu10_mu6_bBmumuxv2", 
+                "HLT_mu10_mu6_bJpsimumu", 
+                "HLT_mu6_mu4_bBmumuxv2_delayed", 
+                "HLT_2mu6_10invm30_pt2_z10", 
+                "HLT_2mu6_nomucomb_bPhi",
+                "HLT_mu6_mu4_bDimu_noinvm_novtx_ss",
+                "HLT_mu11_mu6_bDimu2700",
+		"HLT_2mu6_bBmumux_Taumumux",
+                "HLT_mu10_mu6_bBmumux_Taumumux",
+                "HLT_mu10_mu6_bBmumux_Taumumux_noL2",
+                "HLT_.*mu11_mu6.*",     # Recent triggers
+                "HLT_.*3mu4.*",
+                "HLT_.*mu.*imedium.*",	# Trigger with looser isolation selection 
+                "HLT_.*mu.*iloose.*",
+                "HLT_.*mu6.*2mu4.*",
+                "HLT_.*mu11.*2mu4noL1.*",
+                "HLT_.*2mu14_nomucomb.*",
+                "HLT_.*bTau.*",		# Our tau triggers
+                "HLT_.*bDimu2700.*",
+                "HLT_.*bPhi.*",
+                "HLT_.*bBmumuxv2.*",
+                "HLT_.*nscan.*"  ]	# Narrow scan triggers
+
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__TriggerSkimmingTool
+BPHY7TriggerSkim = DerivationFramework__TriggerSkimmingTool(name = "BPHY7TriggerSkim",
+                                                            TriggerListOR = triggerList,
+                                                            TriggerListAND = [] )
+
+ToolSvc += BPHY7TriggerSkim
+
+
+#====================================================================
+# 2mu vertex for Kernel2 #Added by Matteo
+#====================================================================
+
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder
+BPHY7DiMuon_Finder = Analysis__JpsiFinder(name                         = "BPHY7DiMuon_Finder",
+                                          #    OutputLevel                 = DEBUG,
+                                          muAndMu                     = True,
+                                          muAndTrack                  = False,
+                                          TrackAndTrack               = False,
+                                          assumeDiMuons               = True, 
+                                          invMassUpper                = 2900.0, # Cut just below the J/psi
+                                          invMassLower                = 0.0,
+                                          Chi2Cut                     = 110., #CHANGED! Was 200
+                                          oppChargesOnly	            = False,
+                                          allChargeCombinations	    = True,
+                                          combOnly		    = False,
+                                          atLeastOneComb		    = True,
+                                          useCombinedMeasurement      = False, # Only takes effect if combOnly=True	
+                                          muonCollectionKey           = "Muons",
+                                          TrackParticleCollection     = "InDetTrackParticles",
+                                          V0VertexFitterTool          = BPHY7_VertexTools.TrkV0Fitter,             # V0 vertex fitter
+                                          useV0Fitter                 = False,                   # if False a TrkVertexFitterTool will be used
+                                          TrkVertexFitterTool         = BPHY7_VertexTools.TrkVKalVrtFitter,        # VKalVrt vertex fitter
+                                          TrackSelectorTool           = BPHY7_VertexTools.InDetTrackSelectorTool,
+                                          VertexPointEstimator        = BPHY7_VertexTools.VtxPointEstimator,
+                                          useMCPCuts                  = False)
+ToolSvc += BPHY7DiMuon_Finder
+
+#--------------------------------------------------------------------
+##Comment from BPHY2...
+## 3/ setup the vertex reconstruction "call" tool(s). They are part of the derivation framework.
+##    These Augmentation tools add output vertex collection(s) into the StoreGate and add basic 
+##    decorations which do not depend on the vertex mass hypothesis (e.g. lxy, ptError, etc).
+##    There should be one tool per topology, i.e. Jpsi and Psi(2S) do not need two instance of the
+##    Reco tool is the JpsiFinder mass window is wide enough.
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY7DiMuon_SelectAndWrite = DerivationFramework__Reco_Vertex(name              = "BPHY7DiMuon_SelectAndWrite",
+                                                            VertexSearchTool    	      = BPHY7DiMuon_Finder,
+                                                            OutputVtxContainerName = "BPHY7TwoMuCandidates",
+                                                            PVContainerName        = "PrimaryVertices",
+                                                            RefPVContainerName     = "SHOULDNOTBEUSED_DiMuonRefittedPV")
+ToolSvc += BPHY7DiMuon_SelectAndWrite
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+
+## a/ augment and select Jpsi->mumu candidates
+BPHY7DiMuon_Decorator = DerivationFramework__Select_onia2mumu(name                  = "BPHY7DiMuon_Decorator",
+                                                              HypothesisName        = "Jpsi",
+                                                              InputVtxContainerName = "BPHY7TwoMuCandidates",
+                                                              VtxMassHypo           = 1230,   # used to determine time-of-flight and thus lifetime (deviations and sigmas are also added to the vertex)
+                                                              MassMin               = 0.0,
+                                                              MassMax               = 2900.0,
+                                                              Chi2Max               = 200,
+                                                              DoVertexType =1)              #	1 = Pt, 2 = A0, 4 = Z0
+  
+ToolSvc += BPHY7DiMuon_Decorator
+#====================================================================
+# 3mu/2mu+trk vertex for Kernel2 #Added by Matteo
+#====================================================================
+## 4/ setup a new vertexing tool (necessary due to use of mass constraint) 
+from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+BpmVertexFit = Trk__TrkVKalVrtFitter(name                = "BpmVertexFit",
+                                     Extrapolator        = BPHY7_VertexTools.InDetExtrapolator,
+                                     FirstMeasuredPoint  = True,
+                                     MakeExtendedVertex  = True)
+ToolSvc += BpmVertexFit
+
+## 5/ setup the Jpsi+1 track finder
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiPlus1Track
+BPHY7ThreeMuon_Finder = Analysis__JpsiPlus1Track(name 				= "BPHY7ThreeMuon_Finder",
+                                                 OutputLevel 			= INFO,
+                                                 pionHypothesis			= True,
+                                                 kaonHypothesis			= False,
+                                                 trkThresholdPt			= 1000.0,
+                                                 #trkMaxEta			= 2.5, # is this value fine?? default would be 102.5
+                                                 BThresholdPt			= 1000.0,
+                                                 BMassUpper			= 5000.0, # What is this??
+                                                 BMassLower			= 0.0,
+                                                 JpsiContainerKey		= "BPHY7TwoMuCandidates",
+                                                 TrackParticleCollection		= "InDetTrackParticles",
+                                                 MuonsUsedInJpsi			= "NONE", #cannnot allow, would kill 3muons
+                                                 ExcludeCrossJpsiTracks		= False,
+                                                 TrkVertexFitterTool		= BpmVertexFit,
+                                                 TrackSelectorTool		= BPHY7_VertexTools.InDetTrackSelectorTool,
+                                                 UseMassConstraint		= False, 
+                                                 Chi2Cut 			= 150) #Cut on chi2/Ndeg_of_freedom, so is very loose
+												
+        
+ToolSvc += BPHY7ThreeMuon_Finder
+
+## 6/ setup the combined augmentation/skimming tool for the Bpm
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY7ThreeMuon_SelectAndWrite = DerivationFramework__Reco_Vertex(name                     = "BPHY7ThreeMuon_SelectAndWrite",
+                                                                  OutputLevel              = INFO,
+                                                                  VertexSearchTool       = BPHY7ThreeMuon_Finder,
+                                                                  OutputVtxContainerName   = "BPHY7Tau3MuCandidates",
+                                                                  PVContainerName          = "PrimaryVertices",
+                                                                  RefPVContainerName       = "BPHY7RefittedPrimaryVertices",
+                                                                  RefitPV                  = True,
+                                                                  MaxPVrefit = 1000)
+ToolSvc += BPHY7ThreeMuon_SelectAndWrite 
+
+## b/ augment and select Bplus->JpsiKplus candidates
+BPHY7ThreeMuon_Decorator = DerivationFramework__Select_onia2mumu(
+  name                       = "BPHY7ThreeMuon_Decorator",
+  OutputLevel                = INFO,
+  HypothesisName             = "Tau3MuLoose",
+  InputVtxContainerName      = "BPHY7Tau3MuCandidates",
+  TrkMasses                  = [105.658, 105.658, 105.658],
+  VtxMassHypo                = 1777.,
+  MassMin                    = 0.0,
+  MassMax                    = 5000.,  # If the two selections start differing one might have to check that the tools below still run on the right vertices
+  Chi2Max                    = 100.)
+
+ToolSvc += BPHY7ThreeMuon_Decorator
+
+## b/ augment and select Bplus->JpsiKplus candidates
+BPHY7ThreeMuon_Decorator2 = DerivationFramework__Select_onia2mumu(
+  name                       = "BPHY7ThreeMuon_Decorator2",
+  OutputLevel                = INFO,
+  HypothesisName             = "Ds2MuPi",
+  InputVtxContainerName      = "BPHY7Tau3MuCandidates",
+  TrkMasses                  = [105.658, 105.658, 139.57],
+  VtxMassHypo                = 1968.3,
+  MassMin                    = 0.0,
+  MassMax                    = 5000.,  # If the two selections start differing one might have to check that the tools below still run on the right vertices
+  Chi2Max                    = 100.)
+
+ToolSvc += BPHY7ThreeMuon_Decorator2
+
+#Track isolation for candidates
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__VertexTrackIsolation
+BPHY7TrackIsolationDecorator = DerivationFramework__VertexTrackIsolation(
+  name                            = "BPHY7TrackIsolationDecorator",
+  OutputLevel                     = INFO,
+  TrackIsoTool 	                  = "xAOD::TrackIsolationTool",
+  TrackContainer                  = "InDetTrackParticles",
+  InputVertexContainer            = "BPHY7Tau3MuCandidates",
+  PassFlags                       = ["passed_Tau3MuLoose", "passed_Ds2MuPi"] )
+
+ToolSvc += BPHY7TrackIsolationDecorator
+
+#CaloIsolationTool explicitly declared to avoid pointless warnings (it works!!!)
+from IsolationTool.IsolationToolConf import xAOD__CaloIsolationTool
+BPHY7CaloIsolationTool = xAOD__CaloIsolationTool(
+  name                            = "BPHY7CaloIsolationTool",
+  OutputLevel                     = WARNING,                  
+  saveOnlyRequestedCorrections    = True,
+  IsoLeakCorrectionTool           = "" ) #Workaround for a bug in older versions
+
+ToolSvc += BPHY7CaloIsolationTool
+
+#Calo isolation for candidates
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__VertexCaloIsolation
+BPHY7CaloIsolationDecorator = DerivationFramework__VertexCaloIsolation(
+  name                            = "BPHY7CaloIsolationDecorator",
+  OutputLevel                     = INFO,                  
+  CaloIsoTool                     = BPHY7CaloIsolationTool,  #"xAOD::CaloIsolationTool",
+  TrackContainer                  = "InDetTrackParticles",
+  InputVertexContainer            = "BPHY7Tau3MuCandidates",
+  CaloClusterContainer            = "CaloCalTopoClusters",
+  ParticleCaloExtensionTool       = "Trk::ParticleCaloExtensionTool/ParticleCaloExtensionTool",
+  PassFlags                       = ["passed_Tau3MuLoose", "passed_Ds2MuPi"] )
+
+ToolSvc += BPHY7CaloIsolationDecorator
+
+#====================================================================
+# Skimming tool to select only events with the correct vertices
+#====================================================================
+
+#--------------------------------------------------------------------
+## 9/ select the event. We only want to keep events that contain certain three-mu vertices which passed certain selection.
+##    Exactly like in the preselection, where only 2mu vertices are treated.
+
+expression = "count(BPHY7Tau3MuCandidates.passed_Tau3MuLoose) > 0 || count(BPHY7Tau3MuCandidates.passed_Ds2MuPi) > 0"
+
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+BPHY7_SelectEvent = DerivationFramework__xAODStringSkimmingTool(name 		= "BPHY7_SelectEvent",
+                                                                OutputLevel   	= INFO,
+                                                                expression 	= expression)
+
+ToolSvc += BPHY7_SelectEvent
+print(BPHY7_SelectEvent)
+
+#====================================================================
+# Add Extrapolation of muons to trigger layers
+#====================================================================
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__MuonExtrapolationTool 
+BPHY7_Extrap_Tool = DerivationFramework__MuonExtrapolationTool(   name = "BPHY7_ExtrapolationTool",   OutputLevel = INFO ) 
+
+ToolSvc += BPHY7_Extrap_Tool
+
+
+#====================================================================
+# Thinning Helper and various thinning tools
+#====================================================================
+
+#--------------------------------------------------------------------
+## 10/ Setup the thinning helper, only tool able to perform thinning of trigger navigation information
+
+from DerivationFrameworkCore.ThinningHelper import ThinningHelper
+BPHY7ThinningHelper = ThinningHelper( "BPHY7ThinningHelper" )
+BPHY7ThinningHelper.TriggerChains = 'HLT_.*mu.*' #triggerList	# . = any character; * = 0 or more times; + = 1 or more times; ? 0 or 1 times  "Regular_Expression"
+BPHY7ThinningHelper.AppendToStream( BPHY7Stream )
+
+
+#--------------------------------------------------------------------
+## 11/ track and vertex thinning. We want to remove all reconstructed secondary vertices
+##    which haven't passed any of the selections defined by (Select_*) tools.
+##    We also want to keep only tracks which are associates with either muons or any of the
+##    vertices that passed the selection. Multiple thinning tools can perform the 
+##    selection. The final thinning decision is based OR of all the decisions (by default,
+##    although it can be changed by the JO).
+
+## 12/ Cleans up, removing duplicate vertices. An issue caused by the logic of Jpsi+1 track in the case of 3-muon candidates
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxDuplicates
+BPHY7Thin_vtxDuplicates = DerivationFramework__Thin_vtxDuplicates(name                       = "BPHY7Thin_vtxDuplicates",
+                                                                  OutputLevel                = INFO,
+                                                                  VertexContainerName       = "BPHY7Tau3MuCandidates",
+                                                                  PassFlags                  = ["passed_Tau3MuLoose", "passed_Ds2MuPi"])
+
+ToolSvc += BPHY7Thin_vtxDuplicates
+
+## a) thining out vertices that didn't pass any selection and idetifying tracks associated with 
+##    selected vertices. The "VertexContainerNames" is a list of the vertex containers, and "PassFlags"
+##    contains all pass flags for Select_* tools that must be satisfied. The vertex is kept is it 
+##    satisfy any of the listed selections.
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxTrk
+BPHY7Thin_vtxTrk = DerivationFramework__Thin_vtxTrk(
+  name                       = "BPHY7Thin_vtxTrk",
+  OutputLevel                = INFO,
+  TrackParticleContainerName = "InDetTrackParticles",
+  AcceptanceRadius	     = 1.,
+  VertexContainerNames       = ["BPHY7Tau3MuCandidates"],
+  PassFlags                  = ["passed_Tau3MuLoose", "passed_Ds2MuPi"],
+  ApplyAnd                   = True )  # "and" requirement for Vertices
+
+ToolSvc += BPHY7Thin_vtxTrk
+
+
+## 13/ thinning out tracks that are not attached to muons. The final thinning decision is based on the OR operation
+##     between decision from this and the previous tools.
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__MuonTrackParticleThinning
+BPHY7MuonTPThinningTool = DerivationFramework__MuonTrackParticleThinning(name                    = "BPHY7MuonTPThinningTool",
+                                                                         MuonKey                 = "Muons",
+                                                                         InDetTrackParticlesKey  = "InDetTrackParticles")
+ToolSvc += BPHY7MuonTPThinningTool
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__BPhysPVThinningTool
+BPHY7_thinningTool_PV = DerivationFramework__BPhysPVThinningTool(name                       = "BPHY7_thinningTool_PV",
+                                                                 CandidateCollections       = ["BPHY7Tau3MuCandidates"],
+                                                                 KeepPVTracks  =True)
+
+ToolSvc += BPHY7_thinningTool_PV
+
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__TauTrackParticleThinning
+BPHY7TauTPThinningTool = DerivationFramework__TauTrackParticleThinning(name                    = "BPHY7TauTPThinningTool",
+                                                                       TauKey                 = "TauJets",
+                                                                       InDetTrackParticlesKey  = "InDetTrackParticles")
+ToolSvc += BPHY7TauTPThinningTool
+
+# Only save truth informtion directly associated with: mu Ds+ D+ D*+ Ds*+ D0 D*0 B+ B*+ B0 B*0 
+from DerivationFrameworkMCTruth.DerivationFrameworkMCTruthConf import DerivationFramework__GenericTruthThinning
+BPHY7TruthThinTool = DerivationFramework__GenericTruthThinning(name                    = "BPHY7TruthThinTool",
+                                                               ParticleSelectionString = "abs(TruthParticles.pdgId) == 13 || abs(TruthParticles.pdgId) == 431 || abs(TruthParticles.pdgId) == 411 || abs(TruthParticles.pdgId) == 413 || abs(TruthParticles.pdgId) == 433 || TruthParticles.pdgId == 421 || TruthParticles.pdgId == 423 || abs(TruthParticles.pdgId) == 521 || abs(TruthParticles.pdgId) == 523 || TruthParticles.pdgId == 511 || TruthParticles.pdgId == 513",
+                                                               PreserveDescendants     = True,
+                                                               PreserveAncestors      = True)
+ToolSvc += BPHY7TruthThinTool
+
+# Only save truth neutrino and b/c quarks information
+from DerivationFrameworkMCTruth.DerivationFrameworkMCTruthConf import DerivationFramework__GenericTruthThinning
+BPHY7TruthThinNoChainTool = DerivationFramework__GenericTruthThinning(name                    = "BPHY7TruthThinNoChainTool",
+                                                              ParticleSelectionString = "abs(TruthParticles.pdgId) == 4 || abs(TruthParticles.pdgId) == 5 || abs(TruthParticles.pdgId) == 12 || abs(TruthParticles.pdgId) == 14 || abs(TruthParticles.pdgId) == 16",
+                                                              PreserveDescendants     = False,
+                                                              PreserveAncestors      = False)
+ToolSvc += BPHY7TruthThinNoChainTool
+
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS  
+#====================================================================
+
+BPHY7ThinningTools = [ BPHY7MuonTPThinningTool, BPHY7Thin_vtxDuplicates, BPHY7Thin_vtxTrk, BPHY7_thinningTool_PV,  BPHY7TauTPThinningTool]
+
+BPHY7SkimmingTools = [BPHY7_SelectEvent]
+
+BPHY7AugmentationTools = [BPHY7DiMuon_SelectAndWrite, BPHY7DiMuon_Decorator, BPHY7ThreeMuon_SelectAndWrite, BPHY7ThreeMuon_Decorator, BPHY7ThreeMuon_Decorator2, BPHY7TrackIsolationDecorator, BPHY7CaloIsolationDecorator]
+
+if addMuExtrapolationForTrigger:
+    BPHY7AugmentationTools.append(BPHY7_Extrap_Tool)
+
+Kernel1Tools = [BPHY7TriggerSkim]
+
+if isSimulation:
+    #BPHY7AugmentationTools.append(DFCommonTauTruthMatchingWrapper)
+    if thinTruth:
+       BPHY7ThinningTools.append(BPHY7TruthThinTool)
+       BPHY7ThinningTools.append(BPHY7TruthThinNoChainTool)
+
+#The sequence object. Is in principle just a wrapper which allows to run two kernels in sequence
+BPHY7_Sequence = CfgMgr.AthSequencer("BPHY7_Sequence")
+from DerivationFrameworkFlavourTag.FlavourTagCommon import FlavorTagInit
+FlavorTagInit(JetCollections=['AntiKt4EMPFlowJets'], Sequencer=BPHY7_Sequence)
+
+
+#onlyAugmentations implementation
+if onlyAugmentations:
+    Kernel1Tools = []
+    BPHY7SkimmingTools = []
+    BPHY7ThinningTools = []
+
+# Kernel n1 PRESELECTION
+# The name of the kernel (BPHY7Kernel1 in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+BPHY7_Sequence += CfgMgr.DerivationFramework__DerivationKernel("BPHY7Kernel1",
+                                                               AugmentationTools = [BPHY7TriggerCountToMetadata] ,
+                                                               SkimmingTools     = Kernel1Tools)
+# Kernel n2 deep Derivation
+# The name of the kernel (BPHY7Kernel2 in this case) must be unique to this derivation
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+BPHY7_Sequence += CfgMgr.DerivationFramework__DerivationKernel("BPHY7Kernel2",
+                                                               AugmentationTools = BPHY7AugmentationTools,
+                                                               SkimmingTools     = BPHY7SkimmingTools, 
+                                                               ThinningTools     = BPHY7ThinningTools)
+
+#Vital, replaces the adding of kernels directly
+DerivationFrameworkJob += BPHY7_Sequence
+
+#====================================================================
+# Slimming 
+#====================================================================
+
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY7SlimmingHelper = SlimmingHelper("BPHY7SlimmingHelper")
+
+
+SmartCollections = ["Electrons", "Photons", "TauJets", "AntiKt4EMTopoJets_BTagging201810", "BTagging_AntiKt4EMTopo_201810", "PrimaryVertices", "Muons", "InDetTrackParticles", "MET_Reference_AntiKt4EMTopo"]
+
+
+AllVariables = ["METAssoc_AntiKt4EMTopo",
+                 "MET_Core_AntiKt4EMTopo",
+                 "MET_Truth",
+                 "MET_Track",
+                 "MET_LocHadTopo"]
+
+AllVariables += ["Kt4EMTopoOriginEventShape",
+                 "Kt4EMTopoEventShape"]
+
+AllVariables += ["CombinedMuonTrackParticles",
+                 "ExtrapolatedMuonTrackParticles",
+                 "MuonSpectrometerTrackParticles"]
+
+
+ExtraVariables = ["Photons.pt.eta.phi.m",
+                  "Electrons.pt.eta.phi.m","TauJets.pt.eta.phi.m.IsTruthMatched.truthJetLink.truthParticleLink",
+                  "AntiKt4EMTopoJets_BTagging201810.JetPileupScaleMomentum_pt.JetPileupScaleMomentum_eta.JetPileupScaleMomentum_phi.JetPileupScaleMomentum_m", 
+                  "AntiKt4EMTopoJets_BTagging201810.JvtJvfcorr.HECFrac.LArQuality.HECQuality.NegativeE.AverageLArQF", 
+                  "AntiKt4EMTopoJets_BTagging201810.JetEtaJESScaleMomentum_pt.JetEtaJESScaleMomentum_eta.JetEtaJESScaleMomentum_phi.JetEtaJESScaleMomentum_m"]
+
+ExtraVariables += ["Muons.etaLayer1Hits.etaLayer2Hits.etaLayer3Hits.etaLayer4Hits.phiLayer1Hits.phiLayer2Hits.phiLayer3Hits.phiLayer4Hits",
+                   "Muons.numberOfTriggerEtaLayers.numberOfPhiLayers",
+                   "CombinedMuonTrackParticles.numberOfTRTHits.numberOfTRTHighThresholdHits", 
+                   "InDetTrackParticles.numberOfTRTHits.numberOfTRTHighThresholdHits.vx.vy.vz",
+                   "PrimaryVertices.chiSquared.covariance"]
+
+
+StaticContent =  ["xAOD::VertexContainer#BPHY7RefittedPrimaryVertices",
+                  "xAOD::VertexAuxContainer#BPHY7RefittedPrimaryVerticesAux."]
+
+# ThreeBody candidates (vertices)
+StaticContent += ["xAOD::VertexContainer#%s"        % BPHY7ThreeMuon_SelectAndWrite.OutputVtxContainerName]
+StaticContent += ["xAOD::VertexAuxContainer#%sAux." % BPHY7ThreeMuon_SelectAndWrite.OutputVtxContainerName]
+## we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+StaticContent += ["xAOD::VertexAuxContainer#%sAux.-vxTrackAtVertex" % BPHY7ThreeMuon_SelectAndWrite.OutputVtxContainerName]
+
+# Truth information for MC only
+if isSimulation:
+    AllVariables += ["TruthEvents","TruthParticles","TruthVertices","MuonTruthParticles", "METMap_Truth"]
+    SmartCollections += ["AntiKt4TruthJets"] 
+
+# Needed for trigger objects
+BPHY7SlimmingHelper.IncludeMuonTriggerContent = True
+BPHY7SlimmingHelper.IncludeBPhysTriggerContent = True
+
+# Pass all lists to the SlimmingHelper
+BPHY7SlimmingHelper.ExtraVariables = ExtraVariables
+BPHY7SlimmingHelper.AllVariables = AllVariables
+BPHY7SlimmingHelper.StaticContent = StaticContent
+BPHY7SlimmingHelper.SmartCollections = SmartCollections
+BPHY7SlimmingHelper.AppendContentToStream(BPHY7Stream)
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY8.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY8.py
new file mode 100644
index 000000000000..5e3de69ae0d0
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY8.py
@@ -0,0 +1,2200 @@
+#====================================================================
+#
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+#   
+# @file   BPHY8.py
+#
+# @author W. Walkowiak, <wolfgang.walkowiak@cern.ch>
+#
+# Based on example derivation formats.
+# It requires the reductionConf flag BPHY8 in Reco_tf.py   
+#
+# Produces DxAODs for the B(s)->mu+mu- analysis including the reference
+# channels B+->J/psiK+ and Bs->J/psiPhi:
+# * For data vertex containers for all three channels are produced
+#   in parallel.
+# * For signal or reference channel MC the appropriate configuration
+#   is set according to the dataset number (DSN).  The list associating
+#   known dataset numbers to decay channels (below) needs to be adjusted
+#   in case there are new MC samples with new numbers.
+#
+#====================================================================
+# Set up common services and job object. 
+# This should appear in ALL derivation job options
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+# for debugging output
+from pprint import pprint
+from egammaRec.Factories import getPropertyValue
+
+# more debug messages
+## svcMgr.MessageSvc.debugLimit = 5000000
+## svcMgr.MessageSvc.debugLimit = 5000
+
+# Set up Bmumu configuration (metadata) tracking tool.
+# This tool imports our defaults from Bmumu_metadata.cxx.
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf \
+    import DerivationFramework__Bmumu_metadata
+BPHY8_MetaDataTool = DerivationFramework__Bmumu_metadata( 
+    name              = "BPHY8_metadata",
+    DerivationName    = "BPHY8",
+    OutputLevel       = WARNING,
+    # verbosity of python script (0 - 10)
+    verbose           = 10
+)
+# local shorthand and ensure default contents of __slots__ dict are
+# available as attributes
+from DerivationFrameworkBPhys.BPhysPyHelpers import BPhysEnsureAttributes
+BPHY8cf = BPhysEnsureAttributes(BPHY8_MetaDataTool)
+
+# add it to the ToolSvc chain
+ToolSvc += BPHY8_MetaDataTool
+
+print(BPHY8_MetaDataTool)
+pprint(BPHY8_MetaDataTool.properties())
+
+# data or simulation?
+if globalflags.DataSource() == 'geant4':
+    BPHY8cf.isSimulation = True
+
+# project tag
+BPHY8cf.projectTag = rec.projectName()
+
+# trigger stream name
+from RecExConfig.InputFilePeeker import inputFileSummary
+if inputFileSummary is not None:
+    BPHY8cf.triggerStream = inputFileSummary['tag_info']['triggerStreamOfFile']
+
+# release 21 or newer?
+from PyJobTransforms.trfUtils import releaseIsOlderThan
+BPHY8cf.isRelease21 = not releaseIsOlderThan(21,0)
+
+# MC campaigns by MC run number
+BPHY8MCcampaigns = {284500 : 'mc16a',
+                    300000 : 'mc16d',
+                    310000 : 'mc16e'}
+
+# run number and MC campaign by MC run number
+from AthenaCommon.AthenaCommonFlags import athenaCommonFlags
+import PyUtils.AthFile as BPHY8_af
+BPHY8_f = BPHY8_af.fopen(athenaCommonFlags.PoolAODInput()[0])
+BPHY8cf.mcCampaign = 'unknown'
+if len(BPHY8_f.run_numbers) > 0:
+    BPHY8cf.runNumber = int(BPHY8_f.run_numbers[0])
+    if BPHY8cf.isSimulation and BPHY8cf.runNumber in BPHY8MCcampaigns:
+        BPHY8cf.mcCampaign = BPHY8MCcampaigns[BPHY8cf.runNumber]
+
+print("BPHY8: isSimulation = %s" % BPHY8cf.isSimulation)
+print("BPHY8: project tag  = %s" % BPHY8cf.projectTag)
+print("BPHY8: MC campaign  = %s" % BPHY8cf.mcCampaign)
+print("BPHY8: DerivationFrameworkHasTruth = %s" % \
+    DerivationFrameworkHasTruth)
+print("BPHY8: release 21 or up: %s" % BPHY8cf.isRelease21)
+
+#====================================================================
+# MC dataset categories (lists of dataset numbers)
+#====================================================================
+BPHY8cf.mcBsmumu          = [300203,300306,300307,300308,300402,300426,300430,300446,300447]
+BPHY8cf.mcBplusJpsiKplus  = [300203,300306,300307,300308,300997,300999,300404,300405,300406,300437]
+BPHY8cf.mcBsJpsiPhi       = [300203,300306,300307,300308,300401,300438,300448,300449]
+BPHY8cf.mcBplusJpsiPiplus = [300406,300437]
+BPHY8cf.mcBhh             = [300431,300432,300433,300434]
+BPHY8cf.mcNoTrigger       = [300446,300447,300448,300449]
+
+#====================================================================
+# Data datasets to receive special treatment
+#====================================================================
+# Remember our special runs used during validation
+## BPHY8cf.specDataRuns = [302393,339849,358096]
+BPHY8cf.specDataRuns = []
+#
+# for testing only
+## BPHY8cf.specDataRuns += [337491]
+
+#====================================================================
+# MC datasets to receive special treatment
+#====================================================================
+# Remember our special MC datasets used during validation
+## BPHY8cf.specMcChannels = [300307,300404,300405,300426,300430,300438]
+BPHY8cf.specMcChannels = []
+#
+#====================================================================
+# Defaults for BPHY8 configuration
+#====================================================================
+# 
+# Blind search setup
+#
+# Enable?
+BPHY8cf.doBmumuBlinding = True
+# Cut blinded values/vertices?
+BPHY8cf.doCutBlinded    = False
+## BPHY8cf.doCutBlinded = True
+# Blind only candidates where all muons are of quality tight
+BPHY8cf.blindOnlyAllMuonsTight = True
+# Variables to blind (of vertices)
+BPHY8cf.BlindedVars     = "Bsmumu_mass.Bsmumu_MUCALC_mass"
+# Pass flag indicating blinded candidates
+BPHY8cf.BlindingFlag    = "Bsmumu_blinded"
+# Blinding key for testing
+## BPHY8cf.BlindingKey     = "0b0408d1f5c4760e7d4b50e97095"
+# Blinding key for production
+# key for Run 2 - 2015/16 only analysis
+## BPHY8cf.BlindingKey     = "0b04087bdac4564252fd778ac351"
+# keys for full Run 2 analysis
+BPHY8_data15BlindingKey = "0b040820229968c09fec401ace33"
+BPHY8_data16BlindingKey = "0b04083901ad3d2bb3881ffca6a7"
+BPHY8_data17BlindingKey = "0b040831a13a9c83f9936cf5b703"
+BPHY8_data18BlindingKey = "0b040893fc715e9b346759bf4f3b"
+# default is data15
+BPHY8cf.BlindingKey = BPHY8_data15BlindingKey
+#
+# Thinning level
+# 0 - simple vertex thinning using Thin_vtxTrk.
+# 1 - thinning subdecay vertex candidates using Thin_vtxTrk.
+# 2 - thinning subdecay vertex candidates using BmumuThinningTool.
+# 3 - thinning subdecay vertex candidates using BmumuThinningTool,
+#     but keeping all PVs and refittedPVs
+# 4 - thinning subdecay vertex candidates using BmumuThinningTool,
+#     but keeping all PVs and refittedPVs and all ID tracks
+# 5 - thinning subdecay vertex candidates using BmumuThinningTool,
+#     but keeping all PVs, all refittedPVs, all ID tracks and all muons
+#
+BPHY8cf.thinLevel = 3
+#
+# Track particle collection
+BPHY8cf.TrkPartContName = "InDetTrackParticles"
+#
+# Primary vertex collection
+BPHY8cf.PVContName = "PrimaryVertices"
+#
+# Trigger navigation object thinning
+#
+# Apply thinning?
+BPHY8cf.doTrigNavThinning = True
+#
+# Keep muon based HLT items for now
+BPHY8cf.TrigNavThinList = [ "HLT_[0-9]*mu[0-9]+.*" ]
+#
+# Add containers for soft B tagging vertices
+BPHY8cf.doAddSoftBVertices = True
+#
+# Muon collection
+BPHY8cf.MuonCollection = "Muons"
+#
+# Apply MCP calibration to muons? (only for MC)
+#
+# Options:
+# 0 : none
+# 1 : apply calibration on-the-fly inside the muon container
+#     (calibration effects B candidate building)
+# 2 : apply calibration and store it in an extra container for
+#     calibrated muons
+#     (calibration does not effect B candidate building)
+# 3 : apply calibration and store it in an extra container for
+#     calibrated muons and use this container for B candidate building
+#
+BPHY8cf.useCalibratedMuons = 3
+## BPHY8cf.useCalibratedMuons = 2
+
+# make sure data are not affected
+# Update: Needs to be applied to data as well
+## if not BPHY8cf.isSimulation:
+##    BPHY8cf.useCalibratedMuons = 0
+
+#
+# Configuration for MuonCalibrationAndSmearingTool
+#
+# Set string values to "_READ_" to only read the default values
+# from the tool.
+#
+# THE FOLLOWING COMMENT IS VOID AS OF 2017-07-30. 
+# Note: Several JOs of the MuonCalibrationAndSmearingTool are not
+# (yet) available in AtlasDerivation-20.7.8.x caches which uses
+# MuonMomentumCorrections-01-00-35 instead of the latest
+# MuonMomentumCorrections-01-00-60.
+# For now these options will be disabled further below.
+#
+# Note: (2018-05-05 -> 2018-11-29)
+# Formerly used the rel. 21 pre-recommendations from
+# https://twiki.cern.ch/twiki/bin/view/AtlasProtected/MCPAnalysisGuidelinesMC16
+#
+# Note: (2018-11-29)
+# Now updated to new rel. 21 pre-recommendations
+# Page revision r18 (as of 2018-11-27)
+# https://twiki.cern.ch/twiki/bin/view/AtlasProtected/MCPAnalysisConsolidationMC16
+#
+# Note: (2020-01-15)
+# Now updated to new release 21 recommendatons for full run 2 (winter update)
+# Page revision r17 (as of 2019-11-13)
+# https://twiki.cern.ch/twiki/bin/view/AtlasProtected/MCPAnalysisWinterMC16#Momentum_corrections
+#
+# Note: (2020-03-31)
+# Now updated to new release 21 recommendations for full run 2 / setup 1
+# Page reivision r37 (as of 2020-03-23)
+# https://twiki.cern.ch/twiki/bin/view/AtlasProtected/MCPAnalysisGuidelinesMC16#Momentum_corrections
+#
+# MC
+if BPHY8cf.isSimulation:
+#
+# for MC16a
+    if BPHY8cf.mcCampaign == "mc16a":
+        BPHY8cf.McstYear                  = "Data16"
+        BPHY8cf.McstRelease               = "Recs2020_03_03"
+        BPHY8cf.McstStatComb              = False
+        BPHY8cf.McstSagittaCorr           = True
+        BPHY8cf.McstSagittaRelease        = "sagittaBiasDataAll_03_02_19_Data16"
+        BPHY8cf.McstDoSagittaMCDistortion = False
+        BPHY8cf.McstSagittaCorrPhaseSpace = True
+#
+# for MC16d
+    elif BPHY8cf.mcCampaign == "mc16d":
+        BPHY8cf.McstYear                  = "Data17"
+        BPHY8cf.McstRelease               = "Recs2020_03_03"
+        BPHY8cf.McstStatComb              = False
+        BPHY8cf.McstSagittaCorr           = True
+        BPHY8cf.McstSagittaRelease        = "sagittaBiasDataAll_03_02_19_Data17"
+        BPHY8cf.McstDoSagittaMCDistortion = False
+        BPHY8cf.McstSagittaCorrPhaseSpace = True
+#
+# for MC16e
+    elif BPHY8cf.mcCampaign == "mc16e":
+        BPHY8cf.McstYear                  = "Data18"
+        BPHY8cf.McstRelease               = "Recs2020_03_03"
+        BPHY8cf.McstStatComb              = False
+        BPHY8cf.McstSagittaCorr           = True
+        BPHY8cf.McstSagittaRelease        = "sagittaBiasDataAll_03_02_19_Data18"
+        BPHY8cf.McstDoSagittaMCDistortion = False
+        BPHY8cf.McstSagittaCorrPhaseSpace = True
+#
+# default (like for mc16a)
+    else:
+        BPHY8cf.McstYear                  = "Data16"
+        BPHY8cf.McstRelease               = "Recs2020_03_03"
+        BPHY8cf.McstStatComb              = False
+        BPHY8cf.McstSagittaCorr           = True
+        BPHY8cf.McstSagittaRelease        = "sagittaBiasDataAll_03_02_19_Data16"
+        BPHY8cf.McstDoSagittaMCDistortion = False
+        BPHY8cf.McstSagittaCorrPhaseSpace = True
+#
+# data 15
+else:
+    # Note: The recommendation page sets McstYear to 'Data16'
+    if BPHY8cf.projectTag.startswith("data15"):
+        BPHY8cf.McstYear                  = "Data16"
+        BPHY8cf.McstRelease               = "Recs2020_03_03"
+        BPHY8cf.McstStatComb              = False
+        BPHY8cf.McstSagittaCorr           = True
+        BPHY8cf.McstSagittaRelease        = "sagittaBiasDataAll_03_02_19_Data16"
+        BPHY8cf.McstDoSagittaMCDistortion = False
+        BPHY8cf.McstSagittaCorrPhaseSpace = True
+#
+# data 16
+    if BPHY8cf.projectTag.startswith("data16"):
+        BPHY8cf.McstYear                  = "Data16"
+        BPHY8cf.McstRelease               = "Recs2020_03_03"
+        BPHY8cf.McstStatComb              = False
+        BPHY8cf.McstSagittaCorr           = True
+        BPHY8cf.McstSagittaRelease        = "sagittaBiasDataAll_03_02_19_Data16"
+        BPHY8cf.McstDoSagittaMCDistortion = False
+        BPHY8cf.McstSagittaCorrPhaseSpace = True
+#
+# data 17
+    if BPHY8cf.projectTag.startswith("data17"):
+        BPHY8cf.McstYear                  = "Data17"
+        BPHY8cf.McstRelease               = "Recs2020_03_03"
+        BPHY8cf.McstStatComb              = False
+        BPHY8cf.McstSagittaCorr           = True
+        BPHY8cf.McstSagittaRelease        = "sagittaBiasDataAll_03_02_19_Data17"
+        BPHY8cf.McstDoSagittaMCDistortion = False
+        BPHY8cf.McstSagittaCorrPhaseSpace = True
+#
+# data 18
+    if BPHY8cf.projectTag.startswith("data18"):
+        BPHY8cf.McstYear                  = "Data18";
+        BPHY8cf.McstRelease               = "Recs2020_03_03"
+        BPHY8cf.McstStatComb              = False
+        BPHY8cf.McstSagittaCorr           = True
+        BPHY8cf.McstSagittaRelease        = "sagittaBiasDataAll_03_02_19_Data18"
+        BPHY8cf.McstDoSagittaMCDistortion = False
+        BPHY8cf.McstSagittaCorrPhaseSpace = True
+
+# wide mumu mass range?
+BPHY8cf.doUseWideMuMuMassRange = False
+
+# other default settings
+BPHY8cf.GlobalChi2CutBase    = 15.
+
+# Global mass values (in MeV, from PDG 2015)
+BPHY8cf.GlobalMuonMass  = 105.6584
+BPHY8cf.GlobalPionMass  = 139.57061
+BPHY8cf.GlobalKaonMass  = 493.677
+BPHY8cf.GlobalJpsiMass  = 3096.92
+BPHY8cf.GlobalBplusMass = 5279.29
+BPHY8cf.GlobalB0Mass    = 5279.61
+BPHY8cf.GlobalBsMass    = 5366.79
+
+# Cut values for kaon candidates
+BPHY8cf.GlobalKaonPtCut  = 1000.
+BPHY8cf.GlobalKaonEtaCut = 2.5
+
+# primary vertex association types (interpreted bit-wise)
+## BPHY8cf.doVertexType   = 15 # ALL
+BPHY8cf.doVertexType   = 8  # only Z0_BA
+## BPHY8cf.doVertexType   = 9   # only SUM_PT2 and Z0_BA
+
+# minimum number of tracks in PV considered for PV association
+BPHY8cf.minNTracksInPV = 3
+
+# add 3-dimensional proper time information?
+BPHY8cf.do3dProperTime = True
+
+# use invariant mass based on combined muon track information in mass cuts?
+BPHY8cf.useMuCalcMass = True
+
+# add MUCALC mass from non-modified muons for debugging
+BPHY8cf.addMucalcMassForDebug = False
+
+# PV types to be considered in calculation of minLogChi2ToAnyPV variable
+BPHY8cf.MinChi2ToAnyPVTypes = [1, 3]
+
+# MCP cuts for JpsiFinder
+BPHY8cf.useJpsiFinderMCPCuts = False
+
+# reject muons in JpsiPlus1Track or JpsiPlus2Track finders
+BPHY8cf.GlobalMuonsUsedInJpsi = "NONE"  # default to turn it off
+
+# mode of minLogChi2ToAnyPV calculation:
+#   0 : no such calculation
+#   1 : use all PVs of requested type(s)
+#   2 : exclude PVs associated to SVs
+#   3 : replace PVs associated to SVs by
+#       corresponding refitted PVs
+BPHY8cf.AddMinChi2ToAnyPVMode = 3
+
+# Vertex isolation -- track selection requirements
+# (Sizes of all lists below need to be identical!)
+# Set to "Custom" (for strings) or -1. (for numerics) to disable setting
+BPHY8cf.IsoTrackCategoryName = ["LoosePt05", "LooSiHi1Pt05"]
+BPHY8cf.IsoTrackCutLevel     = ["Loose"    , "Loose"       ]
+BPHY8cf.IsoTrackPtCut        = [   500.    ,    500.       ]
+BPHY8cf.IsoTrackEtaCut       = [    -1.    ,     -1.       ]
+BPHY8cf.IsoTrackPixelHits    = [    -1     ,      1        ]
+BPHY8cf.IsoTrackSCTHits      = [    -1     ,      2        ]
+BPHY8cf.IsoTrackbLayerHits   = [    -1     ,     -1        ]
+BPHY8cf.IsoTrackIBLHits      = [    -1     ,     -1        ]
+# Vertex isolation -- cone sizes
+# (Sizes of all lists below need to be identical!)
+# Note: IsoDoTrkImpLogChi2Cut = 2 implements old method used
+#       for the 2015/16 analysis
+BPHY8cf.IsolationConeSizes    = [ 0.7, 0.7, 1.0]
+BPHY8cf.IsoTrkImpLogChi2Max   = [ 5.0, 5.0, 0.0]
+BPHY8cf.IsoDoTrkImpLogChi2Cut = [ 2  , 1  , 0  ]
+# Track types to be used (bit pattern)
+# track sets to consider:
+# bit : meaning
+#  0   : tracks close to PV associated
+#        with SV
+#  1   : tracks associated with dummy PV
+#        ("type-0 PV tracks")
+#  2   : tracks associated with PV of type 1
+#  3   : tracks associated with PV of type 2
+#  4   : tracks associated with PV of type 3
+#  5   : tracks associated with PV with types other than 0 to 4.
+#  6   : tracks with missing pointer to PV (NULL pointer)
+#  7-24: tracks being closest to assoc. PV
+#            decimal  useRefittedPVs doDCAin3D chi2DefToUse
+#  7   :        128        yes           no        0
+#  8   :        256        no            no        0
+#  9   :        512        yes           yes       0
+#  10  :       1024        no            yes       0
+#  11  :       2048        yes           no        1
+#  12  :       4096        no            no        1
+#  13  :       8192        yes           yes       1
+#  14  :      16384        no            yes       1
+#  15  :      32768        yes           no        2
+#  16  :      65536        no            no        2
+#  17  :     131072        yes           yes       2
+#  18  :     262144        no            yes       2
+#  19  :     524288        yes           --        3
+#  20  :    1048576        no            --        3
+#  21  :    2097152        yes           --        4
+#  22  :    4194304        no            --        4
+#  23  :    8388608        yes           --        5
+#  24  :   16777216        no            --        5
+#  25  :   33554432        yes           yes       6
+#  26  :   67108864        no            yes       6
+#  27  :  134217728        yes           yes       7
+#  28  :  268435456        no            yes       7
+#  29  :  536870912        yes           yes       8
+#  30  : 1073741824        no            yes       8
+#  31  : 2147483648        yes           yes       9
+#  32  : 4294967296        no            yes       9
+#        useRefittedPVs:
+#          replace PV associated to decay candidate
+#          by the refitted PV
+#        doDCAin3D:
+#          use d0 and z0 in the determination of
+#          of the point of closest approach of
+#          a track to a vertex
+#        chi2DefToUse:
+#          PV uncertainties in the chi2 calculation
+#          in addition to track uncertainties
+#          0 : from track perigee (old method)
+#              (only track uncertainties)
+#          1 : from track perigee with
+#              uncertainties from track and vertex
+#          2 : simple extrapolation from track
+#              parameters with uncertainties from
+#              track and vertex (extrapolation
+#              used for track swimming)
+#          3 : CalcLogChi2toPV method from NtupleMaker
+#              using xAOD::TrackingHelpers.
+#              (only track uncertainties)
+#          4 : CalcLogChi2toPV method from NtupleMaker
+#              using xAOD::TrackingHelpers.
+#              (track and vertex uncertainties)
+#          5 : use TrackVertexAssociationTool
+#          6 : full 3D chi2 from track perigee with uncertainties
+#              from track and vertex (sum of 3x3 covariance matrices)
+#          7 : full 3D chi2 from track perigee with uncertainties
+#              from track and vertex (sum of 2x2 covariance matrices)
+#          8 : simple extrapolation from track parameters with uncertainties
+#              from track and vertex (sum of 3x3 covariance matrices)
+#          9   simple extrapolation from track parameters with uncertainties
+#              from track and vertex (sum of 2x2 covariance matrices)
+#        (E.g. 127 means to consider all tracks.)
+BPHY8cf.useIsoTrackTypes    = [ 35, 8388608, 134217728, 127]
+# Working point for TrackVertexAssociationTool (for chi2DefToUse == 5)
+BPHY8cf.IsoTvaWorkingPoint = "Loose"
+# use of speed-optimized algorithm
+BPHY8cf.IsoUseOptimizedAlgo = True
+## BPHY8cf.IsoUseOptimizedAlgo = False
+#
+# Combinations to keep: save from removal as non-needed branches
+# Tuples: (isolation settings|track types|ID track selection)
+# Note: use an empty list to keep all
+BPHY8cf.IsoIncludes = ['07_LC50d2|35|LoosePt05',            # ACH
+                       '10_LC00d0|134217728|LooSiHi1Pt05',  # BEJ
+                       '10_LC00d0|8388608|LooSiHi1Pt05',    # BGJ
+                       '07_LC50d1|127|LooSiHi1Pt05'       ] # BDI
+
+# Isolation for muons from B candidate -- track selection requirements
+# (Sizes of all lists below need to be identical!)
+# Set to "Custom" (for strings) or -1. (for numerics) to disable setting
+BPHY8cf.MuIsoTrackCategoryName = ["LoosePt05", "LooSiHi1Pt05"]
+BPHY8cf.MuIsoTrackCutLevel     = ["Loose"    , "Loose"       ]
+BPHY8cf.MuIsoTrackPtCut        = [    500.   ,    500.       ]
+BPHY8cf.MuIsoTrackEtaCut       = [     -1.   ,     -1.       ]
+BPHY8cf.MuIsoTrackPixelHits    = [     -1    ,      1        ]
+BPHY8cf.MuIsoTrackSCTHits      = [     -1    ,      2        ]
+BPHY8cf.MuIsoTrackbLayerHits   = [     -1    ,     -1        ]
+BPHY8cf.MuIsoTrackIBLHits      = [     -1    ,     -1        ]
+# Muon isolation -- cone sizes
+# (Sizes of all lists below need to be identical!)
+# Note: MuIsoDoTrkImpLogChi2Cut = 2 implements old method used
+#       for the 2015/16 analysis
+BPHY8cf.MuIsolationConeSizes    = [ 0.7, 0.7, 1.0]
+BPHY8cf.MuIsoTrkImpLogChi2Max   = [ 5.0, 5.0, 0.0]
+BPHY8cf.MuIsoDoTrkImpLogChi2Cut = [ 2  , 1  , 0  ]
+# Track types to be used (bit pattern)
+# track sets to consider:
+# bit : meaning
+#  0   : tracks close to PV associated
+#        with SV
+#  1   : tracks associated with dummy PV
+#        ("type-0 PV tracks")
+#  2   : tracks associated with PV of type 1
+#  3   : tracks associated with PV of type 2
+#  4   : tracks associated with PV of type 3
+#  5   : tracks associated with PV with types other than 0 to 4.
+#  6   : tracks with missing pointer to PV (NULL pointer)
+#  7-24: tracks being closest to assoc. PV
+#            decimal  useRefittedPVs doDCAin3D chi2DefToUse
+#  7   :        128        yes           no        0
+#  8   :        256        no            no        0
+#  9   :        512        yes           yes       0
+#  10  :       1024        no            yes       0
+#  11  :       2048        yes           no        1
+#  12  :       4096        no            no        1
+#  13  :       8192        yes           yes       1
+#  14  :      16384        no            yes       1
+#  15  :      32768        yes           no        2
+#  16  :      65536        no            no        2
+#  17  :     131072        yes           yes       2
+#  18  :     262144        no            yes       2
+#  19  :     524288        yes           --        3
+#  20  :    1048576        no            --        3
+#  21  :    2097152        yes           --        4
+#  22  :    4194304        no            --        4
+#  23  :    8388608        yes           --        5
+#  24  :   16777216        no            --        5
+#  25  :   33554432        yes           yes       6
+#  26  :   67108864        no            yes       6
+#  27  :  134217728        yes           yes       7
+#  28  :  268435456        no            yes       7
+#  29  :  536870912        yes           yes       8
+#  30  : 1073741824        no            yes       8
+#  31  : 2147483648        yes           yes       9
+#  32  : 4294967296        no            yes       9
+#        useRefittedPVs:
+#          replace PV associated to decay candidate
+#          by the refitted PV
+#        doDCAin3D:
+#          use d0 and z0 in the determination of
+#          of the point of closest approach of
+#          a track to a vertex
+#        chi2DefToUse:
+#          PV uncertainties in the chi2 calculation
+#          in addition to track uncertainties
+#          0 : from track perigee (old method)
+#              (only track uncertainties)
+#          1 : from track perigee with
+#              uncertainties from track and vertex
+#          2 : simple extrapolation from track
+#              parameters with uncertainties from
+#              track and vertex (extrapolation
+#              used for track swimming)
+#          3 : CalcLogChi2toPV method from NtupleMaker
+#              using xAOD::TrackingHelpers.
+#              (only track uncertainties)
+#          4 : CalcLogChi2toPV method from NtupleMaker
+#              using xAOD::TrackingHelpers.
+#              (track and vertex uncertainties)
+#          5 : use TrackVertexAssociationTool
+#          6 : full 3D chi2 from track perigee with uncertainties
+#              from track and vertex (sum of 3x3 covariance matrices)
+#          7 : full 3D chi2 from track perigee with uncertainties
+#              from track and vertex (sum of 2x2 covariance matrices)
+#          8 : simple extrapolation from track parameters with uncertainties
+#              from track and vertex (sum of 3x3 covariance matrices)
+#          9   simple extrapolation from track parameters with uncertainties
+#              from track and vertex (sum of 2x2 covariance matrices)
+#        (E.g. 127 means to consider all tracks.)
+BPHY8cf.useMuIsoTrackTypes    = [ 35, 8388608, 134217728, 127]
+# Working point for TrackVertexAssociationTool (for chi2DefToUse == 5)
+BPHY8cf.MuIsoTvaWorkingPoint = "Loose"
+#
+# Combinations to keep: save from removal as non-needed branches
+# Tuples: (isolation settings|track types|ID track selection)
+# Note: use an empty list to keep all
+BPHY8cf.MuIsoIncludes = ['07_LC50d2|35|LoosePt05',            # ACH
+                         '10_LC00d0|134217728|LooSiHi1Pt05',  # BEJ
+                         '10_LC00d0|8388608|LooSiHi1Pt05',    # BGJB
+                         '07_LC50d1|127|LooSiHi1Pt05'       ] # BDI
+
+# Closest track finding -- track selection requirements
+# Set to "Custom" (for strings) or -1. (for numerics) to disable setting
+BPHY8cf.CloseTrackCategoryName = ["LoosePt05", "LooSiHi1Pt05"]
+BPHY8cf.CloseTrackCutLevel     = ["Loose"    , "Loose"       ]
+BPHY8cf.CloseTrackPtCut        = [   500.    ,    500.       ]
+BPHY8cf.CloseTrackEtaCut       = [    -1.    ,     -1.       ]
+BPHY8cf.CloseTrackPixelHits    = [    -1     ,      1        ]
+BPHY8cf.CloseTrackSCTHits      = [    -1     ,      2        ]
+BPHY8cf.CloseTrackbLayerHits   = [    -1     ,     -1        ]
+BPHY8cf.CloseTrackIBLHits      = [    -1     ,     -1        ]
+# Track types to be used (bit pattern)
+# track sets to consider:
+# bit : meaning
+#  0   : tracks close to PV associated
+#        with SV
+#  1   : tracks associated with dummy PV
+#        ("type-0 PV tracks")
+#  2   : tracks associated with PV of type 1
+#  3   : tracks associated with PV of type 2
+#  4   : tracks associated with PV of type 3
+#  5   : tracks associated with PV with types other than 0 to 4.
+#  6   : tracks with missing pointer to PV (NULL pointer)
+#  7-24: tracks being closest to assoc. PV
+#            decimal  useRefittedPVs doDCAin3D chi2DefToUse
+#  7   :        128        yes           no        0
+#  8   :        256        no            no        0
+#  9   :        512        yes           yes       0
+#  10  :       1024        no            yes       0
+#  11  :       2048        yes           no        1
+#  12  :       4096        no            no        1
+#  13  :       8192        yes           yes       1
+#  14  :      16384        no            yes       1
+#  15  :      32768        yes           no        2
+#  16  :      65536        no            no        2
+#  17  :     131072        yes           yes       2
+#  18  :     262144        no            yes       2
+#  19  :     524288        yes           --        3
+#  20  :    1048576        no            --        3
+#  21  :    2097152        yes           --        4
+#  22  :    4194304        no            --        4
+#  23  :    8388608        yes           --        5
+#  24  :   16777216        no            --        5
+#  25  :   33554432        yes           yes       6
+#  26  :   67108864        no            yes       6
+#  27  :  134217728        yes           yes       7
+#  28  :  268435456        no            yes       7
+#  29  :  536870912        yes           yes       8
+#  30  : 1073741824        no            yes       8
+#  31  : 2147483648        yes           yes       9
+#  32  : 4294967296        no            yes       9
+#        useRefittedPVs:
+#          replace PV associated to decay candidate
+#          by the refitted PV
+#        doDCAin3D:
+#          use d0 and z0 in the determination of
+#          of the point of closest approach of
+#          a track to a vertex
+#        chi2DefToUse:
+#          PV uncertainties in the chi2 calculation
+#          in addition to track uncertainties
+#          0 : from track perigee (old method)
+#              (only track uncertainties)
+#          1 : from track perigee with
+#              uncertainties from track and vertex
+#          2 : simple extrapolation from track
+#              parameters with uncertainties from
+#              track and vertex (extrapolation
+#              used for track swimming)
+#          3 : CalcLogChi2toPV method from NtupleMaker
+#              using xAOD::TrackingHelpers.
+#              (only track uncertainties)
+#          4 : CalcLogChi2toPV method from NtupleMaker
+#              using xAOD::TrackingHelpers.
+#              (track and vertex uncertainties)
+#          5 : use TrackVertexAssociationTool
+#          6 : full 3D chi2 from track perigee with uncertainties
+#              from track and vertex (sum of 3x3 covariance matrices)
+#          7 : full 3D chi2 from track perigee with uncertainties
+#              from track and vertex (sum of 2x2 covariance matrices)
+#          8 : simple extrapolation from track parameters with uncertainties
+#              from track and vertex (sum of 3x3 covariance matrices)
+#          9   simple extrapolation from track parameters with uncertainties
+#              from track and vertex (sum of 2x2 covariance matrices)
+#        (E.g. 127 means to consider all tracks.)
+#
+# Correspondence to Run 1 settings:
+#
+# Option to only use tracks from specific primary vertices:
+# (always excluding B decay tracks)
+#  CloseTrackOption:
+# old  new  
+#  0 : 63 : use all tracks (default)
+#  1 :  1 : use only tracks from PV associated with B vertex
+#  2 :  1 : use all tracks which are not from PVs other than 
+#           PV associated with B vertex 
+#  3 : 35 : use all tracks which are not from PVs other than
+#           PV associated with B vertex but including those
+#           from the dummy vertex (type 0 vertex)
+#  4 : 127: same as option 3 but using the vertex pointers 
+#           for comparing in old setup; including tracks
+#           with broken (NULL) vertex pointers as well
+BPHY8cf.useCloseTrackTypes    = [ 35, 8388608, 134217728]
+# Working point for TrackVertexAssociationTool (for chi2DefToUse == 5)
+BPHY8cf.CloseTrackTvaWorkingPoint = "Loose"
+#
+# Close tracks chi2 related settings
+# (The next five lists need to be exactly of the same length.)
+BPHY8cf.CloseTrackChi2SetName = [ "201516", "f2dc2" ]
+# use corrected chi2 calculation including SV uncertainties
+#   0 : from track perigee (old method, only track uncertainties)
+#   1 : from track perigee with uncertainties from track and vertex
+#   2 : simple extrapolation from track parameters with uncertainties
+#       from track and vertex (extrapolation used for track swimming)
+#   3 : CalcLogChi2toPV method from NtupleMaker using xAOD::TrackingHelpers.
+#       (only track uncertainties)
+#   4 : CalcLogChi2toPV method from NtupleMaker using xAOD::TrackingHelpers.
+#       (track and vertex uncertainties)
+#   5 : use TrackVertexAssociationTool
+#   6 : full 3D chi2 from track perigee with uncertainties
+#       from track and vertex (sum of 3x3 covariance matrices)
+#   7 : full 3D chi2 from track perigee with uncertainties
+#       from track and vertex (sum of 2x2 covariance matrices)
+#   8 : simple extrapolation from track parameters with uncertainties
+#       from track and vertex (sum of 3x3 covariance matrices)
+#   9   simple extrapolation from track parameters with uncertainties
+#       from track and vertex (sum of 2x2 covariance matrices)
+# N.B.: Settings 3, 4 and 5 may be less reasonable here. Do not use.
+BPHY8cf.CloseTrackCorrChi2    = [ 0       , 7    ]
+# use 3-dimensional information in minimization
+BPHY8cf.CloseTrackMinDCAin3D  = [ True    , True ]
+# maximum chi2 distance of closest track to B vertex
+BPHY8cf.CloseTrackMaxLogChi2  = [ 7.      , 7.   ]
+# maximum chi2 distance of closest track to B vertex for track counting
+BPHY8cf.NCloseTrackMaxLogChi2 = [ 1.      , 2.   ]
+#
+# Combinations to keep: save from removal as non-needed branches
+# Tuples: (close track chi2 set|track types|ID track selection)
+# Note: use an empty list to keep all
+BPHY8cf.CloseTrackIncludes = ['201516|35|LoosePt05',           # ACK
+                              'f2dc2|134217728|LooSiHi1Pt05',  # BEL
+                              'f2dc2|8388608|LooSiHi1Pt05'   ] # BGL
+
+# track/muon isolation and closest track tools
+# debugging level for track types (output to log)
+# (Set to 1 to enable, 0 otherwise.)
+BPHY8cf.DebugTrackTypes = 0
+
+# BTrackVertexMapLogger / BPhysTrackVertexMapTools
+# maximum number of events to dump track-to-vertex assoc. maps for
+# (Set to -1 for no limit, to 0 to disable.)
+BPHY8cf.DebugTrkToVtxMaxEvents = 0
+#====================================================================
+# General job setup
+#====================================================================
+# for MC run specific channel(s) only,
+# for data run 2-, 3- and 4-prong algorithms in parallel
+if BPHY8cf.isSimulation:
+    # MC channel number (ie dataset number for MC)
+    if len(BPHY8_f.infos['mc_channel_number']) > 0:
+        BPHY8cf.mcChNumber = int((BPHY8_f.infos['mc_channel_number'])[0])
+        if (BPHY8cf.mcChNumber in BPHY8cf.mcBsmumu):
+            BPHY8cf.doChannels.append("Bsmumu") 
+        if (BPHY8cf.mcChNumber in BPHY8cf.mcBplusJpsiKplus):
+            BPHY8cf.doChannels.append("BJpsiK")
+        if (BPHY8cf.mcChNumber in BPHY8cf.mcBsJpsiPhi):
+            BPHY8cf.doChannels.append("BsJpsiPhi")
+        if (BPHY8cf.mcChNumber in BPHY8cf.mcBplusJpsiPiplus):
+            BPHY8cf.doChannels.append("BJpsiPi")
+        if (BPHY8cf.mcChNumber in BPHY8cf.mcBhh):
+            BPHY8cf.doChannels.append("Bhh")
+        # use trigger?
+        if (BPHY8cf.mcChNumber in BPHY8cf.mcNoTrigger):
+            BPHY8cf.doTriggerInfo = False
+    # for special MC channels keep all ID tracks and all muons
+    if BPHY8cf.mcChNumber in BPHY8cf.specMcChannels: 
+        BPHY8cf.thinLevel = 5
+    # no blind search for MC
+    BPHY8cf.doBmumuBlinding = False
+else:
+    # for data
+    BPHY8cf.doChannels += ["Bsmumu", "BJpsiK", "BsJpsiPhi"]
+    # for special data runs keep all ID tracks and all muons
+    if BPHY8cf.runNumber in BPHY8cf.specDataRuns: 
+        BPHY8cf.thinLevel = 5
+    # blinding key by year
+    if BPHY8cf.projectTag.startswith("data15"):
+        BPHY8cf.BlindingKey = BPHY8_data15BlindingKey
+    elif BPHY8cf.projectTag.startswith("data16"):
+        BPHY8cf.BlindingKey = BPHY8_data16BlindingKey
+    elif BPHY8cf.projectTag.startswith("data17"):
+        BPHY8cf.BlindingKey = BPHY8_data17BlindingKey
+    elif BPHY8cf.projectTag.startswith("data18"):
+        BPHY8cf.BlindingKey = BPHY8_data18BlindingKey
+
+# disable soft B tagging vertices if BJpsiK channel is not run
+if not "BJpsiK" in BPHY8cf.doChannels:
+    BPHY8cf.doAddSoftBVertices = False
+
+print("BPHY8 job setup: run               : %d" % BPHY8cf.runNumber)
+print("BPHY8 job setup: MC channel number : %d" % BPHY8cf.mcChNumber)
+print("BPHY8 job setup: isSimulation      : %s" % BPHY8cf.isSimulation)
+print("BPHY8 job setup: doChannels        :", end=' ')
+for BPHY8_channel in BPHY8cf.doChannels:
+    print("%s" % (BPHY8_channel), end=' ')
+print()
+print("BPHY8 job setup: thin level        : %d" % BPHY8cf.thinLevel)
+print("BPHY8 job setup: soft B vertices   : %d" % BPHY8cf.doAddSoftBVertices)
+
+# abort if no channels are to be run on
+assert len(BPHY8cf.doChannels) > 0
+
+#====================================================================
+# Mass ranges
+#====================================================================
+BPHY8cf.GlobalBMassUpperCut      = 7000.
+BPHY8cf.GlobalBMassLowerCut      = 3500.
+BPHY8cf.GlobalTrksMassUpperCut   = 7500.
+BPHY8cf.GlobalTrksMassLowerCut   = 3000.
+BPHY8cf.GlobalDiMuonMassUpperCut = 7000.
+BPHY8cf.GlobalDiMuonMassLowerCut = 2000.
+BPHY8cf.GlobalJpsiMassUpperCut   = 7000.
+BPHY8cf.GlobalJpsiMassLowerCut   = 2000.
+BPHY8cf.GlobalBlindLowerCut      = 5166.
+BPHY8cf.GlobalBlindUpperCut      = 5526.
+
+if BPHY8cf.doUseWideMuMuMassRange:
+    BPHY8cf.GlobalBMassUpperCut      = 10000.
+    BPHY8cf.GlobalBMassLowerCut      =  3250.
+    BPHY8cf.GlobalTrksMassUpperCut   = 10500.
+    BPHY8cf.GlobalTrksMassLowerCut   =  2750.
+    BPHY8cf.GlobalDiMuonMassUpperCut = 10000.
+    BPHY8cf.GlobalDiMuonMassLowerCut =  2000.
+    BPHY8cf.GlobalJpsiMassUpperCut   = 10000.
+    BPHY8cf.GlobalJpsiMassLowerCut   =  2000.
+
+#====================================================================
+# Vertexing chi2 cuts for n-prong decays
+#====================================================================
+# The global chi2 cut times NdF
+BPHY8cf.Chi2Cut2Prong = BPHY8cf.GlobalChi2CutBase * 1.
+BPHY8cf.Chi2Cut3Prong = BPHY8cf.GlobalChi2CutBase * 4.
+BPHY8cf.Chi2Cut4Prong = BPHY8cf.GlobalChi2CutBase * 6.
+
+#====================================================================
+# Muons or tracks for JpsiFinder
+#====================================================================
+BPHY8cf.JfTwoMuons         = True
+BPHY8cf.JfTwoTracks        = False
+BPHY8cf.JfTrackThresholdPt = 0. # MeV
+if "Bhh" in BPHY8cf.doChannels:
+    BPHY8cf.JfTwoMuons         = False
+    BPHY8cf.JfTwoTracks        = True
+    BPHY8cf.JfTrackThresholdPt = 3500. # MeV
+    
+#====================================================================
+# DEBUGGING SETUP
+#====================================================================
+#
+# Dump contents of this file to log
+if BPHY8cf.verbose > 4:
+    import inspect
+    thisfile = inspect.getfile(inspect.currentframe())
+    print("# >>>------------------ %s ------------------------" % thisfile)
+    with open (thisfile, 'r') as fin:
+        print(fin.read())
+    print("# <<<------------------ %s ------------------------" % thisfile)
+
+# required for track jets for Soft B Tagging
+if BPHY8cf.doAddSoftBVertices:
+    from DerivationFrameworkJetEtMiss.JetCommon import *
+    
+#====================================================================
+# CALIBRATION SEQUENCES
+#====================================================================
+#
+# For parameters of the MuonCalibrationAndSmearingTool see:
+# https://twiki.cern.ch/twiki/bin/view/AtlasProtected/MCPAnalysisGuidelinesMC15#Muon_momentum_scale_and_resoluti
+#
+# ordered dicts
+from collections import OrderedDict
+BPHY8_CalibrationAlgs = OrderedDict()
+
+# Create calibrated muons if requested
+BPHY8cf.CalMuonCollection  = BPHY8cf.MuonCollection
+BPHY8cf.UsedMuonCollection = BPHY8cf.MuonCollection
+BPHY8cf.AllMuonCollections = [ BPHY8cf.MuonCollection ]
+if BPHY8cf.useCalibratedMuons > 0:
+    BPHY8cf.adjustMucalcKinematics = True    
+    if BPHY8cf.useCalibratedMuons > 1:
+        BPHY8cf.CalMuonCollection = BPHY8cf.DerivationName+"_CalibratedMuons"
+        BPHY8cf.adjustMucalcKinematics = False
+        BPHY8cf.AllMuonCollections += [ BPHY8cf.CalMuonCollection ]
+    if BPHY8cf.useCalibratedMuons > 2:
+        BPHY8cf.UsedMuonCollection = BPHY8cf.CalMuonCollection
+        BPHY8cf.adjustMucalcKinematics = True
+    BPHY8_MuonCalTool = CfgMgr.CP__MuonCalibrationAndSmearingTool(
+        BPHY8cf.DerivationName+"_MCPTool",
+        OutputLevel            = INFO )
+    if BPHY8cf.McstYear != "_READ_":
+        BPHY8_MuonCalTool.Year = BPHY8cf.McstYear
+    if BPHY8cf.McstRelease != "_READ_":
+        BPHY8_MuonCalTool.Release = BPHY8cf.McstRelease
+    # read back string values
+    BPHY8cf.McstYear           = getPropertyValue(BPHY8_MuonCalTool, "Year")
+    BPHY8cf.McstRelease        = getPropertyValue(BPHY8_MuonCalTool, "Release")
+    # additional options for MuonMomentumCorrections-01-00-64 and up
+    # Don't decorate with Eigen (from MuonMomentumCorrections-01-00-62
+    # onwards, see ATLASG-1126)
+    BPHY8_MuonCalTool.noEigenDecor          = True
+    BPHY8_MuonCalTool.StatComb              = BPHY8cf.McstStatComb
+    BPHY8_MuonCalTool.SagittaCorr           = BPHY8cf.McstSagittaCorr
+    BPHY8_MuonCalTool.doSagittaMCDistortion = BPHY8cf.McstDoSagittaMCDistortion
+    BPHY8_MuonCalTool.SagittaCorrPhaseSpace = BPHY8cf.McstSagittaCorrPhaseSpace
+    if BPHY8cf.McstSagittaRelease != "_READ_":
+        BPHY8_MuonCalTool.SagittaRelease = BPHY8cf.McstSagittaRelease
+    # read back string value
+    BPHY8cf.McstSagittaRelease = getPropertyValue(BPHY8_MuonCalTool,
+                                                  "SagittaRelease")
+    ToolSvc +=  BPHY8_MuonCalTool
+    print(BPHY8_MuonCalTool)
+    pprint(BPHY8_MuonCalTool.properties())
+    BPHY8_CalibrationAlgs["CalMuonProvider"] = CfgMgr.CP__CalibratedMuonsProvider(
+        BPHY8cf.DerivationName+"_CalMuonProvider",
+        Input       = BPHY8cf.MuonCollection,
+        Output      = BPHY8cf.CalMuonCollection,
+        Tool        = BPHY8_MuonCalTool,
+        OutputLevel = INFO )  # output only if set to VERBOSE
+
+# for quick debugging
+## BPHY8cf.adjustMucalcKinematics = False
+    
+for BPHY8_name in list(BPHY8_CalibrationAlgs.keys()):
+    print(BPHY8_CalibrationAlgs[BPHY8_name]) 
+    pprint(BPHY8_CalibrationAlgs[BPHY8_name].properties())
+
+#====================================================================
+# Muon extrapolation for trigger scaling
+#====================================================================
+# Introduced by BPhys trigger group, see merge request 7857
+# (https://gitlab.cern.ch/atlas/athena/merge_requests/7857)
+#
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf \
+    import DerivationFramework__MuonExtrapolationTool
+
+BPHY8_MuonExtrapTool = DerivationFramework__MuonExtrapolationTool(
+    name           = "BPHY8_MuonExtrapolationTool",
+    MuonCollection = BPHY8cf.UsedMuonCollection,
+    OutputLevel    = INFO )
+
+ToolSvc += BPHY8_MuonExtrapTool
+print(BPHY8_MuonExtrapTool)
+pprint(BPHY8_MuonExtrapTool.properties())
+
+#====================================================================
+# AUGMENTATION TOOLS 
+#====================================================================
+# setup vertexing tools and services
+# superseeded by BPHYVertexTools
+## include( "JpsiUpsilonTools/configureServices.py" )
+
+# we need to have the DiMuon finder running for channels with Jpsi as well
+BPHY8_recoList = []
+if [BPHY8_i for BPHY8_i in BPHY8cf.doChannels \
+    if BPHY8_i in ["Bsmumu", "BJpsiK", "BsJpsiPhi", "BJpsiPi", "Bhh"]]:
+    BPHY8_recoList += ["DiMuon"]
+if "BJpsiK"    in BPHY8cf.doChannels: BPHY8_recoList += [ "BJpsiK" ]
+if "BsJpsiPhi" in BPHY8cf.doChannels: BPHY8_recoList += [ "BsJpsiPhi" ]
+if "BJpsiPi"   in BPHY8cf.doChannels: BPHY8_recoList += [ "BJpsiPi" ]
+
+# setup of vertexing tools per channel
+include("DerivationFrameworkBPhys/configureVertexing.py")
+BPHY8_VertexTools = OrderedDict()
+for BPHY8_reco in BPHY8_recoList:
+    BPHY8_VertexTools[BPHY8_reco] = BPHYVertexTools(BPHY8cf.DerivationName+"_"+BPHY8_reco)
+    print(BPHY8_VertexTools[BPHY8_reco])
+
+# setup of vertex finder tools
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import \
+    Analysis__JpsiFinder, Analysis__JpsiPlus1Track, Analysis__JpsiPlus2Tracks
+
+BPHY8_FinderTools = OrderedDict()
+for BPHY8_reco in BPHY8_recoList:
+# a) for DiMuon
+    if BPHY8_reco == "DiMuon":
+        BPHY8_FinderTools[BPHY8_reco] = Analysis__JpsiFinder(
+            name                        = BPHY8cf.DerivationName+"_"+BPHY8_reco+"_Finder",
+            OutputLevel                 = INFO,
+            muAndMu                     = BPHY8cf.JfTwoMuons,
+            muAndTrack                  = False,
+            TrackAndTrack               = BPHY8cf.JfTwoTracks,
+            doTagAndProbe               = False,
+            assumeDiMuons               = False,    # If true, will assume dimu hypothesis and use PDG value for mu mass
+            track1Mass                  = BPHY8cf.GlobalMuonMass,
+            track2Mass                  = BPHY8cf.GlobalMuonMass,
+            muonThresholdPt             = 0.,
+            trackThresholdPt            = BPHY8cf.JfTrackThresholdPt,
+            invMassUpper                = BPHY8cf.GlobalDiMuonMassUpperCut,
+            invMassLower                = BPHY8cf.GlobalDiMuonMassLowerCut,
+            # For JpsiFinder the cut is really on chi2 and not on chi2/ndf
+            Chi2Cut                     = BPHY8cf.Chi2Cut2Prong,
+            oppChargesOnly	        = True,
+            sameChargesOnly             = False,
+            allChargeCombinations       = False,
+            allMuons                    = True,
+            combOnly                    = False,
+            atLeastOneComb              = False,
+            useCombinedMeasurement      = False, # Only takes effect if combOnly=True	
+            muonCollectionKey           = BPHY8cf.UsedMuonCollection,
+            TrackParticleCollection     = BPHY8cf.TrkPartContName,
+            V0VertexFitterTool          = BPHY8_VertexTools[BPHY8_reco].TrkV0Fitter,             # V0 vertex fitter
+            useV0Fitter                 = False,                   # if False a TrkVertexFitterTool will be used
+            TrkVertexFitterTool         = BPHY8_VertexTools[BPHY8_reco].TrkVKalVrtFitter,        # VKalVrt vertex fitter
+            TrackSelectorTool           = BPHY8_VertexTools[BPHY8_reco].InDetTrackSelectorTool,
+            VertexPointEstimator        = BPHY8_VertexTools[BPHY8_reco].VtxPointEstimator,
+            useMCPCuts                  = BPHY8cf.useJpsiFinderMCPCuts )
+    
+# b) for BJpsiK or BJpsiPi
+    if BPHY8_reco in [ "BJpsiK", "BJpsiPi" ] :
+        BPHY8_kaonHypo = (False if BPHY8_reco == "BJpsiPi" else True)
+        BPHY8_FinderTools[BPHY8_reco] = Analysis__JpsiPlus1Track(
+            name                        = BPHY8cf.DerivationName+"_"+BPHY8_reco+"_Finder",
+            OutputLevel                 = INFO,
+            pionHypothesis              = not BPHY8_kaonHypo,
+            kaonHypothesis              = BPHY8_kaonHypo,
+            trkThresholdPt              = BPHY8cf.GlobalKaonPtCut,
+            trkMaxEta                   = BPHY8cf.GlobalKaonEtaCut,
+            BThresholdPt                = 1000.,
+            TrkTrippletMassUpper        = BPHY8cf.GlobalTrksMassUpperCut,
+            TrkTrippletMassLower        = BPHY8cf.GlobalTrksMassLowerCut,
+            BMassUpper                  = BPHY8cf.GlobalBMassUpperCut,
+            BMassLower                  = BPHY8cf.GlobalBMassLowerCut,
+            JpsiContainerKey            = BPHY8cf.DerivationName+"DiMuonCandidates",
+            JpsiMassUpper               = BPHY8cf.GlobalJpsiMassUpperCut,
+            JpsiMassLower               = BPHY8cf.GlobalJpsiMassLowerCut,
+            MuonsUsedInJpsi             = BPHY8cf.GlobalMuonsUsedInJpsi,
+            TrackParticleCollection     = BPHY8cf.TrkPartContName,
+            TrkVertexFitterTool         = BPHY8_VertexTools[BPHY8_reco].TrkVKalVrtFitter,        # VKalVrt vertex fitter
+            TrackSelectorTool           = BPHY8_VertexTools[BPHY8_reco].InDetTrackSelectorTool,
+            # This JO should rather be named Chi2byNdfCut
+            Chi2Cut                     = BPHY8cf.GlobalChi2CutBase,
+            UseMassConstraint           = True,
+            ExcludeJpsiMuonsOnly        = True,
+            ExcludeCrossJpsiTracks      = False)
+    
+# c) for BsJpsiPhi
+    if BPHY8_reco == "BsJpsiPhi":
+        BPHY8_FinderTools[BPHY8_reco] = Analysis__JpsiPlus2Tracks(
+            name                        = BPHY8cf.DerivationName+"_"+BPHY8_reco+"_Finder",
+            OutputLevel                 = INFO,
+            pionpionHypothesis          = False,
+            kaonkaonHypothesis          = True,
+            kaonpionHypothesis          = False,
+            trkThresholdPt              = BPHY8cf.GlobalKaonPtCut,
+            trkMaxEta                   = BPHY8cf.GlobalKaonEtaCut,
+            BThresholdPt                = 1000.,
+            TrkQuadrupletMassUpper      = BPHY8cf.GlobalTrksMassUpperCut,
+            TrkQuadrupletMassLower      = BPHY8cf.GlobalTrksMassLowerCut,
+            BMassUpper                  = BPHY8cf.GlobalBMassUpperCut,
+            BMassLower                  = BPHY8cf.GlobalBMassLowerCut,
+            JpsiContainerKey            = BPHY8cf.DerivationName+"DiMuonCandidates",
+            JpsiMassUpper               = BPHY8cf.GlobalJpsiMassUpperCut,
+            JpsiMassLower               = BPHY8cf.GlobalJpsiMassLowerCut,
+            MuonsUsedInJpsi             = BPHY8cf.GlobalMuonsUsedInJpsi,
+            TrackParticleCollection     = BPHY8cf.TrkPartContName,
+            TrkVertexFitterTool         = BPHY8_VertexTools[BPHY8_reco].TrkVKalVrtFitter,        # VKalVrt vertex fitter
+            TrackSelectorTool           = BPHY8_VertexTools[BPHY8_reco].InDetTrackSelectorTool,
+            # This JO should rather be named Chi2byNdfCut
+            Chi2Cut                     = BPHY8cf.GlobalChi2CutBase,
+            UseMassConstraint           = True,
+            ExcludeJpsiMuonsOnly        = True,
+            ExcludeCrossJpsiTracks      = False)
+        
+ToolSvc += list(BPHY8_FinderTools.values())
+for BPHY8_name in list(BPHY8_FinderTools.keys()):
+    print(BPHY8_FinderTools[BPHY8_name]) 
+    pprint(BPHY8_FinderTools[BPHY8_name].properties())
+    
+#--------------------------------------------------------------------
+# Setup the vertex reconstruction "call" tool(s). They are part of the
+# derivation framework.
+# These Augmentation tools add output vertex collection(s) into the
+# StoreGate and add basic decorations which do not depend on the vertex
+# mass hypothesis (e.g. lxy, ptError, etc).
+# There should be one tool per topology, i.e. Jpsi and Psi(2S) do not need
+# two instance of the Reco tool if the JpsiFinder mass window is wide enough.
+#
+# The reconstruction tools must be interleaved with the vertex selection
+# and augmentation tools as e.g. the Jpsimumu container ist needed for
+# ????
+#
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf \
+    import DerivationFramework__Reco_Vertex
+BPHY8_RecoTools = OrderedDict()
+for BPHY8_reco in BPHY8_recoList:
+# a) for DiMuon
+    if BPHY8_reco == "DiMuon":
+        BPHY8_RecoTools[BPHY8_reco] = DerivationFramework__Reco_Vertex(
+            name                   = BPHY8cf.DerivationName+"_"+BPHY8_reco+"_Reco",
+            JpsiFinder             = BPHY8_FinderTools[BPHY8_reco],
+            OutputVtxContainerName = BPHY8cf.DerivationName+BPHY8_reco+"Candidates",
+            PVContainerName        = BPHY8cf.PVContName,
+            RefPVContainerName     = BPHY8cf.DerivationName+"DiMuonRefittedPrimaryVertices",
+            RefitPV                = True,
+            Do3d                   = BPHY8cf.do3dProperTime,
+            MaxPVrefit             = 100000,
+            MinNTracksInPV         = BPHY8cf.minNTracksInPV,
+            DoVertexType           = BPHY8cf.doVertexType)
+# b) for BJpsiK
+    if BPHY8_reco in [ "BJpsiK", "BJpsiPi" ] :
+        BPHY8_RecoTools[BPHY8_reco] = DerivationFramework__Reco_Vertex(
+            name                   = BPHY8cf.DerivationName+"_"+BPHY8_reco+"_Reco",
+            Jpsi1PlusTrackName     = BPHY8_FinderTools[BPHY8_reco],
+            OutputVtxContainerName = BPHY8cf.DerivationName+BPHY8_reco+"Candidates",
+            PVContainerName        = BPHY8cf.PVContName,
+            RefPVContainerName     = BPHY8cf.DerivationName+BPHY8_reco+"RefittedPrimaryVertices",
+            RefitPV                = True,
+            Do3d                   = BPHY8cf.do3dProperTime,
+            MaxPVrefit             = 100000,
+            MinNTracksInPV         = BPHY8cf.minNTracksInPV,
+            DoVertexType           = BPHY8cf.doVertexType)
+# c) for BsJpsiPhi
+    if BPHY8_reco == "BsJpsiPhi":
+        BPHY8_RecoTools[BPHY8_reco] = DerivationFramework__Reco_Vertex(
+            name                   = BPHY8cf.DerivationName+"_"+BPHY8_reco+"_Reco",
+            Jpsi2PlusTrackName     = BPHY8_FinderTools[BPHY8_reco],
+            OutputVtxContainerName = BPHY8cf.DerivationName+BPHY8_reco+"Candidates",
+            PVContainerName        = BPHY8cf.PVContName,
+            RefPVContainerName     = BPHY8cf.DerivationName+BPHY8_reco+"RefittedPrimaryVertices",
+            RefitPV                = True,
+            Do3d                   = BPHY8cf.do3dProperTime,
+            MaxPVrefit             = 100000,
+            MinNTracksInPV         = BPHY8cf.minNTracksInPV,
+            DoVertexType           = BPHY8cf.doVertexType)
+        
+ToolSvc += list(BPHY8_RecoTools.values())
+for BPHY8_name in list(BPHY8_RecoTools.keys()):
+    print(BPHY8_RecoTools[BPHY8_name])
+    pprint(BPHY8_RecoTools[BPHY8_name].properties())
+
+#--------------------------------------------------------------------
+# Augmentation of vertices by MUCALC mass and it's error
+#
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf \
+    import DerivationFramework__BPhysAddMuonBasedInvMass
+
+BPHY8_MuMassTools = OrderedDict()
+# a) for Bsmumu
+if "Bsmumu" in BPHY8cf.doChannels:
+    # augment B(s)->mumu candidates
+    BPHY8_MuMassTools["Bsmumu"] = DerivationFramework__BPhysAddMuonBasedInvMass(
+        name                       = "BPHY8_MuMass_Bsmumu",
+        BranchPrefix               = "Bsmumu",
+        OutputLevel                = WARNING,
+        AdjustToMuonKinematics     = BPHY8cf.adjustMucalcKinematics,
+        VertexContainerName        = BPHY8cf.DerivationName+"DiMuonCandidates",
+        TrkMasses                  = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass],
+        AddMinChi2ToAnyPVMode      = BPHY8cf.AddMinChi2ToAnyPVMode,
+        PrimaryVertexContainerName = BPHY8cf.PVContName,
+        MinNTracksInPV             = BPHY8cf.minNTracksInPV,
+        PVTypesToConsider          = BPHY8cf.MinChi2ToAnyPVTypes,
+        DoVertexType               = BPHY8cf.doVertexType)
+# b) for BJpsiK, BsJpsiPhi and BJpsiPi retain the Jpsi
+if [i for i in BPHY8cf.doChannels if i in ["BJpsiK", "BsJpsiPhi", "BJpsiPi"]]:
+    BPHY8_MuMassTools["Jpsimumu"] = DerivationFramework__BPhysAddMuonBasedInvMass(
+        name                       = "BPHY8_MuMass_Jpsimumu",
+        BranchPrefix               = "Jpsimumu",
+        OutputLevel                = WARNING,
+        AdjustToMuonKinematics     = BPHY8cf.adjustMucalcKinematics,
+        VertexContainerName        = BPHY8cf.DerivationName+"DiMuonCandidates",
+        TrkMasses                  = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass],
+        AddMinChi2ToAnyPVMode      = BPHY8cf.AddMinChi2ToAnyPVMode,
+        PrimaryVertexContainerName = BPHY8cf.PVContName,
+        MinNTracksInPV             = BPHY8cf.minNTracksInPV,
+        PVTypesToConsider          = BPHY8cf.MinChi2ToAnyPVTypes,
+        DoVertexType               = BPHY8cf.doVertexType)
+# c) for BJpsiK
+if "BJpsiK" in BPHY8cf.doChannels:
+    # augment B+/- ->JpsiK+/- candidates
+    BPHY8_MuMassTools["BJpsiK"] = DerivationFramework__BPhysAddMuonBasedInvMass(
+        name                       = "BPHY8_MuMass_BJpsiK",
+        BranchPrefix               = "BJpsiK",
+        OutputLevel                = WARNING,
+        AdjustToMuonKinematics     = BPHY8cf.adjustMucalcKinematics,
+        VertexContainerName        = BPHY8cf.DerivationName+"BJpsiKCandidates",
+        TrkMasses                  = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalKaonMass],
+        AddMinChi2ToAnyPVMode      = BPHY8cf.AddMinChi2ToAnyPVMode,
+        PrimaryVertexContainerName = BPHY8cf.PVContName,
+        MinNTracksInPV             = BPHY8cf.minNTracksInPV,
+        PVTypesToConsider          = BPHY8cf.MinChi2ToAnyPVTypes,
+        DoVertexType               = BPHY8cf.doVertexType)
+# d) for BsJpsiPhi
+if "BsJpsiPhi" in BPHY8cf.doChannels:
+    # augment Bs ->JpsiPhi candidates
+    BPHY8_MuMassTools["BsJpsiPhi"] = DerivationFramework__BPhysAddMuonBasedInvMass(
+        name                       = "BPHY8_MuMass_BsJpsiPhi",
+        BranchPrefix               = "BsJpsiPhi",
+        OutputLevel                = WARNING,
+        AdjustToMuonKinematics     = BPHY8cf.adjustMucalcKinematics,
+        VertexContainerName        = BPHY8cf.DerivationName+"BsJpsiPhiCandidates",
+        TrkMasses                  = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalKaonMass, BPHY8cf.GlobalKaonMass],
+        AddMinChi2ToAnyPVMode      = BPHY8cf.AddMinChi2ToAnyPVMode,
+        PrimaryVertexContainerName = BPHY8cf.PVContName,
+        MinNTracksInPV             = BPHY8cf.minNTracksInPV,
+        PVTypesToConsider          = BPHY8cf.MinChi2ToAnyPVTypes,
+        DoVertexType               = BPHY8cf.doVertexType)
+# e) for BJpsiPi
+if "BJpsiPi" in BPHY8cf.doChannels:
+    # augment B+/- ->JpsiPi+/- candidates
+    BPHY8_MuMassTools["BJpsiPi"] = DerivationFramework__BPhysAddMuonBasedInvMass(
+        name                       = "BPHY8_MuMass_BJpsiPi",
+        BranchPrefix               = "BJpsiPi",
+        OutputLevel                = WARNING,
+        AdjustToMuonKinematics     = BPHY8cf.adjustMucalcKinematics,
+        VertexContainerName        = BPHY8cf.DerivationName+"BJpsiPiCandidates",
+        TrkMasses                  = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalPionMass],
+        AddMinChi2ToAnyPVMode      = BPHY8cf.AddMinChi2ToAnyPVMode,
+        PrimaryVertexContainerName = BPHY8cf.PVContName,
+        MinNTracksInPV             = BPHY8cf.minNTracksInPV,
+        PVTypesToConsider          = BPHY8cf.MinChi2ToAnyPVTypes,
+        DoVertexType               = BPHY8cf.doVertexType)
+# f) for Bhh
+if "Bhh" in BPHY8cf.doChannels:
+    # augment B->hh candidates
+    BPHY8_MuMassTools["Bhh"] = DerivationFramework__BPhysAddMuonBasedInvMass(
+        name                       = "BPHY8_MuMass_Bhh",
+        BranchPrefix               = "Bhh",
+        OutputLevel                = WARNING,
+        AdjustToMuonKinematics     = BPHY8cf.adjustMucalcKinematics,
+        VertexContainerName        = BPHY8cf.DerivationName+"DiMuonCandidates",
+        TrkMasses                  = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass],
+        AddMinChi2ToAnyPVMode      = BPHY8cf.AddMinChi2ToAnyPVMode,
+        PrimaryVertexContainerName = BPHY8cf.PVContName,
+        MinNTracksInPV             = BPHY8cf.minNTracksInPV,
+        PVTypesToConsider          = BPHY8cf.MinChi2ToAnyPVTypes,
+        DoVertexType               = BPHY8cf.doVertexType)
+
+######################## duplication for debugging only #######################
+
+if BPHY8cf.addMucalcMassForDebug:
+    # a) for Bsmumu
+    if "Bsmumu" in BPHY8cf.doChannels:
+        # augment B(s)->mumu candidates
+        BPHY8_MuMassTools["Bsmumu2"] = DerivationFramework__BPhysAddMuonBasedInvMass(
+            name                       = "BPHY8_MuMass_Bsmumu2",
+            BranchPrefix               = "Bsmumu2",
+            OutputLevel                = WARNING,
+            AdjustToMuonKinematics     = False,
+            VertexContainerName        = BPHY8cf.DerivationName+"DiMuonCandidates",
+            TrkMasses                  = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass],
+            AddMinChi2ToAnyPVMode      = BPHY8cf.AddMinChi2ToAnyPVMode,
+            PrimaryVertexContainerName = BPHY8cf.PVContName,
+            MinNTracksInPV             = BPHY8cf.minNTracksInPV,
+            PVTypesToConsider          = BPHY8cf.MinChi2ToAnyPVTypes,
+            DoVertexType               = BPHY8cf.doVertexType)
+    # b) for BJpsiK and BsJpsiPhi retain the Jpsi
+    if [i for i in BPHY8cf.doChannels if i in ["BJpsiK", "BsJpsiPhi"]]:
+        BPHY8_MuMassTools["Jpsimumu2"] = DerivationFramework__BPhysAddMuonBasedInvMass(
+            name                       = "BPHY8_MuMass_Jpsimumu2",
+            BranchPrefix               = "Jpsimumu2",
+            OutputLevel                = WARNING,
+            AdjustToMuonKinematics     = False,
+            VertexContainerName        = BPHY8cf.DerivationName+"DiMuonCandidates",
+            TrkMasses                  = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass],
+            AddMinChi2ToAnyPVMode      = BPHY8cf.AddMinChi2ToAnyPVMode,
+            PrimaryVertexContainerName = BPHY8cf.PVContName,
+            MinNTracksInPV             = BPHY8cf.minNTracksInPV,
+            PVTypesToConsider          = BPHY8cf.MinChi2ToAnyPVTypes,
+            DoVertexType               = BPHY8cf.doVertexType)
+    # c) for BJpsiK
+    if "BJpsiK" in BPHY8cf.doChannels:
+        # augment B+/- ->JpsiK+/- candidates
+        BPHY8_MuMassTools["BJpsiK2"] = DerivationFramework__BPhysAddMuonBasedInvMass(
+            name                       = "BPHY8_MuMass_BJpsiK2",
+            BranchPrefix               = "BJpsiK2",
+            OutputLevel                = WARNING,
+            AdjustToMuonKinematics     = False,
+            VertexContainerName        = BPHY8cf.DerivationName+"BJpsiKCandidates",
+            TrkMasses                  = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalKaonMass],
+            AddMinChi2ToAnyPVMode      = BPHY8cf.AddMinChi2ToAnyPVMode,
+            PrimaryVertexContainerName = BPHY8cf.PVContName,
+            MinNTracksInPV             = BPHY8cf.minNTracksInPV,
+            PVTypesToConsider          = BPHY8cf.MinChi2ToAnyPVTypes,
+            DoVertexType               = BPHY8cf.doVertexType)
+    # d) for BsJpsiPhi
+    if "BsJpsiPhi" in BPHY8cf.doChannels:
+        # augment Bs ->JpsiPhi candidates
+        BPHY8_MuMassTools["BsJpsiPhi2"] = DerivationFramework__BPhysAddMuonBasedInvMass(
+            name                       = "BPHY8_MuMass_BsJpsiPhi2",
+            BranchPrefix               = "BsJpsiPhi2",
+            OutputLevel                = WARNING,
+            AdjustToMuonKinematics     = False,
+            VertexContainerName        = BPHY8cf.DerivationName+"BsJpsiPhiCandidates",
+            TrkMasses                  = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalKaonMass, BPHY8cf.GlobalKaonMass],
+            AddMinChi2ToAnyPVMode      = BPHY8cf.AddMinChi2ToAnyPVMode,
+            PrimaryVertexContainerName = BPHY8cf.PVContName,
+            MinNTracksInPV             = BPHY8cf.minNTracksInPV,
+            PVTypesToConsider          = BPHY8cf.MinChi2ToAnyPVTypes,
+            DoVertexType               = BPHY8cf.doVertexType)
+        # e) for BJpsiPi
+    if "BJpsiPi" in BPHY8cf.doChannels:
+        # augment B+/- ->JpsiPi+/- candidates
+        BPHY8_MuMassTools["BJpsiPi2"] = DerivationFramework__BPhysAddMuonBasedInvMass(
+            name                       = "BPHY8_MuMass_BJpsiPi2",
+            BranchPrefix               = "BJpsiPi2",
+            OutputLevel                = WARNING,
+            AdjustToMuonKinematics     = False,
+            VertexContainerName        = BPHY8cf.DerivationName+"BJpsiPiCandidates",
+            TrkMasses                  = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalPionMass],
+            AddMinChi2ToAnyPVMode      = BPHY8cf.AddMinChi2ToAnyPVMode,
+            PrimaryVertexContainerName = BPHY8cf.PVContName,
+            MinNTracksInPV             = BPHY8cf.minNTracksInPV,
+            PVTypesToConsider          = BPHY8cf.MinChi2ToAnyPVTypes,
+            DoVertexType               = BPHY8cf.doVertexType)
+    # f) for Bhh
+    if "Bhh" in BPHY8cf.doChannels:
+    # augment B->hh candidates
+        BPHY8_MuMassTools["Bhh2"] = DerivationFramework__BPhysAddMuonBasedInvMass(
+            name                       = "BPHY8_MuMass_Bhh2",
+            BranchPrefix               = "Bhh2",
+            OutputLevel                = WARNING,
+            AdjustToMuonKinematics     = False,
+            VertexContainerName        = BPHY8cf.DerivationName+"DiMuonCandidates",
+            TrkMasses                  = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass],
+            AddMinChi2ToAnyPVMode      = BPHY8cf.AddMinChi2ToAnyPVMode,
+            PrimaryVertexContainerName = BPHY8cf.PVContName,
+            MinNTracksInPV             = BPHY8cf.minNTracksInPV,
+            PVTypesToConsider          = BPHY8cf.MinChi2ToAnyPVTypes,
+            DoVertexType               = BPHY8cf.doVertexType)
+        
+######################## duplication for debugging only #######################
+    
+ToolSvc += list(BPHY8_MuMassTools.values())
+for BPHY8_name in list(BPHY8_MuMassTools.keys()):
+    print(BPHY8_MuMassTools[BPHY8_name]) 
+    pprint(BPHY8_MuMassTools[BPHY8_name].properties())
+    
+#--------------------------------------------------------------------
+# Augmentation of vertices by vertex track isolation values,
+# closest track information and muon isolation values.
+#
+# First: Set up track selections
+#
+from InDetTrackSelectionTool.InDetTrackSelectionToolConf \
+    import InDet__InDetTrackSelectionTool
+
+# a) for BVertexTrackIsoTool
+BPHY8_IsoTrkSelTools = OrderedDict()
+for i in range(len(BPHY8cf.IsoTrackCategoryName)):
+    BPHY8_name = BPHY8cf.DerivationName+"_iso_"+BPHY8cf.IsoTrackCategoryName[i]
+    BPHY8_Tool = InDet__InDetTrackSelectionTool(
+        name        = BPHY8_name,
+        OutputLevel = INFO
+    )
+    if BPHY8cf.IsoTrackCutLevel[i] != "Custom" :
+        BPHY8_Tool.CutLevel                     = BPHY8cf.IsoTrackCutLevel[i]
+    if BPHY8cf.IsoTrackPtCut[i] > -1. :
+        BPHY8_Tool.minPt                        = BPHY8cf.IsoTrackPtCut[i]
+    if BPHY8cf.IsoTrackEtaCut[i] > -1. :
+        BPHY8_Tool.maxAbsEta                    = BPHY8cf.IsoTrackEtaCut[i]
+    if BPHY8cf.IsoTrackPixelHits[i] > -1 :
+        BPHY8_Tool.minNPixelHits                = BPHY8cf.IsoTrackPixelHits[i]
+    if BPHY8cf.IsoTrackSCTHits[i] > -1 :
+        BPHY8_Tool.minNSctHits                  = BPHY8cf.IsoTrackSCTHits[i]
+    if BPHY8cf.IsoTrackIBLHits[i] > -1 :
+        BPHY8_Tool.minNInnermostLayerHits       = BPHY8cf.IsoTrackIBLHits[i]
+    if BPHY8cf.IsoTrackbLayerHits[i] > -1 :
+        BPHY8_Tool.minNNextToInnermostLayerHits = BPHY8cf.IsoTrackbLayerHits[i]
+    BPHY8_IsoTrkSelTools[BPHY8_name] = BPHY8_Tool
+
+ToolSvc += list(BPHY8_IsoTrkSelTools.values())
+for BPHY8_name in list(BPHY8_IsoTrkSelTools.keys()):
+    print(BPHY8_IsoTrkSelTools[BPHY8_name]) 
+    pprint(BPHY8_IsoTrkSelTools[BPHY8_name].properties())
+
+# b) for BMuonTrackIsoTool
+BPHY8_MuIsoTrkSelTools = OrderedDict()
+for i in range(len(BPHY8cf.MuIsoTrackCategoryName)):
+    BPHY8_name = BPHY8cf.DerivationName+"_muiso_" + \
+                 BPHY8cf.MuIsoTrackCategoryName[i]
+    BPHY8_Tool = InDet__InDetTrackSelectionTool(
+        name        = BPHY8_name,
+        OutputLevel = INFO
+    )
+    if BPHY8cf.MuIsoTrackCutLevel[i] != "Custom" :
+        BPHY8_Tool.CutLevel                     = BPHY8cf.MuIsoTrackCutLevel[i]
+    if BPHY8cf.MuIsoTrackPtCut[i] > -1. :
+        BPHY8_Tool.minPt                        = BPHY8cf.MuIsoTrackPtCut[i]
+    if BPHY8cf.MuIsoTrackEtaCut[i] > -1. :
+        BPHY8_Tool.maxAbsEta                    = BPHY8cf.MuIsoTrackEtaCut[i]
+    if BPHY8cf.MuIsoTrackPixelHits[i] > -1 :
+        BPHY8_Tool.minNPixelHits                = BPHY8cf.MuIsoTrackPixelHits[i]
+    if BPHY8cf.MuIsoTrackSCTHits[i] > -1 :
+        BPHY8_Tool.minNSctHits                  = BPHY8cf.MuIsoTrackSCTHits[i]
+    if BPHY8cf.MuIsoTrackIBLHits[i] > -1 :
+        BPHY8_Tool.minNInnermostLayerHits       = BPHY8cf.MuIsoTrackIBLHits[i]
+    if BPHY8cf.MuIsoTrackbLayerHits[i] > -1 :
+        BPHY8_Tool.minNNextToInnermostLayerHits \
+            = BPHY8cf.MuIsoTrackbLayerHits[i]
+    BPHY8_MuIsoTrkSelTools[BPHY8_name] = BPHY8_Tool
+
+ToolSvc += list(BPHY8_MuIsoTrkSelTools.values())
+for BPHY8_name in list(BPHY8_MuIsoTrkSelTools.keys()):
+    print(BPHY8_MuIsoTrkSelTools[BPHY8_name]) 
+    pprint(BPHY8_MuIsoTrkSelTools[BPHY8_name].properties())
+
+# c) for ClosestTrackTool
+BPHY8_CtTrkSelTools = OrderedDict()
+for i in range(len(BPHY8cf.CloseTrackCategoryName)):
+    BPHY8_name = BPHY8cf.DerivationName+"_ct_"+BPHY8cf.CloseTrackCategoryName[i]
+    BPHY8_Tool = InDet__InDetTrackSelectionTool(
+        name        = BPHY8_name,
+        OutputLevel = INFO
+    )
+    if BPHY8cf.CloseTrackCutLevel[i] != "Custom" :
+        BPHY8_Tool.CutLevel                     = BPHY8cf.CloseTrackCutLevel[i]
+    if BPHY8cf.CloseTrackPtCut[i] > -1. :
+        BPHY8_Tool.minPt                        = BPHY8cf.CloseTrackPtCut[i]
+    if BPHY8cf.CloseTrackEtaCut[i] > -1. :
+        BPHY8_Tool.maxAbsEta                    = BPHY8cf.CloseTrackEtaCut[i]
+    if BPHY8cf.CloseTrackPixelHits[i] > -1 :
+        BPHY8_Tool.minNPixelHits                = BPHY8cf.CloseTrackPixelHits[i]
+    if BPHY8cf.CloseTrackSCTHits[i] > -1 :
+        BPHY8_Tool.minNSctHits                  = BPHY8cf.CloseTrackSCTHits[i]
+    if BPHY8cf.CloseTrackIBLHits[i] > -1 :
+        BPHY8_Tool.minNInnermostLayerHits       = BPHY8cf.CloseTrackIBLHits[i]
+    if BPHY8cf.CloseTrackbLayerHits[i] > -1 :
+        BPHY8_Tool.minNNextToInnermostLayerHits \
+            = BPHY8cf.CloseTrackbLayerHits[i]
+    BPHY8_CtTrkSelTools[BPHY8_name] = BPHY8_Tool
+
+ToolSvc += list(BPHY8_CtTrkSelTools.values())
+for BPHY8_name in list(BPHY8_CtTrkSelTools.keys()):
+    print(BPHY8_CtTrkSelTools[BPHY8_name]) 
+    pprint(BPHY8_CtTrkSelTools[BPHY8_name].properties())
+
+#
+# Step 1.5: Set up track vertex assocation tool
+#
+from TrackVertexAssociationTool.TrackVertexAssociationToolConf \
+    import CP__TrackVertexAssociationTool
+
+BPHY8_TvaTools = OrderedDict()
+
+# a) for BVertexTrackIsoTool
+BPHY8_TvaTools["TrackVtxIsoTva"] = CP__TrackVertexAssociationTool(
+    name          = BPHY8cf.DerivationName+"_VtxIsoTvaTool",
+    WorkingPoint  = BPHY8cf.IsoTvaWorkingPoint,
+    OutputLevel   = WARNING)
+
+# b) for BMuonTrackIsoTool
+BPHY8_TvaTools["TrackMuonIsoTva"] = CP__TrackVertexAssociationTool(
+    name          = BPHY8cf.DerivationName+"_MuonIsoTvaTool",
+    WorkingPoint  = BPHY8cf.MuIsoTvaWorkingPoint,
+    OutputLevel   = WARNING)
+
+# c) for ClosestTrackTool
+BPHY8_TvaTools["TrackVtxCtTva"] = CP__TrackVertexAssociationTool(
+    name          = BPHY8cf.DerivationName+"_VtxCtTvaTool",
+    WorkingPoint  = BPHY8cf.CloseTrackTvaWorkingPoint,
+    OutputLevel   = WARNING)
+
+# attach to ToolSvc
+ToolSvc += list(BPHY8_TvaTools.values())
+for BPHY8_name in list(BPHY8_TvaTools.keys()):
+    print(BPHY8_TvaTools[BPHY8_name]) 
+    pprint(BPHY8_TvaTools[BPHY8_name].properties())
+
+#
+# Second: Set up the B candidate vertex container arrays
+#
+BPHY8cf.VtxContNames  = [];
+BPHY8cf.RefPVContNames = [];
+BPHY8cf.BranchPrefixes = [];
+if [i for i in BPHY8cf.doChannels \
+    if i in ["Bsmumu", "BJpsiK", "BsJpsiPhi", "BJpsiPi", "Bhh"]]:
+    BPHY8cf.VtxContNames   += [ BPHY8cf.DerivationName+"DiMuonCandidates" ]
+    BPHY8cf.RefPVContNames += [ BPHY8cf.DerivationName
+                              +"DiMuonRefittedPrimaryVertices" ]
+    BPHY8cf.BranchPrefixes += [ "DiMuon" ];
+if "BJpsiK" in BPHY8cf.doChannels:
+    BPHY8cf.VtxContNames   += [ BPHY8cf.DerivationName+"BJpsiKCandidates" ]
+    BPHY8cf.RefPVContNames += [ BPHY8cf.DerivationName
+                              +"BJpsiKRefittedPrimaryVertices" ]
+    BPHY8cf.BranchPrefixes += [ "BJpsiK" ];
+if "BsJpsiPhi" in BPHY8cf.doChannels:
+    BPHY8cf.VtxContNames   += [ BPHY8cf.DerivationName+"BsJpsiPhiCandidates" ]
+    BPHY8cf.RefPVContNames += [ BPHY8cf.DerivationName
+                              +"BsJpsiPhiRefittedPrimaryVertices" ]
+    BPHY8cf.BranchPrefixes += [ "BsJpsiPhi" ];
+if "BJpsiPi" in BPHY8cf.doChannels:
+    BPHY8cf.VtxContNames   += [ BPHY8cf.DerivationName+"BJpsiPiCandidates" ]
+    BPHY8cf.RefPVContNames += [ BPHY8cf.DerivationName
+                              +"BJpsiPiRefittedPrimaryVertices" ]
+    BPHY8cf.BranchPrefixes += [ "BJpsiPi" ];
+    
+#
+# Third: Set up the real tools
+#
+BPHY8_IsoTools = OrderedDict()
+
+# a) BVertexTrackIsoTool
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf \
+    import DerivationFramework__BVertexTrackIsoTool
+
+BPHY8_IsoTools["TrackVtxIso"] = DerivationFramework__BVertexTrackIsoTool(
+    name                       = "BPHY8_VtxIsoTool",
+    BranchPrefixes             = BPHY8cf.BranchPrefixes,
+    BranchBaseName             = "iso",
+    OutputLevel                = INFO,
+    VertexContainerNames       = BPHY8cf.VtxContNames,
+    RefPVContainerNames        = BPHY8cf.RefPVContNames,
+    TrackParticleContainerName = BPHY8cf.TrkPartContName,
+    PVContainerName            = BPHY8cf.PVContName,
+    PVTypesToConsider          = BPHY8cf.MinChi2ToAnyPVTypes,
+    TrackSelectionTools        = list(BPHY8_IsoTrkSelTools.values()),
+    TVATool                    = BPHY8_TvaTools["TrackVtxIsoTva"],
+    IsolationConeSizes         = BPHY8cf.IsolationConeSizes,
+    IsoTrkImpLogChi2Max        = BPHY8cf.IsoTrkImpLogChi2Max,    
+    IsoDoTrkImpLogChi2Cut      = BPHY8cf.IsoDoTrkImpLogChi2Cut,
+    DoVertexType               = BPHY8cf.doVertexType,
+    UseTrackTypes              = BPHY8cf.useIsoTrackTypes,
+    UseOptimizedAlgo           = BPHY8cf.IsoUseOptimizedAlgo,
+    DebugTrackTypes            = BPHY8cf.DebugTrackTypes,
+    DebugTracksInEvents        = [])
+
+# b) BMuonTrackIsoTool
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf \
+    import DerivationFramework__BMuonTrackIsoTool
+
+BPHY8_IsoTools["TrackMuonIso"] = DerivationFramework__BMuonTrackIsoTool(
+    name                       = "BPHY8_MuonIsoTool",
+    BranchPrefixes             = BPHY8cf.BranchPrefixes,
+    BranchBaseName             = "muiso",
+    OutputLevel                = INFO,
+    VertexContainerNames       = BPHY8cf.VtxContNames,
+    RefPVContainerNames        = BPHY8cf.RefPVContNames,
+    TrackParticleContainerName = BPHY8cf.TrkPartContName,
+    PVContainerName            = BPHY8cf.PVContName,
+    PVTypesToConsider          = BPHY8cf.MinChi2ToAnyPVTypes,
+    MuonContainerName          = BPHY8cf.UsedMuonCollection,
+    TrackSelectionTools        = list(BPHY8_MuIsoTrkSelTools.values()),
+    TVATool                    = BPHY8_TvaTools["TrackMuonIsoTva"],
+    IsolationConeSizes         = BPHY8cf.MuIsolationConeSizes,
+    IsoTrkImpLogChi2Max        = BPHY8cf.MuIsoTrkImpLogChi2Max,    
+    IsoDoTrkImpLogChi2Cut      = BPHY8cf.MuIsoDoTrkImpLogChi2Cut,
+    DoVertexType               = BPHY8cf.doVertexType,
+    UseTrackTypes              = BPHY8cf.useMuIsoTrackTypes,
+    DebugTrackTypes            = BPHY8cf.DebugTrackTypes,
+    DebugTracksInEvents        = [])
+
+# c) BVertexClosestTrackTool
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf \
+    import DerivationFramework__BVertexClosestTrackTool
+
+BPHY8_IsoTools["TrackVtxCt"] = DerivationFramework__BVertexClosestTrackTool(
+    name                       = "BPHY8_VtxClosestTrkTool",
+    BranchPrefixes             = BPHY8cf.BranchPrefixes,
+    BranchBaseName             = "ct",
+    OutputLevel                = INFO,
+    VertexContainerNames       = BPHY8cf.VtxContNames,
+    RefPVContainerNames        = BPHY8cf.RefPVContNames,
+    TrackParticleContainerName = BPHY8cf.TrkPartContName,
+    PVContainerName            = BPHY8cf.PVContName,
+    TrackSelectionTools        = list(BPHY8_CtTrkSelTools.values()),
+    TVATool                    = BPHY8_TvaTools["TrackVtxCtTva"],
+    PVTypesToConsider          = BPHY8cf.MinChi2ToAnyPVTypes,
+    DoVertexType               = BPHY8cf.doVertexType,
+    UseTrackTypes              = BPHY8cf.useCloseTrackTypes,
+    CloseTrackChi2SetName      = BPHY8cf.CloseTrackChi2SetName,
+    CloseTrackCorrChi2         = BPHY8cf.CloseTrackCorrChi2,
+    CloseTrackMinDCAin3D       = BPHY8cf.CloseTrackMinDCAin3D,
+    CloseTrackMaxLogChi2       = BPHY8cf.CloseTrackMaxLogChi2,
+    NCloseTrackMaxLogChi2      = BPHY8cf.NCloseTrackMaxLogChi2,
+    DebugTrackTypes            = BPHY8cf.DebugTrackTypes,
+    DebugTracksInEvents        = [])
+
+#
+# Fourth: Add track-to-vertex map debugging
+#
+BPHY8_TtvmTools = OrderedDict();
+
+# a) configure BPhysTrackVertexMapTools
+# Configure only if not 0 events requested
+if BPHY8cf.DebugTrkToVtxMaxEvents != 0 :
+    for BPHY8_prefix, BPHY8_SVcont, BPHY8_refPVcont in \
+        zip(BPHY8cf.BranchPrefixes, BPHY8cf.VtxContNames,
+            BPHY8cf.RefPVContNames):
+        BPHY8_hypos = BPHY8_prefix
+        if BPHY8_hypos == "DiMuon":
+            BPHY8_hypos += "|Bsmumu|Jpsimumu"
+        BPHY8_TtvmTools[BPHY8_prefix] = CfgMgr.xAOD__BPhysTrackVertexMapTool(
+            "BPHY8_ttvm_"+BPHY8_prefix,
+            OutputLevel                = INFO,
+            VertexContainerName        = BPHY8_SVcont,
+            RefPVContainerName         = BPHY8_refPVcont, 
+            PVContainerName            = BPHY8cf.PVContName,
+            TrackParticleContainerName = BPHY8cf.TrkPartContName, 
+            DebugTrkToVtxMaxEvents     = BPHY8cf.DebugTrkToVtxMaxEvents,
+            DumpPrefix                 = "TTV2> ",
+            HypoName                   = BPHY8_hypos )
+
+    ToolSvc += list(BPHY8_TtvmTools.values())
+    for BPHY8_name in list(BPHY8_TtvmTools.keys()):
+        print(BPHY8_TtvmTools[BPHY8_name]) 
+        pprint(BPHY8_TtvmTools[BPHY8_name].properties())
+
+# b) wrap into logger algorithm
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf \
+    import DerivationFramework__BTrackVertexMapLogger
+
+# Configure only if not 0 events requested
+if BPHY8cf.DebugTrkToVtxMaxEvents != 0 :
+    BPHY8_IsoTools["TvmLogger"] = DerivationFramework__BTrackVertexMapLogger(
+        name                    = "BPHY8_TrackVertexMapLogger",
+        OutputLevel             = INFO,
+        TrackVertexMapTools     = list(BPHY8_TtvmTools.values()),
+        Enable                  = True)
+    
+#
+# Fifth: Attach to ToolSvc
+#
+ToolSvc += list(BPHY8_IsoTools.values())
+for BPHY8_name in list(BPHY8_IsoTools.keys()):
+    print(BPHY8_IsoTools[BPHY8_name]) 
+    pprint(BPHY8_IsoTools[BPHY8_name].properties())
+
+#--------------------------------------------------------------------
+# Record the original counts for primary vertices and tracks
+#--------------------------------------------------------------------
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf \
+    import DerivationFramework__AugOriginalCounts
+BPHY8_AugOriginalCounts = DerivationFramework__AugOriginalCounts(
+    name = "BPHY8_AugOriginalCounts",
+    VertexContainer    = BPHY8cf.PVContName,
+    TrackContainer     = BPHY8cf.TrkPartContName,
+    AddPVCountsByType  = True,
+    AddNTracksToPVs    = True,
+    AddSqrtPt2SumToPVs = True)
+    
+ToolSvc += BPHY8_AugOriginalCounts
+pprint(BPHY8_AugOriginalCounts.properties())
+
+#--------------------------------------------------------------------
+# Setup the vertex selection and augmentation tool(s). These tools decorate
+# the vertices with variables that depend on the vertex mass hypothesis,
+# e.g. invariant mass, proper decay time, etc.
+# Property HypothesisName is used as a prefix for these decorations.
+# They also perform tighter selection, flagging the vertecis that passed.
+# The flag is a Char_t branch named "passed_"+HypothesisName. It is used
+# later by the "SelectEvent" and "Thin_vtxTrk" tools to determine which
+# events and candidates should be kept in the output stream.
+# Multiple instances of the Select_* tools can be used on a single input
+# collection as long as they use different "HypothesisName" flags.
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf \
+    import DerivationFramework__Select_Bmumu
+
+BPHY8_SelectTools = OrderedDict()
+# a) for Bsmumu
+if "Bsmumu" in BPHY8cf.doChannels:
+    # augment and select B(s)->mumu candidates
+    BPHY8_SelectTools["Bsmumu"] = DerivationFramework__Select_Bmumu(
+        name                   = "BPHY8_Select_Bsmumu",
+        HypothesisName         = "Bsmumu",
+        InputVtxContainerName  = BPHY8cf.DerivationName+"DiMuonCandidates",
+        TrkMasses              = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass],
+        VtxMassHypo            = BPHY8cf.GlobalBsMass,
+        MassMin                = BPHY8cf.GlobalBMassLowerCut,
+        MassMax                = BPHY8cf.GlobalBMassUpperCut,
+        Chi2Max                = BPHY8cf.Chi2Cut2Prong,
+        DoVertexType           = BPHY8cf.doVertexType,
+        Do3d                   = BPHY8cf.do3dProperTime,
+        BlindMassMin           = BPHY8cf.GlobalBlindLowerCut,
+        BlindMassMax           = BPHY8cf.GlobalBlindUpperCut,
+        DoBlinding             = BPHY8cf.doBmumuBlinding,
+        DoCutBlinded           = BPHY8cf.doCutBlinded,
+        BlindOnlyAllMuonsTight = BPHY8cf.blindOnlyAllMuonsTight,
+        UseMuCalcMass          = BPHY8cf.useMuCalcMass,
+        OutputLevel            = WARNING)
+# b) for BJpsiK and BsJpsiPhi retain the Jpsi
+if [i for i in BPHY8cf.doChannels if i in ["BJpsiK", "BsJpsiPhi"]]:
+    BPHY8_SelectTools["Jpsimumu"] = DerivationFramework__Select_Bmumu(
+        name                   = "BPHY8_Select_Jpsimumu",
+        HypothesisName         = "Jpsimumu",
+        InputVtxContainerName  = BPHY8cf.DerivationName+"DiMuonCandidates",
+        TrkMasses              = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass],
+        VtxMassHypo            = BPHY8cf.GlobalJpsiMass,
+        MassMin                = BPHY8cf.GlobalJpsiMassLowerCut,
+        MassMax                = BPHY8cf.GlobalJpsiMassUpperCut,
+        Chi2Max                = BPHY8cf.Chi2Cut2Prong,
+        DoVertexType           = BPHY8cf.doVertexType,
+        Do3d                   = BPHY8cf.do3dProperTime,
+        UseMuCalcMass          = BPHY8cf.useMuCalcMass,
+        OutputLevel            = WARNING)
+# c) for BJpsiK
+if "BJpsiK" in BPHY8cf.doChannels:
+    # augment and select B+/- ->JpsiK+/- candidates
+    BPHY8_SelectTools["BJpsiK"] = DerivationFramework__Select_Bmumu(
+        name                   = "BPHY8_Select_BJpsiK",
+        HypothesisName         = "BJpsiK",
+        InputVtxContainerName  = BPHY8cf.DerivationName+"BJpsiKCandidates",
+        TrkMasses              = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalKaonMass],
+        VtxMassHypo            = BPHY8cf.GlobalBplusMass,
+        MassMin                = BPHY8cf.GlobalBMassLowerCut,
+        MassMax                = BPHY8cf.GlobalBMassUpperCut,
+        Chi2Max                = BPHY8cf.Chi2Cut3Prong,
+        DoVertexType           = BPHY8cf.doVertexType,
+        Do3d                   = BPHY8cf.do3dProperTime,
+        UseMuCalcMass          = BPHY8cf.useMuCalcMass,
+        SubDecVtxContNames     = [BPHY8cf.DerivationName+"DiMuonCandidates"],
+        SubDecVtxHypoCondNames = ["Jpsimumu"],
+        SubDecVtxHypoFlagNames = ["JpsimumuSubDecay"],
+        OutputLevel            = WARNING)
+# d) for BsJpsiPhi
+if "BsJpsiPhi" in BPHY8cf.doChannels:
+    # augment and select Bs ->JpsiPhi candidates
+    BPHY8_SelectTools["BsJpsiPhi"] = DerivationFramework__Select_Bmumu(
+        name                   = "BPHY8_Select_BsJpsiPhi",
+        HypothesisName         = "BsJpsiPhi",
+        InputVtxContainerName  = BPHY8cf.DerivationName+"BsJpsiPhiCandidates",
+        TrkMasses              = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalKaonMass, BPHY8cf.GlobalKaonMass],
+        VtxMassHypo            = BPHY8cf.GlobalBsMass,
+        MassMin                = BPHY8cf.GlobalBMassLowerCut,
+        MassMax                = BPHY8cf.GlobalBMassUpperCut,
+        Chi2Max                = BPHY8cf.Chi2Cut4Prong,
+        DoVertexType           = BPHY8cf.doVertexType,
+        Do3d                   = BPHY8cf.do3dProperTime,
+        UseMuCalcMass          = BPHY8cf.useMuCalcMass,
+        SubDecVtxContNames     = [BPHY8cf.DerivationName+"DiMuonCandidates"],
+        SubDecVtxHypoCondNames = ["Jpsimumu"],
+        SubDecVtxHypoFlagNames = ["JpsimumuSubDecay"],
+        OutputLevel            = WARNING)
+# e) for BJpsiPi
+if "BJpsiPi" in BPHY8cf.doChannels:
+    # augment and select B+/- ->JpsiPi+/- candidates
+    BPHY8_SelectTools["BJpsiPi"] = DerivationFramework__Select_Bmumu(
+        name                   = "BPHY8_Select_BJpsiPi",
+        HypothesisName         = "BJpsiPi",
+        InputVtxContainerName  = BPHY8cf.DerivationName+"BJpsiPiCandidates",
+        TrkMasses              = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalPionMass],
+        VtxMassHypo            = BPHY8cf.GlobalBplusMass,
+        MassMin                = BPHY8cf.GlobalBMassLowerCut,
+        MassMax                = BPHY8cf.GlobalBMassUpperCut,
+        Chi2Max                = BPHY8cf.Chi2Cut3Prong,
+        DoVertexType           = BPHY8cf.doVertexType,
+        Do3d                   = BPHY8cf.do3dProperTime,
+        UseMuCalcMass          = BPHY8cf.useMuCalcMass,
+        SubDecVtxContNames     = [BPHY8cf.DerivationName+"DiMuonCandidates"],
+        SubDecVtxHypoCondNames = ["Jpsimumu"],
+        SubDecVtxHypoFlagNames = ["JpsimumuSubDecay"],
+        OutputLevel            = WARNING)
+# f) for Bhh
+if "Bhh" in BPHY8cf.doChannels:
+    # augment and select B->hh candidates
+    BPHY8_SelectTools["Bhh"] = DerivationFramework__Select_Bmumu(
+        name                   = "BPHY8_Select_Bhh",
+        HypothesisName         = "Bhh",
+        InputVtxContainerName  = BPHY8cf.DerivationName+"DiMuonCandidates",
+        TrkMasses              = [BPHY8cf.GlobalMuonMass, BPHY8cf.GlobalMuonMass],
+        VtxMassHypo            = BPHY8cf.GlobalBsMass,
+        MassMin                = BPHY8cf.GlobalBMassLowerCut,
+        MassMax                = BPHY8cf.GlobalBMassUpperCut,
+        Chi2Max                = BPHY8cf.Chi2Cut2Prong,
+        DoVertexType           = BPHY8cf.doVertexType,
+        Do3d                   = BPHY8cf.do3dProperTime,
+        UseMuCalcMass          = BPHY8cf.useMuCalcMass,
+        OutputLevel            = WARNING)
+  
+ToolSvc += list(BPHY8_SelectTools.values())
+for BPHY8_name in list(BPHY8_SelectTools.keys()):
+    print(BPHY8_SelectTools[BPHY8_name]) 
+    pprint(BPHY8_SelectTools[BPHY8_name].properties())
+
+#--------------------------------------------------------------------
+# Setup the vertex variable blinding tools.
+# These tools are only used by the Bsmumu channel in case
+# blinding is enabled.
+
+BPHY8_BlindingTools = OrderedDict()
+BPHY8_BlinderTools  = OrderedDict()
+
+if BPHY8cf.doBmumuBlinding and not BPHY8cf.doCutBlinded:
+    # BlindingTools
+    from BPhysTools.BPhysToolsConf import xAOD__BPhysBlindingTool
+    # 1) for Bsmumu
+    if "Bsmumu" in BPHY8cf.doChannels :
+        # setup blinding tool
+        BPHY8_BlindingTools["Bsmumu"] = xAOD__BPhysBlindingTool(
+            name                = "BPHY8_BlindingTool_Bsmumu",
+            VertexContainerName = BPHY8cf.DerivationName+"DiMuonCandidates",
+            VarToBlindNames     = BPHY8cf.BlindedVars,
+            BlindingFlag        = BPHY8cf.BlindingFlag,
+            NegativeSigns       = [True, True],
+            BlindingKey         = BPHY8cf.BlindingKey,
+            OutputLevel         = INFO)
+
+    ToolSvc += list(BPHY8_BlindingTools.values())
+    for BPHY8_name in list(BPHY8_BlindingTools.keys()):
+        print(BPHY8_BlindingTools[BPHY8_name]) 
+        pprint(BPHY8_BlindingTools[BPHY8_name].properties())
+
+    # Blinders    
+    from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf \
+        import DerivationFramework__BPhysVarBlinder
+    # a2) for Bsmumu
+    if "Bsmumu" in BPHY8cf.doChannels :
+        # blind mass values for B(s)->mumu candidates
+        BPHY8_BlinderTools["Bsmumu"] = DerivationFramework__BPhysVarBlinder(
+            name           = "BPHY8_Blinder_Bsmumu",
+            BlindingTool   = BPHY8_BlindingTools["Bsmumu"],
+            EnableBlinding = True,
+            OutputLevel    = INFO)
+
+    ToolSvc += list(BPHY8_BlinderTools.values())
+    for BPHY8_name in list(BPHY8_BlinderTools.keys()):
+        print(BPHY8_BlinderTools[BPHY8_name]) 
+        pprint(BPHY8_BlinderTools[BPHY8_name].properties())
+    
+#====================================================================
+# Skimming tool to select only events with the correct vertices
+#====================================================================
+#--------------------------------------------------------------------
+# Select the event. We only want to keep events that contain certain
+# vertices which passed certain selection.  This is specified by the
+# "SelectionExpression" property, which contains the expression in the
+# following format:
+#
+#       "ContainerName.passed_HypoName > count"
+#
+# where "ContainerName" is output container form some Reco_* tool,
+# "HypoName" is the hypothesis name setup in some "Select_*" tool and
+# "count" is the number of candidates passing the selection you want to keep.
+#
+
+# Build expression depending on "select tools" used:
+# If any of them marked any candidate passed, add expression for it.
+BPHY8_expressions = []
+for BPHY8_tool in list(BPHY8_SelectTools.values()):
+    BPHY8_passName = BPHY8_tool.HypothesisName
+    if BPHY8_tool.HypothesisName == "Jpsimumu" and BPHY8cf.thinLevel > 0:
+        BPHY8_passName = "JpsimumuSubDecay"
+    BPHY8_expressions += [ "count(%s.passed_%s) > 0" % \
+                           (BPHY8_tool.InputVtxContainerName,
+                            BPHY8_passName) ]
+BPHY8cf.SelExpression = " || ".join(BPHY8_expressions)
+
+from DerivationFrameworkTools.DerivationFrameworkToolsConf \
+    import DerivationFramework__xAODStringSkimmingTool
+BPHY8_SkimmingTool = DerivationFramework__xAODStringSkimmingTool(
+    name       = "BPHY8_SelectEvent",
+    expression = BPHY8cf.SelExpression)
+
+ToolSvc += BPHY8_SkimmingTool
+print(BPHY8_SkimmingTool)
+pprint(BPHY8_SkimmingTool.properties())
+
+# Check for global ToolSvc:
+print(">>> Checking ToolSvc tools: <<<")
+for BPHY8_i in ToolSvc:
+    print(BPHY8_i)
+print(">>> End of ToolSvc tools. <<<")
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+BPHY8_streamName  = derivationFlags.WriteDAOD_BPHY8Stream.StreamName
+BPHY8_fileName    = buildFileName( derivationFlags.WriteDAOD_BPHY8Stream )
+BPHY8Stream = MSMgr.NewPoolRootStream(BPHY8_streamName, BPHY8_fileName )
+BPHY8Stream.AcceptAlgs(["BPHY8Kernel"])
+#
+# Special lines for thinning
+# Thinning service name must match the one passed to the thinning tools
+##
+## NOTE: We use the ThinningHelper which already instantiates a ThinningSvc
+##
+## from AthenaServices.Configurables import ThinningSvc, createThinningSvc
+## BPHY8_augStream = MSMgr.GetStream( BPHY8_streamName )
+## BPHY8_evtStream = BPHY8_augStream.GetEventStream()
+## svcMgr += createThinningSvc(svcName=BPHY8cf.DerivationName+"ThinningSvc",
+##           outStreams=[BPHY8_evtStream] )
+
+# Additional metadata output
+BPHY8Stream.AddMetaDataItem([ "xAOD::FileMetaData#%s*" %
+                              BPHY8cf.DerivationName,
+                              "xAOD::FileMetaDataAuxInfo#%s*Aux." %
+                              BPHY8cf.DerivationName] )
+
+#====================================================================
+# Thinning Helper and various thinning tools
+#====================================================================
+#--------------------------------------------------------------------
+# Setup the thinning helper, only tool able to perform thinning
+# of trigger navigation information.
+#
+from DerivationFrameworkCore.ThinningHelper import ThinningHelper
+BPHY8ThinningHelper = ThinningHelper( BPHY8cf.DerivationName+"ThinningHelper" )
+
+if BPHY8cf.doTrigNavThinning and BPHY8cf.doTriggerInfo:
+    BPHY8ThinningHelper.TriggerChains = '|'.join(BPHY8cf.TrigNavThinList)
+
+BPHY8ThinningHelper.AppendToStream( BPHY8Stream )
+
+#--------------------------------------------------------------------
+# Thinning tools
+BPHY8ThinningTools = []
+
+#
+# MC Truth Thinning
+#
+if BPHY8cf.isSimulation:
+    #
+    # PDG-ID list of truth decay particles whose decay chains are to be recorded
+    # B mesons
+    BPHY8cf.TruthDecayParents = [511, 521, 10511, 10521, 513, 523, 10513, 10523, 20513, 20523, 515, 525, 531, 10531, 533, 10533, 20533, 535, 541, 10541, 543, 10543, 20543, 545]
+    # b bbar mesons
+    BPHY8cf.TruthDecayParents += [551,10551,100551,110551,200551,210551,553,10553,20553,30553,100553,110553,120553,130553,200553,210553,220553,300553,9000553,9010553,555,10555,20555,100555,110555,120555,200555,557,100557]
+    BPHY8cf.TruthDecayParents += [5122,5112,5212,5222,5114,5214,5224,5132,5232,5312,5322,5314,5324,5332,5334,5142,5242,5412,5422,5414,5424,5342,5432,5434,5442,5444,5512,5522,5514,5524,5532,5534,5542,5544,5554]
+    # Charmed mesons
+    ## BPHY8cf.TruthDecayParents += [411, 421, 10411, 10421, 413, 423, 10413, 10423, 20413, 20423, 415, 425, 431, 10431, 433, 10433, 20433, 435]
+    # c cbar mesons
+    ## BPHY8cf.TruthDecayParents += [441, 10441, 100441, 443, 10443, 20443, 100443, 30443, 9000443, 9010443, 9020443, 445, 100445]
+    # charmed baryons
+    ## BPHY8cf.TruthDecayParents += [4122, 4222, 4212, 4112, 4224, 4214, 4114, 4232, 4132, 4322, 4312, 4324, 4314, 4332, 4334, 4412, 4422, 4414, 4424, 4432, 4434, 4444]
+
+    # compose ParticleSelectionString
+    BPHY8_ParticleSelConds = []
+    for BPHY8_pdgid in BPHY8cf.TruthDecayParents:
+        BPHY8_ParticleSelConds.append("abs(TruthParticles.pdgId) == %d" %
+                                      BPHY8_pdgid) 
+        BPHY8_ParticleSelection = " || ".join(BPHY8_ParticleSelConds)
+
+    # Only save truth information directly associated with B decays.
+    # We'll skip the GEANT particles (barcode >= 200000).
+    from DerivationFrameworkMCTruth.DerivationFrameworkMCTruthConf \
+        import DerivationFramework__GenericTruthThinning
+    BPHY8TruthThinTool = DerivationFramework__GenericTruthThinning(
+        name                    = BPHY8cf.DerivationName+"TruthThinTool",
+        ParticleSelectionString = BPHY8_ParticleSelection,
+        PreserveGeneratorDescendants = True,
+        PreserveDescendants     = False,
+        PreserveAncestors       = False)
+
+    ToolSvc += BPHY8TruthThinTool
+    BPHY8ThinningTools.append(BPHY8TruthThinTool)
+    print(BPHY8TruthThinTool)
+    pprint(BPHY8TruthThinTool.properties())
+
+#
+# Vertex thinning
+#
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf \
+    import DerivationFramework__Thin_vtxTrk
+
+# Build list of input containers and passed flags depending on
+# "select tools" used.
+import re
+BPHY8_vtxContainers   = []
+BPHY8_refPVContainers = []
+BPHY8_passedFlags     = []
+for BPHY8_tool in list(BPHY8_SelectTools.values()):
+    BPHY8_vtxContainers.append(BPHY8_tool.InputVtxContainerName)
+    BPHY8_refPVContainers.append(re.sub('Candidates$',
+                                        'RefittedPrimaryVertices',
+                                        BPHY8_tool.InputVtxContainerName))
+    BPHY8_passName = BPHY8_tool.HypothesisName
+    if BPHY8_tool.HypothesisName == "Jpsimumu" and BPHY8cf.thinLevel > 0:
+        BPHY8_passName = "JpsimumuSubDecay"
+    BPHY8_passedFlags.append("passed_%s" %  BPHY8_passName)
+#
+# Use the general Thin_vtxTrk tool to thin the vertex containers only.
+#
+if BPHY8cf.thinLevel < 2:
+    BPHY8Thin_vtxTrk = DerivationFramework__Thin_vtxTrk(
+        name                       = BPHY8cf.DerivationName+"Thin_vtxTrk",
+        TrackParticleContainerName = BPHY8cf.TrkPartContName,
+        VertexContainerNames       = BPHY8_vtxContainers,
+        PassFlags                  = BPHY8_passedFlags,
+        ThinTracks                 = False)
+    ToolSvc += BPHY8Thin_vtxTrk
+    BPHY8ThinningTools.append(BPHY8Thin_vtxTrk)
+    print(BPHY8Thin_vtxTrk)
+    pprint(BPHY8Thin_vtxTrk.properties())
+    
+#
+# Bmumu PV, muon collections and ID track thinnning
+#
+if BPHY8cf.thinLevel > 1:
+    from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf \
+        import DerivationFramework__BmumuThinningTool
+    BPHY8BmumuThinningTool = DerivationFramework__BmumuThinningTool(
+        name                       = BPHY8cf.DerivationName+"BmumuThinningTool",
+        TrackParticleContainerName = BPHY8cf.TrkPartContName,
+        VertexContainerNames       = BPHY8_vtxContainers,
+        VertexPassFlags            = BPHY8_passedFlags,
+        RefPVContainerNames        = BPHY8_refPVContainers,
+        # RefPVContainerNames        = BPHY8cf.RefPVContNames,
+        AlignPassToVertexList      = True,
+        PVContainerName            = BPHY8cf.PVContName,
+        MuonContainerName          = BPHY8cf.MuonCollection,
+        CalibMuonContainerName     = BPHY8cf.CalMuonCollection,
+        MatchCalibratedMuons       = (BPHY8cf.useCalibratedMuons > 2),
+        MarkMatchedMuons           = (BPHY8cf.useCalibratedMuons > 2),
+        MarkMatchedCalMuons        = (BPHY8cf.useCalibratedMuons > 1
+                                      and BPHY8cf.useCalibratedMuons < 3),
+        SyncMatchedMuonsBothWays   = True,
+        AllowFastMuonMaskSync      = True,
+        KeepTracksForMuons         = True,
+        KeepTracksForCalMuons      = True,
+        KeepMuonsForTracks         = True,
+        KeepCalMuonsForTracks      = True,
+        KeepCloseTracks            = True,
+        ThinMuons                  = (BPHY8cf.thinLevel < 5),
+        CloseTrackBranchPrefixes   = BPHY8cf.BranchPrefixes,
+        CloseTrackBranchBaseName   = BPHY8_IsoTools["TrackVtxCt"].BranchBaseName,
+        ThinPVs                    = (BPHY8cf.thinLevel == 2),
+        ThinRefittedPVs            = (BPHY8cf.thinLevel == 2),
+        ThinTracks                 = (BPHY8cf.thinLevel < 4),
+        KeepTracksForSelectedPVs   = False,
+        OutputLevel                = INFO)
+    ToolSvc += BPHY8BmumuThinningTool
+    BPHY8ThinningTools.append(BPHY8BmumuThinningTool)
+    print(BPHY8BmumuThinningTool)
+    pprint(BPHY8BmumuThinningTool.properties())
+
+#====================================================================
+# CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS  
+#====================================================================
+# IMPORTANT bit. Don't forget to pass the tools to the DerivationKernel!
+# If you don't do that, they will not be be executed!
+# The name of the kernel (BPHY8Kernel in this case) must be unique to
+# this derivation.
+# Make use of a AthSequence in order to run the muon calibrations
+# beforehand if requested.
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+BPHY8_seq = CfgMgr.AthSequencer("BPHY8Sequence")
+DerivationFrameworkJob += BPHY8_seq
+BPHY8_seq += list(BPHY8_CalibrationAlgs.values())
+
+# required for Soft B tagging
+if BPHY8cf.doAddSoftBVertices:
+    from DerivationFrameworkJetEtMiss.ExtendedJetCommon import replaceAODReducedJets
+    OutputJets["BPHY8"] = []
+    reducedJetList = ["AntiKt4PV0TrackJets"]
+    replaceAODReducedJets(reducedJetList, BPHY8_seq, "BPHY8")
+
+    from SoftBVrtClusterTool.SoftBVrtConfig import addSoftBVrt
+    addSoftBVrt(BPHY8_seq,'Loose')
+    addSoftBVrt(BPHY8_seq,'Medium')
+    addSoftBVrt(BPHY8_seq,'Tight')
+
+BPHY8_seq += CfgMgr.DerivationFramework__DerivationKernel(
+    "BPHY8Kernel",
+    OutputLevel = INFO,
+    AugmentationTools = [ BPHY8_MetaDataTool, BPHY8_AugOriginalCounts,
+                          BPHY8_MuonExtrapTool] \
+    + list(BPHY8_RecoTools.values()) + list(BPHY8_MuMassTools.values()) \
+    + list(BPHY8_IsoTools.values()) \
+    + list(BPHY8_SelectTools.values()) \
+    + list(BPHY8_BlinderTools.values()),
+    SkimmingTools     = [BPHY8_SkimmingTool],
+    ThinningTools     = BPHY8ThinningTools
+   )
+
+#====================================================================
+# Slimming 
+#====================================================================
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY8SlimmingHelper = SlimmingHelper("BPHY8SlimmingHelper")
+BPHY8_AllVariables     = []
+BPHY8_StaticContent    = []
+BPHY8_SmartCollections = []
+BPHY8_ExtraVariables   = []
+
+# Needed for trigger objects
+BPHY8SlimmingHelper.IncludeMuonTriggerContent  = BPHY8cf.doTriggerInfo
+BPHY8SlimmingHelper.IncludeBPhysTriggerContent = BPHY8cf.doTriggerInfo
+
+# primary vertices
+BPHY8_SmartCollections += [BPHY8cf.PVContName]
+#
+# 2018-03-12: These extra variables are not used by NtupleMaker
+#             which are removed by using SmartCollection instead of
+#             AllVariables.
+## BPHY8_ExtraVariables   += ["%s.covariance" % BPHY8cf.PVContName
+##                            + ".chiSquared.numberDoF.sumPt2"
+##                         + ".trackParticleLinks.trackWeights.neutralWeights"]
+#
+# 2018-05-04: The covariance matrix is occasionally used by the NtupleMaker
+# 2019-11-15: adding original number of tracks and sqrt(sum(pt^2))
+BPHY8_ExtraVariables   += ["%s.covariance" % BPHY8cf.PVContName
+                           +".OrigNTracks.OrigSqrtPt2Sum"]
+
+for BPHY8_reco in BPHY8_recoList:
+    BPHY8_StaticContent \
+        += ["xAOD::VertexContainer#BPHY8"+BPHY8_reco+"RefittedPrimaryVertices"]
+    BPHY8_StaticContent \
+        += ["xAOD::VertexAuxContainer#BPHY8"+BPHY8_reco+"RefittedPrimaryVerticesAux."]
+
+# combined / extrapolated muon track particles 
+# (note: for tagged muons there is no extra TrackParticle collection since
+# the ID tracks are stored in InDetTrackParticles collection)
+BPHY8_AllVariables += ["CombinedMuonTrackParticles"]
+
+BPHY8_AllVariables += ["ExtrapolatedMuonTrackParticles"]
+# TODO: copy smart slimming for calibrated muons.
+if BPHY8cf.useCalibratedMuons > 1:
+    BPHY8_AllVariables += [BPHY8cf.CalMuonCollection]
+    BPHY8SlimmingHelper.AppendToDictionary = {
+        '%s'    % BPHY8cf.CalMuonCollection : 'xAOD::MuonContainer',
+        '%sAux' % BPHY8cf.CalMuonCollection : 'xAOD::ShallowAuxContainer' }
+
+# muon container
+## AllVariables += [BPHY8cf.MuonCollection]
+# smart collection adds info needed for CP tools
+BPHY8_SmartCollections += [BPHY8cf.MuonCollection]
+BPHY8_ExtraVariables   += ["%s.etcone30.etcone40" % BPHY8cf.MuonCollection
+                           +".momentumBalanceSignificance"
+                           +".scatteringCurvatureSignificance"
+                           +".scatteringNeighbourSignificance"
+                           +".msInnerMatchDOF.msInnerMatchChi2"
+                           +".msOuterMatchDOF.msOuterMatchChi2"
+                           +".EnergyLoss.ParamEnergyLoss.MeasEnergyLoss"
+                           +".ET_Core" ]
+
+# ID track particles
+BPHY8_SmartCollections += [BPHY8cf.TrkPartContName]
+BPHY8_ExtraVariables += ["%s.vx.vy" % BPHY8cf.TrkPartContName]
+
+# decay candidates 
+# we have to disable vxTrackAtVertex branch since it is not xAOD compatible
+# also remove not needed isolation and close-track branches from DxAOD
+BPHY8_DoVertexTypeStr = ['PV_MIN_Z0_BA']
+BPHY8_IsoBranches     = ['iso', 'iso_Ntracks']
+BPHY8_MuIsoBranches   = ['muiso', 'muiso_Ntracks', 'muiso+muLink']
+BPHY8_CtBranches      = ['ct_DCA', 'ct_DCAError', 'ct_ZCA', 'ct_ZCAError',
+                         'ct_NTracksChi2','ct_CloseTrack+Link']
+from DerivationFrameworkBPhys.BPhysPyHelpers import BPhysFilterBranches
+for BPHY8_name in list(BPHY8_RecoTools.keys()):
+    BPHY8_StaticContent += ["xAOD::VertexContainer#%s" %
+                            BPHY8_RecoTools[BPHY8_name].OutputVtxContainerName]
+    BPHY8_StaticContent += ["xAOD::VertexAuxContainer#%sAux." %
+                            BPHY8_RecoTools[BPHY8_name].OutputVtxContainerName]
+    BPHY8_str = "xAOD::VertexAuxContainer#%sAux" % \
+        BPHY8_RecoTools[BPHY8_name].OutputVtxContainerName
+    BPHY8_str += ".-vxTrackAtVertex"
+    # isolation branches
+    BPHY8_cones = ["%02d_LC%02dd%01d" % \
+                   (int(cs*10), int(BPHY8cf.IsoTrkImpLogChi2Max[i]*10),
+                    BPHY8cf.IsoDoTrkImpLogChi2Cut[i])
+                   for i,cs in enumerate(BPHY8cf.IsolationConeSizes)]
+    BPHY8_str += BPhysFilterBranches(BPHY8_name,
+                                     BPHY8_IsoBranches,
+                                     BPHY8cf.IsoIncludes,
+                                     BPHY8_DoVertexTypeStr,
+                                     BPHY8cf.IsoTrackCategoryName,
+                                     BPHY8cf.useIsoTrackTypes,
+                                     BPHY8_cones,
+                                     False)
+    # muon isolation branches
+    BPHY8_cones = ["%02d_LC%02dd%01d" % \
+                   (int(cs*10), int(BPHY8cf.MuIsoTrkImpLogChi2Max[i]*10),
+                    BPHY8cf.MuIsoDoTrkImpLogChi2Cut[i])
+                   for i,cs in enumerate(BPHY8cf.MuIsolationConeSizes)]
+    BPHY8_str += BPhysFilterBranches(BPHY8_name,
+                                     BPHY8_MuIsoBranches,
+                                     BPHY8cf.MuIsoIncludes,
+                                     BPHY8_DoVertexTypeStr,
+                                     BPHY8cf.MuIsoTrackCategoryName,
+                                     BPHY8cf.useMuIsoTrackTypes,
+                                     BPHY8_cones,
+                                     False)
+    # close track branches
+    BPHY8_str += BPhysFilterBranches(BPHY8_name,
+                                     BPHY8_CtBranches,
+                                     BPHY8cf.CloseTrackIncludes,
+                                     BPHY8_DoVertexTypeStr,
+                                     BPHY8cf.CloseTrackCategoryName,
+                                     BPHY8cf.useCloseTrackTypes,
+                                     BPHY8cf.CloseTrackChi2SetName,
+                                     True)
+    print(("Branches to be removed: %s" % BPHY8_str))
+    BPHY8_StaticContent += [ BPHY8_str ]
+
+# Truth information for MC only
+if BPHY8cf.isSimulation:
+    BPHY8_AllVariables += ["TruthEvents","TruthParticles","TruthVertices"]
+
+# required for Soft B Tagging
+if BPHY8cf.doAddSoftBVertices:
+    excludedVertexAuxData = "-vxTrackAtVertex.-MvfFitInfo.-isInitialized.-VTAV"
+    BPHY8_StaticContent += ["xAOD::VertexContainer#"
+                            +"SoftBVrtClusterTool_Tight_Vertices"]
+    BPHY8_StaticContent += ["xAOD::VertexAuxContainer#"
+                            +"SoftBVrtClusterTool_Tight_VerticesAux."
+                            + excludedVertexAuxData]
+    BPHY8_StaticContent += ["xAOD::VertexContainer#"
+                            +"SoftBVrtClusterTool_Medium_Vertices"]
+    BPHY8_StaticContent += ["xAOD::VertexAuxContainer#"
+                            +"SoftBVrtClusterTool_Medium_VerticesAux."
+                            + excludedVertexAuxData]
+    BPHY8_StaticContent += ["xAOD::VertexContainer#"
+                            +"SoftBVrtClusterTool_Loose_Vertices"]
+    BPHY8_StaticContent += ["xAOD::VertexAuxContainer#"
+                            +"SoftBVrtClusterTool_Loose_VerticesAux."
+                            + excludedVertexAuxData]
+
+BPHY8SlimmingHelper.AllVariables     = BPHY8_AllVariables
+BPHY8SlimmingHelper.SmartCollections = BPHY8_SmartCollections
+BPHY8SlimmingHelper.StaticContent    = BPHY8_StaticContent
+BPHY8SlimmingHelper.ExtraVariables   = BPHY8_ExtraVariables
+BPHY8SlimmingHelper.AppendContentToStream(BPHY8Stream)
+
+#====================================================================
+# END OF BPHY8.py
+#====================================================================
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY9.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY9.py
new file mode 100644
index 000000000000..a617264e2ce5
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/BPHY9.py
@@ -0,0 +1,398 @@
+#********************************************************************
+# BPHY9.py
+# reductionConf flag BPHY9 in Reco_tf.py   
+#********************************************************************
+
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+from DerivationFrameworkInDet.InDetCommon import *
+from DerivationFrameworkJetEtMiss.JetCommon import *
+from DerivationFrameworkEGamma.EGammaCommon import *
+from DerivationFrameworkMuons.MuonsCommon import *
+from DerivationFrameworkHiggs.TruthCategories import *
+from AthenaCommon.GlobalFlags import globalflags
+
+is_MC = globalflags.DataSource()=='geant4'
+
+print('is_MC = ',is_MC)
+
+
+if is_MC:
+    from DerivationFrameworkMCTruth.MCTruthCommon import addStandardTruthContents
+    addStandardTruthContents()
+    from DerivationFrameworkMCTruth.HFHadronsCommon import *
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+streamName  = derivationFlags.WriteDAOD_BPHY9Stream.StreamName
+fileName    = buildFileName( derivationFlags.WriteDAOD_BPHY9Stream )
+BPHY9Stream = MSMgr.NewPoolRootStream( streamName, fileName )
+BPHY9Stream.AcceptAlgs(['BPHY9Kernel'])
+
+#====================================================================
+# AUGMENTATION TOOLS
+#====================================================================
+augmentationTools = []
+
+#--------------------------------------------------------------------
+# Jpsi vertexing Tool
+#--------------------------------------------------------------------
+# 1/ setup vertexing tools and services
+include('DerivationFrameworkBPhys/configureVertexing.py')
+BPHY9_VertexTools = BPHYVertexTools('BPHY9')
+
+# 2/ Setup the vertex fitter tools (e.g. JpsiFinder, JpsiPlus1Track, etc).
+#    These are general tools independent of DerivationFramework that do the
+#    actual vertex fitting and some pre-selection.
+from JpsiUpsilonTools.JpsiUpsilonToolsConf import Analysis__JpsiFinder
+BPHY9JpsiFinder = Analysis__JpsiFinder(name                       = 'BPHY9JpsiFinder',
+                                       OutputLevel                = INFO,
+                                       muAndMu                    = True,
+                                       muAndTrack                 = False,
+                                       TrackAndTrack              = False,
+                                       assumeDiMuons              = True, # If true, will assume dimu hypothesis and use PDG value for mu mass
+                                       invMassUpper               = 100000.0,
+                                       invMassLower               = 0.0,
+                                       Chi2Cut                    = 200.,
+                                       oppChargesOnly             = True,
+                                       atLeastOneComb             = True,
+                                       useCombinedMeasurement     = False, # Only takes effect if combOnly=True
+                                       muonCollectionKey          = 'Muons',
+                                       TrackParticleCollection    = 'InDetTrackParticles',
+                                       V0VertexFitterTool         = BPHY9_VertexTools.TrkV0Fitter, # V0 vertex fitter
+                                       useV0Fitter                = False, # if False a TrkVertexFitterTool will be used
+                                       TrkVertexFitterTool        = BPHY9_VertexTools.TrkVKalVrtFitter, # VKalVrt vertex fitter
+                                       TrackSelectorTool          = BPHY9_VertexTools.InDetTrackSelectorTool,
+                                       VertexPointEstimator       = BPHY9_VertexTools.VtxPointEstimator,
+                                       useMCPCuts                 = False)
+ToolSvc += BPHY9JpsiFinder
+print(BPHY9JpsiFinder)
+
+# 3/ Setup the vertex reconstruction 'call' tool(s). They are part of the derivation framework. These Augmentation tools add 
+#    output vertex collection(s) into the StoreGate and add basic decorations which do not depend on the vertex mass hypothesis 
+#    (e.g. lxy, ptError, etc). There should be one tool per topology, i.e. Jpsi and Psi(2S) do not need two instance of the
+#    Reco tool is the JpsiFinder mass window is wide enough.
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Reco_Vertex
+BPHY9_Reco_mumu = DerivationFramework__Reco_Vertex(name                   = 'BPHY9_Reco_mumu',
+                                                 VertexSearchTool             = BPHY9JpsiFinder,
+                                                 OutputVtxContainerName = 'BPHY9OniaCandidates',
+                                                 PVContainerName        = 'PrimaryVertices',
+                                                 RefPVContainerName     = 'BPHY9RefittedPrimaryVertices',
+                                                 RefitPV                = True,
+                                                 MaxPVrefit             = 100000,
+                                                 DoVertexType           = 7)
+ToolSvc += BPHY9_Reco_mumu
+print(BPHY9_Reco_mumu)
+
+# 4/ Setup the vertex selection and augmentation tool(s). These tools decorate the vertices with variables that depend 
+#    on the vertex mass hypothesis, e.g. invariant mass, proper decay time, etc. Property HypothesisName is used as a 
+#    prefix for these decorations. They also perform tighter selection, flagging the vertecis that passed. The flag is 
+#    a Char_t branch named 'passed_'+HypothesisName. It is used later by the 'SelectEvent' and 'Thin_vtxTrk' tools to 
+#    determine which events and candidates should be kept in the output stream. Multiple instances of the Select_* tools 
+#    can be used on a single input collection as long as they use different 'HypothesisName' flags.
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Select_onia2mumu
+
+# 4a/ augment and select Jpsi->mumu candidates
+BPHY9_Select_Jpsi2mumu = DerivationFramework__Select_onia2mumu(name                  = 'BPHY9_Select_Jpsi2mumu',
+                                                               HypothesisName        = 'Jpsi',
+                                                               InputVtxContainerName = 'BPHY9OniaCandidates',
+                                                               VtxMassHypo           = 3096.916,
+                                                               MassMin               = 2000.0,
+                                                               MassMax               = 3600.0,
+                                                               Chi2Max               = 200,
+                                                               DoVertexType          = 7)
+ToolSvc += BPHY9_Select_Jpsi2mumu
+print(BPHY9_Select_Jpsi2mumu)
+
+# 4b/ augment and select Psi(2S)->mumu candidates
+BPHY9_Select_Psi2mumu = DerivationFramework__Select_onia2mumu(name                  = 'BPHY9_Select_Psi2mumu',
+                                                              HypothesisName        = 'Psi',
+                                                              InputVtxContainerName = 'BPHY9OniaCandidates',
+                                                              VtxMassHypo           = 3686.09,
+                                                              MassMin               = 3300.0,
+                                                              MassMax               = 4500.0,
+                                                              Chi2Max               = 200,
+                                                              DoVertexType          = 7)
+ToolSvc += BPHY9_Select_Psi2mumu
+print(BPHY9_Select_Psi2mumu)
+
+# 5/ select the event. We only want to keep events that contain certain vertices which passed certain selection.
+#    This is specified by the 'SelectionExpression' property, which contains the expression in the following format:
+#       'ContainerName.passed_HypoName > count'
+#    where 'ContainerName' is output container form some Reco_* tool, 'HypoName' is the hypothesis name setup in some 'Select_*'
+#    tool and 'count' is the number of candidates passing the selection you want to keep.
+
+# Skimming
+# a/ High pt lepton
+ptSelection = '( count(Electrons.pt > 20*GeV) > 0 || count(Muons.pt > 20*GeV) > 0 )'
+# b/ >3 total leptons
+threelepSelection = '( count(Muons.pt > 0) + count(Electrons.pt > 0) >= 3 )'
+# c/ di-muon vertex near Onia peak
+oniaSelection = '( count(BPHY9OniaCandidates.passed_Jpsi) > 0 || count(BPHY9OniaCandidates.passed_Psi) > 0 )'
+# &
+expression = oniaSelection + ' && ' + threelepSelection + ' && ' + ptSelection
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+BPHY9_SelectEvent = DerivationFramework__xAODStringSkimmingTool(name       = 'BPHY9_SelectEvent',
+                                                                expression = expression)
+ToolSvc += BPHY9_SelectEvent
+
+# 6/ Track and vertex thinning. We want to remove all reconstructed secondary vertices which hasn't passed any of the 
+#    selections defined by (Select_*) tools. We also want to keep only tracks which are associates with either muons or 
+#    any of the vertices that passed the selection. Multiple thinning tools can perform the selection. The final thinning 
+#    decision is based OR of all the decisions (by default, although it can be changed by the JO).
+
+# 6a/ Thining out vertices that didn't pass any selection and idetifying tracks associated with selected vertices. The 
+#     'VertexContainerNames' is a list of the vertex containers, and 'PassFlags' contains all pass flags for Select_* 
+#     tools that must be satisfied. The vertex is kept is it satisfy any of the listed selections.
+
+from DerivationFrameworkBPhys.DerivationFrameworkBPhysConf import DerivationFramework__Thin_vtxTrk
+BPHY9Thin_vtxTrk = DerivationFramework__Thin_vtxTrk(name                       = 'BPHY9Thin_vtxTrk',
+                                                    TrackParticleContainerName = 'InDetTrackParticles',
+                                                    VertexContainerNames       = ['BPHY9OniaCandidates'],
+                                                    PassFlags                  = ['passed_Jpsi', 'passed_Psi'] )
+ToolSvc += BPHY9Thin_vtxTrk
+
+# 6b/ thinning out tracks that are not attached to muons. The final thinning decision is based on the OR operation
+#    between decision from this and the previous tools.
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__MuonTrackParticleThinning
+BPHY9MuonTPThinningTool = DerivationFramework__MuonTrackParticleThinning(name                   = 'BPHY9MuonTPThinningTool',
+                                                                         MuonKey                = 'Muons',
+                                                                         InDetTrackParticlesKey = 'InDetTrackParticles')
+ToolSvc += BPHY9MuonTPThinningTool
+
+# 6c/ Only save truth informtion directly associated with Onia
+from DerivationFrameworkMCTruth.DerivationFrameworkMCTruthConf import DerivationFramework__GenericTruthThinning
+BPHY9TruthThinTool = DerivationFramework__GenericTruthThinning(name                    = 'BPHY9TruthThinTool',
+                                                               ParticleSelectionString = 'TruthParticles.pdgId==443 || TruthParticles.pdgId==100443',
+                                                               PreserveDescendants     = True,
+                                                               PreserveAncestors       = True)
+ToolSvc += BPHY9TruthThinTool
+print(BPHY9TruthThinTool)
+
+#==============================================================================
+# BACKGROUND ELECTRON DECORATION TYPE/ORIGIN
+#==============================================================================
+# PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/trunk/src/BkgElectronClassification.cxx
+
+if is_MC:
+    from MCTruthClassifier.MCTruthClassifierBase import MCTruthClassifier as BkgElectronMCTruthClassifier   
+    from DerivationFrameworkEGamma.DerivationFrameworkEGammaConf import DerivationFramework__BkgElectronClassification 
+    BPHY9BkgElectronClassificationTool = DerivationFramework__BkgElectronClassification (name = 'BkgElectronClassificationTool',
+                                                                                         MCTruthClassifierTool = BkgElectronMCTruthClassifier)
+    ToolSvc += BPHY9BkgElectronClassificationTool
+    augmentationTools.append(BPHY9BkgElectronClassificationTool)
+    print('BkgElectronClassificationTool: ', BPHY9BkgElectronClassificationTool)
+
+#====================================================================
+# THINNING TOOLS
+#====================================================================
+thinningTools=[]
+
+# Establish the thinning helper (which will set up the services behind the scenes)
+from DerivationFrameworkCore.ThinningHelper import ThinningHelper
+BPHY9ThinningHelper = ThinningHelper( 'BPHY9ThinningHelper' )
+
+# Trigger Thinning Tool
+elTrig = '^(?!.*_[0-9]*(mu|j|xe|tau|ht|xs|te))(?!HLT_e.*_[0-9]*e.*)HLT_e.*lhloose.*'\
+       +'|^(?!.*_[0-9]*(mu|j|xe|tau|ht|xs|te))(?!HLT_e.*_[0-9]*e.*)HLT_e.*lhmedium.*'\
+       +'|^(?!.*_[0-9]*(mu|j|xe|tau|ht|xs|te))(?!HLT_e.*_[0-9]*e.*)HLT_e.*lhtight.*'\
+       +'|^(?!.*_[0-9]*(mu|j|xe|tau|ht|xs|te))(?!HLT_e.*_[0-9]*e.*)HLT_e.*lhvloose.*'
+muTrig = '^(?!.*_[0-9]*(e|j|xe|tau|ht|xs|te))(?!HLT_mu.*_[0-9]*mu.*)HLT_mu.*'
+BPHY9ThinningHelper.TriggerChains = elTrig + '|' + muTrig
+BPHY9ThinningHelper.AppendToStream( BPHY9Stream )
+
+# Jet tracks
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__JetTrackParticleThinning
+BPHY9JetTPThinningTool = DerivationFramework__JetTrackParticleThinning(name                   = 'BPHY9JetTPThinningTool',
+                                                                       JetKey                 = 'AntiKt4EMTopoJets',
+                                                                       InDetTrackParticlesKey = 'InDetTrackParticles',
+                                                                       ApplyAnd               = True)
+ToolSvc += BPHY9JetTPThinningTool
+thinningTools.append(BPHY9JetTPThinningTool)
+
+# Tracks associated with Muons
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__MuonTrackParticleThinning
+BPHY9MuonTPThinningTool = DerivationFramework__MuonTrackParticleThinning(name                   = 'BPHY9MuonTPThinningTool',
+                                                                         MuonKey                = 'Muons',
+                                                                         InDetTrackParticlesKey = 'InDetTrackParticles')
+ToolSvc += BPHY9MuonTPThinningTool
+thinningTools.append(BPHY9MuonTPThinningTool)
+
+# Tracks associated with Electrons
+from DerivationFrameworkInDet.DerivationFrameworkInDetConf import DerivationFramework__EgammaTrackParticleThinning
+BPHY9ElectronTPThinningTool = DerivationFramework__EgammaTrackParticleThinning(name                   = 'BPHY9ElectronTPThinningTool',
+                                                                               SGKey                  = 'Electrons',
+                                                                               InDetTrackParticlesKey = 'InDetTrackParticles')
+ToolSvc += BPHY9ElectronTPThinningTool
+thinningTools.append(BPHY9ElectronTPThinningTool)
+
+#====================================================================
+# Truth Thinning
+#====================================================================
+# Truth selection strings
+truth_cond_lep_list = [
+'(abs(TruthParticles.pdgId)>=11 && abs(TruthParticles.pdgId)<=14)',
+'(TruthParticles.pt > 4.0*GeV)',
+'(TruthParticles.status == 1)',
+'(TruthParticles.barcode<200000)']
+truth_cond_lep = ' && '.join(truth_cond_lep_list)
+truth_cond_photon = '(abs(TruthParticles.pdgId)==22) && (TruthParticles.pt>1*GeV)'
+truth_cond_comb = '('+truth_cond_lep+') || ('+truth_cond_photon+')'
+
+# PreserveGeneratorDescendants only keeps particles that came directly from the event generator
+# PreserveDescendants keeps all particles including those that come from Geant processes
+BPHY9TruthTool = DerivationFramework__GenericTruthThinning(name                         = 'BPHY9TruthTool',
+                                                           ParticleSelectionString      = truth_cond_comb,
+                                                           PreserveDescendants          = True,
+                                                           PreserveGeneratorDescendants = False,
+                                                           PreserveAncestors            = True,
+                                                           TauHandling                  = False)
+
+from DerivationFrameworkMCTruth.DerivationFrameworkMCTruthConf import DerivationFramework__MenuTruthThinning
+BPHY9TruthToolMenu = DerivationFramework__MenuTruthThinning(name                = 'BPHY9TruthToolMenu',
+                                                            WritePartons        = False,
+                                                            WriteHadrons        = False,
+                                                            WriteBHadrons       = False,
+                                                            WriteGeant          = False,
+                                                            GeantPhotonPtThresh = -1.0,
+                                                            WriteTauHad         = False,
+                                                            PartonPtThresh      = -1.0,
+                                                            WriteBSM            = False,
+                                                            WriteBosons         = True,
+                                                            WriteBSMProducts    = False,
+                                                            WriteBosonProducts  = True,
+                                                            WriteTopAndDecays   = True,
+                                                            WriteEverything     = False,
+                                                            WriteAllLeptons     = True,
+                                                            WriteStatus3        = False,
+                                                            WriteFirstN         = -1)
+
+if is_MC:
+    ToolSvc += BPHY9TruthTool
+    thinningTools.append(BPHY9TruthTool)
+    ToolSvc += BPHY9TruthToolMenu
+    thinningTools.append(BPHY9TruthToolMenu)
+
+#=======================================
+# CREATE PRIVATE SEQUENCE  
+#=======================================
+BPHY9Seq = CfgMgr.AthSequencer('BPHY9Sequence')
+from DerivationFrameworkFlavourTag.FlavourTagCommon import FlavorTagInit
+FlavorTagInit(JetCollections=['AntiKt4EMPFlowJets'], Sequencer=BPHY9Seq)
+#=======================================
+# CREATE THE DERIVATION KERNEL ALGORITHM   
+#=======================================
+BPHY9ThinningTools = [BPHY9Thin_vtxTrk, BPHY9MuonTPThinningTool]
+if is_MC:
+    BPHY9ThinningTools.append(BPHY9TruthThinTool)
+
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+DerivationFrameworkJob += CfgMgr.DerivationFramework__DerivationKernel(
+    'BPHY9Kernel',
+    AugmentationTools = [BPHY9_Reco_mumu, BPHY9_Select_Jpsi2mumu, BPHY9_Select_Psi2mumu],
+    SkimmingTools = [BPHY9_SelectEvent])
+
+#====================================================================
+# JetTagNonPromptLepton decorations
+#====================================================================
+import JetTagNonPromptLepton.JetTagNonPromptLeptonConfig as JetTagConfig
+# Build AntiKt4PV0TrackJets and run b-tagging
+JetTagConfig.ConfigureAntiKt4PV0TrackJets(BPHY9Seq, 'BPHY9')
+# Add BDT decoration algs
+BPHY9Seq += JetTagConfig.GetDecoratePromptLeptonAlgs()
+DerivationFrameworkJob += BPHY9Seq
+
+#====================================================================
+# SLIMMING TOOL
+#====================================================================
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+BPHY9SlimmingHelper = SlimmingHelper('BPHY9SlimmingHelper')
+
+# Slimming for recontruction content
+BPHY9SlimmingHelper.AllVariables = []
+
+BPHY9SlimmingHelper.SmartCollections = ['AntiKt4EMPFlowJets',
+                                        'AntiKt4EMPFlowJets_BTagging201903',
+                                        'AntiKt4EMTopoJets',
+                                        'AntiKt4EMTopoJets_BTagging201810',
+                                        'BTagging_AntiKt4EMPFlow_201903',
+                                        'BTagging_AntiKt4EMTopo_201810',
+                                        'Electrons',
+                                        'InDetTrackParticles',
+                                        'MET_Reference_AntiKt4EMPFlow',
+                                        'MET_Reference_AntiKt4EMTopo',
+                                        'Muons',
+                                        'PrimaryVertices']
+
+extraJetVariables = '.JetEMScaleMomentum_pt.JetEMScaleMomentum_eta.JetEMScaleMomentum_phi.JetEMScaleMomentum_m'\
+                   +'.ConeTruthLabelID.PartonTruthLabelID.SumPtTrkPt1000.Jvt.JvtJvfcorr.JvtRpt'\
+                   +'.HECFrac.LArQuality.HECQuality.NegativeE.AverageLArQF'
+
+BPHY9SlimmingHelper.ExtraVariables = ['AntiKt4EMPFlowJets'+extraJetVariables,
+                                      'AntiKt4EMTopoJets'+extraJetVariables,
+                                      'CombinedMuonTrackParticles'+'.z0'
+                                                                  +'.vz'
+                                                                  +'.definingParametersCovMatrix',
+                                      'Electrons'+'.author'
+                                                 +'.charge',
+                                      'ExtrapolatedMuonTrackParticles'+'.z0'
+                                                                      +'.vz'
+                                                                      +'.definingParametersCovMatrix',
+                                      'GSFTrackParticles'+'.z0'
+                                                         +'.vz'
+                                                         +'.definingParametersCovMatrix',
+                                      'Muons'+'.clusterLink'
+                                             +'.allAuthors'
+                                             +'.charge'
+                                             +'.extrapolatedMuonSpectrometerTrackParticleLink'
+                                             +'.scatteringCurvatureSignificance'
+                                             +'.scatteringNeighbourSignificance',
+                                      'PrimaryVertices'+'.x'
+                                                       +'.y']
+
+BPHY9Stream.StaticContent = []
+
+# Slimming for truth content
+if is_MC:
+  BPHY9SlimmingHelper.AllVariables += ['TruthParticles',
+                                       'TruthEvents',
+                                       'TruthVertices']
+
+  BPHY9SlimmingHelper.SmartCollections += ['AntiKt4TruthJets',
+                                           'AntiKt4TruthWZJets']
+
+  BPHY9SlimmingHelper.ExtraVariables += ['CombinedMuonTrackParticles'+'.truthOrigin'
+                                                                     +'.truthType'
+                                                                     +'.truthParticleLink',
+                                         'Electrons'+'.truthOrigin'
+                                                    +'.truthType'
+                                                    +'.truthParticleLink'
+                                                    +'.bkgTruthType'
+                                                    +'.bkgTruthOrigin'
+                                                    +'.bkgTruthParticleLink'
+                                                    +'.bkgMotherPdgId'
+                                                    +'.deltaPhi1',
+                                         'InDetTrackParticles'+'.truthOrigin'
+                                                              +'.truthType'
+                                                              +'.truthParticleLink',
+                                         'MuonTruthParticles'+'.truthOrigin'
+                                                             +'.truthType'
+                                                             +'.truthParticleLink']
+
+  BPHY9SlimmingHelper.StaticContent += ['xAOD::TruthParticleContainer#TruthMuons',
+                                        'xAOD::TruthParticleAuxContainer#TruthMuonsAux.',
+                                        'xAOD::TruthParticleContainer#TruthElectrons',
+                                        'xAOD::TruthParticleAuxContainer#TruthElectronsAux.',
+                                        'xAOD::TruthParticleContainer#TruthNeutrinos',
+                                        'xAOD::TruthParticleAuxContainer#TruthNeutrinosAux.']
+
+# Slimming for trigger content
+BPHY9SlimmingHelper.IncludeEGammaTriggerContent = True
+BPHY9SlimmingHelper.IncludeMuonTriggerContent = True
+
+# Slimming for charmonia content
+BPHY9Stream.AddItem('xAOD::VertexContainer#BPHY9OniaCandidates')
+BPHY9Stream.AddItem('xAOD::VertexAuxContainer#BPHY9OniaCandidatesAux.')
+BPHY9Stream.AddItem('xAOD::VertexAuxContainer#BPHY9OniaCandidatesAux.-vxTrackAtVertex')
+
+BPHY9SlimmingHelper.AppendContentToStream(BPHY9Stream)
\ No newline at end of file
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/SaveExtraMetadataInMerge_jobOFragment.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/SaveExtraMetadataInMerge_jobOFragment.py
new file mode 100644
index 000000000000..0e7742c69c7f
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/SaveExtraMetadataInMerge_jobOFragment.py
@@ -0,0 +1,53 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+#
+# JobOption fragment to be used during DAOD merging. It takes care of
+# propagating all B-physics metadata objects to the output file.
+#
+
+# Python import(s):
+import re
+
+# Core import(s):
+from RecExConfig.InputFilePeeker import inputFileSummary
+from OutputStreamAthenaPool.MultipleStreamManager import MSMgr
+from AthenaCommon.Logging import logging
+
+# Create a logger:
+_logger = logging.getLogger( "SaveExtraMetadataInMerge_jobOFragment" )
+
+# Find the exact name of xAOD::FileMetaData_vX in the inputFileSummary
+# dictionary:
+mdType = ""
+for key in list(inputFileSummary[ 'metadata_itemsDic' ].keys()):
+    if re.match( 'xAOD::FileMetaData_v[0-9]+', key ):
+        mdType = key
+        break
+    pass
+
+# If there is, then let's do the rest of the setup:
+if mdType != "":
+
+    # Loop over the keys of all the xAOD::FileMetaData objects:
+    for key in inputFileSummary[ 'metadata_itemsDic' ][ mdType ]:
+
+        # If it doesn't look like a b-physics metadata object, then leave
+        # it alone:
+        if not key.endswith( '_MetaData' ):
+            continue
+
+        # Create the metadata tool for propagating this info:
+        toolName = "BPhysFileMetadataTool_%s" % key
+        ToolSvc += CfgMgr.xAODMaker__FileMetaDataTool( toolName,
+                                                       InputKey = key,
+                                                       OutputKey = key )
+        svcMgr.MetaDataSvc.MetaDataTools += [ getattr( ToolSvc, toolName ) ]
+        _logger.info( "Created tool: %s" % toolName )
+
+        # Add the metadata to the output stream(s):
+        outputItems = [ 'xAOD::FileMetaData#%s' % key,
+                        'xAOD::FileMetaDataAuxInfo#%sAux.' % key ]
+        MSMgr.AddMetaDataItemToAllStreams( outputItems )
+        _logger.info( "Added metatata items: %s" % str( outputItems ) )
+
+        pass
+    pass
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/configureConversionFinder.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/configureConversionFinder.py
new file mode 100644
index 000000000000..67b775ec0611
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/configureConversionFinder.py
@@ -0,0 +1,69 @@
+#
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#
+#====================================================================
+# Collection of tools to run the conversion finder
+#====================================================================
+
+class BPHYConversionFinderTools:
+
+    def __init__(self, derivation = ""):
+
+        if derivation == "":
+            print('--------> FATAL: BPHYConversionFinderTools, "derivation" string not set!')
+            import sys
+            sys.exit()
+
+
+        prefix = derivation+"ConversionFinderTools"
+
+        from AthenaCommon.AppMgr import ToolSvc
+
+        # set up extrapolator
+        from TrkExTools.AtlasExtrapolator import AtlasExtrapolator
+        self.Extrapolator = AtlasExtrapolator(name = prefix+"_AtlasExtrapolator")
+        ToolSvc += self.Extrapolator
+        print(self.Extrapolator)
+
+        from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+        self.InDetSecVxFitterTool = Trk__TrkVKalVrtFitter(name                = prefix+"_Fitter",
+                                                 Extrapolator        = self.Extrapolator,
+                                                 MakeExtendedVertex  = True,
+                                                 FirstMeasuredPoint  = False,
+                                                 Robustness          = 6,
+                                                 InputParticleMasses = [0.511,0.511],
+                                                 VertexForConstraint = [0.,0.,0.],
+                                                 CovVrtForConstraint = [0.015*0.015,0.,0.015*0.015,0.,0.,10000.*10000.],
+                                                 FirstMeasuredPointLimit = True,
+                                                 usePhiCnst          = True,
+                                                 useThetaCnst        = True)
+        ToolSvc += self.InDetSecVxFitterTool
+        print(self.InDetSecVxFitterTool)
+
+
+        from TrkVertexSeedFinderUtils.TrkVertexSeedFinderUtilsConf import Trk__SeedNewtonTrkDistanceFinder
+        self.InDetSecVxTrkDistanceFinder = Trk__SeedNewtonTrkDistanceFinder(name = prefix+"_TrkDistanceFinder")
+        ToolSvc += self.InDetSecVxTrkDistanceFinder
+        print(self.InDetSecVxTrkDistanceFinder)
+
+
+        from InDetConversionFinderTools.InDetConversionFinderToolsConf import InDet__VertexPointEstimator
+        self.InDetSecVtxPointEstimator = InDet__VertexPointEstimator(name = prefix+"_PointEstimator",
+                                                                MinDeltaR = [-5.,-25.,-50.], # D-R1-R2 min cut
+                                                                MaxDeltaR = [5.,10.,10.] ,  # D-R1-R2 max cut
+                                                                MaxPhi    = [0.05, 0.5, 0.5])  # dphi cut at vertex
+        ToolSvc += self.InDetSecVtxPointEstimator
+        print(self.InDetSecVtxPointEstimator)
+
+
+        from InDetConversionFinderTools.InDetConversionFinderToolsConf import InDet__ConversionPostSelector
+        self.InDetSecVtxPostSelector = InDet__ConversionPostSelector(name = prefix+"_PostSelector",
+                                                                MaxChi2Vtx       = [10.,10.,10.],
+                                                                MaxInvariantMass = [10000.,10000.,10000.],
+                                                                MinFitMomentum   = [0.,0.,0.],
+                                                                MinRadius        = [10.0,10.0,10.0],
+                                                                MinPt            = 0.0,
+                                                                MaxdR            = -10000.0,
+                                                                MaxPhiVtxTrk     = 10000.0)
+        ToolSvc += self.InDetSecVtxPostSelector
+        print(self.InDetSecVtxPostSelector)
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/configureSimpleV0Finder.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/configureSimpleV0Finder.py
new file mode 100644
index 000000000000..bf1f8ca02ee8
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/configureSimpleV0Finder.py
@@ -0,0 +1,201 @@
+#====================================================================
+# Collection of tools required by V0Finder
+#====================================================================
+
+class BPHYV0FinderTools:
+ 
+    def __init__(self, derivation = ""):
+
+        if derivation == "":
+            print('--------> FATAL: BPHYV0FinderTools, "derivation" string not set!')
+            import sys
+            sys.exit()
+
+        from AthenaCommon.AppMgr import ToolSvc
+
+        # set up extrapolator
+        from TrkExTools.AtlasExtrapolator import AtlasExtrapolator
+        self.InDetExtrapolator = AtlasExtrapolator(name             = derivation+"_AtlasExtrapolator")
+        ToolSvc += self.InDetExtrapolator
+        print(self.InDetExtrapolator)
+
+        # Vertex point estimator
+        from InDetConversionFinderTools.InDetConversionFinderToolsConf import InDet__VertexPointEstimator
+        self.V0VtxPointEstimator = InDet__VertexPointEstimator(name        = derivation+"_VtxPointEstimator",
+                                                    MaxTrkXYDiffAtVtx      = [20.,20.,20.],
+                                                    MaxTrkZDiffAtVtx       = [100.,100.,100.],
+                                                    MaxTrkXYValue          = [400.,400.,400.],
+                                                    MinArcLength           = [-800.,-800.,-800.],
+                                                    MaxArcLength           = [800.,800.,800.],
+                                                    MinDeltaR              = [-10000.,-10000.,-10000.],
+                                                    MaxDeltaR              = [10000.,10000.,10000.],
+                                                    MaxPhi                 = [10000., 10000., 10000.],
+                                                    MaxChi2OfVtxEstimation = 2000.)
+        ToolSvc += self.V0VtxPointEstimator
+        print(self.V0VtxPointEstimator)
+
+        from InDetRecExample.InDetKeys import InDetKeys
+
+        from InDetAssociationTools.InDetAssociationToolsConf import InDet__InDetPRD_AssociationToolGangedPixels
+        self.V0PrdAssociationTool = InDet__InDetPRD_AssociationToolGangedPixels(name                     = derivation+"_V0PrdAssociationTool",
+                                                                          PixelClusterAmbiguitiesMapName = InDetKeys.GangedPixelMap())
+        ToolSvc += self.V0PrdAssociationTool
+        print(self.V0PrdAssociationTool)
+
+        from RecExConfig.RecFlags import rec
+        CountDeadModulesAfterLastHit=False
+        #rec.Commissioning=False
+
+        from InDetTrackHoleSearch.InDetTrackHoleSearchConf import InDet__InDetTrackHoleSearchTool
+        self.V0HoleSearchTool = InDet__InDetTrackHoleSearchTool(name = derivation+"_V0HoleSearchTool",
+                                                          Extrapolator = self.InDetExtrapolator,
+                                                          usePixel      = DetFlags.haveRIO.pixel_on(),
+                                                          useSCT        = DetFlags.haveRIO.SCT_on(),
+                                                          #Commissioning = rec.Commissioning())
+                                                      CountDeadModulesAfterLastHit = CountDeadModulesAfterLastHit)
+        ToolSvc += self.V0HoleSearchTool
+        print(self.V0HoleSearchTool)
+
+        from InDetTrackSummaryHelperTool.InDetTrackSummaryHelperToolConf import InDet__InDetTrackSummaryHelperTool
+        self.V0TrackSummaryHelperTool = InDet__InDetTrackSummaryHelperTool(name         = derivation+"_InDetSummaryHelper",
+                                                                     AssoTool     = self.V0PrdAssociationTool,
+                                                                     DoSharedHits = False,
+                                                                     HoleSearch   = self.V0HoleSearchTool,
+                                                                     usePixel      = DetFlags.haveRIO.pixel_on(),
+                                                                     useSCT        = DetFlags.haveRIO.SCT_on(),
+                                                                     useTRT        = DetFlags.haveRIO.TRT_on())
+        ToolSvc += self.V0TrackSummaryHelperTool
+        print(self.V0TrackSummaryHelperTool)
+
+        from TrkTrackSummaryTool.TrkTrackSummaryToolConf import Trk__TrackSummaryTool
+        self.V0TrackSummaryTool = Trk__TrackSummaryTool(name = derivation+"_V0TrackSummaryTool",
+                                                  InDetSummaryHelperTool = self.V0TrackSummaryHelperTool,
+                                                  doSharedHits           = False,
+                                                  InDetHoleSearchTool    = self.V0HoleSearchTool)
+        ToolSvc += self.V0TrackSummaryTool
+        print(self.V0TrackSummaryTool)
+
+
+
+        from InDetTrackSelectorTool.InDetTrackSelectorToolConf import InDet__InDetConversionTrackSelectorTool
+        self.InDetV0VxTrackSelector = InDet__InDetConversionTrackSelectorTool(name                = derivation+"InDetV0VxTrackSelector",
+                                                                              TrackSummaryTool    = self.V0TrackSummaryTool,
+                                                                              Extrapolator        = self.InDetExtrapolator,
+             #                                                                 Extrapolator        = "Trk::Extrapolator/InDetExtrapolator",
+                                                                              maxTrtD0            = 50.,
+                                                                              maxSiZ0             = 250.,
+                                                                              significanceD0_Si   = 1.,
+                                                                              significanceD0_Trt  = 1.,
+                                                                              significanceZ0_Trt  = 3.,
+                                                                              minPt               = 400.0,
+                                                                              IsConversion        = False)
+        ToolSvc += self.InDetV0VxTrackSelector
+        print(self.InDetV0VxTrackSelector)
+
+
+        # configure vertex fitters
+
+        from TrkV0Fitter.TrkV0FitterConf import Trk__TrkV0VertexFitter
+        self.BPhysV0Fitter = Trk__TrkV0VertexFitter(name              = derivation+'_BPhysV0Fitter',
+                                                    MaxIterations     = 10,
+                                                    Use_deltaR        = False,
+                                                    FirstMeasuredPoint  = True,
+                                                    Extrapolator      = self.InDetExtrapolator)
+        ToolSvc += self.BPhysV0Fitter
+        print(self.BPhysV0Fitter)
+#
+        from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+        self.BPhysVKVertexFitter = Trk__TrkVKalVrtFitter(name           = derivation+"_BPhysVKVFitter",
+                                                         Extrapolator        = self.InDetExtrapolator,
+                                                         IterationNumber     = 30,
+                                                         FirstMeasuredPoint  = True,
+                                                         MakeExtendedVertex  = True)
+        ToolSvc += self.BPhysVKVertexFitter
+        print(self.BPhysVKVertexFitter)
+
+#
+        from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+        self.BPhysKshortFitter = Trk__TrkVKalVrtFitter(name                = derivation+"_BPhysVKKVFitter",
+                                                       Extrapolator        = self.InDetExtrapolator,
+                                                       IterationNumber     = 30,
+                                                       FirstMeasuredPoint  = True,
+                                                       MakeExtendedVertex  = True,
+                                                       InputParticleMasses = [139.57,139.57],
+                                                       MassForConstraint   = 497.672)
+        ToolSvc += self.BPhysKshortFitter
+        print(self.BPhysKshortFitter)
+#
+        from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+        self.BPhysLambdaFitter = Trk__TrkVKalVrtFitter(name                = derivation+"_BPhysVKLFitter",
+                                                       Extrapolator        = self.InDetExtrapolator,
+                                                       IterationNumber     = 30,
+                                                       FirstMeasuredPoint  = True,
+                                                       MakeExtendedVertex  = True,
+                                                       InputParticleMasses = [938.272,139.57],
+                                                       MassForConstraint   = 1115.68)
+        ToolSvc += self.BPhysLambdaFitter
+        print(self.BPhysLambdaFitter)
+#
+        from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+        self.BPhysLambdabarFitter = Trk__TrkVKalVrtFitter(name                = derivation+"_BPhysVKLbFitter",
+                                                          Extrapolator        = self.InDetExtrapolator,
+                                                          IterationNumber     = 30,
+                                                          FirstMeasuredPoint  = True,
+                                                          MakeExtendedVertex  = True,
+                                                          InputParticleMasses = [139.57,938.272],
+                                                          MassForConstraint   = 1115.68)
+        ToolSvc += self.BPhysLambdabarFitter
+        print(self.BPhysLambdabarFitter)
+#
+        from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+        self.BPhysGammaFitter = Trk__TrkVKalVrtFitter(name                = derivation+"_BPhysVKGFitter",
+                                                      Extrapolator        = self.InDetExtrapolator,
+                                                      IterationNumber     = 30,
+                                                      Robustness          = 6,
+                                                      FirstMeasuredPoint  = True,
+                                                      MakeExtendedVertex  = True,
+                                                      usePhiCnst          = True,
+                                                      useThetaCnst        = True,
+                                                      InputParticleMasses = [0.511,0.511])
+        ToolSvc += self.BPhysGammaFitter
+        print(self.BPhysGammaFitter)
+
+##--------------------------------------------
+## Setup V0Finder
+##--------------------------------------------
+        from InDetV0Finder.InDetV0FinderConf import InDet__InDetV0FinderTool
+        self.V0FinderTool = InDet__InDetV0FinderTool(name                    = derivation+'_InDetV0FinderTool',
+                                                     TrackParticleCollection = InDetKeys.xAODTrackParticleContainer(),
+                                                     #TrackParticleCollection = "InDetTrackParticles",
+                                                     useV0Fitter             = True,
+                                                     VertexFitterTool        = self.BPhysV0Fitter,
+                                                     VKVertexFitterTool      = self.BPhysVKVertexFitter,
+                                                     KshortFitterTool        = self.BPhysKshortFitter,
+                                                     LambdaFitterTool        = self.BPhysLambdaFitter,
+                                                     LambdabarFitterTool     = self.BPhysLambdabarFitter,
+                                                     GammaFitterTool         = self.BPhysGammaFitter,
+                                                     TrackSelectorTool       = self.InDetV0VxTrackSelector,
+                                                     VertexPointEstimator    = self.V0VtxPointEstimator,
+                                                     doSimpleV0              = True,
+                                                     #useorigin               = False,
+                                                     #useTRTplusTRT           = True,
+                                                     #useTRTplusSi            = True,
+                                                     useVertexCollection     = True,
+                                                     #trkSelPV                = True,
+                                                     Extrapolator            = self.InDetExtrapolator)
+                                                     #Extrapolator            = "Trk::Extrapolator/InDetExtrapolator")
+        ToolSvc += self.V0FinderTool
+        print(self.V0FinderTool)
+
+        #from InDetV0Finder.InDetV0FinderConf import InDet__InDetV0Finder
+        #self.InDetV0Finder = InDet__InDetV0Finder(name                    = derivation+'InDetV0Finder',
+        #                                          #decorateV0              = False,
+        #                                          InDetV0FinderToolName   = V0FinderTool,
+        #                                          V0ContainerName         = InDetKeys.xAODV0VertexContainer(),
+        #                                          KshortContainerName     = InDetKeys.xAODKshortVertexContainer(),
+        #                                          LambdaContainerName     = InDetKeys.xAODLambdaVertexContainer(),
+        #                                          LambdabarContainerName  = InDetKeys.xAODLambdabarVertexContainer())
+        #topSequence += self.InDetV0Finder
+        #print      self.InDetV0Finder
+
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/configureV0Finder.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/configureV0Finder.py
new file mode 100644
index 000000000000..0add564e26b9
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/configureV0Finder.py
@@ -0,0 +1,202 @@
+#====================================================================
+# Collection of tools required by V0Finder
+#====================================================================
+
+class BPHYV0FinderTools:
+ 
+    def __init__(self, derivation = ""):
+
+        if derivation == "":
+            print('--------> FATAL: BPHYV0FinderTools, "derivation" string not set!')
+            import sys
+            sys.exit()
+
+        from AthenaCommon.AppMgr import ToolSvc
+
+        # set up extrapolator
+        from TrkExTools.AtlasExtrapolator import AtlasExtrapolator
+        self.InDetExtrapolator = AtlasExtrapolator(name             = derivation+"_AtlasExtrapolator")
+        ToolSvc += self.InDetExtrapolator
+        print(self.InDetExtrapolator)
+
+        # Vertex point estimator
+        from InDetConversionFinderTools.InDetConversionFinderToolsConf import InDet__VertexPointEstimator
+        self.V0VtxPointEstimator = InDet__VertexPointEstimator(name        = derivation+"_VtxPointEstimator",
+                                                    MaxTrkXYDiffAtVtx      = [20.,20.,20.],
+                                                    MaxTrkZDiffAtVtx       = [100.,100.,100.],
+                                                    MaxTrkXYValue          = [400.,400.,400.],
+                                                    MinArcLength           = [-800.,-800.,-800.],
+                                                    MaxArcLength           = [800.,800.,800.],
+                                                    MinDeltaR              = [-10000.,-10000.,-10000.],
+                                                    MaxDeltaR              = [10000.,10000.,10000.],
+                                                    MaxPhi                 = [10000., 10000., 10000.],
+                                                    MaxChi2OfVtxEstimation = 2000.)
+        ToolSvc += self.V0VtxPointEstimator
+        print(self.V0VtxPointEstimator)
+
+        from InDetRecExample.InDetKeys import InDetKeys
+
+        from InDetAssociationTools.InDetAssociationToolsConf import InDet__InDetPRD_AssociationToolGangedPixels
+        self.V0PrdAssociationTool = InDet__InDetPRD_AssociationToolGangedPixels(name                     = derivation+"_V0PrdAssociationTool",
+                                                                          PixelClusterAmbiguitiesMapName = InDetKeys.GangedPixelMap())
+        ToolSvc += self.V0PrdAssociationTool
+        print(self.V0PrdAssociationTool)
+
+        from RecExConfig.RecFlags import rec
+        CountDeadModulesAfterLastHit=False
+        #rec.Commissioning=False
+
+        from InDetTrackHoleSearch.InDetTrackHoleSearchConf import InDet__InDetTrackHoleSearchTool
+        self.V0HoleSearchTool = InDet__InDetTrackHoleSearchTool(name = derivation+"_V0HoleSearchTool",
+                                                          Extrapolator = self.InDetExtrapolator,
+                                                          usePixel      = DetFlags.haveRIO.pixel_on(),
+                                                          useSCT        = DetFlags.haveRIO.SCT_on(),
+                                                          #Commissioning = rec.Commissioning())
+                                                      CountDeadModulesAfterLastHit = CountDeadModulesAfterLastHit)
+        ToolSvc += self.V0HoleSearchTool
+        print(self.V0HoleSearchTool)
+
+        from InDetTrackSummaryHelperTool.InDetTrackSummaryHelperToolConf import InDet__InDetTrackSummaryHelperTool
+        self.V0TrackSummaryHelperTool = InDet__InDetTrackSummaryHelperTool(name         = derivation+"_InDetSummaryHelper",
+                                                                     AssoTool     = self.V0PrdAssociationTool,
+                                                                     DoSharedHits = False,
+                                                                     HoleSearch   = self.V0HoleSearchTool,
+                                                                     usePixel      = DetFlags.haveRIO.pixel_on(),
+                                                                     useSCT        = DetFlags.haveRIO.SCT_on(),
+                                                                     useTRT        = DetFlags.haveRIO.TRT_on())
+        ToolSvc += self.V0TrackSummaryHelperTool
+        print(self.V0TrackSummaryHelperTool)
+
+        from TrkTrackSummaryTool.TrkTrackSummaryToolConf import Trk__TrackSummaryTool
+        self.V0TrackSummaryTool = Trk__TrackSummaryTool(name = derivation+"_V0TrackSummaryTool",
+                                                  InDetSummaryHelperTool = self.V0TrackSummaryHelperTool,
+                                                  doSharedHits           = False,
+                                                  InDetHoleSearchTool    = self.V0HoleSearchTool)
+        ToolSvc += self.V0TrackSummaryTool
+        print(self.V0TrackSummaryTool)
+
+
+
+        from InDetTrackSelectorTool.InDetTrackSelectorToolConf import InDet__InDetConversionTrackSelectorTool
+        self.InDetV0VxTrackSelector = InDet__InDetConversionTrackSelectorTool(name                = derivation+"InDetV0VxTrackSelector",
+                                                                              TrackSummaryTool    = self.V0TrackSummaryTool,
+                                                                              Extrapolator        = self.InDetExtrapolator,
+             #                                                                 Extrapolator        = "Trk::Extrapolator/InDetExtrapolator",
+                                                                              maxTrtD0            = 50.,
+                                                                              maxSiZ0             = 250.,
+                                                                              significanceD0_Si   = 1.,
+                                                                              significanceD0_Trt  = 1.,
+                                                                              significanceZ0_Trt  = 3.,
+                                                                              minPt               = 400.0,
+                                                                              IsConversion        = False)
+        ToolSvc += self.InDetV0VxTrackSelector
+        print(self.InDetV0VxTrackSelector)
+
+
+        # configure vertex fitters
+
+        from TrkV0Fitter.TrkV0FitterConf import Trk__TrkV0VertexFitter
+        self.BPhysV0Fitter = Trk__TrkV0VertexFitter(name              = derivation+'_BPhysV0Fitter',
+                                                    MaxIterations     = 10,
+                                                    Use_deltaR        = False,
+                                                    FirstMeasuredPoint  = True,
+                                                    Extrapolator      = self.InDetExtrapolator)
+        ToolSvc += self.BPhysV0Fitter
+        print(self.BPhysV0Fitter)
+#
+        from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+        self.BPhysVKVertexFitter = Trk__TrkVKalVrtFitter(name           = derivation+"_BPhysVKVFitter",
+                                                         Extrapolator        = self.InDetExtrapolator,
+                                                         IterationNumber     = 30,
+                                                         FirstMeasuredPoint  = True,
+                                                         MakeExtendedVertex  = True)
+        ToolSvc += self.BPhysVKVertexFitter
+        print(self.BPhysVKVertexFitter)
+
+#
+        from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+        self.BPhysKshortFitter = Trk__TrkVKalVrtFitter(name                = derivation+"_BPhysVKKVFitter",
+                                                       Extrapolator        = self.InDetExtrapolator,
+                                                       IterationNumber     = 30,
+                                                       FirstMeasuredPoint  = True,
+                                                       MakeExtendedVertex  = True,
+                                                       InputParticleMasses = [139.57,139.57],
+                                                       MassForConstraint   = 497.672)
+        ToolSvc += self.BPhysKshortFitter
+        print(self.BPhysKshortFitter)
+#
+        from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+        self.BPhysLambdaFitter = Trk__TrkVKalVrtFitter(name                = derivation+"_BPhysVKLFitter",
+                                                       Extrapolator        = self.InDetExtrapolator,
+                                                       IterationNumber     = 30,
+                                                       FirstMeasuredPoint  = True,
+                                                       MakeExtendedVertex  = True,
+                                                       InputParticleMasses = [938.272,139.57],
+                                                       MassForConstraint   = 1115.68)
+        ToolSvc += self.BPhysLambdaFitter
+        print(self.BPhysLambdaFitter)
+#
+        from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+        self.BPhysLambdabarFitter = Trk__TrkVKalVrtFitter(name                = derivation+"_BPhysVKLbFitter",
+                                                          Extrapolator        = self.InDetExtrapolator,
+                                                          IterationNumber     = 30,
+                                                          FirstMeasuredPoint  = True,
+                                                          MakeExtendedVertex  = True,
+                                                          InputParticleMasses = [139.57,938.272],
+                                                          MassForConstraint   = 1115.68)
+        ToolSvc += self.BPhysLambdabarFitter
+        print(self.BPhysLambdabarFitter)
+#
+        from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+        self.BPhysGammaFitter = Trk__TrkVKalVrtFitter(name                = derivation+"_BPhysVKGFitter",
+                                                      Extrapolator        = self.InDetExtrapolator,
+                                                      IterationNumber     = 30,
+                                                      Robustness          = 6,
+                                                      FirstMeasuredPoint  = True,
+                                                      MakeExtendedVertex  = True,
+                                                      usePhiCnst          = True,
+                                                      useThetaCnst        = True,
+                                                      InputParticleMasses = [0.511,0.511])
+        ToolSvc += self.BPhysGammaFitter
+        print(self.BPhysGammaFitter)
+
+##--------------------------------------------
+## Setup V0Finder
+##--------------------------------------------
+        from InDetV0Finder.InDetV0FinderConf import InDet__InDetV0FinderTool
+        self.V0FinderTool = InDet__InDetV0FinderTool(name                    = derivation+'_InDetV0FinderTool',
+                                                     TrackParticleCollection = InDetKeys.xAODTrackParticleContainer(),
+                                                     #TrackParticleCollection = "InDetTrackParticles",
+                                                     useV0Fitter             = True,
+                                                     VertexFitterTool        = self.BPhysV0Fitter,
+                                                     VKVertexFitterTool      = self.BPhysVKVertexFitter,
+                                                     KshortFitterTool        = self.BPhysKshortFitter,
+                                                     LambdaFitterTool        = self.BPhysLambdaFitter,
+                                                     LambdabarFitterTool     = self.BPhysLambdabarFitter,
+                                                     GammaFitterTool         = self.BPhysGammaFitter,
+                                                     TrackSelectorTool       = self.InDetV0VxTrackSelector,
+                                                     VertexPointEstimator    = self.V0VtxPointEstimator,
+                                                     doSimpleV0              = False,
+                                                     #doSimpleV0              = True,
+                                                     #useorigin               = False,
+                                                     #useTRTplusTRT           = True,
+                                                     #useTRTplusSi            = True,
+                                                     useVertexCollection     = True,
+                                                     #trkSelPV                = True,
+                                                     Extrapolator            = self.InDetExtrapolator)
+                                                     #Extrapolator            = "Trk::Extrapolator/InDetExtrapolator")
+        ToolSvc += self.V0FinderTool
+        print(self.V0FinderTool)
+
+        #from InDetV0Finder.InDetV0FinderConf import InDet__InDetV0Finder
+        #self.InDetV0Finder = InDet__InDetV0Finder(name                    = derivation+'InDetV0Finder',
+        #                                          #decorateV0              = False,
+        #                                          InDetV0FinderToolName   = V0FinderTool,
+        #                                          V0ContainerName         = InDetKeys.xAODV0VertexContainer(),
+        #                                          KshortContainerName     = InDetKeys.xAODKshortVertexContainer(),
+        #                                          LambdaContainerName     = InDetKeys.xAODLambdaVertexContainer(),
+        #                                          LambdabarContainerName  = InDetKeys.xAODLambdabarVertexContainer())
+        #topSequence += self.InDetV0Finder
+        #print      self.InDetV0Finder
+
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/configureVertexing.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/configureVertexing.py
new file mode 100644
index 000000000000..a3746d92509c
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/share/configureVertexing.py
@@ -0,0 +1,148 @@
+#====================================================================
+# Collection of tools required by JpsiFinder
+# Based on JpsiUpsilonTools/configureServices.py
+#====================================================================
+
+class BPHYVertexTools:
+ 
+    def __init__(self, derivation = ""):
+
+        if derivation == "":
+            print ('--------> FATAL: BPHYVertexTools, "derivation" string not set!')
+            import sys
+            sys.exit()
+
+        from AthenaCommon.AppMgr import ToolSvc
+
+        # set up extrapolator
+        from TrkExTools.AtlasExtrapolator import AtlasExtrapolator
+        self.InDetExtrapolator = AtlasExtrapolator(name             = derivation+"_AtlasExtrapolator")
+        ToolSvc += self.InDetExtrapolator
+        print((self.InDetExtrapolator))
+
+        # Vertex point estimator
+        from InDetConversionFinderTools.InDetConversionFinderToolsConf import InDet__VertexPointEstimator
+        self.VtxPointEstimator = InDet__VertexPointEstimator(name             = derivation+"_VtxPointEstimator",
+                                                    MinDeltaR              = [-10000.,-10000.,-10000.],
+                                                    MaxDeltaR              = [10000.,10000.,10000.],
+                                                    MaxPhi                 = [10000., 10000., 10000.],
+                                                    MaxChi2OfVtxEstimation = 2000.)
+        ToolSvc += self.VtxPointEstimator
+        print((self.VtxPointEstimator))
+
+        from InDetConversionFinderTools.InDetConversionFinderToolsConf import InDet__ConversionFinderUtils
+        self.InDetConversionHelper = InDet__ConversionFinderUtils(name = derivation+"_InDetConversionFinderUtils")
+        ToolSvc += self.InDetConversionHelper
+        print((self.InDetConversionHelper))
+
+        from InDetRecExample.InDetKeys import InDetKeys
+
+        from InDetAssociationTools.InDetAssociationToolsConf import InDet__InDetPRD_AssociationToolGangedPixels
+        self.InDetPrdAssociationTool = InDet__InDetPRD_AssociationToolGangedPixels(name                     = derivation+"_InDetPrdAssociationTool",
+                                                                          PixelClusterAmbiguitiesMapName = InDetKeys.GangedPixelMap())
+        ToolSvc += self.InDetPrdAssociationTool
+        print((self.InDetPrdAssociationTool))
+
+        from RecExConfig.RecFlags import rec
+        CountDeadModulesAfterLastHit=False
+        #rec.Commissioning=False
+
+        from InDetTrackHoleSearch.InDetTrackHoleSearchConf import InDet__InDetTrackHoleSearchTool
+        self.InDetHoleSearchTool = InDet__InDetTrackHoleSearchTool(name = derivation+"_InDetHoleSearchTool",
+                                                          Extrapolator = self.InDetExtrapolator,
+                                                          #usePixel      = DetFlags.haveRIO.pixel_on(),
+                                                          #useSCT        = DetFlags.haveRIO.SCT_on(),
+                                                          #Commissioning = rec.Commissioning())
+		    				      CountDeadModulesAfterLastHit = CountDeadModulesAfterLastHit)	
+        ToolSvc += self.InDetHoleSearchTool
+        print((self.InDetHoleSearchTool))
+
+        from InDetTrackSummaryHelperTool.InDetTrackSummaryHelperToolConf import InDet__InDetTrackSummaryHelperTool
+        self.InDetTrackSummaryHelperTool = InDet__InDetTrackSummaryHelperTool(name         = derivation+"_InDetSummaryHelper",
+                                                                     AssoTool     = self.InDetPrdAssociationTool,
+                                                                     DoSharedHits = False,
+                                                                     HoleSearch   = self.InDetHoleSearchTool,
+                                                                     usePixel      = DetFlags.haveRIO.pixel_on(),
+                                                                     useSCT        = DetFlags.haveRIO.SCT_on(),
+                                                                     useTRT        = DetFlags.haveRIO.TRT_on())
+        ToolSvc += self.InDetTrackSummaryHelperTool
+        print((self.InDetTrackSummaryHelperTool))
+
+        from TrkTrackSummaryTool.TrkTrackSummaryToolConf import Trk__TrackSummaryTool
+        self.InDetTrackSummaryTool = Trk__TrackSummaryTool(name = derivation+"_InDetTrackSummaryTool",
+                                                  InDetSummaryHelperTool = self.InDetTrackSummaryHelperTool,
+                                                  doSharedHits           = False,
+                                                  #InDetHoleSearchTool    = self.InDetHoleSearchTool
+                                                  )
+        ToolSvc += self.InDetTrackSummaryTool
+        print((self.InDetTrackSummaryTool))
+
+        # =====================================================
+        # THIS IS WHERE THE USER CONTROLS MAIN TRACK SELECTIONS
+        # =====================================================
+        from InDetTrackSelectorTool.InDetTrackSelectorToolConf import InDet__InDetDetailedTrackSelectorTool
+        self.InDetTrackSelectorTool = InDet__InDetDetailedTrackSelectorTool(name = derivation+"_InDetDetailedTrackSelectorTool",
+                                                                       pTMin                = 400.0,
+                                                                       IPd0Max              = 10000.0,
+                                                                       IPz0Max              = 10000.0,
+                                                                       z0Max                = 10000.0,
+                                                                       sigIPd0Max           = 10000.0,
+                                                                       sigIPz0Max           = 10000.0,
+                                                                       d0significanceMax    = -1.,
+                                                                       z0significanceMax    = -1.,
+                                                                       etaMax               = 9999.,
+                                                                       useTrackSummaryInfo  = True,
+                                                                       nHitBLayer           = 0,
+                                                                       nHitPix              = 1,
+                                                                       nHitBLayerPlusPix    = 1,
+                                                                       nHitSct              = 2,
+                                                                       nHitSi               = 3,
+                                                                       nHitTrt              = 0,
+                                                                       nHitTrtHighEFractionMax = 10000.0,
+                                                                       useSharedHitInfo     = False,
+                                                                       useTrackQualityInfo  = True,
+                                                                       fitChi2OnNdfMax      = 10000.0,
+                                                                       TrtMaxEtaAcceptance  = 1.9,
+                                                                       TrackSummaryTool     = self.InDetTrackSummaryTool,
+                                                                       Extrapolator         = self.InDetExtrapolator
+                                                                      )
+        
+        ToolSvc += self.InDetTrackSelectorTool
+        print((self.InDetTrackSelectorTool))
+
+        # configure vertex fitters
+        from TrkVKalVrtFitter.TrkVKalVrtFitterConf import Trk__TrkVKalVrtFitter
+        self.TrkVKalVrtFitter = Trk__TrkVKalVrtFitter(
+                                                 name                = derivation+"_VKalVrtFitter",
+                                                 Extrapolator        = self.InDetExtrapolator,
+        #                                         MagFieldSvc         = InDetMagField,
+                                                 FirstMeasuredPoint  = False,
+                                                 #FirstMeasuredPointLimit = True,
+                                                 MakeExtendedVertex  = True)
+        ToolSvc += self.TrkVKalVrtFitter
+        print((self.TrkVKalVrtFitter))
+
+        from TrkVertexFitterUtils.TrkVertexFitterUtilsConf import Trk__FullLinearizedTrackFactory
+        self.InDetLinFactory = Trk__FullLinearizedTrackFactory(name              = derivation+"_Trk::InDetFullLinearizedTrackFactory",
+                                                      Extrapolator      = self.InDetExtrapolator,
+        #                                                  MagneticFieldTool = InDetMagField
+                                                      )
+        ToolSvc += self.InDetLinFactory
+        print((self.InDetLinFactory))
+
+
+        from TrkV0Fitter.TrkV0FitterConf import Trk__TrkV0VertexFitter
+        self.TrkV0Fitter = Trk__TrkV0VertexFitter(name              = derivation+"_TrkV0FitterName",
+                                         MaxIterations     = 10,
+                                         Use_deltaR        = False,
+                                         Extrapolator      = self.InDetExtrapolator,
+        #                                     MagneticFieldTool = InDetMagField
+                                         )
+        ToolSvc += self.TrkV0Fitter
+        print((self.TrkV0Fitter))
+
+        # Primary vertex refitting
+        from TrkVertexFitterUtils.TrkVertexFitterUtilsConf import Trk__KalmanVertexUpdator
+        self.VertexUpdator = Trk__KalmanVertexUpdator(name             = derivation+"_KalmanVertexUpdator")
+        ToolSvc += self.VertexUpdator
+        print((self.VertexUpdator))
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/AugOriginalCounts.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/AugOriginalCounts.cxx
new file mode 100644
index 000000000000..68c294d70fbe
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/AugOriginalCounts.cxx
@@ -0,0 +1,150 @@
+/* 
+   Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+/**
+ * @file   AugOriginalCounts.cxx
+ *
+ */
+
+#include "DerivationFrameworkBPhys/AugOriginalCounts.h"
+#include <StoreGate/WriteDecorHandle.h>
+#include "GaudiKernel/EventContext.h"
+
+using namespace xAOD;
+namespace DerivationFramework {
+ 
+  AugOriginalCounts::AugOriginalCounts(const std::string& t,
+                                       const std::string& n,
+                                       const IInterface* p) :
+    AthAlgTool(t,n,p),
+    m_TrackContainername("InDetTrackParticles"),
+    m_PVContainername("PrimaryVertices")
+  {
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+
+    declareProperty("TrackContainer", m_TrackContainername);
+    declareProperty("VertexContainer", m_PVContainername);
+    declareProperty("AddPVCountsByType", m_addPVCountsByType = false);
+    // decorate PVs with track counts and/or sqrt(sum(pt^2))
+    // (needed if track collection will be thinned)
+    declareProperty("AddNTracksToPVs", m_addNTracksToPVs = false);
+    declareProperty("AddSqrtPt2SumToPVs", m_addSqrtPt2SumToPVs = false);
+  }
+
+  StatusCode AugOriginalCounts::initialize()
+  {
+  	 ATH_CHECK(m_TrackContainername.initialize(SG::AllowEmpty));
+  	 ATH_CHECK(m_PVContainername.initialize(SG::AllowEmpty));
+  	 
+     if(!m_PVContainername.empty()){
+        std::string pvstring = "EventInfo.OriginalCount_";
+        pvstring += m_PVContainername.key();
+        m_OrigPVNTracks = std::move(pvstring);
+        ATH_CHECK(m_OrigPVNTracks.initialize());
+     }
+     if ( m_addPVCountsByType ) {
+        std::string pv0string = "EventInfo.OriginalCount_type0_"+m_PVContainername.key();
+        std::string pv1string = "EventInfo.OriginalCount_type1_"+m_PVContainername.key();
+        std::string pv2string = "EventInfo.OriginalCount_type2_"+m_PVContainername.key();
+        std::string pv3string = "EventInfo.OriginalCount_type3_"+m_PVContainername.key();
+        std::string pvUstring = "EventInfo.OriginalCount_typeUnknown_"+m_PVContainername.key();
+        m_OrigNtype0 = std::move(pv0string);
+        m_OrigNtype1 = std::move(pv1string);
+        m_OrigNtype2 = std::move(pv2string);
+        m_OrigNtype3 = std::move(pv3string);
+        m_OrigNtypeUnknown = std::move(pvUstring);
+        ATH_CHECK(m_OrigNtype0.initialize());
+        ATH_CHECK(m_OrigNtype1.initialize());
+        ATH_CHECK(m_OrigNtype2.initialize());
+        ATH_CHECK(m_OrigNtype3.initialize());
+        ATH_CHECK(m_OrigNtypeUnknown.initialize());
+     }
+     if ( m_addSqrtPt2SumToPVs ) {
+     	std::string trackcon  = m_PVContainername.key();
+     	trackcon += ".OriginalCount_";
+     	trackcon += m_TrackContainername.key();
+        m_OrigSqrtPt2Sum = std::move(trackcon);
+        ATH_CHECK(m_OrigSqrtPt2Sum.initialize());
+     }
+     if ( m_addNTracksToPVs ) {
+        std::string name = m_PVContainername.key();
+        name+= ".OrigNTracks";
+        m_d_nPVTracks = std::move(name);
+        ATH_CHECK(m_d_nPVTracks.initialize());
+     }
+     if(!m_TrackContainername.empty()){
+        m_OrigNTracksKeys = "EventInfo.OriginalCount_" + m_TrackContainername.key();
+        ATH_CHECK(m_OrigNTracksKeys.initialize());
+     }
+     return StatusCode::SUCCESS;
+  }
+ 
+  StatusCode AugOriginalCounts::addBranches() const
+  {
+
+  	const EventContext& ctx = Gaudi::Hive::currentContext();
+    
+    if(!m_PVContainername.empty()){
+
+      SG::WriteDecorHandle<xAOD::EventInfo, int> PV_count(m_OrigPVNTracks, ctx);
+      SG::ReadHandle<xAOD::VertexContainer> vertices(m_PVContainername, ctx);
+      PV_count(0) = vertices->size();
+      
+      if ( m_addPVCountsByType ) {
+      	SG::WriteDecorHandle<xAOD::EventInfo, int> PV0_count(m_OrigNtype0, ctx);
+      	SG::WriteDecorHandle<xAOD::EventInfo, int> PV1_count(m_OrigNtype1, ctx);
+      	SG::WriteDecorHandle<xAOD::EventInfo, int> PV2_count(m_OrigNtype2, ctx);
+      	SG::WriteDecorHandle<xAOD::EventInfo, int> PV3_count(m_OrigNtype3, ctx);
+      	SG::WriteDecorHandle<xAOD::EventInfo, int> PVUnk_count(m_OrigNtypeUnknown, ctx);
+
+        // now count
+        constexpr int nvtypes = 5;
+        int nvtc[] = {0, 0, 0, 0, 0};
+        for (auto vtx : *vertices) {
+          VxType::VertexType vt = vtx->vertexType();
+          if ( vt >=0 && vt < nvtypes ) {
+            nvtc[vt]++; // vertex types 0 - 3
+          } else {
+            nvtc[nvtypes-1]++; // unknown
+          }
+        }
+        PV0_count(0) = nvtc[0];
+        PV1_count(0) = nvtc[1];
+        PV2_count(0) = nvtc[2];
+        PV3_count(0) = nvtc[3];
+        PVUnk_count(0) = nvtc[4];
+      } // m_addPVCountsByType
+
+      // decorate PVs with track counts
+      // (needed if track collection will be thinned)
+      if ( m_addNTracksToPVs ) {
+        SG::WriteDecorHandle<xAOD::VertexContainer, int> d_nPVTracks(m_d_nPVTracks, ctx);
+        for (auto vtx : *vertices) {
+          d_nPVTracks(*vtx) = (int)vtx->nTrackParticles();
+        }
+      } // m_addNTracksToPVs
+      
+      // decorate PVs with sqrt(sum(pt^2)) of tracks
+      // (needed if track collection will be thinned)
+      if ( m_addSqrtPt2SumToPVs ) {
+      	SG::WriteDecorHandle<xAOD::VertexContainer, float> d_pvSqrtPt2Sum(m_OrigSqrtPt2Sum, ctx);
+        for (auto vtx : *vertices) {
+          float sqrtPt2Sum(0.);
+          for (auto tp : vtx->trackParticleLinks()) {
+            sqrtPt2Sum += std::sqrt(pow((*tp)->pt(),2));
+          }
+          d_pvSqrtPt2Sum(*vtx) = sqrtPt2Sum;
+        }
+      } // m_addSqrtPt2SumToPVs
+    }
+    
+    if(!m_TrackContainername.empty()){
+      SG::ReadHandle<xAOD::TrackParticleContainer> tracks(m_TrackContainername, ctx);
+      SG::WriteDecorHandle<xAOD::EventInfo, int> track_count(m_OrigNTracksKeys, ctx);
+      track_count(0) = tracks->size();
+    }
+
+    return StatusCode::SUCCESS;
+  }
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BMuonTrackIsoTool.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BMuonTrackIsoTool.cxx
new file mode 100644
index 000000000000..6cc8a053a1e8
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BMuonTrackIsoTool.cxx
@@ -0,0 +1,448 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+//============================================================================
+// BMuonTrackIsoTool.cxx
+//============================================================================
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Changes:
+//
+// Add muon track isolation information for different configurations,
+// different track selections and different PV-to-SV association methods.
+//
+// For an usage example see BPHY8.py .
+//
+// Job options provided by this class:
+// - MuonContainerName          -- name of muon container
+// - IsolationConeSizes         -- List of isolation cone sizes
+// - IsoTrkImpLogChi2Max        -- List of maximum log(chi2) cuts for
+//                                 association of tracks to the primary
+//                                 vertex picked.
+// - IsoDoTrkImpLogChi2Cut      -- apply log(chi2) cuts
+//                                 0 : don't apply log(chi2) cuts
+//                                 1 : apply log(chi2) cuts
+//                                 2 : apply log(chi2) cuts [former version]
+//                                 (The last two job options must
+//                                  contain the same number of elements
+//                                  as the IsolationConeSizes list.)
+//                           
+//============================================================================
+//
+#include "DerivationFrameworkBPhys/BMuonTrackIsoTool.h"
+#include "xAODMuon/MuonContainer.h"
+#include "xAODEventInfo/EventInfo.h"
+#include "xAODBPhys/BPhysHelper.h"
+#include "InDetTrackSelectionTool/IInDetTrackSelectionTool.h"
+#include "EventPrimitives/EventPrimitivesHelpers.h"
+
+#include "boost/format.hpp"
+#include "TVector3.h"
+#include <algorithm>
+#include <sstream>
+#include <string>
+
+namespace DerivationFramework {
+
+  //-------------------------------------------------------------------------
+  //
+  // helper class
+  BMuonTrackIsoTool::MuIsoItem::MuIsoItem(std::string Name,
+					  std::string Bname,
+					  std::string Prefix) :
+    BaseItem(Name, Bname, Prefix) {
+  }
+  
+  BMuonTrackIsoTool::MuIsoItem::~MuIsoItem() {
+  }
+  
+  void BMuonTrackIsoTool::MuIsoItem::resetVals() {
+    vIsoValues.clear();
+    vNTracks.clear();
+    vMuons.clear();
+  }
+
+  void BMuonTrackIsoTool::MuIsoItem::copyVals(const BaseItem& item) {
+    copyVals((const MuIsoItem&)item);
+  }
+  
+  void BMuonTrackIsoTool::MuIsoItem::copyVals(const MuIsoItem& item) {
+      vIsoValues = item.vIsoValues;
+      vNTracks   = item.vNTracks;
+      vMuons     = item.vMuons;
+  }
+
+  void BMuonTrackIsoTool::MuIsoItem::fill(double isoValue, int nTracks,
+					  const xAOD::Muon* muon) {
+    vIsoValues.push_back(isoValue);
+    vNTracks.push_back(nTracks);
+    vMuons.push_back(muon);
+  }
+  
+  std::string BMuonTrackIsoTool::MuIsoItem::muIsoName() {
+    return buildName();
+  }
+
+  std::string BMuonTrackIsoTool::MuIsoItem::nTracksName() {
+    return buildName("Ntracks");
+  }
+
+  std::string BMuonTrackIsoTool::MuIsoItem::muLinkName() {
+    return buildName("", "_muLink");
+  }
+
+  //--------------------------------------------------------------------------
+  BMuonTrackIsoTool::BMuonTrackIsoTool(const std::string& t,
+				       const std::string& n,
+				       const IInterface*  p)
+    : BPhysVertexTrackBase(t,n,p) {
+    
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+
+    declareProperty("MuonContainerName"     , m_muonContainerName="");
+    declareProperty("IsolationConeSizes"    , m_isoConeSizes);
+    declareProperty("IsoTrkImpLogChi2Max"   , m_isoTrkImpLogChi2Max);
+    declareProperty("IsoDoTrkImpLogChi2Cut" , m_isoDoTrkImpLogChi2Cut);
+  }
+  //--------------------------------------------------------------------------
+  StatusCode BMuonTrackIsoTool::initializeHook() {
+  
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::initializeHook() -- begin");
+
+        // check like-sized arrays
+    if ( m_isoConeSizes.size() != m_isoTrkImpLogChi2Max.size() ||
+         m_isoConeSizes.size() != m_isoDoTrkImpLogChi2Cut.size() ) {
+      ATH_MSG_ERROR("Size mismatch of IsolationConeSizes ("
+                    << m_isoConeSizes.size()
+                    << "), IsoTrkImpChi2Max ("
+                    << m_isoTrkImpLogChi2Max.size()
+                    << ") and IsoDoTrkImpChi2Cut ("
+                    << m_isoDoTrkImpLogChi2Cut.size() << ") lists!");
+    }      
+
+    // check muon container name
+    if ( m_muonContainerName == "" ) {
+      ATH_MSG_ERROR("No muon container name provided!");
+    }
+
+    // initialize results array
+    initResults();
+
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::initializeHook() -- end");
+
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+  StatusCode BMuonTrackIsoTool::finalizeHook() {
+
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::finalizeHook()");
+
+    // everything all right
+    return StatusCode::SUCCESS;
+  }
+ //--------------------------------------------------------------------------
+  StatusCode
+  BMuonTrackIsoTool::addBranchesVCSetupHook(size_t ivc) const {
+
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::addBranchesVCLoopHook() -- begin");
+
+    ATH_MSG_DEBUG("BMuonTrackisoTool::addBranchesVCSetupHook: "
+		  << "Vertex container index " << ivc
+		  << " for collection " << m_vertexContainerNames[ivc]
+		  << " with prefix " << m_branchPrefixes[ivc]);
+    
+    setResultsPrefix(m_branchPrefixes[ivc]);
+    
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::addBranchesVCSetupHook() -- end");
+   
+    // nothing to do here
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+  StatusCode
+  BMuonTrackIsoTool::addBranchesSVLoopHook(const xAOD::Vertex* vtx) const {
+
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::addBranchesSVLoopHook() -- begin");
+
+    // retrieve muon container
+    m_muons = NULL;
+    if ( m_muonContainerName != "" ) {
+      CHECK(evtStore()->retrieve(m_muons, m_muonContainerName));
+      ATH_MSG_DEBUG("Found muon collection with key " << m_muonContainerName);
+    }
+    
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::addBranchesSVLoopHook(): "
+		  "calculate muon track isolation ...");
+    CHECK(calculateValues(vtx));
+
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::addBranchesSVLoopHook(): "
+		  "save muon track isolation ...");
+    // save the isolation values
+    CHECK(saveIsolation(vtx));
+
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::addBranchesSVLoopHook() -- end");
+   
+    // nothing to do here
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+  // Calculate track isolation variables -- faster method with caching
+  //--------------------------------------------------------------------------  
+  StatusCode
+  BMuonTrackIsoTool::calcValuesHook(const xAOD::Vertex* vtx,
+				      const unsigned int ipv,
+				      const unsigned int its,
+				      const unsigned int itt) const {
+    
+    ATH_MSG_DEBUG("calcValuesHook:  ipv: " << ipv
+		  << ", its: " << its << ", itt: " << itt);
+ 
+    // candidate tracks and momentum
+    xAOD::BPhysHelper   cand(vtx);
+    TVector3            candP     = cand.totalP();
+    const xAOD::Vertex* candRefPV = cand.pv(m_pvAssocTypes[ipv]);
+
+    MuonBag  muons;
+    // TrackBag candMuTracks = findAllMuonIdTracksInDecay(cand, muons);
+    std::vector<TVector3> candMuTracks = findMuonRefTrackMomenta(cand, muons);
+    
+    TrackBag tracks = selectTracks(m_tracks, cand, ipv, its, itt);
+
+    ATH_MSG_DEBUG("calcValuesHook: found " << muons.size() <<
+		  " muons and " << candMuTracks.size() <<
+		  " tracks from B cand; " << tracks.size() <<
+		  " tracks to check.");
+    
+    // loop over isolation cones (pt and deltaR)
+    unsigned int nCones = m_isoConeSizes.size();
+    for (unsigned int ic = 0; ic < nCones; ++ic) {
+      MuIsoItem& iso = m_results[ic][its][ipv][itt];
+      // reset 
+      iso.resetVals();
+
+      // loop over refitted ID tracks for muons in candidate
+      unsigned int id(0);
+      // for (TrackBag::const_iterator muTrkItr = candMuTracks.begin();
+      // muTrkItr != candMuTracks.end(); ++muTrkItr, ++id) {
+      for (id=0; id < candMuTracks.size(); ++id) {
+      
+	// make sure there was an ID track for the muon
+	// if ( *muTrkItr != NULL ) {
+	if ( candMuTracks[id].Mag() > 0. ) {
+	
+	  const double& coneSize   = m_isoConeSizes[ic];
+	  const double& logChi2Max = m_isoTrkImpLogChi2Max[ic];
+    const int&    doLogChi2  = m_isoDoTrkImpLogChi2Cut[ic];
+
+	  double nTracksInCone = 0;
+	  double ptSumInCone   = 0.; 
+
+	  double isoValue(-5.);
+	  
+	  // make sure candRefPV exists
+	  if ( candRefPV != NULL ) {
+
+	    for (TrackBag::const_iterator trkItr = tracks.begin();
+           trkItr != tracks.end(); ++trkItr) {
+	      double deltaR = candMuTracks[id].DeltaR((*trkItr)->p4().Vect());
+	      if ( deltaR < coneSize ) {
+          double logChi2 = (doLogChi2 > 0) ?
+            getTrackCandPVLogChi2(*trkItr, candRefPV) : -9999.;
+            // next line needed exactly as is for backward validation 
+          if ( doLogChi2 == 2 ) logChi2 = abs(logChi2); 
+          if ( doLogChi2 == 0 || logChi2 < logChi2Max ) {
+            nTracksInCone++;
+            ptSumInCone += (*trkItr)->pt();
+          }
+	      } // deltaR
+	    }    
+	    // calculate result
+	    if ( ptSumInCone + candMuTracks[id].Pt() > 0. ) {
+	      isoValue = candMuTracks[id].Pt()
+          / ( ptSumInCone + candMuTracks[id].Pt() );
+	    }
+
+	  } else {
+	    isoValue = -10.;
+	  } // if candRefPV != NULL
+	    
+	  const xAOD::Muon* muon = id < muons.size() ? muons.at(id) : NULL;
+	  iso.fill(isoValue, nTracksInCone, muon);
+	} // if *muTrkItr != NULL
+      } // for muTrkItr
+    } // for ic
+
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  // Fill track isolation values from cache if found
+  //--------------------------------------------------------------------------  
+  bool BMuonTrackIsoTool::fastFillHook(const xAOD::Vertex* vtx,
+					 const int ipv) const {
+
+    ATH_MSG_DEBUG("fastFillHook: ipv: " << ipv);
+    
+    bool found(false);
+    
+    StringIntMap_t::iterator itpv =
+      m_pvAssocResMap.find(buildPvAssocCacheName(vtx, ipv));
+    if ( itpv != m_pvAssocResMap.end() ) {
+      found = true;
+      unsigned int nCones      = m_isoConeSizes.size();
+      unsigned int nTrackSels  = m_trackSelectionTools.size();
+      unsigned int nTrackTypes = m_useTrackTypes.size();
+      for (unsigned int its = 0; its < nTrackSels; ++its) {
+	for (unsigned int ic = 0; ic < nCones; ++ic) {
+	  for (unsigned int itt = 0; itt < nTrackTypes; ++itt) {
+	    m_results[ic][its][ipv][itt]
+	      .copyVals(m_results[ic][its][itpv->second][itt]);
+	  } // for its
+	} // for ic
+      } // for itt
+    } // if found
+
+    ATH_MSG_DEBUG("fastFillHook: cache index: "
+		  << buildPvAssocCacheName(vtx, ipv)
+		  << ", found ? " << found
+		  << ", ipv_ref: "
+		  << (found ? itpv->second : -1));
+
+    return found;
+  }
+  //--------------------------------------------------------------------------
+  StatusCode
+  BMuonTrackIsoTool::saveIsolation(const xAOD::Vertex* vtx) const {
+
+    typedef ElementLink<xAOD::MuonContainer> MuonLink_t;
+    typedef std::vector<MuonLink_t>          MuonLinkVector_t;
+
+    unsigned int nCones      = m_isoConeSizes.size();
+    unsigned int nTrackSels  = m_trackSelectionTools.size();
+    unsigned int nPvAssocs   = m_pvAssocTypes.size();
+    unsigned int nTrackTypes = m_useTrackTypes.size();
+
+    for (unsigned int its = 0; its < nTrackSels; ++its) {
+      for (unsigned int ipv = 0; ipv < nPvAssocs; ++ipv) {
+	for (unsigned int ic = 0; ic < nCones; ++ic) {
+	  for (unsigned int itt = 0; itt < nTrackTypes; ++itt) {
+	    MuIsoItem result = m_results[ic][its][ipv][itt];
+	    SG::AuxElement::Decorator< std::vector<float> >
+	      dv_iso_values(result.muIsoName());
+	    SG::AuxElement::Decorator< std::vector<int> >
+	      dv_iso_ntracks(result.nTracksName());
+	    dv_iso_values(*vtx)  = result.vIsoValues;
+	    dv_iso_ntracks(*vtx) = result.vNTracks; 
+	    ATH_MSG_DEBUG("BMuonTrackIsoTool::saveIsolation() -- isobn: "
+			  << result.muIsoName() << ", ntbn: "
+			  << result.nTracksName());
+	    ATH_MSG_DEBUG("BMuonTrackIsoTool::saveIsolation() -- vertex: ("
+			  << vtx->x() << ", "
+			  << vtx->y() << ", "
+			  << vtx->z() << "), N(iso): "
+			  << result.vIsoValues.size() << ", N(nTracks): "
+			  << result.vNTracks.size());
+	    MuonLinkVector_t links;
+	    for (const xAOD::Muon* muon : result.vMuons) {
+	      if ( muon != NULL ) {
+		MuonLink_t link(muon, *m_muons);
+		links.push_back(link);
+	      } else {
+		ATH_MSG_WARNING("BMuonTrackIsoTool::saveIsolation(): "
+				<< " *muon == NULL -- EL not saved!");
+	      }
+	    }
+	    vtx->auxdecor<MuonLinkVector_t>(result.muLinkName()) = links;
+	    ATH_MSG_DEBUG("BMuonTrackIsoTool::saveIsolation() -- muLinks: "
+			  << "N_saved = " << links.size() );
+	  } // for itt
+	} // for ic
+      } // for ipv
+    } // for its
+
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  void BMuonTrackIsoTool::setResultsPrefix(std::string prefix) const {
+
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::setResultsPrefix -- begin");
+
+    unsigned int nCones      = m_isoConeSizes.size();
+    unsigned int nTrackSels  = m_trackSelectionTools.size();
+    unsigned int nPvAssocs   = m_pvAssocTypes.size();
+    unsigned int nTrackTypes = m_useTrackTypes.size();
+
+    for (unsigned int its = 0; its < nTrackSels; ++its) {
+      for (unsigned int ipv = 0; ipv < nPvAssocs; ++ipv) {
+	for (unsigned int ic = 0; ic < nCones; ++ic) {
+	  for (unsigned int itt = 0; itt < nTrackTypes; ++itt) {
+	    m_results[ic][its][ipv][itt].setPrefix(prefix);
+	  } // for itt
+	} // for ic
+      } // for ipv
+    } // for its
+    
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::setResultsPrefix -- end");
+  }
+  //--------------------------------------------------------------------------
+  void BMuonTrackIsoTool::initResults() {
+
+    unsigned int nCones      = m_isoConeSizes.size();
+    unsigned int nTrackSels  = m_trackSelectionTools.size();
+    unsigned int nPvAssocs   = m_pvAssocTypes.size();
+    unsigned int nTrackTypes = m_useTrackTypes.size();
+
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::initResults -- begin");
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::initResults : nCones = " << nCones);
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::initResults : nTrackSels = "
+		  << nTrackSels);
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::initResults : nPvAssocs = "
+		  << nPvAssocs);
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::initResults : nTrackTypes = "
+		  << nTrackTypes);
+    m_results.resize(boost::extents[nCones][nTrackSels][nPvAssocs][nTrackTypes]);
+    for (unsigned int its = 0; its < nTrackSels; ++its) {
+      ATH_MSG_DEBUG("BMuonTrackIsoTool::initResults -- its = " << its);
+      for (unsigned int ipv = 0; ipv < nPvAssocs; ++ipv) {
+	ATH_MSG_DEBUG("BMuonTrackIsoTool::initResults -- ipv = " << ipv);
+	for (unsigned int ic = 0; ic < nCones; ++ic) {
+	  ATH_MSG_DEBUG("BMuonTrackIsoTool::initResults -- ic = " << ic);
+	  for (unsigned int itt = 0; itt < nTrackTypes; ++itt) {
+	    ATH_MSG_DEBUG("BMuonTrackIsoTool::initResults -- itt = " << itt);
+
+	    ATH_MSG_DEBUG("BMuonTrackIsoTool::initResults :"
+			  << m_branchBaseName << buildBranchName(ic, its,
+								 ipv, itt));
+
+	    m_results[ic][its][ipv][itt].setup(buildBranchName(ic, its,
+							       ipv, itt),
+					       m_branchBaseName);
+	  } // for itt
+	} // for ic
+      } // for ipv
+    } // for its
+    
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::initResults -- end");
+  }
+  //--------------------------------------------------------------------------
+  std::string BMuonTrackIsoTool::buildBranchName(unsigned int ic,
+						 unsigned int its,
+						 unsigned int ipv,
+						 unsigned int itt) const {
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::buildBranchName -- begin");
+    
+    double      coneSize   = m_isoConeSizes[ic];
+    double      logChi2Max = m_isoTrkImpLogChi2Max[ic];
+    int         doLogChi2  = m_isoDoTrkImpLogChi2Cut[ic];
+
+    // format it nicely
+    boost::format f("%02d_LC%02dd%1d_%s");
+    f % (int)(coneSize*10.) % (int)(logChi2Max*10.) % doLogChi2
+      % buildBranchBaseName(its, ipv, itt);
+    
+    ATH_MSG_DEBUG("BMuonTrackIsoTool::buildBranchName: " << f.str());
+
+    return f.str();
+  }
+  //--------------------------------------------------------------------------
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysAddMuonBasedInvMass.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysAddMuonBasedInvMass.cxx
new file mode 100644
index 000000000000..79a285ffcfe3
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysAddMuonBasedInvMass.cxx
@@ -0,0 +1,702 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/** 
+ *  @file   BPhysAddMuonBasedInvMass.cxx
+ *  @author Wolfgang Walkowiak <wolfgang.walkowiak@cern.ch>
+ */
+
+// includes
+#include "DerivationFrameworkBPhys/BPhysAddMuonBasedInvMass.h"
+#include "xAODTracking/VertexContainer.h"
+#include "xAODTracking/VertexAuxContainer.h"
+#include "xAODTracking/TrackParticleContainer.h"
+#include "xAODMuon/MuonContainer.h"
+#include "xAODBase/IParticleHelpers.h"
+#include "xAODBPhys/BPhysHelper.h"
+// for Amg::error():
+#include "EventPrimitives/EventPrimitivesHelpers.h"
+
+#include <sstream>
+#include <limits>
+
+namespace DerivationFramework {
+
+  //--------------------------------------------------------------------------
+  BPhysAddMuonBasedInvMass::BPhysAddMuonBasedInvMass(const std::string& t,
+						     const std::string& n,
+						     const IInterface*  p)
+    : AthAlgTool(t,n,p), m_trackToVertexTool("Reco::TrackToVertex") {
+
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+    
+    // Declare branch prefix
+    declareProperty("BranchPrefix", m_branchPrefix = "_NONE_");
+    // Necessary containers
+    declareProperty("VertexContainerName"    , m_vertexContainerName = "");
+    // track mass assignment
+    declareProperty("TrkMasses", m_trkMasses = std::vector<double>());
+    // track-to-vertex tool
+    declareProperty("TrackToVertexTool"     , m_trackToVertexTool);
+    // adjust track from muon kinematics?
+    declareProperty("AdjustToMuonKinematics", m_adjustToMuonKinematics = false);
+    // add minChi2ToAnyPV decoration
+    declareProperty("AddMinChi2ToAnyPVMode" , m_addMinChi2ToAnyPVMode = 0);
+    // name of container for primary vertices
+    declareProperty("PrimaryVertexContainerName", m_pvContainerName = "");
+    // minimum number of tracks in PV for PV to be considered in calculation
+    // of minChi2MuToAnyPV variable    
+    declareProperty("MinNTracksInPV"        , m_minNTracksInPV = 0);
+    // list of primary vertex types to consider
+    declareProperty("PVTypesToConsider"     , m_pvTypesToConsider = {1,3});
+    // PV-to-SV association types to be considered
+    declareProperty("DoVertexType"          , m_doVertexType = 63);
+  }
+  //--------------------------------------------------------------------------
+  StatusCode BPhysAddMuonBasedInvMass::initialize() {
+  
+    ATH_MSG_DEBUG("BPhysAddMuonBasedInvMass::initialize() -- begin");
+
+    // candidate vertices container
+    if ( m_vertexContainerName == "" ) {
+      ATH_MSG_ERROR("No vertex container name provided!");
+    }
+    
+    // TrackToVertexTool
+    CHECK(m_trackToVertexTool.retrieve());
+
+    // PV container if needed
+    if ( m_addMinChi2ToAnyPVMode > 0 && m_pvContainerName == "" ) {
+      ATH_MSG_ERROR("No primary vertex container name provided!");
+    }
+
+    // PV type list if needed
+    if ( m_addMinChi2ToAnyPVMode > 0 && m_pvTypesToConsider.size() == 0 ) {
+      ATH_MSG_ERROR("No primary vertex types to be considered provided!");
+    }
+
+    // PV-to-SV association type if needed
+    if ( m_addMinChi2ToAnyPVMode > 1 && m_doVertexType < 1 ) {
+      ATH_MSG_ERROR("No PV-to-SV association types to be considered provided!");
+    }
+    
+    ATH_MSG_INFO("BPhysAddMuonBasedInvMass::initialize(): "
+		 << "AdjustToMuonKinematics = " << m_adjustToMuonKinematics);
+    
+    ATH_MSG_INFO("BPhysAddMuonBasedInvMass::initialize(): "
+		 << "AddMinChi2ToAnyPVMode = " << m_addMinChi2ToAnyPVMode);
+
+    // initialize PV-to-SV association type vector
+    initPvAssocTypeVec();
+    
+    ATH_MSG_DEBUG("BPhysAddMuonBasedInvMass::initialize() -- end");
+
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+  StatusCode BPhysAddMuonBasedInvMass::finalize() {
+
+    ATH_MSG_DEBUG("BPhysAddMuonBasedInvMass::finalize()");
+
+    // everything all right
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  StatusCode BPhysAddMuonBasedInvMass::addBranches() const {
+
+    ATH_MSG_DEBUG("BPhysAddMuonBasedInvMass::addBranches() -- begin");
+    
+    // vertex container and its auxilliary store
+    xAOD::VertexContainer*     vtxContainer    = NULL;
+    xAOD::VertexAuxContainer*  vtxAuxContainer = NULL;
+
+    // retrieve from StoreGate
+    CHECK(evtStore()->retrieve(vtxContainer   , m_vertexContainerName));
+    CHECK(evtStore()->retrieve(vtxAuxContainer, m_vertexContainerName+"Aux."));
+
+    const xAOD::VertexContainer* pvContainer = NULL;
+    if ( m_addMinChi2ToAnyPVMode > 0 ) {
+      CHECK(evtStore()->retrieve(pvContainer   , m_pvContainerName));
+    }
+
+    // apply the decorations
+    std::string branchPrefix("");
+    if ( m_branchPrefix != "" && m_branchPrefix != "_NONE_" ) {
+      branchPrefix = m_branchPrefix + "_";
+    }
+    
+    // loop over secondary vertices
+    for (xAOD::VertexContainer::iterator vtxItr = vtxContainer->begin();
+	 vtxItr!=vtxContainer->end(); ++vtxItr) {
+
+      xAOD::BPhysHelper vtx(*vtxItr);
+      
+      SG::AuxElement::Decorator< float >
+	d_mucalc_mass(branchPrefix+"MUCALC_mass");
+      SG::AuxElement::Decorator< float >
+	d_mucalc_massErr(branchPrefix+"MUCALC_massErr");
+
+      // TODO: check number of muons requested!
+      std::pair<double,double> MuCalcCandMass =
+	getMuCalcMass(vtx, m_trkMasses, 2);
+
+      // fill default values
+      d_mucalc_mass(**vtxItr)    = MuCalcCandMass.first;
+      d_mucalc_massErr(**vtxItr) = MuCalcCandMass.second;
+
+      // add MinChi2ToAnyPV information if requested
+      if ( m_addMinChi2ToAnyPVMode > 0 ) {
+
+	if (m_addMinChi2ToAnyPVMode == 1) {
+	// w.r.t. to all PVs
+	  SG::AuxElement::Decorator< float >
+	    d_minChi2ToAnyPV(branchPrefix+"minLogChi2ToAnyPV");
+	  // fill it
+	  d_minChi2ToAnyPV(**vtxItr) =
+	    getMinChi2ToAnyPV(vtx, pvContainer, m_pvTypesToConsider,
+			      m_minNTracksInPV, m_addMinChi2ToAnyPVMode,
+			      xAOD::BPhysHelper::PV_MIN_A0); // dummy
+	} else if (m_addMinChi2ToAnyPVMode > 1 && m_addMinChi2ToAnyPVMode < 4) {
+	  // skip or replace associated PVs
+	  for (auto pvAssocType : m_pvAssocTypes) {
+	    SG::AuxElement::Decorator< float >
+	      d_minChi2ToAnyPV(branchPrefix+"minLogChi2ToAnyPV_"
+			       +xAOD::BPhysHelper::pv_type_str[pvAssocType]);
+	    // fill it
+	    d_minChi2ToAnyPV(**vtxItr) =
+	      getMinChi2ToAnyPV(vtx, pvContainer, m_pvTypesToConsider,
+				m_minNTracksInPV, m_addMinChi2ToAnyPVMode,
+				pvAssocType);
+	    
+	  } // for pvAssocType
+	} else {
+	  ATH_MSG_WARNING("BPhysAddMuonBasedInvMass::addBranches():"
+			  << " Undefined AddMinChi2ToAnyPVMode value: "
+			  << m_addMinChi2ToAnyPVMode);
+	}
+      } // if m_addMinChi2ToAnyPVMode
+    } // end of loop over vertices
+      
+    // clean cache
+    clearAdjTpCache();
+    
+    ATH_MSG_DEBUG("BPhysAddMuonBasedInvMass::addBranches() -- end");
+
+    // nothing to do here
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+  // Calculate invariant mass based on muon system information if available.
+  //
+  std::pair<double, double>
+  BPhysAddMuonBasedInvMass::getMuCalcMass(xAOD::BPhysHelper& vtx,
+					  std::vector<double> trkMasses,
+					  int nMuRequested) const {
+
+    std::pair<double, double> mpe(0., -1.);
+
+    std::pair<TrackBag, int> tracksWithMu = getTracksWithMuons(vtx);
+
+    if ( tracksWithMu.second == nMuRequested ) {
+      if ( tracksWithMu.first.size() == trkMasses.size() ) {
+	mpe = getInvariantMassWithError(tracksWithMu.first,
+					trkMasses,
+					vtx.vtx()->position());
+      } else {
+	ATH_MSG_WARNING("BPhysAddMuonBasedInvMass::getMuCalcMass:"
+			<< " vector sizes disagree!"
+			<< " tracksWithMu: " << tracksWithMu.first.size()
+			<< " BtrkMasses: " << trkMasses.size());
+      }
+    } else {
+      mpe.second = -10 - tracksWithMu.second;
+      ATH_MSG_DEBUG("BPhysAddMuonBasedInvMass::getMuCalcMass:"
+		    << " muon number mismatch:"
+		    << " tracksWithMu: " << tracksWithMu.second
+		    << " requested: " << nMuRequested);
+    }
+    return mpe;
+  }
+  //--------------------------------------------------------------------------
+  // Obtain a set of ID tracks for a set of muons
+  //--------------------------------------------------------------------------
+  TrackBag BPhysAddMuonBasedInvMass::getIdTracksForMuons(MuonBag& muons) const {
+
+    TrackBag muTracks;
+    
+    for (auto &muon : muons) {
+      if ( muon != nullptr ) {
+	const xAOD::TrackParticle* trk = 
+	  muon->trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
+	if ( trk != nullptr ) {
+	  muTracks.push_back(trk);
+	} else {
+	  ATH_MSG_WARNING("BPhysAddMuonBasedInvMass::getIdTracksForMuon:"
+			  << " no ID track for muon found.");
+	}
+      } else {
+	ATH_MSG_WARNING("BPhysAddMuonBasedInvMass::getIdTracksForMuon:"
+			<< " muon pointer is NULL!");
+      }
+    } // for muon
+    return muTracks;
+  }
+  //--------------------------------------------------------------------------
+  // Obtain a set of tracks with muon track information if available
+  //--------------------------------------------------------------------------
+  std::pair<TrackBag, int>
+  BPhysAddMuonBasedInvMass::getTracksWithMuons(xAOD::BPhysHelper& vtx) const {
+    
+    TrackBag            tracksWithMu;
+    int                 nMuFound = 0;
+    std::vector<int>    vnMuFound;
+
+    MuonBag muons = findAllMuonsInDecay(vtx);
+
+    if ( muons.size() > 0 ) {
+      for (int itrk=0; itrk<vtx.nRefTrks(); ++itrk) {
+	// only charged tracks are of interest
+	if ( abs(vtx.refTrkCharge(itrk)) > 0. ) {
+	  const xAOD::TrackParticle* trkParticle =
+	    (xAOD::TrackParticle*)vtx.refTrkOrigin(itrk);
+	  for (unsigned int imu = 0; imu<muons.size(); ++imu) {
+	    if ( vtx.refTrkOrigin(itrk) ==
+		 muons.at(imu)->trackParticle(xAOD::Muon::InnerDetectorTrackParticle) ) {
+	      const xAOD::TrackParticle* trkMuon = 
+		adjustTrackParticle(muons.at(imu));
+	      if ( trkMuon != NULL ) {
+		trkParticle    = trkMuon;
+		nMuFound++;
+		break;
+	      }
+	    }
+	  } // for imu
+	  tracksWithMu.push_back(trkParticle);
+	  vnMuFound.push_back(nMuFound);
+	} // for charged track
+      } // for itrk
+    } else {
+      ATH_MSG_DEBUG("BPhysAddMuonBasedInvMass::getTracksWithMuons: "
+		    "vertex contains no muons, but "
+		    << vtx.nRefTrks() << " refitted tracks ...");
+    }
+    // debug output
+    std::string svnMuFound    = "[";
+    for (unsigned int i=0; i<vnMuFound.size(); ++i) {
+      svnMuFound  += std::to_string(vnMuFound[i]) + ',';
+    }
+    svnMuFound.back()    = ']';
+    ATH_MSG_DEBUG("BPhysAddMuonBasedInvMass::getTracksWithMuons: "
+		  "nMuFound     = " << nMuFound
+		  << "\nvnMuFound    = " << svnMuFound );
+    
+    return std::pair<TrackBag, int>(tracksWithMu, nMuFound);
+  }
+  //--------------------------------------------------------------------------
+  // adjustTrackParticle: extract primary track particle from muon
+  // if configured adjust pt, eta and phi of it before returning
+  // a pointer to it.
+  //--------------------------------------------------------------------------
+  const xAOD::TrackParticle* BPhysAddMuonBasedInvMass
+  ::adjustTrackParticle(const xAOD::Muon* muon) const {
+
+    const xAOD::TrackParticle* tp  = NULL;    
+    const xAOD::TrackParticle* org = muon->primaryTrackParticle();
+
+    if ( m_adjustToMuonKinematics ) {
+      if ( org != NULL ) {
+	TpMap_t::iterator it = m_adjTpCache.find(org);
+	if ( it != m_adjTpCache.end() ) {
+	  // copy cached link
+	  tp = it->second;
+	  ATH_MSG_DEBUG("adjustTrackParticle(): from cache: tp = " << tp);
+	} else {
+	  // copy object -- this does not work because of seg fault later
+	  // xAOD::TrackParticle* newTp = new xAOD::TrackParticle(*org);
+
+	  // create new object and copy properties
+	  xAOD::TrackParticle* newTp = new xAOD::TrackParticle();
+	  newTp->makePrivateStore(*org);
+
+	  // ajdust pt, eta and phi to the muon's properties
+	  xAOD::IParticle::FourMom_t p4 = muon->p4();
+	  float qoverp = p4.P() > 0. ? 1./p4.P() : 10.e6;
+	  if ( org->qOverP() < 0. ) qoverp *= -1.;
+	  newTp->setDefiningParameters(org->d0(), org->z0(),
+				       p4.Phi(), p4.Theta(), qoverp);
+	  // cache new TrackParticle
+	  m_adjTpCache[org] = newTp;
+	  tp = newTp;
+	  ATH_MSG_DEBUG("adjustTrackParticle(): new tp = " << tp
+			<< " org = " << org);
+	} // if it != end()
+      } // if != NULL
+    } else {
+      // copy pointer
+      tp = org;
+      ATH_MSG_DEBUG("adjustTrackParticle(): copy: org: " << org
+		    << " -> tp: " << tp);
+    }
+      
+    // debug output
+    if ( org != NULL ) { 
+      ATH_MSG_DEBUG("adjustTrackParticle(): org: " << org << " ("
+		    << org->d0() << "," << org->z0() << "," << org->phi0()
+		    << "," << org->theta() << "," << org->qOverP() << ") pt: "
+		    << org->pt());
+    } else {
+      ATH_MSG_DEBUG("adjustTrackParticle(): org = NULL");
+    }
+    if ( org != NULL ) { 
+      ATH_MSG_DEBUG("adjustTrackParticle(): tp : " << tp << " ("
+		    << tp->d0() << "," << tp->z0() << "," << tp->phi0()
+		    << "," << tp->theta() << "," << tp->qOverP() << ") pt: "
+		    << tp->pt());
+    } else {
+      ATH_MSG_DEBUG("adjustTrackParticle(): tp = NULL");
+    }
+    return tp;
+  }
+  //--------------------------------------------------------------------------
+  // clearAdjTpCache: clear the cache of adjusted TrackParticles
+  //--------------------------------------------------------------------------
+  void BPhysAddMuonBasedInvMass::clearAdjTpCache() const {
+
+    for ( TpMap_t::iterator it = m_adjTpCache.begin(); it != m_adjTpCache.end();
+	  ++it) {
+      if ( it->second != NULL ) {
+	const_cast<xAOD::TrackParticle*>(it->second)->releasePrivateStore();
+	delete(it->second);
+	it->second = NULL;
+      }
+      m_adjTpCache.clear();
+    }
+  }
+  //--------------------------------------------------------------------------
+  // findAllMuonsInDecay: returns a vector of xAOD::Muon objects found
+  // in this vertex and subsequent decay vertices.
+  // Recursively calls itself if necessary.
+  //--------------------------------------------------------------------------
+  MuonBag BPhysAddMuonBasedInvMass::findAllMuonsInDecay(xAOD::BPhysHelper& vtx)
+    const {
+
+    MuonBag muons = vtx.muons();
+
+    // loop over preceeding vertices
+    for (int ivtx = 0; ivtx < vtx.nPrecedingVertices(); ++ivtx) {
+      xAOD::BPhysHelper precVtx(vtx.precedingVertex(ivtx));
+      MuonBag muonsForVtx = findAllMuonsInDecay(precVtx);
+      muons.insert(muons.end(), muonsForVtx.begin(), muonsForVtx.end());
+    }
+    return muons;
+  }
+  //--------------------------------------------------------------------------
+  // getMinChi2ToAnyPV: 
+  // Find minimum chi2 distance of signal muons w.r.t any primary vertex
+  // of required types and with a minimum number of tracks cut.
+  // It also depends on the mode w.r.t. the treatment of the associated
+  // primary vertex and the type of PV-to-SV association.
+  // Returns this minimum chi2.
+  //--------------------------------------------------------------------------
+  double
+  BPhysAddMuonBasedInvMass::getMinChi2ToAnyPV(xAOD::BPhysHelper& vtx,
+					      const xAOD::VertexContainer*
+					      pvContainer,
+					      const std::vector<int>& pvtypes,
+					      const int minNTracksInPV,
+					      const int mode,
+					      const xAOD::BPhysHelper::pv_type&
+					      pvAssocType) const {
+
+    MuonBag  muons  = findAllMuonsInDecay(vtx);
+    TrackBag tracks = getIdTracksForMuons(muons);
+    const xAOD::Vertex* origPV = nullptr;
+    const xAOD::Vertex* refPV  = nullptr;
+
+    if ( mode > 1 ) {
+      // need to obtain original PV
+      origPV = vtx.origPv(pvAssocType);
+      if ( origPV == nullptr ) {
+	ATH_MSG_WARNING("BPhysAddMuonBasedInvMass::getMinChi2ToAnyPV:"
+			<< " origPV == NULL for pvAssocType = "
+			<< pvAssocType);
+      }
+      if ( mode > 2 ) {
+	refPV  = vtx.pv(pvAssocType);
+	if ( refPV == nullptr ) {
+	  ATH_MSG_WARNING("BPhysAddMuonBasedInvMass::getMinChi2ToAnyPV:"
+			  << " refPV == NULL for pvAssocType = "
+			  << pvAssocType);
+	}
+      }
+    }
+    
+    double minChi2 = std::numeric_limits<double>::max();
+
+    for (const auto pvtx : *pvContainer) {
+      if ( pvtx != nullptr ) {
+	if ( std::find(pvtypes.begin(),pvtypes.end(),pvtx->vertexType())
+	     != pvtypes.end() ) {
+	  const xAOD::Vertex* cvtx = pvtx;
+	  // switch if PV matches original PV and replacement is requested
+	  if ( mode > 1 && pvtx == origPV ) {
+	    // mode 2 -- skip
+	    switch(mode) {
+	    case 2: // skip current PV
+	      continue;
+	      break;
+	    case 3: // replace by refitted PV
+	      if ( refPV != nullptr ) {
+		cvtx = refPV;
+	      } else {
+		ATH_MSG_WARNING("BPhysAddMuonBasedInvMass::getMinChi2ToAnyPV:"
+				<< " refPV == NULL!");
+		continue;
+	      }
+	      break;
+	    }
+	  }
+	  if ( (int)cvtx->nTrackParticles() >= minNTracksInPV ) {
+	    for (auto &track : tracks) {
+	      const Amg::Vector3D pos = cvtx->position();
+	      minChi2 = std::min(minChi2, getTrackPVChi2(*track, pos));
+	    } // for track
+	  } // if minNTracksInPV
+	} // if pvTypes in pvtypes vector
+      }  else {
+	ATH_MSG_WARNING("BPhysAddMuonBasedInvMass::getMinChi2ToAnyPV:"
+			<< " pvtx == NULL!");
+      } // if vtx != nullptr
+    } // for pvtx
+    
+    return minChi2;
+  }
+  //--------------------------------------------------------------------------
+  // getTrackPVChi2:
+  // Calculate the chi2 ( = log((d0/d0e)^2+(z0/z0e)^2) contribution of
+  // a track at the position closest to the given PV.
+  //--------------------------------------------------------------------------
+  double
+  BPhysAddMuonBasedInvMass::getTrackPVChi2(const xAOD::TrackParticle& track,
+					   const Amg::Vector3D& pos) const {
+    
+  double chi2 = -100.;
+
+  const Trk::Perigee* trkPerigee =
+    m_trackToVertexTool->perigeeAtVertex(track, pos);
+  if ( trkPerigee != NULL ) {
+    const AmgSymMatrix(5)* locError = trkPerigee->covariance();
+    if ( locError != NULL ) {
+      double d0    = trkPerigee->parameters()[Trk::d0];
+      double z0    = trkPerigee->parameters()[Trk::z0];
+      double d0Err = Amg::error(*locError, Trk::d0);
+      double z0Err = Amg::error(*locError, Trk::z0);
+      if (fabs(d0Err) > 0. && fabs(z0Err) > 0.) { 
+	chi2 = log( pow(d0/d0Err,2.0) + pow(z0/z0Err,2.0) );
+      } else {
+	ATH_MSG_WARNING("BPhysAddMuonBasedInvMass::getTrackPVChi2():"
+			<< " d0 = " << d0 << ", d0Err = " << d0Err
+			<< ", z0 = " << z0 << ", z0Err = " << z0Err);
+      }
+    } // locError != NULL
+    delete trkPerigee;
+    trkPerigee = nullptr;
+  } else {
+    ATH_MSG_WARNING("getTrackPVChi2: Could not get perigee");
+  }
+ 
+  return chi2;
+}
+  //--------------------------------------------------------------------------
+  // getInvariantMassWithError: returns invariant mass and mass error given
+  // a set of tracks, their mass hypotheses and a reference position. 
+  // Each track must have a separate mass hypothesis in
+  // the vector, and they must be in the same order as the tracks in the
+  // track vector.  Otherwise it will go horribly wrong.
+  //--------------------------------------------------------------------------
+  std::pair<double,double> BPhysAddMuonBasedInvMass::
+  getInvariantMassWithError(TrackBag trksIn,
+			    std::vector<double> massHypotheses,
+			    const Amg::Vector3D& pos) const {
+    
+  std::pair<double, double> mass(0.,0.);
+
+  // ensure there is a mass hypothesis for each track
+  if ( trksIn.size() == massHypotheses.size() ) {
+    std::vector<const xAOD::TrackParticle*>::iterator trItr = trksIn.begin();
+    std::vector<const xAOD::TrackParticle*>::iterator trItrEnd  =trksIn.end();
+    std::vector<double>::iterator massHypItr = massHypotheses.begin();
+    
+    double pxTmp,pyTmp,pzTmp,massTmp,eTmp;
+    
+    std::vector<TLorentzVector> trkMom;
+    TLorentzVector totMom;
+    std::vector<const Trk::Perigee*> trkPer;
+
+    for (;trItr != trItrEnd; trItr++,massHypItr++){
+      const Trk::Perigee* trkPerigee = 
+        m_trackToVertexTool->perigeeAtVertex(*(*trItr), pos);
+      trkPer.push_back(trkPerigee);
+      if ( trkPerigee != NULL ) {
+        // try to get the correct momentum measurement
+        pxTmp = trkPerigee->momentum()[Trk::px];
+        pyTmp = trkPerigee->momentum()[Trk::py];
+        pzTmp = trkPerigee->momentum()[Trk::pz];
+	ATH_MSG_DEBUG("getInvariantMassWithError(): pvec = ("
+		      << pxTmp << "," << pyTmp << "," << pzTmp << ")");
+      } else {
+	// otherwise default to this one
+        pxTmp = ((*trItr)->p4()).Px();
+        pyTmp = ((*trItr)->p4()).Py();
+        pzTmp = ((*trItr)->p4()).Pz();
+        ATH_MSG_WARNING("BPhysAddMuonBasedInvMass::getInvariantMassError: "
+			"defaulting to simple momentum!");
+      }
+      massTmp = *massHypItr;
+      eTmp    = pxTmp*pxTmp+pyTmp*pyTmp+pzTmp*pzTmp+massTmp*massTmp;
+      eTmp    = eTmp > 0. ? sqrt(eTmp) : 0.; 
+      TLorentzVector tmpMom(pxTmp, pyTmp, pzTmp, eTmp);
+      trkMom.push_back(tmpMom);
+      totMom += tmpMom;
+    }
+    mass.first = totMom.M();
+    double mErr2 = 0.;
+    // reset trItr
+    trItr   = trksIn.begin();
+    std::vector<TLorentzVector>::iterator      tmItr  = trkMom.begin();
+    std::vector<const Trk::Perigee*>::iterator perItr = trkPer.begin();
+    AmgVector(3) dMdP;
+    dMdP.setZero();
+    for (; tmItr != trkMom.end(); ++tmItr, ++trItr, ++perItr) {
+      dMdP(0) = (totMom.E() * tmItr->Px()/tmItr->E() - totMom.Px())/totMom.M();
+      dMdP(1) = (totMom.E() * tmItr->Py()/tmItr->E() - totMom.Py())/totMom.M();
+      dMdP(2) = (totMom.E() * tmItr->Pz()/tmItr->E() - totMom.Pz())/totMom.M();
+      if ( *perItr != NULL ) {
+        mErr2 += (dMdP.transpose() * getMomentumCov(*perItr) * dMdP)(0,0);
+      } else {
+        mErr2 += (dMdP.transpose() * getMomentumCov(*trItr ) * dMdP)(0,0);
+      }
+    }
+    mass.second = mErr2 > 0. ? sqrt(mErr2) : 0.;
+    // clean up 
+    for ( perItr = trkPer.begin(); perItr != trkPer.end(); ++perItr) {
+      delete (*perItr);
+    }
+  } else {
+    ATH_MSG_WARNING("BPhysAddMuonBasedInvMass::getInvariantMassError: "
+		    "size mismatch of tracks and mass hypotheses vectors!");
+  } // if size comparison
+
+  return mass;
+  }
+  //--------------------------------------------------------------------------
+  // 
+  // Extract the 3x3 momentum covariance matrix in (x,y,z) notation
+  // from the (phi, theta, qoverp) notation from a TrackParticle.
+  //
+  //--------------------------------------------------------------------------
+  AmgSymMatrix(3) BPhysAddMuonBasedInvMass
+    ::getMomentumCov(const xAOD::TrackParticle* track) const {
+    
+    AmgSymMatrix(3) cov;
+    cov.setZero();
+    
+    if ( track != NULL ) {
+      cov = getMomentumCov( &track->perigeeParameters() );
+    }
+    return cov;
+  }
+  //--------------------------------------------------------------------------
+  // 
+  // Extract the 3x3 momentum covariance matrix in (x,y,z) notation
+  // from the (phi, theta, qoverp) notation from a Perigee.
+  //
+  //--------------------------------------------------------------------------
+  AmgSymMatrix(3) BPhysAddMuonBasedInvMass
+    ::getMomentumCov(const Trk::Perigee* perigee) const {
+    
+    AmgSymMatrix(3) cov;
+    cov.setZero();
+
+    if ( perigee != NULL ) {
+      cov = getMomentumCov(perigee->parameters(), *perigee->covariance());
+    }
+    return cov;
+  }
+  //--------------------------------------------------------------------------
+  // Extract the 3x3 momentum covariance matrix in (x,y,z) notation
+  // from the (phi, theta, qoverp) notation from a vector of
+  // track parameters and the error matrix
+  //
+  // Coding ideas orignally taken from
+  // V0Tools::massErrorVKalVrt(...),
+  // Code converted from BPhysToolBox::getMomentumCov(...).
+  //--------------------------------------------------------------------------
+  //
+  AmgSymMatrix(3) BPhysAddMuonBasedInvMass
+    ::getMomentumCov(const AmgVector(5)& pars,
+		     const AmgSymMatrix(5)& cMatrix) const {
+    
+    AmgSymMatrix(3) cov;
+    cov.setZero();
+    
+    AmgMatrix(3,3) der;
+    der.setZero();
+    
+    double phi    = pars[Trk::phi];
+    double theta  = pars[Trk::theta];
+    double qoverp = pars[Trk::qOverP];
+
+    if ( qoverp != 0. ) {
+      AmgVector(3) p( cos(phi)*sin(theta)/fabs(qoverp),
+		      sin(phi)*sin(theta)/fabs(qoverp),
+		      cos(theta)/fabs(qoverp) );
+      
+      // d(px,py,pz)/d(phi,theta,qoverp)
+      der(0,0) = - p.y();
+      der(1,0) =   p.x();
+      der(2,0) =   0.;
+      der(0,1) =   cos(phi) * p.z();
+      der(1,1) =   sin(phi) * p.z();
+      der(2,1) = - sin(theta) / fabs(qoverp);
+      der(0,2) = - p.x()/qoverp;
+      der(1,2) = - p.y()/qoverp;
+      der(2,2) = - p.z()/qoverp;
+
+      for (unsigned int i=0; i<3; i++) {
+	for (unsigned int j=0; j<3; j++) {
+	  for (unsigned int k=0; k<3; k++) {
+	    for (unsigned int l=0; l<3; l++) {
+	      cov(i,j) += der(i,k)*cMatrix(k+2,l+2)*der(j,l);
+	    }
+	  }
+	}
+      }
+      
+      // debug output
+      ATH_MSG_DEBUG("BPhysAddMuonBasedInvMass::getTracksWithMuons:"
+		    << "\nlocalErrCov:\n" 
+		    << std::setprecision(10) << cMatrix 
+		    << "\ncov:\n" 
+		    << std::setprecision(10) << cov 
+		    << "\np: " << std::setprecision(10) << p 
+		    << "\nder:\n"
+		    << std::setprecision(10) << der);
+    } // if qoverp
+  
+    return cov;
+  }
+  //--------------------------------------------------------------------------
+  // Initialize PV-to-SV association type vector
+  //--------------------------------------------------------------------------
+  void BPhysAddMuonBasedInvMass::initPvAssocTypeVec() {
+
+    m_pvAssocTypes.clear();
+    for (unsigned int i=0; i<xAOD::BPhysHelper::n_pv_types; ++i) {
+      if ( (m_doVertexType & (1 << i)) > 0 )
+        m_pvAssocTypes.push_back((xAOD::BPhysHelper::pv_type)i);
+    }
+  }
+  //--------------------------------------------------------------------------  
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysConversionFinder.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysConversionFinder.cxx
new file mode 100644
index 000000000000..de43d2bf1184
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysConversionFinder.cxx
@@ -0,0 +1,589 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+/////////////////////////////////////////////////////////////////
+// BPhysConversionFinder.cxx, (c) ATLAS Detector software
+///////////////////////////////////////////////////////////////////
+// Author: A. Chisholm <andrew.chisholm@cern.ch>
+#include "DerivationFrameworkBPhys/BPhysConversionFinder.h"
+#include "xAODTracking/VertexContainer.h"
+#include "xAODTracking/VertexAuxContainer.h"
+#include "TrkVertexAnalysisUtils/V0Tools.h"
+#include "GaudiKernel/IPartPropSvc.h"
+#include "GeoPrimitives/GeoPrimitivesHelpers.h"
+#include "TrkVertexFitterInterfaces/IVertexFitter.h"
+#include "TrkVKalVrtFitter/TrkVKalVrtFitter.h"
+
+namespace DerivationFramework {
+
+  BPhysConversionFinder::BPhysConversionFinder(const std::string& t,
+      const std::string& n,
+      const IInterface* p) :
+    AthAlgTool(t,n,p),
+    m_v0Tools("Trk::V0Tools"),
+    m_vertexFitter("Trk::TrkVKalVrtFitter"),
+    m_vertexEstimator("InDet::VertexPointEstimator"),
+    m_distanceTool("Trk::SeedNewtonDistanceFinder/InDetConversionTrkDistanceFinder"),
+    m_postSelector("InDet::ConversionPostSelector"),
+    m_cascadeFitter("Trk::TrkVKalVrtFitter"),
+    m_inputTrackParticleContainerName("InDetTrackParticles"),
+    m_conversionContainerName("BPhysConversionCandidates"),
+    m_maxDistBetweenTracks(10.0),
+    m_maxDeltaCotTheta(0.3),
+    m_requireDeltaM(true),
+    m_maxDeltaM(3000.0)
+  {
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+
+    // Declare user-defined properties
+    declareProperty("DiMuonVertexContainer", m_diMuonCollectionToCheck);
+    declareProperty("PassFlagsToCheck", m_passFlagsToCheck);
+    declareProperty("V0Tools", m_v0Tools);
+    declareProperty("VertexFitterTool", m_vertexFitter);
+    declareProperty("VertexEstimator", m_vertexEstimator);
+    declareProperty("DistanceTool", m_distanceTool);
+    declareProperty("ConversionPostSelector", m_postSelector);
+    declareProperty("CascadeFitter", m_cascadeFitter);
+    declareProperty("InputTrackParticleContainerName", m_inputTrackParticleContainerName);
+    declareProperty("ConversionContainerName", m_conversionContainerName);
+    declareProperty("MaxDistBetweenTracks", m_maxDistBetweenTracks = 10.0); // Maximum allowed distance of minimum approach
+    declareProperty("MaxDeltaCotTheta", m_maxDeltaCotTheta = 0.3); // Maximum allowed dCotTheta between tracks
+    declareProperty("RequireDeltaM", m_requireDeltaM = true); // Only save a conversions if it's a chi_c,b candidate (must then pass "MaxDeltaM" requirement), if "False" all conversions in the event will be saved
+    declareProperty("MaxDeltaM", m_maxDeltaM = 3000.0); // Maximum mass difference between di-muon+conversion and di-muon
+
+  }
+
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+
+  StatusCode BPhysConversionFinder::initialize()
+  {
+
+    ATH_MSG_DEBUG("in initialize()");
+
+    ATH_CHECK( m_v0Tools.retrieve() );
+    ATH_CHECK( m_vertexFitter.retrieve() );
+    ATH_CHECK( m_vertexEstimator.retrieve() );
+    ATH_CHECK( m_distanceTool.retrieve() );
+    ATH_CHECK( m_postSelector.retrieve() );
+    ATH_CHECK( m_cascadeFitter.retrieve() );
+
+    return StatusCode::SUCCESS;
+
+  }
+
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+
+  StatusCode BPhysConversionFinder::finalize()
+  {
+    // everything all right
+    return StatusCode::SUCCESS;
+  }
+
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+
+  StatusCode BPhysConversionFinder::addBranches() const
+  {
+
+    int nTrackPairs_Init = 0;
+    int nTrackPairs_Selected = 0;
+    int nConv_VertexFit = 0;
+    int nConv_Selected = 0;
+    int nConv_Selected_DeltaM = 0;
+
+    std::vector<const xAOD::Vertex*> oniaVertices;
+    oniaVertices.clear();
+
+    //------------------------------------
+    // Look for di-muons
+    //------------------------------------
+    const xAOD::VertexContainer* diMuonContainer = NULL;
+    ATH_CHECK( evtStore()->retrieve(diMuonContainer, m_diMuonCollectionToCheck) );
+
+    if(diMuonContainer->size() == 0) {
+
+        ATH_MSG_DEBUG("Vertex Container (" << m_diMuonCollectionToCheck << ") is empty");
+
+    } else {
+
+        ATH_MSG_DEBUG("Vertex Container (" << m_diMuonCollectionToCheck << ") contains " << diMuonContainer->size() << " vertices");
+
+        for(xAOD::VertexContainer::const_iterator vtxItr = diMuonContainer->begin(); vtxItr != diMuonContainer->end(); ++vtxItr) {
+
+            const xAOD::Vertex* vertex = (*vtxItr);
+
+            bool passedHypothesis = false;
+
+            for(const auto &flag : m_passFlagsToCheck) {
+                bool pass = vertex->auxdata<Char_t>(flag);
+                if(pass) passedHypothesis = true;
+            }
+
+            if(passedHypothesis) {
+                oniaVertices.push_back(vertex);
+            }
+
+        }
+     }
+    //------------------------------------
+
+    // Output conversion container
+    std::unique_ptr<xAOD::VertexContainer> conversionContainer( new xAOD::VertexContainer() );
+    std::unique_ptr<xAOD::VertexAuxContainer> conversionAuxContainer( new xAOD::VertexAuxContainer() );
+    conversionContainer->setStore(conversionAuxContainer.get());
+
+    // Only call conversion finder if we've found a di-muon candidate or
+    // we really want to look for conversions independently
+    const bool callConvFinder = !m_requireDeltaM || oniaVertices.size() > 0;
+
+    if(callConvFinder) {
+
+      // Retrieve track particles from StoreGate
+      const xAOD::TrackParticleContainer* inputTrackParticles = NULL;
+      ATH_CHECK( evtStore()->retrieve(inputTrackParticles,m_inputTrackParticleContainerName) );
+
+      ATH_MSG_DEBUG("Track particle container size " <<  inputTrackParticles->size());
+
+      // Track Selection
+      std::vector<const xAOD::TrackParticle*> posTracks; posTracks.clear();
+      std::vector<const xAOD::TrackParticle*> negTracks; negTracks.clear();
+
+      // Track Loop
+      for(xAOD::TrackParticleContainer::const_iterator trkItr = inputTrackParticles->begin(); trkItr != inputTrackParticles->end(); ++trkItr) {
+
+          const xAOD::TrackParticle* track = (*trkItr);
+
+          uint8_t nSCT(0);
+          uint8_t nPIX(0);
+
+          track->summaryValue(nPIX,xAOD::numberOfPixelHits);
+          track->summaryValue(nSCT,xAOD::numberOfSCTHits);
+
+          // Don't want TRT-only tracks
+          // Require Si hits on all tracks
+          if( nSCT + nPIX < 1 ) continue;
+
+          if( track->charge() > 0.0) {
+              posTracks.push_back(track);
+          } else {
+              negTracks.push_back(track);
+          }
+
+      } // Track Loop
+
+      ATH_MSG_DEBUG(posTracks.size() + negTracks.size() << " tracks pass pre-selection");
+
+      std::vector<const xAOD::TrackParticle*>::const_iterator tpIt1;
+      std::vector<const xAOD::TrackParticle*>::const_iterator tpIt2;
+
+      // Pos Track Loop
+      for(tpIt1 = posTracks.begin(); tpIt1 != posTracks.end(); ++tpIt1) {
+
+          const xAOD::TrackParticle* trackParticle1 = (*tpIt1);
+
+          const Trk::Perigee& trackPerigee1 = trackParticle1->perigeeParameters();
+
+          // Neg Track Loop
+          for(tpIt2 = negTracks.begin(); tpIt2 != negTracks.end(); ++tpIt2) {
+
+              if (*tpIt1 == *tpIt2) continue;
+
+              const xAOD::TrackParticle* trackParticle2 = (*tpIt2);
+
+              const Trk::Perigee& trackPerigee2 = trackParticle2->perigeeParameters();
+
+              nTrackPairs_Init++;
+
+              //------------------------------------
+              // Track pair selection
+              //------------------------------------
+              const double deltaCotTheta = fabs(1./tan(trackPerigee1.parameters()[Trk::theta]) - 1./tan(trackPerigee2.parameters()[Trk::theta]));
+              if(deltaCotTheta > m_maxDeltaCotTheta) continue;
+
+              double distance = 1000000.;
+              std::optional<std::pair<Amg::Vector3D,Amg::Vector3D>> result = m_distanceTool->CalculateMinimumDistance(trackParticle1->perigeeParameters(),trackParticle2->perigeeParameters() );
+              bool gotDistance = result.has_value();
+              if(gotDistance) distance = Amg::distance (result->first, result->second);
+              if(!gotDistance || (distance > m_maxDistBetweenTracks)) continue;
+              //------------------------------------
+
+              //------------------------------------
+              // Estimate starting point + cuts on compatiblity of tracks
+              //------------------------------------
+              int sflag = 0;
+              int errorcode = 0;
+              std::map<std::string, float> vertexOutput;
+              Amg::Vector3D startingPoint = m_vertexEstimator->getCirclesIntersectionPoint(&trackPerigee1,&trackPerigee2,sflag,errorcode, vertexOutput);
+              if(errorcode != 0) continue;
+              //------------------------------------
+
+              nTrackPairs_Selected++;
+
+              std::vector<const xAOD::TrackParticle*> trackPair;
+              trackPair.clear();
+              trackPair.push_back(trackParticle1);
+              trackPair.push_back(trackParticle2);
+
+              // Do the vertex fit
+              std::unique_ptr<xAOD::Vertex> convVertexCandidate( m_vertexFitter->fit(trackPair, startingPoint) );
+
+              // Check for successful fit
+              if(convVertexCandidate != NULL) {
+
+                  ATH_MSG_DEBUG("Vertex Fit Succeeded");
+
+                  convVertexCandidate->clearTracks();
+                  ElementLink<xAOD::TrackParticleContainer> newLink1;
+                  newLink1.setElement(*tpIt1);
+                  newLink1.setStorableObject(*inputTrackParticles);
+                  ElementLink<xAOD::TrackParticleContainer> newLink2;
+                  newLink2.setElement(*tpIt2);
+                  newLink2.setStorableObject(*inputTrackParticles);
+                  convVertexCandidate->addTrackAtVertex(newLink1);
+                  convVertexCandidate->addTrackAtVertex(newLink2);
+
+                  nConv_VertexFit++;
+
+                  //------------------------------------
+                  // Post-vertexing cuts
+                  //------------------------------------
+
+                  // This is empty and only present for compatiblity.
+                  // The cut this informtion pertains to is not used for Si-Si conversions so this is OK
+                  std::vector<Amg::Vector3D> positionList;
+
+                  // Apply Si-Si converion post-selection
+                  if( !m_postSelector->selectConversionCandidate(convVertexCandidate.get(),0,positionList) ) {
+                      convVertexCandidate.reset();
+                      continue;
+                  }
+                  //------------------------------------
+
+                  nConv_Selected++;
+
+                  // Get photon momentum 3-vector
+                  const xAOD::Vertex * constConvVertex = convVertexCandidate.get();
+                  Amg::Vector3D momentum = m_v0Tools->V0Momentum(constConvVertex);
+
+                  TLorentzVector photon;
+                  photon.SetXYZM(momentum.x(),momentum.y(),momentum.z(),0.0);
+
+                  //------------------------------------
+                  // Check if conversion is consistent with a chi_c,b candidate
+                  // by requiring a small mass difference w.r.t. any di-muon in event
+                  //------------------------------------
+                  bool passDeltaM = false;
+
+                  // Use to keep track of which dimuon(s) gave a chi_c/b candidate
+                  std::vector<const xAOD::Vertex*> candidateOniaVertices;
+                  candidateOniaVertices.clear();
+
+                  for ( std::vector<const xAOD::Vertex*>::const_iterator vtxItr = oniaVertices.begin(); vtxItr != oniaVertices.end(); ++vtxItr ) {
+
+                      const xAOD::Vertex* oniaVertex = (*vtxItr);
+
+                      std::vector<float> diMuon_Px = oniaVertex->auxdata< std::vector<float> >("RefTrackPx");
+                      std::vector<float> diMuon_Py = oniaVertex->auxdata< std::vector<float> >("RefTrackPy");
+                      std::vector<float> diMuon_Pz = oniaVertex->auxdata< std::vector<float> >("RefTrackPz");
+
+                      TLorentzVector muon1, muon2;
+                      muon1.SetXYZM(diMuon_Px.at(0),diMuon_Py.at(0),diMuon_Pz.at(0),105.658);
+                      muon2.SetXYZM(diMuon_Px.at(1),diMuon_Py.at(1),diMuon_Pz.at(1),105.658);
+
+                      TLorentzVector diMuon = muon1 + muon2;
+
+                      const double deltaM = (diMuon+photon).M() - diMuon.M();
+
+                      ATH_MSG_DEBUG("Candidate DeltaM = " << deltaM << " MeV DiMuon " << oniaVertex->index() << " ( Mass = " << diMuon.M() << " MeV )");
+
+                      // Did we find a one di-muon + photon candidate with a mass diff. consistent with chi_c/b?
+                      if(deltaM < m_maxDeltaM) {
+                          passDeltaM = true;
+                          candidateOniaVertices.push_back(oniaVertex);
+                      }
+
+                  }
+
+                  // Only keep the conversion candidate if it's consistent with a chi_c,b decay
+                  if(m_requireDeltaM && !passDeltaM) {
+                      convVertexCandidate.reset();
+                      continue;
+                  }
+                  //------------------------------------
+
+                  //------------------------------------
+                  // Final conversion candidates
+                  //------------------------------------
+                  nConv_Selected_DeltaM++;
+
+                  // Keep track of which dimuon(s) gave a chi_c/b candidate
+                  std::vector< ElementLink<xAOD::VertexContainer> > diMuonLinks;
+                  diMuonLinks.clear();
+
+                  // Output of cascade fits with various di-muon mass hypotheses
+                  std::vector<float> fit_Psi1S_Px, fit_Psi1S_Py, fit_Psi1S_Pz, fit_Psi1S_M, fit_Psi1S_ChiSq;
+                  std::vector<float> fit_Psi2S_Px, fit_Psi2S_Py, fit_Psi2S_Pz, fit_Psi2S_M, fit_Psi2S_ChiSq;
+                  std::vector<float> fit_Upsi1S_Px, fit_Upsi1S_Py, fit_Upsi1S_Pz, fit_Upsi1S_M, fit_Upsi1S_ChiSq;
+                  std::vector<float> fit_Upsi2S_Px, fit_Upsi2S_Py, fit_Upsi2S_Pz, fit_Upsi2S_M, fit_Upsi2S_ChiSq;
+                  std::vector<float> fit_Upsi3S_Px, fit_Upsi3S_Py, fit_Upsi3S_Pz, fit_Upsi3S_M, fit_Upsi3S_ChiSq;
+
+                  // Loop over di-muon vertices associated with a candidate
+                  for(std::vector<const xAOD::Vertex*>::const_iterator vtxItr = candidateOniaVertices.begin(); vtxItr != candidateOniaVertices.end(); ++vtxItr ) {
+
+                      //------------------------------------
+                      // Add an element link to each dimuon which formed a
+                      // candidate, leading to the decision to save this conversion
+                      //------------------------------------
+                      ElementLink<xAOD::VertexContainer> myLink;
+                      myLink.setElement(*vtxItr);
+                      myLink.setStorableObject(*diMuonContainer);
+
+                       if(!myLink.isValid()) {
+                           ATH_MSG_WARNING("Invalid DiMuon ElementLink!");
+                       }
+
+                      diMuonLinks.push_back(myLink);
+                      //------------------------------------
+
+                      // Check which mass window this di-muon passed
+                      bool passed_Psi = (*vtxItr)->auxdata<Char_t>("passed_Psi");
+                      bool passed_Upsi = (*vtxItr)->auxdata<Char_t>("passed_Upsi");
+
+                      //------------------------------------
+                      // Cascade fit with J/psi mass hypothesis
+                      //------------------------------------
+                      float fitChiSq_Psi1S = 99999;
+                      TLorentzVector fitResult_Psi1S;
+
+                      // Only bother with the fit if di-muon mass is within the relveant range,
+                      // but still fill an dummy 4-vector to preserve one to one correspondance with "DiMuonLinks"
+                      if(passed_Psi) {
+                          ATH_CHECK( doCascadeFit(*vtxItr,constConvVertex,3096.916,fitResult_Psi1S,fitChiSq_Psi1S) );
+                      }
+
+                      fit_Psi1S_Px.push_back(fitResult_Psi1S.Px());
+                      fit_Psi1S_Py.push_back(fitResult_Psi1S.Py());
+                      fit_Psi1S_Pz.push_back(fitResult_Psi1S.Pz());
+                      fit_Psi1S_M.push_back(fitResult_Psi1S.M());
+                      fit_Psi1S_ChiSq.push_back(fitChiSq_Psi1S);
+
+                      //------------------------------------
+                      // Cascade fit with psi(2S) mass hypothesis
+                      //------------------------------------
+                      float fitChiSq_Psi2S = 99999;
+                      TLorentzVector fitResult_Psi2S;
+
+                      // Only bother with the fit if di-muon mass is within the relveant range,
+                      // but still fill an dummy 4-vector to preserve one to one correspondance with "DiMuonLinks"
+                      if(passed_Psi) {
+                          ATH_CHECK( doCascadeFit(*vtxItr,constConvVertex,3686.097,fitResult_Psi2S,fitChiSq_Psi2S) );
+                      }
+
+                      fit_Psi2S_Px.push_back(fitResult_Psi2S.Px());
+                      fit_Psi2S_Py.push_back(fitResult_Psi2S.Py());
+                      fit_Psi2S_Pz.push_back(fitResult_Psi2S.Pz());
+                      fit_Psi2S_M.push_back(fitResult_Psi2S.M());
+                      fit_Psi2S_ChiSq.push_back(fitChiSq_Psi2S);
+
+                      //------------------------------------
+                      // Cascade fit with Upsi(1S) mass hypothesis
+                      //------------------------------------
+                      float fitChiSq_Upsi1S = 99999;
+                      TLorentzVector fitResult_Upsi1S;
+
+                      // Only bother with the fit if di-muon mass is within the relveant range,
+                      // but still fill an dummy 4-vector to preserve one to one correspondance with "DiMuonLinks"
+                      if(passed_Upsi) {
+                          ATH_CHECK( doCascadeFit(*vtxItr,constConvVertex,9460.30,fitResult_Upsi1S,fitChiSq_Upsi1S) );
+                      }
+
+                      fit_Upsi1S_Px.push_back(fitResult_Upsi1S.Px());
+                      fit_Upsi1S_Py.push_back(fitResult_Upsi1S.Py());
+                      fit_Upsi1S_Pz.push_back(fitResult_Upsi1S.Pz());
+                      fit_Upsi1S_M.push_back(fitResult_Upsi1S.M());
+                      fit_Upsi1S_ChiSq.push_back(fitChiSq_Upsi1S);
+
+                      //------------------------------------
+                      // Cascade fit with Upsi(2S) mass hypothesis
+                      //------------------------------------
+                      float fitChiSq_Upsi2S = 99999;
+                      TLorentzVector fitResult_Upsi2S;
+
+                      // Only bother with the fit if di-muon mass is within the relveant range,
+                      // but still fill an dummy 4-vector to preserve one to one correspondance with "DiMuonLinks"
+                      if(passed_Upsi) {
+                          ATH_CHECK( doCascadeFit(*vtxItr,constConvVertex,10023.26,fitResult_Upsi2S,fitChiSq_Upsi2S) );
+                      }
+
+                      fit_Upsi2S_Px.push_back(fitResult_Upsi2S.Px());
+                      fit_Upsi2S_Py.push_back(fitResult_Upsi2S.Py());
+                      fit_Upsi2S_Pz.push_back(fitResult_Upsi2S.Pz());
+                      fit_Upsi2S_M.push_back(fitResult_Upsi2S.M());
+                      fit_Upsi2S_ChiSq.push_back(fitChiSq_Upsi2S);
+
+                      //------------------------------------
+                      // Cascade fit with Upsi(3S) mass hypothesis
+                      //------------------------------------
+                      float fitChiSq_Upsi3S = 99999;
+                      TLorentzVector fitResult_Upsi3S;
+
+                      // Only bother with the fit if di-muon mass is within the relveant range,
+                      // but still fill an dummy 4-vector to preserve one to one correspondance with "DiMuonLinks"
+                      if(passed_Upsi) {
+                          ATH_CHECK( doCascadeFit(*vtxItr,constConvVertex,10355.2,fitResult_Upsi3S,fitChiSq_Upsi3S) );
+                      }
+
+                      fit_Upsi3S_Px.push_back(fitResult_Upsi3S.Px());
+                      fit_Upsi3S_Py.push_back(fitResult_Upsi3S.Py());
+                      fit_Upsi3S_Pz.push_back(fitResult_Upsi3S.Pz());
+                      fit_Upsi3S_M.push_back(fitResult_Upsi3S.M());
+                      fit_Upsi3S_ChiSq.push_back(fitChiSq_Upsi3S);
+
+                  }
+
+                  //------------------------------------
+                  // Decorate selected conversions
+                  //------------------------------------
+                  ATH_MSG_DEBUG("Decorating conversion vertices");
+
+                  convVertexCandidate->auxdata< std::vector< ElementLink<xAOD::VertexContainer> > >("DiMuonLinks") = diMuonLinks;
+
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Psi1S_Px") = fit_Psi1S_Px;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Psi1S_Py") = fit_Psi1S_Py;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Psi1S_Pz") = fit_Psi1S_Pz;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Psi1S_M") = fit_Psi1S_M;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Psi1S_ChiSq") = fit_Psi1S_ChiSq;
+
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Psi2S_Px") = fit_Psi2S_Px;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Psi2S_Py") = fit_Psi2S_Py;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Psi2S_Pz") = fit_Psi2S_Pz;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Psi2S_M") = fit_Psi2S_M;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Psi2S_ChiSq") = fit_Psi2S_ChiSq;
+
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Upsi1S_Px") = fit_Upsi1S_Px;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Upsi1S_Py") = fit_Upsi1S_Py;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Upsi1S_Pz") = fit_Upsi1S_Pz;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Upsi1S_M") = fit_Upsi1S_M;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Upsi1S_ChiSq") = fit_Upsi1S_ChiSq;
+
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Upsi2S_Px") = fit_Upsi2S_Px;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Upsi2S_Py") = fit_Upsi2S_Py;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Upsi2S_Pz") = fit_Upsi2S_Pz;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Upsi2S_M") = fit_Upsi2S_M;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Upsi2S_ChiSq") = fit_Upsi2S_ChiSq;
+
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Upsi3S_Px") = fit_Upsi3S_Px;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Upsi3S_Py") = fit_Upsi3S_Py;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Upsi3S_Pz") = fit_Upsi3S_Pz;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Upsi3S_M") = fit_Upsi3S_M;
+                  convVertexCandidate->auxdata< std::vector<float> >("CascadeFit_Upsi3S_ChiSq") = fit_Upsi3S_ChiSq;
+
+                  convVertexCandidate->auxdata<float>("px") = momentum.x();
+                  convVertexCandidate->auxdata<float>("py") = momentum.y();
+                  convVertexCandidate->auxdata<float>("pz") = momentum.z();
+
+                  convVertexCandidate->auxdata<float>("deltaCotThetaTrk") = deltaCotTheta;
+                  convVertexCandidate->auxdata<float>("minimumDistanceTrk") = distance;
+
+                  convVertexCandidate->auxdata<float>("deltaPhiTracks") = vertexOutput["deltaPhiTracks"];
+                  convVertexCandidate->auxdata<float>("DR1R2") = vertexOutput["DR1R2"];
+
+                  convVertexCandidate->auxdata<Char_t>("passed") = true; // Used in event skimming
+
+                  conversionContainer->push_back(convVertexCandidate.release());
+
+              } else {
+                  ATH_MSG_DEBUG("Vertex Fit Failed");
+              }
+
+          } // Neg Track Loop
+
+      } // Pos Track Loop
+
+    } // callConvFinder
+
+    // Write the results to StoreGate
+    CHECK(evtStore()->record(conversionContainer.release(), m_conversionContainerName));
+    CHECK(evtStore()->record(conversionAuxContainer.release(), m_conversionContainerName+"Aux."));
+
+    ATH_MSG_DEBUG("-------------------------");
+    ATH_MSG_DEBUG("Number of track pairs: " << nTrackPairs_Init);
+    ATH_MSG_DEBUG("Number of track pairs selected: " << nTrackPairs_Selected);
+    ATH_MSG_DEBUG("Number of successful vertex fits: " << nConv_VertexFit);
+    ATH_MSG_DEBUG("Number of selected vertices: " << nConv_Selected);
+    ATH_MSG_DEBUG("Number of selected vertices (after DeltaM req.): " << nConv_Selected_DeltaM);
+
+    return StatusCode::SUCCESS;
+  }
+
+  StatusCode BPhysConversionFinder::doCascadeFit(const xAOD::Vertex * diMuonVertex, const xAOD::Vertex * convVertex, const double diMuonMassConstraint, TLorentzVector & fitMom, float & chiSq) const {
+
+      std::vector<const xAOD::TrackParticle*> diMuonTracks;
+      diMuonTracks.push_back(diMuonVertex->trackParticle(0));
+      diMuonTracks.push_back(diMuonVertex->trackParticle(1));
+
+      std::vector<double> diMuonTrackMasses;
+      diMuonTrackMasses.push_back(105.658);
+      diMuonTrackMasses.push_back(105.658);
+
+      std::vector<const xAOD::TrackParticle*> convTracks;
+      convTracks.push_back(convVertex->trackParticle(0));
+      convTracks.push_back(convVertex->trackParticle(1));
+
+      std::vector<double> convTrackMasses;
+      convTrackMasses.push_back(0.511);
+      convTrackMasses.push_back(0.511);
+
+      // Reset
+      std::unique_ptr<Trk::IVKalState> state = m_cascadeFitter->makeState();
+
+      // Set Robustness
+      m_cascadeFitter->setRobustness(0, *state);
+
+      // Build up the topology
+      
+      // Vertex list
+      std::vector<Trk::VertexID> vrtList;
+      // V0 vertex
+      Trk::VertexID vID;
+      vID = m_cascadeFitter->startVertex(convTracks,convTrackMasses,*state,0.0); // Constrain converision mass to zero
+
+      vrtList.push_back(vID);
+
+      // chi_c/b vertex
+      Trk::VertexID vID2 = m_cascadeFitter->nextVertex(diMuonTracks,diMuonTrackMasses,vrtList,*state);
+
+      std::vector<Trk::VertexID> cnstV;
+      cnstV.clear();
+      if ( !m_cascadeFitter->addMassConstraint(vID2,diMuonTracks,cnstV,*state,diMuonMassConstraint).isSuccess() ) {
+        ATH_MSG_WARNING("addMassConstraint failed");
+      }
+
+      // Do the fit
+      std::unique_ptr<Trk::VxCascadeInfo> result(m_cascadeFitter->fitCascade(*state));
+
+      const std::vector< std::vector<TLorentzVector> > &moms = result->getParticleMoms();
+
+      // Check for a successful fit
+      if(result != NULL) {
+
+          if(moms.size() > 2) ATH_MSG_WARNING("DoCascadeFit - More than two output momentum!?");
+
+          TLorentzVector conv_Fit = moms.at(0).at(0) + moms.at(0).at(1);
+          TLorentzVector diMuon_Fit = moms.at(1).at(0) + moms.at(1).at(1);
+
+          // Momentum of DiMuon + photon system
+          fitMom = diMuon_Fit + conv_Fit;
+
+          chiSq = result->fitChi2()/result->nDoF();
+
+          // Done with the fit result
+          result.reset();
+
+      }
+
+      return StatusCode::SUCCESS;
+
+  }
+
+
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysMetadataBase.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysMetadataBase.cxx
new file mode 100644
index 000000000000..cfabb3f23568
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysMetadataBase.cxx
@@ -0,0 +1,270 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+//============================================================================
+// BPhysMetadataBase.cxx
+//============================================================================
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Changes:
+// - w.w., 2017-01-22: Added use of BPhysMetaDataTool.
+// - w.w., 2017-05-27: Removed use of BPhysMetaDataTool and
+//                     IOVDbMetaDataTool.
+// - w.w., 2019-12-05: Added long and vector<long> types
+//
+// Store JO metadata in the output file.
+//
+// It uses a FileMetaData object to store job option information
+// as metadata in a specific branch whose name needs to prefixed by
+// the derivation format name.
+//
+// This is a base class.  Inherit from it to add the job options you want
+// to store.  For a usage example, see
+//   Bmumu_metadata.h / Bmumu_metadata.cxx
+// and
+//   BPHY8.py .
+//
+// Job options provided by the base class:
+// - DerivationName       -- assign the name of the derivation format
+// - MetadataFolderName   -- assign the name of the metadata folder,
+//                           should start with the derivation format name,
+//                           defaults to DerivationName if not set.
+//                           
+//============================================================================
+//
+
+#include "DerivationFrameworkBPhys/BPhysMetadataBase.h"
+#include "xAODMetaData/FileMetaData.h"
+#include "xAODMetaData/FileMetaDataAuxInfo.h"
+
+namespace DerivationFramework {
+
+  //--------------------------------------------------------------------------
+  BPhysMetadataBase::BPhysMetadataBase(const std::string& t,
+				       const std::string& n,
+				       const IInterface*  p)
+    : AthAlgTool(t,n,p),
+      m_outputMetaStore("StoreGateSvc/MetaDataStore", n) {
+    
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+    
+    // Declare derivation format name
+    declareProperty("DerivationName", m_derivationName = "_NOSUCHFORMAT_");
+
+    // Declare metadata folder name (should start with derivation name)
+    declareProperty("MetadataFolderName", m_mdFolderName = "_NONE_");
+
+    // Prefix would typically be the derivation format name
+    declareProperty("Prefix", m_prefix = "");
+    
+  }
+  //--------------------------------------------------------------------------
+  StatusCode BPhysMetadataBase::initialize() {
+  
+    ATH_MSG_DEBUG("BPhysMetaDataBase::initialize() -- begin");
+
+    // handle general prefix
+    if ( m_prefix == "" ) {
+      if ( m_derivationName == "_NOSUCHFORMAT_" ) {
+	m_prefix = name() +"_";
+      } else {
+	m_prefix = m_derivationName + "_";
+      }
+    }
+      
+    CHECK( saveMetaDataBPhys() );
+    
+    ATH_MSG_DEBUG("BPhysMetaDataBase::initialize() -- end");
+
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  StatusCode BPhysMetadataBase::finalize() {
+
+    ATH_MSG_DEBUG("BPhysMetaDataBase::finalize()");
+
+    // everything all right
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  StatusCode BPhysMetadataBase::addBranches() const {
+
+    // nothing to do here
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+#define SET_VALUES_IMP( TYPE, MAP )					\
+  for (auto const &ent : MAP) {						\
+    fm->auxdata< TYPE >( m_prefix + ent.first ) = ent.second;		\
+  }
+  
+  StatusCode BPhysMetadataBase::saveMetaDataBPhys() const {
+    
+    ATH_MSG_DEBUG("BPhysMetaDataBase::saveMetaDataBPhys() -- begin");
+
+    std::string mdFolderKey = buildFolderName() + "_MetaData";
+    // protection
+    if ( m_outputMetaStore->contains< xAOD::FileMetaData >( mdFolderKey ) ) {
+      ATH_MSG_WARNING("saveMetaDataBPhys2: "
+		      "xAOD::FileMetaData already in output: "
+		      << mdFolderKey
+		      << " -- BPhys metadata will NOT be saved!");
+    } else {
+      // create a FileMetaData object
+      auto fm    = std::make_unique< xAOD::FileMetaData >();
+      auto fmAux = std::make_unique< xAOD::FileMetaDataAuxInfo >();
+      fm->setStore( fmAux.get() );
+      
+      // fill it
+      fm->auxdata< std::string >(m_prefix+"DerivationName"    ) =
+	m_derivationName;
+      fm->auxdata< std::string >(m_prefix+"MetaDataFolderName") = 
+	m_mdFolderName;
+
+      // fill it with contents of maps
+      SET_VALUES_IMP( int                     , m_propInt     );
+      SET_VALUES_IMP( long                    , m_propLong    );
+      SET_VALUES_IMP( double                  , m_propDouble  );
+      SET_VALUES_IMP( bool                    , m_propBool    );
+      SET_VALUES_IMP( std::string             , m_propString  );
+      SET_VALUES_IMP( std::vector<int>        , m_propVInt    );
+      SET_VALUES_IMP( std::vector<long>       , m_propVLong   );
+      SET_VALUES_IMP( std::vector<double>     , m_propVDouble );
+      SET_VALUES_IMP( std::vector<bool>       , m_propVBool   );
+      SET_VALUES_IMP( std::vector<std::string>, m_propVString );
+      
+      // record it
+      ATH_CHECK( m_outputMetaStore->record( std::move(fm), mdFolderKey ) );
+      ATH_CHECK( m_outputMetaStore->record( std::move(fmAux),
+					    mdFolderKey+"Aux." ) );
+    }
+
+    return StatusCode::SUCCESS;
+  }
+#undef SET_VALUES_IMP
+  //--------------------------------------------------------------------------
+  std::string BPhysMetadataBase::buildFolderName(const std::string& fname) const {
+
+    std::string result = fname;
+    if ( m_mdFolderName != "_NONE_" && m_mdFolderName != "" ) {
+      result += m_mdFolderName;
+    } else {
+      if ( m_derivationName != "_NOSUCHFORMAT_" && m_derivationName != "" ) {
+        result += m_derivationName;
+      } else {
+        // default to the tool's name
+        result += name();
+      }
+    }
+    return result;
+  }
+  //--------------------------------------------------------------------------
+  void BPhysMetadataBase::recordPropertyI(const std::string& name, int val) {
+    ATH_MSG_INFO("Calling recordProperty(int)");
+    declareProperty(name, m_propInt[name] = val);
+  }
+  //--------------------------------------------------------------------------
+  void BPhysMetadataBase::recordPropertyL(const std::string& name, long val) {
+    ATH_MSG_INFO("Calling recordProperty(long)");
+    declareProperty(name, m_propLong[name] = val);
+  }
+  //--------------------------------------------------------------------------
+  void BPhysMetadataBase::recordPropertyD(const std::string& name, double val) {
+    ATH_MSG_INFO("Calling recordProperty(double)");
+    declareProperty(name, m_propDouble[name] = val);
+  }
+  //--------------------------------------------------------------------------
+  void BPhysMetadataBase::recordPropertyB(const std::string& name, bool val) {
+    ATH_MSG_INFO("Calling recordProperty(bool)");
+    declareProperty(name, m_propBool[name] = val);
+  }
+  //--------------------------------------------------------------------------
+  void BPhysMetadataBase::recordPropertyS(const std::string& name, const std::string& val) {
+    ATH_MSG_INFO("Calling recordProperty(string)");
+    declareProperty(name, m_propString[name] = val);
+  }
+  //--------------------------------------------------------------------------
+  void BPhysMetadataBase::recordPropertyVI(const std::string& name,
+					   const std::vector<int>& val) {
+    ATH_MSG_INFO("Calling recordProperty(vector<int>)");
+    declareProperty(name, m_propVInt[name] = val);
+  }
+  //--------------------------------------------------------------------------
+  void BPhysMetadataBase::recordPropertyVL(const std::string& name,
+					   const std::vector<long>& val) {
+    ATH_MSG_INFO("Calling recordProperty(vector<long>)");
+    declareProperty(name, m_propVLong[name] = val);
+  }
+  //--------------------------------------------------------------------------
+  void BPhysMetadataBase::recordPropertyVD(const std::string& name,
+					   const std::vector<double>& val) {
+    ATH_MSG_INFO("Calling recordProperty(vector<double>)");
+    declareProperty(name, m_propVDouble[name] = val);
+  }
+  //--------------------------------------------------------------------------
+  void BPhysMetadataBase::recordPropertyVB(const std::string& name,
+					const std::vector<bool>& val) {
+    ATH_MSG_INFO("Calling recordProperty(vector<bool>)");
+    declareProperty(name, m_propVBool[name] = val);
+  }
+  //--------------------------------------------------------------------------
+  void BPhysMetadataBase::recordPropertyVS(const std::string& name,
+					   const std::vector<std::string>& val) {
+    ATH_MSG_INFO("Calling recordProperty(vector<string>)");
+    declareProperty(name, m_propVString[name] = val);
+  }
+  //--------------------------------------------------------------------------
+  std::string BPhysMetadataBase::vecToString(const std::vector<int>& v) const {
+    std::string str("[");
+    for (unsigned int i=0; i<v.size(); ++i) {
+      str += std::to_string(v[i]);
+      if ( i < v.size()-1 ) str += ",";
+    }
+    str += "]";
+    return str;
+  }
+  //--------------------------------------------------------------------------
+  std::string BPhysMetadataBase::vecToString(const std::vector<long>& v) const {
+    std::string str("[");
+    for (unsigned int i=0; i<v.size(); ++i) {
+      str += std::to_string(v[i]);
+      if ( i < v.size()-1 ) str += ",";
+    }
+    str += "]";
+    return str;
+  }
+  //--------------------------------------------------------------------------
+  std::string BPhysMetadataBase::vecToString(const std::vector<double>& v) const {
+    std::string str("[");
+    for (unsigned int i=0; i<v.size(); ++i) {
+      str += std::to_string(v[i]);
+      if ( i < v.size()-1 ) str += ",";
+    }
+    str += "]";
+    return str;
+  }
+  //--------------------------------------------------------------------------
+  std::string BPhysMetadataBase::vecToString(const std::vector<bool>& v) const {
+    std::string str("[");
+    for (unsigned int i=0; i<v.size(); ++i) {
+      str += std::to_string(v[i]);
+      if ( i < v.size()-1 ) str += ",";
+    }
+    str += "]";
+    return str;
+  }
+  //--------------------------------------------------------------------------
+  std::string BPhysMetadataBase::vecToString(const std::vector<std::string>& v) const {
+    std::string str("[");
+    for (unsigned int i=0; i<v.size(); ++i) {
+      str += "'";
+      str += v[i];
+      str += "'";
+      if ( i < v.size()-1 ) str += ",";
+    }
+    str += "]";
+    return str;
+  }
+  //--------------------------------------------------------------------------
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysPVCascadeTools.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysPVCascadeTools.cxx
new file mode 100644
index 000000000000..09a3822d6d73
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysPVCascadeTools.cxx
@@ -0,0 +1,475 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "DerivationFrameworkBPhys/BPhysPVCascadeTools.h"
+#include "xAODTracking/VertexContainer.h"
+#include "xAODBPhys/BPhysHelper.h"
+#include "TVector3.h"
+#include "DerivationFrameworkBPhys/BPhysPVTools.h"
+#include "TrkVKalVrtFitter/VxCascadeInfo.h"
+#include "DerivationFrameworkBPhys/LocalVector.h"
+#include "JpsiUpsilonTools/PrimaryVertexRefitter.h"
+#include "HepPDT/ParticleDataTable.hh"
+#include "BeamSpotConditionsData/BeamSpotData.h"
+#include <limits>
+#include <iostream>
+
+DerivationFramework::BPhysPVCascadeTools::BPhysPVCascadeTools(const CascadeTools *cascadeTools) :
+  m_cascadeTools(cascadeTools), m_beamSpotData(nullptr), m_PV_minNTracks(0),
+  m_copyAllVertices(true)
+{
+}
+
+DerivationFramework::BPhysPVCascadeTools::BPhysPVCascadeTools(const CascadeTools *cascadeTools,
+                                                const InDet::BeamSpotData* beamSpotSvc) :
+  m_cascadeTools(cascadeTools), m_beamSpotData(beamSpotSvc), m_PV_minNTracks(0),
+  m_copyAllVertices(true)
+{
+}
+
+void DerivationFramework::BPhysPVCascadeTools::FillBPhysHelper(const std::vector<TLorentzVector> &mom, Amg::MatrixX cov, xAOD::BPhysHelper &vtx,
+							const xAOD::Vertex* PV, const xAOD::VertexContainer* PvContainer,
+							xAOD::BPhysHelper::pv_type pvtype, int refitCode) const {
+
+  BPHYS_CHECK( vtx.setPv      ( PV, PvContainer, pvtype ) );
+
+  // cout << "BPhysPVCascadeTools::FillBPhysHelper for pvtype = " << pvtype << endl;
+  // cout << "lxy " << m_cascadeTools->lxy(mom, vtx.vtx(), PV) << " error " << m_cascadeTools->lxyError(mom, cov, vtx.vtx(), PV) << endl;
+ 
+  // set variables calculated from PV
+  BPHYS_CHECK( vtx.setLxy    ( m_cascadeTools->lxy       (mom, vtx.vtx(), PV), pvtype ) );
+  BPHYS_CHECK( vtx.setLxyErr ( m_cascadeTools->lxyError  (mom, cov, vtx.vtx(), PV), pvtype ) );
+  BPHYS_CHECK( vtx.setA0     ( m_cascadeTools->a0        (mom, vtx.vtx(), PV), pvtype ) );
+  BPHYS_CHECK( vtx.setA0Err  ( m_cascadeTools->a0Error   (mom, cov, vtx.vtx(), PV), pvtype ) );
+  BPHYS_CHECK( vtx.setA0xy   ( m_cascadeTools->a0xy      (mom, vtx.vtx(), PV), pvtype ) );
+  BPHYS_CHECK( vtx.setA0xyErr( m_cascadeTools->a0xyError (mom, cov, vtx.vtx(), PV), pvtype ) );
+  BPHYS_CHECK( vtx.setZ0     ( m_cascadeTools->a0z       (mom, vtx.vtx(), PV), pvtype ) );
+  BPHYS_CHECK( vtx.setZ0Err  ( m_cascadeTools->a0zError  (mom, cov, vtx.vtx(), PV), pvtype ) );
+  BPHYS_CHECK( vtx.setRefitPVStatus  ( refitCode, pvtype ) );
+
+}
+
+void DerivationFramework::BPhysPVCascadeTools::ProcessVertex(const std::vector<TLorentzVector> &mom, Amg::MatrixX cov, xAOD::BPhysHypoHelper &vtx,
+							xAOD::BPhysHelper::pv_type pvtype, double mass) const {
+
+  const xAOD::Vertex* pv = vtx.pv(pvtype);
+  if (pv) {
+    // decorate the vertex.
+    vtx.setTau( m_cascadeTools->tau(mom, vtx.vtx(), pv), pvtype, xAOD::BPhysHypoHelper::TAU_INV_MASS );
+    vtx.setTauErr( m_cascadeTools->tauError(mom, cov, vtx.vtx(), pv), pvtype, xAOD::BPhysHypoHelper::TAU_INV_MASS );
+    // Proper decay time assuming constant mass hypothesis
+    vtx.setTau( m_cascadeTools->tau(mom, vtx.vtx(), pv, mass), pvtype, xAOD::BPhysHypoHelper::TAU_CONST_MASS );
+    vtx.setTauErr( m_cascadeTools->tauError(mom, cov, vtx.vtx(), pv, mass), pvtype, xAOD::BPhysHypoHelper::TAU_CONST_MASS );
+    //enum pv_type {PV_MAX_SUM_PT2, PV_MIN_A0, PV_MIN_Z0, PV_MIN_Z0_BA};
+  } else {
+    const float errConst = -9999999.;
+    BPHYS_CHECK( vtx.setTau( errConst, pvtype, xAOD::BPhysHypoHelper::TAU_INV_MASS) );
+    BPHYS_CHECK( vtx.setTauErr( errConst, pvtype, xAOD::BPhysHypoHelper::TAU_INV_MASS) );
+    BPHYS_CHECK( vtx.setTau(errConst, pvtype, xAOD::BPhysHypoHelper::TAU_CONST_MASS) );
+    BPHYS_CHECK( vtx.setTauErr( errConst, pvtype, xAOD::BPhysHypoHelper::TAU_CONST_MASS) );
+  }
+
+}
+
+void DerivationFramework::BPhysPVCascadeTools::FillBPhysHelperNULL(xAOD::BPhysHelper &vtx,
+							    const xAOD::VertexContainer* PvContainer,
+							    xAOD::BPhysHelper::pv_type pvtype) {
+   DerivationFramework::BPhysPVTools::FillBPhysHelperNULL(vtx, PvContainer, pvtype);
+}
+
+size_t DerivationFramework::BPhysPVCascadeTools::FindLowZIndex(const std::vector<TLorentzVector> &mom, const xAOD::BPhysHelper &Obj,
+							const std::vector<const xAOD::Vertex*> &PVlist,
+							const size_t PV_minNTracks) const {
+  size_t lowZ  = 0;
+  if(PVlist.empty()) {
+    lowZ=std::numeric_limits<std::size_t>::max();
+    return lowZ;
+  }
+  size_t size = PVlist.size();
+  double lowA0zcalc = fabs(m_cascadeTools->a0z       (mom, Obj.vtx(), PVlist[0]));
+  for(size_t i =1; i<size; i++) {
+    if ( PVlist[i]->nTrackParticles() >= PV_minNTracks ) {
+      double a0z =  fabs(m_cascadeTools->a0z(mom, Obj.vtx(), PVlist[i]));
+      if(a0z < lowA0zcalc) {
+	lowA0zcalc = a0z;
+	lowZ =i;
+      }
+    }
+  }
+  return lowZ;
+}
+
+size_t DerivationFramework::BPhysPVCascadeTools::FindHighPtIndex(const std::vector<const xAOD::Vertex*> &PVlist) {
+    return DerivationFramework::BPhysPVTools::FindHighPtIndex(PVlist);
+}
+
+size_t DerivationFramework::BPhysPVCascadeTools::FindLowA0Index(const std::vector<TLorentzVector> &mom, const xAOD::BPhysHelper &Obj,
+							 const std::vector<const xAOD::Vertex*> &PVlist,
+							 const size_t PV_minNTracks) const {
+    size_t lowA0  = 0;
+    if(PVlist.empty()) {
+        lowA0=std::numeric_limits<std::size_t>::max();
+        return lowA0;
+    }
+    size_t size = PVlist.size();
+    double lowA0calc  = m_cascadeTools->a0(mom, Obj.vtx(), PVlist[0]);
+    for(size_t i =1; i<size; i++) {
+      if ( PVlist[i]->nTrackParticles() >= PV_minNTracks ) {
+	double a0 =  m_cascadeTools->a0(mom, Obj.vtx(), PVlist[i]);
+	if(a0 < lowA0calc) {
+	  lowA0calc = a0;
+	  lowA0 =i;
+	}
+      }
+    }
+    return lowA0;
+}
+
+std::vector<const xAOD::Vertex*> DerivationFramework::BPhysPVCascadeTools::GetGoodPV(const xAOD::VertexContainer* pvContainer) {
+    typedef xAOD::VxType::VertexType VertexType;
+    VertexType Pvtx = xAOD::VxType::PriVtx;
+    VertexType Pileupvtx = xAOD::VxType::PileUp;
+    std::vector<const xAOD::Vertex*> goodPrimaryVertices;
+    goodPrimaryVertices.reserve(pvContainer->size());
+
+    for (auto ptr = pvContainer->begin(); ptr!= pvContainer->end(); ++ptr) {
+        VertexType thistype = (*ptr)->vertexType();
+        if ( thistype == Pileupvtx || thistype == Pvtx ) {
+	  goodPrimaryVertices.push_back(*ptr);
+        } else {
+//             cout << "vertex type  " << thistype << endl;
+        }
+    }
+    return goodPrimaryVertices;
+}
+//-----------------------------------------------------------------------------
+//
+void DerivationFramework::BPhysPVCascadeTools::SetMinNTracksInPV(size_t PV_minNTracks)
+{
+
+  m_PV_minNTracks = PV_minNTracks;
+}
+//-----------------------------------------------------------------------------
+//
+const Amg::Vector3D& DerivationFramework::BPhysPVCascadeTools::GetBeamSpot() const  noexcept {
+  if(m_beamSpotData) return m_beamSpotData->beamPos();
+  else {
+    static const Amg::Vector3D defaultBS(-10000.,-10000.,-10000.);
+    return defaultBS;
+  } 
+}
+//-----------------------------------------------------------------------------
+//
+size_t DerivationFramework::BPhysPVCascadeTools::FindLowZ0BAIndex(const std::vector<TLorentzVector> &mom, const xAOD::BPhysHelper &obj,
+							   const std::vector<const xAOD::Vertex*> &PVlist,
+							   const size_t PV_minNTracks) const {
+  
+  size_t ilowZ0BA   = std::numeric_limits<std::size_t>::max();
+  double lowZ0BAcalc = std::numeric_limits<double>::max(); 
+  for (size_t i = 0; i<PVlist.size(); ++i) {
+    if ( PVlist[i]->nTrackParticles() >= PV_minNTracks ) {
+      double z0BA =  m_cascadeTools->a0(mom, obj.vtx(), PVlist[i]);
+      if (z0BA < lowZ0BAcalc) {
+	lowZ0BAcalc = z0BA;
+	ilowZ0BA = i;
+      }
+    }
+  }
+  return ilowZ0BA;
+}
+//-----------------------------------------------------------------------------
+//
+double DerivationFramework::BPhysPVCascadeTools::DistInZtoDOCA(const std::vector<TLorentzVector> &mom, const xAOD::BPhysHelper &obj, const xAOD::Vertex* vertex) const {
+
+  Amg::Vector3D pv    = vertex->position();
+  Amg::Vector3D xDOCA = DocaExtrapToBeamSpot(mom, obj);
+  Amg::Vector3D vec   = pv - xDOCA;
+  return vec.z();
+}
+//-----------------------------------------------------------------------------
+//
+Amg::Vector3D DerivationFramework::BPhysPVCascadeTools::DocaExtrapToBeamSpot(const std::vector<TLorentzVector> &mom, const xAOD::BPhysHelper& obj) const {
+
+  Amg::Vector3D xDOCA(-99999., -99999., -99999.);
+  TLorentzVector totalMom;
+  unsigned int NTrk = mom.size();
+  for( unsigned int it=0; it<NTrk; it++) totalMom += mom[it];
+  TVector3      totP = totalMom.Vect();
+  Amg::Vector3D pSV(totP.X(), totP.Y(), totP.Z());
+  Amg::Vector3D pT(pSV.x(), pSV.y(), 0.);
+  if ( pT.mag2() > 0 ) {
+    Amg::Vector3D xBS = GetBeamSpot();
+    Amg::Vector3D xSV = obj.vtx()->position();
+    Amg::Vector3D xT(xSV.x()-xBS.x(), xSV.y()-xBS.y(), 0.);
+    xDOCA = xSV - pSV*pT.dot(xT)/pT.mag2();
+  } else {
+    std::cout << "BPhysPVCascadeTools::DocaExtrapToBeamSpot: WARNING pT == 0."
+	      << std::endl;
+  }
+  return xDOCA;
+}
+
+void DerivationFramework::BPhysPVCascadeTools::PrepareVertexLinks(Trk::VxCascadeInfo *result,  const xAOD::TrackParticleContainer* importedTrackCollection)
+{
+    auto &collection = result->vertices();
+    for(auto v : collection)
+    {
+       std::vector<ElementLink<DataVector<xAOD::TrackParticle> > > newLinkVector;
+       for(unsigned int i=0; i< v->trackParticleLinks().size(); i++)
+       {
+         ElementLink<DataVector<xAOD::TrackParticle> > mylink=v->trackParticleLinks()[i]; // makes a copy (non-const) 
+         mylink.setStorableObject(*importedTrackCollection, true);
+         newLinkVector.push_back( mylink ); 
+       }
+       v->clearTracks();
+       v->setTrackParticleLinks( newLinkVector );
+    }
+}
+
+std::vector<const xAOD::TrackParticle*> DerivationFramework::BPhysPVCascadeTools::CollectAllChargedTracks(const std::vector<xAOD::Vertex*> &cascadeVertices)
+{
+  std::vector<const xAOD::TrackParticle*> exclTrk;
+  for( size_t jt=0; jt<cascadeVertices.size(); jt++) {
+    for( size_t it=0; it<cascadeVertices[jt]->vxTrackAtVertex().size(); it++) {
+     if(cascadeVertices[jt]->trackParticle(it)->charge() != 0) exclTrk.push_back(cascadeVertices[jt]->trackParticle(it));
+    }
+  }
+  return exclTrk;
+}
+
+StatusCode DerivationFramework::BPhysPVCascadeTools::FillCandwithRefittedVertices( bool refitPV,
+									   const xAOD::VertexContainer* pvContainer, xAOD::VertexContainer* refPvContainer,
+									   const Analysis::PrimaryVertexRefitter *pvRefitter, size_t in_PV_max, int DoVertexType,
+                                                                           Trk::VxCascadeInfo* casc, int index,
+                                                                           double mass, xAOD::BPhysHypoHelper &vtx)
+{
+    const std::vector<TLorentzVector> &mom = casc->getParticleMoms()[index];
+    const Amg::MatrixX &cov = casc->getCovariance()[index];
+    const std::vector<xAOD::Vertex*> &cascadeVertices = casc->vertices();
+    const bool doPt   = (DoVertexType & 1) != 0;
+    const bool doA0   = (DoVertexType & 2) != 0;
+    const bool doZ0   = (DoVertexType & 4) != 0;
+    const bool doZ0BA = (DoVertexType & 8) != 0;
+
+    // Collect the tracks that should be excluded from the PV
+    std::vector<const xAOD::TrackParticle*> exclTrk = CollectAllChargedTracks(cascadeVertices);
+
+
+    const std::vector<const xAOD::Vertex*> GoodPVs = GetGoodPV(pvContainer);
+    // 2) PV dependent variables
+    if (GoodPVs.empty() == false) {
+       if (refitPV) {
+         size_t pVmax =std::min((size_t)in_PV_max, GoodPVs.size());
+         std::vector<const xAOD::Vertex*> refPVvertexes;
+         std::vector<const xAOD::Vertex*> refPVvertexes_toDelete;
+         std::vector<int> exitCode;
+         refPVvertexes.reserve(pVmax);
+         refPVvertexes_toDelete.reserve(pVmax);
+         exitCode.reserve(pVmax);
+
+         // Refit the primary vertex and set the related decorations.
+
+         for (size_t i =0; i < pVmax ; i++) {
+           const xAOD::Vertex* oldPV = GoodPVs.at(i);
+           // when set to false this will return null when a new vertex is not required
+//           ATH_MSG_DEBUG("old PV x " << oldPV->x() << " y " << oldPV->y() << " z " << oldPV->z());
+           int exitcode = 0;
+           const xAOD::Vertex* refPV = pvRefitter->refitVertex(oldPV, exclTrk, m_copyAllVertices, &exitcode);
+//           if (refPV) ATH_MSG_DEBUG("ref PV x " << refPV->x() << " y " << refPV->y() << " z " << refPV->z());
+           exitCode.push_back(exitcode);
+           // we want positioning to match the goodPrimaryVertices
+           if (refPV == nullptr) {
+              refPVvertexes.push_back(oldPV);
+              refPVvertexes_toDelete.push_back(nullptr);
+           } else {
+              refPVvertexes.push_back(refPV);
+              refPVvertexes_toDelete.push_back(refPV);
+           }
+        }
+         LocalVector<size_t, 4> indexesUsed;
+         LocalVector<std::pair<size_t, xAOD::BPhysHelper::pv_type>, 4> indexestoProcess;
+
+         if(doPt){
+            indexestoProcess.push_back(std::make_pair
+                (FindHighPtIndex(refPVvertexes), xAOD::BPhysHelper::PV_MAX_SUM_PT2));
+         }
+         if(doA0) {
+            indexestoProcess.push_back(std::make_pair( FindLowA0Index(mom, vtx, refPVvertexes, m_PV_minNTracks),  
+              xAOD::BPhysHelper::PV_MIN_A0));
+         }
+         if(doZ0) {
+            indexestoProcess.push_back(std::make_pair(FindLowZIndex(mom, vtx, refPVvertexes, m_PV_minNTracks),
+                    xAOD::BPhysHelper::PV_MIN_Z0));
+         }
+         if(doZ0BA) {
+            size_t lowZBA = FindLowZ0BAIndex(mom, vtx, refPVvertexes, m_PV_minNTracks);
+            if( lowZBA < pVmax ) { 
+               indexestoProcess.push_back(std::make_pair(lowZBA, xAOD::BPhysHelper::PV_MIN_Z0_BA));
+            }
+            else FillBPhysHelperNULL(vtx, pvContainer, xAOD::BPhysHelper::PV_MIN_Z0_BA);
+         }
+
+         for(size_t i =0 ; i<indexestoProcess.size(); i++){
+             //if refitted add to refitted container
+             auto index  = indexestoProcess[i].first;
+             auto pvtype = indexestoProcess[i].second;
+             const xAOD::VertexContainer* ParentContainer =
+                 (refPVvertexes_toDelete.at(index)) ? refPvContainer : pvContainer;
+             if(ParentContainer == refPvContainer && !indexesUsed.contains(index)) {
+                 // store the new vertex
+                 refPvContainer->push_back(const_cast<xAOD::Vertex*>(refPVvertexes.at(index))); 
+                 indexesUsed.push_back(index);
+             }
+             FillBPhysHelper(mom, cov, vtx, refPVvertexes[index],
+                  ParentContainer, pvtype, exitCode[index]);
+             vtx.setOrigPv(GoodPVs[index], pvContainer, pvtype);               
+         }
+          //nullify ptrs we want to keep so these won't get deleted
+         //"delete null" is valid in C++ and does nothing so this is quicker than a lot of if statements
+         for(size_t x : indexesUsed) refPVvertexes_toDelete[x] = nullptr;
+          //Loop over toDELETE container, anything that is used or was not refitted is null
+         //This cleans up all extra vertices that were created and not used
+         for(const xAOD::Vertex* ptr : refPVvertexes_toDelete) delete ptr;
+         refPVvertexes.clear(); // Clear lists of now dangling ptrs
+         refPVvertexes_toDelete.clear();
+         exitCode.clear();
+
+       } else {
+            // 2.a) the first PV with the largest sum pT.
+         if(doPt) {
+           size_t highPtindex = FindHighPtIndex(GoodPVs); // Should be 0 in PV ordering
+           FillBPhysHelper(mom, cov, vtx, GoodPVs[highPtindex], pvContainer, xAOD::BPhysHelper::PV_MAX_SUM_PT2, 0);
+         }
+         // 2.b) the closest in 3D:
+         if(doA0) {
+           size_t lowA0 =  FindLowA0Index(mom, vtx, GoodPVs, m_PV_minNTracks);
+           FillBPhysHelper(mom, cov, vtx, GoodPVs[lowA0], pvContainer, xAOD::BPhysHelper::PV_MIN_A0, 0);
+         }
+         // 2.c) the closest in Z:
+         if(doZ0) {
+           size_t lowZ  = FindLowZIndex(mom, vtx, GoodPVs, m_PV_minNTracks);
+           FillBPhysHelper(mom, cov, vtx, GoodPVs[lowZ], pvContainer, xAOD::BPhysHelper::PV_MIN_Z0, 0);
+         }
+         // 2.d) the closest in Z (DOCA w.r.t. beam axis):
+         if(doZ0BA) {
+           size_t lowZBA = FindLowZ0BAIndex(mom, vtx, GoodPVs, m_PV_minNTracks);
+           if ( lowZBA < GoodPVs.size() ) { // safety against vector index out-of-bounds
+             FillBPhysHelper(mom, cov, vtx, GoodPVs[lowZBA], pvContainer, xAOD::BPhysHelper::PV_MIN_Z0_BA, 0);
+           } else {
+             // nothing found -- fill NULL
+             FillBPhysHelperNULL(vtx, pvContainer, xAOD::BPhysHelper::PV_MIN_Z0_BA);
+           }
+         }
+       } // refitPV
+     } else {
+
+      if(pvContainer->empty()) return StatusCode::FAILURE;
+      const xAOD::Vertex* Dummy = pvContainer->at(0);
+
+          // 2.a) the first PV with the largest sum pT.
+      if(doPt) {
+        FillBPhysHelper(mom, cov, vtx, Dummy, pvContainer, xAOD::BPhysHelper::PV_MAX_SUM_PT2, 0);
+        if(refitPV) vtx.setOrigPv(Dummy, pvContainer, xAOD::BPhysHelper::PV_MAX_SUM_PT2);
+      }
+      // 2.b) the closest in 3D:
+      if(doA0) {
+        FillBPhysHelper(mom, cov, vtx, Dummy, pvContainer, xAOD::BPhysHelper::PV_MIN_A0, 0);
+        if(refitPV) vtx.setOrigPv(Dummy, pvContainer, xAOD::BPhysHelper::PV_MIN_A0);
+      }
+      // 2.c) the closest in Z:
+      if(doZ0) {
+        FillBPhysHelper(mom, cov, vtx, Dummy, pvContainer, xAOD::BPhysHelper::PV_MIN_Z0, 0);
+        if(refitPV) vtx.setOrigPv(Dummy, pvContainer, xAOD::BPhysHelper::PV_MIN_Z0);
+      }
+      // 2.d) the closest in Z (DOCA w.r.t. beam axis):
+      if(doZ0BA) {
+        FillBPhysHelper(mom, cov, vtx, Dummy, pvContainer, xAOD::BPhysHelper::PV_MIN_Z0_BA, 0);
+        if(refitPV) vtx.setOrigPv(Dummy, pvContainer, xAOD::BPhysHelper::PV_MIN_Z0_BA);
+      }
+   } // GoodPVs.empty()
+
+   // 3) proper decay time and error:
+   // retrieve the refitted PV (or the original one, if the PV refitting was turned off)
+   if(doPt)   ProcessVertex(mom, cov, vtx, xAOD::BPhysHelper::PV_MAX_SUM_PT2, mass);
+   if(doA0)   ProcessVertex(mom, cov, vtx, xAOD::BPhysHelper::PV_MIN_A0, mass);
+   if(doZ0)   ProcessVertex(mom, cov, vtx, xAOD::BPhysHelper::PV_MIN_Z0, mass);
+   if(doZ0BA) ProcessVertex(mom, cov, vtx, xAOD::BPhysHelper::PV_MIN_Z0_BA, mass);
+
+   return StatusCode::SUCCESS;
+}
+
+//-----------------------------------------------------------------------------
+
+void DerivationFramework::BPhysPVCascadeTools::SetVectorInfo(xAOD::BPhysHelper &vtx, const Trk::VxCascadeInfo* casc){
+
+    const std::vector< std::vector<TLorentzVector> > &moms = casc->getParticleMoms();
+    const std::vector<xAOD::Vertex*> &cascadeVertices = casc->vertices();
+    // Get refitted track momenta from all vertices, charged tracks only
+    std::vector<float> px;
+    std::vector<float> py;
+    std::vector<float> pz;
+    for( size_t jt=0; jt<moms.size(); jt++) {
+       for( size_t it=0; it<cascadeVertices[jt]->vxTrackAtVertex().size(); it++) {
+        px.push_back( moms[jt][it].Px() );
+        py.push_back( moms[jt][it].Py() );
+        pz.push_back( moms[jt][it].Pz() );
+      }
+    }
+    vtx.setRefTrks(std::move(px),std::move(py),std::move(pz));
+    
+}
+
+bool DerivationFramework::BPhysPVCascadeTools::uniqueCollection(const std::vector<const xAOD::TrackParticle*>&col){
+    for(auto p : col){
+        if(std::count(col.begin(), col.end(), p) > 1) return false;
+    }
+    return true;
+}
+
+bool DerivationFramework::BPhysPVCascadeTools::uniqueCollection(const std::vector<const xAOD::TrackParticle*>&col1, const std::vector<const xAOD::TrackParticle*>&col2){
+    for(auto p : col1){
+        if((std::count(col1.begin(), col1.end(), p) + std::count(col2.begin(), col2.end(), p)) > 1) return false;
+    }
+    for(auto p : col2){
+        if((std::count(col1.begin(), col1.end(), p) + std::count(col2.begin(), col2.end(), p)) > 1) return false;
+    }
+    return true;
+}
+
+bool DerivationFramework::BPhysPVCascadeTools::LinkVertices(SG::AuxElement::Decorator<VertexLinkVector> &decor, const std::vector<const xAOD::Vertex*>& vertices,
+                                                 const xAOD::VertexContainer* vertexContainer, const xAOD::Vertex* vert){
+  // create tmp vector of preceding vertex links
+  VertexLinkVector precedingVertexLinks;
+
+  // loop over input precedingVertices  
+  auto precedingVerticesItr = vertices.begin();
+  for(; precedingVerticesItr!=vertices.end(); ++precedingVerticesItr) {
+       // sanity check 1: protect against null pointers
+       if( !(*precedingVerticesItr) )
+         return false;
+    
+    // create element link
+    VertexLink vertexLink;
+    vertexLink.setElement(*precedingVerticesItr);
+    vertexLink.setStorableObject(*vertexContainer);
+    
+       // sanity check 2: is the link valid?
+    if( !vertexLink.isValid() )
+       return false;
+    
+    // link is OK, store it in the tmp vector
+    precedingVertexLinks.push_back( vertexLink );
+ 
+  } // end of loop over preceding vertices
+  
+    // all OK: store preceding vertex links in the aux store
+   decor(*vert) = precedingVertexLinks;
+   return true;
+}
+
+double DerivationFramework::BPhysPVCascadeTools::getParticleMass(const HepPDT::ParticleDataTable* pdt, int pdgcode){
+    auto ptr = pdt->particle( pdgcode );
+    return ptr ? ptr->mass() : 0.;
+}
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysPVThinningTool.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysPVThinningTool.cxx
new file mode 100644
index 000000000000..33e5030c830f
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysPVThinningTool.cxx
@@ -0,0 +1,134 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/////////////////////////////////////////////////////////////////
+// ThinningToolExample.cxx
+///////////////////////////////////////////////////////////////////
+// Author: James Catmore (James.Catmore@cern.ch)
+// This is a trivial example of an implementation of a thinning tool
+// which removes all ID tracks which do not pass a user-defined cut
+
+#include "DerivationFrameworkBPhys/BPhysPVThinningTool.h"
+#include "xAODTracking/TrackParticleContainer.h"
+#include "xAODTracking/TrackParticle.h"
+#include "StoreGate/ThinningHandle.h"
+#include "xAODBPhys/BPhysHelper.h"
+#include "StoreGate/ThinningHandle.h"
+#include <algorithm>
+#include <numeric>
+#include <vector>
+#include <string>
+
+using namespace std;
+using namespace xAOD;
+// Constructor
+DerivationFramework::BPhysPVThinningTool::BPhysPVThinningTool(const std::string& t,
+        const std::string& n,
+        const IInterface* p ) :
+    AthAlgTool(t,n,p),
+    m_TrackContainerName("InDetTrackParticles"),
+    m_PVContainerName("PrimaryVertices"),
+    m_ntot(0),
+    m_npass(0), m_tracks_kept(0), m_keepTracks(false)
+{
+    declareInterface<DerivationFramework::IThinningTool>(this);
+    declareProperty("CandidateCollections" , m_BPhyCandList);
+    declareProperty("KeepPVTracks", m_keepTracks);
+    declareProperty("TrackParticleContainerName", m_TrackContainerName);
+    declareProperty("PrimaryVertexContainerName", m_PVContainerName);
+}
+
+// Destructor
+DerivationFramework::BPhysPVThinningTool::~BPhysPVThinningTool() {
+}
+
+// Athena initialize and finalize
+StatusCode DerivationFramework::BPhysPVThinningTool::initialize()
+{
+    ATH_MSG_VERBOSE("initialize() ...");
+    ATH_CHECK(m_BPhyCandList.initialize());
+    if(not m_TrackContainerName.key().empty()) ATH_CHECK(m_TrackContainerName.initialize(m_streamName));
+    ATH_CHECK(m_PVContainerName.initialize(m_streamName));
+
+    return StatusCode::SUCCESS;
+}
+StatusCode DerivationFramework::BPhysPVThinningTool::finalize()
+{
+    ATH_MSG_VERBOSE("finalize() ...");
+    ATH_MSG_INFO("Processed "<< m_ntot <<" PV, "<< m_npass<< " were retained ");
+    if(m_keepTracks) ATH_MSG_INFO("Additional tracks kept " << m_tracks_kept);
+    return StatusCode::SUCCESS;
+}
+
+// The thinning itself
+StatusCode DerivationFramework::BPhysPVThinningTool::doThinning() const
+{
+
+    // Get the track container
+    SG::ThinningHandle<xAOD::VertexContainer> PV_col(m_PVContainerName);
+    if(!PV_col.isValid()) {
+        ATH_MSG_ERROR ("Couldn't retrieve VertexContainer with key PrimaryVertices");
+        return StatusCode::FAILURE;
+    }
+    m_ntot+=PV_col->size();
+    // Loop over tracks, see if they pass, set mask
+    std::vector<bool> mask(PV_col->size(), false);
+
+    BPhysHelper::pv_type pvtypes[] = {BPhysHelper::PV_MAX_SUM_PT2,
+				      BPhysHelper::PV_MIN_A0,
+				      BPhysHelper::PV_MIN_Z0,
+				      BPhysHelper::PV_MIN_Z0_BA};
+ 
+    
+
+    for(auto &str : m_BPhyCandList) {
+        SG::ReadHandle<xAOD::VertexContainer> Container(str);
+        ATH_CHECK(Container.isValid());
+        size_t s = Container->size();
+        for(size_t i = 0; i<s; i++) {
+            xAOD::BPhysHelper vtx(Container->at(i));
+
+            for(size_t i =0; i < 4; i++) {
+                 const xAOD::Vertex* origPv = vtx.origPv(pvtypes[i]);
+                 if(origPv==nullptr) continue;
+                 auto pvit = std::find (PV_col->begin(), PV_col->end(), origPv);
+                 if(pvit == PV_col->end()) {
+                    ATH_MSG_WARNING("PV not found in container");
+                    continue;
+                 }
+                size_t x = std::distance(PV_col->begin(), pvit);
+                mask.at(x) = true;
+            }
+
+        }
+    }
+
+    m_npass += std::accumulate(mask.begin(), mask.end(), 0);
+
+    if(m_keepTracks){
+         SG::ThinningHandle<xAOD::TrackParticleContainer> importedTrackParticles(m_TrackContainerName);
+         std::vector<bool> trackmask(importedTrackParticles->size(), false);
+         size_t pvnum = mask.size();
+         for(size_t i =0; i<pvnum;i++){
+            if(mask[i] == false) continue;
+            auto vtx =  PV_col->at(i);
+            size_t s = vtx->nTrackParticles();
+            for(size_t j=0;j<s;j++){
+                auto trackit = std::find(importedTrackParticles->begin(), importedTrackParticles->end(), vtx->trackParticle(j));
+                if(trackit == importedTrackParticles->end()){
+                    ATH_MSG_WARNING("track not found in container");
+                    continue;
+                }
+                size_t x = std::distance(importedTrackParticles->begin(), trackit);
+                trackmask.at(x) = true;
+            }
+         }
+      importedTrackParticles.keep(trackmask, SG::ThinningHandleBase::Op::Or);
+      m_tracks_kept += std::accumulate(trackmask.begin(), trackmask.end(), 0);
+    }
+    PV_col.keep(mask, SG::ThinningHandleBase::Op::Or);
+
+    return StatusCode::SUCCESS;
+}
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysPVTools.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysPVTools.cxx
new file mode 100644
index 000000000000..6bb75c4d31d3
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysPVTools.cxx
@@ -0,0 +1,545 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "DerivationFrameworkBPhys/BPhysPVTools.h"
+#include "xAODTracking/VertexContainer.h"
+#include "TrkVertexAnalysisUtils/V0Tools.h"
+#include "xAODBPhys/BPhysHelper.h"
+#include "JpsiUpsilonTools/PrimaryVertexRefitter.h"
+#include "TVector3.h"
+#include "BeamSpotConditionsData/BeamSpotData.h"
+
+#include <limits>
+#include <iostream>
+#include <cmath>
+using namespace std;
+
+DerivationFramework::BPhysPVTools::BPhysPVTools(const Trk::V0Tools *v0Tools) :
+  m_v0Tools(v0Tools), m_beamSpotData(nullptr), m_PV_minNTracks(0),
+ m_3dCalc(false)
+{
+}
+
+DerivationFramework::BPhysPVTools::BPhysPVTools(const Trk::V0Tools *v0Tools, const InDet::BeamSpotData *beamSpotSvc) :
+  m_v0Tools(v0Tools), m_beamSpotData(beamSpotSvc), m_PV_minNTracks(0),
+ m_3dCalc(false)
+{
+}
+
+void DerivationFramework::BPhysPVTools::FillBPhysHelper(xAOD::BPhysHelper &vtx,
+							const xAOD::Vertex* PV, const xAOD::VertexContainer* PvContainer,
+							xAOD::BPhysHelper::pv_type pvtype, int refitCode) const {
+
+  BPHYS_CHECK( vtx.setPv      ( PV, PvContainer, pvtype ) );
+
+  // cout << "BPhysPVTools::FillBPhysHelper for pvtype = " << pvtype << endl;
+  
+  // set variables calculated from PV
+  if(m_3dCalc){
+    BPHYS_CHECK( vtx.setLxyz    ( m_v0Tools->lxyz       (vtx.vtx(), PV), pvtype ) );
+    BPHYS_CHECK( vtx.setLxyzErr ( m_v0Tools->lxyzError  (vtx.vtx(), PV), pvtype ) );
+  }
+  BPHYS_CHECK( vtx.setLxy    ( m_v0Tools->lxy       (vtx.vtx(), PV), pvtype ) );
+  BPHYS_CHECK( vtx.setLxyErr ( m_v0Tools->lxyError  (vtx.vtx(), PV), pvtype ) );
+  BPHYS_CHECK( vtx.setA0     ( m_v0Tools->a0        (vtx.vtx(), PV), pvtype ) );
+  BPHYS_CHECK( vtx.setA0Err  ( m_v0Tools->a0Error   (vtx.vtx(), PV), pvtype ) );
+  BPHYS_CHECK( vtx.setA0xy   ( m_v0Tools->a0xy      (vtx.vtx(), PV), pvtype ) );
+  BPHYS_CHECK( vtx.setA0xyErr( m_v0Tools->a0xyError (vtx.vtx(), PV), pvtype ) );
+  BPHYS_CHECK( vtx.setZ0     ( m_v0Tools->a0z       (vtx.vtx(), PV), pvtype ) );
+  BPHYS_CHECK( vtx.setZ0Err  ( m_v0Tools->a0zError  (vtx.vtx(), PV), pvtype ) );
+  BPHYS_CHECK( vtx.setRefitPVStatus  ( refitCode, pvtype ) );
+
+}
+
+void DerivationFramework::BPhysPVTools::FillBPhysHelperNULL(xAOD::BPhysHelper &vtx,
+							    const xAOD::VertexContainer* PvContainer,
+							    xAOD::BPhysHelper::pv_type pvtype, bool do3d) {
+  const xAOD::Vertex* PV = nullptr;
+  BPHYS_CHECK( vtx.setPv      ( PV, PvContainer, pvtype ) );
+  constexpr float errConst = std::numeric_limits<float>::lowest();
+  // set variables claculated from PV
+  if(do3d){
+    BPHYS_CHECK( vtx.setLxyz    ( errConst, pvtype ) );
+    BPHYS_CHECK( vtx.setLxyzErr ( errConst, pvtype ) );
+  }
+  BPHYS_CHECK( vtx.setLxy    ( errConst, pvtype ) );
+  BPHYS_CHECK( vtx.setLxyErr ( errConst, pvtype ) );
+  BPHYS_CHECK( vtx.setA0     ( errConst, pvtype ) );
+  BPHYS_CHECK( vtx.setA0Err  ( errConst, pvtype ) );
+  BPHYS_CHECK( vtx.setA0xy   ( errConst, pvtype ) );
+  BPHYS_CHECK( vtx.setA0xyErr( errConst, pvtype ) );
+  BPHYS_CHECK( vtx.setZ0     ( errConst, pvtype ) );
+  BPHYS_CHECK( vtx.setZ0Err  ( errConst, pvtype ) );
+  BPHYS_CHECK( vtx.setRefitPVStatus  ( 0, pvtype ) );
+}
+
+size_t DerivationFramework::BPhysPVTools::FindLowZIndex(const xAOD::BPhysHelper &Obj,
+							const std::vector<const xAOD::Vertex*> &PVlist,
+							const size_t PV_minNTracks) const {
+  size_t lowZ  = 0;
+  if(PVlist.empty()) {
+    lowZ=std::numeric_limits<std::size_t>::max();
+    return lowZ;
+  }
+  size_t size = PVlist.size();
+  double lowA0zcalc = fabs(m_v0Tools->a0z       (Obj.vtx(), PVlist[0]));
+  for(size_t i =1; i<size; i++) {
+    if ( PVlist[i]->nTrackParticles() >= PV_minNTracks ) {
+      double a0z =  fabs(m_v0Tools->a0z(Obj.vtx(), PVlist[i]));
+      if(a0z < lowA0zcalc) {
+	lowA0zcalc = a0z;
+	lowZ =i;
+      }
+    }
+  }
+  return lowZ;
+}
+
+void DerivationFramework::BPhysPVTools::DecorateWithDummyVertex(xAOD::VertexContainer* vtxContainer, 
+								const xAOD::VertexContainer* pvContainer, const xAOD::Vertex* Dummy,
+								int DoVertexType, const bool SetOrignal) const {
+  const bool doPt   = (DoVertexType & 1) != 0;
+  const bool doA0   = (DoVertexType & 2) != 0;
+  const bool doZ0   = (DoVertexType & 4) != 0;
+  const bool doZ0BA = (DoVertexType & 8) != 0;
+
+  xAOD::VertexContainer::iterator vtxItr = vtxContainer->begin();
+  for(; vtxItr!=vtxContainer->end(); ++vtxItr) {
+    xAOD::BPhysHelper vtx(*vtxItr);
+
+    // 1) pT error
+    double ptErr = m_v0Tools->pTError( vtx.vtx() );
+    BPHYS_CHECK( vtx.setPtErr(ptErr) );
+    if(doPt) {
+      // 2.a) the first PV with the largest sum pT.
+      FillBPhysHelper(vtx, Dummy, pvContainer, xAOD::BPhysHelper::PV_MAX_SUM_PT2, 0);
+      if(SetOrignal) vtx.setOrigPv(Dummy, pvContainer, xAOD::BPhysHelper::PV_MAX_SUM_PT2);
+    }
+
+    if(doA0) {
+      // 2.b) the closest in 3D:
+      FillBPhysHelper(vtx, Dummy, pvContainer, xAOD::BPhysHelper::PV_MIN_A0, 0);
+      if(SetOrignal) vtx.setOrigPv(Dummy, pvContainer, xAOD::BPhysHelper::PV_MIN_A0);
+    }
+
+    if(doZ0) {
+      FillBPhysHelper(vtx, Dummy, pvContainer, xAOD::BPhysHelper::PV_MIN_Z0, 0);
+      if(SetOrignal) vtx.setOrigPv(Dummy, pvContainer, xAOD::BPhysHelper::PV_MIN_Z0);
+    }
+
+    if(doZ0BA) {
+      FillBPhysHelper(vtx, Dummy, pvContainer, xAOD::BPhysHelper::PV_MIN_Z0_BA, 0);
+      if(SetOrignal) vtx.setOrigPv(Dummy, pvContainer, xAOD::BPhysHelper::PV_MIN_Z0_BA);
+    }
+  }    
+}
+
+void DerivationFramework::BPhysPVTools::DecorateWithNULL(xAOD::VertexContainer* vtxContainer,
+							 const xAOD::VertexContainer* pvContainer, int DoVertexType) const {
+  const bool doPt   = (DoVertexType & 1) != 0;
+  const bool doA0   = (DoVertexType & 2) != 0;
+  const bool doZ0   = (DoVertexType & 4) != 0;
+  const bool doZ0BA = (DoVertexType & 8) != 0;
+  xAOD::VertexContainer::iterator vtxItr = vtxContainer->begin();
+  for(; vtxItr!=vtxContainer->end(); ++vtxItr) {
+    xAOD::BPhysHelper vtx(*vtxItr);
+
+    // 1) pT error
+    double ptErr = m_v0Tools->pTError( vtx.vtx() );
+    BPHYS_CHECK( vtx.setPtErr(ptErr) );
+    if(doPt) {
+      // 2.a) the first PV with the largest sum pT.
+      FillBPhysHelperNULL(vtx, pvContainer, xAOD::BPhysHelper::PV_MAX_SUM_PT2, m_3dCalc);
+    }
+
+    if(doA0) {
+      // 2.b) the closest in 3D:
+      FillBPhysHelperNULL(vtx, pvContainer, xAOD::BPhysHelper::PV_MIN_A0, m_3dCalc);
+    }
+
+    if(doZ0) {
+      FillBPhysHelperNULL(vtx, pvContainer, xAOD::BPhysHelper::PV_MIN_Z0, m_3dCalc);
+    }
+    if(doZ0BA) {
+      FillBPhysHelperNULL(vtx, pvContainer, xAOD::BPhysHelper::PV_MIN_Z0_BA, m_3dCalc);
+    }
+  }
+}
+
+StatusCode DerivationFramework::BPhysPVTools::FillCandExistingVertices(xAOD::VertexContainer* vtxContainer,
+								       const xAOD::VertexContainer* pvContainer, int DoVertexType) {
+
+
+
+  //----------------------------------------------------
+  // decorate the vertex
+  //----------------------------------------------------
+  // loop over candidates -- Don't apply PV_minNTracks requirement here
+  // because it may result in exclusion of the high-pt PV.
+  const std::vector<const xAOD::Vertex*> GoodPVs = GetGoodPV(pvContainer);
+
+
+  if(GoodPVs.empty() == false) {
+
+    const bool doPt   = (DoVertexType & 1) != 0;
+    const bool doA0   = (DoVertexType & 2) != 0;
+    const bool doZ0   = (DoVertexType & 4) != 0;
+    const bool doZ0BA = (DoVertexType & 8) != 0;
+
+  xAOD::VertexContainer::iterator vtxItr = vtxContainer->begin();
+    for(; vtxItr!=vtxContainer->end(); ++vtxItr) {
+      xAOD::BPhysHelper vtx(*vtxItr);
+
+      // 1) pT error
+      double ptErr = m_v0Tools->pTError( vtx.vtx() );
+      BPHYS_CHECK( vtx.setPtErr(ptErr) );
+
+      // 2) refit the primary vertex and set the related decorations.
+      if(doPt) {
+	size_t highPtindex = FindHighPtIndex(GoodPVs); //Should be 0 in PV ordering
+	// 2.a) the first PV with the largest sum pT.
+	FillBPhysHelper(vtx, GoodPVs[highPtindex], pvContainer, xAOD::BPhysHelper::PV_MAX_SUM_PT2, 0);
+      }
+
+      if(doA0) {
+	// 2.b) the closest in 3D:
+	size_t lowA0 =  FindLowA0Index(vtx, GoodPVs, m_PV_minNTracks);
+	FillBPhysHelper(vtx, GoodPVs[lowA0], pvContainer, xAOD::BPhysHelper::PV_MIN_A0, 0);
+      }
+
+      if(doZ0) {
+	size_t lowZ  = FindLowZIndex(vtx, GoodPVs, m_PV_minNTracks);
+	FillBPhysHelper(vtx, GoodPVs[lowZ], pvContainer, xAOD::BPhysHelper::PV_MIN_Z0, 0);
+      }
+
+      if(doZ0BA) {
+	size_t lowZBA = FindLowZ0BAIndex(vtx, GoodPVs, m_PV_minNTracks);
+	if ( lowZBA < GoodPVs.size() ) { // safety against vector index out-of-bounds
+	  FillBPhysHelper(vtx, GoodPVs[lowZBA], pvContainer, xAOD::BPhysHelper::PV_MIN_Z0_BA, 0);
+	} else {
+	  // nothing found -- fill nullptr
+	  FillBPhysHelperNULL(vtx, pvContainer, xAOD::BPhysHelper::PV_MIN_Z0_BA, m_3dCalc);
+	}
+      }
+
+    }// end of loop over vertices
+  } //end of check for vertices
+  else {
+    //        cout << "Warning: DerivationFramework::BPhysPVTools::FillCandExistingVertices No Primary Vertices Found trying to decorate wilth dummy \n";
+    if(pvContainer->empty()) return StatusCode::FAILURE;
+    const xAOD::Vertex* dummy = pvContainer->at(0);  //No good vertices so last vertex must be dummy
+    DecorateWithDummyVertex(vtxContainer, pvContainer, dummy, DoVertexType, false);
+  }
+  return StatusCode::SUCCESS;
+}
+
+
+StatusCode DerivationFramework::BPhysPVTools::FillCandwithRefittedVertices(xAOD::VertexContainer* vtxContainer,
+									   const xAOD::VertexContainer* pvContainer, xAOD::VertexContainer* refPvContainer,
+									   const Analysis::PrimaryVertexRefitter *pvRefitter, size_t in_PV_max, int DoVertexType) {
+
+
+  //----------------------------------------------------
+  // decorate the vertex
+  //----------------------------------------------------
+  // loop over candidates -- Don't apply PV_minNTracks requirement here
+  // because it may result in exclusion of the high-pt PV.
+  std::vector<const xAOD::Vertex*> goodPrimaryVertices = GetGoodPV(pvContainer);
+
+  /*
+  cout << "BPhysPVTools::FillCandwithRefittedVertices: #PVs: all: "
+       << pvContainer->size() << " ref: " << refPvContainer->size()
+       << " good: " << goodPrimaryVertices.size()
+       << " PV_minNTracks: " << m_PV_minNTracks << endl; 
+  */
+  if(goodPrimaryVertices.empty() == false) {
+
+        size_t pVmax =std::min(in_PV_max, goodPrimaryVertices.size());
+        std::vector<const xAOD::Vertex*> refPVvertexes;
+        std::vector<const xAOD::Vertex*> refPVvertexes_toDelete;
+        std::vector<int> exitCode;
+        refPVvertexes.reserve(pVmax);
+        refPVvertexes_toDelete.reserve(pVmax);
+        exitCode.reserve(pVmax);
+
+        bool doPt   = (DoVertexType & 1) != 0;
+        bool doA0   = (DoVertexType & 2) != 0;
+        bool doZ0   = (DoVertexType & 4) != 0;
+	bool doZ0BA = (DoVertexType & 8) != 0;
+
+        xAOD::VertexContainer::iterator vtxItr = vtxContainer->begin();
+        for(; vtxItr!=vtxContainer->end(); ++vtxItr) {
+            xAOD::BPhysHelper vtx(*vtxItr);
+
+            // 1) pT error
+            double ptErr = m_v0Tools->pTError( vtx.vtx() );
+            BPHYS_CHECK( vtx.setPtErr(ptErr) );
+
+            for(size_t i =0; i < pVmax ; i++) {
+                const xAOD::Vertex* oldPV = goodPrimaryVertices.at(i);
+                //when set to false this will return nullptr when a new vertex is not required
+                int exit =0;
+                const xAOD::Vertex* refPV = pvRefitter->refitVertex(oldPV, vtx.vtx(), false, &exit);
+                exitCode.push_back(exit);
+                //I want positioning to match the goodPrimaryVertices
+                if(refPV == nullptr){
+                   refPVvertexes.push_back(oldPV);
+                   refPVvertexes_toDelete.push_back(nullptr);
+                }else{
+                   refPVvertexes.push_back(refPV);
+                   refPVvertexes_toDelete.push_back(refPV);
+                }
+            }
+
+            // 2) refit the primary vertex and set the related decorations.
+
+            size_t highPtindex = doPt ? FindHighPtIndex(refPVvertexes) : 9999999; //Should be 0 in PV ordering
+            size_t lowA0 = doA0 ?
+	      FindLowA0Index(vtx, refPVvertexes, m_PV_minNTracks) : 9999998;
+            size_t lowZ  = doZ0 ?
+	      FindLowZIndex(vtx, refPVvertexes, m_PV_minNTracks) : 9999997;
+            size_t lowZBA = doZ0BA ?
+	      FindLowZ0BAIndex(vtx, refPVvertexes, m_PV_minNTracks) : 9999996;
+	    /*
+	    cout << "BPhysPVTools::FillCandwithRefittedVertices: in_PV_max/pVMax = "
+		 << in_PV_max << ", " << pVmax << endl;
+	    cout << "BPhysPVTools::FillCandwithRefittedVertices: m_PV_minNTracks = "
+		 << m_PV_minNTracks << endl;
+	    cout << "BPhysPVTools::FillCandwithRefittedVertices: hPt,lowA0/Z/ZBA = "
+		 << highPtindex << ", "
+		 << lowA0 << ", " << lowZ << ", " << lowZBA << " "
+		 << (lowA0 != lowZ   ? "1!" : "  ")
+		 << (lowA0 != lowZBA ? "2!" : "  ")
+		 << (lowZ  != lowZBA ? "3!" : "  ")
+		 << (highPtindex != lowA0  ? "4!" : "  ")
+		 << (highPtindex != lowZ   ? "5!" : "  ")
+		 << (highPtindex != lowZBA ? "6!" : "  ")
+		 << endl; 
+	    */
+            if(doPt) {
+                //Choose old PV container if not refitted
+                const xAOD::VertexContainer* ParentContainer =
+                    (refPVvertexes_toDelete.at(highPtindex)) ? refPvContainer : pvContainer; 
+                if(ParentContainer == refPvContainer) //if refitted add to refitted container
+                    refPvContainer->push_back(const_cast<xAOD::Vertex*>(refPVvertexes.at(highPtindex))); // store the new vertex
+              
+                FillBPhysHelper(vtx, refPVvertexes[highPtindex],
+                     ParentContainer, xAOD::BPhysHelper::PV_MAX_SUM_PT2, exitCode[highPtindex]);
+                vtx.setOrigPv(goodPrimaryVertices[highPtindex], pvContainer, xAOD::BPhysHelper::PV_MAX_SUM_PT2);
+            }
+
+            if(doA0) {
+                const xAOD::VertexContainer* ParentContainer = 
+                     (refPVvertexes_toDelete.at(lowA0)) ? refPvContainer : pvContainer; 
+                if(ParentContainer == refPvContainer && highPtindex!=lowA0)
+                    refPvContainer->push_back(const_cast<xAOD::Vertex*>(refPVvertexes.at(lowA0))); // store the new vertex
+                
+                FillBPhysHelper(vtx, refPVvertexes[lowA0],
+                      ParentContainer, xAOD::BPhysHelper::PV_MIN_A0, exitCode[lowA0]);
+                vtx.setOrigPv(goodPrimaryVertices[lowA0], pvContainer, xAOD::BPhysHelper::PV_MIN_A0);
+            }
+
+
+	    // 2.c) the closest in Z:
+            if(doZ0) {
+
+                const xAOD::VertexContainer* ParentContainer =
+                    (refPVvertexes_toDelete.at(lowZ)) ? refPvContainer : pvContainer;
+                if(ParentContainer == refPvContainer && highPtindex!=lowZ && lowZ!=lowA0)
+                    refPvContainer->push_back(const_cast<xAOD::Vertex*>(refPVvertexes.at(lowZ))); // store the new vertex
+                
+                FillBPhysHelper(vtx, refPVvertexes[lowZ], 
+                      ParentContainer, xAOD::BPhysHelper::PV_MIN_Z0, exitCode[lowZ]);
+                vtx.setOrigPv(goodPrimaryVertices[lowZ], pvContainer, xAOD::BPhysHelper::PV_MIN_Z0);
+            }
+
+	    // 2.d) the closest in Z (DOCA w.r.t. beam axis):
+            if (doZ0BA) {
+	      if ( lowZBA < pVmax ) { // safety for vector indices
+		const xAOD::VertexContainer* ParentContainer =
+		  (refPVvertexes_toDelete.at(lowZBA)) ?
+		  refPvContainer : pvContainer;
+		if (ParentContainer == refPvContainer && highPtindex!=lowZBA
+		    && lowZBA!=lowA0 && lowZBA != lowZ) {
+		  // store the new vertex
+		  refPvContainer->push_back(const_cast<xAOD::Vertex*>
+					    (refPVvertexes.at(lowZBA)));
+		}
+		FillBPhysHelper(vtx, refPVvertexes[lowZBA],
+				ParentContainer, xAOD::BPhysHelper::PV_MIN_Z0_BA,
+				exitCode[lowZBA]);
+		vtx.setOrigPv(goodPrimaryVertices[lowZBA], pvContainer,
+			      xAOD::BPhysHelper::PV_MIN_Z0_BA);
+	      } else {
+		// nothing found -- fill nullptr
+		FillBPhysHelperNULL(vtx, pvContainer, xAOD::BPhysHelper::PV_MIN_Z0_BA, m_3dCalc);
+		// nothing found -- fill dummy vertex (type-0 vertex)
+		// if(pvContainer->empty()) return StatusCode::FAILURE;
+ 	        // const xAOD::Vertex* dummy = pvContainer->at(pvContainer->size()-1);  //No good vertices so last vertex must be dummy
+		// FillBPhysHelper(vtx, dummy, pvContainer, xAOD::BPhysHelper::PV_MIN_Z0_BA, 0);
+		// vtx.setOrigPv(Dummy, pvContainer, xAOD::BPhysHelper::PV_MIN_Z0_BA);
+	      }
+	    }
+
+            //nullptrify ptrs we want to keep so these won't get deleted
+            //"delete nullptr" is valid in C++ and does nothing so this is quicker than a lot of if statements
+            if(doPt)                     refPVvertexes_toDelete[highPtindex] = nullptr;
+            if(doA0)                     refPVvertexes_toDelete[lowA0]       = nullptr;
+            if(doZ0)                     refPVvertexes_toDelete[lowZ]        = nullptr;
+            if(doZ0BA && lowZBA < pVmax) refPVvertexes_toDelete[lowZBA]      = nullptr;
+            //Loop over toDELETE container, anything that is used or was not refitted is nullptr
+            //This cleans up all extra vertices that were created and not used
+            for(const xAOD::Vertex* ptr : refPVvertexes_toDelete) {
+                delete ptr;
+            }
+            refPVvertexes.clear();// Clear lists of now dangling ptrs
+            refPVvertexes_toDelete.clear();
+            exitCode.clear();
+        }  // end of loop over vertices
+
+    } else {
+//        cout << "Warning: DerivationFramework::BPhysPVTools::FillCandwithRefittedVertices No Primary Vertices Found trying to decorate wilth dummy \n";
+        if(pvContainer->empty()) return StatusCode::FAILURE;
+        const xAOD::Vertex* dummy = pvContainer->at(0);  //No good vertices so last vertex must be dummy
+        DecorateWithDummyVertex(vtxContainer, pvContainer, dummy, DoVertexType, true);
+    }
+
+    return StatusCode::SUCCESS;
+}
+
+size_t DerivationFramework::BPhysPVTools::FindHighPtIndex(const std::vector<const xAOD::Vertex*> &PVlist) {
+    // it SHOULD be the first one in the collection but it shouldn't take long to do a quick check
+    for(size_t i =0; i<PVlist.size(); i++) {
+        if(PVlist[i]->vertexType() == xAOD::VxType::PriVtx) return i;
+    }
+    cout << "FATAL ERROR High Pt Primary vertex not found - this should not happen\n";
+    return std::numeric_limits<std::size_t>::max(); //This should not happen
+}
+
+size_t DerivationFramework::BPhysPVTools::FindLowA0Index(const xAOD::BPhysHelper &Obj,
+							 const std::vector<const xAOD::Vertex*> &PVlist,
+							 const size_t PV_minNTracks) const {
+    size_t lowA0  = 0;
+    if(PVlist.empty()) {
+        lowA0=std::numeric_limits<std::size_t>::max();
+        return lowA0;
+    }
+    size_t size = PVlist.size();
+    double lowA0calc  = m_v0Tools->a0(Obj.vtx(), PVlist[0]);
+    for(size_t i =1; i<size; i++) {
+      if ( PVlist[i]->nTrackParticles() >= PV_minNTracks ) {
+	double a0 =  m_v0Tools->a0(Obj.vtx(), PVlist[i]);
+	if(a0 < lowA0calc) {
+	  lowA0calc = a0;
+	  lowA0 =i;
+	}
+      }
+    }
+    return lowA0;
+}
+
+vector<const xAOD::Vertex*> DerivationFramework::BPhysPVTools::GetGoodPV(const xAOD::VertexContainer* pvContainer) {
+    typedef xAOD::VxType::VertexType VertexType;
+    VertexType Pvtx = xAOD::VxType::PriVtx;
+    VertexType Pileupvtx = xAOD::VxType::PileUp;
+    std::vector<const xAOD::Vertex*> goodPrimaryVertices;
+    goodPrimaryVertices.reserve(pvContainer->size());
+
+    for (auto ptr = pvContainer->begin(); ptr!= pvContainer->end(); ++ptr) {
+        VertexType thistype = (*ptr)->vertexType();
+        if ( thistype == Pileupvtx || thistype == Pvtx ) {
+	  goodPrimaryVertices.push_back(*ptr);
+        } else {
+//             cout << "vertex type  " << thistype << endl;
+        }
+    }
+    return goodPrimaryVertices;
+}
+//-----------------------------------------------------------------------------
+// added by WW:
+//
+void DerivationFramework::BPhysPVTools::SetMinNTracksInPV(size_t PV_minNTracks)
+{
+
+  m_PV_minNTracks = PV_minNTracks;
+}
+//-----------------------------------------------------------------------------
+// added by WW:
+//
+const Amg::Vector3D& DerivationFramework::BPhysPVTools::GetBeamSpot() const noexcept {
+
+  if(m_beamSpotData) return m_beamSpotData->beamPos();
+  else {
+    static const Amg::Vector3D defaultBS(-10000.,-10000.,-10000.);
+    return defaultBS;
+  } 
+}
+//-----------------------------------------------------------------------------
+// added by WW:
+//
+size_t DerivationFramework::BPhysPVTools::FindLowZ0BAIndex(const xAOD::BPhysHelper &obj,
+							   const std::vector<const xAOD::Vertex*> &PVlist,
+							   const size_t PV_minNTracks) const {
+  
+  size_t ilowZ0BA   = std::numeric_limits<std::size_t>::max();
+  double lowZ0BAcalc = std::numeric_limits<double>::max(); 
+  for (size_t i = 0; i<PVlist.size(); ++i) {
+    if ( PVlist[i]->nTrackParticles() >= PV_minNTracks ) {
+      double z0BA =  m_v0Tools->a0(obj.vtx(), PVlist[i]);
+      if (z0BA < lowZ0BAcalc) {
+	lowZ0BAcalc = z0BA;
+	ilowZ0BA = i;
+      }
+    }
+  }
+  return ilowZ0BA;
+}
+//-----------------------------------------------------------------------------
+// added by WW:
+//
+double DerivationFramework::BPhysPVTools::DistInZtoDOCA(const xAOD::BPhysHelper &obj, const xAOD::Vertex* vertex) const {
+
+  Amg::Vector3D pv    = vertex->position();
+  Amg::Vector3D xDOCA = DocaExtrapToBeamSpot(obj);
+  Amg::Vector3D vec   = pv - xDOCA;
+  return vec.z();
+}
+//-----------------------------------------------------------------------------
+// added by WW:
+//
+Amg::Vector3D DerivationFramework::BPhysPVTools::DocaExtrapToBeamSpot(const xAOD::BPhysHelper& obj) const {
+
+  Amg::Vector3D xDOCA(-99999., -99999., -99999.);
+  TVector3      totP(const_cast<xAOD::BPhysHelper&>(obj).totalP());
+  Amg::Vector3D pSV(totP.X(), totP.Y(), totP.Z());
+  Amg::Vector3D pT(pSV.x(), pSV.y(), 0.);
+  if ( pT.mag2() > 0 ) {
+    Amg::Vector3D xBS = GetBeamSpot();
+    Amg::Vector3D xSV = m_v0Tools->vtx(obj.vtx());
+    Amg::Vector3D xT(xSV.x()-xBS.x(), xSV.y()-xBS.y(), 0.);
+    xDOCA = xSV - pSV*pT.dot(xT)/pT.mag2();
+  } else {
+    std::cout << "BPhysPVTools::DocaExtrapToBeamSpot: WARNING pT == 0."
+	      << std::endl;
+  }
+  return xDOCA;
+}
+
+void DerivationFramework::BPhysPVTools::PrepareVertexLinks(xAOD::Vertex* theResult,
+               const xAOD::TrackParticleContainer* importedTrackCollection)
+{
+  std::vector<ElementLink<DataVector<xAOD::TrackParticle> > > newLinkVector;
+  const auto &trkprtl = theResult->trackParticleLinks();
+  for(unsigned int i=0; i< trkprtl.size(); i++)
+  {
+      ElementLink<DataVector<xAOD::TrackParticle> > mylink=trkprtl[i]; //makes a copy (non-const)
+      mylink.setStorableObject(*importedTrackCollection, true);
+      newLinkVector.push_back( mylink );
+  }
+  theResult->clearTracks();
+  theResult->setTrackParticleLinks( newLinkVector );
+}
+
+
+//-----------------------------------------------------------------------------
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysVarBlinder.cxxNoCompile b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysVarBlinder.cxxNoCompile
new file mode 100644
index 000000000000..13a63f881bab
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysVarBlinder.cxxNoCompile
@@ -0,0 +1,72 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+
+//============================================================================
+// BPhysVarBlinder.cxx
+//============================================================================
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Changes:
+// 
+//============================================================================
+//
+#include "BPhysTools/BPhysBlindingTool.h"
+#include "DerivationFrameworkBPhys/BPhysVarBlinder.h"
+
+namespace DerivationFramework {
+
+  //---------------------------------------------------------------------------
+  // Constructor
+  //---------------------------------------------------------------------------
+  BPhysVarBlinder::BPhysVarBlinder(const std::string& t,
+                                   const std::string& n,
+                                   const IInterface* p) : 
+    CfAthAlgTool(t,n,p),
+    m_blindingTool("xAOD::BPhysBlindingTool") {
+    
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+
+    // Declare tools    
+    declareProperty("BlindingTool", m_blindingTool);
+
+    // Declare user-defined properties
+    declareProperty("EnableBlinding", m_enableBlinding = true);
+
+  }
+  //---------------------------------------------------------------------------
+  // Initialization
+  //---------------------------------------------------------------------------
+  StatusCode BPhysVarBlinder::initialize() {
+  
+    ATH_MSG_DEBUG("in initialize()");
+    
+    // retrieve blinding tool
+    CHECK( m_blindingTool.retrieve() );
+    
+    ATH_MSG_INFO("initialize(): EnableBlinding: " << m_enableBlinding);
+    
+    return StatusCode::SUCCESS;
+  }
+  //---------------------------------------------------------------------------
+  // Finalization
+  //---------------------------------------------------------------------------
+  StatusCode BPhysVarBlinder::finalize() {
+
+    // everything all right
+    return StatusCode::SUCCESS;
+  }
+  //---------------------------------------------------------------------------
+  // Perform blinding
+  //---------------------------------------------------------------------------
+  StatusCode BPhysVarBlinder::addBranches() const {
+    
+    if ( m_enableBlinding ) {
+      CHECK( m_blindingTool->doBlind() );
+    }
+    
+    return StatusCode::SUCCESS;
+  }
+  //---------------------------------------------------------------------------
+
+} // namespace DerivationFramework
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysVertexTrackBase.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysVertexTrackBase.cxx
new file mode 100644
index 000000000000..2f2cef79bfca
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BPhysVertexTrackBase.cxx
@@ -0,0 +1,1480 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+//============================================================================
+// BPhysVertexTrackBase.cxx
+//============================================================================
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Changes:
+//
+// Base class for vertex-track related classes in need of
+// track-to-vertex association handling.
+//
+// Derived classes should overwrite the following methods instead
+// of the orginal initialize() etc methods:
+// - initializeHook()
+// - finalizeHook()
+// - addBranchesHook()       -- only called at end of addBranches()
+// - addBranchesSVLoopHook() -- preferred (inside SV loop)
+//
+// From within addBranchesSVLoopHook()
+// - calculateValues()
+// should be called and the following hook methods should be overwritten:
+// - calcValuesHook() -- called for the actual calculation of values
+// - fastFillHook()   -- called to check and apply caching of values
+//
+// For an usage example see BVertexTrackIsoTool and BPHY8.py .
+//
+// Job options provided by this class:
+// - BranchPrefixes             -- vector of prefixes to assign to
+//                                 added branches
+//                                 (Must be of same size as VertexContainerNames
+//                                  and in the same order.)
+// - BranchBaseName             -- assign the base name of added branches
+//                                 (default: iso)
+// - BranchSuffix               -- assign the suffix of added branches
+//                                 (default: empty = none)
+// - VertexContainerNames       -- names of containers for secondary vertices
+// - TrackParticleContainerName -- name of container for TrackParticles
+// - TrackToVertexTool          -- ToolHandle for track-to-vertex tool
+// - TrackSelectionTools        -- Array of ToolHandles for track
+//                                 selection tools; each tool should
+//                                 be named XXXX_YYYY, where the YYYY
+//                                 suffix string which needs to be unique;
+//                                 will be used to name the isolation track
+//                                 category (part of the new attribute names)
+// - RefPVContainerNames        -- List of refitted PV container names.
+//                                 (Must be of same size as VertexContainerNames
+//                                  and in the same order.)
+// - DoVertexType               -- PV-to-SV association types to be
+//                                 considered (bitwise variable, see
+//                                 xAODBPhys::BPhysHelper)
+// - UseTrackTypes              -- List of or-ed bit-wise selection of
+//                                 track sets to consider:
+//                                 bit : meaning
+//                                 0   : tracks close to PV associated
+//                                       with SV
+//                                 1   : tracks associated with dummy PV
+//                                       ("type-0 PV tracks")
+//                                 2   : tracks associated with PV of type 1
+//                                 3   : tracks associated with PV of type 2
+//                                 4   : tracks associated with PV of type 3
+//                                 5   : tracks associated with PV with types
+//                                       other than 0 to 4.
+//                                 6   : tracks with missing pointer to
+//                                       PV (NULL pointer)
+//                                 7-22: tracks being closest to assoc. PV
+//                                     useRefittedPVs doDCAin3D chi2DefToUse
+//                                 7   :    yes           no        0
+//                                 8   :    no            no        0
+//                                 9   :    yes           yes       0
+//                                 10  :    no            yes       0
+//                                 11  :    yes           no        1
+//                                 12  :    no            no        1
+//                                 13  :    yes           yes       1
+//                                 14  :    no            yes       1
+//                                 15  :    yes           no        2
+//                                 16  :    no            no        2
+//                                 17  :    yes           yes       2
+//                                 18  :    no            yes       2
+//                                 19  :    yes           --        3
+//                                 20  :    no            --        3
+//                                 21  :    yes           --        4
+//                                 22  :    no            --        4
+//                                 23  :    yes           --        5
+//                                 24  :    no            --        5
+//                                 25  :    yes           yes       6
+//                                 26  :    no            yes       6
+//                                 27  :    yes           yes       7
+//                                 28  :    no            yes       7
+//                                 29  :    yes           yes       8
+//                                 30  :    no            yes       8
+//                                 31  :    yes           yes       9
+//                                 32  :    no            yes       9
+//                                 useRefittedPVs:
+//                                   replace PV associated to decay candidate
+//                                   by the refitted PV
+//                                 doDCAin3D:
+//                                   use d0 and z0 in the determination of
+//                                   of the point of closest approach of
+//                                   a track to a vertex
+//                                 chi2DefToUse:
+//                                   PV uncertainties in the chi2 calculation
+//                                   in addition to track uncertainties
+//                                   0 : use old method
+//                                       (only track uncertainties)
+//                                   1 : from track perigee with
+//                                       uncertainties from track and vertex
+//                                   2 : simple extrapolation from track
+//                                       parameters with uncertainties from
+//                                       track and vertex (extrapolation
+//                                       used for track swimming)
+//                                   3 : CalcLogChi2toPV method from NtupleMaker
+//                                       using xAOD::TrackingHelpers.
+//                                       (only track uncertainties)
+//                                   4 : CalcLogChi2toPV method from NtupleMaker
+//                                       using xAOD::TrackingHelpers.
+//                                       (track and vertex uncertainties)
+//                                   5 : use TrackVertexAssociationTool
+//                                   6 : full 3D chi2 from track perigee
+//                                       with uncertainties from track and
+//                                       vertex (sum of 3x3 covariance matrices)
+//                                   7 : full 3D chi2 from track perigee with
+//                                       uncertainties from track and vertex
+//                                       (sum of 2x2 covariance matrices)
+//                                   8 : simple extrapolation from track
+//                                       parameters with uncertainties
+//                                       from track and vertex
+//                                       (sum of 3x3 covariance matrices)
+//                                   9   simple extrapolation from track
+//                                       parameters with uncertainties
+//                                       from track and vertex
+//                                       (sum of 2x2 covariance matrices)
+//                                 (E.g. 127 means to consider all tracks.)
+// - IncPrecVerticesInDecay     -- Include preceeding vertices in search
+//                                 for ID tracks and muons from decaying
+//                                 particle.  (May be a bit slower but
+//                                 more accurate.  Double-counting of track
+//                                 or muon objects is excluded.
+//                                 Default: True)
+// - MinNTracksInPV             -- Minimum number of tracks in PV for
+//                                 PV to be considered in calculation
+//                                 of closest PV to a track
+// - PVTypesToConsider          -- List of primary vertex types to consider
+//                                 in calculation of closest PV to a track
+// - DebugTrackTypes            -- Count tracks of specific types (bit
+//                                 patterns w.r.t. vertex association)
+//                                 and dump statistics to log file
+//                                 0 : disabled
+//                                 1 : count tracks of certain types
+// - DebugTracksInEvents        -- debug track selections in detail for
+//                                 a list of event numbers.
+//
+//                           
+//============================================================================
+//
+#include "DerivationFrameworkBPhys/BPhysVertexTrackBase.h"
+#include "xAODTracking/TrackParticlexAODHelpers.h"
+#include "xAODBPhys/BPhysHelper.h"
+#include "InDetTrackSelectionTool/IInDetTrackSelectionTool.h"
+#include "EventPrimitives/EventPrimitivesHelpers.h"
+#include "TrackVertexAssociationTool/TrackVertexAssociationTool.h"
+#include "TVector3.h"
+#include "TString.h"
+#include "boost/format.hpp"
+#include <algorithm>
+#include <sstream>
+#include <limits>
+
+namespace DerivationFramework {
+
+  //-------------------------------------------------------------------------
+  //
+  // helper class
+  BPhysVertexTrackBase::BaseItem::BaseItem(std::string Name,
+					   std::string Bname,
+					   std::string Prefix) :
+    name(std::move(Name)), bname(std::move(Bname)), prefix(std::move(Prefix)) {
+  }
+  
+  BPhysVertexTrackBase::BaseItem::~BaseItem() {
+  }
+  
+  void BPhysVertexTrackBase::BaseItem::setup(std::string Name,
+					     std::string Bname,
+					     std::string Prefix) {
+    name     = std::move(Name);
+    bname    = std::move(Bname);
+    prefix   = std::move(Prefix);
+  }
+
+  void BPhysVertexTrackBase::BaseItem::setPrefix(std::string Prefix) {
+    prefix = std::move(Prefix);
+  }
+  
+  void BPhysVertexTrackBase::BaseItem::resetVals() {
+    // needs to be implemented by derived class
+  }
+
+  std::string BPhysVertexTrackBase::BaseItem::buildName(std::string qualifier,
+							std::string suffix) {
+    boost::format f("%s%s%s%s%s");
+    f % (prefix.length() > 0 ? prefix+"_" : "")
+      % (bname.length() > 0 ? bname+"_" : "")
+      % (qualifier.length() > 0 ? qualifier+"_" : "")
+      % name
+      % suffix;
+    return f.str();
+  }
+
+  std::string BPhysVertexTrackBase::BaseItem::toString() const {
+    boost::format f("nm: %s\nbn: %s");
+    f % name % bname;
+    return f.str();
+  }
+  //-------------------------------------------------------------------------
+  //
+  // helper class (for track types)
+  //
+  BPhysVertexTrackBase::TrackTypeCounter::
+  TrackTypeCounter(BPhysVertexTrackBase& Parent, std::string Name)
+    : name(std::move(Name)), m_parent(Parent) {
+  }
+
+  BPhysVertexTrackBase::TrackTypeCounter::~TrackTypeCounter() {
+  }
+
+  void BPhysVertexTrackBase::TrackTypeCounter::addToCounter(uint64_t atype,
+                                                            uint64_t rtype,
+                                                            std::string prefix,
+                                                            std::string suffix,
+                                                            uint64_t counts) {
+    boost::format f("%sT%010d_R%010d%s");
+    f % (prefix.length() > 0 ? prefix+"_" : "")
+      % atype
+      % m_parent.m_useTrackTypes[rtype]
+      % (suffix.length() > 0 ? "_"+suffix : "");
+
+    addToCounter(f.str(), atype, counts);
+  }
+  
+  void BPhysVertexTrackBase::TrackTypeCounter::addToCounter(std::string name,
+                                                            uint64_t atype,
+                                                            uint64_t counts) {
+
+    NameCountMap_t::const_iterator it = m_cnts.find(name);
+
+    if ( it != m_cnts.end() ) {
+      m_cnts[name].first += counts;
+    } else {
+      m_cnts[name] = std::make_pair(counts, atype);
+    }
+  }
+  
+  std::string BPhysVertexTrackBase::TrackTypeCounter::
+  countsToString(uint indent) const {
+
+    boost::format f("%sCounters for %s:\n");
+    f % boost::io::group(std::setw(indent), " ") % name; 
+    std::string str = f.str();
+    
+    int lmax(0);
+    for (NameCountMap_t::const_iterator it = m_cnts.begin();
+         it != m_cnts.end(); ++it) {
+      lmax = std::max(lmax, (int)(it->first).length());
+    }
+
+    for (NameCountMap_t::const_iterator it = m_cnts.begin();
+         it != m_cnts.end(); ++it) {
+      boost::format f("%s%-s : %10lld %33s");
+      f % boost::io::group(std::setw(indent+4), " ")
+        % boost::io::group(std::setw(lmax), it->first)
+        % (it->second).first
+        % std::bitset<33>((it->second).second).to_string();
+      str += f.str() + "\n";
+    }
+    // clean up last newline
+    str.erase(str.length()-1);
+    
+    return str;
+  }
+  //--------------------------------------------------------------------------
+  //-------------------------------------------------------------------------
+  // static members
+  const int          BPhysVertexTrackBase::n_track_types    = 33;
+  const std::string  BPhysVertexTrackBase::track_type_str[] =
+    {"ASSOCPV", "PVTYPE0", "PVTYPE1", "PVTYPE2", "PVTYPE3", "NONE", "NULLVP",
+     "CAPVRFN3U0", "CAPVNRN3U0", "CAPVRF3DU0", "CAPVNR3DU0",
+     "CAPVRFN3U1", "CAPVNRN3U1", "CAPVRF3DU1", "CAPVNR3DU1",
+     "CAPVRFN3U2", "CAPVNRN3U2", "CAPVRF3DU2", "CAPVNR3DU2",
+     "CAPVRFNNU3", "CAPVNRNNU3", "CAPVRFNNU4", "CAPVNRNNU4",
+     "CAPVRFNNU5", "CAPVNRNNU5", "CAPVRFNNU6", "CAPVNRNNU6",
+     "CAPVRFNNU7", "CAPVNRNNU7", "CAPVRFNNU8", "CAPVNRNNU8",
+     "CAPVRFNNU9", "CAPVNRNNU9"};
+  const uint64_t BPhysVertexTrackBase::track_type_bit[] =
+    {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40,
+     0x80, 0x100, 0x200, 0x400,
+     0x800, 0x1000, 0x2000, 0x4000,
+     0x8000, 0x10000, 0x20000, 0x40000,
+     0x80000, 0x100000, 0x200000, 0x400000,
+     0x800000, 0x1000000, 0x2000000, 0x4000000,
+     0x8000000, 0x10000000, 0x20000000, 0x40000000,
+     0x80000000, 0x100000000};
+  uint64_t BPhysVertexTrackBase::s_track_type_all_cached = 0x0;
+  
+  // static methods
+  const std::string
+  BPhysVertexTrackBase::tts(BPhysVertexTrackBase::track_type type) {
+    return track_type_str[type];
+  }
+  
+  uint64_t BPhysVertexTrackBase::ttb(BPhysVertexTrackBase::track_type type) {
+    return track_type_bit[type];
+  }
+  
+  uint64_t BPhysVertexTrackBase::ttallMin() {
+    // only bits 0 - 6
+    return 127;
+  }
+
+  uint64_t BPhysVertexTrackBase::ttall() {
+    if ( s_track_type_all_cached == 0x0 ) {
+      for (unsigned int i=0; i<n_track_types; ++i) {
+        s_track_type_all_cached |= track_type_bit[i];
+      }
+    }
+    return s_track_type_all_cached;
+  }
+
+  uint64_t BPhysVertexTrackBase::rttor(const std::vector<uint64_t> &vtypes) {
+    // or of requested track types
+    uint64_t ttor(0);
+    for (size_t i=0; i<vtypes.size(); ++i) {
+      ttor |= vtypes[i];
+    }
+    return ttor;
+  }
+
+  // track to string
+  std::string
+  BPhysVertexTrackBase::trackToString(const xAOD::TrackParticle* track) {
+    std::string str;
+    if (track != nullptr) {
+      boost::format f("p(%10.4f,%10.4f,%10.4f)\n"
+                      "d:(%10.5f,%10.5f,%10.5f,%10.5f,%10.6f)");
+      f % (track->p4()).Px() % (track->p4()).Py() % (track->p4()).Pz();
+      f % track->d0() % track->z0() % track->phi0() % track->theta();
+      f % track->qOverP();
+      str = f.str();
+    } // if track
+  return str;
+  }
+  
+  //--------------------------------------------------------------------------
+  // Static utility method to prefix every line by a certain string
+  //--------------------------------------------------------------------------
+  std::string BPhysVertexTrackBase::wrapLines(std::string lines,
+					      std::string prefix) {
+    
+    std::string ostr;
+    std::istringstream stream(lines);
+    std::string line;
+    while ( std::getline(stream, line) ) {
+      if ( !ostr.length() == 0 ) ostr += "\n";
+      ostr += prefix + line;
+    }
+    return ostr;
+  }
+  //--------------------------------------------------------------------------
+  //--------------------------------------------------------------------------
+  BPhysVertexTrackBase::BPhysVertexTrackBase(const std::string& t,
+					     const std::string& n,
+					     const IInterface*  p)
+    : AthAlgTool(t,n,p), m_trackToVertexTool("Reco::TrackToVertex"),
+      m_tvaTool("CP::TrackVertexAssociationTool"),
+      m_tvaToolHasWpLoose(false),
+      m_tracks(NULL), m_tracksAux(NULL), m_nEvtsSeen(0), m_eventInfo(nullptr),
+      m_trackTypesUsed(0), m_runNumber(0), m_evtNumber(0),
+      m_debugTracksInThisEvent(false) {
+    
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+
+    // Declare branch prefix
+    declareProperty("BranchPrefixes", m_branchPrefixes);
+    declareProperty("BranchBaseName", m_branchBaseName = "iso");
+    declareProperty("BranchSuffix"  , m_branchSuffix = ""     );
+
+    // Necessary containers
+    declareProperty("VertexContainerNames"  , m_vertexContainerNames);
+    declareProperty("TrackParticleContainerName",
+		    m_trackParticleContainerName);
+    declareProperty("TrackToVertexTool"     , m_trackToVertexTool);
+    declareProperty("TrackSelectionTools"   , m_trackSelectionTools);
+    declareProperty("TVATool"               , m_tvaTool);
+    declareProperty("PVContainerName", m_pvContainerName = "PrimaryVertices");
+    declareProperty("RefPVContainerNames"   , m_refPVContainerNames);
+    declareProperty("DoVertexType"          , m_doVertexType = 8);
+    declareProperty("UseTrackTypes"         , m_useTrackTypes = {7});
+    declareProperty("IncPrecVerticesInDecay", m_incPrecVerticesInDecay = true);
+    declareProperty("MinNTracksInPV"        , m_minNTracksInPV = 0);
+    declareProperty("PVTypesToConsider"     , m_pvTypesToConsider = {1,3});
+    declareProperty("DebugTrackTypes"       , m_debugTrackTypes=0);
+    declareProperty("DebugTracksInEvents"   , m_debugTracksInEvents = {});
+  }
+  //--------------------------------------------------------------------------
+  StatusCode BPhysVertexTrackBase::initialize() {
+  
+    ATH_MSG_DEBUG("BPhysVertexTrackBase::initialize() -- begin");
+
+    if ( m_vertexContainerNames.size() == 0 ) {
+      ATH_MSG_ERROR("No vertex container names provided!");
+    }
+    if ( m_refPVContainerNames.size() == 0 ) {
+      ATH_MSG_ERROR("No refitted PV container names provided!");
+    }
+    if ( m_trackParticleContainerName == "" ) {
+      ATH_MSG_ERROR("No track particle container name provided!");
+    }
+    if ( m_pvContainerName == "" ) {
+      ATH_MSG_ERROR("No PV container name provided!");
+    }
+    if ( m_vertexContainerNames.size() != m_refPVContainerNames.size() ) {
+      ATH_MSG_ERROR("Size mismatch of VertexContainerNames ("
+		    << m_vertexContainerNames.size()
+		    << ") and RefPVContainerNames ("
+		    << m_refPVContainerNames.size() << ") lists!");
+    }
+
+    if ( m_vertexContainerNames.size() != m_branchPrefixes.size() ) {
+      ATH_MSG_ERROR("Size mismatch of VertexContainerNames ("
+		    << m_vertexContainerNames.size()
+		    << ") and BranchPrefixes ("
+		    << m_branchPrefixes.size() << ") lists!");
+    }      
+    
+    // TrackToVertexTool
+    ATH_CHECK(m_trackToVertexTool.retrieve());
+
+    // TrackSelectionTools
+    for (auto selTool : m_trackSelectionTools ) {
+      ATH_CHECK(selTool.retrieve());
+    }
+
+    // TrackVertexAssociationTool
+    ATH_CHECK(m_tvaTool.retrieve());
+    // take note of working point
+    // const std::string tvaWp("Loose");
+    const std::string tvaWp =
+      dynamic_cast<CP::TrackVertexAssociationTool*>(m_tvaTool.get())->getProperty("WorkingPoint").toString();
+    m_tvaToolHasWpLoose = (tvaWp == "Loose");
+    
+    // initialize PV-to-SV association type vector
+    initPvAssocTypeVec();
+
+    // initialize track type request pattern
+    m_trackTypesUsed = rttor(m_useTrackTypes);
+
+    // initialize track type counters
+    if ( m_debugTrackTypes > 0 ) {
+      m_mttc = std::make_unique<TrackTypeCounter>(*this, name());    
+    }
+
+    ATH_MSG_DEBUG("BPhysVertexTrackBase::initialize() -- end");
+
+    return initializeHook();
+  }  
+  //--------------------------------------------------------------------------
+  StatusCode BPhysVertexTrackBase::finalize() {
+
+    ATH_MSG_DEBUG("BPhysVertexTrackBase::finalize()");
+
+    // dump track type counters to log
+    if ( m_debugTrackTypes > 0 ) {
+      ATH_MSG_INFO("Track type counters:\n" << m_mttc->countsToString());
+    }
+    
+    // everything all right
+    return finalizeHook();
+  }
+  //--------------------------------------------------------------------------
+  StatusCode BPhysVertexTrackBase::addBranches() const {
+
+    ATH_MSG_DEBUG("BPhysVertexTrackBase::addBranches() -- begin");
+
+    // counter
+    m_nEvtsSeen++;
+
+    // run and event numbers
+    CHECK(evtStore()->retrieve(m_eventInfo));
+    m_runNumber = m_eventInfo->runNumber();
+    m_evtNumber = m_eventInfo->eventNumber();
+
+    // debug tracks in current event?
+    m_debugTracksInThisEvent = (std::find(m_debugTracksInEvents.begin(),
+                                          m_debugTracksInEvents.end(),
+                                          m_evtNumber)
+                                != m_debugTracksInEvents.end());
+    
+    // retrieve primary vertices container
+    m_pvtxContainer = NULL;
+    CHECK(evtStore()->retrieve(m_pvtxContainer, m_pvContainerName));
+    ATH_MSG_DEBUG("Found PV collection with key " << m_pvContainerName);
+
+
+    // retrieve ID track container
+    m_tracks    = NULL;
+    m_tracksAux = NULL;
+    CHECK(evtStore()->retrieve(m_tracks, m_trackParticleContainerName));
+    if (evtStore()->contains<xAOD::
+	TrackParticleAuxContainer>(m_trackParticleContainerName+"Aux.")) {
+      CHECK(evtStore()->retrieve(m_tracksAux,
+				 m_trackParticleContainerName+"Aux."));
+    } else {
+      ATH_MSG_DEBUG("No aux track collection with key "
+		    << m_trackParticleContainerName+"Aux.");
+    }
+    ATH_MSG_DEBUG("Found track collection with key "
+		  << m_trackParticleContainerName);
+    
+    // Loop over all vertex containers
+    for (size_t i=0; i<m_vertexContainerNames.size(); ++i) {
+    // vertex container and its auxilliary store
+      const xAOD::VertexContainer*     svtxContainer    = NULL;
+      const xAOD::VertexAuxContainer*  svtxAuxContainer = NULL;
+      // refitted primary vertex container and its auxilliary store
+      const xAOD::VertexContainer*     refPVContainer    = NULL;
+      const xAOD::VertexAuxContainer*  refPVAuxContainer = NULL;
+
+      // retrieve from StoreGate
+      CHECK(evtStore()->retrieve(svtxContainer, m_vertexContainerNames[i]));
+      CHECK(evtStore()->retrieve(svtxAuxContainer,
+				 m_vertexContainerNames[i]+"Aux."));
+      ATH_MSG_DEBUG("Found SV collection with key "
+		    << m_vertexContainerNames[i]);
+      CHECK(evtStore()->retrieve(refPVContainer   ,
+				 m_refPVContainerNames[i]));
+      CHECK(evtStore()->retrieve(refPVAuxContainer,
+				 m_refPVContainerNames[i]+"Aux."));
+      ATH_MSG_DEBUG("Found refitted PV collection with key "
+		    << m_refPVContainerNames[i]);
+      
+      // vertex container depending setup in derived class
+      CHECK(addBranchesVCSetupHook(i));
+      
+      // loop over secondary vertices
+      for (xAOD::VertexContainer::const_iterator vtxItr =
+	     svtxContainer->begin(); vtxItr!=svtxContainer->end();
+	   ++vtxItr) {
+
+	CHECK(addBranchesSVLoopHook(*vtxItr));
+	
+      } // end of loop over vertices
+    } // end of loop over vertex container names
+    
+    ATH_MSG_DEBUG("BPhysVertexTrackBase::addBranches() -- end");
+
+    // nothing to do here
+    return addBranchesHook();
+  }
+
+  //--------------------------------------------------------------------------
+  // Hook method for initialize() -- to be overwritten by derived class
+  //--------------------------------------------------------------------------
+  StatusCode BPhysVertexTrackBase::initializeHook() {
+
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+  // Hook method for finalize() -- to be overwritten by derived class
+  //--------------------------------------------------------------------------
+  StatusCode BPhysVertexTrackBase::finalizeHook() {
+
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+  // Hook method for addBranches() -- to be overwritten by derived class
+  //--------------------------------------------------------------------------
+  StatusCode BPhysVertexTrackBase::addBranchesHook() const {
+
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+  // Hook method for addBranches() VC setup
+  // -- to be overwritten by derived class
+  //--------------------------------------------------------------------------
+  StatusCode BPhysVertexTrackBase::addBranchesVCSetupHook(size_t ivc) const {
+
+    // just to avoid a compiler warning
+    ATH_MSG_DEBUG("addBranchesVCSetupHook: Vertex container index " << ivc
+		  << " for collection " << m_vertexContainerNames[ivc]
+		  << " with prefix " << m_branchPrefixes[ivc]);
+    
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+  // Hook method for addBranches() SV loop -- to be overwritten by derived class
+  //--------------------------------------------------------------------------
+  StatusCode
+  BPhysVertexTrackBase::addBranchesSVLoopHook(const xAOD::Vertex* vtx) const {
+
+    // just to avoid a compiler warning
+    ATH_MSG_DEBUG("addBranchesSVLoopHook: Vertex " << vtx);
+    
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+  // Calculate values -- used by calculateValues()
+  // -- to be overwritten by derived class
+  //--------------------------------------------------------------------------
+  StatusCode
+  BPhysVertexTrackBase::calcValuesHook(const xAOD::Vertex* vtx,
+				       const unsigned int ipv,
+				       const unsigned int its,
+				       const unsigned int itt) const {
+
+    // just to avoid a compiler warning
+    ATH_MSG_DEBUG("calcIsolationOpti:  vtx: " << vtx << ", ipv: " << ipv
+		  << ", its: " << its << ", itt: " << itt);
+
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  // Fill values from cache if found -- used by calculateValues()
+  // -- to be overwritten by derived class
+  //--------------------------------------------------------------------------  
+  bool BPhysVertexTrackBase::fastFillHook(const xAOD::Vertex* vtx,
+					  const int ipv) const {
+
+    // just to avoid a compiler warning
+    ATH_MSG_DEBUG("fastIsoFill:  vtx: " << vtx << ", ipv: " << ipv);
+    
+    return false;
+  }
+  //--------------------------------------------------------------------------
+  // Calculation loops -- needs to be called from inside the implementation
+  // of addBranchesSVLoopHook() in the derived class.
+  // Derived class also needs to provide override methods for
+  // - fastFillHook   -- needs to return true if cached value is used
+  // - calcValuesHook -- actually calculating value(s)
+  //--------------------------------------------------------------------------  
+  StatusCode
+  BPhysVertexTrackBase::calculateValues(const xAOD::Vertex* vtx) const {
+
+    ATH_MSG_DEBUG("BPhysVertexTrackBase::calculateValues -- begin");
+    
+    unsigned int nPvAssocs   = m_pvAssocTypes.size();
+    unsigned int nTrackSels  = m_trackSelectionTools.size();
+    unsigned int nTrackTypes = m_useTrackTypes.size();
+
+    m_pvAssocResMap.clear();
+
+    const xAOD::BPhysHelper cand(vtx);
+    for (unsigned int ipv = 0; ipv < nPvAssocs; ++ipv) {
+      if ( ipv == 0 || ! fastFillHook(vtx, ipv) ) { 
+	for (unsigned int its = 0; its < nTrackSels; ++its) {
+	  for (unsigned int itt = 0; itt < nTrackTypes; ++itt) {
+	    ATH_MSG_DEBUG("Calling calcValuesHook with ipv: " << ipv
+			  << ", its: " << its << ", itt: " << itt);
+	    CHECK(calcValuesHook(vtx, ipv, its, itt));
+	  } // for itt
+	} // for its
+	// cache result index -- only needed once per ipv value
+	m_pvAssocResMap[buildPvAssocCacheName(vtx, ipv)] = ipv;
+	ATH_MSG_DEBUG("calculateValues: cache index: "
+		      << buildPvAssocCacheName(vtx, ipv)
+		      << " -- cached ipv: " << ipv);
+      } // if !fastFillHook()
+    } // for ipv
+      
+    return StatusCode::SUCCESS;
+  }
+  //------------------------------------------------------------------------- 
+  // Build SV-to-PV association cache index string
+  //------------------------------------------------------------------------- 
+  std::string
+  BPhysVertexTrackBase::buildPvAssocCacheName(const xAOD::Vertex* vtx,
+					      const int ipv) const {
+    xAOD::BPhysHelper cand(vtx);
+    boost::format f("SV_%p_RPV_%p");
+    f % cand.vtx() % cand.pv(m_pvAssocTypes[ipv]);
+    
+    return f.str();
+  }
+  //--------------------------------------------------------------------------  
+  // getTrackCandPVLogChi2()
+  // Calculate the logChi2 (= log((d0/d0e)^2+(z0/z0e)^2) contribution of a
+  // track at the position closest to the PV associated with the SV. 
+  //--------------------------------------------------------------------------
+  double BPhysVertexTrackBase::getTrackCandPVLogChi2(const xAOD::TrackParticle*
+                                                     track,
+                                                     const xAOD::Vertex* vtx,
+                                                     bool doDCAin3D,
+                                                     int chi2DefToUse
+                                                     ) const {
+
+    return getTrackLogChi2DCA(track, vtx, doDCAin3D, chi2DefToUse)[4];
+  }
+  //--------------------------------------------------------------------------  
+  // getTrackLogChi2DCA()
+  // Calculate logChi2 (= log((d0/d0e)^2+(z0/z0e)^2) contribution of a
+  // track at the position closest to a position and
+  // the distance of closest approach of a track w.r.t.
+  // a position.  Either only in the transverse plane or in 3 dimensions.
+  // Option chi2DefToUse:
+  //   0 : from track perigee with uncertainties from track only
+  //   1 : from track perigee with uncertainties from track and vertex
+  //   2 : simple extrapolation from track parameters
+  //       with uncertainties from track and vertex
+  //   3 : CalcLogChi2toPV method from NtupleMaker using xAOD::TrackingHelpers.
+  //      (only track uncertainties)
+  //   4 : CalcLogChi2toPV method from NtupleMaker using xAOD::TrackingHelpers.
+  //      (track and vertex uncertainties)
+  //   5 : use TrackVertexAssociationTool
+  //   6 : full 3D chi2 from track perigee with uncertainties
+  //       from track and vertex (sum of 3x3 covariance matrices)
+  //   7 : full 3D chi2 from track perigee with uncertainties
+  //       from track and vertex (sum of 2x2 covariance matrices)
+  //   8 : simple extrapolation from track parameters with uncertainties
+  //       from track and vertex (sum of 3x3 covariance matrices)
+  //   9   simple extrapolation from track parameters with uncertainties
+  //       from track and vertex (sum of 2x2 covariance matrices)
+  // Returned vector components:
+  // 0: d0, 1: d0Err, 2: z0, 3: z0Err, 4: logChi2, 5: dca, 6: okFlag
+  // 7: vtxErrPart2, 8: trkErrPart2, 9: phi0Used
+  //--------------------------------------------------------------------------
+  std::vector<double>
+  BPhysVertexTrackBase::getTrackLogChi2DCA(const xAOD::TrackParticle* track,
+                                           const xAOD::Vertex* vtx,
+                                           bool doDCAin3D,
+                                           int  chi2DefToUse) const {
+    // presets
+    std::vector<double> res = {-999., -99., -999., -99., -100., -100., -1.,
+                               -99., -99., -999.};
+    
+    const Amg::Vector3D   pos = vtx->position();
+    const AmgSymMatrix(3) poscov = vtx->covariancePosition();
+    
+    if ( track != NULL ) {
+      if ( chi2DefToUse < 2 || (chi2DefToUse > 5 && chi2DefToUse < 8) ) {
+        // use track perigee method
+        std::unique_ptr<const Trk::Perigee>
+          trkPerigee(m_trackToVertexTool->perigeeAtVertex(*track, pos));
+        if ( trkPerigee != NULL  ) {
+          res[0] = trkPerigee->parameters()[Trk::d0];
+          res[2] = trkPerigee->parameters()[Trk::z0];
+          const AmgSymMatrix(5)* locError = trkPerigee->covariance();
+          if ( locError != NULL ) {
+            // uncertainties from track
+            res[1] = Amg::error(*locError, Trk::d0);
+            res[3] = Amg::error(*locError, Trk::z0);
+            if ( chi2DefToUse == 1 ) {
+              // add uncertainties from vertex
+              Amg::Vector3D perppt(trkPerigee->momentum().y()/trkPerigee->pT(),
+                                   -trkPerigee->momentum().x()/trkPerigee->pT(),
+                                   0.);
+              double vtxD0Err2 = perppt.transpose()*poscov*perppt;
+              res[1] = sqrt( pow(res[1], 2.) + vtxD0Err2 );
+              res[3] = sqrt( pow(res[3], 2.) + poscov(2,2) );
+            }
+            if ( chi2DefToUse < 2 ) {
+              if ( fabs(res[1]) > 0. && fabs(res[3]) > 0. ) {
+                res[4] = log( pow(res[0]/res[1], 2.)
+                              + pow(res[2]/res[3], 2.) );
+                res[6] = 2.; // ok
+              } else {
+                ATH_MSG_WARNING("BPhysVertexTrackBase::getTrackLogChi2DCA():"
+                                << " d0 = " << res[0] << ", d0Err = "
+                                << res[1] << ", z0 = " << res[2]
+                                << ", z0Err = " << res[3]);
+              }
+            }
+            // chi2DefToUse 6 or 7
+            if ( chi2DefToUse > 5 && chi2DefToUse < 8 ) {
+              double phi0 = trkPerigee->parameters()[Trk::phi0];
+              double doca = sqrt(pow(res[0],2.) + pow(res[2], 2.));
+              res[9] = phi0;
+              if ( doca > 0. ) {
+                if ( chi2DefToUse == 6 ) {
+                  AmgMatrix(5,3) dmat = AmgMatrix(5,3)::Zero();
+                  dmat(0,0) = -sin(phi0);
+                  dmat(0,1) =  cos(phi0);
+                  dmat(1,2) =  1.;
+                  dmat(2,0) = -res[0]*cos(phi0);
+                  dmat(2,1) = -res[0]*sin(phi0);
+                  AmgSymMatrix(3) mCovTrk3D = dmat.transpose()*(*locError)*dmat;
+                  Amg::Vector3D dvec(-res[0]*sin(phi0), res[0]*cos(phi0),
+                                     res[2]); // (x,y,z)
+                  Amg::Vector3D duvec = dvec.unit();
+                  // log(chi2) = log( docavec^T * V^-1 * docavec )
+                  res[4] = log( dvec.transpose() * (poscov+mCovTrk3D).inverse()
+                                * dvec );
+                  res[7] = duvec.transpose()*poscov*duvec;
+                  res[8] = duvec.transpose()*mCovTrk3D*duvec;
+                  res[6] = 3.; // ok
+                }
+                if ( chi2DefToUse == 7 ) {
+                  AmgMatrix(3,2) dmat = AmgMatrix(3,2)::Zero();
+                  dmat(0,0) = -sin(phi0);
+                  dmat(1,0) =  cos(phi0);
+                  dmat(2,0) =  0.;
+                  dmat(0,1) =  0.;
+                  dmat(1,1) =  0.;
+                  dmat(2,1) =  1.;
+                  AmgSymMatrix(2) mCovVtx2D = dmat.transpose()*poscov*dmat;
+                  AmgSymMatrix(2) mCovTrk2D = AmgSymMatrix(2)::Zero();
+                  mCovTrk2D(0,0) = (*locError)(Trk::d0,Trk::d0);
+                  mCovTrk2D(0,1) = (*locError)(Trk::d0,Trk::z0);
+                  mCovTrk2D(1,0) = (*locError)(Trk::d0,Trk::z0);
+                  mCovTrk2D(1,1) = (*locError)(Trk::z0,Trk::z0);
+                  Amg::Vector2D dvec(res[0], res[2]); // (d0, z0)
+                  Amg::Vector2D duvec = dvec.unit();
+                  // log(chi2) = log( (d0, z0) * V^-1 * (d0, z0)^T )
+                  res[4] = log( dvec.transpose()*(mCovVtx2D+mCovTrk2D).inverse()
+                                * dvec );
+                  res[7] = duvec.transpose()*mCovVtx2D*duvec;
+                  res[8] = duvec.transpose()*mCovTrk2D*duvec;
+                  res[6] = 4.; // ok
+                }
+              } else {
+                ATH_MSG_WARNING("BPhysVertexTrackBase::getTrackLogChi2DCA():"
+                                << " doca == 0 !");
+              }
+            } // if chi2DefToUse > 5 && chi2DefToUse < 8
+            res[5] = doDCAin3D ?
+              sqrt( pow(res[0], 2.) + pow(res[2], 2.) ) : res[0];
+            res[6] += 1.; // ok
+          } else {
+            ATH_MSG_WARNING("BPhysVertexTrackBase::getTrackLogChi2DCA():"
+                            " locError pointer is NULL!");
+          }
+        } else {
+          ATH_MSG_WARNING("BPhysVertexTrackBase::getTrackLogChi2DCA():"
+                          " trkPerigee pointer is NULL!");
+        } // if trkPerigee
+
+      } else if ( chi2DefToUse == 2
+                  || (chi2DefToUse > 7 && chi2DefToUse < 10 )) {
+        // simple extrapolation method
+        // (directly taken from NtupleMaker for comparisons)
+
+        // SV position and covariance matrix
+        TVector3 SV_def(vtx->x(), vtx->y(), vtx->z());
+        const AmgSymMatrix(3)& SV_cov = poscov;
+        
+        // chi2 track to SV
+        double px      = ( track->p4() ).Px();
+        double py      = ( track->p4() ).Py();
+        double pt      = ( track->p4() ).Pt();
+        double d0      = track->d0();
+        double d0Err2  = track->definingParametersCovMatrixVec()[0];
+        double z0      = track->z0();
+        double z0Err2  = track->definingParametersCovMatrixVec()[2];
+        double theta   = track->theta();
+        double d0z0Cov = track->definingParametersCovMatrixVec()[1];
+        double phi     = track->phi();
+
+        TVector3 trk_origin(  track->vx(),  track->vy(),  track->vz() );
+        TVector3 SV = SV_def - trk_origin;
+        
+        // calc. error in direction perpendicular to pT (still x-y plane)
+        double upx        = py/pt;
+        double upy        = -px/pt;
+        double d0toSV     = d0 + (SV[0]*upx + SV[1]*upy);
+        double d0toSVErr2 = upx*SV_cov(0, 0)*upx + 2*upx*SV_cov(1, 0)*upy
+          + upy*SV_cov(1, 1)*upy + d0Err2;
+
+        upx = px/pt;
+        upy = py/pt;
+        double cot_theta  = cos(theta)/sin(theta);
+        double z0corr     = (SV[0]*upx + SV[1]*upy)*cot_theta;
+        double z0toSV     = z0 + z0corr - SV[2];
+        double z0toSVErr2 = SV_cov(2, 2) + z0Err2;
+
+        double docaSV     = sqrt( pow(d0toSV, 2) + pow(z0toSV, 2) );
+     
+        double chi2testSV(999.);
+        if ( chi2DefToUse == 2 ) {
+          if (d0toSVErr2 !=0 && z0toSVErr2 != 0)
+            chi2testSV = log(pow( d0toSV, 2)/d0toSVErr2
+                             + pow( z0toSV, 2)/z0toSVErr2);
+          // set results
+          res = {d0toSV, sqrt(d0toSVErr2), z0toSV, sqrt(z0toSVErr2),
+                 chi2testSV, (doDCAin3D ? docaSV : d0toSV), 4,
+                 -99., -99., -999.};
+        }
+        if ( chi2DefToUse > 7 && chi2DefToUse < 10 ) {
+          if ( docaSV > 0. ) {
+            if ( chi2DefToUse == 8 ) {
+              AmgMatrix(5,3) dmat = AmgMatrix(5,3)::Zero();
+              dmat(0,0) = -sin(phi);
+              dmat(0,1) =  cos(phi);
+              dmat(1,2) =  1.;
+              dmat(2,0) = -d0toSV*cos(phi);
+              dmat(2,1) = -d0toSV*sin(phi);
+              const AmgSymMatrix(5) mCovTrk5D =
+                track->definingParametersCovMatrix();
+              AmgSymMatrix(3) mCovTrk3D = dmat.transpose()*mCovTrk5D*dmat;
+              Amg::Vector3D dvec(-d0toSV*sin(phi), d0toSV*cos(phi),
+                                 z0toSV); // (x,y,z)
+              Amg::Vector3D duvec = dvec.unit();
+              // log(chi2) = log( docavec^T * V^-1 * docavec )
+              double chi2testSV = log( dvec.transpose()
+                                       * (poscov+mCovTrk3D).inverse()
+                                       * dvec );
+              double vtx3DErr2 = duvec.transpose()*poscov*duvec;
+              double trk3DErr2 = duvec.transpose()*mCovTrk3D*duvec;
+              // set results
+              res = {d0toSV, sqrt(d0Err2), z0toSV, sqrt(z0Err2),
+                     chi2testSV, (doDCAin3D ? docaSV : d0toSV), 5,
+                     vtx3DErr2, trk3DErr2, phi};
+            }
+            if ( chi2DefToUse == 9 ) {
+              AmgMatrix(3,2) dmat = AmgMatrix(3,2)::Zero();
+              dmat(0,0) = -sin(phi);
+              dmat(1,0) =  cos(phi);
+              dmat(2,0) =  0.;
+              dmat(0,1) =  0.;
+              dmat(1,1) =  0.;
+              dmat(2,1) =  1.;
+              AmgSymMatrix(2) mCovVtx2D = dmat.transpose()*SV_cov*dmat;
+              AmgSymMatrix(2) mCovTrk2D = AmgSymMatrix(2)::Zero();
+              mCovTrk2D(0,0) = d0Err2;
+              mCovTrk2D(0,1) = d0z0Cov;
+              mCovTrk2D(1,0) = d0z0Cov;
+              mCovTrk2D(1,1) = z0Err2;
+              Amg::Vector2D dvec(d0toSV, z0toSV);
+              Amg::Vector2D duvec = dvec.unit();
+              // log(chi2) = log( (d0, z0) * V^-1 * (d0, z0)^T )
+              chi2testSV = log( dvec.transpose()*(mCovVtx2D+mCovTrk2D).inverse()
+                                * dvec );
+              double vtx2DErr2 = duvec.transpose()*mCovVtx2D*duvec;
+              double trk2DErr2 = duvec.transpose()*mCovTrk2D*duvec;
+
+              if ( vtx2DErr2 < 0. || trk2DErr2 < 0. ) {
+                ATH_MSG_WARNING("BPhysVertexTrackBase::"
+                                "getTrackLogChi2DCA(): "
+                                << "vtx2DErr2 = " << vtx2DErr2
+                                << " trk2DErr2 = " << trk2DErr2
+                                << " chi2testSV = " << chi2testSV);
+                ATH_MSG_WARNING("dvec = " << dvec);
+                ATH_MSG_WARNING("mCovVtx2D = " << mCovVtx2D);
+                ATH_MSG_WARNING("mCovTrk2D = " << mCovTrk2D);
+                ATH_MSG_WARNING("dmat = " << dmat);
+                ATH_MSG_WARNING("SV_cov = " << SV_cov);
+                ATH_MSG_WARNING("det(mCovVtx2D) = " << mCovVtx2D.determinant());
+                ATH_MSG_WARNING("det(mCovTrk2D) = " << mCovTrk2D.determinant());
+                ATH_MSG_WARNING("det(SV_cov) = " << SV_cov.determinant());
+                ATH_MSG_WARNING("d0toSV = " << d0toSV
+                                << " z0toSV = " << z0toSV
+                                << " phi = " << phi
+                                << " docaSV = " << docaSV);
+              }
+                 
+              // set results
+              res = {d0toSV, sqrt(d0Err2), z0toSV, sqrt(z0Err2),
+                     chi2testSV, (doDCAin3D ? docaSV : d0toSV), 6,
+                     vtx2DErr2, trk2DErr2, phi};
+            }
+          } else {
+            ATH_MSG_WARNING("BPhysVertexTrackBase::getTrackLogChi2DCA():"
+                            << " docaSV == 0 !");
+          }
+        } // if chi2DefToUse > 7 && chi2DefToUse < 10
+
+      } else if ( chi2DefToUse > 2 && chi2DefToUse < 5 ) {
+        // CalcLogChi2toPV method using xAOD::TrackingHelpers
+        // (simply taken from NtupleMaker for comparisons)
+        // N.B. z0significance method of the helper doesn't include pv_z0
+        // uncertainty
+        double d0sign(0.);
+        if (chi2DefToUse == 4) {
+          d0sign =
+            xAOD::TrackingHelpers::d0significance(track,
+                                                  m_eventInfo->beamPosSigmaX(),
+                                                  m_eventInfo->beamPosSigmaY(),
+                                                  m_eventInfo->beamPosSigmaXY()
+                                                  );
+        } else {
+          d0sign = xAOD::TrackingHelpers::d0significance( track );
+        }
+        // trk z0 is expressed relative to the beamspot position along z-axis
+        // (trk->vz())
+        // DCA always in 3D
+        double z0toPV = track->z0() + track->vz() - vtx->z();
+        double z0Err2 = track->definingParametersCovMatrixVec()[2];
+        if (chi2DefToUse == 4) z0Err2+= vtx->covariancePosition()(2,2);
+        double z0sign = z0toPV / sqrt( z0Err2 );
+        double chi2 = log( pow(d0sign, 2.) + pow(z0sign, 2.) );
+        // set results
+        res = {-999., -99., z0toPV, sqrt(z0Err2), chi2, -100., 4, -99., -99.,
+               -999.};
+        
+      } // if chi2DefToUse
+    } else {
+      ATH_MSG_WARNING("BPhysVertexTrackBase::getTrackLogChi2DCA():"
+                      " track pointer is NULL!");
+      res[6] = -2.;
+    } // if track != NULL
+    return res;
+  }
+  //--------------------------------------------------------------------------
+  // detTrackTypes(): returns a bit pattern of the applicable
+  // track types from {ASSOCPV, PVTYPE0, PVTYPE1, PVTYPE2, PVTYPE3, NONE,
+  // NULLVP, CAPVXXXXXXX, ...} (or'd).
+  //--------------------------------------------------------------------------
+  uint64_t BPhysVertexTrackBase::detTrackTypes(const xAOD::TrackParticle* track,
+                                               const xAOD::Vertex* candPV,
+                                               const xAOD::Vertex* candRefPV) const {
+    int bits = 0x0;
+
+    // PVTYPE0 - PVTYPE3, NONE
+    ATH_MSG_ERROR("BPhysVertexTrackBase::detTrackTypes must be adjusted due to changes in TrackParticle");
+
+    // ASOCPV
+    if ( candPV != NULL ) {
+      bool found(false);
+      for (size_t i=0; i<candPV->nTrackParticles(); ++i) {
+        if ( track == candPV->trackParticle(i) ) {
+          found = true;
+          break;
+        }
+      }
+      if ( found ) bits |= track_type_bit[ASSOCPV];
+      //
+      // CLOSEAPV
+      for (unsigned int i=7; i<n_track_types; ++i) {
+        if ( (track_type_bit[i] & m_trackTypesUsed) > 0x0 ) {
+          bool useRefittedPvs = ( i%2 == 1 );
+          bool doDCAin3D      = ( (i-7)%4 > 1 );
+          int  chi2DefToUse   = (i-7)/4;
+          // adjustment above bit 20
+          if ( i > 20 ) {
+            doDCAin3D    = true;
+            chi2DefToUse = (i-13)/2;
+          }
+          const xAOD::Vertex* minChi2PV(nullptr);
+          if ( chi2DefToUse == 5 ) {
+            minChi2PV =
+              findAssocPV(track, candPV, candRefPV, m_pvTypesToConsider,
+                          m_minNTracksInPV, useRefittedPvs);
+          } else {
+            minChi2PV =
+              findMinChi2PV(track, candPV, candRefPV, m_pvTypesToConsider,
+                            m_minNTracksInPV, useRefittedPvs,
+                            doDCAin3D, chi2DefToUse).first;
+          } // if chi2DefToUse
+          if ( candPV == minChi2PV
+               || (candRefPV != nullptr && candRefPV == minChi2PV) ) {
+            bits |= track_type_bit[i];
+          }
+        } // if m_trackTypesUsed
+      } // for i
+
+    } // if candPV != NULL
+
+    return bits;
+  }
+  //--------------------------------------------------------------------------
+  // findAllTracksInDecay: returns a vector of xAOD::TrackParticle objects
+  // found in this vertex and subsequent decay vertices (if chosen).
+  //--------------------------------------------------------------------------
+  TrackBag BPhysVertexTrackBase::findAllTracksInDecay(xAOD::BPhysHelper& vtx)
+    const {
+
+    TrackBag tracks;
+    findAllTracksInDecay(vtx, tracks);
+
+    return tracks;
+  }
+  //--------------------------------------------------------------------------
+  // findAllTracksInDecay: fills a vector of xAOD::TrackParticle objects
+  // found in this vertex and subsequent decay vertices (if chosen).
+  // Method avoids duplicate entries in vector.
+  // Recursively calls itself if necessary.
+  //--------------------------------------------------------------------------
+  void BPhysVertexTrackBase::findAllTracksInDecay(xAOD::BPhysHelper& vtx,
+						  TrackBag& tracks)
+    const {
+
+    for (unsigned int i=0; i < vtx.vtx()->nTrackParticles(); ++i) {
+      const xAOD::TrackParticle* track = vtx.vtx()->trackParticle(i);
+      if ( std::find(tracks.begin(),tracks.end(),track) == tracks.end() ) {
+	tracks.push_back(track);
+      } // if
+    } // for
+    // loop over preceeding vertices
+    if ( m_incPrecVerticesInDecay ) {
+      for (int ivtx = 0; ivtx < vtx.nPrecedingVertices(); ++ivtx) {
+	xAOD::BPhysHelper precVtx(vtx.precedingVertex(ivtx));
+	findAllTracksInDecay(precVtx, tracks);
+      } // if
+    } // for 
+  }
+  //--------------------------------------------------------------------------
+  // findAllMuonsInDecay: returns a vector of xAOD::Muon objects
+  // found in this vertex and subsequent decay vertices (if chosen).
+  //--------------------------------------------------------------------------
+  MuonBag BPhysVertexTrackBase::findAllMuonsInDecay(xAOD::BPhysHelper& vtx)
+    const {
+
+    MuonBag muons;
+    findAllMuonsInDecay(vtx, muons);
+      
+    return muons;
+  }
+  //--------------------------------------------------------------------------
+  // findAllMuonsInDecay: fills vector of xAOD::Muon objects
+  // found in this vertex and subsequent decay vertices (if chosen).
+  // Method avoids duplicate entries in vector.
+  // Recursively calls itself if necessary.
+  //--------------------------------------------------------------------------
+  void BPhysVertexTrackBase::findAllMuonsInDecay(xAOD::BPhysHelper& vtx,
+						 MuonBag& muons)
+    const {
+
+    for (int i=0; i < vtx.nMuons(); ++i) {
+      if ( std::find(muons.begin(),muons.end(),vtx.muon(i)) == muons.end() ) {
+	muons.push_back(vtx.muon(i));
+      } // if
+    } // for
+    // loop over preceeding vertices
+    if ( m_incPrecVerticesInDecay ) {
+      for (int ivtx = 0; ivtx < vtx.nPrecedingVertices(); ++ivtx) {
+	xAOD::BPhysHelper precVtx(vtx.precedingVertex(ivtx));
+	findAllMuonsInDecay(precVtx, muons);
+      } // for
+    } // if
+  }
+  //--------------------------------------------------------------------------
+  // findAllMuonsIdTracksInDecay: returns a vector of xAOD::TrackParticle
+  // objects found in this vertex and subsequent decay vertices.
+  // Returns the tracks.
+  // The vector of track pointers reeturned may contain NULL elements.
+  //--------------------------------------------------------------------------
+  TrackBag
+  BPhysVertexTrackBase::findAllMuonIdTracksInDecay(xAOD::BPhysHelper& vtx,
+						   MuonBag& muons) const {
+
+    TrackBag tracks;
+    muons = findAllMuonsInDecay(vtx);
+
+    for (MuonBag::const_iterator muItr = muons.begin(); muItr != muons.end();
+	 ++muItr) {
+      const xAOD::TrackParticle* track =
+	(*muItr)->trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
+      tracks.push_back(track);
+    } // for 
+    
+    return tracks;
+  }
+  //--------------------------------------------------------------------------
+  // findMuonRefTrackMomenta: returns a vector<TVector3> containing the
+  // three momenta of refitted tracks identified as muons.
+  // The vector may contain (0,0,0) elements indicating an error.
+  //--------------------------------------------------------------------------
+  std::vector<TVector3>
+  BPhysVertexTrackBase::findMuonRefTrackMomenta(xAOD::BPhysHelper& vtx,
+						MuonBag& muons) const {
+
+    std::vector<TVector3> refMuTracks;
+
+    // quick solution if nRefTrks == nMuons:
+    if ( vtx.nRefTrks() == vtx.nMuons() && !m_incPrecVerticesInDecay ) {
+      muons = vtx.muons();
+      for ( auto refMuTrack : vtx.refTrks() ) {
+	refMuTracks.push_back(refMuTrack);
+      }
+    } else {
+      TrackBag muonIdTracks = findAllMuonIdTracksInDecay(vtx, muons);
+      if ( vtx.nRefTrks() == (int)vtx.vtx()->nTrackParticles() ) {
+	for (int i=0; i<vtx.nRefTrks(); ++i) {
+	  const xAOD::TrackParticle* otp =
+	    (const xAOD::TrackParticle*)vtx.refTrkOrigin(i);
+	  if ( otp != NULL ) {
+	    if ( std::find(muonIdTracks.begin(), muonIdTracks.end(), otp)
+		 != muonIdTracks.end() ) {
+	      refMuTracks.push_back(vtx.refTrk(i));
+	    }
+	  } else {
+	    ATH_MSG_WARNING("BPhysVertexTrackBase::findMuonRefTrackMomenta():"
+			    " refTrkOrigin == NULL for refTrk # "
+			    << i << " !");
+	  }
+	} // for
+      } else {
+	ATH_MSG_WARNING("BPhysVertexTrackBase::findMuonRefTrackMomenta():"
+			" size mismatch #refTrks = " << vtx.nRefTrks()
+			<< "#trackParticles = " << vtx.vtx()->nTrackParticles()
+			<< " !");
+      } // if nRefTracks == nTrackParticles
+      // loop over preceeding vertices -- only if not all refMuTrks found yet
+      if ( m_incPrecVerticesInDecay && muons.size() > refMuTracks.size() ) {
+	for (int ivtx = 0; ivtx < vtx.nPrecedingVertices(); ++ivtx) {
+	  xAOD::BPhysHelper precVtx(vtx.precedingVertex(ivtx));
+	  std::vector<TVector3> precRefMuTracks =
+	    findMuonRefTrackMomenta(precVtx, muons);
+	  // append only if not yet contained in
+	  for ( auto precRefMuTrack : precRefMuTracks ) {
+	    if ( std::find(refMuTracks.begin(), refMuTracks.end(),
+			   precRefMuTrack) == refMuTracks.end() ) {
+	      refMuTracks.push_back(precRefMuTrack);
+	    } // if
+	  } // for 
+	} // for ivtx
+      } // if
+    } // if (shortcut)
+
+    // debug output
+    if ( msgLvl( MSG::DEBUG ) ) { 
+	ATH_MSG_DEBUG("BPhysVertexTrackBase::findMuonRefTrackMomenta():"
+		      << " #muons: " << muons.size()
+		      << "  #refMuTrks: " << refMuTracks.size());
+	TString str = Form(">> refMuTracks(%d):\n", (int)refMuTracks.size());
+	for (unsigned int i=0; i < refMuTracks.size(); ++i) {
+	  str += Form("(%10.4f,%10.4f,%10.4f) ",
+		      refMuTracks[i].x(), refMuTracks[i].y(),
+		      refMuTracks[i].z());
+	}
+	ATH_MSG_DEBUG(str.Data());
+      }
+    
+    return refMuTracks;
+  }
+  
+  //--------------------------------------------------------------------------
+  // selectTracks: returns a vector of xAOD::TrackParticle objects
+  // seleted from the input track collection according to the selection
+  // criteria and with respect to the B candidate vertex.
+  //--------------------------------------------------------------------------
+  TrackBag BPhysVertexTrackBase::selectTracks(const
+					      xAOD::TrackParticleContainer*
+					      inpTracks,
+					      xAOD::BPhysHelper& cand,
+					      const unsigned int ipv,
+					      const unsigned int its,
+					      const unsigned int itt) const {
+
+    return selectTracks(inpTracks, findAllTracksInDecay(cand), cand,
+			ipv, its, itt);
+  }
+  //--------------------------------------------------------------------------
+  // selectTracks: returns a vector of xAOD::TrackParticle objects
+  // seleted from the input track collection according to the selection
+  // criteria and with respect to the B candidate vertex.
+  //--------------------------------------------------------------------------
+  TrackBag BPhysVertexTrackBase::selectTracks(const
+					      xAOD::TrackParticleContainer*
+					      inpTracks,
+					      const TrackBag& exclTracks,
+					      xAOD::BPhysHelper& cand,
+					      const unsigned int ipv,
+					      const unsigned int its,
+					      const unsigned int itt) const {
+
+    const xAOD::Vertex* candRefPV  = cand.pv(m_pvAssocTypes[ipv]);
+    const xAOD::Vertex* candPV     = cand.origPv(m_pvAssocTypes[ipv]);
+
+    ATH_MSG_DEBUG("selectTracks: Found " << exclTracks.size()
+		  << " " << exclTracks
+		  << " for decay candidate " << cand.vtx()
+		  << "; candPV: " << candPV << " candRefPV: " << candRefPV);
+
+    std::string bname(buildBranchBaseName(its, ipv, itt));
+    
+    // tracks to be considered
+    TrackBag tracks;
+    for (xAOD::TrackParticleContainer::const_iterator trkItr =
+	   inpTracks->begin(); trkItr != inpTracks->end(); ++trkItr) {
+      const xAOD::TrackParticle* track = *trkItr;
+      uint64_t trackTypesForTrack(0x0);
+      // debug track types (before any cuts)
+      if ( m_debugTrackTypes > 0 ) {
+        trackTypesForTrack = detTrackTypes(track, candPV, candRefPV);
+        m_mttc->addToCounter(trackTypesForTrack, itt, bname, "all");
+      }
+      // track selection check
+      if ( ! m_trackSelectionTools[its]->accept(*track, candRefPV) ) continue;
+      // debug track types (after track selection cuts)
+      if ( m_debugTrackTypes > 0 ) {
+        m_mttc->addToCounter(trackTypesForTrack, itt, bname, "ats");
+      }
+
+      // calcluation of track type bits not necessary if all bits requested
+      if ( ! ((unsigned int)m_useTrackTypes[itt] == ttall() ||
+              (unsigned int)m_useTrackTypes[itt] == ttallMin()) ) {
+        // track type check -- determination if not in debugging mode
+        // delayed for execution speed reasons
+        if ( trackTypesForTrack == 0x0 ) {
+          trackTypesForTrack = detTrackTypes(track, candPV, candRefPV);
+        }
+        if ( (trackTypesForTrack &  m_useTrackTypes[itt]) == 0x0 ) {
+          continue;
+        }
+      }
+      // debug track types (after track type cuts)
+      if ( m_debugTrackTypes > 0 ) {
+        m_mttc->addToCounter(trackTypesForTrack, itt, bname, "att");
+      }
+      // track not in list of tracks to exclude
+      if ( std::find(exclTracks.begin(), exclTracks.end(), track)
+           != exclTracks.end() ) continue;
+      // debug track types (after all cuts)
+      if ( m_debugTrackTypes > 0 ) {
+        m_mttc->addToCounter(trackTypesForTrack, itt, bname, "fin");
+      }
+      // tracks that survived so far
+      tracks.push_back(track);
+    } // for
+
+    return tracks;
+  }
+  //--------------------------------------------------------------------------
+  // buildBranchBaseName: build branch name from track selection, primary
+  // vertex association and track type qualifiers.
+  //--------------------------------------------------------------------------
+  std::string BPhysVertexTrackBase::buildBranchBaseName(unsigned int its,
+                                                        unsigned int ipv,
+                                                        unsigned int itt,
+                                                        std::string preSuffix)
+    const {
+    
+    ATH_MSG_DEBUG("BPhysVertexTrackBase::buildBranchBaseName -- begin");
+    
+    std::string tsName   = m_trackSelectionTools[its].name();
+    std::string pvAssoc  = xAOD::BPhysHelper::pv_type_str[m_pvAssocTypes[ipv]];
+
+    // need to get part of tsname after last underscore
+    std::size_t ipos = tsName.find_last_of("_");
+    if ( ipos != std::string::npos ) tsName = tsName.substr(ipos+1);
+
+    // format it nicely
+    boost::format f("T%010d_%s_%s%s%s");
+    f % m_useTrackTypes[itt] % tsName % pvAssoc;
+    f % (preSuffix.length() > 0 ? "_"+preSuffix : "");
+    f % (m_branchSuffix.length() > 0 ? "_"+m_branchSuffix : "");
+    
+    ATH_MSG_DEBUG("BPhysVertexBaseTrackBase::buildBranchBaseName: " << f.str());
+
+    return f.str();
+  }
+  //--------------------------------------------------------------------------
+  //
+  // Initialize PV-to-SV association type vector
+  //
+  //--------------------------------------------------------------------------
+  void BPhysVertexTrackBase::initPvAssocTypeVec() {
+
+    m_pvAssocTypes.clear();
+    for (unsigned int i=0; i<xAOD::BPhysHelper::n_pv_types; ++i) {
+      if ( (m_doVertexType & (1 << i)) > 0 )
+	m_pvAssocTypes.push_back((xAOD::BPhysHelper::pv_type)i);
+    }
+  }
+  //--------------------------------------------------------------------------
+  //
+  // Find primary vertex to which a track is closest to in terms of minimum
+  // chi2 to any primary vertex.  Replace primary vertex by refitted primary
+  // vertex (for B candidate associated primary vertices)
+  // if appropriate (and available).
+  // Only consider primary vertices of specified primary vertex types and
+  // with a minimum number of tracks.
+  //
+  //--------------------------------------------------------------------------
+  std::pair<const xAOD::Vertex*, double>
+  BPhysVertexTrackBase::findMinChi2PV(const xAOD::TrackParticle* track,
+                                      const xAOD::Vertex* candPV,
+                                      const xAOD::Vertex* candRefPV,
+                                      const std::vector<uint64_t>& pvtypes,
+                                      const int minNTracksInPV,
+                                      const bool useRefittedPvs,
+                                      const bool doDCAin3D,
+                                      const int chi2DefToUse) const {
+
+    double minChi2 = std::numeric_limits<double>::max();
+    const xAOD::Vertex* minChi2PV(nullptr);
+    
+    for (auto pvtx: *m_pvtxContainer) {
+      if ( pvtx != nullptr ) {
+        if ( std::find(pvtypes.begin(),pvtypes.end(),pvtx->vertexType())
+             != pvtypes.end() ) {
+          const xAOD::Vertex* cvtx = pvtx;
+          // replace by refitted PV if associated PV matches orignal PV
+          if ( useRefittedPvs && pvtx == candPV ) {
+            if ( candRefPV != nullptr ) {
+              cvtx = candRefPV;
+            } else {
+              ATH_MSG_WARNING(" BPhysVertexTrackBase::findMinChi2PV:"
+                              << " candRefPV == NULL!");
+              continue;
+            }
+          } // if pvtx == candPV
+          if ( (int)cvtx->nTrackParticles() >= minNTracksInPV ) {
+            double chi2 = getTrackLogChi2DCA(track, cvtx, doDCAin3D,
+                                             chi2DefToUse)[4];
+            if ( chi2 < minChi2 ) {
+              minChi2   = chi2;
+              minChi2PV = cvtx;
+            } // if chi2 < minChi2
+          } // if minNTracksInPV
+        } // if pvTypes in pvtypes vector
+      } // if pvtx != nullptr
+    } // for pvtx
+
+    return std::make_pair(minChi2PV, minChi2);
+  }  
+  //--------------------------------------------------------------------------
+  //
+  // Find primary vertex to which a track is closest using the
+  // TrackVertexAssociationTool.  Replace primary vertex by refitted primary
+  // vertex (for B candidate associated primary vertices)
+  // if appropriate (and available).
+  // Only consider primary vertices of specified primary vertex types and
+  // with a minimum number of tracks.
+  //
+  //--------------------------------------------------------------------------
+  const xAOD::Vertex*
+  BPhysVertexTrackBase::findAssocPV(const xAOD::TrackParticle* track,
+                                    const xAOD::Vertex* candPV,
+                                    const xAOD::Vertex* candRefPV,
+                                    const std::vector<uint64_t>& pvtypes,
+                                    const int minNTracksInPV,
+                                    const bool useRefittedPvs) const {
+
+    // select PVs to be considered/replace candPV by candRefPV if requested
+    std::vector<const xAOD::Vertex*> vpvtx;
+    for (auto pvtx: *m_pvtxContainer) {
+      if ( pvtx != nullptr ) {
+        if ( std::find(pvtypes.begin(),pvtypes.end(),pvtx->vertexType())
+             != pvtypes.end() ) {
+          const xAOD::Vertex* cvtx = pvtx;
+          // replace by refitted PV if associated PV matches orignal PV
+          if ( useRefittedPvs && pvtx == candPV ) {
+            if ( candRefPV != nullptr ) {
+              cvtx = candRefPV;
+            } else {
+              ATH_MSG_WARNING("BPhysVertexTrackBase::findAssocPV:"
+                              << " candRefPV == NULL!");
+              continue;
+            }
+          } // if pvtx == candPV
+          if ( (int)cvtx->nTrackParticles() >= minNTracksInPV ) {
+            vpvtx.push_back(cvtx);
+          } // if minNTracksInPV
+        } // if pvTypes in pvtypes vector
+      } // if pvtx != nullptr
+    } // for pvtx
+
+    const xAOD::Vertex* assocPV(NULL);
+    if ( useRefittedPvs && m_tvaToolHasWpLoose ) {
+      // check whether track is in refitted PV - if so accept
+      // Need to do this here as the TrackVertexAssociationTool
+      // with WP 'Loose' only checks the track->vertex() pointer
+      // which always points to the original PV.
+      for (const auto &tp : candRefPV->trackParticleLinks()) {
+        if ( *tp == track ) {
+          // track is part of refitted PV -- accept it
+          assocPV = candRefPV;
+          break;
+        }
+      } // for tp
+      // if not matching use the TrackVertexAssociationTool (other PVs etc)
+      if ( assocPV == nullptr ) {
+        assocPV = m_tvaTool->getUniqueMatchVertex(*track, vpvtx);
+      }
+    } else {
+      assocPV = m_tvaTool->getUniqueMatchVertex(*track, vpvtx);
+    } // if useRefittedPvs && m_tvaToolHasWpLoose
+    if ( assocPV == nullptr ) {
+      ATH_MSG_WARNING("BPhysVertexTrackBase::findAssocPV:"
+                      << " assocPV == NULL for track!"
+                      << " len(vpvtx) = " << vpvtx.size()
+                      << " useRefittedPvs = " << useRefittedPvs
+                      << " minNTracksInPV = " << minNTracksInPV);
+    }
+    
+    return assocPV;
+  }  
+  //--------------------------------------------------------------------------  
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BTrackVertexMapLogger.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BTrackVertexMapLogger.cxx
new file mode 100644
index 000000000000..aa3a40ab2a59
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BTrackVertexMapLogger.cxx
@@ -0,0 +1,104 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//============================================================================
+// BTrackVertexMapLogger.cxx
+//============================================================================
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Changes:
+// - w.w., 2017-01-22: Added use of BPhysMetaDataTool.
+//
+// Store JO metadata in the output file.
+//
+// It uses the BPhysMetaDataTool (default) or the IOVDbMetaDataTool to
+// store job option information as metadata in a specific branch whose
+// name needs to prefixed by the deriviation format name.
+// Note: Metadata stored by the IOVDbMetaDataTool is not readable on
+// 'RootCore' level.
+//
+// This is a base class.  Inherit from it to add the job options you want
+// to store.  For a usage example, see
+//   Bmumu_metadata.h / Bmumu_metadata.cxx
+// and
+//   BPHY8.py .
+//
+// Job options provided by the base class:
+// - DerivationName       -- assign the name of the derivation format
+// - MetadataFolderName   -- assign the name of the metadata folder,
+//                           should start with the derivation format name,
+//                           defaults to DerivationName if not set.
+// - UseIOVDbMetaDataTool -- use the IOVDbMetaDataTool to store
+//                           the additional metadata
+// - UseBPhysMetaDataTool -- use the BPhysMetaDataTool to store
+//                           the additional metadata
+//                           
+//============================================================================
+//
+
+#include "DerivationFrameworkBPhys/BTrackVertexMapLogger.h"
+#include "AthenaPoolUtilities/CondAttrListCollection.h"
+
+namespace DerivationFramework {
+
+  //--------------------------------------------------------------------------
+  BTrackVertexMapLogger::BTrackVertexMapLogger(const std::string& t,
+				       const std::string& n,
+				       const IInterface*  p)
+    : AthAlgTool(t,n,p) {
+    
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+    
+    // Declare BPhysTrackVertexMapTool handles
+    declareProperty("TrackVertexMapTools", m_ttvmTools);
+
+    // Enable log output?
+    declareProperty("Enable", m_enable = true);
+  }
+  //--------------------------------------------------------------------------
+  StatusCode BTrackVertexMapLogger::initialize() {
+  
+    ATH_MSG_DEBUG("BTrackVertexMapLogger::initialize() -- begin");
+
+    // get the BPhysTrackVertexMapTools
+    if ( m_enable ) {
+      for (auto ttvmTool : m_ttvmTools) {
+	ATH_CHECK( ttvmTool.retrieve() );
+	ATH_MSG_INFO("initialize: Successfully retrieved "
+		     << ttvmTool.name() << " ....");
+      }
+    } // if m_enable
+
+    ATH_MSG_DEBUG("BTrackVertexMapLogger::initialize() -- end");
+
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+  StatusCode BTrackVertexMapLogger::finalize() {
+
+    ATH_MSG_DEBUG("BTrackVertexMapLogger::finalize()");
+
+    // everything all right
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  StatusCode BTrackVertexMapLogger::addBranches() const {
+
+    ATH_MSG_DEBUG("BTrackVertexMapLogger::addBranches()");
+
+    // call the BPhysTrackVertexMapTools
+    if ( m_enable ) {
+      for (auto ttvmTool : m_ttvmTools) {
+	if ( ttvmTool->doLog() ) {
+	  ATH_MSG_INFO("addBranches: dump for " << ttvmTool.name() << ":");
+	  ATH_CHECK( ttvmTool->logEvent() );
+	} // if doLog()
+      } // for
+    } // if m_enable
+
+    // still everything is ok
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BVertexClosestTrackTool.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BVertexClosestTrackTool.cxx
new file mode 100644
index 000000000000..e6771bb459f9
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BVertexClosestTrackTool.cxx
@@ -0,0 +1,672 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+//============================================================================
+// BVertexClosestTrackTool.cxx
+//============================================================================
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Changes:
+//
+// Add B vertex closest track information for different configurations,
+// different track selections and different PV-to-SV association methods.
+//
+// For an usage example see BPHY8.py .
+//
+// Job options provided by this class:
+// - CloseTrackChi2SetName      -- list with labels for the following
+//                                 four settings (all five lists must
+//                                 be of exactly same length)
+// - CloseTrackCorrChi2         -- list with options for using the
+//                                 SV uncertainties in the chi2 calculation
+//                                 in addition to track uncertainties
+//                                   0 : use old method
+//                                       (only track uncertainties)
+//                                   1 : from track perigee with
+//                                       uncertainties from track and vertex
+//                                   2 : simple extrapolation from track
+//                                       parameters with uncertainties from
+//                                       track and vertex (extrapolation
+//                                       used for track swimming)
+// - CloseTrackMinDCAin3D       -- use 3-dimensional information in
+//                                 minimization (list)
+// - CloseTrackMaxLogChi2       -- maximum chi2 distance of closest track
+//                                 to B vertex (list)
+// - NCloseTrackMaxLogChi2      -- maximum chi2 distance of track
+//                                 to B vertex for track counting (list)
+//                           
+//============================================================================
+//
+#include "DerivationFrameworkBPhys/BVertexClosestTrackTool.h"
+#include "xAODMuon/MuonContainer.h"
+#include "xAODEventInfo/EventInfo.h"
+#include "xAODBPhys/BPhysHelper.h"
+#include "InDetTrackSelectionTool/IInDetTrackSelectionTool.h"
+#include "EventPrimitives/EventPrimitivesHelpers.h"
+#include "AthLinks/ElementLink.h"
+
+#include "boost/format.hpp"
+#include "TVector3.h"
+#include <algorithm>
+#include <sstream>
+
+namespace DerivationFramework {
+
+  //-------------------------------------------------------------------------
+  //
+  // helper class
+  BVertexClosestTrackTool::CtItem::CtItem(std::string Name, std::string Prefix,
+					  std::string Bname,
+					  double Dca, double DcaErr,
+					  double Zca, double ZcaErr,
+            double VtxNDErr2, double TrkNDErr2, double Phi0Used,
+					  int    NTrksChi2,
+            xAOD::TrackParticle* CloseTrack,
+            TrackBag Tracks,
+            std::vector<std::vector<double> > Vtap,
+            std::vector<unsigned short> Selpat)
+    : BaseItem(Name, Bname, Prefix), dca(Dca), dcaErr(DcaErr),
+      zca(Zca), zcaErr(ZcaErr), vtxNDErr2(VtxNDErr2), trkNDErr2(TrkNDErr2),
+      phi0Used(Phi0Used),
+      nTrksChi2(NTrksChi2), closeTrack(CloseTrack),
+      tracks(Tracks), vtap(Vtap), selpat(Selpat) {
+  }
+
+  BVertexClosestTrackTool::CtItem::~CtItem() {
+  }
+  
+  void BVertexClosestTrackTool::CtItem::setup(std::string Name,
+					      std::string Bname,
+					      std::string Prefix) {
+    BaseItem::setup(Name, Bname, Prefix);
+    dca        = -999.;
+    dcaErr     = -99.;
+    zca        = -999.;
+    zcaErr     = -99.;
+    vtxNDErr2  = -99.;
+    trkNDErr2  = -99.;
+    phi0Used   = -999.;
+    nTrksChi2  = 0;
+    closeTrack = NULL;
+    tracks.clear();
+    vtap.clear();
+    selpat.clear();
+  }
+  
+  void BVertexClosestTrackTool::CtItem::setup(std::string Name,
+					      std::string Bname,
+					      std::string Prefix, 
+					      double Dca, double DcaErr,
+					      double Zca, double ZcaErr,
+                double VtxNDErr2, double TrkNDErr2, double Phi0Used,
+					      int    NTrksChi2,
+					      xAOD::TrackParticle*
+                CloseTrack,
+                TrackBag Tracks,
+                std::vector<std::vector<double> > Vtap,
+                std::vector<unsigned short> Selpat) {
+    BaseItem::setup(Name, Bname, Prefix);
+    dca        = Dca;
+    dcaErr     = DcaErr;
+    zca        = Zca;
+    zcaErr     = ZcaErr;
+    vtxNDErr2  = VtxNDErr2;
+    trkNDErr2  = TrkNDErr2;
+    phi0Used   = Phi0Used;
+    nTrksChi2  = NTrksChi2;
+    closeTrack = CloseTrack;
+    tracks     = Tracks;
+    vtap       = Vtap;
+    selpat     = Selpat;
+  }
+
+  void BVertexClosestTrackTool::CtItem::resetVals() {
+    dca        = -999.;
+    dcaErr     =  -99.;
+    zca        = -999.;
+    zcaErr     =  -99.;
+    vtxNDErr2  =  -99.;
+    trkNDErr2  =  -99.;
+    phi0Used   = -999.;
+    nTrksChi2  =    0;
+    closeTrack = NULL;
+    tracks.clear();
+    vtap.clear();
+    selpat.clear();
+  }
+
+  void BVertexClosestTrackTool::CtItem::copyVals(const BaseItem& item) {
+    copyVals((const CtItem&)item);
+  }
+    
+  void BVertexClosestTrackTool::CtItem::copyVals(const CtItem& item) {
+    dca        = item.dca;
+    dcaErr     = item.dcaErr;
+    zca        = item.zca;
+    zcaErr     = item.zcaErr;
+    vtxNDErr2  = item.vtxNDErr2;
+    trkNDErr2  = item.trkNDErr2;
+    phi0Used   = item.phi0Used;
+    nTrksChi2  = item.nTrksChi2;
+    closeTrack = item.closeTrack;
+    tracks     = item.tracks;
+    vtap       = item.vtap;
+    selpat     = item.selpat;
+  }
+  
+  std::string BVertexClosestTrackTool::CtItem::dcaName() {
+    return buildName("DCA");
+  }
+  
+  std::string BVertexClosestTrackTool::CtItem::dcaErrName() {
+    return buildName("DCAError");
+  }
+  
+  std::string BVertexClosestTrackTool::CtItem::zcaName() {
+    return buildName("ZCA");
+  }
+  
+  std::string BVertexClosestTrackTool::CtItem::zcaErrName() {
+    return buildName("ZCAError");
+  }
+  
+  std::string BVertexClosestTrackTool::CtItem::vtxNDErr2Name() {
+    return buildName("VtxNDError2");
+  }
+
+  std::string BVertexClosestTrackTool::CtItem::trkNDErr2Name() {
+    return buildName("TrkNDError2");
+  }
+
+  std::string BVertexClosestTrackTool::CtItem::phi0UsedName() {
+    return buildName("Phi0Used");
+  }
+
+  std::string BVertexClosestTrackTool::CtItem::nTrksChi2Name() {
+    return buildName("NTracksChi2");
+  }
+
+  std::string BVertexClosestTrackTool::CtItem::closeTrackName() {
+    return buildName("CloseTrack", "_Link");
+  }
+  
+  std::string BVertexClosestTrackTool::CtItem::toString() const {
+    boost::format f1("dca: %10.6f %10.6f zca: %10.6f %10.6f nt: %10d");
+    f1 % dca % dcaErr % zca % zcaErr % nTrksChi2;
+    boost::format f2("%s\n  %s\n");
+    f2 % BPhysVertexTrackBase::BaseItem::toString();
+    f2 % f1.str();
+    std::string rstr = f2.str();
+    rstr += "per track: p(px, py, pz)\n";
+    rstr += "           d(d0, z0, phi, theta, qoverp)\n";
+    rstr += "           d0, d0Err, z0, z0Err, logChi2, dca, okFlag\n";
+    rstr += "           vtxNDErr2, trkNDErr2, phi0Used\n";
+    rstr += "           vtxNDErr, trkNDErr, log(chi2Err2Sum)\n";
+    // loop over tracks
+    if (tracks.size() == vtap.size() && vtap.size() == selpat.size()) {
+      for (unsigned int i=0; i<tracks.size(); ++i) {
+        boost::format f3("  %3d %2d ");
+        f3 % i % selpat[i];
+        std::string f3str = f3.str();
+        // 0: d0, 1: d0Err, 2: z0, 3: z0Err, 4: logChi2, 5: dca, 6: okFlag
+        // 7: vtxNDErr2, 8: trkNDErr2, 9: phi0Used
+        boost::format f4("%s\nd0: %10.4f %10.4f z0: %10.4f %10.4f "
+                         "lc2: %10.4f dca: %10.4f ok: %3f\n"
+                         "vtxNDErr2: %10.4f trkNDErr2: %10.4f "
+                         "phi0Used: %10.4f\n"
+                         "vtxNDErr: %10.4f trkNDErr2 %10.4f "
+                         "logChi2Err2Sum: %10.4f");
+        f4 % trackToString(tracks[i]);
+        f4 % vtap[i][0] % vtap[i][1] % vtap[i][2] % vtap[i][3];
+        f4 % vtap[i][4] % vtap[i][5] % vtap[i][6];
+        f4 % vtap[i][7] % vtap[i][8] % vtap[i][9];
+        f4 % (vtap[i][7] < 0. ? -99. : sqrt(vtap[i][7]));
+        f4 % (vtap[i][8] < 0. ? -99. : sqrt(vtap[i][8]));
+        f4 % (vtap[i][7]+vtap[i][8] > 0. ?
+              log(vtap[i][5]*vtap[i][5]/(vtap[i][7]+vtap[i][8])) : -999.);
+        std::string tstr = wrapLines(f4.str(),
+                                     std::string(f3str.length(), ' '));
+        tstr.replace(0,f3str.length(),f3str);
+        rstr.append(tstr+"\n");
+      } // for i
+    } else {
+      boost::format f5("Mismatch: nTracks: %d nVtap: %d nSelpat: %d\n");
+      f5 % tracks.size() % vtap.size() % selpat.size();
+      rstr.append(f5.str());
+    } // if sizes
+
+    rstr.erase(rstr.length()-1);
+    return rstr;
+  }
+
+  //--------------------------------------------------------------------------
+  BVertexClosestTrackTool::BVertexClosestTrackTool(const std::string& t,
+					   const std::string& n,
+					   const IInterface*  p)
+    : BPhysVertexTrackBase(t,n,p), m_lastRunNumber(0), m_lastEvtNumber(0),
+      m_svIdx(0) {
+    
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+
+    declareProperty("CloseTrackChi2SetName", m_closeTrackChi2SetName = {"def"});
+    declareProperty("CloseTrackCorrChi2"   , m_closeTrackCorrChi2    = {0});
+    declareProperty("CloseTrackMinDCAin3D" , m_minDCAin3D            = {true});
+    declareProperty("CloseTrackMaxLogChi2" , m_closeTrackMaxLogChi2  = {-1.});
+    declareProperty("NCloseTrackMaxLogChi2", m_nCloseTrackMaxLogChi2 = {-1.});
+  }
+  //--------------------------------------------------------------------------
+  StatusCode BVertexClosestTrackTool::initializeHook() {
+  
+    ATH_MSG_DEBUG("BVertexClosestTrackTool::initializeHook() -- begin");
+
+    // check job options
+    if ( m_closeTrackChi2SetName.size() == 0 ) {
+      ATH_MSG_ERROR("No chi2 set names provided!");
+    }
+    if ( m_closeTrackCorrChi2.size() == 0 ) {
+      ATH_MSG_ERROR("No use of corrected chi2 settings provided!");
+    }
+    if ( m_minDCAin3D.size() == 0 ) {
+      ATH_MSG_ERROR("No use of min DCA in 3D settings provided!");
+    }
+    if ( m_closeTrackMaxLogChi2.size() == 0 ) {
+      ATH_MSG_ERROR("No cuts on max log chi2 for DOCA calculation provided!");
+    }
+    if ( m_nCloseTrackMaxLogChi2.size() == 0 ) {
+      ATH_MSG_ERROR("No cuts on max log chi2 for nClosetTracks calculation "
+                    "provided!");
+    }
+    if ( m_closeTrackCorrChi2.size()    != m_closeTrackChi2SetName.size() ||
+         m_minDCAin3D.size()            != m_closeTrackChi2SetName.size() ||
+         m_closeTrackMaxLogChi2.size()  != m_closeTrackChi2SetName.size() ||
+         m_nCloseTrackMaxLogChi2.size() != m_closeTrackChi2SetName.size() ) {
+      ATH_MSG_ERROR("Size mismatch of CloseTrackChi2SetName ("
+                    <<  m_closeTrackChi2SetName.size() << "), "
+                    << "CloseTrackCorrChi2 ("
+                    << m_closeTrackCorrChi2 << "), "
+                    << "CloseTrackMinDCAin3D ("
+                    << m_minDCAin3D.size() << "), "
+                    << "CloseTrackMaxLogChi2 ("
+                    << m_closeTrackMaxLogChi2.size() << ") and/or "
+                    << "NCloseTrackMaxLogChi2 ("
+                    << m_nCloseTrackMaxLogChi2.size() << ")");
+    }
+
+    // initialize results array
+    initResults();
+
+    ATH_MSG_DEBUG("BVertexClosestTrackTool::initializeHook() -- end");
+
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+  StatusCode BVertexClosestTrackTool::finalizeHook() {
+
+    ATH_MSG_DEBUG("BVertexClosestTrackTool::finalizeHook()");
+
+    // everything all right
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  StatusCode
+  BVertexClosestTrackTool::addBranchesVCSetupHook(size_t ivc) const {
+
+    ATH_MSG_DEBUG("BVertexClosestTrackTool::addBranchesVCLoopHook() -- begin");
+
+    ATH_MSG_DEBUG("BVertexClosestTrackTool::addBranchesVCSetupHook: "
+		  << "Vertex container index " << ivc
+		  << " for collection " << m_vertexContainerNames[ivc]
+		  << " with prefix " << m_branchPrefixes[ivc]);
+    
+    setResultsPrefix(m_branchPrefixes[ivc]);
+    
+    ATH_MSG_DEBUG("BVertexClosestTrackTool::addBranchesVCSetupHook() -- end");
+   
+    // nothing to do here
+    return StatusCode::SUCCESS;
+  }  
+
+  //--------------------------------------------------------------------------
+  StatusCode
+  BVertexClosestTrackTool::addBranchesSVLoopHook(const xAOD::Vertex* vtx) const {
+
+    ATH_MSG_DEBUG("BVertexClosestTrackTool::addBranchesSVLoopHook() -- begin");
+
+    // calculate closest track values
+    ATH_MSG_DEBUG("BVertexClosestTrackTool::addBranchesSVLoopHook(): "
+		  "calculate closest track ...");
+    CHECK(calculateValues(vtx));
+      
+    // save the closest track values
+    ATH_MSG_DEBUG("BVertexClosestTrackTool::addBranchesSVLoopHook(): "
+		  "save closest track ...");
+    CHECK(saveClosestTrack(vtx));
+
+    // dump close track item debugging information
+    if (m_debugTracksInThisEvent) {
+      CHECK(logCloseTracksDebugInfo());
+    }
+    
+    ATH_MSG_DEBUG("BVertexClosestTrackTool::addBranchesSVLoopHook() -- end");
+   
+    // nothing to do here
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  // Calculate closest track variables -- method called from caching loop
+  //--------------------------------------------------------------------------  
+  StatusCode
+  BVertexClosestTrackTool::calcValuesHook(const xAOD::Vertex* vtx,
+					  const unsigned int ipv,
+					  const unsigned int its,
+					  const unsigned int itt) const {
+    
+    ATH_MSG_DEBUG("calcValuesHook:  ipv: " << ipv
+		  << ", its: " << its << ", itt: " << itt);
+ 
+    // candidate tracks and momentum
+    xAOD::BPhysHelper   cand(vtx);
+
+    // tracks to be considered
+    TrackBag tracks = selectTracks(m_tracks, cand, ipv, its, itt);
+    
+    // loop over chi2 setting sets
+    unsigned int nChi2Sets = m_closeTrackChi2SetName.size();
+    for (unsigned int ics = 0; ics < nChi2Sets; ++ics) {
+
+      CtItem& cti = m_results[its][ipv][itt][ics];
+
+      // presets
+      cti.resetVals();
+
+      double       closestTrkDCA = 9999.;
+      int          closestTrkIdx(-1);
+      unsigned int trkIdx(0);
+      for (TrackBag::const_iterator trkItr = tracks.begin();
+           trkItr != tracks.end(); ++trkItr, ++trkIdx) {
+
+        //
+        // track selection bit pattern:
+        // bit 0 : included in number of close tracks
+        // bit 1 : chosen as closest track
+        //
+        unsigned short selpat(0);
+
+        // Returned vector components:
+        // 0: d0, 1: d0Err, 2: z0, 3: z0Err, 4: logChi2, 5: dca, 6: okFlag
+        // 7: vtxErrPart2, 8: trkErrPart2, 9: phi0Used
+        std::vector<double> vtap =
+          getTrackLogChi2DCA(*trkItr, cand.vtx(),
+                             m_minDCAin3D[ics], m_closeTrackCorrChi2[ics]);
+        ATH_MSG_DEBUG("calcValuesHook: track: " << *trkItr
+                      << ", logChi2: " << vtap[4] << ", dca: " << vtap[5]);
+
+        // track values at perigee found?
+        if ( vtap[6] >= 0. ) {
+          ATH_MSG_DEBUG("calcValuesHook: checking track count for "
+                        "m_nCloseTrackMaxLogChi2[ics] = "
+                        << m_nCloseTrackMaxLogChi2[ics]);
+          // count tracks
+          if ( vtap[4] < m_nCloseTrackMaxLogChi2[ics] ) {
+            cti.nTrksChi2++;
+            selpat |= 1;
+            ATH_MSG_DEBUG("calcValuesHook: nTrksChi2++ for track " << *trkItr);
+          }
+          // find closest track
+          ATH_MSG_DEBUG("calcValuesHook: log(chi2) check: "
+                        "m_closeTrackMaxLogChi2[ics]: "
+                        << m_closeTrackMaxLogChi2[ics]
+                        << ", logChi2: " << vtap[4]
+                        << ", closestTrkDCA: " << closestTrkDCA
+		      << ", dca: " << fabs(vtap[5]));	
+          if ( fabs(vtap[5]) < closestTrkDCA &&
+               vtap[4] < m_closeTrackMaxLogChi2[ics] ) {
+            closestTrkDCA  = fabs(vtap[5]);
+            cti.dca        = vtap[0];
+            cti.dcaErr     = vtap[1];
+            cti.zca        = vtap[2];
+            cti.zcaErr     = vtap[3];
+            cti.vtxNDErr2  = vtap[7];
+            cti.trkNDErr2  = vtap[8];
+            cti.phi0Used   = vtap[9];
+            cti.closeTrack = *trkItr;
+            closestTrkIdx  = trkIdx;
+            ATH_MSG_DEBUG("calcValuesHook: closestTrkDCA now: "
+                          << closestTrkDCA
+                          << " for track " << *trkItr);
+          }
+        } // if ok
+        cti.tracks.push_back(*trkItr);
+        cti.vtap.push_back(vtap);
+        cti.selpat.push_back(selpat);
+      } // for tracks
+      // mark closest track
+      if (closestTrkIdx > -1 && closestTrkIdx < (int)cti.selpat.size()) {
+        cti.selpat[closestTrkIdx] |= 2;
+      }
+    } // for ics
+    
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  // Fill closest track values from cache if found
+  //--------------------------------------------------------------------------  
+  bool BVertexClosestTrackTool::fastFillHook(const xAOD::Vertex* vtx,
+					     const int ipv) const {
+
+    ATH_MSG_DEBUG("fastFillHook: ipv: " << ipv);
+    
+    bool found(false);
+    
+    StringIntMap_t::iterator itpv =
+      m_pvAssocResMap.find(buildPvAssocCacheName(vtx, ipv));
+    if ( itpv != m_pvAssocResMap.end() ) {
+      found = true;
+      unsigned int nTrackSels  = m_trackSelectionTools.size();
+      unsigned int nTrackTypes = m_useTrackTypes.size();
+      unsigned int nChi2Sets   = m_closeTrackChi2SetName.size();
+      for (unsigned int its = 0; its < nTrackSels; ++its) {
+        for (unsigned int itt = 0; itt < nTrackTypes; ++itt) {
+          for (unsigned int ics = 0; ics < nChi2Sets; ++ics) {
+            m_results[its][ipv][itt][ics]
+              .copyVals(m_results[its][itpv->second][itt][ics]);
+          } // for ics
+        } // for its
+      } // for itt
+    } // if found
+
+    ATH_MSG_DEBUG("fastFillHook: cache index: "
+		  << buildPvAssocCacheName(vtx, ipv)
+		  << ", found ? " << found
+		  << ", ipv_ref: "
+		  << (found ? itpv->second : -1));
+
+    return found;
+  }
+  //--------------------------------------------------------------------------  
+  StatusCode
+  BVertexClosestTrackTool::saveClosestTrack(const xAOD::Vertex* vtx) const {
+
+    typedef ElementLink< xAOD::TrackParticleContainer > TrackParticleLink_t;
+    
+    unsigned int nTrackSels  = m_trackSelectionTools.size();
+    unsigned int nPvAssocs   = m_pvAssocTypes.size();
+    unsigned int nTrackTypes = m_useTrackTypes.size();
+    unsigned int nChi2Sets   = m_closeTrackChi2SetName.size();
+
+    for (unsigned int its = 0; its < nTrackSels; ++its) {
+      for (unsigned int ipv = 0; ipv < nPvAssocs; ++ipv) {
+        for (unsigned int itt = 0; itt < nTrackTypes; ++itt) {
+          for (unsigned int ics = 0; ics < nChi2Sets; ++ics) {
+            CtItem result = m_results[its][ipv][itt][ics];
+            SG::AuxElement::Decorator< float >
+              d_dca_value(result.dcaName());
+            SG::AuxElement::Decorator< float >
+              d_dcaErr_value(result.dcaErrName());
+            SG::AuxElement::Decorator< float >
+              d_zca_value(result.zcaName());
+            SG::AuxElement::Decorator< float >
+              d_zcaErr_value(result.zcaErrName());
+            SG::AuxElement::Decorator< int >
+              d_nTrksChi2_value(result.nTrksChi2Name());
+            d_dca_value(*vtx)       = result.dca;
+            d_dcaErr_value(*vtx)    = result.dcaErr;
+            d_zca_value(*vtx)       = result.zca;
+            d_zcaErr_value(*vtx)    = result.zcaErr;
+            d_nTrksChi2_value(*vtx) = result.nTrksChi2;
+            ATH_MSG_DEBUG("BVertexClosestTrackTool::saveClosestTrack() "
+                          << "-- dca: " << result.dcaName()
+                          << ", dcaErr: " << result.dcaErrName()
+                          << ", zca: " << result.zcaName()
+                          << ", zcaErr: " << result.zcaErrName()
+                          << ", nTrksChi2: " << result.nTrksChi2Name());
+            ATH_MSG_DEBUG("BVertexClosestTrackTool::saveClosestTrack() "
+                          << "-- vertex: ("
+                          << vtx->x() << ", "
+                          << vtx->y() << ", "
+                          << vtx->z() << ")"
+                          << ", dca: " << result.dca
+                          << ", dcaErr: " << result.dcaErr
+                          << ", zca: " << result.zca
+                          << ", zcaErr: " << result.zcaErr
+                          << ", nTrksChi2: " << result.nTrksChi2);
+            // add ElementLink to closest track
+            std::string linkName = result.closeTrackName();
+            SG::AuxElement::Decorator<TrackParticleLink_t>
+              tpLinkDecor(linkName);
+            TrackParticleLink_t tpLink;
+            if ( result.closeTrack != NULL ) {
+              tpLink.toContainedElement( *m_tracks, result.closeTrack );
+            }
+            ATH_MSG_DEBUG("saveClosestTrack: Decorate vtx "
+                          << vtx << " with " << linkName
+                          << ", closeTrkPtr: " << result.closeTrack);
+            tpLinkDecor(*vtx) = tpLink;
+            if ( tpLink.isValid() ) {
+              ATH_MSG_DEBUG("saveClosestTrack: Decorated vtx "
+                            << vtx << " with " << linkName
+                            << ", closeTrkPtr: " << result.closeTrack);
+            } else {
+              ATH_MSG_VERBOSE("saveClosestTrack: Failed to decorate vtx "
+                              << vtx << " with " << linkName
+                              << ", closeTrkPtr: "
+                              << result.closeTrack << " !");
+            }
+            // if valid
+          } // for ics
+        } // for itt
+      } // for ipv
+    } // for its
+    
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  void BVertexClosestTrackTool::setResultsPrefix(std::string prefix) const {
+
+    ATH_MSG_DEBUG("BVertexClosestTrackTool::setResultsPrefix -- begin");
+
+    unsigned int nTrackSels  = m_trackSelectionTools.size();
+    unsigned int nPvAssocs   = m_pvAssocTypes.size();
+    unsigned int nTrackTypes = m_useTrackTypes.size();
+    unsigned int nChi2Sets   = m_closeTrackChi2SetName.size();
+
+    for (unsigned int its = 0; its < nTrackSels; ++its) {
+      for (unsigned int ipv = 0; ipv < nPvAssocs; ++ipv) {
+        for (unsigned int itt = 0; itt < nTrackTypes; ++itt) {
+          for (unsigned int ics = 0; ics < nChi2Sets; ++ics) {
+            m_results[its][ipv][itt][ics].setPrefix(prefix);
+          } // for ics
+        } // for itt
+      } // for ipv
+    } // for its
+    
+    ATH_MSG_DEBUG("BVertexClosestTrackTool::setResultsPrefix -- end");
+  }
+  //--------------------------------------------------------------------------
+  void BVertexClosestTrackTool::initResults() {
+    
+    ATH_MSG_DEBUG("BVertexClosestTrackTool::initResults -- begin");
+
+    unsigned int nTrackSels  = m_trackSelectionTools.size();
+    unsigned int nPvAssocs   = m_pvAssocTypes.size();
+    unsigned int nTrackTypes = m_useTrackTypes.size();
+    unsigned int nChi2Sets   = m_closeTrackChi2SetName.size();
+    
+    ATH_MSG_DEBUG("BVertexClosestTrackTool::initResults : nTrackSels = "
+		  << nTrackSels);
+    ATH_MSG_DEBUG("BVertexClosestTrackTool::initResults : nPvAssocs = "
+		  << nPvAssocs);
+    ATH_MSG_DEBUG("BVertexClosestTrackTool::initResults : nTrackTypes = "
+		  << nTrackTypes);
+    m_results.resize(boost::extents[nTrackSels][nPvAssocs][nTrackTypes][nChi2Sets]);
+    for (unsigned int its = 0; its < nTrackSels; ++its) {
+      ATH_MSG_DEBUG("BVertexClosestTrackTool::initResults -- its = " << its);
+      for (unsigned int ipv = 0; ipv < nPvAssocs; ++ipv) {
+        ATH_MSG_DEBUG("BVertexClosestTrackTool::initResults -- ipv = " << ipv);
+        for (unsigned int itt = 0; itt < nTrackTypes; ++itt) {
+            ATH_MSG_DEBUG("BVertexClosestTrackTool::initResults -- itt = "
+                          << itt);
+          for (unsigned int ics = 0; ics < nChi2Sets; ++ics) {
+            ATH_MSG_DEBUG("BVertexClosestTrackTool::initResults -- ics = "
+                          << ics);
+            std::string csname = m_closeTrackChi2SetName[ics];
+            ATH_MSG_DEBUG("BVertexClosestTrackTool::initResults : "
+                          << m_branchBaseName << ", "
+                          << buildBranchBaseName(its, ipv, itt, csname));
+            m_results[its][ipv][itt][ics].setup(buildBranchBaseName(its, ipv,
+                                                                    itt,
+                                                                    csname),
+                                                m_branchBaseName);
+          } // for ics
+        } // for itt
+      } // for ipv
+    } // for its
+    
+    ATH_MSG_DEBUG("BVertexClosestTrackTool::initResults -- end");
+  }
+  //--------------------------------------------------------------------------
+  // Dump CloseTracks debug information to log file
+  //--------------------------------------------------------------------------  
+  StatusCode BVertexClosestTrackTool::logCloseTracksDebugInfo() const {
+
+    // Count candidates
+    if (m_runNumber != m_lastRunNumber || m_evtNumber != m_lastEvtNumber) {
+      m_lastRunNumber = m_runNumber;
+      m_lastEvtNumber = m_evtNumber;
+      m_svIdx = 0;
+    } else {
+      m_svIdx++;
+    }
+
+    std::string str(">>>>> logCloseTracksDebugInfo:\n");
+    boost::format f("Run %d  Event %d  SV %d\n");
+    f % m_runNumber % m_evtNumber % m_svIdx;
+    str.append(f.str());
+    
+    unsigned int nTrackSels  = m_trackSelectionTools.size();
+    unsigned int nPvAssocs   = m_pvAssocTypes.size();
+    unsigned int nTrackTypes = m_useTrackTypes.size();
+    unsigned int nChi2Sets   = m_closeTrackChi2SetName.size();
+
+    for (unsigned int its = 0; its < nTrackSels; ++its) {
+      for (unsigned int ipv = 0; ipv < nPvAssocs; ++ipv) {
+        for (unsigned int itt = 0; itt < nTrackTypes; ++itt) {
+          for (unsigned int ics = 0; ics < nChi2Sets; ++ics) {
+            boost::format f1("its: %d ipv: %d itt: %d ics: %d\n");
+            f1 % its % ipv % itt % its;
+            str.append(f1.str()); 
+            CtItem result = m_results[its][ipv][itt][ics];
+            str.append(result.toString()+"\n");
+          } // for ics
+        } // for itt
+      } // for ipv
+    } // for its
+
+    str.append("<<<<< logCloseTracksDebugInfo");
+    ATH_MSG_INFO(str);
+    
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BVertexTrackIsoTool.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BVertexTrackIsoTool.cxx
new file mode 100644
index 000000000000..6bb527ea80eb
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BVertexTrackIsoTool.cxx
@@ -0,0 +1,511 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+//============================================================================
+// BVertexTrackIsoTool.cxx
+//============================================================================
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Changes:
+//
+// Add B vertex track isolation information for different configurations,
+// different track selections and different PV-to-SV association methods.
+//
+// For an usage example see BPHY8.py .
+//
+// Job options provided by this class:
+// - IsolationConeSizes         -- List of isolation cone sizes
+// - IsoTrkImpLogChi2Max        -- List of maximum log(chi2) cuts for
+//                                 association of tracks to the primary
+//                                 vertex picked.
+// - IsoDoTrkImpLogChi2Cut      -- apply log(chi2) cuts
+//                                 0 : don't apply log(chi2) cuts
+//                                 1 : apply log(chi2) cuts
+//                                 2 : apply log(chi2) cuts [former version]
+//                                 (The last two job options must
+//                                  contain the same number of elements
+//                                  as the IsolationConeSizes list.)
+// - UseOptimizedAlgo           -- Use the speed-optimized algorithm.
+//                           
+//============================================================================
+//
+#include "DerivationFrameworkBPhys/BVertexTrackIsoTool.h"
+#include "xAODEventInfo/EventInfo.h"
+#include "xAODBPhys/BPhysHelper.h"
+#include "InDetTrackSelectionTool/IInDetTrackSelectionTool.h"
+#include "EventPrimitives/EventPrimitivesHelpers.h"
+
+#include "boost/format.hpp"
+#include "TVector3.h"
+#include <algorithm>
+#include <sstream>
+
+namespace DerivationFramework {
+
+  //-------------------------------------------------------------------------
+  //
+  // helper class
+  BVertexTrackIsoTool::IsoItem::IsoItem(std::string Name,
+					std::string Bname,
+					std::string Prefix,
+					double IsoValue,
+					int NTracks) :
+    BaseItem(Name, Bname, Prefix), isoValue(IsoValue), nTracks(NTracks) {
+  }
+  
+  BVertexTrackIsoTool::IsoItem::~IsoItem() {
+  }
+
+  void BVertexTrackIsoTool::IsoItem::setup(std::string Name,
+					   std::string Bname,
+					   std::string Prefix) {
+    BaseItem::setup(Name, Bname, Prefix);
+    isoValue = -1.;
+    nTracks  =  0;
+  }
+  
+  void BVertexTrackIsoTool::IsoItem::setup(std::string Name,
+					   std::string Bname,
+					   std::string Prefix,
+					   double      IsoValue,
+					   int         NTracks) {
+    BaseItem::setup(Name, Bname, Prefix);
+    isoValue = IsoValue;
+    nTracks  = NTracks;
+  }
+
+  void BVertexTrackIsoTool::IsoItem::resetVals() {
+    isoValue = -2.;
+    nTracks  = -1;
+  }
+
+  void BVertexTrackIsoTool::IsoItem::copyVals(const BaseItem& item) {
+    copyVals((const IsoItem&)item);
+  }
+  
+  void BVertexTrackIsoTool::IsoItem::copyVals(const IsoItem& item) {
+    isoValue = item.isoValue;
+    nTracks  = item.nTracks;
+  }
+  
+  std::string BVertexTrackIsoTool::IsoItem::isoName() {
+    return buildName();
+  }
+
+  std::string BVertexTrackIsoTool::IsoItem::nTracksName() {
+    return buildName("Ntracks");
+  }
+
+  //--------------------------------------------------------------------------
+  BVertexTrackIsoTool::BVertexTrackIsoTool(const std::string& t,
+					   const std::string& n,
+					   const IInterface*  p)
+    : BPhysVertexTrackBase(t,n,p) {
+    
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+    
+    declareProperty("IsolationConeSizes"    , m_isoConeSizes);
+    declareProperty("IsoTrkImpLogChi2Max"   , m_isoTrkImpLogChi2Max);
+    declareProperty("IsoDoTrkImpLogChi2Cut" , m_isoDoTrkImpLogChi2Cut);
+    declareProperty("UseOptimizedAlgo"      , m_useOptimizedAlgo = true);
+  }
+  //--------------------------------------------------------------------------
+  StatusCode BVertexTrackIsoTool::initializeHook() {
+  
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::initializeHook() -- begin");
+
+    // check like-sized arrays
+    if ( m_isoConeSizes.size() != m_isoTrkImpLogChi2Max.size() ||
+         m_isoConeSizes.size() != m_isoDoTrkImpLogChi2Cut.size() ) {
+      ATH_MSG_ERROR("Size mismatch of IsolationConeSizes ("
+                    << m_isoConeSizes.size()
+                    << "), IsoTrkImpChi2Max ("
+                    << m_isoTrkImpLogChi2Max.size()
+                    << ") and IsoDoTrkImpChi2Cut ("
+                    << m_isoDoTrkImpLogChi2Cut.size() << ") lists!");
+    }      
+
+    // initialize results array
+    initResults();
+
+    // info output
+    ATH_MSG_INFO("calculateIsolation: using "
+		 << (m_useOptimizedAlgo ?
+		     "optimized (faster)" : "regular (slower)")
+		 << "track isolation calculation methd.");
+
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::initializeHook() -- end");
+
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+  StatusCode BVertexTrackIsoTool::finalizeHook() {
+
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::finalizeHook()");
+
+    // everything all right
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  StatusCode
+  BVertexTrackIsoTool::addBranchesVCSetupHook(size_t ivc) const {
+
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::addBranchesVCLoopHook() -- begin");
+
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::addBranchesVCSetupHook: "
+		  << "Vertex container index " << ivc
+		  << " for collection " << m_vertexContainerNames[ivc]
+		  << " with prefix " << m_branchPrefixes[ivc]);
+    
+    setResultsPrefix(m_branchPrefixes[ivc]);
+    
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::addBranchesVCSetupHook() -- end");
+   
+    // nothing to do here
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+  StatusCode
+  BVertexTrackIsoTool::addBranchesSVLoopHook(const xAOD::Vertex* vtx) const {
+
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::addBranchesSVLoopHook() -- begin");
+
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::addBranchesSVLoopHook(): "
+		  "calculate isolation ...");
+    if ( m_useOptimizedAlgo ) {
+      CHECK(calculateValues(vtx));
+    } else {
+      CHECK(calculateIsolation(vtx));
+	}
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::addBranchesSVLoopHook(): "
+		  "save isolation ...");
+    // save the isolation values
+    CHECK(saveIsolation(vtx));
+
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::addBranchesSVLoopHook() -- end");
+   
+    // nothing to do here
+    return StatusCode::SUCCESS;
+  }  
+  //--------------------------------------------------------------------------
+  // Calculate track isolation variables -- faster method with caching
+  //--------------------------------------------------------------------------  
+  StatusCode
+  BVertexTrackIsoTool::calcValuesHook(const xAOD::Vertex* vtx,
+                                      const unsigned int ipv,
+                                      const unsigned int its,
+                                      const unsigned int itt) const {
+    
+    ATH_MSG_DEBUG("calcValuesHook:  ipv: " << ipv
+		  << ", its: " << its << ", itt: " << itt);
+ 
+    // candidate tracks and momentum
+    xAOD::BPhysHelper   cand(vtx);
+    TVector3            candP      = cand.totalP();
+    const xAOD::Vertex* candRefPV  = cand.pv(m_pvAssocTypes[ipv]);
+
+    TrackBag tracks = selectTracks(m_tracks, cand, ipv, its, itt);
+    
+    // loop over isolation cones (pt and deltaR)
+    unsigned int nCones = m_isoConeSizes.size();
+    for (unsigned int ic = 0; ic < nCones; ++ic) {
+      
+      IsoItem&      iso        = m_results[ic][its][ipv][itt];
+      const double& coneSize   = m_isoConeSizes[ic];
+      const double& logChi2Max = m_isoTrkImpLogChi2Max[ic];
+      const int&    doLogChi2  = m_isoDoTrkImpLogChi2Cut[ic];
+
+      // presets
+      iso.resetVals();
+
+      double nTracksInCone = 0;
+      double ptSumInCone   = 0.; 
+
+      // make sure candRefPV exists
+      if ( candRefPV != NULL ) {
+      
+        for (TrackBag::const_iterator trkItr = tracks.begin();
+             trkItr != tracks.end(); ++trkItr) {
+          double deltaR = candP.DeltaR((*trkItr)->p4().Vect());
+          if ( deltaR < coneSize ) {
+            double logChi2 = (doLogChi2 > 0) ?
+              getTrackCandPVLogChi2(*trkItr, candRefPV) : -9999.;
+            // next line needed exactly as is for backward validation
+            if ( doLogChi2 == 2 ) logChi2 = abs(logChi2);
+            if ( doLogChi2 == 0 || logChi2 < logChi2Max ) {
+              nTracksInCone++;
+              ptSumInCone += (*trkItr)->pt();
+            } // logChi2
+          } // deltaR
+        }
+        // calculate result
+        if ( ptSumInCone + candP.Pt() > 0. ) {
+          iso.isoValue = candP.Pt() / ( ptSumInCone + candP.Pt() );
+        } else {
+          iso.isoValue = -5.;
+        }
+	
+      } else {
+        iso.isoValue = -10.;
+      } // if candRefPV != NULL
+
+      iso.nTracks  = nTracksInCone;
+    } // for ic
+
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  // Fill track isolation values from cache if found
+  //--------------------------------------------------------------------------  
+  bool BVertexTrackIsoTool::fastFillHook(const xAOD::Vertex* vtx,
+					 const int ipv) const {
+
+    ATH_MSG_DEBUG("fastFillHook: ipv: " << ipv);
+    
+    bool found(false);
+    
+    StringIntMap_t::iterator itpv =
+      m_pvAssocResMap.find(buildPvAssocCacheName(vtx, ipv));
+    if ( itpv != m_pvAssocResMap.end() ) {
+      found = true;
+      unsigned int nCones      = m_isoConeSizes.size();
+      unsigned int nTrackSels  = m_trackSelectionTools.size();
+      unsigned int nTrackTypes = m_useTrackTypes.size();
+      for (unsigned int its = 0; its < nTrackSels; ++its) {
+	for (unsigned int ic = 0; ic < nCones; ++ic) {
+	  for (unsigned int itt = 0; itt < nTrackTypes; ++itt) {
+	    m_results[ic][its][ipv][itt]
+	      .copyVals(m_results[ic][its][itpv->second][itt]);
+	  } // for its
+	} // for ic
+      } // for itt
+    } // if found
+
+    ATH_MSG_DEBUG("fastFillHook: cache index: "
+		  << buildPvAssocCacheName(vtx, ipv)
+		  << ", found ? " << found
+		  << ", ipv_ref: "
+		  << (found ? itpv->second : -1));
+
+    return found;
+  }
+  //--------------------------------------------------------------------------
+  // Track isolation calculation loops -- slower method
+  //--------------------------------------------------------------------------  
+  StatusCode
+  BVertexTrackIsoTool::calculateIsolation(const xAOD::Vertex* vtx) const {
+
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::calculateIsolation -- begin");
+    
+    unsigned int nCones      = m_isoConeSizes.size();
+    unsigned int nTrackSels  = m_trackSelectionTools.size();
+    unsigned int nPvAssocs   = m_pvAssocTypes.size();
+    unsigned int nTrackTypes = m_useTrackTypes.size();
+
+    for (unsigned int its = 0; its < nTrackSels; ++its) {
+      for (unsigned int ipv = 0; ipv < nPvAssocs; ++ipv) {
+	for (unsigned int ic = 0; ic < nCones; ++ic) {
+	  for (unsigned int itt = 0; itt < nTrackTypes; ++itt) {
+	    CHECK(calcIsolation(m_results[ic][its][ipv][itt], vtx,
+				m_isoConeSizes[ic], m_isoTrkImpLogChi2Max[ic],
+        m_isoDoTrkImpLogChi2Cut[ic],
+				m_trackSelectionTools[its],
+				m_pvAssocTypes[ipv], m_useTrackTypes[itt]));
+	  } // for itt
+	} // for ic
+      } // for ipv
+    } // for its
+
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  // Calculate track isolation variables -- slower method
+  //--------------------------------------------------------------------------
+  StatusCode BVertexTrackIsoTool::
+  calcIsolation(const IsoItem& iso,
+                const xAOD::Vertex* vtx,
+                const double coneSize,
+                const double logChi2Max,
+                const int    doLogChi2,
+                const ToolHandle<TrkSelTool>& tSelTool,
+                const xAOD::BPhysHelper::pv_type pvAssocType,
+                const int trackTypes ) const {
+
+    // preset
+    iso.nTracks =  -1;
+    iso.isoValue = -2.;
+    
+    // candidate tracks and momentum
+    xAOD::BPhysHelper   cand(vtx);
+    TrackBag            candTracks = findAllTracksInDecay(cand);
+    TVector3            candP      = cand.totalP();
+    const xAOD::Vertex* candRefPV  = cand.pv(pvAssocType);
+    const xAOD::Vertex* candPV     = cand.origPv(pvAssocType);
+    
+    // tracks to be considered
+    TrackBag tracks;
+    for (xAOD::TrackParticleContainer::const_iterator trkItr =
+	   m_tracks->begin(); trkItr != m_tracks->end(); ++trkItr) {
+      const xAOD::TrackParticle* track = *trkItr;
+      // track selection check
+      if ( ! tSelTool->accept(*track, candRefPV) ) continue;
+      // track type check
+      if ( ! ((unsigned int)trackTypes == ttall() ||
+              (unsigned int)trackTypes == ttallMin() ||
+              (detTrackTypes(track, candPV, candRefPV)
+               & trackTypes) > 0x0) ) continue; 
+      // track not in SV
+      if ( std::find(candTracks.begin(), candTracks.end(), track)
+           != candTracks.end() ) continue;
+      // tracks that survived so far
+      tracks.push_back(track);
+    }
+
+    double nTracksInCone = 0;
+    double ptSumInCone   = 0.; 
+    for (TrackBag::const_iterator trkItr = tracks.begin();
+         trkItr != tracks.end(); ++trkItr) {
+      double deltaR = candP.DeltaR((*trkItr)->p4().Vect());
+      if ( deltaR < coneSize ) {
+        double logChi2 = (doLogChi2 > 0) ?
+          getTrackCandPVLogChi2(*trkItr, candRefPV) : -9999.;
+        // next line needed exactly as is for backward validation
+        if ( doLogChi2 == 2 ) logChi2 = abs(logChi2);
+        if ( doLogChi2 == 0 || logChi2 < logChi2Max ) {
+          nTracksInCone++;
+          ptSumInCone += (*trkItr)->pt();
+        }
+      } // deltaR
+    }
+    // calculate result
+    if ( ptSumInCone + candP.Pt() > 0. ) {
+      iso.isoValue = candP.Pt() / ( ptSumInCone + candP.Pt() );
+    } else {
+      iso.isoValue = -5;
+    }
+    iso.nTracks  = nTracksInCone;
+
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------  
+  StatusCode
+  BVertexTrackIsoTool::saveIsolation(const xAOD::Vertex* vtx) const {
+
+    unsigned int nCones      = m_isoConeSizes.size();
+    unsigned int nTrackSels  = m_trackSelectionTools.size();
+    unsigned int nPvAssocs   = m_pvAssocTypes.size();
+    unsigned int nTrackTypes = m_useTrackTypes.size();
+
+    for (unsigned int its = 0; its < nTrackSels; ++its) {
+      for (unsigned int ipv = 0; ipv < nPvAssocs; ++ipv) {
+	for (unsigned int ic = 0; ic < nCones; ++ic) {
+	  for (unsigned int itt = 0; itt < nTrackTypes; ++itt) {
+	    IsoItem result = m_results[ic][its][ipv][itt];
+	    SG::AuxElement::Decorator< float >
+	      d_iso_value(result.isoName());
+	    SG::AuxElement::Decorator< int >
+	      d_iso_ntracks(result.nTracksName());
+	    d_iso_value(*vtx)   = result.isoValue;
+	    d_iso_ntracks(*vtx) = result.nTracks; 
+	    ATH_MSG_DEBUG("BVertexTrackIsoTool::saveIsolation() -- isobn: "
+			  << result.isoName() << ", ntbn: "
+			  << result.nTracksName());
+	    ATH_MSG_DEBUG("BVertexTrackIsoTool::saveIsolation() -- vertex: ("
+			  << vtx->x() << ", "
+			  << vtx->y() << ", "
+			  << vtx->z() << "), iso: "
+			  << result.isoValue << ", nTracks: "
+			  << result.nTracks);
+	  } // for itt
+	} // for ic
+      } // for ipv
+    } // for its
+
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  void BVertexTrackIsoTool::setResultsPrefix(std::string prefix) const {
+
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::setResultsPrefix -- begin");
+
+    unsigned int nCones      = m_isoConeSizes.size();
+    unsigned int nTrackSels  = m_trackSelectionTools.size();
+    unsigned int nPvAssocs   = m_pvAssocTypes.size();
+    unsigned int nTrackTypes = m_useTrackTypes.size();
+
+    for (unsigned int its = 0; its < nTrackSels; ++its) {
+      for (unsigned int ipv = 0; ipv < nPvAssocs; ++ipv) {
+	for (unsigned int ic = 0; ic < nCones; ++ic) {
+	  for (unsigned int itt = 0; itt < nTrackTypes; ++itt) {
+	    m_results[ic][its][ipv][itt].setPrefix(prefix);
+	  } // for itt
+	} // for ic
+      } // for ipv
+    } // for its
+    
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::setResultsPrefix -- end");
+  }
+  //--------------------------------------------------------------------------
+  void BVertexTrackIsoTool::initResults() {
+
+    unsigned int nCones      = m_isoConeSizes.size();
+    unsigned int nTrackSels  = m_trackSelectionTools.size();
+    unsigned int nPvAssocs   = m_pvAssocTypes.size();
+    unsigned int nTrackTypes = m_useTrackTypes.size();
+
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::initResults -- begin");
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::initResults : nCones = " << nCones);
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::initResults : nTrackSels = "
+		  << nTrackSels);
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::initResults : nPvAssocs = "
+		  << nPvAssocs);
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::initResults : nTrackTypes = "
+		  << nTrackTypes);
+    m_results.resize(boost::extents[nCones][nTrackSels][nPvAssocs][nTrackTypes]);
+    for (unsigned int its = 0; its < nTrackSels; ++its) {
+      ATH_MSG_DEBUG("BVertexTrackIsoTool::initResults -- its = " << its);
+      for (unsigned int ipv = 0; ipv < nPvAssocs; ++ipv) {
+	ATH_MSG_DEBUG("BVertexTrackIsoTool::initResults -- ipv = " << ipv);
+	for (unsigned int ic = 0; ic < nCones; ++ic) {
+	  ATH_MSG_DEBUG("BVertexTrackIsoTool::initResults -- ic = " << ic);
+	  for (unsigned int itt = 0; itt < nTrackTypes; ++itt) {
+	    ATH_MSG_DEBUG("BVertexTrackIsoTool::initResults -- itt = " << itt);
+
+	    ATH_MSG_DEBUG("BVertexTrackIsoTool::initResults :"
+			  << m_branchBaseName << buildBranchName(ic, its,
+								 ipv, itt));
+
+	    m_results[ic][its][ipv][itt].setup(buildBranchName(ic, its,
+							       ipv, itt),
+					       m_branchBaseName);
+	  } // for itt
+	} // for ic
+      } // for ipv
+    } // for its
+    
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::initResults -- end");
+  }
+  //--------------------------------------------------------------------------
+  std::string BVertexTrackIsoTool::buildBranchName(unsigned int ic,
+						   unsigned int its,
+						   unsigned int ipv,
+						   unsigned int itt) const {
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::buildBranchName -- begin");
+    
+    double      coneSize   = m_isoConeSizes[ic];
+    double      logChi2Max = m_isoTrkImpLogChi2Max[ic];
+    int         doLogChi2  = m_isoDoTrkImpLogChi2Cut[ic];
+
+    // format it nicely
+    boost::format f("%02d_LC%02dd%1d_%s");
+    f % (int)(coneSize*10.) % (int)(logChi2Max*10.) % doLogChi2
+      % buildBranchBaseName(its, ipv, itt);
+    
+    ATH_MSG_DEBUG("BVertexTrackIsoTool::buildBranchName: " << f.str());
+
+    return f.str();
+  }
+  //--------------------------------------------------------------------------
+}
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BmumuThinningTool.cxx_NoCompile b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BmumuThinningTool.cxx_NoCompile
new file mode 100644
index 000000000000..c8a539972c6a
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/BmumuThinningTool.cxx_NoCompile
@@ -0,0 +1,1167 @@
+/* 
+   Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+/**
+ * @file   BmumuThinningTool.cxx
+ * @author Wolfgang Walkowiak <wolfgang.walkowiak@cern.ch>
+ *
+ */
+
+#include "DerivationFrameworkBPhys/BmumuThinningTool.h"
+#include "AthenaKernel/IThinningSvc.h"
+#include "xAODTracking/TrackParticleContainer.h"
+#include "xAODTracking/VertexContainer.h"
+#include "xAODTracking/VertexAuxContainer.h"
+#include "xAODBase/IParticleHelpers.h"
+#include "AthContainers/AuxElement.h"
+#include "AthContainers/AuxTypeRegistry.h"
+
+#include <string>
+#include <sstream>
+#include <istream>
+#include <vector>
+#include <iomanip>
+#include <algorithm>
+#include <numeric>
+#include <regex>
+#include <boost/algorithm/string.hpp>
+
+namespace DerivationFramework {
+
+  // static members
+  // Note: may later be migrated to xAODBPhys/BPhysHelper
+  std::map<xAOD::BPhysHelper::pv_type, std::string>
+  BmumuThinningTool::PvTypeToVarNameMap =
+    { {xAOD::BPhysHelper::PV_MAX_SUM_PT2, "MaxSumPt2"},
+      {xAOD::BPhysHelper::PV_MIN_A0     , "MinA0"    },
+      {xAOD::BPhysHelper::PV_MIN_Z0     , "MinZ0"    },
+      {xAOD::BPhysHelper::PV_MIN_Z0_BA  , "MinZ0BA"  } };
+  
+  //--------------------------------------------------------------------------
+  // Constructor
+  //--------------------------------------------------------------------------
+  BmumuThinningTool::BmumuThinningTool(const std::string& t,
+                                       const std::string& n,
+                                       const IInterface* p) :
+    CfAthAlgTool(t, n, p),
+    m_thinningSvc("ThinningSvc", n),
+    m_doCloseTracks(false),
+    m_doPVs(false),
+    m_doRefPVs(false),
+    m_doMuons(false),
+    m_doCalMuons(false),
+    m_doTracks(false) {
+
+    declareInterface<DerivationFramework::IThinningTool>(this);
+
+    // thinning service
+    declareProperty("ThinningService"         , m_thinningSvc);
+    // TrackParticle container name
+    declareProperty("TrackParticleContainerName",
+                    m_trkPartContName = "InDetTrackParticles"); 
+    // list of secondary vertex container names
+    declareProperty("VertexContainerNames"    ,  m_vtxContNames);
+    // list of pass flags for the seconary vertices
+    // empty list lets all vertices pass
+    // list length needs to be identical to length of
+    // VertexContainerNames list if AlignPassToVertexList is True
+    declareProperty("VertexPassFlags"         ,  m_vtxPassFlags);
+    // align VertexPassFlags to VertexContainerNames list?
+    // This option causes a 1:1 correlation between the two lists,
+    // i.e. a flag is only applied to the corresponding container
+    // if this option is set to True. (default: false)
+    declareProperty("AlignPassToVertexList",
+                    m_alignPassToVertexList = false);
+    // Primary vertex container name
+    declareProperty("PVContainerName"         , m_PVContName);
+    // Refitted primary vertex container names
+    // This list must be of same length and order as the m_vtxContNames list
+    // (or empty => no thinning of refitted primary vertex containers)
+    declareProperty("RefPVContainerNames"     , m_refPVContNames);
+    // name of the used muon container
+    declareProperty("MuonContainerName"       , m_muonContName = "");
+    // name of the calibrated muons container
+    declareProperty("CalibMuonContainerName"  , m_calMuonContName = "");
+    // closest track branch base name
+    declareProperty("CloseTrackBranchBaseName", m_ctBranchBaseName);
+    // closest track branch prefixes
+    declareProperty("CloseTrackBranchPrefixes", m_ctBranchPrefixes);
+    // keep tracks for selected (refitted) primary vertices
+    declareProperty("KeepTracksForSelectedPVs", m_keepPVTracks = false);
+    // match vertex muons with calibrated muons
+    declareProperty("MatchCalibratedMuons"    , m_matchCalMuons = false);
+    // mark orginal muons for matched calibrated muons as well
+    // (only makes sense if MatchCalibratedMuons = True)
+    declareProperty("MarkMatchedMuons"        , m_markMuons = false);
+    // mark calibrated muons for matched original muons as well
+    // (only makes sense if MatchCalibratedMuons = False)
+    declareProperty("MarkMatchedCalMuons"     , m_markCalMuons = false);
+    // sync marked muons both ways (forces it)
+    declareProperty("SyncMatchedMuonsBothWays", m_syncMuonsBothWays = false);
+    // allow fast sync of myon masks
+    // (Set to 'False' to force in-depth synchronization of muon masks.)
+    declareProperty("AllowFastMuonMaskSync"   , m_allowFastMuonMaskSync = true);
+    // keep tracks for closest tracks
+    declareProperty("KeepCloseTracks"         , m_keepCloseTracks = false);
+    // keep tracks for selected muons
+    declareProperty("KeepTracksForMuons"      , m_keepSelMuonTracks = false);
+    // keep tracks for selected calibrated muons
+    declareProperty("KeepTracksForCalMuons"   , m_keepSelCalMuonTracks = false);
+    // keep (original) muons for selected tracks
+    declareProperty("KeepMuonsForTracks"      , m_keepSelTrackMuons = false);
+    // keep calibrated muons for selected tracks
+    declareProperty("KeepCalMuonsForTracks"   , m_keepSelTrackCalMuons = false);
+    // apply AND for mask matching for vertices (default: false)
+    declareProperty("ApplyAndForVertices"     , m_vertexAnd = false);
+    // apply AND for mask matching for tracks (default: false)
+    declareProperty("ApplyAndForTracks"       , m_trackAnd = false);
+    // apply AND for mask matching for muons (default: false)
+    declareProperty("ApplyAndForMuons"        , m_muonAnd = false);
+    // thin primary vertex collection
+    declareProperty("ThinPVs"                 , m_thinPVs = true);
+    // thin refittd primary vertex collections
+    declareProperty("ThinRefittedPVs"         , m_thinRefPVs = true);
+    // thin ID track collection
+    declareProperty("ThinTracks"              , m_thinTracks = true);
+    // thin muon collections
+    declareProperty("ThinMuons"               , m_thinMuons = true);
+  }
+  //--------------------------------------------------------------------------
+  // Destructor
+  //--------------------------------------------------------------------------
+  BmumuThinningTool::~BmumuThinningTool() {
+  }
+  //--------------------------------------------------------------------------
+  // initialization
+  //--------------------------------------------------------------------------
+  StatusCode BmumuThinningTool::initialize() {
+    
+    ATH_MSG_INFO("BmumuThinningTool::initialize()");
+    
+    // check TrackParticle container name
+    if ( m_trkPartContName == "" ) {
+      ATH_MSG_INFO("No ID track collection provided for thinning.");
+    } else {
+      ATH_MSG_INFO("Using " << m_trkPartContName
+                   << " as the source collection for ID track particles.");
+      m_doTracks = true;
+    }
+    
+    // check secondary vertex container names
+    if ( m_vtxContNames.empty() ) {
+      ATH_MSG_FATAL("No secondary vertex collections provided for thinning.");
+      return StatusCode::FAILURE;
+    } else {
+      for (std::vector<std::string>::iterator it = m_vtxContNames.begin();
+           it != m_vtxContNames.end(); ++it) {
+        ATH_MSG_INFO("Using " << *it
+                     << " as a source collection for secondary vertices.");
+      }
+    }
+    
+    // check vertex pass flags
+    if ( m_alignPassToVertexList ) {
+      if ( m_vtxPassFlags.size() != m_vtxContNames.size() ) {
+        ATH_MSG_FATAL("Size mismatch of VertexContainerNames ("
+                      << m_vtxContNames.size()
+                      << ") and VertexPassFlags ("
+                      << m_vtxPassFlags.size() << ")");
+        return StatusCode::FAILURE;
+      } else {
+        ATH_MSG_INFO(std::left << std::setw(35) << "VertexContainerNames"
+                     << " : " << "VertexPassFlags");
+        ATH_MSG_INFO(std::setfill('-') << std::setw(70) << ""
+                     << std::setfill(' '));
+        for (size_t i=0; i<m_vtxContNames.size(); ++i) {
+          ATH_MSG_INFO(std::left << std::setw(35) << m_vtxContNames[i]
+                       << " : " << m_vtxPassFlags[i]);
+        }
+      }
+    } else {
+      if ( m_vtxPassFlags.empty() ) {
+        ATH_MSG_INFO("No VertexPassFlags: all secondary vertices will be "
+                     << "accepted.");
+      } else {
+        std::string str;
+        for (size_t i=0; i < m_vtxPassFlags.size(); ++i) {
+          if (i > 0) str += ", ";
+          str += m_vtxPassFlags[i];
+        }
+        ATH_MSG_INFO("VertexPassFlags applied to all vertices:");
+        ATH_MSG_INFO(str);
+      }
+    }
+    
+    // check primary vertex container name
+    if ( m_PVContName == "" ) {
+      ATH_MSG_FATAL("No primary vertex collection provided for thinning.");
+      return StatusCode::FAILURE;
+    } else {
+      ATH_MSG_INFO("Using " << m_PVContName
+                   << " as the source collection for primary vertices.");
+      m_doPVs = true;
+    }
+    
+    // check refitted primary vertex container names
+    if ( m_refPVContNames.empty() ) {
+      ATH_MSG_INFO("No refitted PV collections provided for thinning.");
+    } else {
+      if ( m_refPVContNames.size() != m_vtxContNames.size() ) {
+        ATH_MSG_FATAL("Size mismatch of VertexContainerNames ("
+                      << m_vtxContNames.size()
+                      << ") and RefPVContainerNames ("
+                      << m_refPVContNames.size() << ")");
+        return StatusCode::FAILURE;
+      } else {
+        for (std::vector<std::string>::iterator it = m_refPVContNames.begin();
+             it != m_refPVContNames.end(); ++it) {
+          ATH_MSG_INFO("Using " << *it
+                       << " as a source collection for refitted PVs.");
+        }
+        m_doRefPVs = true;
+      }
+    }
+
+    // check muon container name
+    if ( m_muonContName == "" ) {
+      ATH_MSG_INFO("No (orginal) muon collection provided for thinning.");
+    } else {
+      ATH_MSG_INFO("Using " << m_muonContName
+                   << " as a source collection for (original) muons.");
+      m_doMuons = true;
+    }
+    
+    // check calibrated muons container name
+    if ( m_calMuonContName == "" ) {
+      ATH_MSG_INFO("No calibrated muons collection provided for thinning.");
+    } else {
+      ATH_MSG_INFO("Using " << m_calMuonContName
+                   << " as a source collection for calibrated muons.");
+      m_doCalMuons = true;
+    }
+
+    // check muon thinning settings
+    if ( m_thinMuons ) {
+      if ( (m_matchCalMuons || m_markCalMuons) && !m_doCalMuons ) {
+        ATH_MSG_ERROR("No container for calibrated muons given!");
+      }
+      if ( (!m_matchCalMuons || m_markMuons) && !m_doMuons ) {
+        ATH_MSG_ERROR("No container for (original) muons given!");
+      }
+      if ( m_matchCalMuons && m_markCalMuons ) {
+        ATH_MSG_WARNING("Configuration issue: both MatchWithCalMuons and "
+                        << "MarkMatchedCalMuons set to true! "
+                        << "Ignoring the second setting.");
+      }
+      if ( !m_matchCalMuons && m_markMuons ) {
+        ATH_MSG_WARNING("Configuration issue: MatchWithCalMuons set to "
+                        << "false and "
+                        << "MarkMatchedMuons set to true! "
+                        << "Ignoring the second setting.");
+      }
+      ATH_MSG_INFO("MatchWithCalMuons: " << m_matchCalMuons
+                   << ", MarkMatchedMuons: " << m_markMuons
+                   << ", MarkMatchedCalMuons: " << m_markCalMuons);
+    }
+    
+    // check closest track settings
+    m_doCloseTracks = (m_ctBranchBaseName != "" && !m_ctBranchPrefixes.empty());
+    if ( m_doCloseTracks ) {
+      for (std::vector<std::string>::iterator it = m_ctBranchPrefixes.begin();
+           it != m_ctBranchPrefixes.end(); ++it) {
+
+        ATH_MSG_INFO("Keeping tracks for "
+                     << *it << "_" << m_ctBranchBaseName << "_*");
+      }
+    } else {
+      ATH_MSG_INFO("Not keeping anything for closest tracks in thinning.");
+    }
+    
+    // check track container for combination of track and muon thinning
+    if ( (m_thinTracks || m_thinMuons) && !m_doTracks) {
+      ATH_MSG_FATAL("Requested track or muon thinning but required "
+                    "track container not provided");
+      return StatusCode::FAILURE;
+    }
+    
+    // Output of options
+    ATH_MSG_INFO("=== Option settings - begin ===");
+    ATH_MSG_INFO("KeepTracksForSelectedPVs : " << m_keepPVTracks);
+    ATH_MSG_INFO("MatchCalibratedMuons     : " << m_matchCalMuons);
+    ATH_MSG_INFO("MarkMatchedMuons         : " << m_markMuons);
+    ATH_MSG_INFO("MarkMatchedCalMuons      : " << m_markCalMuons);
+    ATH_MSG_INFO("SyncMatchedMuonsBothWays : " << m_syncMuonsBothWays);
+    ATH_MSG_INFO("AllowFastMuonMaskSync    : " << m_allowFastMuonMaskSync);
+    ATH_MSG_INFO("KeepCloseTracks          : " << m_keepCloseTracks);
+    ATH_MSG_INFO("KeepTracksForMuons       : " << m_keepSelMuonTracks);
+    ATH_MSG_INFO("KeepTracksForCalMuons    : " << m_keepSelCalMuonTracks);
+    ATH_MSG_INFO("KeepMuonsForTracks       : " << m_keepSelTrackMuons);
+    ATH_MSG_INFO("KeepCalMuonsForTracks    : " << m_keepSelTrackCalMuons);
+    ATH_MSG_INFO("ApplyAndForVertices      : " << m_vertexAnd);
+    ATH_MSG_INFO("ApplyAndForTracks        : " << m_trackAnd);
+    ATH_MSG_INFO("ApplyAndForMuons         : " << m_muonAnd);
+    ATH_MSG_INFO("ThinPVs                  : " << m_thinPVs);
+    ATH_MSG_INFO("ThinRefittedPVs          : " << m_thinRefPVs);
+    ATH_MSG_INFO("ThinTracks               : " << m_thinTracks);
+    ATH_MSG_INFO("ThinMuons                : " << m_thinMuons);
+    ATH_MSG_INFO("=== Option settings - end ===");
+
+    
+    // initialize cache vector-of-vectors (one per vertex container)
+    for (size_t ivcname=0; ivcname < m_vtxContNames.size(); ++ivcname) {
+      m_vvOrigPVLinkNames.push_back(std::vector<std::string>());
+      m_vvOrigPVLinkTypes.push_back(std::vector<pv_type>());
+      m_vvRefPVLinkNames.push_back(std::vector<std::string>());
+      m_vvRefPVLinkTypes.push_back(std::vector<pv_type>());
+      m_vvCtLinkNames.push_back(std::vector<std::string>());
+      m_vvCtLinkTypes.push_back(std::vector<pv_type>());
+    } // for ivcname
+    
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  // finalization
+  //--------------------------------------------------------------------------
+  StatusCode BmumuThinningTool::finalize() {
+    
+    ATH_MSG_INFO("BmumuThinningTool::finalize()");
+    
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  // apply thinning
+  //--------------------------------------------------------------------------
+  StatusCode BmumuThinningTool::doThinning() const {
+
+    ATH_MSG_DEBUG("BmumuThinningTool::doThinning()");
+
+    // retrieve TrackParticle container
+    const xAOD::TrackParticleContainer* trkPartCont = nullptr;
+    std::vector<bool> trkMask;
+    if ( m_doTracks && (m_thinTracks || m_thinMuons) ) {
+      CHECK( evtStore()->retrieve(trkPartCont, m_trkPartContName) ); 
+      // default: keep no track
+      trkMask.assign(trkPartCont->size(), false);
+    }
+    
+    // retrieve PV container
+    const xAOD::VertexContainer* pvCont = nullptr;
+    std::vector<bool> pvMask;
+    if ( m_doPVs && (m_thinPVs || m_keepPVTracks) ) {
+      CHECK( evtStore()->retrieve(pvCont, m_PVContName) );
+      // default: keep no PV
+      pvMask.assign(pvCont->size(), false);
+    }
+    // retrieve refitted PV container
+    std::vector<const xAOD::VertexContainer*> vRefPvCont =
+      std::vector<const xAOD::VertexContainer*>(m_refPVContNames.size(),
+                                                nullptr);
+    std::vector<std::vector<bool> > vRefPvMasks;
+    if ( m_thinRefPVs && m_doRefPVs ) {
+      for (size_t irpv = 0; irpv < m_refPVContNames.size(); ++irpv) {
+        CHECK( evtStore()->retrieve(vRefPvCont[irpv], m_refPVContNames[irpv]) );
+        // default: keep no refitted PV
+        vRefPvMasks.push_back(std::vector<bool>(vRefPvCont[irpv]->size(),
+                                                false));
+      }
+    }
+
+    // retrieve container of (original) muons
+    const xAOD::MuonContainer* muonCont = nullptr;
+    std::vector<bool> muonMask;
+    if ( m_thinMuons && m_doMuons && (!m_matchCalMuons || m_markMuons) ) {
+      CHECK( evtStore()->retrieve(muonCont, m_muonContName) );
+      // default: keep no muon
+      muonMask.assign(muonCont->size(), false);
+    }
+    
+    // retrieve container of calibrated muons
+    const xAOD::MuonContainer* calMuonCont = nullptr;
+    std::vector<bool> calMuonMask;
+    if ( m_thinMuons && m_doCalMuons && (m_matchCalMuons || m_markCalMuons) ) {
+      CHECK( evtStore()->retrieve(calMuonCont, m_calMuonContName) );
+      // default: keep no muon
+      calMuonMask.assign(calMuonCont->size(), false);
+    }
+    
+    // retrieve vertex containers
+    for (size_t ivcname=0; ivcname < m_vtxContNames.size(); ++ivcname) {
+      auto &vtxContName = m_vtxContNames[ivcname];
+      ATH_MSG_DEBUG("doThinning(): vtxContName: " << vtxContName);
+      const xAOD::VertexContainer*    vtxCont    = nullptr;
+      const xAOD::VertexAuxContainer* vtxAuxCont = nullptr;
+      CHECK( evtStore()->retrieve(vtxCont   , vtxContName) );
+      CHECK( evtStore()->retrieve(vtxAuxCont, vtxContName+"Aux.") );
+      size_t vtxContSize = vtxCont->size();
+      std::vector<bool> vtxMask;
+      // default: keep no vertex
+      vtxMask.assign(vtxContSize, false);
+      ATH_MSG_DEBUG("doThinning(): vtxContSize: " << vtxContSize);
+      // loop over vertices
+      for (size_t ivtx = 0; ivtx < vtxContSize; ++ivtx) {
+        xAOD::BPhysHelper vtx(vtxCont->at(ivtx));
+        bool vtxPassed = false;
+        addToCounter(vtxContName+"_allVertices");
+        ATH_MSG_DEBUG("doThinning(): ivtx = " << ivtx);
+        if ( m_alignPassToVertexList ) {
+          ATH_MSG_DEBUG("doThinning(): 1: passFlag(" << ivcname << ") = "
+                        << m_vtxPassFlags[ivcname]);
+          vtxPassed = pass(*vtx.vtx(), m_vtxPassFlags[ivcname]);
+        } else {
+          for (size_t ipass = 0; ipass < m_vtxPassFlags.size(); ++ipass) {
+            ATH_MSG_DEBUG("doThinning(): 2: passFlag(" << ipass << ") = "
+                          << m_vtxPassFlags[ipass]);
+            if ( pass(*vtx.vtx(), m_vtxPassFlags[ipass]) ) {
+              vtxPassed = true;
+              break;
+            }
+          } // for ipass
+        }
+        if ( vtxPassed ) {
+          //
+          // vertex passed selection
+          //
+          ATH_MSG_DEBUG("doThinning(): ivtx " << ivtx << " passed selection");
+          vtxMask[ivtx] = true;
+          addToCounter(vtxContName+"_passedVertices");
+
+          // keep tracks from secondary vertices
+          if ( m_doTracks && (m_thinTracks || m_thinMuons) ) {
+            for (size_t itrk=0; itrk < trkPartCont->size(); ++itrk) {
+              // only consider if not yet kept
+              if ( !trkMask[itrk] ) {
+                for (size_t ivt=0; ivt < vtx.vtx()->nTrackParticles(); ++ivt) {
+                  if ( vtx.vtx()->trackParticle(ivt)
+                       == trkPartCont->at(itrk) ) {
+                    trkMask[itrk] = true;
+                    addToCounter(vtxContName+"_accTracks");
+                  }
+                } // for trk
+              }
+            } // for itrk
+          } // if m_doTracks
+	  
+          // find aux variable names for closest tracks
+          if ( (m_thinTracks || m_thinMuons) && m_keepCloseTracks
+               && m_doCloseTracks && m_vvCtLinkNames[ivcname].empty() ) {
+            std::string prefix =
+              m_vtxContNames[ivcname]+"_"+m_ctBranchBaseName;
+            ATH_MSG_DEBUG("doThinning(): CT basename: " << prefix);
+            selectAuxElements(vtxAuxCont, m_vvCtLinkNames[ivcname],
+                              m_ctBranchPrefixes,
+                              m_vvCtLinkTypes[ivcname],
+                              "_"+m_ctBranchBaseName+".*._Link");
+            if ( msgLvl(MSG::INFO) ) {
+              std::string sAuxVars =
+                dumpVS(m_vvCtLinkNames[ivcname],
+                       "doThinning(): "+vtxContName+": CT aux vars: ("
+                       +std::to_string(m_vvCtLinkNames[ivcname].size())+")",
+                       4);
+              logWrappedMsg(sAuxVars, MSG::INFO);
+            }
+          }
+
+          // keep tracks identified as closest tracks
+          if ( (m_thinTracks || m_thinMuons) && m_doTracks && m_keepCloseTracks
+               && m_doCloseTracks ) {
+            for (size_t i = 0; i < m_vvCtLinkNames[ivcname].size(); ++i) {
+              const xAOD::TrackParticle* closeTrack =
+                getTrackParticle(vtx.vtx(), m_vvCtLinkNames[ivcname][i]);
+              if ( closeTrack == nullptr ) continue;
+              auto tpit = std::find(trkPartCont->begin(), trkPartCont->end(),
+                                    closeTrack);
+              if ( tpit == trkPartCont->end() ) {
+                ATH_MSG_WARNING("ClosestTrack not found in "
+                                << m_trkPartContName
+                                << " for " << m_vvCtLinkNames[ivcname][i]);
+                continue;
+              }
+              size_t x = std::distance(trkPartCont->begin(), tpit);
+              if ( !trkMask.at(x) ) {
+                trkMask.at(x) = true;
+                addToCounter(vtxContName+"_addTracksByCT");
+              }
+            } // for i (CT link names)
+          } // if
+	    
+          // find aux variable names for original PVs
+          if ( m_thinPVs && m_vvOrigPVLinkNames[ivcname].empty() ) {	    
+            selectAuxElements(vtxAuxCont, m_vvOrigPVLinkNames[ivcname],
+                              m_vvOrigPVLinkTypes[ivcname], "OrigPv.*.Link");
+            if ( msgLvl(MSG::INFO) ) {
+              std::string sAuxVars =
+                dumpVS(m_vvOrigPVLinkNames[ivcname],
+                       "doThinning(): "+vtxContName+": OrigPV aux vars: ("
+                       +std::to_string(m_vvOrigPVLinkNames[ivcname].size())+")",
+                       4);
+              logWrappedMsg(sAuxVars, MSG::INFO);
+            }
+          }
+          // find aux variable names for refitted PVs
+          if ( m_thinRefPVs && m_vvRefPVLinkNames[ivcname].empty() ) {
+            selectAuxElements(vtxAuxCont, m_vvRefPVLinkNames[ivcname],
+                              m_vvRefPVLinkTypes[ivcname], "Pv.*.Link");
+            if ( msgLvl(MSG::INFO) ) {
+              std::string sAuxVars =
+                dumpVS(m_vvRefPVLinkNames[ivcname],
+                       "doThinning() :"+vtxContName+": RefPV aux vars: ("
+                       +std::to_string(m_vvRefPVLinkNames[ivcname].size())+")",
+                       4);
+              logWrappedMsg(sAuxVars, MSG::INFO);
+            }
+          }
+
+          // debug stuff
+          if ( msgLvl(MSG::VERBOSE) ) {
+            std::vector<std::string> auxVars =
+              filterAuxElements(vtxAuxCont, ".*Link");
+            std::string sAuxVars =
+              dumpVS(auxVars,
+                     "doThinning(): "+vtxContName+": vtxAuxContVarNames:", 4);
+            logWrappedMsg(sAuxVars, MSG::DEBUG);
+          }
+
+          // now mark associated PVs
+          if ( m_thinPVs && m_doPVs ) {
+            for (size_t i = 0; i < m_vvOrigPVLinkTypes[ivcname].size(); ++i) {
+              const xAOD::Vertex* origPv =
+                vtx.origPv(m_vvOrigPVLinkTypes[ivcname][i]);
+              if ( origPv == nullptr ) continue;
+              auto pvit = std::find(pvCont->begin(), pvCont->end(), origPv);
+              if ( pvit == pvCont->end() ) {
+                ATH_MSG_WARNING("PV not found in " << m_PVContName
+                                << " for " << m_vvOrigPVLinkNames[ivcname][i]);
+                continue;
+              }
+              size_t x = std::distance(pvCont->begin(), pvit);
+              if ( !pvMask.at(x) ) {
+                pvMask.at(x) = true;
+                addToCounter(vtxContName+"_accAssocPVs");
+              }
+              // keep tracks for selected PVs
+              if ( (m_thinTracks || m_thinMuons) && m_doTracks && m_keepPVTracks ) {
+                for (size_t ipvt=0; ipvt < (*pvit)->nTrackParticles();
+                     ++ipvt) {
+                  const xAOD::TrackParticle* tp = (*pvit)->trackParticle(ipvt);
+                  if ( tp == nullptr ) continue;
+                  auto tpit = std::find(trkPartCont->begin(),
+                                        trkPartCont->end(), tp);
+                  if ( tpit == trkPartCont->end() ) {
+                    ATH_MSG_WARNING("PV track not found in "
+                                    << m_trkPartContName << " for PV from "
+                                    << m_PVContName);
+                    continue;
+                  }
+                  size_t x = std::distance(trkPartCont->begin(), tpit);
+                  if ( !trkMask.at(x) ) {
+                    trkMask.at(x) = true;
+                    addToCounter(vtxContName+"_addTracksBySelPVs");
+                  }
+                } // for ipvt
+              } // if m_keepPVTracks
+            } // for i (PVs)
+          } // if m_thinPVs && m_doPVs
+	  
+          // now mark associated refittedPVs
+          if ( m_thinRefPVs && m_doRefPVs ) {
+            for (size_t i = 0; i < m_vvRefPVLinkTypes[ivcname].size(); ++i) {
+              const xAOD::Vertex* refPv =
+                vtx.pv(m_vvRefPVLinkTypes[ivcname][i]);
+              if ( refPv == nullptr ) continue;
+              auto pvit = std::find(vRefPvCont[ivcname]->begin(),
+                                    vRefPvCont[ivcname]->end(), refPv);
+              if ( pvit == vRefPvCont[ivcname]->end() ) {
+                ATH_MSG_WARNING("PV not found in " << m_refPVContNames[ivcname]
+                                << " for " << m_vvRefPVLinkNames[ivcname][i]);
+                continue;
+              }
+              size_t x = std::distance(vRefPvCont[ivcname]->begin(), pvit);
+              if ( !vRefPvMasks[ivcname].at(x) ) {
+                vRefPvMasks[ivcname].at(x) = true;
+                addToCounter(vtxContName+"_accAssocRefPVs");
+              }
+              // keep tracks for associated refitted PVs
+              if ( (m_thinTracks || m_thinMuons) && m_doTracks
+                   && m_keepPVTracks ) {
+                for (size_t ipvt=0; ipvt < (*pvit)->nTrackParticles();
+                     ++ipvt) {
+                  const xAOD::TrackParticle* tp = (*pvit)->trackParticle(ipvt);
+                  if ( tp == nullptr ) continue;
+                  auto tpit = std::find(trkPartCont->begin(),
+                                        trkPartCont->end(), tp);
+                  if ( tpit == trkPartCont->end() ) {
+                    ATH_MSG_WARNING("Refitted PV track not found in "
+                                    << m_trkPartContName
+                                    << " for refitted PV from "
+                                    << m_refPVContNames[ivcname][i]);
+                    continue;
+                  }
+                  size_t x = std::distance(trkPartCont->begin(), tpit);
+                  if ( !trkMask.at(x) ) {
+                    trkMask.at(x) = true;
+                    addToCounter(vtxContName+"_addTracksByAssocRefPVs");
+                  }
+                } // for ipvt
+              } // if (m_thinTracks || m_thinMuons) && m_doTracks
+              //   && m_keepPVTracks
+            } // for i (refPVs)
+          } // if m_thinRefPVs && m_doRefPVs
+	  
+          // keep muons from secondary vertices
+          if ( m_thinMuons ) {
+            if ( m_matchCalMuons ) { // calibrated muons collection
+              if ( m_doCalMuons ) {
+                addToCounter(vtxContName+"_accCalMuons_calls");
+                CHECK( matchMuons(calMuonCont, calMuonMask, vtx,
+                                  vtxContName+"_accCalMuons") );
+              }
+            } else { // original muons collection
+              if ( m_doMuons ) {
+                addToCounter(vtxContName+"_accMuons_calls");
+                CHECK( matchMuons(muonCont, muonMask, vtx,
+                                  vtxContName+"_accMuons") );
+              }
+            } // if m_matchCalMuons
+          } // if m_thinMuons
+        } else {
+          ATH_MSG_DEBUG("doThinning(): ivtx " << ivtx
+                        << " did not pass selection");
+        }
+      } // for ivtx (B vertex)
+      
+      // Apply the thinning service based on vtxMask
+      CHECK( applyThinMask(vtxCont, vtxMask, m_vertexAnd, vtxContName) );
+			         
+    } // for m_vtxContNames
+
+    // Keep tracks for all PVs (i.e. if all PVs are kept)
+    if ( (m_thinTracks || m_thinMuons) && m_doTracks && m_keepPVTracks &&
+         !m_thinPVs && m_doPVs ) {
+      for (auto &pv : *pvCont) {
+        for (size_t ipvt=0; ipvt < pv->nTrackParticles(); ++ipvt) {
+          const xAOD::TrackParticle* tp = pv->trackParticle(ipvt);
+          if ( tp == nullptr ) continue;
+          auto tpit = std::find(trkPartCont->begin(), trkPartCont->end(), tp);
+          if ( tpit == trkPartCont->end() ) {
+            ATH_MSG_WARNING("PV track not found in "
+                            << m_trkPartContName << " for PV from "
+                            << m_PVContName);
+            continue;
+          }
+          size_t x = std::distance(trkPartCont->begin(), tpit);
+          if ( !trkMask.at(x) ) {
+            trkMask.at(x) = true;
+            addToCounter("addTracksByAllPVs");
+          }
+        } // for ipvt
+      } // for pv
+    } // if m_keepPVTracks && m_doTracks && m_keepPVTracks && !m_thinPVs
+
+    // Keep (original) muons for selected ID tracks
+    if (m_keepSelTrackMuons && m_thinMuons && m_doMuons && m_doTracks) {
+      CHECK( markMuonsForSelTracks(trkPartCont, trkMask, muonCont, muonMask,
+                                   "addMuonsBySelTracks") );
+    }
+    
+    // Keep (original) muons for selected ID tracks
+    if (m_keepSelTrackCalMuons && m_thinMuons && m_doCalMuons && m_doTracks) {
+      CHECK( markMuonsForSelTracks(trkPartCont, trkMask, calMuonCont,
+                                   calMuonMask, "addCalMuonsBySelTracks") );
+    }
+    
+    // mark 'other' muon container elements if requested
+    if ( m_thinMuons ) {
+      if ( m_syncMuonsBothWays || m_matchCalMuons ) {
+        // calibrated muons -> original muons
+        if ( (m_markMuons || m_syncMuonsBothWays)
+             && m_doMuons && m_doCalMuons) {
+          CHECK( markOrigMuons(muonCont, calMuonCont, muonMask, calMuonMask,
+                               "addMarkedMuons", m_allowFastMuonMaskSync) );
+        }
+      } // if m_syncMuonsBothWays || m_matchCalMuons ) {
+      if ( m_syncMuonsBothWays || !m_matchCalMuons ) {
+        // 'orignal' muons -> calibrated muons
+        if ( (m_markCalMuons || m_syncMuonsBothWays)
+             && m_doCalMuons && m_doMuons ) {
+          CHECK( markCalibMuons(muonCont, calMuonCont, muonMask, calMuonMask,
+                                "addMarkedCalMuons", m_allowFastMuonMaskSync) );
+        }
+      } // if m_syncMuonsBothWays || !m_matchCalMuons ) {
+    } // if m_thinMuons
+
+    // Keep tracks for selected (original) muons
+    if ( (m_thinTracks || m_thinMuons) && m_doTracks && m_keepSelMuonTracks
+         && m_doMuons ) {
+      CHECK( markTrksForSelMuons(trkPartCont, trkMask, muonCont, muonMask,
+                                 "addTracksBySelMuons") );
+    } // if (m_thinTracks || m_thinMuons) && m_doTracks && m_keepSelMuonTracks
+    //   && m_doMuons
+    
+    // Keep tracks for selected (calibrated) muons
+    if ( (m_thinTracks || m_thinMuons)  && m_doTracks && m_keepSelCalMuonTracks
+         && m_doCalMuons ) {
+      CHECK( markTrksForSelMuons(trkPartCont, trkMask, calMuonCont,
+                                 calMuonMask, "addTracksBySelCalMuons") );
+    } // if (m_thinTracks || m_thinMuons) && m_doTracks
+    //   && m_keepSelCalMuonTracks && m_doCalMuons
+    
+    // debug: check muon masks' consistency
+    if ( msgLvl(MSG::DEBUG) ) {
+      std::string msg =
+        checkMaskConsistency(muonMask, calMuonMask,
+                             m_muonContName+"Mask",
+                             m_calMuonContName+"Mask",
+                             "Muon mask consistency check:");
+      logWrappedMsg(msg, MSG::DEBUG);
+    }
+    
+    // Apply the thinning service for TrackParticles based on trkMask
+    if ( m_thinTracks && m_doTracks ) {
+      addToCounter(m_trkPartContName+"_allTracks", trkPartCont->size());
+      addToCounter(m_trkPartContName+"_passedTracks",
+                   std::accumulate(trkMask.begin(), trkMask.end(), 0));      
+      CHECK( applyThinMask(trkPartCont, trkMask, m_trackAnd,
+                           m_trkPartContName) );
+    } // if m_thinTracks && m_doTracks
+    
+    // Apply the thinning service for PVs based on pvMask
+    if ( m_thinPVs && m_doPVs ) {
+      addToCounter(m_PVContName+"_allVertices", pvCont->size());
+      addToCounter(m_PVContName+"_passedVertices",
+                   std::accumulate(pvMask.begin(), pvMask.end(), 0));      
+      CHECK( applyThinMask(pvCont, pvMask, m_vertexAnd, m_PVContName) );
+    } // if m_doPVs
+
+    // Apply the thinning service for refPVs based on vRefPvMasks
+    if ( m_thinRefPVs && m_doRefPVs ) {
+      for (size_t irpv = 0; irpv < m_refPVContNames.size(); ++irpv) {
+        addToCounter(m_refPVContNames[irpv]+"_allVertices",
+                     vRefPvCont[irpv]->size());
+        addToCounter(m_refPVContNames[irpv]+"_passedVertices",
+                     std::accumulate(vRefPvMasks[irpv].begin(),
+                                     vRefPvMasks[irpv].end(), 0));
+        CHECK( applyThinMask(vRefPvCont[irpv], vRefPvMasks[irpv],
+                             m_vertexAnd, m_refPVContNames[irpv]) );
+      } // for irpv
+    } // if m_doRefPVs
+    
+    // Apply the thinning service for (original) Muons based on muonMask
+    if ( m_thinMuons && m_doMuons ) {
+      addToCounter(m_muonContName+"_allMuons", muonCont->size());
+      addToCounter(m_muonContName+"_passedMuons",
+                   std::accumulate(muonMask.begin(), muonMask.end(), 0));      
+      CHECK( applyThinMask(muonCont, muonMask, m_muonAnd,
+                           m_muonContName) );
+    } // if m_thinMuons && m_doMuons
+    
+    // Apply the thinning service for calibrated Muons based on calMuonMask
+    if ( m_thinMuons && m_doCalMuons ) {
+      addToCounter(m_calMuonContName+"_allMuons", calMuonCont->size());
+      addToCounter(m_calMuonContName+"_passedMuons",
+                   std::accumulate(calMuonMask.begin(), calMuonMask.end(),
+                                   0));      
+      CHECK( applyThinMask(calMuonCont, calMuonMask, m_muonAnd,
+                           m_calMuonContName) );
+    } // if m_thinMuons && m_doCalMuons
+    
+    return StatusCode::SUCCESS;    
+  }
+
+  //--------------------------------------------------------------------------
+  // Helper to apply thinning service mask -- for all Containers
+  //--------------------------------------------------------------------------
+  template<typename TYPE>
+  StatusCode
+  BmumuThinningTool::applyThinMask(SG::ThinningHandle<TYPE> &muCont,
+                                   const std::vector<bool>& muMask,
+                                   bool doAnd) const {
+    
+    if (doAnd) {
+      ATH_MSG_DEBUG("doThinning(): apply thinning (AND) for " << muCont.key());
+      muCont.keep(muMask, SG::ThinningHandleBase::Op::And);
+    } else {
+      ATH_MSG_DEBUG("doThinning(): apply thinning (OR) for " << muCont.key());
+      muCont.keep(muMask, SG::ThinningHandleBase::Op::Or);
+    }
+    return StatusCode::SUCCESS;
+  }					      
+  //--------------------------------------------------------------------------
+  // Helper to check whether an element is marked as passing a specific
+  // hypothesis.
+  //--------------------------------------------------------------------------
+  bool BmumuThinningTool::pass(const SG::AuxElement& em, std::string hypo)
+    const {
+    
+    if ( !boost::algorithm::starts_with(hypo, "passed_") )
+      hypo = "passed_" + hypo;
+    SG::AuxElement::Accessor<Char_t> flagAcc(hypo);
+    return flagAcc.isAvailable(em) && flagAcc(em) != 0;
+  }
+  //--------------------------------------------------------------------------
+  // Helper to get a TrackParticle link
+  //-------------------- ------------------------------------------------------
+  const xAOD::TrackParticle*
+  BmumuThinningTool::getTrackParticle(const xAOD::Vertex* vtx,
+                                      std::string name) const {
+    SG::AuxElement::Accessor<TrackParticleLink> tpLinkAcc(name);
+    if (!tpLinkAcc.isAvailable(*vtx)) {
+      return nullptr;
+    }
+    const TrackParticleLink& tpLink = tpLinkAcc(*vtx);
+    if (!tpLink.isValid()) {
+      return nullptr;
+    }
+    return *tpLink;
+  }
+  //--------------------------------------------------------------------------
+  // Helper to filter all names of auxillary elements of an aux container
+  // according to a certain pattern.  The pattern must be a regular
+  // expression pattern.
+  //--------------------------------------------------------------------------
+  std::vector<std::string>
+  BmumuThinningTool::filterAuxElements(const xAOD::AuxContainerBase* auxCont,
+                                       std::string pattern) const {
+    
+    SG::AuxTypeRegistry& reg = SG::AuxTypeRegistry::instance();
+
+    std::vector<std::string> vElNames;
+    std::regex re(pattern);
+
+    const SG::auxid_set_t& auxids = auxCont->getAuxIDs();
+    for ( SG::auxid_t auxid : auxids ) {
+      const std::string name = reg.getName(auxid);
+      if ( std::regex_match(name, re) ) {
+        vElNames.push_back(name);
+      }
+    } // for auxids
+
+    return vElNames;
+  }
+  //--------------------------------------------------------------------------
+  // Determine aux elements to be looked at -- for (refitted) PVs
+  //--------------------------------------------------------------------------
+  void
+  BmumuThinningTool::selectAuxElements(const xAOD::AuxContainerBase* auxCont,
+                                       std::vector<std::string>& vLinkNames,
+                                       std::vector<pv_type>&     vLinkTypes,
+                                       std::string pattern) const {
+    // find aux element names matching pattern
+    std::vector<std::string> vAuxNames =
+      filterAuxElements(auxCont, pattern);
+
+    // select aux element names matching our PV-to-SV association types
+    for (auto &name : vAuxNames) {
+      for (size_t ipvt=0; ipvt < xAOD::BPhysHelper::n_pv_types; ++ipvt) {
+        if ( name.find(PvTypeToVarNameMap[(pv_type)ipvt]
+                       +"Link") != std::string::npos) {
+          vLinkNames.push_back(name);
+          vLinkTypes.push_back((pv_type)ipvt);
+        }
+      } // for ipvt
+    } // for name
+  }  
+  //--------------------------------------------------------------------------
+  // Determine aux elements to be looked at -- for closest tracks
+  //--------------------------------------------------------------------------
+  void
+  BmumuThinningTool::selectAuxElements(const xAOD::AuxContainerBase* auxCont,
+                                       std::vector<std::string>& vLinkNames,
+                                       std::vector<std::string>  vPrefixes,
+                                       std::vector<pv_type>&     vLinkTypes,
+                                       std::string pattern) const {
+    // find aux element names matching pattern
+    std::vector<std::string> vAuxNames;
+    for (auto &prefix : vPrefixes) {
+      std::string cpat = prefix+pattern;
+      std::vector<std::string> vMoreAuxNames =
+        filterAuxElements(auxCont, cpat);
+      vAuxNames.insert(vAuxNames.end(), vMoreAuxNames.begin(),
+                       vMoreAuxNames.end());
+    } // for prefix
+
+    // select aux element names matching our PV-to-SV association types
+    for (auto &name : vAuxNames) {
+      for (size_t ipvt=0; ipvt < xAOD::BPhysHelper::n_pv_types; ++ipvt) {
+        std::regex re(".*"+xAOD::BPhysHelper::pv_type_str[ipvt]+".*_Link");
+        if ( std::regex_match(name, re) ) {
+          vLinkNames.push_back(name);
+          vLinkTypes.push_back((pv_type)ipvt);
+        }
+      } // for ipvt
+    } // for name
+  }  
+  //--------------------------------------------------------------------------
+  // Mark muons matched to secondary vertices
+  //--------------------------------------------------------------------------
+  StatusCode
+  BmumuThinningTool::matchMuons(const xAOD::MuonContainer* muCont,
+                                std::vector<bool>& muMask,
+                                xAOD::BPhysHelper& vtx,
+                                std::string counterName) const {
+
+    for (size_t imu=0; imu < muCont->size(); ++imu) {
+      // only consider if not yet kept
+      if ( !muMask[imu] ) {
+        for (int ivm=0; ivm < vtx.nMuons(); ++ivm) {
+          if ( vtx.muon(ivm) == muCont->at(imu) ) {
+            muMask[imu] = true;
+            addToCounter(counterName);
+          }
+        } // for ivm
+      }
+    } // for imu
+    return StatusCode::SUCCESS;
+  }					      
+  //--------------------------------------------------------------------------
+  // Mark original muons for accepted calibrated muons
+  //--------------------------------------------------------------------------
+  StatusCode
+  BmumuThinningTool::markOrigMuons(const xAOD::MuonContainer* muCont,
+                                   const xAOD::MuonContainer* cmuCont,
+                                   std::vector<bool>& muMask,
+                                   std::vector<bool>& cmuMask,
+                                   std::string counterName,
+                                   bool allowFastSync) const {
+
+    bool fastSync = allowFastSync;
+    // go to slow sync if muon mask sizes do not match
+    if ( muMask.size() != cmuMask.size() ) {
+      fastSync = false;
+      addToCounter(counterName+"_maskSizeMismatches");
+    }
+    
+    for (size_t imu=0; imu < cmuMask.size(); ++imu) {
+      if ( cmuMask[imu] ) {
+        if ( fastSync ) {
+          if ( !muMask[imu] ) {
+            muMask[imu] = true;
+            addToCounter(counterName);
+          }	  
+        } else {
+          const xAOD::Muon* cMuon = cmuCont->at(imu);
+          if ( cMuon != nullptr ) {
+            const xAOD::Muon* oMuon =
+              (const xAOD::Muon*)xAOD::getOriginalObject(*cMuon);
+            if ( oMuon != nullptr ) {
+              auto muit = std::find(muCont->begin(), muCont->end(), oMuon);
+              if ( muit == muCont->end() ) {
+                ATH_MSG_WARNING("Muon not found in " << m_muonContName
+                                << " for calibrated muon index " << imu);
+              } else {
+                size_t x = std::distance(muCont->begin(), muit);
+                if ( !muMask.at(x) ) {
+                  muMask.at(x) = true;
+                  addToCounter(counterName);
+                }
+              }
+            } else {
+              ATH_MSG_WARNING("No orignal muon for calibrated muon index "
+                              << imu);
+            }
+          } else {
+            ATH_MSG_WARNING("No calibrated muon for index " << imu);
+          }
+        } // if fastSync
+      }
+    } // for imu
+    return StatusCode::SUCCESS;
+  }    
+  //--------------------------------------------------------------------------
+  // Mark calibrated muons for accepted (original) muons
+  //--------------------------------------------------------------------------
+  StatusCode
+  BmumuThinningTool::markCalibMuons(const xAOD::MuonContainer* muCont,
+                                    const xAOD::MuonContainer* cmuCont,
+                                    std::vector<bool>& muMask,
+                                    std::vector<bool>& cmuMask,
+                                    std::string counterName,
+                                    bool allowFastSync) const {
+    
+    bool fastSync = allowFastSync;
+    // go to slow sync if muon mask sizes do not match
+    if ( muMask.size() != cmuMask.size() ) {
+      fastSync = false;
+      addToCounter(counterName+"_maskSizeMismatches");
+    }
+    
+    for (size_t imu=0; imu < muMask.size(); ++imu) {
+      if ( muMask[imu] ) {
+        if ( fastSync ) {
+          if ( !cmuMask[imu] ) {
+            cmuMask[imu] = true;
+            addToCounter(counterName);
+          }	  
+        } else {
+          const xAOD::Muon* oMuon = muCont->at(imu);
+          if ( oMuon != nullptr ) {
+            bool found = false;
+            for (size_t icmu = 0; icmu < cmuCont->size(); ++icmu) {
+              const xAOD::Muon* cMuon = cmuCont->at(icmu);
+              if ( cMuon != nullptr ) {
+                const xAOD::Muon* aMuon =
+                  (const xAOD::Muon*)xAOD::getOriginalObject(*cMuon);
+                if ( aMuon == oMuon ) {
+                  found = true;
+                  if ( !cmuMask.at(icmu) ) {
+                    cmuMask.at(icmu) = true;
+                    addToCounter(counterName);
+                  }
+                }
+              } else {
+                ATH_MSG_WARNING("No calibrated muon for calibrated "
+                                << "muon index " << icmu);
+              }
+            } // for icmu
+            if ( !found ) {
+              ATH_MSG_WARNING("No calibrated muon found for orignal "
+                              << "muon index " << imu);
+            }
+          } else {
+            ATH_MSG_WARNING("No (original) muon for index " << imu);
+          }
+        } // if fastSync
+      }
+    } // for imu
+    return StatusCode::SUCCESS;
+  }    
+  //--------------------------------------------------------------------------
+  // Mark ID tracks of selected (original or calibrated) muons
+  //--------------------------------------------------------------------------
+  StatusCode
+  BmumuThinningTool::markTrksForSelMuons(const xAOD::TrackParticleContainer*
+                                         trkPartCont,
+                                         std::vector<bool>& trkMask,
+                                         const xAOD::MuonContainer* muCont,
+                                         std::vector<bool>& muMask,
+                                         std::string counterName) const {
+    
+    for (size_t itrk=0; itrk < trkPartCont->size(); ++itrk) {
+      if ( trkMask[itrk] ) continue;
+      const xAOD::TrackParticle* tp = trkPartCont->at(itrk);
+      if ( tp == nullptr ) continue;
+      for (size_t imu=0; imu < muCont->size(); ++imu) {
+        if ( muMask[imu] ) {
+          const xAOD::Muon* muon = muCont->at(imu);
+          if ( muon != nullptr ) {
+            const xAOD::TrackParticle* mutp =
+              muon->trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
+            if ( mutp == tp ) {
+              trkMask[itrk] = true;
+              addToCounter(counterName);
+            }
+          }
+        }
+      } // for imu
+    } // for itrk
+    return StatusCode::SUCCESS;
+  }
+  //--------------------------------------------------------------------------
+  // Mark muons for selected ID tracks
+  //--------------------------------------------------------------------------
+  StatusCode
+  BmumuThinningTool::markMuonsForSelTracks(const xAOD::TrackParticleContainer*
+                                           trkPartCont,
+                                           std::vector<bool>& trkMask,
+                                           const xAOD::MuonContainer* muCont,
+                                           std::vector<bool>& muMask,
+                                           std::string counterName) const {
+
+    for (size_t imu=0; imu < muCont->size(); ++imu) {
+      if ( muMask[imu] ) continue;
+      const xAOD::Muon* muon = muCont->at(imu);
+      if ( muon == nullptr ) continue;
+      const xAOD::TrackParticle* mutp =
+        muon->trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
+      if ( mutp == nullptr) continue;
+      auto tpit = std::find(trkPartCont->begin(), trkPartCont->end(), mutp);
+      if ( tpit == trkPartCont->end() ) {
+        ATH_MSG_WARNING("Muon track not found in " << m_trkPartContName
+                        << " for counter " << counterName);
+        addToCounter(counterName+"_missingTracksForMuons");
+        continue;
+      }
+      size_t x = std::distance(trkPartCont->begin(), tpit);
+      if ( trkMask.at(x) ) {
+        muMask[imu] = true;
+        addToCounter(counterName);
+      }
+    } // for imu
+    return StatusCode::SUCCESS;
+  }
+  
+  //--------------------------------------------------------------------------
+  // Check two masks for consistency
+  //--------------------------------------------------------------------------
+  std::string
+  BmumuThinningTool::checkMaskConsistency(const std::vector<bool>& mask1,
+                                          const std::vector<bool>& mask2,
+                                          const std::string name1,
+                                          const std::string name2,
+                                          const std::string header) const {
+
+    bool sizesMatch = (mask1.size() == mask2.size());
+    int  nTrueMask1 = std::accumulate(mask1.begin(), mask1.end(), 0);      
+    int  nTrueMask2 = std::accumulate(mask2.begin(), mask2.end(), 0);      
+
+    std::string basecname = name1+"_"+name2;
+    
+    int nEntryMismatches(0);
+    int nMoreTrueMask1(0);
+    int nMoreTrueMask2(0);
+    for (size_t i=0; i < std::min(mask1.size(), mask2.size()); ++i) {
+      if ( mask1[i] != mask2[i]  ) nEntryMismatches++;
+      if ( mask1[i] && !mask2[i] ) nMoreTrueMask1++; 
+      if ( !mask1[i] && mask2[i] ) nMoreTrueMask2++; 
+    }
+    
+    std::string str(header);
+    if ( str.length() > 0 ) str += "\n";
+    if ( sizesMatch && nTrueMask1 == nTrueMask2 && nEntryMismatches == 0 ) {
+      str += "Masks match OK: "+name1+" ("+mask1.size()+") : "
+        + name2+" ("+mask2.size()+")";
+      addToCounter(basecname+"_matchedOK");
+    } else {
+      str += "Masks do NOT match: "+name1+" ("+mask1.size()+") : "
+        + name2+" ("+mask2.size()+")";
+      str += "\nnTrueMask1: "+std::to_string(nTrueMask1)
+        +", nTrueMask2: "+std::to_string(nTrueMask2);
+      str += "\nnEntryMismatches: "+std::to_string(nEntryMismatches)
+        +"nMoreTrueMas1: "+std::to_string(nMoreTrueMask1)
+        +", nMoreTrueMask2: "+std::to_string(nMoreTrueMask2); 
+      addToCounter(basecname+"_NOTmatched");
+      if (!sizesMatch) addToCounter(basecname+"_sizeMismatch");
+      addToCounter(basecname+"_nEntryMismatches", nEntryMismatches);
+      addToCounter(basecname+"_nMoreTrueMask1", nMoreTrueMask1);
+      addToCounter(basecname+"_nMoreTrueMask2", nMoreTrueMask2);
+    }
+    return str;
+  }
+  //--------------------------------------------------------------------------
+  // Dump a vector<string> to string.
+  //--------------------------------------------------------------------------
+  std::string BmumuThinningTool::dumpVS(const std::vector<std::string>& vs,
+                                        const std::string header,
+                                        size_t nBlanks) const {
+    std::string str(header);
+    for (const std::string& s : vs) {
+      if ( str.length() > 0 ) str += "\n"; 
+      str += std::string(nBlanks, ' ') + s;
+    } // for s
+    
+    return str;
+  }					
+  //--------------------------------------------------------------------------
+  // Wrap string at line breaks and print with appropriate message level
+  //--------------------------------------------------------------------------
+  void BmumuThinningTool::logWrappedMsg(const std::string& str,
+                                        const MSG::Level lvl) const {
+    std::istringstream isstr(str);
+    std::string s;
+    while (std::getline(isstr, s)) {
+      msg(lvl) << s << endreq;
+    }    
+  }
+  //--------------------------------------------------------------------------
+
+} // namespace DerivationFramework
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Bmumu_metadata.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Bmumu_metadata.cxx
new file mode 100644
index 000000000000..5d45a327e69c
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Bmumu_metadata.cxx
@@ -0,0 +1,238 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+/** 
+ *  @file   Bmumu_metadata.cxx
+ *  @author Wolfgang Walkowiak <wolfgang.walkowiak@cern.ch>
+ */
+
+#include "DerivationFrameworkBPhys/Bmumu_metadata.h"
+
+namespace DerivationFramework {
+
+  //--------------------------------------------------------------------------
+  Bmumu_metadata::Bmumu_metadata(const std::string& t,
+				 const std::string& n,
+				 const IInterface*  p) : 
+    AthAlgTool(t,n,p), BPhysMetadataBase(t,n,p) {
+
+    // configuration defaults etc.
+    recordPropertyI("verbose", 0);
+    recordPropertyB("isSimulation", false);
+    recordPropertyS("projectTag", "__NONE__");
+    recordPropertyB("isRelease21" , true);
+    recordPropertyS("mcCampaign", "__NONE__");
+    recordPropertyS("triggerStream", "__NONE__");
+    
+    // MC dataset number lists
+    recordPropertyVI("mcBsmumu"         , {});
+    recordPropertyVI("mcBplusJpsiKplus" , {});
+    recordPropertyVI("mcBsJpsiPhi"      , {});
+    recordPropertyVI("mcBplusJpsiPiplus", {});
+    recordPropertyVI("mcBhh"            , {});
+
+    // MC datasets without trigger information
+    recordPropertyVI("mcNoTrigger"     , {});
+
+    // special data runs
+    recordPropertyVI("specDataRuns", {});
+    
+    // special MC channels
+    recordPropertyVI("specMcChannels", {});
+    
+    // blind search
+    recordPropertyB("doBmumuBlinding"       , true);
+    recordPropertyB("doCutBlinded"          , true);
+    recordPropertyB("blindOnlyAllMuonsTight", true);
+    recordPropertyS("BlindingKey"           , "");
+    recordPropertyS("BlindedVars"           , "");
+    recordPropertyS("BlindingFlag"          , "");
+    
+    // include trigger
+    recordPropertyB("doTriggerInfo"  , true);
+
+    // include soft B tagging vertex containers
+    recordPropertyB("doAddSoftBVertices"    , true);
+
+    // trigger navigation thinning
+    recordPropertyB("doTrigNavThinning", true);
+    recordPropertyVS("TrigNavThinList" , {});
+
+    // wide mumu mass range
+    recordPropertyB("doUseWideMuMuMassRange", false);
+
+    // use mass calculated using the combined muon track information in cuts?
+    recordPropertyB("useMuCalcMass",    true);
+
+    // use calibrated muons instead of the original ones
+    recordPropertyI("useCalibratedMuons", 0);
+
+    // adjust primary track to muon kinematics for MUCALC mass
+    recordPropertyB("adjustMucalcKinematics", false);
+
+    // add MUCALC mass from non-modified muons for debugging
+    recordPropertyB("addMucalcMassForDebug", false);
+
+    // primary vertex types to consider for MinChi2ToAnyPV
+    recordPropertyVI("MinChi2ToAnyPVTypes", {1, 3});
+    
+    // JpsiFinder: muAndMu or TrackAndTrack option?
+    recordPropertyB("JfTwoMuons" , true );
+    recordPropertyB("JfTwoTracks", false);
+
+    // JpsiFinder: TrackThresholdPt
+    recordPropertyD("JfTrackThresholdPt", 0.);
+    
+    // muon calibration and smearing tool configuration
+    recordPropertyS("McstYear"                 , "Data16");
+    recordPropertyS("McstRelease"              , "_NONE_");
+    recordPropertyB("McstStatComb"             , true);
+    recordPropertyB("McstSagittaCorr"          , true);
+    recordPropertyS("McstSagittaRelease"       , "_NONE_");
+    recordPropertyB("McstDoSagittaMCDistortion", false);
+    recordPropertyB("McstSagittaCorrPhaseSpace", true);
+    
+    // muon collections
+    recordPropertyS("MuonCollection"     , "Muons");
+    recordPropertyS("CalMuonCollection"  , "Muons");
+    recordPropertyS("UsedMuonCollection" , "Muons");
+    recordPropertyVS("AllMuonCollections", {}     );
+
+    // Global mass values (in MeV, from PDG 2015)
+    recordPropertyD("GlobalMuonMass" ,  105.6584);
+    recordPropertyD("GlobalPionMass" ,  139.57061);
+    recordPropertyD("GlobalKaonMass" ,  493.677 );
+    recordPropertyD("GlobalJpsiMass" , 3096.92  );
+    recordPropertyD("GlobalBplusMass", 5279.29 );
+    recordPropertyD("GlobalB0Mass"   , 5279.61 );
+    recordPropertyD("GlobalBsMass"   , 5366.79 );
+
+    // mass ranges
+    recordPropertyD("GlobalBMassUpperCut"     , 7000.);
+    recordPropertyD("GlobalBMassLowerCut"     , 3500.);
+    recordPropertyD("GlobalDiMuonMassUpperCut", 7000.);
+    recordPropertyD("GlobalDiMuonMassLowerCut", 2000.);
+    recordPropertyD("GlobalJpsiMassUpperCut"  , 7000.);
+    recordPropertyD("GlobalJpsiMassLowerCut"  , 2000.);
+    recordPropertyD("GlobalBlindUpperCut"     , 5166.);
+    recordPropertyD("GlobalBlindLowerCut"     , 5526.);
+    recordPropertyD("GlobalTrksMassUpperCut"  , 7500.);
+    recordPropertyD("GlobalTrksMassLowerCut"  , 3000.);
+    
+    // Global chi2 cut for vertexing
+    recordPropertyD("GlobalChi2CutBase", 15.0);
+    // Different chi2 cuts for 2-, 3- and 4-prong vertices
+    recordPropertyD("Chi2Cut2Prong"    , 30.0);
+    recordPropertyD("Chi2Cut3Prong"    , 45.0);
+    recordPropertyD("Chi2Cut4Prong"    , 60.0);
+
+    // Cut values for kaon candidates
+    recordPropertyD("GlobalKaonPtCut" , 1000.); // MeV
+    recordPropertyD("GlobalKaonEtaCut",  2.5 );
+
+    // MCP cuts for JpsiFinder
+    recordPropertyB("useJpsiFinderMCPCuts", false);
+
+    // reject muons in JpsiPlus1Track or JpsiPlus2Track finders
+    recordPropertyS("GlobalMuonsUsedInJpsi", "NONE"); // turn off by default
+
+    // run number
+    recordPropertyI("runNumber", -1);
+
+    // MC channel number
+    recordPropertyI("mcChNumber", -1);
+    
+    // channels to be processed
+    recordPropertyVS("doChannels", {});
+
+    // vertex types to be done
+    recordPropertyI("doVertexType", 7);
+    
+    // minimum number of tracks in PV considered for PV association
+    recordPropertyI("minNTracksInPV", 0);
+
+    // mode of minLogChi2ToAnyPV calculation
+    recordPropertyI("AddMinChi2ToAnyPVMode", 0);
+
+    // record 3-dimensional proper time in addition
+    recordPropertyB("do3dProperTime", false);
+    
+    // thinning level
+    recordPropertyI("thinLevel", 0);
+
+    // selection expression
+    recordPropertyS("SelExpression", "");
+    
+    // MC truth decay parents
+    recordPropertyVI("TruthDecayParents", {});
+
+    // vertex isolation properties
+    recordPropertyVS("IsoTrackCategoryName" , {});
+    recordPropertyVS("IsoTrackCutLevel"     , {});
+    recordPropertyVD("IsoTrackPtCut"        , {});
+    recordPropertyVD("IsoTrackEtaCut"       , {});
+    recordPropertyVI("IsoTrackPixelHits"    , {});
+    recordPropertyVI("IsoTrackSCTHits"      , {});
+    recordPropertyVI("IsoTrackbLayerHits"   , {});
+    recordPropertyVI("IsoTrackIBLHits"      , {});
+    recordPropertyVD("IsolationConeSizes"   , {});
+    recordPropertyVD("IsoTrkImpLogChi2Max"  , {});
+    recordPropertyVI("IsoDoTrkImpLogChi2Cut", {});
+    recordPropertyVL("useIsoTrackTypes"     , {});
+    recordPropertyB("IsoUseOptimizedAlgo"   ,  true);
+    recordPropertyS("IsoTvaWorkingPoint"    , "Nominal");
+    recordPropertyVS("IsoIncludes"          , {});
+
+    
+    // muon isolation properties (muons of B candidate)
+    recordPropertyVS("MuIsoTrackCategoryName" , {});
+    recordPropertyVS("MuIsoTrackCutLevel"     , {});
+    recordPropertyVD("MuIsoTrackPtCut"        , {});
+    recordPropertyVD("MuIsoTrackEtaCut"       , {});
+    recordPropertyVI("MuIsoTrackPixelHits"    , {});
+    recordPropertyVI("MuIsoTrackSCTHits"      , {});
+    recordPropertyVI("MuIsoTrackbLayerHits"   , {});
+    recordPropertyVI("MuIsoTrackIBLHits"      , {});
+    recordPropertyVD("MuIsolationConeSizes"   , {});
+    recordPropertyVD("MuIsoTrkImpLogChi2Max"  , {});
+    recordPropertyVI("MuIsoDoTrkImpLogChi2Cut", {});
+    recordPropertyVL("useMuIsoTrackTypes"     , {});
+    recordPropertyS("MuIsoTvaWorkingPoint"    , "Nominal");
+    recordPropertyVS("MuIsoIncludes"          , {});
+
+    // closest track properties
+    recordPropertyVS("CloseTrackCategoryName"  , {});
+    recordPropertyVS("CloseTrackCutLevel"      , {});
+    recordPropertyVD("CloseTrackPtCut"         , {});
+    recordPropertyVD("CloseTrackEtaCut"        , {});
+    recordPropertyVI("CloseTrackPixelHits"     , {});
+    recordPropertyVI("CloseTrackSCTHits"       , {});
+    recordPropertyVI("CloseTrackbLayerHits"    , {});
+    recordPropertyVI("CloseTrackIBLHits"       , {});
+    recordPropertyVL("useCloseTrackTypes"      , {});
+    recordPropertyVS("CloseTrackChi2SetName"   , {});
+    recordPropertyVI("CloseTrackCorrChi2"      , {});
+    recordPropertyVB("CloseTrackMinDCAin3D"    , {});
+    recordPropertyVD("CloseTrackMaxLogChi2"    , {});
+    recordPropertyVD("NCloseTrackMaxLogChi2"   , {});
+    recordPropertyS("CloseTrackTvaWorkingPoint", "Nominal");
+    recordPropertyVS("CloseTrackIncludes"      , {});
+
+    // debug track types for isolation and closest track tools
+    recordPropertyI("DebugTrackTypes", 0);
+
+    // track-to-vertex association check tool
+    recordPropertyI("DebugTrkToVtxMaxEvents" , 0);
+
+    // output containers and branch prefixes
+    // (mostly used for isolation tools)
+    recordPropertyS("TrkPartContName", "InDetTrackParticles");
+    recordPropertyS("PVContName"     , "PrimaryVertices");
+    recordPropertyVS("VtxContNames"  , {} );
+    recordPropertyVS("RefPVContNames", {} );
+    recordPropertyVS("BranchPrefixes", {} );
+
+  }
+  //--------------------------------------------------------------------------
+} // namespace
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Bmumu_reco_mumu.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Bmumu_reco_mumu.cxx
new file mode 100644
index 000000000000..a3c06874ffae
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Bmumu_reco_mumu.cxx
@@ -0,0 +1,177 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+
+/////////////////////////////////////////////////////////////////
+// Bmumu_reco_mumu.cxx
+///////////////////////////////////////////////////////////////////
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Original author (Reco_mumu):
+//          Daniel Scheirich <daniel.scheirich@cern.ch>
+// 
+// Changes:
+// Basic dimuon reconstruction for the derivation framework.
+// This class inherits from CfAthAlgTool instead of AthAlgTool in order
+// to have access to the CutFlowSvc instance.
+//
+//============================================================================
+//
+
+#include "DerivationFrameworkBPhys/Bmumu_reco_mumu.h"
+
+#include "xAODTracking/VertexContainer.h"
+#include "xAODTracking/VertexAuxContainer.h"
+#include "TrkVertexAnalysisUtils/V0Tools.h"
+#include "BeamSpotConditionsData/BeamSpotData.h"
+#include "DerivationFrameworkBPhys/BPhysPVTools.h"
+
+
+namespace DerivationFramework {
+
+  Bmumu_reco_mumu::Bmumu_reco_mumu(const std::string& t,
+      const std::string& n,
+      const IInterface* p) : 
+    CfAthAlgTool(t,n,p),
+    m_v0Tools("Trk::V0Tools"),
+    m_jpsiFinder("Analysis::JpsiFinder"),
+    m_pvRefitter("Analysis::PrimaryVertexRefitter")
+  {
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+    
+    // Declare tools    
+    declareProperty("V0Tools"   , m_v0Tools);
+    declareProperty("JpsiFinder", m_jpsiFinder);
+    declareProperty("PVRefitter", m_pvRefitter);
+    
+    // Declare user-defined properties
+    declareProperty("OutputVtxContainerName", m_outputVtxContainerName = "OniaCandidates");
+    declareProperty("PVContainerName"       , m_pvContainerName        = "PrimaryVertices");
+    declareProperty("RefPVContainerName"    , m_refPVContainerName     = "RefittedPrimaryVertices");
+    declareProperty("RefitPV"               , m_refitPV                = false);
+    declareProperty("MaxPVrefit"            , m_PV_max                 = 1);
+    declareProperty("DoVertexType"          , m_DoVertexType           = 1);
+    // minimum number of tracks for PV to be considered for PV association
+    declareProperty("MinNTracksInPV"        , m_PV_minNTracks          = 0);
+    declareProperty("Do3d"                  , m_do3d                   = false);
+  }
+
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
+  
+  StatusCode Bmumu_reco_mumu::initialize()
+  {
+  
+    ATH_MSG_DEBUG("in initialize()");
+ 
+    // retrieve V0 tools
+    CHECK( m_v0Tools.retrieve() );
+    
+    // get the JpsiFinder tool
+    CHECK( m_jpsiFinder.retrieve() );
+     
+    // get the PrimaryVertexRefitter tool
+    CHECK( m_pvRefitter.retrieve() );
+
+    // Get the beam spot service
+    CHECK( m_beamSpotKey.initialize() );
+    
+    return StatusCode::SUCCESS;
+    
+  }
+  
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
+
+  StatusCode Bmumu_reco_mumu::finalize()
+  {
+    // everything all right
+    return StatusCode::SUCCESS;
+  }
+
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
+  
+  StatusCode Bmumu_reco_mumu::addBranches() const
+  {
+    // Jpsi container and its auxilliary store
+    xAOD::VertexContainer*    vtxContainer = NULL;
+    xAOD::VertexAuxContainer* vtxAuxContainer = NULL;
+    
+    //----------------------------------------------------
+    // call Jpsi finder
+    //----------------------------------------------------
+    if( !m_jpsiFinder->performSearch(vtxContainer, vtxAuxContainer).isSuccess() ) {
+      ATH_MSG_FATAL("Jpsi finder (" << m_jpsiFinder << ") failed.");
+      return StatusCode::FAILURE;
+    }
+
+    //----------------------------------------------------
+    // retrieve primary vertices
+    //----------------------------------------------------
+    const xAOD::VertexContainer*    pvContainer = NULL;
+    CHECK( evtStore()->retrieve(pvContainer, m_pvContainerName) );
+
+    //----------------------------------------------------
+    // Try to retrieve refitted primary vertices
+    //----------------------------------------------------
+    bool refPvExists = false;
+    xAOD::VertexContainer*    refPvContainer = NULL;
+    xAOD::VertexAuxContainer* refPvAuxContainer = NULL;
+    if(m_refitPV) {
+      if(evtStore()->contains<xAOD::VertexContainer>(m_refPVContainerName)) {
+        // refitted PV container exists. Get it from the store gate
+        CHECK( evtStore()->retrieve(refPvContainer, m_refPVContainerName) );
+        CHECK( evtStore()->retrieve(refPvAuxContainer, m_refPVContainerName+"Aux.") );
+        refPvExists = true;
+      } else {
+        // refitted PV container does not exist. Create a new one.
+        refPvContainer = new xAOD::VertexContainer;
+        refPvAuxContainer = new xAOD::VertexAuxContainer;
+        refPvContainer->setStore(refPvAuxContainer);
+      }
+    }
+    
+    // Give the helper class the ptr to v0tools and beamSpotsSvc to use
+    SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey };
+    if(not beamSpotHandle.isValid()) ATH_MSG_ERROR("Cannot Retrieve " << m_beamSpotKey.key() );
+    BPhysPVTools helper(&(*m_v0Tools), beamSpotHandle.cptr());
+    helper.SetMinNTracksInPV(m_PV_minNTracks);
+    helper.SetSave3d(m_do3d);
+
+    if(m_refitPV){ 
+       if(vtxContainer->size() >0){
+        StatusCode SC = helper.FillCandwithRefittedVertices(vtxContainer,  pvContainer, refPvContainer, &(*m_pvRefitter) , m_PV_max, m_DoVertexType);
+        if(SC.isFailure()){
+            ATH_MSG_FATAL("refitting failed - check the vertices you passed");
+            return SC;
+        }
+        }
+    }else{
+        if(vtxContainer->size() >0)CHECK(helper.FillCandExistingVertices(vtxContainer, pvContainer, m_DoVertexType));
+    }
+    
+    
+    //----------------------------------------------------
+    // save in the StoreGate
+    //----------------------------------------------------
+    if (!evtStore()->contains<xAOD::VertexContainer>(m_outputVtxContainerName))       
+      CHECK(evtStore()->record(vtxContainer, m_outputVtxContainerName));
+    
+    if (!evtStore()->contains<xAOD::VertexAuxContainer>(m_outputVtxContainerName+"Aux.")) 
+      CHECK(evtStore()->record(vtxAuxContainer, m_outputVtxContainerName+"Aux."));
+    
+    if(!refPvExists && m_refitPV) {
+      CHECK(evtStore()->record(refPvContainer   , m_refPVContainerName));
+      CHECK(evtStore()->record(refPvAuxContainer, m_refPVContainerName+"Aux."));
+    }
+
+    // add counter for number of events seen
+    addEvent("dimuEvents");
+    // add counter for the number of events with >= 1 reco'd vertices
+    if ( vtxContainer->size() > 0 ) {
+      addEvent("dimuWithVertexCand");
+    }
+    // add counter for the number of vertices
+    addToCounter("dimuNumVertices", vtxContainer->size());
+    
+    return StatusCode::SUCCESS;
+  }  
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Cascade3Plus1.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Cascade3Plus1.cxx
new file mode 100644
index 000000000000..fbc231d3666c
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Cascade3Plus1.cxx
@@ -0,0 +1,524 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+/////////////////////////////////////////////////////////////////
+// Cascade3Plus1.cxx, (c) ATLAS Detector software
+/////////////////////////////////////////////////////////////////
+#include "DerivationFrameworkBPhys/Cascade3Plus1.h"
+#include "xAODTracking/TrackParticle.h"
+#include "xAODTracking/TrackParticleContainer.h"
+#include "TrkToolInterfaces/ITrackSelectorTool.h"
+#include "TrkVKalVrtFitter/TrkVKalVrtFitter.h"
+#include "xAODTracking/VertexContainer.h"
+#include "xAODTracking/VertexAuxContainer.h"
+#include "DerivationFrameworkBPhys/BPhysPVCascadeTools.h"
+#include "TrkVertexAnalysisUtils/V0Tools.h"
+#include "DerivationFrameworkBPhys/BPhysPVTools.h"
+#include "xAODBPhys/BPhysHelper.h"
+#include "Math/Vector4D.h"
+
+namespace DerivationFramework {
+typedef ElementLink<xAOD::VertexContainer> VertexLink;
+typedef std::vector<VertexLink> VertexLinkVector;
+typedef std::vector<const xAOD::TrackParticle*> TrackBag;
+/// Base 4 Momentum type for TrackParticle
+typedef ROOT::Math::LorentzVector<ROOT::Math::PtEtaPhiM4D<double> > GenVecFourMom_t;
+
+template<size_t N>
+struct Candidate {
+    std::array<const xAOD::TrackParticle*, N> tracks;
+};
+
+struct VertexCand : Candidate<4> {
+    std::unique_ptr<Trk::VxCascadeInfo> cascVertex;
+};
+
+template<size_t N>
+GenVecFourMom_t SumVector(const std::array<GenVecFourMom_t, N> &vectors) {
+    GenVecFourMom_t total = vectors[0];
+    for(size_t i =1; i<N; i++) total+= vectors[i];
+    return total;
+}
+
+Cascade3Plus1::Cascade3Plus1(const std::string& t, const std::string& n, const IInterface* p)  : AthAlgTool(t,n,p),
+    m_trkSelector("InDet::TrackSelectorTool"),
+    m_iVertexFitter("Trk::TrkVKalVrtFitter"),
+    m_V0Tools("Trk::V0Tools"),
+    m_CascadeTools("DerivationFramework::CascadeTools"),
+    m_pvRefitter("Analysis::PrimaryVertexRefitter"),
+    m_cascadeOutputsKeys{ "CascadeVtx1", "CascadeVtx2" }
+{
+
+    declareProperty("TrackMassHyp",     m_trackMasses);
+    declareProperty("CascadeVertexCollections",  m_cascadeOutputsKeys);
+    declareProperty("TwoTrackMassMin",  m_2trackmassMin);
+    declareProperty("TwoTrackMassMax",  m_2trackmassMax);
+    declareProperty("ThreeTrackMassMin",  m_3trackmassMin);
+    declareProperty("ThreeTrackMassMax",  m_3trackmassMax);
+    declareProperty("FourTrackMassMin",  m_4trackmassMin);
+    declareProperty("FourTrackMassMax",  m_4trackmassMax);
+    declareProperty("TwoTracksMass",  m_2tracksMass);
+    declareProperty("ThreeTracksMass",  m_3tracksMass);
+    declareProperty("FourTracksMass",  m_4tracksMass);
+    declareProperty("TrackSelectorTool",m_trkSelector);
+    declareProperty("CascadeTools",              m_CascadeTools);
+    declareProperty("MinNTracksInPV",            m_PV_minNTracks          = 0);
+    declareProperty("HypothesisName",            m_hypoName               = "Bs");
+    declareProperty("Track3Name",            m_3TrackName               = "Ds");
+    declareProperty("MaxnPV",                    m_PV_max                 = 999);
+    declareProperty("DoVertexType",              m_DoVertexType           = 7);
+    declareProperty("RefitPV",                   m_refitPV                = true);
+    declareProperty("RefPVContainerName", m_refPVContainerName  = "RefittedPrimaryVertices");
+    declareProperty("PVRefitter",                m_pvRefitter);
+    declareProperty("TrkVertexFitterTool",       m_iVertexFitter);
+    declareProperty("PVContainerName", m_VxPrimaryCandidateName);
+    declareProperty("ThreeTrackMassConstraint", m_3TrackMassConstraint);
+    declareProperty("TwoTrackMassConstraint", m_2TrackMassConstraint);
+    declareProperty("Chi2NDFCut", m_Chi2NDFCut);
+
+    declareProperty("FourTrackMassFinalMin",  m_4trackmassFinalMin);
+    declareProperty("FourTrackMassFinalMax",  m_4trackmassFinalMax);
+    declareProperty("FourTrackTauCut", m_tauCut);
+    declareProperty("UseMuonsForTracks", m_requireMuonsOnTrack);
+    declareProperty("ThreeVertexOutputContainer", m_3TrackVertexOutput);
+    declareProperty("VertexEstimator", m_vertexEstimator);
+    declareProperty("ThreeTrackChi2NDF", m_3TrackChi2NDFCut);
+    declareProperty("EliminateBad3Tracksfrom4Track", m_eliminateBad3Tracksfrom4Track);
+    declareProperty("CopyAllVertices", m_copyAllVertices);
+    declareProperty("PTCutPerTrack", m_ptCutPerTrack);
+    m_ptCutPerVertex.fill(0);
+    declareProperty("PTCutVertex1", m_ptCutPerVertex[0]);
+    declareProperty("PTCutVertex2", m_ptCutPerVertex[1]);
+    declareProperty("PTCutVertex3", m_ptCutPerVertex[2]);
+}
+
+StatusCode Cascade3Plus1::initialize() {
+    if(m_trackMasses.size()!=4) {
+        ATH_MSG_ERROR("4 mass hypotheses must be provided");
+        return StatusCode::FAILURE;
+    }
+    if(m_cascadeOutputsKeys.size() !=s_topoN)  {
+        ATH_MSG_FATAL("Incorrect number of VtxContainers");
+        return StatusCode::FAILURE;
+    }
+    // retrieving vertex Fitter
+    ATH_CHECK( m_iVertexFitter.retrieve());
+
+    // retrieving the Cascade tools
+    ATH_CHECK( m_CascadeTools.retrieve());
+
+    // Get the beam spot service
+    CHECK( m_beamSpotKey.initialize() );
+
+    ATH_CHECK(m_vertexEstimator.retrieve());
+    if(m_eliminateBad3Tracksfrom4Track && m_3TrackChi2NDFCut<=0.0) {
+        ATH_MSG_FATAL("Invalid configuration");
+        return StatusCode::FAILURE;
+    }
+
+    if(m_ptCutPerTrack.size() == 1 || m_ptCutPerTrack.size() > 4){
+        ATH_MSG_FATAL("Invalid configuration");
+        return StatusCode::FAILURE;
+    }
+    if(m_ptCutPerTrack.size() >=2 && m_ptCutPerTrack[0] != m_ptCutPerTrack[1]){
+        ATH_MSG_FATAL("Invalid configuration");
+        return StatusCode::FAILURE;
+    }
+    m_muonTrackBit.reset();
+    for(int i : m_requireMuonsOnTrack) {
+       if(i>=4) {
+          ATH_MSG_FATAL("Invalid configuration" << " muon track " << i);
+          return StatusCode::FAILURE;
+       }
+       m_muonTrackBit[i] = true;
+    }
+    m_requireMuonsOnTrack.clear();
+    m_requireMuonsOnTrack.shrink_to_fit();
+
+    if(m_muonTrackBit[0] != m_muonTrackBit[1])
+    {
+        ATH_MSG_FATAL("Invalid configuration" << " variable is " << m_muonTrackBit.to_string());
+        return StatusCode::FAILURE;
+    }
+
+
+    return StatusCode::SUCCESS;
+}
+
+Cascade3Plus1::~Cascade3Plus1() { }
+
+
+const TrackBag& Cascade3Plus1::ApplyAdditionalCuts(const TrackBag& alltracks, const TrackBag& muonTracks, TrackBag& cuttracks, size_t track) const {
+   const TrackBag& tracks = m_muonTrackBit[track] ? muonTracks : alltracks;
+   if(track >= m_ptCutPerTrack.size()) return tracks;
+   double ptCut = m_ptCutPerTrack.at(track);
+   if(ptCut <=0.0) return tracks;
+   cuttracks.clear();//reset any previous selections
+   for(auto ptr : tracks){
+      if(ptr->pt() > ptCut) cuttracks.push_back(ptr);
+   }
+   return cuttracks;
+}
+
+StatusCode Cascade3Plus1::addBranches() const
+{
+    const xAOD::TrackParticleContainer  *trackContainer(nullptr);
+    ATH_CHECK(evtStore()->retrieve(trackContainer, "InDetTrackParticles"      ));
+
+    //----------------------------------------------------
+    // Try to retrieve refitted primary vertices
+    //----------------------------------------------------
+    xAOD::VertexContainer*    refPvContainer    = nullptr;
+    xAOD::VertexAuxContainer* refPvAuxContainer = nullptr;
+    if (m_refitPV) {
+        if (evtStore()->contains<xAOD::VertexContainer>(m_refPVContainerName)) {
+            // refitted PV container exists. Get it from the store gate
+            ATH_CHECK(evtStore()->retrieve(refPvContainer, m_refPVContainerName       ));
+            ATH_CHECK(evtStore()->retrieve(refPvAuxContainer, m_refPVContainerName + "Aux."));
+        } else {
+            // refitted PV container does not exist. Create a new one.
+            refPvContainer = new xAOD::VertexContainer;
+            refPvAuxContainer = new xAOD::VertexAuxContainer;
+            refPvContainer->setStore(refPvAuxContainer);
+            ATH_CHECK(evtStore()->record(refPvContainer, m_refPVContainerName));
+            ATH_CHECK(evtStore()->record(refPvAuxContainer, m_refPVContainerName+"Aux."));
+        }
+    }
+
+    std::array<xAOD::VertexContainer*, s_topoN> Vtxwritehandles;
+    std::array<xAOD::VertexAuxContainer*, s_topoN> Vtxwritehandlesaux;
+
+    for(int i =0; i<s_topoN; i++) {
+        Vtxwritehandles[i] = new xAOD::VertexContainer();
+        Vtxwritehandlesaux[i] = new xAOD::VertexAuxContainer();
+        Vtxwritehandles[i]->setStore(Vtxwritehandlesaux[i]);
+        ATH_CHECK(evtStore()->record(Vtxwritehandles[i], m_cascadeOutputsKeys[i]       ));
+        ATH_CHECK(evtStore()->record(Vtxwritehandlesaux[i], m_cascadeOutputsKeys[i] + "Aux."));
+    }
+    xAOD::VertexContainer *v3container = nullptr;
+    if(!m_3TrackVertexOutput.empty()) {
+        v3container    = new xAOD::VertexContainer();
+        auto vcontaineraux = new xAOD::VertexAuxContainer();
+        v3container->setStore(vcontaineraux);
+        ATH_CHECK(evtStore()->record(v3container, m_3TrackVertexOutput       ));
+        ATH_CHECK(evtStore()->record(vcontaineraux, m_3TrackVertexOutput + "Aux."));
+    }
+    //----------------------------------------------------
+    // retrieve primary vertices
+    //----------------------------------------------------
+
+    const xAOD::Vertex * primaryVertex(nullptr);
+    const xAOD::VertexContainer *pvContainer(nullptr);
+    ATH_CHECK(evtStore()->retrieve(pvContainer, m_VxPrimaryCandidateName));
+
+    if (pvContainer->size()==0) {
+        ATH_MSG_WARNING("You have no primary vertices: " << pvContainer->size());
+        return StatusCode::RECOVERABLE;
+    } else {
+        primaryVertex = (*pvContainer)[0];
+    }
+
+
+    TrackBag theIDTracksAfterSelection;
+    TrackBag theIDTracksAfterAdditionalSelection;
+    for(auto x : *trackContainer) {
+        if ( m_trkSelector->decision(*x, nullptr) ) theIDTracksAfterSelection.push_back(x);
+    }
+    ATH_MSG_DEBUG("Found good tracks N="<<theIDTracksAfterSelection.size());
+    TrackBag theMuonsAfterSelection;
+    if(m_muonTrackBit.any()) {
+        const xAOD::MuonContainer* importedMuonCollection(0);
+        ATH_CHECK(evtStore()->retrieve(importedMuonCollection, "Muons"));
+        for(auto muon : *importedMuonCollection) {
+            if(muon->muonType() == xAOD::Muon::SiliconAssociatedForwardMuon) continue;
+            auto ptr = muon->trackParticle( xAOD::Muon::InnerDetectorTrackParticle );
+            if(ptr) theMuonsAfterSelection.push_back(ptr);
+        }
+    }
+
+    std::vector<Candidate<2>> Initialcandidates;
+    {  //Isolate scope for safety
+       const TrackBag &Tracksfor2Vertex = ApplyAdditionalCuts(theIDTracksAfterSelection, theMuonsAfterSelection, theIDTracksAfterAdditionalSelection, 0);
+       for(auto track1itr = Tracksfor2Vertex.cbegin(); track1itr != Tracksfor2Vertex.cend(); ++track1itr) {
+           Candidate<2> cand;
+           std::array<GenVecFourMom_t, 2> vectors;
+           cand.tracks[0] = *track1itr;
+           vectors[0].SetCoordinates(cand.tracks[0]->pt(), cand.tracks[0]->eta(), cand.tracks[0]->phi(),  m_trackMasses[0]);
+           for(auto track2itr = track1itr+1; track2itr != Tracksfor2Vertex.cend(); ++track2itr) {
+               cand.tracks[1] = *track2itr;
+               if(cand.tracks[0]->qOverP() * cand.tracks[1]->qOverP() >= 0.) continue; //Skip same signed
+               vectors[1].SetCoordinates(cand.tracks[1]->pt(), cand.tracks[1]->eta(), cand.tracks[1]->phi(),  m_trackMasses[1]);
+               GenVecFourMom_t pair = SumVector(vectors);
+               if(pair.Pt() < m_ptCutPerVertex[0]) continue;
+               if(pair.M() >= m_2trackmassMin && pair.M() < m_2trackmassMax) {
+                   ATH_MSG_VERBOSE("2 Track candidate found: " << pair.M() << " Within " << m_2trackmassMin << " and " << m_2trackmassMax);
+                   Initialcandidates.push_back(cand);
+               }
+           }
+       }
+    }
+    ATH_MSG_DEBUG("2 Track candidates found: " << Initialcandidates.size());
+    if(Initialcandidates.empty()) {
+        //No work to do Leave method early
+        return StatusCode::SUCCESS;
+    }
+    std::vector<Candidate<3>> Candidates3;
+
+    {//isolate scope
+    const TrackBag &Tracksfor3Vertex = ApplyAdditionalCuts(theIDTracksAfterSelection, theMuonsAfterSelection, theIDTracksAfterAdditionalSelection, 2);
+       for(auto &c : Initialcandidates) {
+           Candidate<3> c3;
+           std::copy(c.tracks.begin(), c.tracks.end(), c3.tracks.begin());
+           std::array<GenVecFourMom_t, 3> vectors;
+           vectors[0].SetCoordinates(c.tracks[0]->pt(), c.tracks[0]->eta(), c.tracks[0]->phi(),  m_trackMasses[0]);
+           vectors[1].SetCoordinates(c.tracks[1]->pt(), c.tracks[1]->eta(), c.tracks[1]->phi(),  m_trackMasses[1]);
+           for(auto track3itr = Tracksfor3Vertex.cbegin(); track3itr != Tracksfor3Vertex.cend(); ++track3itr) {
+               if(std::find(c3.tracks.begin(), c3.tracks.end(), *track3itr) != c3.tracks.end()) continue;
+               c3.tracks[2] = *track3itr;
+               vectors[2].SetCoordinates(c3.tracks[2]->pt(), c3.tracks[2]->eta(), c3.tracks[2]->phi(),  m_trackMasses[2]);
+               GenVecFourMom_t tripple = SumVector(vectors);
+               if(tripple.Pt() < m_ptCutPerVertex[1]) continue;
+               if(tripple.M() >= m_3trackmassMin && tripple.M() < m_3trackmassMax) {
+                   ATH_MSG_VERBOSE("3 Track candidate found: " << tripple.M() << " Within " << m_3trackmassMin << " and " << m_3trackmassMax);
+                   Candidates3.push_back(c3);
+               }
+           }
+       }
+    }
+    Initialcandidates.clear();
+    Initialcandidates.shrink_to_fit();
+
+    ATH_MSG_DEBUG("3 Track candidates found: " << Candidates3.size());
+    std::map<const std::array<const xAOD::TrackParticle*, 3>, xAOD::Vertex* > threeVertexMap;
+
+    if(!m_3TrackVertexOutput.empty()) {
+        SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey };
+        if(not beamSpotHandle.isValid()) ATH_MSG_ERROR("Cannot Retrieve " << m_beamSpotKey.key() );
+        BPhysPVTools helper(&(*m_V0Tools), beamSpotHandle.cptr());
+        helper.SetMinNTracksInPV(0);
+        helper.SetSave3d(false);
+        std::vector<const xAOD::TrackParticle*> tracksforfit;
+        std::vector<Candidate<3>> Candidates3PassCuts;
+        if(m_eliminateBad3Tracksfrom4Track) Candidates3PassCuts.reserve(Candidates3.size());
+        for(const auto &c3 : Candidates3) {
+            tracksforfit.assign(c3.tracks.begin(), c3.tracks.end());
+            auto v = StandardFit(tracksforfit, trackContainer);
+            if(v==nullptr) {
+                ATH_MSG_DEBUG("3Vertex fit returned null");
+                continue;
+            }
+            if(m_3TrackChi2NDFCut > 0. && v->chiSquared() / v->numberDoF() > m_3TrackChi2NDFCut) {
+                ATH_MSG_DEBUG("Rejecting 3 track vertex because Chi " << v->chiSquared() / v->numberDoF() << " > " << m_3TrackChi2NDFCut);
+                continue;
+            }
+            if(m_eliminateBad3Tracksfrom4Track) Candidates3PassCuts.push_back(c3);
+            threeVertexMap[c3.tracks] = v.get();
+            xAOD::BPhysHelper bHelper(v.get());//"get" does not "release" still automatically deleted
+            bHelper.setRefTrks();
+            v3container->push_back(v.release());
+        }
+
+        if(v3container->size() >0) ATH_CHECK(helper.FillCandExistingVertices(v3container, pvContainer, 1));
+
+        if(m_eliminateBad3Tracksfrom4Track) {
+            ATH_MSG_DEBUG("Swapping container to N = "<< Candidates3PassCuts.size() << " from " << Candidates3.size());
+            Candidates3PassCuts.swap(Candidates3);//Swap old container with one that passed cuts
+        }
+
+    }
+    std::vector<VertexCand> Candidates4;
+    {//isolate scope
+    const TrackBag &Tracksfor4Vertex = ApplyAdditionalCuts(theIDTracksAfterSelection, theMuonsAfterSelection, theIDTracksAfterAdditionalSelection, 3);
+       for(auto &c : Candidates3) {
+           VertexCand c4;
+           std::copy(c.tracks.begin(), c.tracks.end(),   c4.tracks.begin());
+           std::array<GenVecFourMom_t, 4> vectors;
+           vectors[0].SetCoordinates(c.tracks[0]->pt(), c.tracks[0]->eta(), c.tracks[0]->phi(),  m_trackMasses[0]);
+           vectors[1].SetCoordinates(c.tracks[1]->pt(), c.tracks[1]->eta(), c.tracks[1]->phi(),  m_trackMasses[1]);
+           vectors[2].SetCoordinates(c.tracks[2]->pt(), c.tracks[2]->eta(), c.tracks[2]->phi(),  m_trackMasses[2]);
+           for(auto track4itr = Tracksfor4Vertex.cbegin(); track4itr != Tracksfor4Vertex.cend(); ++track4itr) {
+               if(std::find(c4.tracks.begin(), c4.tracks.end(), *track4itr) != c4.tracks.end()) continue;
+               c4.tracks[3] = *track4itr;
+               if(c4.tracks[2]->qOverP() * c4.tracks[3]->qOverP() >= 0.) continue; //Skip same signed
+               vectors[3].SetCoordinates(c4.tracks[3]->pt(), c4.tracks[3]->eta(), c4.tracks[3]->phi(),  m_trackMasses[3]);
+               GenVecFourMom_t fourtrack = SumVector(vectors);
+               if(fourtrack.Pt() < m_ptCutPerVertex[2]) continue;
+               if(fourtrack.M() >= m_4trackmassMin && fourtrack.M() < m_4trackmassMax) {
+                   ATH_MSG_VERBOSE("3 Track candidate found: " << fourtrack.M() << " Within " << m_4trackmassMin << " and " << m_4trackmassMax);
+                   Candidates4.push_back(std::move(c4));
+               }
+           }
+       }
+    }
+    Candidates3.clear();
+    Candidates3.shrink_to_fit();
+
+    ATH_MSG_DEBUG("4 Track candidates found: " << Candidates4.size() << " running cascade");
+    for(auto &c : Candidates4) {
+        c.cascVertex = CascadeFit(c.tracks);
+        if(c.cascVertex!=nullptr) {
+            c.cascVertex->setSVOwnership(true);
+        }
+    }
+
+    SG::AuxElement::Decorator<VertexLinkVector> CascadeLinksDecor("CascadeVertexLinks");
+    SG::AuxElement::Decorator<VertexLink> Vertex3Decor(m_3TrackName+ "_VertexLink");
+    SG::AuxElement::Decorator<float> chi2_decor("ChiSquared");
+    SG::AuxElement::Decorator<float> ndof_decor("NumberDoF");
+//        SG::AuxElement::Decorator<float> TotalProb_decor("TotalProb");
+    SG::AuxElement::Decorator<float> Pt_decor("Pt");
+    SG::AuxElement::Decorator<float> PtErr_decor("PtErr");
+    SG::AuxElement::Decorator<float> Mass_svdecor(m_3TrackName+ "_mass");
+    SG::AuxElement::Decorator<float> MassErr_svdecor(m_3TrackName+"_massErr");
+    SG::AuxElement::Decorator<float> Pt_svdecor(m_3TrackName+"_Pt");
+    SG::AuxElement::Decorator<float> PtErr_svdecor(m_3TrackName+"_PtErr");
+    SG::AuxElement::Decorator<float> Lxy_svdecor(m_3TrackName+"_Lxy");
+    SG::AuxElement::Decorator<float> LxyErr_svdecor(m_3TrackName+"_LxyErr");
+    SG::AuxElement::Decorator<float> Tau_svdecor(m_3TrackName+"_Tau");
+    SG::AuxElement::Decorator<float> TauErr_svdecor(m_3TrackName+"_TauErr");
+
+
+    SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey };
+    if(not beamSpotHandle.isValid()) ATH_MSG_ERROR("Cannot Retrieve " << m_beamSpotKey.key() );
+    BPhysPVCascadeTools helper(&(*m_CascadeTools), beamSpotHandle.cptr());
+    helper.SetMinNTracksInPV(m_PV_minNTracks);
+    helper.m_copyAllVertices = this->m_copyAllVertices;
+
+
+
+    int totalnotnull=0;
+    for(auto &c : Candidates4) {
+        if(c.cascVertex==nullptr) {
+            totalnotnull++;
+            continue;
+        }
+        auto x = c.cascVertex.get();
+        const std::vector<xAOD::Vertex*> &cascadeVertices = x->vertices();
+        if(cascadeVertices.size()!=s_topoN)  {
+            ATH_MSG_ERROR("Incorrect number of vertices");
+            continue;
+        }
+        if(cascadeVertices[0] == nullptr || cascadeVertices[1] == nullptr) {
+            ATH_MSG_ERROR("Error null vertex");
+            continue;
+        }
+        if( m_Chi2NDFCut > 0.0 && (x->fitChi2() / x->nDoF()) > m_Chi2NDFCut) {
+            continue;
+        }
+        BPhysPVCascadeTools::PrepareVertexLinks(c.cascVertex.get(), trackContainer);
+        const std::vector< std::vector<TLorentzVector> > &moms = x->getParticleMoms();
+        double mass1 = m_CascadeTools->invariantMass(moms[1]);
+        if(m_4trackmassFinalMin > 0. && mass1 < m_4trackmassFinalMin) continue;
+        if(m_4trackmassFinalMax > 0. && mass1 > m_4trackmassFinalMax) continue;
+        double tau = m_CascadeTools->tau(moms[1],cascadeVertices[1],primaryVertex);
+        if(tau < m_tauCut) continue;
+//           ATH_MSG_INFO("Total chi " << x->fitChi2()<< " sum chi2 " <<  cascadeVertices[0]->chiSquared() + cascadeVertices[1]->chiSquared() );
+        // Keep vertices (bear in mind that they come in reverse order!)
+        for(int i =0; i<s_topoN; i++) Vtxwritehandles[i]->push_back(cascadeVertices[i]);
+        x->setSVOwnership(false); // Prevent Container from deleting vertices
+        const auto mainVertex = cascadeVertices[1];   // this is the B vertex
+
+        // Set links to cascade vertices
+        std::vector<const xAOD::Vertex*> verticestoLink;
+        verticestoLink.push_back(cascadeVertices[0]);
+        if(!BPhysPVCascadeTools::LinkVertices(CascadeLinksDecor, verticestoLink, Vtxwritehandles[0], cascadeVertices[1])) {
+            ATH_MSG_ERROR("Error decorating with cascade vertices");
+        }
+
+        // loop over candidates -- Don't apply PV_minNTracks requirement here
+        // because it may result in exclusion of the high-pt PV.
+        // get good PVs
+
+        xAOD::BPhysHypoHelper vtx(m_hypoName, mainVertex);
+
+        // Get refitted track momenta from all vertices, charged tracks only
+        BPhysPVCascadeTools::SetVectorInfo(vtx, x);
+
+        // Decorate main vertex
+        //
+        // 1.a) mass, mass error
+
+        BPHYS_CHECK( vtx.setMass(m_CascadeTools->invariantMass(moms[1])) );
+        BPHYS_CHECK( vtx.setMassErr(m_CascadeTools->invariantMassError(moms[1],x->getCovariance()[1])) );
+        // 1.b) pt and pT error (the default pt of mainVertex is != the pt of the full cascade fit!)
+        Pt_decor(*mainVertex) = m_CascadeTools->pT(moms[1]);
+        PtErr_decor(*mainVertex) = m_CascadeTools->pTError(moms[1],x->getCovariance()[1]);
+        // 1.c) chi2 and ndof (the default chi2 of mainVertex is != the chi2 of the full cascade fit!)
+        chi2_decor(*mainVertex) = x->fitChi2();
+        ndof_decor(*mainVertex) = x->nDoF();
+        ATH_CHECK(helper.FillCandwithRefittedVertices(m_refitPV, pvContainer,
+                  refPvContainer, &(*m_pvRefitter), m_PV_max, m_DoVertexType, x, 1, m_4tracksMass, vtx));
+        // 4) decorate the main vertex with D0 vertex mass, pt, lifetime and lxy values (plus errors)
+        // D0 points to the main vertex, so lifetime and lxy are w.r.t the main vertex
+        Mass_svdecor(*mainVertex) = m_CascadeTools->invariantMass(moms[0]);
+        MassErr_svdecor(*mainVertex) = m_CascadeTools->invariantMassError(moms[0],x->getCovariance()[0]);
+        Pt_svdecor(*mainVertex) = m_CascadeTools->pT(moms[0]);
+        PtErr_svdecor(*mainVertex) = m_CascadeTools->pTError(moms[0],x->getCovariance()[0]);
+        Lxy_svdecor(*mainVertex) = m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
+        LxyErr_svdecor(*mainVertex) = m_CascadeTools->lxyError(moms[0],x->getCovariance()[0], cascadeVertices[0],cascadeVertices[1]);
+        Tau_svdecor(*mainVertex) = m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1]);
+        TauErr_svdecor(*mainVertex) = m_CascadeTools->tauError(moms[0],x->getCovariance()[0], cascadeVertices[0],cascadeVertices[1]);
+        if(!threeVertexMap.empty()) {
+            std::array<const xAOD::TrackParticle*, 3> lookuparray;
+            std::copy(c.tracks.begin(), c.tracks.begin()+3, lookuparray.begin());
+            auto ptr = threeVertexMap[lookuparray];
+            if(ptr == nullptr) ATH_MSG_WARNING("3Vertex lookup found null");
+            Vertex3Decor(*mainVertex) =  ptr ? VertexLink(ptr, *v3container) : VertexLink();
+        }
+    }
+
+
+    ATH_MSG_DEBUG("Found " << Vtxwritehandles[0]->size() << " candidates " << totalnotnull << " were null");
+    if(Vtxwritehandles[0]->size() > 200) ATH_MSG_WARNING("A lot of candidates N=" << Vtxwritehandles[0]->size());
+    return StatusCode::SUCCESS;
+}
+
+std::unique_ptr<Trk::VxCascadeInfo>  Cascade3Plus1::CascadeFit(std::array<const xAOD::TrackParticle*, 4> &Track) const {
+//  ATH_MSG_DEBUG("Running Cascade Fit");
+    std::vector<const xAOD::TrackParticle*> tracksDs(Track.begin(), Track.begin()+3);
+    std::vector<const xAOD::TrackParticle*> tracksBs(1, Track[3]);
+
+    std::vector<double> massesDs(m_trackMasses.begin(), m_trackMasses.begin()+3);
+    std::vector<double> massesBs(1, m_trackMasses[3]);
+
+    std::unique_ptr<Trk::IVKalState> state = m_iVertexFitter->makeState();
+    int robustness = 0;
+    m_iVertexFitter->setRobustness(robustness, *state);
+//  if(tracksDs.size() != massesDs.size()) ATH_MSG_ERROR("Track sizes do not match");
+//  for(int i =0;i < tracksDs.size();i++) ATH_MSG_DEBUG("Num " << i << " track " << tracksDs[i] << " mass " << massesDs[i]);
+    // Vertex list
+    std::vector<Trk::VertexID> vrtList;
+    // Ds vertex
+    auto vID = m_iVertexFitter->startVertex(tracksDs, massesDs, *state, m_3TrackMassConstraint ? m_3tracksMass : 0.0);
+    std::vector<Trk::VertexID> cnstV;
+    if (m_2TrackMassConstraint && !m_iVertexFitter->addMassConstraint(vID, tracksDs, cnstV, *state, m_2tracksMass).isSuccess() ) {
+        ATH_MSG_WARNING("addMassConstraint failed");
+    }
+    vrtList.push_back(vID);
+    // Bs vertex
+    m_iVertexFitter->nextVertex(tracksBs,massesBs,vrtList, *state);
+    // Do the work
+    auto x = std::unique_ptr<Trk::VxCascadeInfo> (m_iVertexFitter->fitCascade(*state));
+    if(x==nullptr) ATH_MSG_VERBOSE("Cascade returned null");
+    return x;
+}
+
+std::unique_ptr<xAOD::Vertex> Cascade3Plus1::StandardFit(const std::vector<const xAOD::TrackParticle*> &inputTracks, const xAOD::TrackParticleContainer* importedTrackCollection) const {
+    assert(inputTracks.size() >=2);
+    const Trk::Perigee& aPerigee1 = inputTracks[0]->perigeeParameters();
+    const Trk::Perigee& aPerigee2 = inputTracks[1]->perigeeParameters();
+    int sflag = 0;
+    int errorcode = 0;
+    Amg::Vector3D startingPoint = m_vertexEstimator->getCirclesIntersectionPoint(&aPerigee1,&aPerigee2,sflag,errorcode);
+    if (errorcode != 0) {
+        startingPoint(0) = 0.0;
+        startingPoint(1) = 0.0;
+        startingPoint(2) = 0.0;
+    }
+    std::unique_ptr<Trk::IVKalState> state = m_iVertexFitter->makeState();
+    auto theResult = std::unique_ptr<xAOD::Vertex>( m_iVertexFitter->fit(inputTracks, startingPoint, *state));
+    if(theResult) BPhysPVTools::PrepareVertexLinks(theResult.get(), importedTrackCollection);
+    return theResult;
+}
+
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/CascadeTools.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/CascadeTools.cxx
new file mode 100644
index 000000000000..7721d36d9ee2
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/CascadeTools.cxx
@@ -0,0 +1,608 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+/////////////////////////////////////////////////////////////////
+// CascadeTools.cxx, (c) ATLAS Detector software
+/////////////////////////////////////////////////////////////////
+#include "DerivationFrameworkBPhys/CascadeTools.h"
+#include "CLHEP/GenericFunctions/CumulativeChiSquare.hh"
+
+
+namespace DerivationFramework {
+
+
+CascadeTools::CascadeTools(const std::string& t, const std::string& n, const IInterface* p) :
+  AthAlgTool(t,n,p)
+{
+  declareInterface<CascadeTools>(this);
+}
+
+CascadeTools::~CascadeTools() {}
+
+//Light speed constant for various calculations
+constexpr double s_CONST = 1000./299.792;
+
+double CascadeTools::invariantMass(const std::vector<TLorentzVector> &particleMom) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  TLorentzVector totalMom;
+  unsigned int NTrk = particleMom.size();
+  for( unsigned int it=0; it<NTrk; it++) totalMom += particleMom[it];
+  return totalMom.M();
+}
+
+double CascadeTools::invariantMass(const std::vector<TLorentzVector> &particleMom2, const std::vector<double> &masses) const
+{
+  if(particleMom2.size() == 0) return -999999.;
+  TLorentzVector totalMom;
+  unsigned int NTrk = particleMom2.size();
+  if (masses.size() != NTrk) {
+    ATH_MSG_DEBUG("The provided number of masses does not match the number of tracks in the vertex");
+    return -999999.;
+  }
+  TLorentzVector temp;
+  for( unsigned int it=0; it<NTrk; it++) {
+    double esq = particleMom2[it].Px()*particleMom2[it].Px() + particleMom2[it].Py()*particleMom2[it].Py() +
+                 particleMom2[it].Pz()*particleMom2[it].Pz() + masses[it]*masses[it];
+    double e = (esq>0.) ? sqrt(esq) : 0.;
+
+    temp.SetPxPyPzE(particleMom2[it].Px(),particleMom2[it].Py(),particleMom2[it].Pz(),e);
+    totalMom += temp;
+  }
+  return totalMom.M();
+}
+
+double CascadeTools::invariantMassError(const std::vector<TLorentzVector> &particleMom, const Amg::MatrixX& cov) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  unsigned int NTrk = particleMom.size();
+  TLorentzVector totalMom;
+  for( unsigned int it=0; it<NTrk; it++) totalMom += particleMom[it];
+
+  Amg::MatrixX D_vec(3*NTrk+3,1); D_vec.setZero();
+  for( unsigned int it=0; it<NTrk; it++) {
+    D_vec(3*it+3) = 2.*(totalMom.E()*particleMom[it].Px()/particleMom[it].E()-totalMom.Px());
+    D_vec(3*it+4) = 2.*(totalMom.E()*particleMom[it].Py()/particleMom[it].E()-totalMom.Py());
+    D_vec(3*it+5) = 2.*(totalMom.E()*particleMom[it].Pz()/particleMom[it].E()-totalMom.Pz());
+  }
+  Amg::MatrixX merr = D_vec.transpose() * cov * D_vec;
+  double massVarsq = merr(0,0);
+  if (massVarsq <= 0.) ATH_MSG_DEBUG("massError: negative sqrt massVarsq " << massVarsq);
+  double massVar = (massVarsq>0.) ? sqrt(massVarsq) : 0.;
+  double massErr = massVar/(2.*totalMom.M());
+  return massErr;
+}
+
+double CascadeTools::invariantMassError(const std::vector<TLorentzVector> &particleMom2, const Amg::MatrixX& cov, const std::vector<double> &masses) const
+{
+  if(particleMom2.size() == 0) return -999999.;
+  unsigned int NTrk = particleMom2.size();
+  if (masses.size() != NTrk) {
+    ATH_MSG_DEBUG("The provided number of masses does not match the number of tracks in the vertex");
+    return -999999.;
+  }
+  std::vector<TLorentzVector> particleMom(NTrk); particleMom.clear();
+  for( unsigned int it=0; it<NTrk; it++) {
+    double esq = particleMom2[it].Px()*particleMom2[it].Px() + particleMom2[it].Py()*particleMom2[it].Py() +
+                 particleMom2[it].Pz()*particleMom2[it].Pz() + masses[it]*masses[it];
+    double e = (esq>0.) ? sqrt(esq) : 0.;
+    particleMom[it].SetPxPyPzE(particleMom2[it].Px(),particleMom2[it].Py(),particleMom2[it].Pz(),e);
+  }
+  TLorentzVector totalMom;
+  for( unsigned int it=0; it<NTrk; it++) totalMom += particleMom[it];
+
+  std::vector<double>dm2dpx(NTrk), dm2dpy(NTrk), dm2dpz(NTrk);
+  for( unsigned int it=0; it<NTrk; it++) {
+    dm2dpx[it] = 2.*(totalMom.E()*particleMom[it].Px()/particleMom[it].E()-totalMom.Px());
+    dm2dpy[it] = 2.*(totalMom.E()*particleMom[it].Py()/particleMom[it].E()-totalMom.Py());
+    dm2dpz[it] = 2.*(totalMom.E()*particleMom[it].Pz()/particleMom[it].E()-totalMom.Pz());
+  }
+  Amg::MatrixX D_vec(3*NTrk+3,1); D_vec.setZero();
+  for( unsigned int it=0; it<NTrk; it++) {
+    D_vec(3*it+3) = dm2dpx[it];
+    D_vec(3*it+4) = dm2dpy[it];
+    D_vec(3*it+5) = dm2dpz[it];
+  }
+  Amg::MatrixX merr = D_vec.transpose() * cov * D_vec;
+  double massVarsq = merr(0,0);
+  if (massVarsq <= 0.) ATH_MSG_DEBUG("massError: negative sqrt massVarsq " << massVarsq);
+  double massVar = (massVarsq>0.) ? sqrt(massVarsq) : 0.;
+  double massErr = massVar/(2.*totalMom.M());
+  return massErr;
+}
+
+double CascadeTools::pT(const std::vector<TLorentzVector> &particleMom) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  Amg::Vector3D P = momentum(particleMom);;
+  return P.perp();
+}
+
+double CascadeTools::pTError(const std::vector<TLorentzVector> &particleMom, const Amg::MatrixX& cov) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  Amg::Vector3D P = momentum(particleMom);;
+  double Px = P.x();
+  double Py = P.y();
+  double PT = P.perp();
+
+  unsigned int NTrk = particleMom.size();
+  Amg::MatrixX D_vec(3*NTrk+3,1); D_vec.setZero();
+  for( unsigned int it=0; it<NTrk; it++) {
+    D_vec(3*it+3) = Px/PT;
+    D_vec(3*it+4) = Py/PT;
+    D_vec(3*it+5) = 0.;
+  }
+  Amg::MatrixX PtErrSq = D_vec.transpose() * cov * D_vec;
+  double PtErrsq = PtErrSq(0,0);
+  if (PtErrsq <= 0.) ATH_MSG_DEBUG("ptError: negative sqrt PtErrsq " << PtErrsq);
+  return (PtErrsq>0.) ? sqrt(PtErrsq) : 0.;
+}
+
+double CascadeTools::lxy(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  auto vert = SV->position() - PV->position();
+  double dx = vert.x();
+  double dy = vert.y();
+  Amg::Vector3D P = momentum(particleMom);;
+  double dxy = (P.x()*dx + P.y()*dy)/P.perp();
+  return dxy;
+}
+
+double CascadeTools::lxyError(const std::vector<TLorentzVector> &particleMom, const Amg::MatrixX& cov, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  auto vert = SV->position() - PV->position();
+  double dx = vert.x();
+  double dy = vert.y();
+  Amg::Vector3D P = momentum(particleMom);;
+  double Px = P.x();
+  double Py = P.y();
+  double PT = P.perp();
+  double LXYoverPT = (Px*dx+Py*dy)/(PT*PT);
+
+  unsigned int NTrk = particleMom.size();
+
+  double dLxydx = Px/PT;
+  double dLxydy = Py/PT;
+  double dLxydx0 = -dLxydx;
+  double dLxydy0 = -dLxydy;
+
+  Amg::MatrixX D_vec(3*NTrk+6,1); D_vec.setZero();
+  D_vec(0) = dLxydx;
+  D_vec(1) = dLxydy;
+  D_vec(2) = 0.;
+  for( unsigned int it=0; it<NTrk; it++) {
+    D_vec(3*it+3) = (dx - LXYoverPT*Px)/PT;
+    D_vec(3*it+4) = (dy - LXYoverPT*Py)/PT;
+    D_vec(3*it+5) = 0.;
+  }
+  D_vec(3*NTrk+3) = dLxydx0;
+  D_vec(3*NTrk+4) = dLxydy0;
+  D_vec(3*NTrk+5) = 0.;
+
+  unsigned int ndim = 3*NTrk+3;
+  Amg::MatrixX W_mat(3*NTrk+6,3*NTrk+6); W_mat.setZero();
+  W_mat.block(0,0,ndim,ndim) = cov;
+  W_mat.block(3*NTrk+3,3*NTrk+3,3,3) = PV->covariancePosition();
+  Amg::MatrixX V_err = D_vec.transpose() * W_mat * D_vec;
+
+  double LxyErrsq = V_err(0,0);
+  if (LxyErrsq <= 0.) ATH_MSG_DEBUG("lxyError: negative sqrt LxyErrsq " << LxyErrsq);
+  return (LxyErrsq>0.) ? sqrt(LxyErrsq) : 0.;
+}
+
+double CascadeTools::tau(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  double M = invariantMass(particleMom);
+  double LXY = lxy(particleMom,SV,PV);
+  double PT = pT(particleMom);
+  return s_CONST*M*LXY/PT;
+}
+
+double CascadeTools::tauError(const std::vector<TLorentzVector> &particleMom, const Amg::MatrixX& cov, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  double M = invariantMass(particleMom);
+  auto vert = SV->position() - PV->position();
+  double dx = vert.x();
+  double dy = vert.y();
+  Amg::Vector3D P = momentum(particleMom);;
+  double Px = P.x();
+  double Py = P.y();
+  double PT = P.perp();
+  double LXY = Px*dx+Py*dy;
+
+  unsigned int NTrk = particleMom.size();
+  TLorentzVector totalMom;
+  for( unsigned int it=0; it<NTrk; it++) totalMom += particleMom[it];
+
+  double dTaudx = (M*Px)/(PT*PT);
+  double dTaudy = (M*Py)/(PT*PT);
+  double dTaudx0 = -dTaudx;
+  double dTaudy0 = -dTaudy;
+
+  Amg::MatrixX D_vec(3*NTrk+6,1); D_vec.setZero();
+  D_vec(0) = dTaudx;
+  D_vec(1) = dTaudy;
+  D_vec(2) = 0.;
+  for( unsigned int it=0; it<NTrk; it++) {
+    D_vec(3*it+3) = (((totalMom.E()*particleMom[it].Px()*LXY)/(M*particleMom[it].E()))-Px*LXY/M+M*dx)/(PT*PT) - 2.*M*LXY*Px/(PT*PT*PT*PT);
+    D_vec(3*it+4) = (((totalMom.E()*particleMom[it].Py()*LXY)/(M*particleMom[it].E()))-Py*LXY/M+M*dy)/(PT*PT) - 2.*M*LXY*Py/(PT*PT*PT*PT);
+    D_vec(3*it+5) = 0.;
+  }
+  D_vec(3*NTrk+3) = dTaudx0;
+  D_vec(3*NTrk+4) = dTaudy0;
+  D_vec(3*NTrk+5) = 0.;
+
+  unsigned int ndim = 3*NTrk+3;
+  Amg::MatrixX W_mat(3*NTrk+6,3*NTrk+6); W_mat.setZero();
+  W_mat.block(0,0,ndim,ndim) = cov;
+  W_mat.block(3*NTrk+3,3*NTrk+3,3,3) = PV->covariancePosition();
+  Amg::MatrixX V_err = D_vec.transpose() * W_mat * D_vec;
+
+  double tauErrsq = V_err(0,0);
+  if (tauErrsq <= 0.) ATH_MSG_DEBUG("tauError: negative sqrt tauErrsq " << tauErrsq);
+  double tauErr = (tauErrsq>0.) ? sqrt(tauErrsq) : 0.;
+  return s_CONST*tauErr;
+}
+
+double CascadeTools::tau(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV, double M) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  double LXY = lxy(particleMom,SV,PV);
+  double PT = pT(particleMom);
+  return s_CONST*M*LXY/PT;
+}
+
+double CascadeTools::tauError(const std::vector<TLorentzVector> &particleMom, const Amg::MatrixX& cov, const xAOD::Vertex* SV, const xAOD::Vertex* PV, double M) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  auto vert = SV->position() - PV->position();
+  double dx = vert.x();
+  double dy = vert.y();
+  Amg::Vector3D P = momentum(particleMom);;
+  double Px = P.x();
+  double Py = P.y();
+  double PT = P.perp();
+  double LXY = Px*dx+Py*dy;
+
+  unsigned int NTrk = particleMom.size();
+  TLorentzVector totalMom;
+  for( unsigned int it=0; it<NTrk; it++) totalMom += particleMom[it];
+
+  double dTaudx = (M*Px)/(PT*PT);
+  double dTaudy = (M*Py)/(PT*PT);
+  double dTaudx0 = -dTaudx;
+  double dTaudy0 = -dTaudy;
+
+  Amg::MatrixX D_vec(3*NTrk+6,1); D_vec.setZero();
+  D_vec(0) = dTaudx;
+  D_vec(1) = dTaudy;
+  D_vec(2) = 0.;
+  for( unsigned int it=0; it<NTrk; it++) {
+    D_vec(3*it+3) = (M*dx)/(PT*PT) - 2.*M*LXY*Px/(PT*PT*PT*PT);
+    D_vec(3*it+4) = (M*dy)/(PT*PT) - 2.*M*LXY*Py/(PT*PT*PT*PT);
+    D_vec(3*it+5) = 0.;
+  }
+  D_vec(3*NTrk+3) = dTaudx0;
+  D_vec(3*NTrk+4) = dTaudy0;
+  D_vec(3*NTrk+5) = 0.;
+
+  unsigned int ndim = 3*NTrk+3;
+  Amg::MatrixX W_mat(3*NTrk+6,3*NTrk+6); W_mat.setZero();
+  W_mat.block(0,0,ndim,ndim) = cov;
+  W_mat.block(3*NTrk+3,3*NTrk+3,3,3) = PV->covariancePosition();
+  Amg::MatrixX V_err = D_vec.transpose() * W_mat * D_vec;
+
+  double tauErrsq = V_err(0,0);
+  if (tauErrsq <= 0.) ATH_MSG_DEBUG("tauError: negative sqrt tauErrsq " << tauErrsq);
+  double tauErr = (tauErrsq>0.) ? sqrt(tauErrsq) : 0.;
+  return s_CONST*tauErr;
+}
+
+Amg::Vector3D CascadeTools::pca(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const
+{
+  if(particleMom.size() == 0) {
+    Amg::Vector3D p; p.setZero();
+    return p;
+  }
+  Amg::Vector3D pv = PV->position();
+  Amg::Vector3D sv = SV->position();
+  Amg::Vector3D P = momentum(particleMom);;
+  double p2 = P.mag2();
+  double pdr = P.dot((sv - pv));
+  return sv - P*pdr/p2;
+}
+
+double CascadeTools::cosTheta(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  Amg::Vector3D P = momentum(particleMom);;
+  Amg::Vector3D vtx = SV->position();
+  vtx -= PV->position();
+  return (P.dot(vtx))/(P.mag()*vtx.mag());
+}
+
+double CascadeTools::cosTheta_xy(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  Amg::Vector3D P = momentum(particleMom);;
+  Amg::Vector3D vtx = SV->position();
+  vtx -= PV->position();
+  double pT = P.perp();
+  return (P.x()*vtx.x()+P.y()*vtx.y())/(pT*vtx.perp());
+}
+
+double CascadeTools::a0z(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  Amg::Vector3D pv = PV->position();
+  Amg::Vector3D ca_point = pca(particleMom,SV,PV);
+  Amg::Vector3D a0_vec = pv - ca_point;
+  return a0_vec.z();
+}
+
+double CascadeTools::a0zError(const std::vector<TLorentzVector> &particleMom, const Amg::MatrixX& cov, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  auto vert = SV->position() - PV->position();
+  double dx = vert.x();
+  double dy = vert.y();
+  double dz = vert.z();
+  Amg::Vector3D P = momentum(particleMom);;
+  double Px = P.x();
+  double Py = P.y();
+  double Pz = P.z();
+  double P2 = P.mag2();
+  double L = Px*dx+Py*dy+Pz*dz;
+
+  unsigned int NTrk = particleMom.size();
+
+
+  double da0zdx = (Px*Pz)/P2;
+  double da0zdy = (Py*Pz)/P2;
+  double da0zdz = (Pz*Pz)/P2 - 1.;
+  double da0zdx0 = -da0zdx;
+  double da0zdy0 = -da0zdy;
+  double da0zdz0 = -da0zdz;
+
+  Amg::MatrixX D_vec(3*NTrk+6,1); D_vec.setZero();
+  D_vec(0) = da0zdx;
+  D_vec(1) = da0zdy;
+  D_vec(2) = da0zdz;
+  for( unsigned int it=0; it<NTrk; it++) {
+    D_vec(3*it+3) = (Pz*(P2*dx-2.*L*Px))/(P2*P2);
+    D_vec(3*it+4) = (Pz*(P2*dy-2.*L*Py))/(P2*P2);
+    D_vec(3*it+5) = (Pz*(P2*dz-2.*L*Pz))/(P2*P2)+L/P2;
+  }
+  D_vec(3*NTrk+3) = da0zdx0;
+  D_vec(3*NTrk+4) = da0zdy0;
+  D_vec(3*NTrk+5) = da0zdz0;
+
+  unsigned int ndim = 3*NTrk+3;
+  Amg::MatrixX W_mat(3*NTrk+6,3*NTrk+6); W_mat.setZero();
+  W_mat.block(0,0,ndim,ndim) = cov;
+  W_mat.block(3*NTrk+3,3*NTrk+3,3,3) = PV->covariancePosition();
+  Amg::MatrixX V_err = D_vec.transpose() * W_mat * D_vec;
+
+  double a0zErrsq = V_err(0,0);
+  if (a0zErrsq <= 0.) ATH_MSG_DEBUG("a0zError: negative sqrt a0zErrsq " << a0zErrsq);
+  return (a0zErrsq>0.) ? sqrt(a0zErrsq) : 0.;
+}
+
+double CascadeTools::a0xy(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  double cosineTheta_xy = cosTheta_xy(particleMom,SV,PV);
+  double sinTheta_xy = ((1.-cosineTheta_xy*cosineTheta_xy)>0.) ? sqrt((1.-cosineTheta_xy*cosineTheta_xy)) : 0.;
+  return (SV->position()-PV->position()).perp() * sinTheta_xy;
+}
+
+double CascadeTools::a0xyError(const std::vector<TLorentzVector> &particleMom, const Amg::MatrixX& cov, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  auto vert = SV->position() - PV->position();
+  double dx = vert.x();
+  double dy = vert.y();
+  Amg::Vector3D P = momentum(particleMom);;
+  double Px = P.x();
+  double Py = P.y();
+  double P2 = P.perp()*P.perp();
+  double L = Px*dx+Py*dy;
+  double dR2 = vert.perp()*vert.perp();
+  double d = sqrt((P2*dR2-L*L)/P2);
+
+  unsigned int NTrk = particleMom.size();
+
+  double da0dx = (P2*dx-L*Px)/(P2*d);
+  double da0dy = (P2*dy-L*Py)/(P2*d);
+  double da0dx0 = -da0dx;
+  double da0dy0 = -da0dy;
+
+  Amg::MatrixX D_vec(3*NTrk+6,1); D_vec.setZero();
+  D_vec(0) = da0dx;
+  D_vec(1) = da0dy;
+  D_vec(2) = 0.;
+  for( unsigned int it=0; it<NTrk; it++) {
+    D_vec(3*it+3) = (L*(L*Px-P2*dx))/(P2*P2*d);
+    D_vec(3*it+4) = (L*(L*Py-P2*dy))/(P2*P2*d);
+    D_vec(3*it+5) = 0.;
+  }
+  D_vec(3*NTrk+3) = da0dx0;
+  D_vec(3*NTrk+4) = da0dy0;
+  D_vec(3*NTrk+5) = 0.;
+
+  unsigned int ndim = 3*NTrk+3;
+  Amg::MatrixX W_mat(3*NTrk+6,3*NTrk+6); W_mat.setZero();
+  W_mat.block(0,0,ndim,ndim) = cov;
+  W_mat.block(3*NTrk+3,3*NTrk+3,3,3) = PV->covariancePosition();
+  Amg::MatrixX V_err = D_vec.transpose() * W_mat * D_vec;
+
+  double a0xyErrsq = V_err(0,0);
+  if (a0xyErrsq <= 0.) ATH_MSG_DEBUG("a0xyError: negative sqrt a0xyErrsq " << a0xyErrsq);
+  return (a0xyErrsq>0.) ? sqrt(a0xyErrsq) : 0.;
+}
+
+double CascadeTools::a0(const std::vector<TLorentzVector> &particleMom, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  double cosineTheta = cosTheta(particleMom,SV,PV);
+  double sinTheta = ((1.-cosineTheta*cosineTheta)>0.) ? sqrt((1.-cosineTheta*cosineTheta)) : 0.;
+  return (SV->position()-PV->position()).mag() * sinTheta;
+}
+
+double CascadeTools::a0Error(const std::vector<TLorentzVector> &particleMom, const Amg::MatrixX& cov, const xAOD::Vertex* SV, const xAOD::Vertex* PV) const
+{
+  if(particleMom.size() == 0) return -999999.;
+  auto vert = SV->position() - PV->position();
+  double dx = vert.x();
+  double dy = vert.y();
+  double dz = vert.z();
+  Amg::Vector3D P = momentum(particleMom);;
+  double Px = P.x();
+  double Py = P.y();
+  double Pz = P.z();
+  double P2 = P.mag2();
+  double L = Px*dx+Py*dy+Pz*dz;
+  double dR2 = vert.mag2();
+  double d = sqrt((P2*dR2-L*L)/P2);
+
+  unsigned int NTrk = particleMom.size();
+
+  double da0dx = (P2*dx-L*Px)/(P2*d);
+  double da0dy = (P2*dy-L*Py)/(P2*d);
+  double da0dz = (P2*dz-L*Pz)/(P2*d);
+  double da0dx0 = -da0dx;
+  double da0dy0 = -da0dy;
+  double da0dz0 = -da0dz;
+
+  Amg::MatrixX D_vec(3*NTrk+6,1); D_vec.setZero();
+  D_vec(0) = da0dx;
+  D_vec(1) = da0dy;
+  D_vec(2) = da0dz;
+  for( unsigned int it=0; it<NTrk; it++) {
+    D_vec(3*it+3) = (L*(L*Px-P2*dx))/(P2*P2*d);
+    D_vec(3*it+4) = (L*(L*Py-P2*dy))/(P2*P2*d);
+    D_vec(3*it+5) = (L*(L*Pz-P2*dz))/(P2*P2*d);
+  }
+  D_vec(3*NTrk+3) = da0dx0;
+  D_vec(3*NTrk+4) = da0dy0;
+  D_vec(3*NTrk+5) = da0dz0;
+
+  unsigned int ndim = 3*NTrk+3;
+  Amg::MatrixX W_mat(3*NTrk+6,3*NTrk+6); W_mat.setZero();
+  W_mat.block(0,0,ndim,ndim) = cov;
+  W_mat.block(3*NTrk+3,3*NTrk+3,3,3) = PV->covariancePosition();
+  Amg::MatrixX V_err = D_vec.transpose() * W_mat * D_vec;
+
+  double a0Errsq = V_err(0,0);
+  if (a0Errsq <= 0.) ATH_MSG_DEBUG("a0Error: negative sqrt a0Errsq " << a0Errsq);
+  return (a0Errsq>0.) ? sqrt(a0Errsq) : 0.;
+}
+
+Amg::Vector3D CascadeTools::momentum(const std::vector<TLorentzVector> &particleMom) const
+{
+  if(particleMom.size() == 0) {
+    Amg::Vector3D p; p.setZero();
+    return p;
+  }
+  TLorentzVector totalMom;
+  unsigned int NTrk = particleMom.size();
+  for( unsigned int it=0; it<NTrk; it++) totalMom += particleMom[it];
+  TVector3 P3 = totalMom.Vect();
+  Amg::Vector3D mom(P3.Px(),P3.Py(),P3.Pz());
+  return mom;
+}
+
+double CascadeTools::massProbability(double V0Mass, double mass, double massErr) const
+{
+  if(massErr > 0.) {
+    double chi2 = (V0Mass - mass)*(V0Mass - mass)/(massErr*massErr);
+    int ndf = 1;
+    Genfun::CumulativeChiSquare myCumulativeChiSquare(ndf);
+    if (chi2 > 0.) {
+      double achi2prob = 1.-myCumulativeChiSquare(chi2);
+      return achi2prob;
+    } else {
+      ATH_MSG_DEBUG("chi2 <= 0");
+      return -1.;
+    }
+  } else {
+    return -1.;
+  }
+}
+
+double CascadeTools::vertexProbability(int ndf, double chi2) const
+{
+  if (ndf > 0.) {
+    Genfun::CumulativeChiSquare myCumulativeChiSquare(ndf);
+    if (chi2 > 0.) {
+      double chi2prob = 1.-myCumulativeChiSquare(chi2);
+      return chi2prob;
+    } else {
+      ATH_MSG_DEBUG("chi2 <= 0");
+      return -1.;
+    }
+  } else {
+    ATH_MSG_DEBUG("ndf <= 0");
+    return -1.;
+  }
+}
+
+
+Amg::MatrixX * CascadeTools::convertCovMatrix(const xAOD::Vertex * vxCandidate) const
+{
+  unsigned int NTrk = vxCandidate->nTrackParticles();
+  std::vector<float> matrix = vxCandidate->covariance();
+
+  int ndim = 0;
+
+  if ( matrix.size() == (3*NTrk+3)*(3*NTrk+3+1)/2) {
+    ndim = 3*NTrk+3;
+  } else if (matrix.size() == (5*NTrk+3)*(5*NTrk+3+1)/2) {
+    ndim = 5*NTrk+3;
+  } else {
+    return nullptr;
+  }
+
+  Amg::MatrixX* mtx = new Amg::MatrixX(ndim,ndim);
+
+  long int ij=0;
+  for (int i=1; i<= ndim; i++) {
+    for (int j=1; j<=i; j++){
+      if (i==j) {
+        (*mtx)(i-1,j-1)=matrix[ij];
+      } else {
+        (*mtx).fillSymmetric(i-1,j-1,matrix[ij]);
+      }
+      ij++;
+     }
+  }
+ // NOTE: mtx is a pointer! Take care of deleting it after you do not need it anymore!!!
+
+  return mtx;
+} 
+  
+Amg::MatrixX CascadeTools::SetFullMatrix(int NTrk, const std::vector<float> & Matrix) const
+{
+
+  Amg::MatrixX mtx(3+3*NTrk,3+3*NTrk);   // Create identity matrix of needed size
+
+  int ij=0;
+
+  for(int i=0; i<(3+3*NTrk); i++){
+    for(int j=0; j<=i; j++){
+                mtx(i,j)=Matrix[ij];
+       if(i!=j) mtx(j,i)=Matrix[ij];
+       ij++;
+    }
+  }
+
+  return mtx;
+}
+
+} //end of namespace definitions
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/CfAthAlgTool.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/CfAthAlgTool.cxx
new file mode 100644
index 000000000000..299340b7b3ac
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/CfAthAlgTool.cxx
@@ -0,0 +1,178 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//============================================================================
+// CfAthAlgTool.h
+//============================================================================
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Changes:
+//
+// Wrapper around AthAlgTool to provide easy access to CutFlowSvc
+// and some utility methods for it.
+// Methods for accessing the CutFlowSvc are modelled after
+// AthFilterAlgorithm's implementation.
+//
+// This class inherits from AthAlgTool.  It should be inherited from.
+//
+//-----------------------------------------------------------------------------
+//
+// Usage information
+//
+// Example:
+//
+//   // Bmumu_reco_mumu.h:
+//  class Bmumu_reco_mumu : public CfAthAlgTool, public IAugmentationTool {
+//    public: 
+//      Bmumu_reco_mumu(const std::string& t, const std::string& n,
+//                      const IInterface* p);
+//    ...
+//
+//   // Bmumu_reco_mumu.cxx:
+//  Bmumu_reco_mumu::Bmumu_reco_mumu(const std::string& t,
+//      const std::string& n,
+//      const IInterface* p) : 
+//    CfAthAlgTool(t,n,p),
+//    ...
+//
+//   // inside a method like Bmumu_reco_mumu::addBranches():
+//   ...
+//    // add counter for number of events seen
+//    addEvent("dimuEvents");
+//    // add counter for the number of events with >= 1 reco'd vertices
+//    if ( vtxContainer->size() > 0 ) {
+//      addEvent("dimuWithVertexCand");
+//    }
+//    // add counter for the number of vertices
+//    addToCounter("dimuNumVertices", vtxContainer->size());
+//    ...
+//
+// Please note that a line for
+//    addEvent(nameString, weight=1.);
+// or
+//    addToCounter(nameString, counts=1, weight=1.);
+// is sufficient.
+// In a case a counter with that name does not exist yet, it will be
+// initialized automatically.
+//
+//============================================================================
+//
+#include "DerivationFrameworkBPhys/CfAthAlgTool.h"
+
+namespace DerivationFramework {
+
+  //--------------------------------------------------------------------------
+  // Constructor
+  CfAthAlgTool::CfAthAlgTool(const std::string& t,
+			     const std::string& n,
+			     const IInterface*  p) : 
+    AthAlgTool(t,n,p),
+    m_cutFlowSvc("CutFlowSvc/CutFlowSvc", n),
+    m_ctbasename(n),
+    m_bid(0), m_bidisset(false) {
+
+    ATH_MSG_DEBUG("Calling constructor with parameters");
+
+    // Declare counters base name
+    declareProperty("CountersBaseName", m_ctbasename);
+
+    // clean-up counter base name
+    std::string fstr("ToolSvc.");
+    std::string::size_type ind = m_ctbasename.find(fstr);
+    if (ind != std::string::npos) m_ctbasename.erase(ind, fstr.length());
+
+  }
+  //--------------------------------------------------------------------------
+  // Destructor
+  CfAthAlgTool::~CfAthAlgTool() {
+    
+    ATH_MSG_DEBUG("Calling destructor");
+  }
+  //--------------------------------------------------------------------------
+  // return a handle to an ICutFlowSvc instance
+  ServiceHandle<ICutFlowSvc>& CfAthAlgTool::cutFlowSvc() const {
+
+    return m_cutFlowSvc;
+  }
+  //--------------------------------------------------------------------------
+  // Initialization method invoked by the framework.
+  StatusCode CfAthAlgTool::sysInitialize() {
+
+    // retrieve CutFlowSvc instance
+    CHECK( cutFlowSvc().retrieve() );
+    
+    // re-direct to base class...
+    return AthAlgTool::sysInitialize();
+  }
+  //--------------------------------------------------------------------------
+  // add one event to a named counter -- returns true on success
+  bool CfAthAlgTool::addEvent(const std::string &name, double weight) const {
+
+    CutIdentifier id = getCounter(name);
+    if ( id > 0 ) {
+      cutFlowSvc()->addEvent(id, weight);
+    }
+    return (id > 0);
+  }
+  //--------------------------------------------------------------------------
+  // add to a named counter -- returns true on success
+  // if counts > 1 : same weight is added multiple times
+  bool CfAthAlgTool::addToCounter(const std::string &name, uint64_t counts,
+				  double weight) const {
+
+    CutIdentifier id = getCounter(name);
+    if ( id > 0 ) {
+      for (uint64_t i=0; i<counts; ++i) {
+	cutFlowSvc()->addEvent(id, weight);
+      }
+    }
+    return (id > 0);
+  }
+  //--------------------------------------------------------------------------
+  // add a counter by name -- simply returns id if counter already exists
+  CutIdentifier CfAthAlgTool::getCounter(const std::string &name) const {
+
+    CutIdentifier id = getCounterIdByName(name);
+    if ( id < 1 ) {
+      std::string fullname = m_ctbasename + "_" + name;
+      if ( ! m_bidisset ) {
+        throw std::runtime_error("cutFlowSvc()->registerFilter is no longer supported. code an alternative here");
+	//id = cutFlowSvc()->registerFilter(fullname, "N/A");
+	m_bid = id;
+      } else {
+        throw std::runtime_error("cutFlowSvc()->registerCut is no longer supported. code an alternative here");
+	//id = cutFlowSvc()->registerCut(fullname, "N/A", m_bid);
+      }
+      m_mctn[name] = id;
+    }
+    return id;
+  }
+  //--------------------------------------------------------------------------
+  // returns counter name by id
+  std::string CfAthAlgTool::getCounterNameById(CutIdentifier id) const {
+
+    std::string res = "__NOT_FOUND__";
+
+    for (NameIdMap_t::iterator it = m_mctn.begin(); it != m_mctn.end(); ++it) {
+      if ( it->second == id ) {
+	res = it->first;
+	break;
+      }
+    }
+    return res;
+  }
+  //--------------------------------------------------------------------------
+  // returns counter id by name
+  CutIdentifier CfAthAlgTool::getCounterIdByName(const std::string &name) const {
+
+    CutIdentifier id = 0;
+    
+    NameIdMap_t::const_iterator it = m_mctn.find(name);
+    if ( it != m_mctn.end() ) {
+      id = it->second;
+    }
+    return id;
+  }
+  //--------------------------------------------------------------------------
+} // namespace
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/FourMuonTool.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/FourMuonTool.cxx
new file mode 100644
index 000000000000..bdf1acabf9e5
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/FourMuonTool.cxx
@@ -0,0 +1,449 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// ****************************************************************************
+// ----------------------------------------------------------------------------
+// FourMuonTool
+// James Catmore <James.Catmore@cern.ch>
+// Evelina Bouhova-Thacker <e.bouhova@cern.ch>
+// ----------------------------------------------------------------------------
+// ****************************************************************************
+
+#include "DerivationFrameworkBPhys/FourMuonTool.h"
+#include "DerivationFrameworkBPhys/BPhysPVTools.h"
+#include "xAODBPhys/BPhysHelper.h"
+#include "TrkVertexAnalysisUtils/V0Tools.h"
+#include "TrkVertexFitterInterfaces/IVertexFitter.h"
+#include "TrkVKalVrtFitter/TrkVKalVrtFitter.h"
+#include "TrkV0Fitter/TrkV0VertexFitter.h"
+#include "InDetConversionFinderTools/ConversionFinderUtils.h"
+#include "InDetConversionFinderTools/VertexPointEstimator.h"
+#include "TrkToolInterfaces/ITrackSelectorTool.h"
+#include "AthLinks/ElementLink.h"
+#include "BeamSpotConditionsData/BeamSpotData.h"
+
+#include "xAODTracking/Vertex.h"
+#include "xAODTracking/VertexContainer.h"
+#include "xAODTracking/VertexAuxContainer.h"
+#include "xAODTracking/TrackParticle.h"
+#include "xAODTracking/TrackParticleContainer.h"
+#include "StoreGate/WriteDecorHandle.h"
+
+#include <algorithm>
+
+namespace DerivationFramework {
+    
+    StatusCode FourMuonTool::initialize() {
+        
+        // retrieving vertex Fitter
+        if ( m_iVertexFitter.retrieve().isFailure() ) {
+            ATH_MSG_FATAL("Failed to retrieve tool " << m_iVertexFitter);
+            return StatusCode::FAILURE;
+        } else {
+            ATH_MSG_DEBUG("Retrieved tool " << m_iVertexFitter);
+        }
+        
+        // retrieving V0 Fitter
+        if ( m_iV0VertexFitter.retrieve().isFailure() ) {
+            ATH_MSG_FATAL("Failed to retrieve tool " << m_iV0VertexFitter);
+            return StatusCode::FAILURE;
+        } else {
+            ATH_MSG_DEBUG("Retrieved tool " << m_iV0VertexFitter);
+        }
+        
+        // Get the track selector tool from ToolSvc
+        if ( m_trkSelector.retrieve().isFailure() ) {
+            ATH_MSG_FATAL("Failed to retrieve tool " << m_trkSelector);
+            return StatusCode::FAILURE;
+        } else {
+            ATH_MSG_DEBUG("Retrieved tool " << m_trkSelector);
+        }
+        
+        // uploading the V0 tools
+        if ( m_V0Tools.retrieve().isFailure() ) {
+            ATH_MSG_FATAL("Failed to retrieve tool " << m_V0Tools);
+            return StatusCode::FAILURE;
+        } else {
+            ATH_MSG_DEBUG("Retrieved tool " << m_V0Tools);
+        }
+        
+        // Get the vertex point estimator tool from ToolSvc
+        if ( m_vertexEstimator.retrieve().isFailure() ) {
+            ATH_MSG_FATAL("Failed to retrieve tool " << m_vertexEstimator);
+            return StatusCode::FAILURE;
+        } else {
+            ATH_MSG_DEBUG("Retrieved tool " << m_vertexEstimator);
+        }
+
+        // Get the beam spot service
+        CHECK( m_beamSpotKey.initialize() );
+
+        m_muonIndex = m_muonCollectionKey.key() + ".BPHY4MuonIndex";
+        ATH_CHECK(m_muonIndex.initialize());
+        ATH_MSG_DEBUG("Initialize successful");
+        
+        return StatusCode::SUCCESS;
+        
+    }
+    
+    FourMuonTool::FourMuonTool(const std::string& t, const std::string& n, const IInterface* p)  : AthAlgTool(t,n,p),
+    m_ptCut(0.0),
+    m_etaCut(0.0),
+    m_useV0Fitter(false),
+    m_muonCollectionKey("Muons"),
+    m_TrkParticleCollection("TrackParticleCandidate"),
+    m_iVertexFitter("Trk::TrkVKalVrtFitter"),
+    m_iV0VertexFitter("Trk::V0VertexFitter"),
+    m_V0Tools("Trk::V0Tools"),
+    m_trkSelector("InDet::TrackSelectorTool"),
+    m_vertexEstimator("InDet::VertexPointEstimator")
+    {
+        declareInterface<FourMuonTool>(this);
+        declareProperty("ptCut",m_ptCut);
+        declareProperty("etaCut",m_etaCut);
+        declareProperty("useV0Fitter",m_useV0Fitter);
+        declareProperty("muonCollectionKey",m_muonCollectionKey);
+        declareProperty("TrackParticleCollection",m_TrkParticleCollection);
+        declareProperty("TrkVertexFitterTool",m_iVertexFitter);
+        declareProperty("V0VertexFitterTool",m_iV0VertexFitter);
+        declareProperty("V0Tools",m_V0Tools);
+        declareProperty("TrackSelectorTool",m_trkSelector);
+        declareProperty("VertexPointEstimator",m_vertexEstimator);
+    }
+    
+    FourMuonTool::~FourMuonTool() { }
+    
+    //-------------------------------------------------------------------------------------
+    // Find the candidates
+    //-------------------------------------------------------------------------------------
+    StatusCode FourMuonTool::performSearch(xAOD::VertexContainer*& pairVxContainer, xAOD::VertexAuxContainer*& pairVxAuxContainer,
+                                           xAOD::VertexContainer*& quadVxContainer, xAOD::VertexAuxContainer*& quadVxAuxContainer, bool &selectEvent) const
+    {
+        ATH_MSG_DEBUG( "FourMuonTool::performSearch" );
+	selectEvent = false;	
+
+        // pairs
+        pairVxContainer = new xAOD::VertexContainer;
+        pairVxAuxContainer = new xAOD::VertexAuxContainer;
+        pairVxContainer->setStore(pairVxAuxContainer);
+        // quads
+        quadVxContainer = new xAOD::VertexContainer;
+        quadVxAuxContainer = new xAOD::VertexAuxContainer;
+        quadVxContainer->setStore(quadVxAuxContainer);
+        
+        
+        // Get the muons from StoreGate
+        SG::ReadHandle<xAOD::MuonContainer> importedMuonCollection(m_muonCollectionKey);
+        ATH_CHECK(importedMuonCollection.isValid());
+        ATH_MSG_DEBUG("Muon container size "<<importedMuonCollection->size());
+        
+        // Get ID tracks
+        SG::ReadHandle<xAOD::TrackParticleContainer> importedTrackCollection(m_TrkParticleCollection);
+        ATH_CHECK(importedTrackCollection.isValid());
+        ATH_MSG_DEBUG("ID TrackParticle container size "<< importedTrackCollection->size());
+        
+        // Select the muons
+        std::vector<const xAOD::Muon*>  theMuonsAfterSelection;
+        SG::WriteDecorHandle<xAOD::MuonContainer, int> muonDecorator(m_muonIndex);
+        unsigned int nCombMuons = 0;
+        unsigned int nSegmentTaggedMuons = 0;
+
+        for (auto muItr=importedMuonCollection->begin(); muItr!=importedMuonCollection->end(); ++muItr) {
+            if ( *muItr == NULL ) continue;
+            muonDecorator(**muItr) = -1; // all muons must be decorated
+            if (  ((*muItr)->muonType() != xAOD::Muon::Combined ) && ((*muItr)->muonType() != xAOD::Muon::SegmentTagged ) ) continue;
+            if (!(*muItr)->inDetTrackParticleLink().isValid()) continue; // No muons without ID tracks
+            auto& link = (*muItr)->inDetTrackParticleLink();
+            const xAOD::TrackParticle* muonTrk = *link;
+            if ( muonTrk==NULL) continue;
+            const xAOD::Vertex* vx = nullptr;
+            if ( !m_trkSelector->decision(*muonTrk, vx) ) continue; // all ID tracks must pass basic tracking cuts
+            if ( fabs(muonTrk->pt())<m_ptCut ) continue; //  pt cut
+            if ( fabs(muonTrk->eta())>m_etaCut ) continue; //  eta cut
+            if ( (*muItr)->muonType() == xAOD::Muon::Combined ) ++nCombMuons;
+            if ( (*muItr)->muonType() == xAOD::Muon::SegmentTagged ) ++nSegmentTaggedMuons;
+            theMuonsAfterSelection.push_back(*muItr);
+        }
+        unsigned int nSelectedMuons = theMuonsAfterSelection.size();
+        ATH_MSG_DEBUG("Number of muons after selection: " << nSelectedMuons);
+        ATH_MSG_DEBUG("of which " << nCombMuons << " are combined");
+        ATH_MSG_DEBUG("and " << nSegmentTaggedMuons << " are segment tagged");
+        if ( (nSelectedMuons < 4) || (nCombMuons < 1) ) {
+            ATH_MSG_DEBUG("Muon criteria not met. Skipping event.");
+            return StatusCode::SUCCESS;
+        }
+        selectEvent = true; // if we got this far we should definitively accept the event 
+  
+        // Decorators
+        SG::AuxElement::Decorator< std::string > indexDecorator("CombinationCode");
+        SG::AuxElement::Decorator< std::string > chargeDecorator("ChargeCode");
+        //SG::AuxElement::Decorator< double > acdcDecorator("ACminusDC");
+        //SG::AuxElement::Decorator< double > ssdcDecorator("SSminusDC");
+ 
+        // Order by pT
+        std::sort(theMuonsAfterSelection.begin(), theMuonsAfterSelection.end(), [](const xAOD::Muon *a, const xAOD::Muon *b) {
+            return b->pt() < a->pt();
+        });
+
+        // Decorate the selected muons (now pT ordered) with their index
+	unsigned int muonIndex(0);
+	for (auto selMuon : theMuonsAfterSelection) {
+	    muonDecorator(*selMuon) = muonIndex;
+            ++muonIndex;            
+	}
+
+        // Quadruplet combinatorics
+        std::vector<Combination> quadruplets;
+        std::vector<Combination> pairs;
+        buildCombinations(theMuonsAfterSelection,pairs,quadruplets,nSelectedMuons);
+        if (quadruplets.size()==0) {
+            ATH_MSG_DEBUG("No acceptable quadruplets");
+            return StatusCode::SUCCESS;
+        }
+       
+        // Get the beam spot (for the vertexing starting point)
+        SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey };
+        if(not beamSpotHandle.isValid()) ATH_MSG_ERROR("Cannot Retrieve " << m_beamSpotKey.key() );
+        const Amg::Vector3D &beamSpot = beamSpotHandle->beamPos();
+ 
+        // fit pairs
+        ATH_MSG_DEBUG("Successful pairs.....");
+        for (std::vector<Combination>::iterator pairItr = pairs.begin(); pairItr!=pairs.end(); ++pairItr) {
+            std::vector<const xAOD::TrackParticle*> theTracks = (*pairItr).trackParticles("pair1");
+            xAOD::Vertex* pairVxCandidate = fit(theTracks,importedTrackCollection.get(),beamSpot); // This line actually does the fitting and object making
+            if (pairVxCandidate != 0) {
+                // decorate the candidate with its codes
+                indexDecorator(*pairVxCandidate) = (*pairItr).combinationIndices();
+                chargeDecorator(*pairVxCandidate) = (*pairItr).combinationCharges();
+                // decorate the candidate with refitted tracks and muons via the BPhysHelper
+                xAOD::BPhysHelper helper(pairVxCandidate);
+                helper.setRefTrks();
+                std::vector<const xAOD::Muon*> theStoredMuons;
+                theStoredMuons = (*pairItr).muons;
+                helper.setMuons(theStoredMuons,importedMuonCollection.get());
+                // Retain the vertex
+                pairVxContainer->push_back(pairVxCandidate);
+                ATH_MSG_DEBUG("..... indices: " << (*pairItr).combinationIndices() <<
+                              " charges: " << (*pairItr).combinationCharges() <<
+                              " chi2:    " << pairVxCandidate->chiSquared());
+            } else { // fit failed
+                ATH_MSG_DEBUG("Fitter failed!");
+            }
+        }
+        ATH_MSG_DEBUG("pairContainer size " << pairVxContainer->size());
+        
+        // fit quadruplets
+        ATH_MSG_DEBUG("Successful quadruplets.....");
+        for (std::vector<Combination>::iterator quadItr = quadruplets.begin(); quadItr!=quadruplets.end(); ++quadItr) {
+            std::vector<const xAOD::TrackParticle*> theDCTracks; theDCTracks.clear();
+            //std::vector<const xAOD::TrackParticle*> theACTracks; theACTracks.clear();
+            //std::vector<const xAOD::TrackParticle*> theSSTracks; theSSTracks.clear();
+            theDCTracks = (*quadItr).trackParticles("DC");
+            //theACTracks = (*quadItr).trackParticles("AC");
+            //theSSTracks = (*quadItr).trackParticles("SS");
+            xAOD::Vertex* dcVxCandidate = fit(theDCTracks,importedTrackCollection.get(), beamSpot);
+            //xAOD::Vertex* acVxCandidate = fit(theACTracks,importedTrackCollection, beamSpot);
+            //xAOD::Vertex* ssVxCandidate = fit(theSSTracks,importedTrackCollection, beamSpot);
+            // Get the chi2 for each one
+            //double acChi2(0.0);
+            //double ssChi2(0.0);
+            //if (acVxCandidate != 0) {acChi2 = acVxCandidate->chiSquared();}
+            //if (ssVxCandidate != 0) {ssChi2 = ssVxCandidate->chiSquared();}
+            if (dcVxCandidate != 0) {
+                // decorate the candidate with its codes
+                indexDecorator(*dcVxCandidate) = (*quadItr).combinationIndices();
+                chargeDecorator(*dcVxCandidate) = (*quadItr).combinationCharges();
+                // Decorate the DC candidate with the differences between its chi2 and the other
+                double dcChi2 = dcVxCandidate->chiSquared();
+                //acdcDecorator(*dcVxCandidate) = acChi2 - dcChi2;
+                //ssdcDecorator(*dcVxCandidate) = ssChi2 - dcChi2;
+                // decorate the candidate with refitted tracks and muons via the BPhysHelper
+                xAOD::BPhysHelper helper(dcVxCandidate);
+                helper.setRefTrks();
+                const std::vector<const xAOD::Muon*> &theStoredMuons = (*quadItr).muons;
+                helper.setMuons(theStoredMuons,importedMuonCollection.get());
+                // Retain the vertex
+                quadVxContainer->push_back(dcVxCandidate);
+                ATH_MSG_DEBUG("..... indices: " << (*quadItr).combinationIndices() <<
+                              " charges: " << (*quadItr).combinationCharges() <<
+                              " chi2(DC): " << dcChi2);
+                              //" chi2(AC): " << acChi2 <<
+                              //" chi2(SS): " << ssChi2);
+            } else { // fit failed
+                ATH_MSG_DEBUG("Fitter failed!");
+            }
+        }
+        ATH_MSG_DEBUG("quadruplet container size " << quadVxContainer->size());
+        
+        return StatusCode::SUCCESS;;
+    }
+    
+    // *********************************************************************************
+    
+    // ---------------------------------------------------------------------------------
+    // fit - does the fit
+    // ---------------------------------------------------------------------------------
+    
+    xAOD::Vertex* FourMuonTool::fit(const std::vector<const xAOD::TrackParticle*> &inputTracks,
+                                    const xAOD::TrackParticleContainer* importedTrackCollection,
+                                    const Amg::Vector3D &beamSpot) const {
+        
+        const Trk::TrkV0VertexFitter* concreteVertexFitter=0;
+        if (m_useV0Fitter) {
+            // making a concrete fitter for the V0Fitter
+            concreteVertexFitter = dynamic_cast<const Trk::TrkV0VertexFitter * >(&(*m_iV0VertexFitter));
+            if(concreteVertexFitter == 0) {
+                ATH_MSG_FATAL("The vertex fitter passed is not a V0 Vertex Fitter");
+                return NULL;
+            }
+        }
+        
+        //int sflag = 0;
+        //int errorcode = 0;
+        //Amg::Vector3D startingPoint = m_vertexEstimator->getCirclesIntersectionPoint(&aPerigee1,&aPerigee2,sflag,errorcode);
+        //startingPoint(0) = 0.0; startingPoint(1) = 0.0; startingPoint(2) = 0.0;}
+        //Trk::Vertex vertex(beamSpot);
+
+        xAOD::Vertex* myVxCandidate = nullptr;
+        if (m_useV0Fitter) {
+            myVxCandidate = concreteVertexFitter->fit(inputTracks, beamSpot /*vertex startingPoint*/ );
+        } else {
+            myVxCandidate = m_iVertexFitter->fit(inputTracks, beamSpot /*vertex startingPoint*/ );
+        }
+        
+        if(myVxCandidate) BPhysPVTools::PrepareVertexLinks(myVxCandidate, importedTrackCollection);
+        
+        return myVxCandidate;
+        
+    } // End of fit method
+    
+    
+    // *********************************************************************************
+    
+    // ---------------------------------------------------------------------------------
+    // getQuadIndices: forms up index lists
+    // ---------------------------------------------------------------------------------
+    
+    std::vector<std::vector<unsigned int> > FourMuonTool::getQuadIndices(unsigned int length) {
+        
+        std::vector<std::vector<unsigned int> > quadIndices = mFromN(4,length);
+        return(quadIndices);
+    }
+    
+    
+    // *********************************************************************************
+    
+    // ---------------------------------------------------------------------------------
+    // mFromN and combinatorics
+    // ---------------------------------------------------------------------------------
+    std::vector<std::vector<unsigned int> > FourMuonTool::mFromN(unsigned int m, unsigned int N) {
+        
+        std::vector<std::vector<unsigned int> > allCombinations;
+        std::vector<unsigned int> mainList;
+        std::vector<unsigned int> combination;
+        for (unsigned int i=0; i<N; ++i) mainList.push_back(i);
+        combinatorics(0,m,combination,mainList,allCombinations);
+        return allCombinations;
+    }
+    
+    void FourMuonTool::combinatorics(unsigned int offset,
+                       unsigned int k,
+                       std::vector<unsigned int> &combination,
+                       std::vector<unsigned int> &mainList,
+                       std::vector<std::vector<unsigned int> > &allCombinations) {
+        if (k==0) {
+            allCombinations.push_back(combination);
+            return;
+        }
+        if (k>0) {
+            for (unsigned int i=offset; i<=mainList.size()-k; ++i) {
+                combination.push_back(mainList[i]);
+                combinatorics(i+1,k-1,combination,mainList,allCombinations);
+                combination.pop_back();
+            }
+        }
+    }
+    
+    // ---------------------------------------------------------------------------------
+    // getPairIndices
+    // ---------------------------------------------------------------------------------
+    
+    std::vector<std::pair<unsigned int, unsigned int> > FourMuonTool::getPairIndices(unsigned int length){
+        
+        std::vector<std::pair<unsigned int, unsigned int> > uniquePairs;
+        std::vector<std::vector<unsigned int> > doublets = mFromN(2,length);
+        for (std::vector<std::vector<unsigned int> >::iterator it=doublets.begin(); it!=doublets.end(); ++it) {     
+                std::pair<unsigned int, unsigned int> tmpPair = std::make_pair((*it).at(0),(*it).at(1));
+                uniquePairs.push_back(tmpPair);
+        }
+        
+        return(uniquePairs);
+    }
+    
+    
+    
+    // *********************************************************************************
+    
+    // ---------------------------------------------------------------------------------
+    // buildCombinations: forms up the quadruplet of muons/tracks
+    // ---------------------------------------------------------------------------------
+    
+    void FourMuonTool::buildCombinations(const std::vector<const xAOD::Muon*> &muonsIn,
+                                         std::vector<Combination> &pairs,
+                                         std::vector<Combination> &quadruplets,
+                                         unsigned int nSelectedMuons) {
+        
+        std::vector<std::vector<unsigned int> > quadrupletIndices = getQuadIndices(nSelectedMuons);
+        std::vector<std::pair<unsigned int, unsigned int> > pairIndices = getPairIndices(nSelectedMuons);
+        
+        // Quadruplets
+        std::vector<std::vector<unsigned int> >::iterator quadItr;
+        for (quadItr=quadrupletIndices.begin(); quadItr!=quadrupletIndices.end(); ++quadItr) {
+            const std::vector<unsigned int> &quad = (*quadItr);
+            std::vector<const xAOD::Muon*> theMuons = {muonsIn[quad[0]],muonsIn[quad[1]],muonsIn[quad[2]],muonsIn[quad[3]]};
+            if (!passesQuadSelection(theMuons)) continue;
+            Combination tmpQuad;
+            tmpQuad.muons = std::move(theMuons);
+            tmpQuad.quadIndices = quad;
+            quadruplets.emplace_back(std::move(tmpQuad));
+        }
+        if (quadruplets.size() == 0) return;
+        
+        // pairs
+        std::vector<std::pair<unsigned int, unsigned int> >::iterator pairItr;
+        for (pairItr=pairIndices.begin(); pairItr!=pairIndices.end(); ++pairItr) {
+            std::pair<unsigned int, unsigned int> pair = (*pairItr);
+            Combination tmpPair;
+            std::vector<const xAOD::Muon*> theMuons = {muonsIn[pair.first],muonsIn[pair.second]};
+            tmpPair.muons = std::move(theMuons);
+            tmpPair.pairIndices = pair;
+            pairs.emplace_back(std::move(tmpPair));
+        }
+        
+        return;
+        
+    }
+    
+    // *********************************************************************************
+    
+    // ---------------------------------------------------------------------------------
+    // passesQuadSelection: 4-muon selection
+    // ---------------------------------------------------------------------------------
+    
+    bool FourMuonTool::passesQuadSelection(const std::vector<const xAOD::Muon*> &muons) {
+        bool accept(false);
+        bool charges(true);
+        bool quality(false);
+        //unsigned int sumCharges = abs(mu0->charge() + mu1->charge() + mu2->charge() + mu3->charge());
+        //if (sumCharges<4) charges = true;
+        if ((  muons.at(0)->muonType() == xAOD::Muon::Combined ) ||
+            (  muons.at(1)->muonType() == xAOD::Muon::Combined ) ||
+            (  muons.at(2)->muonType() == xAOD::Muon::Combined ) ||
+            (  muons.at(3)->muonType() == xAOD::Muon::Combined )
+            ) quality = true;
+        if (charges && quality) accept = true;
+        return accept;
+    }
+    
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/JpsiPlusDpstCascade.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/JpsiPlusDpstCascade.cxx
new file mode 100644
index 000000000000..04f187bf3d8c
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/JpsiPlusDpstCascade.cxx
@@ -0,0 +1,724 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+/////////////////////////////////////////////////////////////////
+// JpsiPlusDpstCascade.cxx, (c) ATLAS Detector software
+/////////////////////////////////////////////////////////////////
+#include "DerivationFrameworkBPhys/JpsiPlusDpstCascade.h"
+#include "TrkVertexFitterInterfaces/IVertexFitter.h"
+#include "TrkVKalVrtFitter/TrkVKalVrtFitter.h"
+#include "TrkVertexAnalysisUtils/V0Tools.h"
+#include "GaudiKernel/IPartPropSvc.h"
+#include "DerivationFrameworkBPhys/CascadeTools.h"
+#include "DerivationFrameworkBPhys/BPhysPVCascadeTools.h"
+#include "xAODTracking/VertexAuxContainer.h"
+#include "xAODBPhys/BPhysHypoHelper.h"
+#include <algorithm>
+#include "xAODTracking/VertexContainer.h"
+#include "DerivationFrameworkBPhys/LocalVector.h"
+#include "HepPDT/ParticleDataTable.hh"
+
+namespace DerivationFramework {
+    typedef ElementLink<xAOD::VertexContainer> VertexLink;
+    typedef std::vector<VertexLink> VertexLinkVector;
+    typedef std::vector<const xAOD::TrackParticle*> TrackBag;
+
+
+    StatusCode JpsiPlusDpstCascade::initialize() {
+
+        // retrieving vertex Fitter
+        ATH_CHECK( m_iVertexFitter.retrieve());
+        
+        // retrieving the V0 tools
+        ATH_CHECK( m_V0Tools.retrieve());
+
+        // retrieving the Cascade tools
+        ATH_CHECK( m_CascadeTools.retrieve());
+
+        // Get the beam spot service
+        ATH_CHECK(m_beamSpotKey.initialize());
+
+        IPartPropSvc* partPropSvc = nullptr;
+        ATH_CHECK( service("PartPropSvc", partPropSvc, true) );
+        auto pdt = partPropSvc->PDT();
+
+        // retrieve particle masses
+        if(m_mass_jpsi < 0. ) m_mass_jpsi = BPhysPVCascadeTools::getParticleMass(pdt, PDG::J_psi);
+        if(m_vtx0MassHypo < 0.) m_vtx0MassHypo = BPhysPVCascadeTools::getParticleMass(pdt, PDG::B_c_plus);
+        if(m_vtx1MassHypo < 0.) m_vtx1MassHypo = BPhysPVCascadeTools::getParticleMass(pdt, PDG::D0);
+
+        if(m_vtx0Daug1MassHypo < 0.) m_vtx0Daug1MassHypo = BPhysPVCascadeTools::getParticleMass(pdt, PDG::mu_minus);
+        if(m_vtx0Daug2MassHypo < 0.) m_vtx0Daug2MassHypo = BPhysPVCascadeTools::getParticleMass(pdt, PDG::mu_minus);
+        if(m_vtx0Daug3MassHypo < 0.) m_vtx0Daug3MassHypo = BPhysPVCascadeTools::getParticleMass(pdt, PDG::pi_plus);
+        if(m_vtx1Daug1MassHypo < 0.) m_vtx1Daug1MassHypo = BPhysPVCascadeTools::getParticleMass(pdt, PDG::pi_plus);
+        if(m_vtx1Daug2MassHypo < 0.) m_vtx1Daug2MassHypo = BPhysPVCascadeTools::getParticleMass(pdt, PDG::K_plus);
+
+        return StatusCode::SUCCESS;
+    }
+
+
+    StatusCode JpsiPlusDpstCascade::addBranches() const
+    {
+      std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
+      constexpr int topoN = 2;
+      std::array<xAOD::VertexContainer*, topoN> Vtxwritehandles;
+      std::array<xAOD::VertexAuxContainer*, topoN> Vtxwritehandlesaux;
+      if(m_cascadeOutputsKeys.size() !=topoN)  { ATH_MSG_FATAL("Incorrect number of VtxContainers"); return StatusCode::FAILURE; }
+
+      for(int i =0; i<topoN;i++){
+         Vtxwritehandles[i] = new xAOD::VertexContainer();
+         Vtxwritehandlesaux[i] = new xAOD::VertexAuxContainer();
+         Vtxwritehandles[i]->setStore(Vtxwritehandlesaux[i]);
+         ATH_CHECK(evtStore()->record(Vtxwritehandles[i]   , m_cascadeOutputsKeys[i]       ));
+         ATH_CHECK(evtStore()->record(Vtxwritehandlesaux[i], m_cascadeOutputsKeys[i] + "Aux."));
+      }
+
+      //----------------------------------------------------
+      // retrieve primary vertices
+      //----------------------------------------------------
+      const xAOD::Vertex * primaryVertex(nullptr);
+      const xAOD::VertexContainer *pvContainer(nullptr);
+      ATH_CHECK(evtStore()->retrieve(pvContainer, m_VxPrimaryCandidateName));
+      ATH_MSG_DEBUG("Found " << m_VxPrimaryCandidateName << " in StoreGate!");
+
+      if (pvContainer->size()==0){
+        ATH_MSG_WARNING("You have no primary vertices: " << pvContainer->size());
+        return StatusCode::RECOVERABLE;
+      } else {
+        primaryVertex = (*pvContainer)[0];
+      }
+
+      //----------------------------------------------------
+      // Try to retrieve refitted primary vertices
+      //----------------------------------------------------
+      xAOD::VertexContainer*    refPvContainer    = nullptr;
+      xAOD::VertexAuxContainer* refPvAuxContainer = nullptr;
+      if (m_refitPV) {
+        if (evtStore()->contains<xAOD::VertexContainer>(m_refPVContainerName)) {
+          // refitted PV container exists. Get it from the store gate
+          ATH_CHECK(evtStore()->retrieve(refPvContainer   , m_refPVContainerName       ));
+          ATH_CHECK(evtStore()->retrieve(refPvAuxContainer, m_refPVContainerName + "Aux."));
+        } else {
+          // refitted PV container does not exist. Create a new one.
+          refPvContainer = new xAOD::VertexContainer;
+          refPvAuxContainer = new xAOD::VertexAuxContainer;
+          refPvContainer->setStore(refPvAuxContainer);
+          ATH_CHECK(evtStore()->record(refPvContainer   , m_refPVContainerName));
+          ATH_CHECK(evtStore()->record(refPvAuxContainer, m_refPVContainerName+"Aux."));
+        }
+      }
+
+      ATH_CHECK(performSearch(&cascadeinfoContainer));
+
+      SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey };
+      if(not beamSpotHandle.isValid()) ATH_MSG_ERROR("Cannot Retrieve " << m_beamSpotKey.key() );
+      BPhysPVCascadeTools helper(&(*m_CascadeTools), beamSpotHandle.cptr());
+      helper.SetMinNTracksInPV(m_PV_minNTracks);
+
+      // Decorators for the main vertex: chi2, ndf, pt and pt error, plus the D0 vertex variables
+      SG::AuxElement::Decorator<VertexLinkVector> CascadeLinksDecor("CascadeVertexLinks"); 
+      SG::AuxElement::Decorator<VertexLinkVector> JpsipiLinksDecor("JpsipiVertexLinks"); 
+      SG::AuxElement::Decorator<VertexLinkVector> D0LinksDecor("D0VertexLinks"); 
+      SG::AuxElement::Decorator<float> chi2_decor("ChiSquared");
+      SG::AuxElement::Decorator<float> ndof_decor("NumberDoF");
+      SG::AuxElement::Decorator<float> Pt_decor("Pt");
+      SG::AuxElement::Decorator<float> PtErr_decor("PtErr");
+      SG::AuxElement::Decorator<float> Mass_svdecor("D0_mass");
+      SG::AuxElement::Decorator<float> MassErr_svdecor("D0_massErr");
+      SG::AuxElement::Decorator<float> Pt_svdecor("D0_Pt");
+      SG::AuxElement::Decorator<float> PtErr_svdecor("D0_PtErr");
+      SG::AuxElement::Decorator<float> Lxy_svdecor("D0_Lxy");
+      SG::AuxElement::Decorator<float> LxyErr_svdecor("D0_LxyErr");
+      SG::AuxElement::Decorator<float> Tau_svdecor("D0_Tau");
+      SG::AuxElement::Decorator<float> TauErr_svdecor("D0_TauErr");
+
+      SG::AuxElement::Decorator<float> MassMumu_decor("Mumu_mass");
+      SG::AuxElement::Decorator<float> MassKpi_svdecor("Kpi_mass");
+      SG::AuxElement::Decorator<float> MassJpsi_decor("Jpsi_mass");
+      SG::AuxElement::Decorator<float> MassPiD0_decor("PiD0_mass");
+
+      ATH_MSG_DEBUG("cascadeinfoContainer size " << cascadeinfoContainer.size());
+
+      // Get Jpsi+pi container and identify the input Jpsi+pi
+      const xAOD::VertexContainer  *jpsipiContainer(nullptr);
+      ATH_CHECK(evtStore()->retrieve(jpsipiContainer   , m_vertexContainerKey       ));
+      const xAOD::VertexContainer  *d0Container(nullptr);
+      ATH_CHECK(evtStore()->retrieve(d0Container   , m_vertexD0ContainerKey       ));
+
+      for (Trk::VxCascadeInfo* x : cascadeinfoContainer) {
+        if(x==nullptr) ATH_MSG_ERROR("cascadeinfoContainer is null");
+
+        // the cascade fitter returns:
+        // std::vector<xAOD::Vertex*>, each xAOD::Vertex contains the refitted track parameters (perigee at the vertex position)
+        //   vertices[iv]              the links to the original TPs and a covariance of size 3+5*NTRK; the chi2 of the total fit
+        //                             is split between the cascade vertices as per track contribution
+        // std::vector< std::vector<TLorentzVector> >, each std::vector<TLorentzVector> contains the refitted momenta (TLorentzVector)
+        //   momenta[iv][...]          of all tracks in the corresponding vertex, including any pseudotracks (from cascade vertices)
+        //                             originating in this vertex; the masses are as assigned in the cascade fit
+        // std::vector<Amg::MatrixX>,  the corresponding covariance matrices in momentum space
+        //   covariance[iv]
+        // int nDoF, double Chi2
+        //
+        // the invariant mass, pt, lifetime etc. errors should be calculated using the covariance matrices in momentum space as these
+        // take into account the full track-track and track-vertex correlations
+        //
+        // in the case of Jpsi+V0: vertices[0] is the V0 vertex, vertices[1] is the B/Lambda_b(bar) vertex, containing the 2 Jpsi tracks.
+        // The covariance terms between the two vertices are not stored. In momentum space momenta[0] contains the 2 V0 tracks,
+        // their momenta add up to the momentum of the 3rd track in momenta[1], the first two being the Jpsi tracks
+
+        const std::vector<xAOD::Vertex*> &cascadeVertices = x->vertices();
+        if(cascadeVertices.size()!=topoN)
+          ATH_MSG_ERROR("Incorrect number of vertices");
+        if(cascadeVertices[0] == nullptr || cascadeVertices[1] == nullptr) ATH_MSG_ERROR("Error null vertex");
+        // Keep vertices (bear in mind that they come in reverse order!)
+        for(int i =0;i<topoN;i++) Vtxwritehandles[i]->push_back(cascadeVertices[i]);
+        
+        x->setSVOwnership(false); // Prevent Container from deleting vertices
+        const auto mainVertex = cascadeVertices[1];   // this is the B_c+/- vertex
+        const std::vector< std::vector<TLorentzVector> > &moms = x->getParticleMoms();
+
+        // Set links to cascade vertices
+        std::vector<const xAOD::Vertex*> verticestoLink;
+        verticestoLink.push_back(cascadeVertices[0]);
+        if(Vtxwritehandles[1] == nullptr) ATH_MSG_ERROR("Vtxwritehandles[1] is null");
+        if(!BPhysPVCascadeTools::LinkVertices(CascadeLinksDecor, verticestoLink, Vtxwritehandles[0], cascadeVertices[1]))
+            ATH_MSG_ERROR("Error decorating with cascade vertices");
+
+        // Identify the input Jpsi+pi
+        const xAOD::Vertex* jpsipiVertex = BPhysPVCascadeTools::FindVertex<3>(jpsipiContainer, cascadeVertices[1]);
+        ATH_MSG_DEBUG("1 pt Jpsi+pi tracks " << cascadeVertices[1]->trackParticle(0)->pt() << ", " << cascadeVertices[1]->trackParticle(1)->pt() << ", " << cascadeVertices[1]->trackParticle(2)->pt());
+        if (jpsipiVertex) ATH_MSG_DEBUG("2 pt Jpsi+pi tracks " << jpsipiVertex->trackParticle(0)->pt() << ", " << jpsipiVertex->trackParticle(1)->pt() << ", " << jpsipiVertex->trackParticle(2)->pt());
+
+        // Identify the input D0
+        const xAOD::Vertex* d0Vertex = BPhysPVCascadeTools::FindVertex<2>(d0Container, cascadeVertices[0]);;
+        ATH_MSG_DEBUG("1 pt D0 tracks " << cascadeVertices[0]->trackParticle(0)->pt() << ", " << cascadeVertices[0]->trackParticle(1)->pt());
+        if (d0Vertex) ATH_MSG_DEBUG("2 pt D0 tracks " << d0Vertex->trackParticle(0)->pt() << ", " << d0Vertex->trackParticle(1)->pt());
+
+        // Set links to input vertices
+        std::vector<const xAOD::Vertex*> jpsipiVerticestoLink;
+        if (jpsipiVertex) jpsipiVerticestoLink.push_back(jpsipiVertex);
+        else ATH_MSG_WARNING("Could not find linking Jpsi+pi");
+        if(!BPhysPVCascadeTools::LinkVertices(JpsipiLinksDecor, jpsipiVerticestoLink, jpsipiContainer, cascadeVertices[1]))
+            ATH_MSG_ERROR("Error decorating with Jpsi+pi vertices");
+
+        std::vector<const xAOD::Vertex*> d0VerticestoLink;
+        if (d0Vertex) d0VerticestoLink.push_back(d0Vertex);
+        else ATH_MSG_WARNING("Could not find linking D0");
+        if(!BPhysPVCascadeTools::LinkVertices(D0LinksDecor, d0VerticestoLink, d0Container, cascadeVertices[1]))
+            ATH_MSG_ERROR("Error decorating with D0 vertices");
+
+        bool tagD0(true);
+        if (jpsipiVertex){
+          if(abs(m_Dx_pid)==421 && (jpsipiVertex->trackParticle(2)->charge()==-1)) tagD0 = false;
+        }
+
+        double mass_b = m_vtx0MassHypo;
+        double mass_d0 = m_vtx1MassHypo; 
+        std::vector<double> massesJpsipi;
+        massesJpsipi.push_back(m_vtx0Daug1MassHypo);
+        massesJpsipi.push_back(m_vtx0Daug2MassHypo);
+        massesJpsipi.push_back(m_vtx0Daug3MassHypo);
+        std::vector<double> massesD0;
+        if(tagD0){
+          massesD0.push_back(m_vtx1Daug1MassHypo);
+          massesD0.push_back(m_vtx1Daug2MassHypo);
+        }else{ // Change the oreder of masses for D*-->D0bar pi-, D0bar->K+pi-
+          massesD0.push_back(m_vtx1Daug2MassHypo);
+          massesD0.push_back(m_vtx1Daug1MassHypo);
+        }
+        std::vector<double> Masses;
+        Masses.push_back(m_vtx0Daug1MassHypo);
+        Masses.push_back(m_vtx0Daug2MassHypo);
+        Masses.push_back(m_vtx0Daug3MassHypo);
+        Masses.push_back(m_vtx1MassHypo);
+
+        // loop over candidates -- Don't apply PV_minNTracks requirement here
+        // because it may result in exclusion of the high-pt PV.
+        // get good PVs
+
+        xAOD::BPhysHypoHelper vtx(m_hypoName, mainVertex);
+
+        // Get refitted track momenta from all vertices, charged tracks only
+        BPhysPVCascadeTools::SetVectorInfo(vtx, x);
+
+        // Decorate main vertex
+        //
+        // 1.a) mass, mass error
+        BPHYS_CHECK( vtx.setMass(m_CascadeTools->invariantMass(moms[1])) );
+        BPHYS_CHECK( vtx.setMassErr(m_CascadeTools->invariantMassError(moms[1],x->getCovariance()[1])) );
+        // 1.b) pt and pT error (the default pt of mainVertex is != the pt of the full cascade fit!)
+        Pt_decor(*mainVertex) = m_CascadeTools->pT(moms[1]);
+        PtErr_decor(*mainVertex) = m_CascadeTools->pTError(moms[1],x->getCovariance()[1]);
+        // 1.c) chi2 and ndof (the default chi2 of mainVertex is != the chi2 of the full cascade fit!)
+        chi2_decor(*mainVertex) = x->fitChi2();
+        ndof_decor(*mainVertex) = x->nDoF();
+
+        float massMumu = 0.;
+        if (jpsipiVertex) {
+          TLorentzVector  p4_mu1, p4_mu2;
+          p4_mu1.SetPtEtaPhiM(jpsipiVertex->trackParticle(0)->pt(), 
+                              jpsipiVertex->trackParticle(0)->eta(),
+                              jpsipiVertex->trackParticle(0)->phi(), m_vtx0Daug1MassHypo); 
+          p4_mu2.SetPtEtaPhiM(jpsipiVertex->trackParticle(1)->pt(), 
+                              jpsipiVertex->trackParticle(1)->eta(),
+                              jpsipiVertex->trackParticle(1)->phi(), m_vtx0Daug2MassHypo); 
+          massMumu = (p4_mu1 + p4_mu2).M();
+        }
+        MassMumu_decor(*mainVertex) = massMumu;
+
+        float massKpi = 0.;
+        if (d0Vertex) {
+          TLorentzVector  p4_ka, p4_pi;
+          if(tagD0){
+            p4_pi.SetPtEtaPhiM(d0Vertex->trackParticle(0)->pt(), 
+                               d0Vertex->trackParticle(0)->eta(),
+                               d0Vertex->trackParticle(0)->phi(), m_vtx1Daug1MassHypo); 
+            p4_ka.SetPtEtaPhiM(d0Vertex->trackParticle(1)->pt(), 
+                               d0Vertex->trackParticle(1)->eta(),
+                               d0Vertex->trackParticle(1)->phi(), m_vtx1Daug2MassHypo); 
+          }else{ // Change the oreder of masses for D*-->D0bar pi-, D0bar->K+pi-
+            p4_pi.SetPtEtaPhiM(d0Vertex->trackParticle(1)->pt(), 
+                               d0Vertex->trackParticle(1)->eta(),
+                               d0Vertex->trackParticle(1)->phi(), m_vtx1Daug1MassHypo); 
+            p4_ka.SetPtEtaPhiM(d0Vertex->trackParticle(0)->pt(), 
+                               d0Vertex->trackParticle(0)->eta(),
+                               d0Vertex->trackParticle(0)->phi(), m_vtx1Daug2MassHypo); 
+          }
+          massKpi = (p4_ka + p4_pi).M();
+        }
+        MassKpi_svdecor(*mainVertex) = massKpi;
+        MassJpsi_decor(*mainVertex) = (moms[1][0] + moms[1][1]).M();
+        MassPiD0_decor(*mainVertex) = (moms[1][2] + moms[1][3]).M();
+
+
+        ATH_CHECK(helper.FillCandwithRefittedVertices(m_refitPV, pvContainer, 
+                                    refPvContainer, &(*m_pvRefitter), m_PV_max, m_DoVertexType, x, 1, mass_b, vtx));
+
+        // 4) decorate the main vertex with D0 vertex mass, pt, lifetime and lxy values (plus errors) 
+        // D0 points to the main vertex, so lifetime and lxy are w.r.t the main vertex
+        Mass_svdecor(*mainVertex) = m_CascadeTools->invariantMass(moms[0]);
+        MassErr_svdecor(*mainVertex) = m_CascadeTools->invariantMassError(moms[0],x->getCovariance()[0]);
+        Pt_svdecor(*mainVertex) = m_CascadeTools->pT(moms[0]);
+        PtErr_svdecor(*mainVertex) = m_CascadeTools->pTError(moms[0],x->getCovariance()[0]);
+        Lxy_svdecor(*mainVertex) = m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
+        LxyErr_svdecor(*mainVertex) = m_CascadeTools->lxyError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
+        Tau_svdecor(*mainVertex) = m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1]);
+        TauErr_svdecor(*mainVertex) = m_CascadeTools->tauError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
+
+        // Some checks in DEBUG mode
+        ATH_MSG_DEBUG("chi2 " << x->fitChi2()
+                  << " chi2_1 " << m_V0Tools->chisq(cascadeVertices[0])
+                  << " chi2_2 " << m_V0Tools->chisq(cascadeVertices[1])
+                  << " vprob " << m_CascadeTools->vertexProbability(x->nDoF(),x->fitChi2()));
+        ATH_MSG_DEBUG("ndf " << x->nDoF() << " ndf_1 " << m_V0Tools->ndof(cascadeVertices[0]) << " ndf_2 " << m_V0Tools->ndof(cascadeVertices[1]));
+        ATH_MSG_DEBUG("V0Tools mass_d0 " << m_V0Tools->invariantMass(cascadeVertices[0],massesD0)
+                   << " error " << m_V0Tools->invariantMassError(cascadeVertices[0],massesD0)
+                   << " mass_J " << m_V0Tools->invariantMass(cascadeVertices[1],massesJpsipi)
+                   << " error " << m_V0Tools->invariantMassError(cascadeVertices[1],massesJpsipi));
+        // masses and errors, using track masses assigned in the fit
+        double Mass_B = m_CascadeTools->invariantMass(moms[1]);
+        double Mass_D0 = m_CascadeTools->invariantMass(moms[0]);
+        double Mass_B_err = m_CascadeTools->invariantMassError(moms[1],x->getCovariance()[1]);
+        double Mass_D0_err = m_CascadeTools->invariantMassError(moms[0],x->getCovariance()[0]);
+        ATH_MSG_DEBUG("Mass_B " << Mass_B << " Mass_D0 " << Mass_D0);
+        ATH_MSG_DEBUG("Mass_B_err " << Mass_B_err << " Mass_D0_err " << Mass_D0_err);
+        double mprob_B = m_CascadeTools->massProbability(mass_b,Mass_B,Mass_B_err);
+        double mprob_D0 = m_CascadeTools->massProbability(mass_d0,Mass_D0,Mass_D0_err);
+        ATH_MSG_DEBUG("mprob_B " << mprob_B << " mprob_D0 " << mprob_D0);
+        // masses and errors, assigning user defined track masses
+        ATH_MSG_DEBUG("Mass_b " << m_CascadeTools->invariantMass(moms[1],Masses)
+                  << " Mass_d0 " << m_CascadeTools->invariantMass(moms[0],massesD0));
+        ATH_MSG_DEBUG("Mass_b_err " << m_CascadeTools->invariantMassError(moms[1],x->getCovariance()[1],Masses)
+                  << " Mass_d0_err " << m_CascadeTools->invariantMassError(moms[0],x->getCovariance()[0],massesD0));
+        ATH_MSG_DEBUG("pt_b " << m_CascadeTools->pT(moms[1])
+                  << " pt_d " << m_CascadeTools->pT(moms[0])
+                  << " pt_d0 " << m_V0Tools->pT(cascadeVertices[0]));
+        ATH_MSG_DEBUG("ptErr_b " << m_CascadeTools->pTError(moms[1],x->getCovariance()[1])
+                  << " ptErr_d " << m_CascadeTools->pTError(moms[0],x->getCovariance()[0])
+                  << " ptErr_d0 " << m_V0Tools->pTError(cascadeVertices[0]));
+        ATH_MSG_DEBUG("lxy_B " << m_V0Tools->lxy(cascadeVertices[1],primaryVertex) << " lxy_D " << m_V0Tools->lxy(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("lxy_b " << m_CascadeTools->lxy(moms[1],cascadeVertices[1],primaryVertex) << " lxy_d " << m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("lxyErr_b " << m_CascadeTools->lxyError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
+                  << " lxyErr_d " << m_CascadeTools->lxyError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
+                  << " lxyErr_d0 " << m_V0Tools->lxyError(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("tau_B " << m_CascadeTools->tau(moms[1],cascadeVertices[1],primaryVertex,mass_b)
+                   << " tau_d0 " << m_V0Tools->tau(cascadeVertices[0],cascadeVertices[1],massesD0));
+        ATH_MSG_DEBUG("tau_b " << m_CascadeTools->tau(moms[1],cascadeVertices[1],primaryVertex)
+                   << " tau_d " << m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1])
+                   << " tau_D " << m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1],mass_d0));
+        ATH_MSG_DEBUG("tauErr_b " << m_CascadeTools->tauError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
+                  << " tauErr_d " << m_CascadeTools->tauError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
+                  << " tauErr_d0 " << m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesD0));
+        ATH_MSG_DEBUG("TauErr_b " << m_CascadeTools->tauError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex,mass_b)
+                  << " TauErr_d " << m_CascadeTools->tauError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1],mass_d0)
+                  << " TauErr_d0 " << m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesD0,mass_d0));
+
+        ATH_MSG_DEBUG("CascadeTools main vert wrt PV " << " CascadeTools SV " << " V0Tools SV");
+        ATH_MSG_DEBUG("a0z " << m_CascadeTools->a0z(moms[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0z(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("a0zErr " << m_CascadeTools->a0zError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0zError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0zError(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("a0xy " << m_CascadeTools->a0xy(moms[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0xy(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("a0xyErr " << m_CascadeTools->a0xyError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0xyError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0xyError(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("a0 " << m_CascadeTools->a0(moms[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0(moms[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("a0Err " << m_CascadeTools->a0Error(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0Error(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0Error(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("x0 " << m_V0Tools->vtx(cascadeVertices[0]).x() << " y0 " << m_V0Tools->vtx(cascadeVertices[0]).y() << " z0 " << m_V0Tools->vtx(cascadeVertices[0]).z());
+        ATH_MSG_DEBUG("x1 " << m_V0Tools->vtx(cascadeVertices[1]).x() << " y1 " << m_V0Tools->vtx(cascadeVertices[1]).y() << " z1 " << m_V0Tools->vtx(cascadeVertices[1]).z());
+        ATH_MSG_DEBUG("X0 " << primaryVertex->x() << " Y0 " << primaryVertex->y() << " Z0 " << primaryVertex->z());
+        ATH_MSG_DEBUG("rxy0 " << m_V0Tools->rxy(cascadeVertices[0]) << " rxyErr0 " << m_V0Tools->rxyError(cascadeVertices[0]));
+        ATH_MSG_DEBUG("rxy1 " << m_V0Tools->rxy(cascadeVertices[1]) << " rxyErr1 " << m_V0Tools->rxyError(cascadeVertices[1]));
+        ATH_MSG_DEBUG("Rxy0 wrt PV " << m_V0Tools->rxy(cascadeVertices[0],primaryVertex) << " RxyErr0 wrt PV " << m_V0Tools->rxyError(cascadeVertices[0],primaryVertex));
+        ATH_MSG_DEBUG("Rxy1 wrt PV " << m_V0Tools->rxy(cascadeVertices[1],primaryVertex) << " RxyErr1 wrt PV " << m_V0Tools->rxyError(cascadeVertices[1],primaryVertex));
+        ATH_MSG_DEBUG("number of covariance matrices " << (x->getCovariance()).size());
+      } // loop over cascadeinfoContainer
+
+      // Deleting cascadeinfo since this won't be stored.
+      // Vertices have been kept in m_cascadeOutputs and should be owned by their container
+      for (auto x : cascadeinfoContainer) delete x;
+
+      return StatusCode::SUCCESS;
+    }
+
+
+    JpsiPlusDpstCascade::JpsiPlusDpstCascade(const std::string& t, const std::string& n, const IInterface* p)  : AthAlgTool(t,n,p),
+    m_vertexContainerKey(""),
+    m_vertexD0ContainerKey(""),
+    m_cascadeOutputsKeys{ "JpsiPlusDpstCascadeVtx1", "JpsiPlusDpstCascadeVtx2" },
+    m_VxPrimaryCandidateName("PrimaryVertices"),
+    m_jpsiMassLower(0.0),
+    m_jpsiMassUpper(10000.0),
+    m_jpsipiMassLower(0.0),
+    m_jpsipiMassUpper(10000.0),
+    m_D0MassLower(0.0),
+    m_D0MassUpper(10000.0),
+    m_DstMassLower(0.0),
+    m_DstMassUpper(10000.0),
+    m_MassLower(0.0),
+    m_MassUpper(20000.0),
+    m_vtx0MassHypo(-1),
+    m_vtx1MassHypo(-1),
+    m_vtx0Daug1MassHypo(-1),
+    m_vtx0Daug2MassHypo(-1),
+    m_vtx0Daug3MassHypo(-1),
+    m_vtx1Daug1MassHypo(-1),
+    m_vtx1Daug2MassHypo(-1),
+    m_mass_jpsi(-1),
+    m_Dx_pid(421),
+    m_constrD0(true),
+    m_constrJpsi(true),
+    m_chi2cut(-1.0),
+    m_iVertexFitter("Trk::TrkVKalVrtFitter"),
+    m_pvRefitter("Analysis::PrimaryVertexRefitter"),
+    m_V0Tools("Trk::V0Tools"),
+    m_CascadeTools("DerivationFramework::CascadeTools")
+    {
+       declareProperty("JpsipiVertices", m_vertexContainerKey);
+       declareProperty("D0Vertices", m_vertexD0ContainerKey);
+       declareProperty("VxPrimaryCandidateName", m_VxPrimaryCandidateName);
+       declareProperty("RefPVContainerName", m_refPVContainerName  = "RefittedPrimaryVertices");
+       declareProperty("JpsiMassLowerCut", m_jpsiMassLower);
+       declareProperty("JpsiMassUpperCut", m_jpsiMassUpper);
+       declareProperty("JpsipiMassLowerCut", m_jpsipiMassLower);
+       declareProperty("JpsipiMassUpperCut", m_jpsipiMassUpper);
+       declareProperty("D0MassLowerCut", m_D0MassLower);
+       declareProperty("D0MassUpperCut", m_D0MassUpper);
+       declareProperty("DstMassLowerCut", m_DstMassLower);
+       declareProperty("DstMassUpperCut", m_DstMassUpper);
+       declareProperty("MassLowerCut", m_MassLower);
+       declareProperty("MassUpperCut", m_MassUpper);
+       declareProperty("HypothesisName",            m_hypoName               = "Bc");
+       declareProperty("Vtx0MassHypo",              m_vtx0MassHypo);
+       declareProperty("Vtx1MassHypo",              m_vtx1MassHypo);
+       declareProperty("Vtx0Daug1MassHypo",         m_vtx0Daug1MassHypo);
+       declareProperty("Vtx0Daug2MassHypo",         m_vtx0Daug2MassHypo);
+       declareProperty("Vtx0Daug3MassHypo",         m_vtx0Daug3MassHypo);
+       declareProperty("Vtx1Daug1MassHypo",         m_vtx1Daug1MassHypo);
+       declareProperty("Vtx1Daug2MassHypo",         m_vtx1Daug2MassHypo);
+       declareProperty("JpsiMass",                  m_mass_jpsi);
+       declareProperty("DxHypothesis",              m_Dx_pid);
+       declareProperty("ApplyD0MassConstraint",     m_constrD0);
+       declareProperty("ApplyJpsiMassConstraint",   m_constrJpsi);
+       declareProperty("Chi2Cut",                   m_chi2cut);
+       declareProperty("RefitPV",                   m_refitPV                = true);
+       declareProperty("MaxnPV",                    m_PV_max                 = 999);
+       declareProperty("MinNTracksInPV",            m_PV_minNTracks          = 0);
+       declareProperty("DoVertexType",              m_DoVertexType           = 7);
+       declareProperty("TrkVertexFitterTool",       m_iVertexFitter);
+       declareProperty("PVRefitter",                m_pvRefitter);
+       declareProperty("V0Tools",                   m_V0Tools);
+       declareProperty("CascadeTools",              m_CascadeTools);
+       declareProperty("CascadeVertexCollections",  m_cascadeOutputsKeys);
+    }
+
+    JpsiPlusDpstCascade::~JpsiPlusDpstCascade(){ }
+
+    StatusCode JpsiPlusDpstCascade::performSearch(std::vector<Trk::VxCascadeInfo*> *cascadeinfoContainer) const
+    {
+        ATH_MSG_DEBUG( "JpsiPlusDpstCascade::performSearch" );
+        assert(cascadeinfoContainer!=nullptr);
+
+        // Get TrackParticle container (for setting links to the original tracks)
+        const xAOD::TrackParticleContainer  *trackContainer(nullptr);
+        ATH_CHECK(evtStore()->retrieve(trackContainer   , "InDetTrackParticles"      ));
+
+        // Get Jpsi+pi container
+        const xAOD::VertexContainer  *jpsipiContainer(nullptr);
+        ATH_CHECK(evtStore()->retrieve(jpsipiContainer   , m_vertexContainerKey       ));
+
+        // Get D0 container
+        const xAOD::VertexContainer  *d0Container(nullptr);
+        ATH_CHECK(evtStore()->retrieve(d0Container   , m_vertexD0ContainerKey       ));
+
+        double mass_d0 = m_vtx1MassHypo; 
+        std::vector<const xAOD::TrackParticle*> tracksJpsipi;
+        std::vector<const xAOD::TrackParticle*> tracksJpsi;
+        std::vector<const xAOD::TrackParticle*> tracksD0;
+        std::vector<const xAOD::TrackParticle*> tracksBc;
+        std::vector<double> massesJpsipi;
+        massesJpsipi.push_back(m_vtx0Daug1MassHypo);
+        massesJpsipi.push_back(m_vtx0Daug2MassHypo);
+        massesJpsipi.push_back(m_vtx0Daug3MassHypo);
+        std::vector<double> massesD0;
+        massesD0.push_back(m_vtx1Daug1MassHypo);
+        massesD0.push_back(m_vtx1Daug2MassHypo);
+        std::vector<double> massesD0b; // Change the oreder of masses for D*-->D0bar pi-, D0bar->K+pi-
+        massesD0b.push_back(m_vtx1Daug2MassHypo);
+        massesD0b.push_back(m_vtx1Daug1MassHypo);
+        std::vector<double> Masses;
+        Masses.push_back(m_vtx0Daug1MassHypo);
+        Masses.push_back(m_vtx0Daug2MassHypo);
+        Masses.push_back(m_vtx0Daug3MassHypo);
+        Masses.push_back(m_vtx1MassHypo);
+
+        // Select J/psi pi+ candidates before calling cascade fit
+        std::vector<const xAOD::Vertex*> selectedJpsipiCandidates;
+        for(auto vxcItr=jpsipiContainer->cbegin(); vxcItr!=jpsipiContainer->cend(); ++vxcItr) {
+
+           // Check the passed flag first
+           const xAOD::Vertex* vtx = *vxcItr;
+           SG::AuxElement::Accessor<Char_t> flagAcc1("passed_Jpsipi");
+           if(flagAcc1.isAvailable(*vtx)){
+              if(!flagAcc1(*vtx)) continue;
+           }
+
+           // Check J/psi candidate invariant mass and skip if need be
+           TLorentzVector p4Mup_in, p4Mum_in;
+           p4Mup_in.SetPtEtaPhiM((*vxcItr)->trackParticle(0)->pt(), 
+                                 (*vxcItr)->trackParticle(0)->eta(),
+                                 (*vxcItr)->trackParticle(0)->phi(), m_vtx0Daug1MassHypo); 
+           p4Mum_in.SetPtEtaPhiM((*vxcItr)->trackParticle(1)->pt(), 
+                                 (*vxcItr)->trackParticle(1)->eta(),
+                                 (*vxcItr)->trackParticle(1)->phi(), m_vtx0Daug2MassHypo); 
+           double mass_Jpsi = (p4Mup_in + p4Mum_in).M();
+           ATH_MSG_DEBUG("Jpsi mass " << mass_Jpsi);
+           if (mass_Jpsi < m_jpsiMassLower || mass_Jpsi > m_jpsiMassUpper) {
+             ATH_MSG_DEBUG(" Original Jpsi candidate rejected by the mass cut: mass = "
+                           << mass_Jpsi << " != (" << m_jpsiMassLower << ", " << m_jpsiMassUpper << ")" );
+             continue;
+           }
+
+           // Check J/psi pi+ candidate invariant mass and skip if need be
+           double mass_Jpsipi = m_V0Tools->invariantMass(*vxcItr, massesJpsipi);
+           ATH_MSG_DEBUG("Jpsipi mass " << mass_Jpsipi);
+           if (mass_Jpsipi < m_jpsipiMassLower || mass_Jpsipi > m_jpsipiMassUpper) {
+             ATH_MSG_DEBUG(" Original Jpsipi candidate rejected by the mass cut: mass = "
+                           << mass_Jpsipi << " != (" << m_jpsipiMassLower << ", " << m_jpsipiMassUpper << ")" );
+             continue;
+           }
+
+           selectedJpsipiCandidates.push_back(*vxcItr);
+        }
+        if(selectedJpsipiCandidates.size()<1) return StatusCode::SUCCESS;
+
+        // Select the D0/D0b candidates before calling cascade fit
+        std::vector<const xAOD::Vertex*> selectedD0Candidates;
+        for(auto vxcItr=d0Container->cbegin(); vxcItr!=d0Container->cend(); ++vxcItr) {
+
+           // Check the passed flag first
+           const xAOD::Vertex* vtx = *vxcItr;
+           SG::AuxElement::Accessor<Char_t> flagAcc1("passed_D0");
+           SG::AuxElement::Accessor<Char_t> flagAcc2("passed_D0b");
+           bool isD0(true);
+           bool isD0b(true);
+           if(flagAcc1.isAvailable(*vtx)){
+              if(!flagAcc1(*vtx)) isD0 = false;
+           }
+           if(flagAcc2.isAvailable(*vtx)){
+              if(!flagAcc2(*vtx)) isD0b = false;
+           }
+           if(!(isD0||isD0b)) continue;
+
+           // Ensure the total charge is correct
+           if ((*vxcItr)->trackParticle(0)->charge() != 1 || (*vxcItr)->trackParticle(1)->charge() != -1) {
+              ATH_MSG_DEBUG(" Original D0/D0-bar candidate rejected by the charge requirement: "
+                              << (*vxcItr)->trackParticle(0)->charge() << ", " << (*vxcItr)->trackParticle(1)->charge() );
+             continue;
+           }
+
+           // Check D0/D0bar candidate invariant mass and skip if need be
+           double mass_D0 = m_V0Tools->invariantMass(*vxcItr,massesD0);
+           double mass_D0b = m_V0Tools->invariantMass(*vxcItr,massesD0b);
+           ATH_MSG_DEBUG("D0 mass " << mass_D0 << ", D0b mass "<<mass_D0b);
+           if ((mass_D0 < m_D0MassLower || mass_D0 > m_D0MassUpper) && (mass_D0b < m_D0MassLower || mass_D0b > m_D0MassUpper)) {
+              ATH_MSG_DEBUG(" Original D0 candidate rejected by the mass cut: mass = "
+                            << mass_D0 << " != (" << m_D0MassLower << ", " << m_D0MassUpper << ") " 
+                            << mass_D0b << " != (" << m_D0MassLower << ", " << m_D0MassUpper << ") " );
+             continue;
+           }
+
+           selectedD0Candidates.push_back(*vxcItr);
+        }
+        if(selectedD0Candidates.size()<1) return StatusCode::SUCCESS;
+
+        // Select J/psi D*+ candidates
+        // Iterate over Jpsi+pi vertices
+        for(auto jpsipiItr=selectedJpsipiCandidates.cbegin(); jpsipiItr!=selectedJpsipiCandidates.cend(); ++jpsipiItr) {
+
+           size_t jpsipiTrkNum = (*jpsipiItr)->nTrackParticles();
+           tracksJpsipi.clear();
+           tracksJpsi.clear();
+           for( unsigned int it=0; it<jpsipiTrkNum; it++) tracksJpsipi.push_back((*jpsipiItr)->trackParticle(it));
+           for( unsigned int it=0; it<jpsipiTrkNum-1; it++) tracksJpsi.push_back((*jpsipiItr)->trackParticle(it));
+
+           if (tracksJpsipi.size() != 3 || massesJpsipi.size() != 3 ) {
+             ATH_MSG_INFO("problems with Jpsi+pi input");
+           }
+
+           bool tagD0(true);
+           if(abs(m_Dx_pid)==421 && (*jpsipiItr)->trackParticle(2)->charge()==-1) tagD0 = false;
+
+           TLorentzVector p4_pi1; // Momentum of soft pion
+           p4_pi1.SetPtEtaPhiM((*jpsipiItr)->trackParticle(2)->pt(), 
+                               (*jpsipiItr)->trackParticle(2)->eta(),
+                               (*jpsipiItr)->trackParticle(2)->phi(), m_vtx0Daug3MassHypo); 
+
+           // Iterate over D0/D0bar vertices
+           for(auto d0Itr=selectedD0Candidates.cbegin(); d0Itr!=selectedD0Candidates.cend(); ++d0Itr) {
+
+              // Check identical tracks in input
+              if(std::find(tracksJpsipi.cbegin(), tracksJpsipi.cend(), (*d0Itr)->trackParticle(0)) != tracksJpsipi.cend()) continue; 
+              if(std::find(tracksJpsipi.cbegin(), tracksJpsipi.cend(), (*d0Itr)->trackParticle(1)) != tracksJpsipi.cend()) continue; 
+
+
+              TLorentzVector p4_ka, p4_pi2;
+              if(tagD0){ // for D*+
+                p4_pi2.SetPtEtaPhiM((*d0Itr)->trackParticle(0)->pt(), 
+                                    (*d0Itr)->trackParticle(0)->eta(),
+                                    (*d0Itr)->trackParticle(0)->phi(), m_vtx1Daug1MassHypo); 
+                p4_ka.SetPtEtaPhiM( (*d0Itr)->trackParticle(1)->pt(), 
+                                    (*d0Itr)->trackParticle(1)->eta(),
+                                    (*d0Itr)->trackParticle(1)->phi(), m_vtx1Daug2MassHypo); 
+              }else{ // change the order in the case of D*-
+                p4_pi2.SetPtEtaPhiM((*d0Itr)->trackParticle(1)->pt(), 
+                                    (*d0Itr)->trackParticle(1)->eta(),
+                                    (*d0Itr)->trackParticle(1)->phi(), m_vtx1Daug1MassHypo); 
+                p4_ka.SetPtEtaPhiM( (*d0Itr)->trackParticle(0)->pt(), 
+                                    (*d0Itr)->trackParticle(0)->eta(),
+                                    (*d0Itr)->trackParticle(0)->phi(), m_vtx1Daug2MassHypo); 
+              }
+              // Check D*+/- candidate invariant mass and skip if need be
+              double mass_Dst= (p4_pi1 + p4_ka + p4_pi2).M();
+              ATH_MSG_DEBUG("D*+/- mass " << mass_Dst);
+              if (mass_Dst < m_DstMassLower || mass_Dst > m_DstMassUpper) {
+                ATH_MSG_DEBUG(" Original D*+/- candidate rejected by the mass cut: mass = "
+                              << mass_Dst << " != (" << m_DstMassLower << ", " << m_DstMassUpper << ")" );
+                continue;
+              }
+
+              size_t d0TrkNum = (*d0Itr)->nTrackParticles();
+              tracksD0.clear();
+              for( unsigned int it=0; it<d0TrkNum; it++) tracksD0.push_back((*d0Itr)->trackParticle(it));
+              if (tracksD0.size() != 2 || massesD0.size() != 2 ) {
+                ATH_MSG_INFO("problems with D0 input");
+              }
+
+              ATH_MSG_DEBUG("using tracks" << tracksJpsipi[0] << ", " << tracksJpsipi[1] << ", " << tracksJpsipi[2] << ", " << tracksD0[0] << ", " << tracksD0[1]);
+              ATH_MSG_DEBUG("Charge of Jpsi+pi tracks: "<<(*jpsipiItr)->trackParticle(0)->charge()<<", "<<(*jpsipiItr)->trackParticle(1)->charge()<<", "<<(*jpsipiItr)->trackParticle(2)->charge());
+              ATH_MSG_DEBUG("Charge of D0 tracks: "<<(*d0Itr)->trackParticle(0)->charge()<<", "<<(*d0Itr)->trackParticle(1)->charge());
+
+              tracksBc.clear();
+              for( unsigned int it=0; it<jpsipiTrkNum; it++) tracksBc.push_back((*jpsipiItr)->trackParticle(it));
+              for( unsigned int it=0; it<d0TrkNum; it++) tracksBc.push_back((*d0Itr)->trackParticle(it));
+              
+
+              // Apply the user's settings to the fitter
+              // Reset
+              std::unique_ptr<Trk::IVKalState> state (m_iVertexFitter->makeState());
+              // Robustness
+              int robustness = 0;
+              m_iVertexFitter->setRobustness(robustness, *state);
+              // Build up the topology
+              // Vertex list
+              std::vector<Trk::VertexID> vrtList;
+              // D0 vertex
+              Trk::VertexID vID;
+              if (m_constrD0) {
+                if(tagD0) vID = m_iVertexFitter->startVertex(tracksD0,massesD0,*state,mass_d0);
+                else vID = m_iVertexFitter->startVertex(tracksD0,massesD0b,*state,mass_d0);
+              } else {
+                if(tagD0) vID = m_iVertexFitter->startVertex(tracksD0,massesD0,*state);
+                else vID = m_iVertexFitter->startVertex(tracksD0,massesD0b,*state);
+              }
+              vrtList.push_back(vID);
+              // B vertex including Jpsi+pi
+              Trk::VertexID vID2 = m_iVertexFitter->nextVertex(tracksJpsipi,massesJpsipi,vrtList,*state);
+              if (m_constrJpsi) {
+                std::vector<Trk::VertexID> cnstV;
+                cnstV.clear();
+                if ( !m_iVertexFitter->addMassConstraint(vID2,tracksJpsi,cnstV,*state,m_mass_jpsi).isSuccess() ) {
+                  ATH_MSG_WARNING("addMassConstraint failed");
+                  //return StatusCode::FAILURE;
+                }
+              }
+              // Do the work
+              std::unique_ptr<Trk::VxCascadeInfo> result(m_iVertexFitter->fitCascade(*state));
+
+              if (result != nullptr) {
+
+                // reset links to original tracks
+                BPhysPVCascadeTools::PrepareVertexLinks(result.get(), trackContainer);
+                ATH_MSG_DEBUG("storing tracks " << ((result->vertices())[0])->trackParticle(0) << ", "
+                                                << ((result->vertices())[0])->trackParticle(1) << ", "
+                                                << ((result->vertices())[1])->trackParticle(0) << ", "
+                                                << ((result->vertices())[1])->trackParticle(1) << ", "
+                                                << ((result->vertices())[1])->trackParticle(2));
+                // necessary to prevent memory leak
+                result->setSVOwnership(true);
+
+                // Chi2/DOF cut
+                double bChi2DOF = result->fitChi2()/result->nDoF();
+                ATH_MSG_DEBUG("Candidate chi2/DOF is " << bChi2DOF);
+                bool chi2CutPassed = (m_chi2cut <= 0.0 || bChi2DOF < m_chi2cut);
+
+                const std::vector< std::vector<TLorentzVector> > &moms = result->getParticleMoms();
+                double mass = m_CascadeTools->invariantMass(moms[1]);
+                if(chi2CutPassed) {
+                  if (mass >= m_MassLower && mass <= m_MassUpper) {
+                    cascadeinfoContainer->push_back(result.release());
+                  } else {
+                    ATH_MSG_DEBUG("Candidate rejected by the mass cut: mass = "
+                                  << mass << " != (" << m_MassLower << ", " << m_MassUpper << ")" );
+                  }
+                }
+              }
+
+           } //Iterate over D0 vertices
+
+        } //Iterate over Jpsi+pi vertices
+
+        ATH_MSG_DEBUG("cascadeinfoContainer size " << cascadeinfoContainer->size());
+
+        return StatusCode::SUCCESS;
+    }
+
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/JpsiPlusDs1Cascade.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/JpsiPlusDs1Cascade.cxx
new file mode 100644
index 000000000000..e49a95911bc8
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/JpsiPlusDs1Cascade.cxx
@@ -0,0 +1,905 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+/////////////////////////////////////////////////////////////////
+// JpsiPlusDs1Cascade.cxx, (c) ATLAS Detector software
+/////////////////////////////////////////////////////////////////
+#include "DerivationFrameworkBPhys/JpsiPlusDs1Cascade.h"
+#include "TrkVertexFitterInterfaces/IVertexFitter.h"
+#include "TrkVKalVrtFitter/TrkVKalVrtFitter.h"
+#include "TrkVertexAnalysisUtils/V0Tools.h"
+#include "GaudiKernel/IPartPropSvc.h"
+#include "DerivationFrameworkBPhys/CascadeTools.h"
+#include "DerivationFrameworkBPhys/BPhysPVCascadeTools.h"
+#include "xAODTracking/VertexAuxContainer.h"
+#include "xAODBPhys/BPhysHypoHelper.h"
+#include <algorithm>
+#include "xAODTracking/VertexContainer.h"
+#include "DerivationFrameworkBPhys/LocalVector.h"
+
+namespace DerivationFramework {
+    typedef ElementLink<xAOD::VertexContainer> VertexLink;
+    typedef std::vector<VertexLink> VertexLinkVector;
+    typedef std::vector<const xAOD::TrackParticle*> TrackBag;
+
+    double JpsiPlusDs1Cascade::getParticleMass(int pdgcode) const{
+       auto ptr = m_particleDataTable->particle( pdgcode );
+       return ptr ? ptr->mass() : 0.;
+    }
+
+    StatusCode JpsiPlusDs1Cascade::initialize() {
+
+        // retrieving vertex Fitter
+        ATH_CHECK( m_iVertexFitter.retrieve());
+        
+        // retrieving the V0 tools
+        ATH_CHECK( m_V0Tools.retrieve());
+
+        // retrieving the Cascade tools
+        ATH_CHECK( m_CascadeTools.retrieve());
+
+        // Get the beam spot service
+        ATH_CHECK(m_beamSpotKey.initialize());
+
+        IPartPropSvc* partPropSvc = nullptr;
+        ATH_CHECK( service("PartPropSvc", partPropSvc, true) );
+        m_particleDataTable = partPropSvc->PDT();
+
+        // retrieve particle masses
+        if(m_mass_jpsi < 0. ) m_mass_jpsi = getParticleMass(PDG::J_psi);
+        if(m_vtx0MassHypo < 0.) m_vtx0MassHypo = getParticleMass(PDG::B_c_plus);
+        if(m_vtx1MassHypo < 0.) m_vtx1MassHypo = getParticleMass(PDG::D0);
+        if(m_vtx2MassHypo < 0.) m_vtx2MassHypo = getParticleMass(PDG::K_S0);
+
+        if(m_vtx0Daug1MassHypo < 0.) m_vtx0Daug1MassHypo = getParticleMass(PDG::mu_minus);
+        if(m_vtx0Daug2MassHypo < 0.) m_vtx0Daug2MassHypo = getParticleMass(PDG::mu_minus);
+        if(m_vtx0Daug3MassHypo < 0.) m_vtx0Daug3MassHypo = getParticleMass(PDG::pi_plus);
+        if(m_vtx1Daug1MassHypo < 0.) m_vtx1Daug1MassHypo = getParticleMass(PDG::pi_plus);
+        if(m_vtx1Daug2MassHypo < 0.) m_vtx1Daug2MassHypo = getParticleMass(PDG::K_plus);
+        if(m_vtx2Daug1MassHypo < 0.) m_vtx2Daug1MassHypo = getParticleMass(PDG::pi_plus);
+        if(m_vtx2Daug2MassHypo < 0.) m_vtx2Daug2MassHypo = getParticleMass(PDG::pi_plus);
+
+        return StatusCode::SUCCESS;
+    }
+
+
+    StatusCode JpsiPlusDs1Cascade::addBranches() const
+    {
+      std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
+      constexpr int topoN = 3;
+      std::array<xAOD::VertexContainer*, topoN> Vtxwritehandles;
+      std::array<xAOD::VertexAuxContainer*, topoN> Vtxwritehandlesaux;
+      if(m_cascadeOutputsKeys.size() !=topoN)  { ATH_MSG_FATAL("Incorrect number of VtxContainers"); return StatusCode::FAILURE; }
+
+      for(int i =0; i<topoN;i++){
+         Vtxwritehandles[i] = new xAOD::VertexContainer();
+         Vtxwritehandlesaux[i] = new xAOD::VertexAuxContainer();
+         Vtxwritehandles[i]->setStore(Vtxwritehandlesaux[i]);
+         ATH_CHECK(evtStore()->record(Vtxwritehandles[i]   , m_cascadeOutputsKeys[i]       ));
+         ATH_CHECK(evtStore()->record(Vtxwritehandlesaux[i], m_cascadeOutputsKeys[i] + "Aux."));
+      }
+
+      //----------------------------------------------------
+      // retrieve primary vertices
+      //----------------------------------------------------
+      const xAOD::Vertex * primaryVertex(nullptr);
+      const xAOD::VertexContainer *pvContainer(nullptr);
+      ATH_CHECK(evtStore()->retrieve(pvContainer, m_VxPrimaryCandidateName));
+      ATH_MSG_DEBUG("Found " << m_VxPrimaryCandidateName << " in StoreGate!");
+
+      if (pvContainer->size()==0){
+        ATH_MSG_WARNING("You have no primary vertices: " << pvContainer->size());
+        return StatusCode::RECOVERABLE;
+      } else {
+        primaryVertex = (*pvContainer)[0];
+      }
+
+      //----------------------------------------------------
+      // Try to retrieve refitted primary vertices
+      //----------------------------------------------------
+      xAOD::VertexContainer*    refPvContainer    = nullptr;
+      xAOD::VertexAuxContainer* refPvAuxContainer = nullptr;
+      if (m_refitPV) {
+        if (evtStore()->contains<xAOD::VertexContainer>(m_refPVContainerName)) {
+          // refitted PV container exists. Get it from the store gate
+          ATH_CHECK(evtStore()->retrieve(refPvContainer   , m_refPVContainerName       ));
+          ATH_CHECK(evtStore()->retrieve(refPvAuxContainer, m_refPVContainerName + "Aux."));
+        } else {
+          // refitted PV container does not exist. Create a new one.
+          refPvContainer = new xAOD::VertexContainer;
+          refPvAuxContainer = new xAOD::VertexAuxContainer;
+          refPvContainer->setStore(refPvAuxContainer);
+          ATH_CHECK(evtStore()->record(refPvContainer   , m_refPVContainerName));
+          ATH_CHECK(evtStore()->record(refPvAuxContainer, m_refPVContainerName+"Aux."));
+        }
+      }
+
+      ATH_CHECK(performSearch(&cascadeinfoContainer));
+
+      SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey };
+      if(not beamSpotHandle.isValid()) ATH_MSG_ERROR("Cannot Retrieve " << m_beamSpotKey.key() );
+      BPhysPVCascadeTools helper(&(*m_CascadeTools), beamSpotHandle.cptr());
+      helper.SetMinNTracksInPV(m_PV_minNTracks);
+
+      // Decorators for the main vertex: chi2, ndf, pt and pt error, plus the D0, K0 vertex variables
+      SG::AuxElement::Decorator<VertexLinkVector> CascadeV1LinksDecor("CascadeVertex1Links"); 
+      SG::AuxElement::Decorator<VertexLinkVector> CascadeV2LinksDecor("CascadeVertex2Links"); 
+      SG::AuxElement::Decorator<VertexLinkVector> JpsipiLinksDecor("JpsipiVertexLinks"); 
+      SG::AuxElement::Decorator<VertexLinkVector> D0LinksDecor("D0VertexLinks"); 
+      SG::AuxElement::Decorator<VertexLinkVector> K0LinksDecor("K0VertexLinks"); 
+      SG::AuxElement::Decorator<float> chi2_decor("ChiSquared");
+      SG::AuxElement::Decorator<float> ndof_decor("NumberDoF");
+      SG::AuxElement::Decorator<float> Pt_decor("Pt");
+      SG::AuxElement::Decorator<float> PtErr_decor("PtErr");
+      SG::AuxElement::Decorator<float> Mass_svdecor("D0_mass");
+      SG::AuxElement::Decorator<float> MassErr_svdecor("D0_massErr");
+      SG::AuxElement::Decorator<float> Pt_svdecor("D0_Pt");
+      SG::AuxElement::Decorator<float> PtErr_svdecor("D0_PtErr");
+      SG::AuxElement::Decorator<float> Lxy_svdecor("D0_Lxy");
+      SG::AuxElement::Decorator<float> LxyErr_svdecor("D0_LxyErr");
+      SG::AuxElement::Decorator<float> Tau_svdecor("D0_Tau");
+      SG::AuxElement::Decorator<float> TauErr_svdecor("D0_TauErr");
+
+      SG::AuxElement::Decorator<float> Mass_sv2decor("K0_mass");
+      SG::AuxElement::Decorator<float> MassErr_sv2decor("K0_massErr");
+      SG::AuxElement::Decorator<float> Pt_sv2decor("K0_Pt");
+      SG::AuxElement::Decorator<float> PtErr_sv2decor("K0_PtErr");
+      SG::AuxElement::Decorator<float> Lxy_sv2decor("K0_Lxy");
+      SG::AuxElement::Decorator<float> LxyErr_sv2decor("K0_LxyErr");
+      SG::AuxElement::Decorator<float> Tau_sv2decor("K0_Tau");
+      SG::AuxElement::Decorator<float> TauErr_sv2decor("K0_TauErr");
+
+      SG::AuxElement::Decorator<float> MassJpsi_decor("Jpsi_mass");
+      SG::AuxElement::Decorator<float> MassPiD0_decor("PiD0_mass");
+      SG::AuxElement::Decorator<float> MassPiD0K0_decor("PiD0K0_mass");
+
+      SG::AuxElement::Decorator<float> MassMumu_decor("Mumu_mass");
+      SG::AuxElement::Decorator<float> MassKpi_svdecor("Kpi_mass");
+      SG::AuxElement::Decorator<float> MassPipi_sv2decor("Pipi_mass");
+
+      ATH_MSG_DEBUG("cascadeinfoContainer size " << cascadeinfoContainer.size());
+
+      // Get Jpsi+pi container and identify the input Jpsi+pi
+      const xAOD::VertexContainer  *jpsipiContainer(nullptr);
+      ATH_CHECK(evtStore()->retrieve(jpsipiContainer   , m_vertexContainerKey       ));
+      // Get D0 container and identify the input D0
+      const xAOD::VertexContainer  *d0Container(nullptr);
+      ATH_CHECK(evtStore()->retrieve(d0Container   , m_vertexD0ContainerKey       ));
+      // Get K0 container and identify the input K0
+      const xAOD::VertexContainer  *k0Container(nullptr);
+      ATH_CHECK(evtStore()->retrieve(k0Container   , m_vertexK0ContainerKey       ));
+
+      for (Trk::VxCascadeInfo* x : cascadeinfoContainer) {
+        if(x==nullptr) ATH_MSG_ERROR("cascadeinfoContainer is null");
+
+        // the cascade fitter returns:
+        // std::vector<xAOD::Vertex*>, each xAOD::Vertex contains the refitted track parameters (perigee at the vertex position)
+        //   vertices[iv]              the links to the original TPs and a covariance of size 3+5*NTRK; the chi2 of the total fit
+        //                             is split between the cascade vertices as per track contribution
+        // std::vector< std::vector<TLorentzVector> >, each std::vector<TLorentzVector> contains the refitted momenta (TLorentzVector)
+        //   momenta[iv][...]          of all tracks in the corresponding vertex, including any pseudotracks (from cascade vertices)
+        //                             originating in this vertex; the masses are as assigned in the cascade fit
+        // std::vector<Amg::MatrixX>,  the corresponding covariance matrices in momentum space
+        //   covariance[iv]
+        // int nDoF, double Chi2
+        //
+        // the invariant mass, pt, lifetime etc. errors should be calculated using the covariance matrices in momentum space as these
+        // take into account the full track-track and track-vertex correlations
+        //
+        // in the case of Jpsi+V0: vertices[0] is the V0 vertex, vertices[1] is the B/Lambda_b(bar) vertex, containing the 2 Jpsi tracks.
+        // The covariance terms between the two vertices are not stored. In momentum space momenta[0] contains the 2 V0 tracks,
+        // their momenta add up to the momentum of the 3rd track in momenta[1], the first two being the Jpsi tracks
+
+        const std::vector<xAOD::Vertex*> &cascadeVertices = x->vertices();
+        if(cascadeVertices.size()!=topoN)
+          ATH_MSG_ERROR("Incorrect number of vertices");
+        if(cascadeVertices[0] == nullptr || cascadeVertices[1] == nullptr || cascadeVertices[2] == nullptr) ATH_MSG_ERROR("Error null vertex");
+        // Keep vertices (bear in mind that they come in reverse order!)
+        for(int i =0;i<topoN;i++) Vtxwritehandles[i]->push_back(cascadeVertices[i]);
+        
+        x->setSVOwnership(false); // Prevent Container from deleting vertices
+        const auto mainVertex = cascadeVertices[2];   // this is the B_c+/- vertex
+        const std::vector< std::vector<TLorentzVector> > &moms = x->getParticleMoms();
+
+        // Set links to cascade vertices
+        std::vector<const xAOD::Vertex*> verticestoLink;
+        verticestoLink.push_back(cascadeVertices[0]);
+      //if(Vtxwritehandles[1] == nullptr) ATH_MSG_ERROR("Vtxwritehandles[1] is null");
+        if(Vtxwritehandles[2] == nullptr) ATH_MSG_ERROR("Vtxwritehandles[2] is null");
+        if(!BPhysPVCascadeTools::LinkVertices(CascadeV1LinksDecor, verticestoLink, Vtxwritehandles[0], cascadeVertices[2]))
+            ATH_MSG_ERROR("Error decorating with cascade vertices");
+
+        verticestoLink.clear();
+        verticestoLink.push_back(cascadeVertices[1]);
+        if(!BPhysPVCascadeTools::LinkVertices(CascadeV2LinksDecor, verticestoLink, Vtxwritehandles[1], cascadeVertices[2]))
+            ATH_MSG_ERROR("Error decorating with cascade vertices");
+
+        // Identify the input Jpsi+pi
+        const xAOD::Vertex* jpsipiVertex = BPhysPVCascadeTools::FindVertex<3>(jpsipiContainer, cascadeVertices[2]);
+        ATH_MSG_DEBUG("1 pt Jpsi+pi tracks " << cascadeVertices[2]->trackParticle(0)->pt() << ", " << cascadeVertices[2]->trackParticle(1)->pt() << ", " << cascadeVertices[2]->trackParticle(2)->pt());
+        if (jpsipiVertex) ATH_MSG_DEBUG("2 pt Jpsi+pi tracks " << jpsipiVertex->trackParticle(0)->pt() << ", " << jpsipiVertex->trackParticle(1)->pt() << ", " << jpsipiVertex->trackParticle(2)->pt());
+
+        // Identify the input D0
+        const xAOD::Vertex* d0Vertex = BPhysPVCascadeTools::FindVertex<2>(d0Container, cascadeVertices[1]);;
+        ATH_MSG_DEBUG("1 pt D0 tracks " << cascadeVertices[1]->trackParticle(0)->pt() << ", " << cascadeVertices[1]->trackParticle(1)->pt());
+        if (d0Vertex) ATH_MSG_DEBUG("2 pt D0 tracks " << d0Vertex->trackParticle(0)->pt() << ", " << d0Vertex->trackParticle(1)->pt());
+
+        // Identify the input K_S0
+        const xAOD::Vertex* k0Vertex = BPhysPVCascadeTools::FindVertex<2>(k0Container, cascadeVertices[0]);;
+        ATH_MSG_DEBUG("1 pt K_S0 tracks " << cascadeVertices[0]->trackParticle(0)->pt() << ", " << cascadeVertices[0]->trackParticle(1)->pt());
+        if (k0Vertex) ATH_MSG_DEBUG("2 pt K_S0 tracks " << k0Vertex->trackParticle(0)->pt() << ", " << k0Vertex->trackParticle(1)->pt());
+
+        // Set links to input vertices
+        std::vector<const xAOD::Vertex*> jpsipiVerticestoLink;
+        if (jpsipiVertex) jpsipiVerticestoLink.push_back(jpsipiVertex);
+        else ATH_MSG_WARNING("Could not find linking Jpsi+pi");
+        if(!BPhysPVCascadeTools::LinkVertices(JpsipiLinksDecor, jpsipiVerticestoLink, jpsipiContainer, cascadeVertices[2]))
+            ATH_MSG_ERROR("Error decorating with Jpsi+pi vertices");
+
+        std::vector<const xAOD::Vertex*> d0VerticestoLink;
+        if (d0Vertex) d0VerticestoLink.push_back(d0Vertex);
+        else ATH_MSG_WARNING("Could not find linking D0");
+        if(!BPhysPVCascadeTools::LinkVertices(D0LinksDecor, d0VerticestoLink, d0Container, cascadeVertices[2]))
+            ATH_MSG_ERROR("Error decorating with D0 vertices");
+
+        std::vector<const xAOD::Vertex*> k0VerticestoLink;
+        if (k0Vertex) k0VerticestoLink.push_back(k0Vertex);
+        else ATH_MSG_WARNING("Could not find linking K_S0");
+        if(!BPhysPVCascadeTools::LinkVertices(K0LinksDecor, k0VerticestoLink, k0Container, cascadeVertices[2]))
+            ATH_MSG_ERROR("Error decorating with K_S0 vertices");
+
+        bool tagD0(true);
+        if (jpsipiVertex){
+          if(abs(m_Dx_pid)==421 && (jpsipiVertex->trackParticle(2)->charge()==-1)) tagD0 = false;
+        }
+
+        double mass_b = m_vtx0MassHypo;
+        double mass_d0 = m_vtx1MassHypo; 
+        double mass_k0 = m_vtx2MassHypo; 
+        std::vector<double> massesJpsipi;
+        massesJpsipi.push_back(m_vtx0Daug1MassHypo);
+        massesJpsipi.push_back(m_vtx0Daug2MassHypo);
+        massesJpsipi.push_back(m_vtx0Daug3MassHypo);
+        std::vector<double> massesD0;
+        if(tagD0){
+          massesD0.push_back(m_vtx1Daug1MassHypo);
+          massesD0.push_back(m_vtx1Daug2MassHypo);
+        }else{ // Change the oreder of masses for D*-->D0bar pi-, D0bar->K+pi-
+          massesD0.push_back(m_vtx1Daug2MassHypo);
+          massesD0.push_back(m_vtx1Daug1MassHypo);
+        }
+        std::vector<double> massesK0;
+        massesK0.push_back(m_vtx2Daug1MassHypo);
+        massesK0.push_back(m_vtx2Daug2MassHypo);
+        std::vector<double> Masses;
+        Masses.push_back(m_vtx0Daug1MassHypo);
+        Masses.push_back(m_vtx0Daug2MassHypo);
+        Masses.push_back(m_vtx0Daug3MassHypo);
+        Masses.push_back(m_vtx1MassHypo);
+        Masses.push_back(m_vtx2MassHypo);
+
+        // loop over candidates -- Don't apply PV_minNTracks requirement here
+        // because it may result in exclusion of the high-pt PV.
+        // get good PVs
+
+        xAOD::BPhysHypoHelper vtx(m_hypoName, mainVertex);
+
+        BPhysPVCascadeTools::SetVectorInfo(vtx, x);
+
+        // Decorate main vertex
+        //
+        // 1.a) mass, mass error
+        BPHYS_CHECK( vtx.setMass(m_CascadeTools->invariantMass(moms[2])) );
+        BPHYS_CHECK( vtx.setMassErr(m_CascadeTools->invariantMassError(moms[2],x->getCovariance()[2])) );
+        // 1.b) pt and pT error (the default pt of mainVertex is != the pt of the full cascade fit!)
+        Pt_decor(*mainVertex) = m_CascadeTools->pT(moms[2]);
+        PtErr_decor(*mainVertex) = m_CascadeTools->pTError(moms[2],x->getCovariance()[2]);
+        // 1.c) chi2 and ndof (the default chi2 of mainVertex is != the chi2 of the full cascade fit!)
+        chi2_decor(*mainVertex) = x->fitChi2();
+        ndof_decor(*mainVertex) = x->nDoF();
+
+        float massMumu = 0.;
+        if (jpsipiVertex) {
+          TLorentzVector  p4_mu1, p4_mu2;
+          p4_mu1.SetPtEtaPhiM(jpsipiVertex->trackParticle(0)->pt(), 
+                              jpsipiVertex->trackParticle(0)->eta(),
+                              jpsipiVertex->trackParticle(0)->phi(), m_vtx0Daug1MassHypo); 
+          p4_mu2.SetPtEtaPhiM(jpsipiVertex->trackParticle(1)->pt(), 
+                              jpsipiVertex->trackParticle(1)->eta(),
+                              jpsipiVertex->trackParticle(1)->phi(), m_vtx0Daug2MassHypo); 
+          massMumu = (p4_mu1 + p4_mu2).M();
+        }
+        MassMumu_decor(*mainVertex) = massMumu;
+
+        float massKpi = 0.;
+        if (d0Vertex) {
+          TLorentzVector  p4_ka, p4_pi;
+          if(tagD0){
+            p4_pi.SetPtEtaPhiM(d0Vertex->trackParticle(0)->pt(), 
+                               d0Vertex->trackParticle(0)->eta(),
+                               d0Vertex->trackParticle(0)->phi(), m_vtx1Daug1MassHypo); 
+            p4_ka.SetPtEtaPhiM(d0Vertex->trackParticle(1)->pt(), 
+                               d0Vertex->trackParticle(1)->eta(),
+                               d0Vertex->trackParticle(1)->phi(), m_vtx1Daug2MassHypo); 
+          }else{ // Change the oreder of masses for D*-->D0bar pi-, D0bar->K+pi-
+            p4_pi.SetPtEtaPhiM(d0Vertex->trackParticle(1)->pt(), 
+                               d0Vertex->trackParticle(1)->eta(),
+                               d0Vertex->trackParticle(1)->phi(), m_vtx1Daug1MassHypo); 
+            p4_ka.SetPtEtaPhiM(d0Vertex->trackParticle(0)->pt(), 
+                               d0Vertex->trackParticle(0)->eta(),
+                               d0Vertex->trackParticle(0)->phi(), m_vtx1Daug2MassHypo); 
+          }
+          massKpi = (p4_ka + p4_pi).M();
+        }
+        MassKpi_svdecor(*mainVertex) = massKpi;
+
+        float massPipi = 0.;
+        if (k0Vertex) {
+          TLorentzVector p4_pip, p4_pim;
+          p4_pip.SetPtEtaPhiM(k0Vertex->trackParticle(0)->pt(), 
+                              k0Vertex->trackParticle(0)->eta(),
+                              k0Vertex->trackParticle(0)->phi(), m_vtx2Daug1MassHypo); 
+          p4_pim.SetPtEtaPhiM(k0Vertex->trackParticle(1)->pt(), 
+                              k0Vertex->trackParticle(1)->eta(),
+                              k0Vertex->trackParticle(1)->phi(), m_vtx2Daug2MassHypo); 
+          massPipi = (p4_pip + p4_pim).M();
+        }
+        MassPipi_sv2decor(*mainVertex) = massPipi;
+
+        MassJpsi_decor(*mainVertex) = (moms[2][0] + moms[2][1]).M();
+        MassPiD0_decor(*mainVertex) = (moms[2][2] + moms[2][4]).M();
+        MassPiD0K0_decor(*mainVertex) = (moms[2][2] + moms[2][4] + moms[2][3]).M();
+
+        ATH_CHECK(helper.FillCandwithRefittedVertices(m_refitPV, pvContainer, 
+                                    refPvContainer, &(*m_pvRefitter), m_PV_max, m_DoVertexType, x, 2, mass_b, vtx));
+
+        // 4) decorate the main vertex with D0 vertex mass, pt, lifetime and lxy values (plus errors) 
+        // D0 points to the main vertex, so lifetime and lxy are w.r.t the main vertex
+        Mass_svdecor(*mainVertex) = m_CascadeTools->invariantMass(moms[1]);
+        MassErr_svdecor(*mainVertex) = m_CascadeTools->invariantMassError(moms[1],x->getCovariance()[1]);
+        Pt_svdecor(*mainVertex) = m_CascadeTools->pT(moms[1]);
+        PtErr_svdecor(*mainVertex) = m_CascadeTools->pTError(moms[1],x->getCovariance()[1]);
+        Lxy_svdecor(*mainVertex) = m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[2]);
+        LxyErr_svdecor(*mainVertex) = m_CascadeTools->lxyError(moms[1],x->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
+        Tau_svdecor(*mainVertex) = m_CascadeTools->tau(moms[1],cascadeVertices[1],cascadeVertices[2]);
+        TauErr_svdecor(*mainVertex) = m_CascadeTools->tauError(moms[1],x->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
+
+        // 5) decorate the main vertex with K_S0 vertex mass, pt, lifetime and lxy values (plus errors) 
+        // K_S0 points to the main vertex, so lifetime and lxy are w.r.t the main vertex
+        Mass_sv2decor(*mainVertex) = m_CascadeTools->invariantMass(moms[0]);
+        MassErr_sv2decor(*mainVertex) = m_CascadeTools->invariantMassError(moms[0],x->getCovariance()[0]);
+        Pt_sv2decor(*mainVertex) = m_CascadeTools->pT(moms[0]);
+        PtErr_sv2decor(*mainVertex) = m_CascadeTools->pTError(moms[0],x->getCovariance()[0]);
+        Lxy_sv2decor(*mainVertex) = m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[2]);
+        LxyErr_sv2decor(*mainVertex) = m_CascadeTools->lxyError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[2]);
+        Tau_sv2decor(*mainVertex) = m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[2]);
+        TauErr_sv2decor(*mainVertex) = m_CascadeTools->tauError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[2]);
+
+        // Some checks in DEBUG mode
+        ATH_MSG_DEBUG("chi2 " << x->fitChi2()
+                  << " chi2_1 " << m_V0Tools->chisq(cascadeVertices[0])
+                  << " chi2_2 " << m_V0Tools->chisq(cascadeVertices[1])
+                  << " chi2_3 " << m_V0Tools->chisq(cascadeVertices[2])
+                  << " vprob " << m_CascadeTools->vertexProbability(x->nDoF(),x->fitChi2()));
+        ATH_MSG_DEBUG("ndf " << x->nDoF() << " ndf_1 " << m_V0Tools->ndof(cascadeVertices[0]) << " ndf_2 " << m_V0Tools->ndof(cascadeVertices[1]) << " ndf_3 " << m_V0Tools->ndof(cascadeVertices[2]));
+        ATH_MSG_DEBUG("V0Tools mass_k0 " << m_V0Tools->invariantMass(cascadeVertices[0],massesK0)
+                   << " error " << m_V0Tools->invariantMassError(cascadeVertices[0],massesK0)
+                   << " mass_d0 " << m_V0Tools->invariantMass(cascadeVertices[1],massesD0)
+                   << " error " << m_V0Tools->invariantMassError(cascadeVertices[1],massesD0)
+                   << " mass_J " << m_V0Tools->invariantMass(cascadeVertices[2],massesJpsipi)
+                   << " error " << m_V0Tools->invariantMassError(cascadeVertices[2],massesJpsipi));
+        // masses and errors, using track masses assigned in the fit
+        double Mass_B = m_CascadeTools->invariantMass(moms[2]);
+        double Mass_D0 = m_CascadeTools->invariantMass(moms[1]);
+        double Mass_K0 = m_CascadeTools->invariantMass(moms[0]);
+        double Mass_B_err = m_CascadeTools->invariantMassError(moms[2],x->getCovariance()[2]);
+        double Mass_D0_err = m_CascadeTools->invariantMassError(moms[1],x->getCovariance()[1]);
+        double Mass_K0_err = m_CascadeTools->invariantMassError(moms[0],x->getCovariance()[0]);
+        ATH_MSG_DEBUG("Mass_B " << Mass_B << " Mass_D0 " << Mass_D0 << " Mass_K0 " << Mass_K0);
+        ATH_MSG_DEBUG("Mass_B_err " << Mass_B_err << " Mass_D0_err " << Mass_D0_err << " Mass_K0_err " << Mass_K0_err);
+        double mprob_B = m_CascadeTools->massProbability(mass_b,Mass_B,Mass_B_err);
+        double mprob_D0 = m_CascadeTools->massProbability(mass_d0,Mass_D0,Mass_D0_err);
+        double mprob_K0 = m_CascadeTools->massProbability(mass_k0,Mass_K0,Mass_K0_err);
+        ATH_MSG_DEBUG("mprob_B " << mprob_B << " mprob_D0 " << mprob_D0 << " mprob_K0 " << mprob_K0);
+        // masses and errors, assigning user defined track masses
+        ATH_MSG_DEBUG("Mass_b " << m_CascadeTools->invariantMass(moms[2],Masses)
+                  << " Mass_d0 " << m_CascadeTools->invariantMass(moms[1],massesD0)
+                  << " Mass_k0 " << m_CascadeTools->invariantMass(moms[0],massesD0));
+        ATH_MSG_DEBUG("Mass_b_err " << m_CascadeTools->invariantMassError(moms[2],x->getCovariance()[2],Masses)
+                  << " Mass_d0_err " << m_CascadeTools->invariantMassError(moms[1],x->getCovariance()[1],massesD0)
+                  << " Mass_k0_err " << m_CascadeTools->invariantMassError(moms[0],x->getCovariance()[0],massesK0));
+        ATH_MSG_DEBUG("pt_b " << m_CascadeTools->pT(moms[2])
+                  << " pt_d " << m_CascadeTools->pT(moms[1])
+                  << " pt_d0 " << m_V0Tools->pT(cascadeVertices[1])
+                  << " pt_k " << m_CascadeTools->pT(moms[0])
+                  << " pt_k0 " << m_V0Tools->pT(cascadeVertices[0]));
+        ATH_MSG_DEBUG("ptErr_b " << m_CascadeTools->pTError(moms[2],x->getCovariance()[2])
+                  << " ptErr_d " << m_CascadeTools->pTError(moms[1],x->getCovariance()[1])
+                  << " ptErr_d0 " << m_V0Tools->pTError(cascadeVertices[1])
+                  << " ptErr_k " << m_CascadeTools->pTError(moms[0],x->getCovariance()[0])
+                  << " ptErr_k0 " << m_V0Tools->pTError(cascadeVertices[0]));
+        ATH_MSG_DEBUG("lxy_B " << m_V0Tools->lxy(cascadeVertices[2],primaryVertex) << " lxy_D " << m_V0Tools->lxy(cascadeVertices[1],cascadeVertices[2]) << " lxy_K " << m_V0Tools->lxy(cascadeVertices[0],cascadeVertices[2]));
+        ATH_MSG_DEBUG("lxy_b " << m_CascadeTools->lxy(moms[2],cascadeVertices[2],primaryVertex) << " lxy_d " << m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[2]) << " lxy_k " << m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[2]));
+        ATH_MSG_DEBUG("lxyErr_b " << m_CascadeTools->lxyError(moms[2],x->getCovariance()[2],cascadeVertices[2],primaryVertex)
+                  << " lxyErr_d " << m_CascadeTools->lxyError(moms[1],x->getCovariance()[1],cascadeVertices[1],cascadeVertices[2])
+                  << " lxyErr_d0 " << m_V0Tools->lxyError(cascadeVertices[1],cascadeVertices[2])
+                  << " lxyErr_k " << m_CascadeTools->lxyError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[2])
+                  << " lxyErr_k0 " << m_V0Tools->lxyError(cascadeVertices[0],cascadeVertices[2]));
+        ATH_MSG_DEBUG("tau_B " << m_CascadeTools->tau(moms[2],cascadeVertices[2],primaryVertex,mass_b)
+                   << " tau_d0 " << m_V0Tools->tau(cascadeVertices[1],cascadeVertices[2],massesD0)
+                   << " tau_k0 " << m_V0Tools->tau(cascadeVertices[0],cascadeVertices[2],massesK0));
+        ATH_MSG_DEBUG("tau_b " << m_CascadeTools->tau(moms[2],cascadeVertices[2],primaryVertex)
+                   << " tau_d " << m_CascadeTools->tau(moms[1],cascadeVertices[1],cascadeVertices[2])
+                   << " tau_D " << m_CascadeTools->tau(moms[1],cascadeVertices[1],cascadeVertices[2],mass_d0)
+                   << " tau_k " << m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[2])
+                   << " tau_K " << m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[2],mass_k0));
+        ATH_MSG_DEBUG("tauErr_b " << m_CascadeTools->tauError(moms[2],x->getCovariance()[2],cascadeVertices[2],primaryVertex)
+                  << " tauErr_d " << m_CascadeTools->tauError(moms[1],x->getCovariance()[1],cascadeVertices[1],cascadeVertices[2])
+                  << " tauErr_d0 " << m_V0Tools->tauError(cascadeVertices[1],cascadeVertices[2],massesD0)
+                  << " tauErr_k " << m_CascadeTools->tauError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[2])
+                  << " tauErr_k0 " << m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[2],massesK0));
+        ATH_MSG_DEBUG("TauErr_b " << m_CascadeTools->tauError(moms[2],x->getCovariance()[2],cascadeVertices[2],primaryVertex,mass_b)
+                  << " TauErr_d " << m_CascadeTools->tauError(moms[1],x->getCovariance()[1],cascadeVertices[1],cascadeVertices[2],mass_d0)
+                  << " TauErr_d0 " << m_V0Tools->tauError(cascadeVertices[1],cascadeVertices[2],massesD0,mass_d0)
+                  << " TauErr_k " << m_CascadeTools->tauError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[2],mass_k0)
+                  << " TauErr_k0 " << m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[2],massesD0,mass_k0));
+
+        ATH_MSG_DEBUG("CascadeTools main vert wrt PV " << " CascadeTools SV " << " V0Tools SV");
+        ATH_MSG_DEBUG("a0z " << m_CascadeTools->a0z(moms[2],cascadeVertices[2],primaryVertex)
+                   << ", " << m_CascadeTools->a0z(moms[1],cascadeVertices[1],cascadeVertices[2])
+                   << ", " << m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[2])
+                   << ", " << m_V0Tools->a0z(cascadeVertices[1],cascadeVertices[2])
+                   << ", " << m_V0Tools->a0z(cascadeVertices[0],cascadeVertices[2]));
+        ATH_MSG_DEBUG("a0zErr " << m_CascadeTools->a0zError(moms[2],x->getCovariance()[2],cascadeVertices[2],primaryVertex)
+                   << ", " << m_CascadeTools->a0zError(moms[1],x->getCovariance()[1],cascadeVertices[1],cascadeVertices[2])
+                   << ", " << m_CascadeTools->a0zError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[2])
+                   << ", " << m_V0Tools->a0zError(cascadeVertices[1],cascadeVertices[2])
+                   << ", " << m_V0Tools->a0zError(cascadeVertices[0],cascadeVertices[2]));
+        ATH_MSG_DEBUG("a0xy " << m_CascadeTools->a0xy(moms[2],cascadeVertices[2],primaryVertex)
+                   << ", " << m_CascadeTools->a0xy(moms[1],cascadeVertices[1],cascadeVertices[2])
+                   << ", " << m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[2])
+                   << ", " << m_V0Tools->a0xy(cascadeVertices[1],cascadeVertices[2])
+                   << ", " << m_V0Tools->a0xy(cascadeVertices[0],cascadeVertices[2]));
+        ATH_MSG_DEBUG("a0xyErr " << m_CascadeTools->a0xyError(moms[2],x->getCovariance()[2],cascadeVertices[2],primaryVertex)
+                   << ", " << m_CascadeTools->a0xyError(moms[1],x->getCovariance()[1],cascadeVertices[1],cascadeVertices[2])
+                   << ", " << m_CascadeTools->a0xyError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[2])
+                   << ", " << m_V0Tools->a0xyError(cascadeVertices[1],cascadeVertices[2])
+                   << ", " << m_V0Tools->a0xyError(cascadeVertices[0],cascadeVertices[2]));
+        ATH_MSG_DEBUG("a0 " << m_CascadeTools->a0(moms[2],cascadeVertices[2],primaryVertex)
+                   << ", " << m_CascadeTools->a0(moms[1],cascadeVertices[1],cascadeVertices[2])
+                   << ", " << m_CascadeTools->a0(moms[0],cascadeVertices[0],cascadeVertices[2])
+                   << ", " << m_V0Tools->a0(cascadeVertices[1],cascadeVertices[2])
+                   << ", " << m_V0Tools->a0(cascadeVertices[0],cascadeVertices[2]));
+        ATH_MSG_DEBUG("a0Err " << m_CascadeTools->a0Error(moms[2],x->getCovariance()[2],cascadeVertices[2],primaryVertex)
+                   << ", " << m_CascadeTools->a0Error(moms[1],x->getCovariance()[1],cascadeVertices[1],cascadeVertices[2])
+                   << ", " << m_CascadeTools->a0Error(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[2])
+                   << ", " << m_V0Tools->a0Error(cascadeVertices[1],cascadeVertices[2])
+                   << ", " << m_V0Tools->a0Error(cascadeVertices[0],cascadeVertices[2]));
+        ATH_MSG_DEBUG("x0 " << m_V0Tools->vtx(cascadeVertices[0]).x() << " y0 " << m_V0Tools->vtx(cascadeVertices[0]).y() << " z0 " << m_V0Tools->vtx(cascadeVertices[0]).z());
+        ATH_MSG_DEBUG("x1 " << m_V0Tools->vtx(cascadeVertices[1]).x() << " y1 " << m_V0Tools->vtx(cascadeVertices[1]).y() << " z1 " << m_V0Tools->vtx(cascadeVertices[1]).z());
+        ATH_MSG_DEBUG("x2 " << m_V0Tools->vtx(cascadeVertices[2]).x() << " y2 " << m_V0Tools->vtx(cascadeVertices[2]).y() << " z2 " << m_V0Tools->vtx(cascadeVertices[2]).z());
+        ATH_MSG_DEBUG("X0 " << primaryVertex->x() << " Y0 " << primaryVertex->y() << " Z0 " << primaryVertex->z());
+        ATH_MSG_DEBUG("rxy0 " << m_V0Tools->rxy(cascadeVertices[0]) << " rxyErr0 " << m_V0Tools->rxyError(cascadeVertices[0]));
+        ATH_MSG_DEBUG("rxy1 " << m_V0Tools->rxy(cascadeVertices[1]) << " rxyErr1 " << m_V0Tools->rxyError(cascadeVertices[1]));
+        ATH_MSG_DEBUG("rxy2 " << m_V0Tools->rxy(cascadeVertices[2]) << " rxyErr2 " << m_V0Tools->rxyError(cascadeVertices[2]));
+        ATH_MSG_DEBUG("Rxy0 wrt PV " << m_V0Tools->rxy(cascadeVertices[0],primaryVertex) << " RxyErr0 wrt PV " << m_V0Tools->rxyError(cascadeVertices[0],primaryVertex));
+        ATH_MSG_DEBUG("Rxy1 wrt PV " << m_V0Tools->rxy(cascadeVertices[1],primaryVertex) << " RxyErr1 wrt PV " << m_V0Tools->rxyError(cascadeVertices[1],primaryVertex));
+        ATH_MSG_DEBUG("Rxy2 wrt PV " << m_V0Tools->rxy(cascadeVertices[2],primaryVertex) << " RxyErr2 wrt PV " << m_V0Tools->rxyError(cascadeVertices[2],primaryVertex));
+        ATH_MSG_DEBUG("number of covariance matrices " << (x->getCovariance()).size());
+      } // loop over cascadeinfoContainer
+
+      // Deleting cascadeinfo since this won't be stored.
+      // Vertices have been kept in m_cascadeOutputs and should be owned by their container
+      for (auto x : cascadeinfoContainer) delete x;
+
+      return StatusCode::SUCCESS;
+    }
+
+
+    JpsiPlusDs1Cascade::JpsiPlusDs1Cascade(const std::string& t, const std::string& n, const IInterface* p)  : AthAlgTool(t,n,p),
+    m_vertexContainerKey(""),
+    m_vertexD0ContainerKey(""),
+    m_vertexK0ContainerKey(""),
+    m_cascadeOutputsKeys{ "JpsiPlusDs1CascadeVtx1", "JpsiPlusDs1CascadeVtx2", "JpsiPlusDs1CascadeVtx3" },
+    m_VxPrimaryCandidateName("PrimaryVertices"),
+    m_jpsiMassLower(0.0),
+    m_jpsiMassUpper(10000.0),
+    m_jpsipiMassLower(0.0),
+    m_jpsipiMassUpper(10000.0),
+    m_D0MassLower(0.0),
+    m_D0MassUpper(10000.0),
+    m_K0MassLower(0.0),
+    m_K0MassUpper(10000.0),
+    m_DstMassLower(0.0),
+    m_DstMassUpper(10000.0),
+    m_MassLower(0.0),
+    m_MassUpper(20000.0),
+    m_vtx0MassHypo(-1),
+    m_vtx1MassHypo(-1),
+    m_vtx2MassHypo(-1),
+    m_vtx0Daug1MassHypo(-1),
+    m_vtx0Daug2MassHypo(-1),
+    m_vtx0Daug3MassHypo(-1),
+    m_vtx1Daug1MassHypo(-1),
+    m_vtx1Daug2MassHypo(-1),
+    m_vtx2Daug1MassHypo(-1),
+    m_vtx2Daug2MassHypo(-1),
+    m_particleDataTable(nullptr),
+    m_mass_jpsi(-1),
+    m_Dx_pid(421),
+    m_constrD0(true),
+    m_constrK0(true),
+    m_constrJpsi(true),
+    m_chi2cut(-1.0),
+    m_iVertexFitter("Trk::TrkVKalVrtFitter"),
+    m_pvRefitter("Analysis::PrimaryVertexRefitter"),
+    m_V0Tools("Trk::V0Tools"),
+    m_CascadeTools("DerivationFramework::CascadeTools")
+    {
+       declareProperty("JpsipiVertices", m_vertexContainerKey);
+       declareProperty("D0Vertices", m_vertexD0ContainerKey);
+       declareProperty("K0Vertices", m_vertexK0ContainerKey);
+       declareProperty("VxPrimaryCandidateName", m_VxPrimaryCandidateName);
+       declareProperty("RefPVContainerName", m_refPVContainerName  = "RefittedPrimaryVertices");
+       declareProperty("JpsiMassLowerCut", m_jpsiMassLower);
+       declareProperty("JpsiMassUpperCut", m_jpsiMassUpper);
+       declareProperty("JpsipiMassLowerCut", m_jpsipiMassLower);
+       declareProperty("JpsipiMassUpperCut", m_jpsipiMassUpper);
+       declareProperty("D0MassLowerCut", m_D0MassLower);
+       declareProperty("D0MassUpperCut", m_D0MassUpper);
+       declareProperty("K0MassLowerCut", m_K0MassLower);
+       declareProperty("K0MassUpperCut", m_K0MassUpper);
+       declareProperty("DstMassLowerCut", m_DstMassLower);
+       declareProperty("DstMassUpperCut", m_DstMassUpper);
+       declareProperty("MassLowerCut", m_MassLower);
+       declareProperty("MassUpperCut", m_MassUpper);
+       declareProperty("HypothesisName",            m_hypoName               = "Bc");
+       declareProperty("Vtx0MassHypo",              m_vtx0MassHypo);
+       declareProperty("Vtx1MassHypo",              m_vtx1MassHypo);
+       declareProperty("Vtx2MassHypo",              m_vtx2MassHypo);
+       declareProperty("Vtx0Daug1MassHypo",         m_vtx0Daug1MassHypo);
+       declareProperty("Vtx0Daug2MassHypo",         m_vtx0Daug2MassHypo);
+       declareProperty("Vtx0Daug3MassHypo",         m_vtx0Daug3MassHypo);
+       declareProperty("Vtx1Daug1MassHypo",         m_vtx1Daug1MassHypo);
+       declareProperty("Vtx1Daug2MassHypo",         m_vtx1Daug2MassHypo);
+       declareProperty("Vtx2Daug1MassHypo",         m_vtx2Daug1MassHypo);
+       declareProperty("Vtx2Daug2MassHypo",         m_vtx2Daug2MassHypo);
+       declareProperty("JpsiMass",                  m_mass_jpsi);
+       declareProperty("DxHypothesis",              m_Dx_pid);
+       declareProperty("ApplyD0MassConstraint",     m_constrD0);
+       declareProperty("ApplyK0MassConstraint",     m_constrK0);
+       declareProperty("ApplyJpsiMassConstraint",   m_constrJpsi);
+       declareProperty("Chi2Cut",                   m_chi2cut);
+       declareProperty("RefitPV",                   m_refitPV                = true);
+       declareProperty("MaxnPV",                    m_PV_max                 = 999);
+       declareProperty("MinNTracksInPV",            m_PV_minNTracks          = 0);
+       declareProperty("DoVertexType",              m_DoVertexType           = 7);
+       declareProperty("TrkVertexFitterTool",       m_iVertexFitter);
+       declareProperty("PVRefitter",                m_pvRefitter);
+       declareProperty("V0Tools",                   m_V0Tools);
+       declareProperty("CascadeTools",              m_CascadeTools);
+       declareProperty("CascadeVertexCollections",  m_cascadeOutputsKeys);
+    }
+
+    JpsiPlusDs1Cascade::~JpsiPlusDs1Cascade(){ }
+
+    StatusCode JpsiPlusDs1Cascade::performSearch(std::vector<Trk::VxCascadeInfo*> *cascadeinfoContainer) const
+    {
+        ATH_MSG_DEBUG( "JpsiPlusDs1Cascade::performSearch" );
+        assert(cascadeinfoContainer!=nullptr);
+
+        // Get TrackParticle container (for setting links to the original tracks)
+        const xAOD::TrackParticleContainer  *trackContainer(nullptr);
+        ATH_CHECK(evtStore()->retrieve(trackContainer   , "InDetTrackParticles"      ));
+
+        // Get Jpsi+pi container
+        const xAOD::VertexContainer  *jpsipiContainer(nullptr);
+        ATH_CHECK(evtStore()->retrieve(jpsipiContainer   , m_vertexContainerKey       ));
+
+        // Get D0 container
+        const xAOD::VertexContainer  *d0Container(nullptr);
+        ATH_CHECK(evtStore()->retrieve(d0Container   , m_vertexD0ContainerKey       ));
+
+        // Get K_S0 container
+        const xAOD::VertexContainer  *k0Container(nullptr);
+        ATH_CHECK(evtStore()->retrieve(k0Container   , m_vertexK0ContainerKey       ));
+
+        double mass_d0 = m_vtx1MassHypo; 
+        double mass_k0 = m_vtx2MassHypo; 
+        std::vector<const xAOD::TrackParticle*> tracksJpsipi;
+        std::vector<const xAOD::TrackParticle*> tracksJpsi;
+        std::vector<const xAOD::TrackParticle*> tracksD0;
+        std::vector<const xAOD::TrackParticle*> tracksK0;
+        std::vector<const xAOD::TrackParticle*> tracksBc;
+        std::vector<double> massesJpsipi;
+        massesJpsipi.push_back(m_vtx0Daug1MassHypo);
+        massesJpsipi.push_back(m_vtx0Daug2MassHypo);
+        massesJpsipi.push_back(m_vtx0Daug3MassHypo);
+        std::vector<double> massesD0;
+        massesD0.push_back(m_vtx1Daug1MassHypo);
+        massesD0.push_back(m_vtx1Daug2MassHypo);
+        std::vector<double> massesD0b; // Change the oreder of masses for D*-->D0bar pi-, D0bar->K+pi-
+        massesD0b.push_back(m_vtx1Daug2MassHypo);
+        massesD0b.push_back(m_vtx1Daug1MassHypo);
+        std::vector<double> massesK0;
+        massesK0.push_back(m_vtx2Daug1MassHypo);
+        massesK0.push_back(m_vtx2Daug2MassHypo);
+        std::vector<double> Masses;
+        Masses.push_back(m_vtx0Daug1MassHypo);
+        Masses.push_back(m_vtx0Daug2MassHypo);
+        Masses.push_back(m_vtx0Daug3MassHypo);
+        Masses.push_back(m_vtx1MassHypo);
+        Masses.push_back(m_vtx2MassHypo);
+
+        // Select J/psi pi+ candidates before calling cascade fit
+        std::vector<const xAOD::Vertex*> selectedJpsipiCandidates;
+        for(auto vxcItr=jpsipiContainer->cbegin(); vxcItr!=jpsipiContainer->cend(); ++vxcItr) {
+
+           // Check the passed flag first
+           const xAOD::Vertex* vtx = *vxcItr;
+           SG::AuxElement::Accessor<Char_t> flagAcc1("passed_Jpsipi");
+           if(flagAcc1.isAvailable(*vtx)){
+              if(!flagAcc1(*vtx)) continue;
+           }
+
+           // Check J/psi candidate invariant mass and skip if need be
+           TLorentzVector p4Mup_in, p4Mum_in;
+           p4Mup_in.SetPtEtaPhiM((*vxcItr)->trackParticle(0)->pt(), 
+                                 (*vxcItr)->trackParticle(0)->eta(),
+                                 (*vxcItr)->trackParticle(0)->phi(), m_vtx0Daug1MassHypo); 
+           p4Mum_in.SetPtEtaPhiM((*vxcItr)->trackParticle(1)->pt(), 
+                                 (*vxcItr)->trackParticle(1)->eta(),
+                                 (*vxcItr)->trackParticle(1)->phi(), m_vtx0Daug2MassHypo); 
+           double mass_Jpsi = (p4Mup_in + p4Mum_in).M();
+           ATH_MSG_DEBUG("Jpsi mass " << mass_Jpsi);
+           if (mass_Jpsi < m_jpsiMassLower || mass_Jpsi > m_jpsiMassUpper) {
+             ATH_MSG_DEBUG(" Original Jpsi candidate rejected by the mass cut: mass = "
+                           << mass_Jpsi << " != (" << m_jpsiMassLower << ", " << m_jpsiMassUpper << ")" );
+             continue;
+           }
+
+           // Check J/psi pi+ candidate invariant mass and skip if need be
+           double mass_Jpsipi = m_V0Tools->invariantMass(*vxcItr, massesJpsipi);
+           ATH_MSG_DEBUG("Jpsipi mass " << mass_Jpsipi);
+           if (mass_Jpsipi < m_jpsipiMassLower || mass_Jpsipi > m_jpsipiMassUpper) {
+             ATH_MSG_DEBUG(" Original Jpsipi candidate rejected by the mass cut: mass = "
+                           << mass_Jpsipi << " != (" << m_jpsipiMassLower << ", " << m_jpsipiMassUpper << ")" );
+             continue;
+           }
+
+           selectedJpsipiCandidates.push_back(*vxcItr);
+        }
+        if(selectedJpsipiCandidates.size()<1) return StatusCode::SUCCESS;
+
+        // Select the D0/D0b candidates before calling cascade fit
+        std::vector<const xAOD::Vertex*> selectedD0Candidates;
+        for(auto vxcItr=d0Container->cbegin(); vxcItr!=d0Container->cend(); ++vxcItr) {
+
+           // Check the passed flag first
+           const xAOD::Vertex* vtx = *vxcItr;
+           SG::AuxElement::Accessor<Char_t> flagAcc1("passed_D0");
+           SG::AuxElement::Accessor<Char_t> flagAcc2("passed_D0b");
+           bool isD0(true);
+           bool isD0b(true);
+           if(flagAcc1.isAvailable(*vtx)){
+              if(!flagAcc1(*vtx)) isD0 = false;
+           }
+           if(flagAcc2.isAvailable(*vtx)){
+              if(!flagAcc2(*vtx)) isD0b = false;
+           }
+           if(!(isD0||isD0b)) continue;
+
+           // Ensure the total charge is correct
+           if ((*vxcItr)->trackParticle(0)->charge() != 1 || (*vxcItr)->trackParticle(1)->charge() != -1) {
+              ATH_MSG_DEBUG(" Original D0/D0-bar candidate rejected by the charge requirement: "
+                              << (*vxcItr)->trackParticle(0)->charge() << ", " << (*vxcItr)->trackParticle(1)->charge() );
+             continue;
+           }
+
+           // Check D0/D0bar candidate invariant mass and skip if need be
+           double mass_D0 = m_V0Tools->invariantMass(*vxcItr,massesD0);
+           double mass_D0b = m_V0Tools->invariantMass(*vxcItr,massesD0b);
+           ATH_MSG_DEBUG("D0 mass " << mass_D0 << ", D0b mass "<<mass_D0b);
+           if ((mass_D0 < m_D0MassLower || mass_D0 > m_D0MassUpper) && (mass_D0b < m_D0MassLower || mass_D0b > m_D0MassUpper)) {
+              ATH_MSG_DEBUG(" Original D0 candidate rejected by the mass cut: mass = "
+                            << mass_D0 << " != (" << m_D0MassLower << ", " << m_D0MassUpper << ") " 
+                            << mass_D0b << " != (" << m_D0MassLower << ", " << m_D0MassUpper << ") " );
+             continue;
+           }
+
+           selectedD0Candidates.push_back(*vxcItr);
+        }
+        if(selectedD0Candidates.size()<1) return StatusCode::SUCCESS;
+
+        // Select the D0/D0b candidates before calling cascade fit
+        std::vector<const xAOD::Vertex*> selectedK0Candidates;
+        for(auto vxcItr=k0Container->cbegin(); vxcItr!=k0Container->cend(); ++vxcItr) {
+
+           // Check the passed flag first
+           const xAOD::Vertex* vtx = *vxcItr;
+           SG::AuxElement::Accessor<Char_t> flagAcc1("passed_K0");
+           if(flagAcc1.isAvailable(*vtx)){
+              if(!flagAcc1(*vtx)) continue;
+           }
+
+           // Check K_S0 candidate invariant mass and skip if need be
+           double mass_K0 = m_V0Tools->invariantMass(*vxcItr, massesK0);
+           ATH_MSG_DEBUG("K_S0 mass " << mass_K0);
+           if (mass_K0 < m_K0MassLower || mass_K0 > m_K0MassUpper) {
+              ATH_MSG_DEBUG(" Original K_S0 candidate rejected by the mass cut: mass = "
+                            << mass_K0 << " != (" << m_K0MassLower << ", " << m_K0MassUpper << ")" );
+             continue;
+           }
+
+           selectedK0Candidates.push_back(*vxcItr);
+        }
+        if(selectedK0Candidates.size()<1) return StatusCode::SUCCESS;
+
+        // Select J/psi D*+ candidates
+        // Iterate over Jpsi+pi vertices
+        for(auto jpsipiItr=selectedJpsipiCandidates.cbegin(); jpsipiItr!=selectedJpsipiCandidates.cend(); ++jpsipiItr) {
+
+           size_t jpsipiTrkNum = (*jpsipiItr)->nTrackParticles();
+           tracksJpsipi.clear();
+           tracksJpsi.clear();
+           for( unsigned int it=0; it<jpsipiTrkNum; it++) tracksJpsipi.push_back((*jpsipiItr)->trackParticle(it));
+           for( unsigned int it=0; it<jpsipiTrkNum-1; it++) tracksJpsi.push_back((*jpsipiItr)->trackParticle(it));
+
+           if (tracksJpsipi.size() != 3 || massesJpsipi.size() != 3 ) {
+             ATH_MSG_INFO("problems with Jpsi+pi input");
+           }
+
+           bool tagD0(true);
+           if(abs(m_Dx_pid)==421 && (*jpsipiItr)->trackParticle(2)->charge()==-1) tagD0 = false;
+
+           TLorentzVector p4_pi1; // Momentum of soft pion
+           p4_pi1.SetPtEtaPhiM((*jpsipiItr)->trackParticle(2)->pt(), 
+                               (*jpsipiItr)->trackParticle(2)->eta(),
+                               (*jpsipiItr)->trackParticle(2)->phi(), m_vtx0Daug3MassHypo); 
+
+           // Iterate over D0/D0bar vertices
+           for(auto d0Itr=selectedD0Candidates.cbegin(); d0Itr!=selectedD0Candidates.cend(); ++d0Itr) {
+
+              // Check identical tracks in input
+              if(std::find(tracksJpsipi.cbegin(), tracksJpsipi.cend(), (*d0Itr)->trackParticle(0)) != tracksJpsipi.cend()) continue; 
+              if(std::find(tracksJpsipi.cbegin(), tracksJpsipi.cend(), (*d0Itr)->trackParticle(1)) != tracksJpsipi.cend()) continue; 
+
+              TLorentzVector p4_ka, p4_pi2;
+              if(tagD0){ // for D*+
+                p4_pi2.SetPtEtaPhiM((*d0Itr)->trackParticle(0)->pt(), 
+                                    (*d0Itr)->trackParticle(0)->eta(),
+                                    (*d0Itr)->trackParticle(0)->phi(), m_vtx1Daug1MassHypo); 
+                p4_ka.SetPtEtaPhiM( (*d0Itr)->trackParticle(1)->pt(), 
+                                    (*d0Itr)->trackParticle(1)->eta(),
+                                    (*d0Itr)->trackParticle(1)->phi(), m_vtx1Daug2MassHypo); 
+              }else{ // change the order in the case of D*-
+                p4_pi2.SetPtEtaPhiM((*d0Itr)->trackParticle(1)->pt(), 
+                                    (*d0Itr)->trackParticle(1)->eta(),
+                                    (*d0Itr)->trackParticle(1)->phi(), m_vtx1Daug1MassHypo); 
+                p4_ka.SetPtEtaPhiM( (*d0Itr)->trackParticle(0)->pt(), 
+                                    (*d0Itr)->trackParticle(0)->eta(),
+                                    (*d0Itr)->trackParticle(0)->phi(), m_vtx1Daug2MassHypo); 
+              }
+              // Check D*+/- candidate invariant mass and skip if need be
+              double mass_Dst= (p4_pi1 + p4_ka + p4_pi2).M();
+              ATH_MSG_DEBUG("D*+/- mass " << mass_Dst);
+              if (mass_Dst < m_DstMassLower || mass_Dst > m_DstMassUpper) {
+                ATH_MSG_DEBUG(" Original D*+/- candidate rejected by the mass cut: mass = "
+                              << mass_Dst << " != (" << m_DstMassLower << ", " << m_DstMassUpper << ")" );
+                continue;
+              }
+
+              size_t d0TrkNum = (*d0Itr)->nTrackParticles();
+              tracksD0.clear();
+              for( unsigned int it=0; it<d0TrkNum; it++) tracksD0.push_back((*d0Itr)->trackParticle(it));
+              if (tracksD0.size() != 2 || massesD0.size() != 2 ) {
+                ATH_MSG_INFO("problems with D0 input");
+              }
+             
+              // Iterate over K0 vertices
+              for(auto k0Itr=selectedK0Candidates.cbegin(); k0Itr!=selectedK0Candidates.cend(); ++k0Itr) {
+              
+                 // Check identical tracks in input
+                 if(std::find(tracksJpsipi.cbegin(), tracksJpsipi.cend(), (*k0Itr)->trackParticle(0)) != tracksJpsipi.cend()) continue; 
+                 if(std::find(tracksJpsipi.cbegin(), tracksJpsipi.cend(), (*k0Itr)->trackParticle(1)) != tracksJpsipi.cend()) continue; 
+                 if(std::find(tracksD0.cbegin(), tracksD0.cend(), (*k0Itr)->trackParticle(0)) != tracksD0.cend()) continue; 
+                 if(std::find(tracksD0.cbegin(), tracksD0.cend(), (*k0Itr)->trackParticle(1)) != tracksD0.cend()) continue; 
+             
+                 size_t k0TrkNum = (*k0Itr)->nTrackParticles();
+                 tracksK0.clear();
+                 for( unsigned int it=0; it<k0TrkNum; it++) tracksK0.push_back((*k0Itr)->trackParticle(it));
+                 if (tracksK0.size() != 2 || massesK0.size() != 2 ) {
+                   ATH_MSG_INFO("problems with K0 input");
+                 }
+
+                 ATH_MSG_DEBUG("using tracks" << tracksJpsipi[0] << ", " << tracksJpsipi[1] << ", " << tracksJpsipi[2] << ", " << tracksD0[0] << ", " << tracksD0[1] << ", " << tracksK0[0] << ", " << tracksK0[1]);
+
+                 tracksBc.clear();
+                 for( unsigned int it=0; it<jpsipiTrkNum; it++) tracksBc.push_back((*jpsipiItr)->trackParticle(it));
+                 for( unsigned int it=0; it<d0TrkNum; it++) tracksBc.push_back((*d0Itr)->trackParticle(it));
+                 for( unsigned int it=0; it<k0TrkNum; it++) tracksBc.push_back((*k0Itr)->trackParticle(it));
+                 
+             
+                 // Apply the user's settings to the fitter
+                 // Reset
+                 std::unique_ptr<Trk::IVKalState> state (m_iVertexFitter->makeState());
+                 // Robustness
+                 int robustness = 0;
+                 m_iVertexFitter->setRobustness(robustness, *state);
+                 // Build up the topology
+                 // Vertex list
+                 std::vector<Trk::VertexID> vrtList;
+                 // K_S0 vertex
+                 Trk::VertexID vK0ID;
+                 if (m_constrK0) {
+                   vK0ID = m_iVertexFitter->startVertex(tracksK0,massesK0, *state, mass_k0);
+                 } else {
+                   vK0ID = m_iVertexFitter->startVertex(tracksK0,massesK0, *state);
+                 }
+                 vrtList.push_back(vK0ID);
+                 // D0 vertex
+                 Trk::VertexID vD0ID;
+                 if (m_constrD0) {
+                   if(tagD0) vD0ID = m_iVertexFitter->nextVertex(tracksD0,massesD0, *state, mass_d0);
+                   else vD0ID = m_iVertexFitter->nextVertex(tracksD0,massesD0b, *state, mass_d0);
+                 } else {
+                   if(tagD0) vD0ID = m_iVertexFitter->nextVertex(tracksD0,massesD0, *state);
+                   else vD0ID = m_iVertexFitter->nextVertex(tracksD0,massesD0b, *state);
+                 }
+                 vrtList.push_back(vD0ID);
+                 // B vertex including Jpsi+pi
+                 Trk::VertexID vBcID = m_iVertexFitter->nextVertex(tracksJpsipi,massesJpsipi,vrtList, *state);
+                 if (m_constrJpsi) {
+                   std::vector<Trk::VertexID> cnstV;
+                   cnstV.clear();
+                   if ( !m_iVertexFitter->addMassConstraint(vBcID,tracksJpsi,cnstV, *state, m_mass_jpsi).isSuccess() ) {
+                     ATH_MSG_WARNING("addMassConstraint failed");
+                     //return StatusCode::FAILURE;
+                   }
+                 }
+                 // Do the work
+                 std::unique_ptr<Trk::VxCascadeInfo> result(m_iVertexFitter->fitCascade(*state));
+             
+                 if (result != nullptr) {
+
+                   // reset links to original tracks
+                   BPhysPVCascadeTools::PrepareVertexLinks(result.get(), trackContainer);
+                   ATH_MSG_DEBUG("storing tracks " << ((result->vertices())[0])->trackParticle(0) << ", "
+                                                   << ((result->vertices())[0])->trackParticle(1) << ", "
+                                                   << ((result->vertices())[1])->trackParticle(0) << ", "
+                                                   << ((result->vertices())[1])->trackParticle(1) << ", "
+                                                   << ((result->vertices())[2])->trackParticle(0) << ", "
+                                                   << ((result->vertices())[2])->trackParticle(1) << ", "
+                                                   << ((result->vertices())[2])->trackParticle(2));
+                   // necessary to prevent memory leak
+                   result->setSVOwnership(true);
+
+                   // Chi2/DOF cut
+                   double bChi2DOF = result->fitChi2()/result->nDoF();
+                   ATH_MSG_DEBUG("Candidate chi2/DOF is " << bChi2DOF);
+                   bool chi2CutPassed = (m_chi2cut <= 0.0 || bChi2DOF < m_chi2cut);
+
+                   const std::vector< std::vector<TLorentzVector> > &moms = result->getParticleMoms();
+                   double mass = m_CascadeTools->invariantMass(moms[2]);
+                   if(chi2CutPassed) {
+                     if (mass >= m_MassLower && mass <= m_MassUpper) {
+                       cascadeinfoContainer->push_back(result.release());
+                     } else {
+                       ATH_MSG_DEBUG("Candidate rejected by the mass cut: mass = "
+                                     << mass << " != (" << m_MassLower << ", " << m_MassUpper << ")" );
+                     }
+                   }
+                 }
+             
+              } //Iterate over K0 vertices
+
+           } //Iterate over D0 vertices
+
+        } //Iterate over Jpsi+pi vertices
+
+        ATH_MSG_DEBUG("cascadeinfoContainer size " << cascadeinfoContainer->size());
+
+        return StatusCode::SUCCESS;
+    }
+
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/JpsiPlusDsCascade.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/JpsiPlusDsCascade.cxx
new file mode 100644
index 000000000000..f7d485b75f79
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/JpsiPlusDsCascade.cxx
@@ -0,0 +1,702 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+/////////////////////////////////////////////////////////////////
+// JpsiPlusDsCascade.cxx, (c) ATLAS Detector software
+/////////////////////////////////////////////////////////////////
+#include "DerivationFrameworkBPhys/JpsiPlusDsCascade.h"
+#include "TrkVertexFitterInterfaces/IVertexFitter.h"
+#include "TrkVKalVrtFitter/TrkVKalVrtFitter.h"
+#include "TrkVertexAnalysisUtils/V0Tools.h"
+#include "GaudiKernel/IPartPropSvc.h"
+#include "DerivationFrameworkBPhys/CascadeTools.h"
+#include "DerivationFrameworkBPhys/BPhysPVCascadeTools.h"
+#include "xAODTracking/VertexAuxContainer.h"
+#include "BeamSpotConditionsData/BeamSpotData.h"
+#include "xAODBPhys/BPhysHypoHelper.h"
+#include <algorithm>
+#include "xAODTracking/VertexContainer.h"
+#include "DerivationFrameworkBPhys/LocalVector.h"
+#include "HepPDT/ParticleDataTable.hh"
+
+namespace DerivationFramework {
+    typedef ElementLink<xAOD::VertexContainer> VertexLink;
+    typedef std::vector<VertexLink> VertexLinkVector;
+    typedef std::vector<const xAOD::TrackParticle*> TrackBag;
+
+    StatusCode JpsiPlusDsCascade::initialize() {
+
+        // retrieving vertex Fitter
+        ATH_CHECK( m_iVertexFitter.retrieve());
+        
+        // retrieving the V0 tools
+        ATH_CHECK( m_V0Tools.retrieve());
+
+        // retrieving the Cascade tools
+        ATH_CHECK( m_CascadeTools.retrieve());
+
+        // Get the beam spot service
+        ATH_CHECK( m_beamSpotKey.initialize() );
+
+        IPartPropSvc* partPropSvc = nullptr;
+        ATH_CHECK( service("PartPropSvc", partPropSvc, true) );
+        auto pdt = partPropSvc->PDT();
+
+        // retrieve particle masses
+        if(m_mass_jpsi < 0. ) m_mass_jpsi = BPhysPVCascadeTools::getParticleMass(pdt, PDG::J_psi);
+        if(m_vtx0MassHypo < 0.) 
+          m_vtx0MassHypo = BPhysPVCascadeTools::getParticleMass(pdt, PDG::B_c_plus);
+        if(m_vtx1MassHypo < 0.) {
+          if(abs(m_Dx_pid) == 411) m_vtx1MassHypo = BPhysPVCascadeTools::getParticleMass(pdt, PDG::D_plus);
+          else m_vtx1MassHypo = BPhysPVCascadeTools::getParticleMass(pdt, PDG::D_s_plus);
+        }
+
+        if(m_vtx0Daug1MassHypo < 0.) m_vtx0Daug1MassHypo = BPhysPVCascadeTools::getParticleMass(pdt, PDG::mu_minus);
+        if(m_vtx0Daug2MassHypo < 0.) m_vtx0Daug2MassHypo = BPhysPVCascadeTools::getParticleMass(pdt, PDG::mu_minus);
+        if(m_vtx1Daug1MassHypo < 0.) {
+           if(abs(m_Dx_pid) == 411) m_vtx1Daug1MassHypo = BPhysPVCascadeTools::getParticleMass(pdt, PDG::pi_plus);
+           else m_vtx1Daug1MassHypo = BPhysPVCascadeTools::getParticleMass(pdt, PDG::K_plus);
+        }
+        if(m_vtx1Daug2MassHypo < 0.) m_vtx1Daug2MassHypo = BPhysPVCascadeTools::getParticleMass(pdt, PDG::K_plus);
+        if(m_vtx1Daug3MassHypo < 0.) m_vtx1Daug3MassHypo = BPhysPVCascadeTools::getParticleMass(pdt, PDG::pi_plus);
+
+        return StatusCode::SUCCESS;
+    }
+
+
+    StatusCode JpsiPlusDsCascade::addBranches() const
+    {
+      std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
+      constexpr int topoN = 2;
+      std::array<xAOD::VertexContainer*, topoN> Vtxwritehandles;
+      std::array<xAOD::VertexAuxContainer*, topoN> Vtxwritehandlesaux;
+      if(m_cascadeOutputsKeys.size() !=topoN)  { ATH_MSG_FATAL("Incorrect number of VtxContainers"); return StatusCode::FAILURE; }
+
+      for(int i =0; i<topoN;i++){
+         Vtxwritehandles[i] = new xAOD::VertexContainer();
+         Vtxwritehandlesaux[i] = new xAOD::VertexAuxContainer();
+         Vtxwritehandles[i]->setStore(Vtxwritehandlesaux[i]);
+         ATH_CHECK(evtStore()->record(Vtxwritehandles[i]   , m_cascadeOutputsKeys[i]       ));
+         ATH_CHECK(evtStore()->record(Vtxwritehandlesaux[i], m_cascadeOutputsKeys[i] + "Aux."));
+      }
+
+      //----------------------------------------------------
+      // retrieve primary vertices
+      //----------------------------------------------------
+      const xAOD::Vertex * primaryVertex(nullptr);
+      const xAOD::VertexContainer *pvContainer(nullptr);
+      ATH_CHECK(evtStore()->retrieve(pvContainer, m_VxPrimaryCandidateName));
+      ATH_MSG_DEBUG("Found " << m_VxPrimaryCandidateName << " in StoreGate!");
+
+      if (pvContainer->size()==0){
+        ATH_MSG_WARNING("You have no primary vertices: " << pvContainer->size());
+        return StatusCode::RECOVERABLE;
+      } else {
+        primaryVertex = (*pvContainer)[0];
+      }
+
+      //----------------------------------------------------
+      // Try to retrieve refitted primary vertices
+      //----------------------------------------------------
+      xAOD::VertexContainer*    refPvContainer    = nullptr;
+      xAOD::VertexAuxContainer* refPvAuxContainer = nullptr;
+      if (m_refitPV) {
+        if (evtStore()->contains<xAOD::VertexContainer>(m_refPVContainerName)) {
+          // refitted PV container exists. Get it from the store gate
+          ATH_CHECK(evtStore()->retrieve(refPvContainer   , m_refPVContainerName       ));
+          ATH_CHECK(evtStore()->retrieve(refPvAuxContainer, m_refPVContainerName + "Aux."));
+        } else {
+          // refitted PV container does not exist. Create a new one.
+          refPvContainer = new xAOD::VertexContainer;
+          refPvAuxContainer = new xAOD::VertexAuxContainer;
+          refPvContainer->setStore(refPvAuxContainer);
+          ATH_CHECK(evtStore()->record(refPvContainer   , m_refPVContainerName));
+          ATH_CHECK(evtStore()->record(refPvAuxContainer, m_refPVContainerName+"Aux."));
+        }
+      }
+
+      ATH_CHECK(performSearch(&cascadeinfoContainer));
+
+      SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey };
+      if(not beamSpotHandle.isValid()) ATH_MSG_ERROR("Cannot Retrieve " << m_beamSpotKey.key() );
+      BPhysPVCascadeTools helper(&(*m_CascadeTools), beamSpotHandle.cptr());
+      helper.SetMinNTracksInPV(m_PV_minNTracks);
+
+      // Decorators for the main vertex: chi2, ndf, pt and pt error, plus the V0 vertex variables
+      SG::AuxElement::Decorator<VertexLinkVector> CascadeLinksDecor("CascadeVertexLinks"); 
+      SG::AuxElement::Decorator<VertexLinkVector> JpsiLinksDecor("JpsiVertexLinks"); 
+      SG::AuxElement::Decorator<VertexLinkVector> DxLinksDecor("DxVertexLinks"); 
+      SG::AuxElement::Decorator<float> chi2_decor("ChiSquared");
+      SG::AuxElement::Decorator<float> ndof_decor("NumberDoF");
+      SG::AuxElement::Decorator<float> Pt_decor("Pt");
+      SG::AuxElement::Decorator<float> PtErr_decor("PtErr");
+      SG::AuxElement::Decorator<float> Mass_svdecor("Dx_mass");
+      SG::AuxElement::Decorator<float> MassErr_svdecor("Dx_massErr");
+      SG::AuxElement::Decorator<float> Pt_svdecor("Dx_Pt");
+      SG::AuxElement::Decorator<float> PtErr_svdecor("Dx_PtErr");
+      SG::AuxElement::Decorator<float> Lxy_svdecor("Dx_Lxy");
+      SG::AuxElement::Decorator<float> LxyErr_svdecor("Dx_LxyErr");
+      SG::AuxElement::Decorator<float> Tau_svdecor("Dx_Tau");
+      SG::AuxElement::Decorator<float> TauErr_svdecor("Dx_TauErr");
+
+      SG::AuxElement::Decorator<float> MassMumu_decor("Mumu_mass");
+      SG::AuxElement::Decorator<float> MassKX_svdecor("KX_mass");
+      SG::AuxElement::Decorator<float> MassKXpi_svdecor("KXpi_mass");
+
+      ATH_MSG_DEBUG("cascadeinfoContainer size " << cascadeinfoContainer.size());
+
+      // Get Jpsi container and identify the input Jpsi
+      const xAOD::VertexContainer  *jpsiContainer(nullptr);
+      ATH_CHECK(evtStore()->retrieve(jpsiContainer   , m_vertexContainerKey       ));
+      const xAOD::VertexContainer  *dxContainer(nullptr);
+      ATH_CHECK(evtStore()->retrieve(dxContainer   , m_vertexDxContainerKey       ));
+
+      for (Trk::VxCascadeInfo* x : cascadeinfoContainer) {
+        if(x==nullptr) ATH_MSG_ERROR("cascadeinfoContainer is null");
+
+        // the cascade fitter returns:
+        // std::vector<xAOD::Vertex*>, each xAOD::Vertex contains the refitted track parameters (perigee at the vertex position)
+        //   vertices[iv]              the links to the original TPs and a covariance of size 3+5*NTRK; the chi2 of the total fit
+        //                             is split between the cascade vertices as per track contribution
+        // std::vector< std::vector<TLorentzVector> >, each std::vector<TLorentzVector> contains the refitted momenta (TLorentzVector)
+        //   momenta[iv][...]          of all tracks in the corresponding vertex, including any pseudotracks (from cascade vertices)
+        //                             originating in this vertex; the masses are as assigned in the cascade fit
+        // std::vector<Amg::MatrixX>,  the corresponding covariance matrices in momentum space
+        //   covariance[iv]
+        // int nDoF, double Chi2
+        //
+        // the invariant mass, pt, lifetime etc. errors should be calculated using the covariance matrices in momentum space as these
+        // take into account the full track-track and track-vertex correlations
+        //
+        // in the case of Jpsi+V0: vertices[0] is the V0 vertex, vertices[1] is the B/Lambda_b(bar) vertex, containing the 2 Jpsi tracks.
+        // The covariance terms between the two vertices are not stored. In momentum space momenta[0] contains the 2 V0 tracks,
+        // their momenta add up to the momentum of the 3rd track in momenta[1], the first two being the Jpsi tracks
+
+        const std::vector<xAOD::Vertex*> &cascadeVertices = x->vertices();
+        if(cascadeVertices.size()!=topoN)
+          ATH_MSG_ERROR("Incorrect number of vertices");
+        if(cascadeVertices[0] == nullptr || cascadeVertices[1] == nullptr) ATH_MSG_ERROR("Error null vertex");
+        // Keep vertices (bear in mind that they come in reverse order!)
+        for(int i =0;i<topoN;i++) Vtxwritehandles[i]->push_back(cascadeVertices[i]);
+        
+        x->setSVOwnership(false); // Prevent Container from deleting vertices
+        const auto mainVertex = cascadeVertices[1];   // this is the B_c+/- vertex
+        const std::vector< std::vector<TLorentzVector> > &moms = x->getParticleMoms();
+
+        // Set links to cascade vertices
+        std::vector<const xAOD::Vertex*> verticestoLink;
+        verticestoLink.push_back(cascadeVertices[0]);
+        if(Vtxwritehandles[1] == nullptr) ATH_MSG_ERROR("Vtxwritehandles[1] is null");
+        if(!BPhysPVCascadeTools::LinkVertices(CascadeLinksDecor, verticestoLink, Vtxwritehandles[0], cascadeVertices[1]))
+            ATH_MSG_ERROR("Error decorating with cascade vertices");
+
+        // Identify the input Jpsi
+        const xAOD::Vertex* jpsiVertex = BPhysPVCascadeTools::FindVertex<2>(jpsiContainer, cascadeVertices[1]);
+        ATH_MSG_DEBUG("1 pt Jpsi tracks " << cascadeVertices[1]->trackParticle(0)->pt() << ", " << cascadeVertices[1]->trackParticle(1)->pt());
+        if (jpsiVertex) ATH_MSG_DEBUG("2 pt Jpsi tracks " << jpsiVertex->trackParticle(0)->pt() << ", " << jpsiVertex->trackParticle(1)->pt());
+
+        // Identify the input D_(s)+
+        const xAOD::Vertex* dxVertex = BPhysPVCascadeTools::FindVertex<3>(dxContainer, cascadeVertices[0]);;
+        ATH_MSG_DEBUG("1 pt D_(s)+ tracks " << cascadeVertices[0]->trackParticle(0)->pt() << ", " << cascadeVertices[0]->trackParticle(1)->pt() << ", " << cascadeVertices[0]->trackParticle(2)->pt());
+        if (dxVertex) ATH_MSG_DEBUG("2 pt D_(s)+ tracks " << dxVertex->trackParticle(0)->pt() << ", " << dxVertex->trackParticle(1)->pt() << ", " << dxVertex->trackParticle(2)->pt());
+
+        // Set links to input vertices
+        std::vector<const xAOD::Vertex*> jpsiVerticestoLink;
+        if (jpsiVertex) jpsiVerticestoLink.push_back(jpsiVertex);
+        else ATH_MSG_WARNING("Could not find linking Jpsi");
+        if(!BPhysPVCascadeTools::LinkVertices(JpsiLinksDecor, jpsiVerticestoLink, jpsiContainer, cascadeVertices[1]))
+            ATH_MSG_ERROR("Error decorating with Jpsi vertices");
+
+        std::vector<const xAOD::Vertex*> dxVerticestoLink;
+        if (dxVertex) dxVerticestoLink.push_back(dxVertex);
+        else ATH_MSG_WARNING("Could not find linking D_(s)+");
+        if(!BPhysPVCascadeTools::LinkVertices(DxLinksDecor, dxVerticestoLink, dxContainer, cascadeVertices[1]))
+            ATH_MSG_ERROR("Error decorating with D_(s)+ vertices");
+
+        bool tagDp(true);
+        if (dxVertex) {
+          if(abs(m_Dx_pid)==411 && (dxVertex->trackParticle(2)->charge()==-1)) tagDp = false;
+        }
+
+        double mass_b = m_vtx0MassHypo;
+        double mass_d = m_vtx1MassHypo;
+        std::vector<double> massesJpsi;
+        massesJpsi.push_back(m_vtx0Daug1MassHypo);
+        massesJpsi.push_back(m_vtx0Daug2MassHypo);
+        std::vector<double> massesDx;
+        if(tagDp){
+          massesDx.push_back(m_vtx1Daug1MassHypo);
+          massesDx.push_back(m_vtx1Daug2MassHypo);
+        }else{ // Change the order for D-
+          massesDx.push_back(m_vtx1Daug2MassHypo);
+          massesDx.push_back(m_vtx1Daug1MassHypo);
+        }
+        massesDx.push_back(m_vtx1Daug3MassHypo);
+        std::vector<double> Masses;
+        Masses.push_back(m_vtx0Daug1MassHypo);
+        Masses.push_back(m_vtx0Daug2MassHypo);
+        Masses.push_back(m_vtx1MassHypo);
+
+        // loop over candidates -- Don't apply PV_minNTracks requirement here
+        // because it may result in exclusion of the high-pt PV.
+        // get good PVs
+
+
+        xAOD::BPhysHypoHelper vtx(m_hypoName, mainVertex);
+
+        // Get refitted track momenta from all vertices, charged tracks only
+        BPhysPVCascadeTools::SetVectorInfo(vtx, x);
+
+        // Decorate main vertex
+        //
+        // 1.a) mass, mass error
+        BPHYS_CHECK( vtx.setMass(m_CascadeTools->invariantMass(moms[1])) );
+        BPHYS_CHECK( vtx.setMassErr(m_CascadeTools->invariantMassError(moms[1],x->getCovariance()[1])) );
+        // 1.b) pt and pT error (the default pt of mainVertex is != the pt of the full cascade fit!)
+        Pt_decor(*mainVertex) = m_CascadeTools->pT(moms[1]);
+        PtErr_decor(*mainVertex) = m_CascadeTools->pTError(moms[1],x->getCovariance()[1]);
+        // 1.c) chi2 and ndof (the default chi2 of mainVertex is != the chi2 of the full cascade fit!)
+        chi2_decor(*mainVertex) = x->fitChi2();
+        ndof_decor(*mainVertex) = x->nDoF();
+
+        float massMumu = 0.;
+        if (jpsiVertex) {
+          TLorentzVector  p4_mu1, p4_mu2;
+          p4_mu1.SetPtEtaPhiM(jpsiVertex->trackParticle(0)->pt(), 
+                              jpsiVertex->trackParticle(0)->eta(),
+                              jpsiVertex->trackParticle(0)->phi(), m_vtx0Daug1MassHypo); 
+          p4_mu2.SetPtEtaPhiM(jpsiVertex->trackParticle(1)->pt(), 
+                              jpsiVertex->trackParticle(1)->eta(),
+                              jpsiVertex->trackParticle(1)->phi(), m_vtx0Daug2MassHypo); 
+          massMumu = (p4_mu1 + p4_mu2).M();
+        }
+        MassMumu_decor(*mainVertex) = massMumu;
+
+        float massKX = 0., massKXpi = 0.;
+        if (dxVertex) {
+          TLorentzVector  p4_h1, p4_h2, p4_h3;
+          if(tagDp){
+            p4_h1.SetPtEtaPhiM(dxVertex->trackParticle(0)->pt(), 
+                               dxVertex->trackParticle(0)->eta(),
+                               dxVertex->trackParticle(0)->phi(), m_vtx1Daug1MassHypo); 
+            p4_h2.SetPtEtaPhiM(dxVertex->trackParticle(1)->pt(), 
+                               dxVertex->trackParticle(1)->eta(),
+                               dxVertex->trackParticle(1)->phi(), m_vtx1Daug2MassHypo); 
+          }else{ // Change the order for D-
+            p4_h1.SetPtEtaPhiM(dxVertex->trackParticle(0)->pt(), 
+                               dxVertex->trackParticle(0)->eta(),
+                               dxVertex->trackParticle(0)->phi(), m_vtx1Daug2MassHypo); 
+            p4_h2.SetPtEtaPhiM(dxVertex->trackParticle(1)->pt(), 
+                               dxVertex->trackParticle(1)->eta(),
+                               dxVertex->trackParticle(1)->phi(), m_vtx1Daug1MassHypo); 
+          }
+            p4_h3.SetPtEtaPhiM(dxVertex->trackParticle(2)->pt(), 
+                               dxVertex->trackParticle(2)->eta(),
+                               dxVertex->trackParticle(2)->phi(), m_vtx1Daug3MassHypo); 
+          massKX = (p4_h1 + p4_h2).M();
+          massKXpi = (p4_h1 + p4_h2 + p4_h3).M();
+        }
+        MassKX_svdecor(*mainVertex) = massKX;
+        MassKXpi_svdecor(*mainVertex) = massKXpi;
+
+        ATH_CHECK(helper.FillCandwithRefittedVertices(m_refitPV, pvContainer, 
+                                    refPvContainer, &(*m_pvRefitter), m_PV_max, m_DoVertexType, x, 1, mass_b, vtx));
+
+
+        // 4) decorate the main vertex with V0 vertex mass, pt, lifetime and lxy values (plus errors) 
+        // V0 points to the main vertex, so lifetime and lxy are w.r.t the main vertex
+        Mass_svdecor(*mainVertex) = m_CascadeTools->invariantMass(moms[0]);
+        MassErr_svdecor(*mainVertex) = m_CascadeTools->invariantMassError(moms[0],x->getCovariance()[0]);
+        Pt_svdecor(*mainVertex) = m_CascadeTools->pT(moms[0]);
+        PtErr_svdecor(*mainVertex) = m_CascadeTools->pTError(moms[0],x->getCovariance()[0]);
+        Lxy_svdecor(*mainVertex) = m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
+        LxyErr_svdecor(*mainVertex) = m_CascadeTools->lxyError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
+        Tau_svdecor(*mainVertex) = m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1]);
+        TauErr_svdecor(*mainVertex) = m_CascadeTools->tauError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
+
+        // Some checks in DEBUG mode
+        ATH_MSG_DEBUG("chi2 " << x->fitChi2()
+                  << " chi2_1 " << m_V0Tools->chisq(cascadeVertices[0])
+                  << " chi2_2 " << m_V0Tools->chisq(cascadeVertices[1])
+                  << " vprob " << m_CascadeTools->vertexProbability(x->nDoF(),x->fitChi2()));
+        ATH_MSG_DEBUG("ndf " << x->nDoF() << " ndf_1 " << m_V0Tools->ndof(cascadeVertices[0]) << " ndf_2 " << m_V0Tools->ndof(cascadeVertices[1]));
+        ATH_MSG_DEBUG("V0Tools mass_d " << m_V0Tools->invariantMass(cascadeVertices[0],massesDx)
+                   << " error " << m_V0Tools->invariantMassError(cascadeVertices[0],massesDx)
+                   << " mass_J " << m_V0Tools->invariantMass(cascadeVertices[1],massesJpsi)
+                   << " error " << m_V0Tools->invariantMassError(cascadeVertices[1],massesJpsi));
+        // masses and errors, using track masses assigned in the fit
+        double Mass_B = m_CascadeTools->invariantMass(moms[1]);
+        double Mass_D = m_CascadeTools->invariantMass(moms[0]);
+        double Mass_B_err = m_CascadeTools->invariantMassError(moms[1],x->getCovariance()[1]);
+        double Mass_D_err = m_CascadeTools->invariantMassError(moms[0],x->getCovariance()[0]);
+        ATH_MSG_DEBUG("Mass_B " << Mass_B << " Mass_D " << Mass_D);
+        ATH_MSG_DEBUG("Mass_B_err " << Mass_B_err << " Mass_D_err " << Mass_D_err);
+        double mprob_B = m_CascadeTools->massProbability(mass_b,Mass_B,Mass_B_err);
+        double mprob_D = m_CascadeTools->massProbability(mass_d,Mass_D,Mass_D_err);
+        ATH_MSG_DEBUG("mprob_B " << mprob_B << " mprob_D " << mprob_D);
+        // masses and errors, assigning user defined track masses
+        ATH_MSG_DEBUG("Mass_b " << m_CascadeTools->invariantMass(moms[1],Masses)
+                  << " Mass_d " << m_CascadeTools->invariantMass(moms[0],massesDx));
+        ATH_MSG_DEBUG("Mass_b_err " << m_CascadeTools->invariantMassError(moms[1],x->getCovariance()[1],Masses)
+                  << " Mass_d_err " << m_CascadeTools->invariantMassError(moms[0],x->getCovariance()[0],massesDx));
+        ATH_MSG_DEBUG("pt_b " << m_CascadeTools->pT(moms[1])
+                  << " pt_d " << m_CascadeTools->pT(moms[0])
+                  << " pt_dp " << m_V0Tools->pT(cascadeVertices[0]));
+        ATH_MSG_DEBUG("ptErr_b " << m_CascadeTools->pTError(moms[1],x->getCovariance()[1])
+                  << " ptErr_d " << m_CascadeTools->pTError(moms[0],x->getCovariance()[0])
+                  << " ptErr_dp " << m_V0Tools->pTError(cascadeVertices[0]));
+        ATH_MSG_DEBUG("lxy_B " << m_V0Tools->lxy(cascadeVertices[1],primaryVertex) << " lxy_D " << m_V0Tools->lxy(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("lxy_b " << m_CascadeTools->lxy(moms[1],cascadeVertices[1],primaryVertex) << " lxy_d " << m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("lxyErr_b " << m_CascadeTools->lxyError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
+                  << " lxyErr_d " << m_CascadeTools->lxyError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
+                  << " lxyErr_dp " << m_V0Tools->lxyError(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("tau_B " << m_CascadeTools->tau(moms[1],cascadeVertices[1],primaryVertex,mass_b)
+                   << " tau_dp " << m_V0Tools->tau(cascadeVertices[0],cascadeVertices[1],massesDx));
+        ATH_MSG_DEBUG("tau_b " << m_CascadeTools->tau(moms[1],cascadeVertices[1],primaryVertex)
+                   << " tau_d " << m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1])
+                   << " tau_D " << m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1],mass_d));
+        ATH_MSG_DEBUG("tauErr_b " << m_CascadeTools->tauError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
+                  << " tauErr_d " << m_CascadeTools->tauError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
+                  << " tauErr_dp " << m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesDx));
+        ATH_MSG_DEBUG("TauErr_b " << m_CascadeTools->tauError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex,mass_b)
+                  << " TauErr_d " << m_CascadeTools->tauError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1],mass_d)
+                  << " TauErr_dp " << m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesDx,mass_d));
+
+        ATH_MSG_DEBUG("CascadeTools main vert wrt PV " << " CascadeTools SV " << " V0Tools SV");
+        ATH_MSG_DEBUG("a0z " << m_CascadeTools->a0z(moms[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0z(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("a0zErr " << m_CascadeTools->a0zError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0zError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0zError(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("a0xy " << m_CascadeTools->a0xy(moms[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0xy(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("a0xyErr " << m_CascadeTools->a0xyError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0xyError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0xyError(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("a0 " << m_CascadeTools->a0(moms[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0(moms[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("a0Err " << m_CascadeTools->a0Error(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0Error(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0Error(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("x0 " << m_V0Tools->vtx(cascadeVertices[0]).x() << " y0 " << m_V0Tools->vtx(cascadeVertices[0]).y() << " z0 " << m_V0Tools->vtx(cascadeVertices[0]).z());
+        ATH_MSG_DEBUG("x1 " << m_V0Tools->vtx(cascadeVertices[1]).x() << " y1 " << m_V0Tools->vtx(cascadeVertices[1]).y() << " z1 " << m_V0Tools->vtx(cascadeVertices[1]).z());
+        ATH_MSG_DEBUG("X0 " << primaryVertex->x() << " Y0 " << primaryVertex->y() << " Z0 " << primaryVertex->z());
+        ATH_MSG_DEBUG("rxy0 " << m_V0Tools->rxy(cascadeVertices[0]) << " rxyErr0 " << m_V0Tools->rxyError(cascadeVertices[0]));
+        ATH_MSG_DEBUG("rxy1 " << m_V0Tools->rxy(cascadeVertices[1]) << " rxyErr1 " << m_V0Tools->rxyError(cascadeVertices[1]));
+        ATH_MSG_DEBUG("Rxy0 wrt PV " << m_V0Tools->rxy(cascadeVertices[0],primaryVertex) << " RxyErr0 wrt PV " << m_V0Tools->rxyError(cascadeVertices[0],primaryVertex));
+        ATH_MSG_DEBUG("Rxy1 wrt PV " << m_V0Tools->rxy(cascadeVertices[1],primaryVertex) << " RxyErr1 wrt PV " << m_V0Tools->rxyError(cascadeVertices[1],primaryVertex));
+        ATH_MSG_DEBUG("number of covariance matrices " << (x->getCovariance()).size());
+      } // loop over cascadeinfoContainer
+
+      // Deleting cascadeinfo since this won't be stored.
+      // Vertices have been kept in m_cascadeOutputs and should be owned by their container
+      for (auto x : cascadeinfoContainer) delete x;
+
+      return StatusCode::SUCCESS;
+    }
+
+
+    JpsiPlusDsCascade::JpsiPlusDsCascade(const std::string& t, const std::string& n, const IInterface* p)  : AthAlgTool(t,n,p),
+    m_vertexContainerKey(""),
+    m_vertexDxContainerKey(""),
+    m_cascadeOutputsKeys{ "JpsiPlusDsCascadeVtx1", "JpsiPlusDsCascadeVtx2" },
+    m_VxPrimaryCandidateName("PrimaryVertices"),
+    m_jpsiMassLower(0.0),
+    m_jpsiMassUpper(10000.0),
+    m_DxMassLower(0.0),
+    m_DxMassUpper(10000.0),
+    m_MassLower(0.0),
+    m_MassUpper(20000.0),
+    m_vtx0MassHypo(-1),
+    m_vtx1MassHypo(-1),
+    m_vtx0Daug1MassHypo(-1),
+    m_vtx0Daug2MassHypo(-1),
+    m_vtx1Daug1MassHypo(-1),
+    m_vtx1Daug2MassHypo(-1),
+    m_vtx1Daug3MassHypo(-1),
+    m_mass_jpsi(-1),
+    m_Dx_pid(431),
+    m_constrDx(true),
+    m_constrJpsi(true),
+    m_chi2cut(-1.0),
+    m_iVertexFitter("Trk::TrkVKalVrtFitter"),
+    m_pvRefitter("Analysis::PrimaryVertexRefitter"),
+    m_V0Tools("Trk::V0Tools"),
+    m_CascadeTools("DerivationFramework::CascadeTools")
+    {
+       declareProperty("JpsiVertices", m_vertexContainerKey);
+       declareProperty("DxVertices", m_vertexDxContainerKey);
+       declareProperty("VxPrimaryCandidateName", m_VxPrimaryCandidateName);
+       declareProperty("RefPVContainerName", m_refPVContainerName  = "RefittedPrimaryVertices");
+       declareProperty("JpsiMassLowerCut", m_jpsiMassLower);
+       declareProperty("JpsiMassUpperCut", m_jpsiMassUpper);
+       declareProperty("DxMassLowerCut", m_DxMassLower);
+       declareProperty("DxMassUpperCut", m_DxMassUpper);
+       declareProperty("MassLowerCut", m_MassLower);
+       declareProperty("MassUpperCut", m_MassUpper);
+       declareProperty("HypothesisName",            m_hypoName               = "Bc");
+       declareProperty("Vtx0MassHypo",              m_vtx0MassHypo);
+       declareProperty("Vtx1MassHypo",              m_vtx1MassHypo);
+       declareProperty("Vtx0Daug1MassHypo",         m_vtx0Daug1MassHypo);
+       declareProperty("Vtx0Daug2MassHypo",         m_vtx0Daug2MassHypo);
+       declareProperty("Vtx1Daug1MassHypo",         m_vtx1Daug1MassHypo);
+       declareProperty("Vtx1Daug2MassHypo",         m_vtx1Daug2MassHypo);
+       declareProperty("Vtx1Daug3MassHypo",         m_vtx1Daug3MassHypo);
+       declareProperty("JpsiMass",                  m_mass_jpsi);
+       declareProperty("DxHypothesis",              m_Dx_pid);
+       declareProperty("ApplyDxMassConstraint",     m_constrDx);
+       declareProperty("ApplyJpsiMassConstraint",   m_constrJpsi);
+       declareProperty("Chi2Cut",                   m_chi2cut);
+       declareProperty("RefitPV",                   m_refitPV                = true);
+       declareProperty("MaxnPV",                    m_PV_max                 = 999);
+       declareProperty("MinNTracksInPV",            m_PV_minNTracks          = 0);
+       declareProperty("DoVertexType",              m_DoVertexType           = 7);
+       declareProperty("TrkVertexFitterTool",       m_iVertexFitter);
+       declareProperty("PVRefitter",                m_pvRefitter);
+       declareProperty("V0Tools",                   m_V0Tools);
+       declareProperty("CascadeTools",              m_CascadeTools);
+       declareProperty("CascadeVertexCollections",  m_cascadeOutputsKeys);
+    }
+
+    JpsiPlusDsCascade::~JpsiPlusDsCascade(){ }
+
+    StatusCode JpsiPlusDsCascade::performSearch(std::vector<Trk::VxCascadeInfo*> *cascadeinfoContainer) const
+    {
+        ATH_MSG_DEBUG( "JpsiPlusDsCascade::performSearch" );
+        assert(cascadeinfoContainer!=nullptr);
+
+        // Get TrackParticle container (for setting links to the original tracks)
+        const xAOD::TrackParticleContainer  *trackContainer(nullptr);
+        ATH_CHECK(evtStore()->retrieve(trackContainer   , "InDetTrackParticles"      ));
+
+        // Get Jpsi container
+        const xAOD::VertexContainer  *jpsiContainer(nullptr);
+        ATH_CHECK(evtStore()->retrieve(jpsiContainer   , m_vertexContainerKey       ));
+
+        // Get V0 container
+        const xAOD::VertexContainer  *dxContainer(nullptr);
+        ATH_CHECK(evtStore()->retrieve(dxContainer   , m_vertexDxContainerKey       ));
+
+
+
+        double mass_d = m_vtx1MassHypo; 
+        std::vector<const xAOD::TrackParticle*> tracksJpsi;
+        std::vector<const xAOD::TrackParticle*> tracksDx;
+        std::vector<const xAOD::TrackParticle*> tracksBc;
+        std::vector<double> massesJpsi;
+        massesJpsi.push_back(m_vtx0Daug1MassHypo);
+        massesJpsi.push_back(m_vtx0Daug2MassHypo);
+        std::vector<double> massesDx;
+        massesDx.push_back(m_vtx1Daug1MassHypo);
+        massesDx.push_back(m_vtx1Daug2MassHypo);
+        massesDx.push_back(m_vtx1Daug3MassHypo);
+        std::vector<double> massesDm; // Alter the order of masses for D-
+        massesDm.push_back(m_vtx1Daug2MassHypo);
+        massesDm.push_back(m_vtx1Daug1MassHypo);
+        massesDm.push_back(m_vtx1Daug3MassHypo);
+        std::vector<double> Masses;
+        Masses.push_back(m_vtx0Daug1MassHypo);
+        Masses.push_back(m_vtx0Daug2MassHypo);
+        Masses.push_back(m_vtx1MassHypo);
+
+        // Select the J/psi candidates before calling cascade fit
+        std::vector<const xAOD::Vertex*> selectedJpsiCandidates;
+        for(auto vxcItr=jpsiContainer->cbegin(); vxcItr!=jpsiContainer->cend(); ++vxcItr) {
+
+           // Check the passed flag first
+           const xAOD::Vertex* vtx = *vxcItr;
+           SG::AuxElement::Accessor<Char_t> flagAcc1("passed_Jpsi");
+           if(flagAcc1.isAvailable(*vtx)){
+              if(!flagAcc1(*vtx)) continue;
+           }
+
+           // Check J/psi candidate invariant mass and skip if need be
+           double mass_Jpsi = m_V0Tools->invariantMass(*vxcItr, massesJpsi);
+           if (mass_Jpsi < m_jpsiMassLower || mass_Jpsi > m_jpsiMassUpper) {
+             ATH_MSG_DEBUG(" Original Jpsi candidate rejected by the mass cut: mass = "
+                           << mass_Jpsi << " != (" << m_jpsiMassLower << ", " << m_jpsiMassUpper << ")" );
+             continue;
+           }
+           selectedJpsiCandidates.push_back(*vxcItr);
+        }
+        if(selectedJpsiCandidates.size()<1) return StatusCode::SUCCESS;
+
+        // Select the D_s+/D+ candidates before calling cascade fit
+        std::vector<const xAOD::Vertex*> selectedDxCandidates;
+        for(auto vxcItr=dxContainer->cbegin(); vxcItr!=dxContainer->cend(); ++vxcItr) {
+
+           // Check the passed flag first
+           const xAOD::Vertex* vtx = *vxcItr;
+           if(abs(m_Dx_pid)==431) { // D_s+/-
+               SG::AuxElement::Accessor<Char_t> flagAcc1("passed_Ds");
+               if(flagAcc1.isAvailable(*vtx)){
+                  if(!flagAcc1(*vtx)) continue;
+               }
+           }
+
+           if(abs(m_Dx_pid==411)) { // D+/-
+               SG::AuxElement::Accessor<Char_t> flagAcc1("passed_Dp");
+               SG::AuxElement::Accessor<Char_t> flagAcc2("passed_Dm");
+               bool isDp(true);
+               bool isDm(true);
+               if(flagAcc1.isAvailable(*vtx)){
+                  if(!flagAcc1(*vtx)) isDp = false;
+               }
+               if(flagAcc2.isAvailable(*vtx)){
+                  if(!flagAcc2(*vtx)) isDm = false;
+               }
+               if(!(isDp||isDm)) continue;
+           } 
+
+
+           // Ensure the total charge is correct
+           if(abs((*vxcItr)->trackParticle(0)->charge()+(*vxcItr)->trackParticle(1)->charge()+(*vxcItr)->trackParticle(2)->charge()) != 1){
+               ATH_MSG_DEBUG(" Original D+ candidate rejected by the charge requirement: "
+                              << (*vxcItr)->trackParticle(0)->charge() << ", " << (*vxcItr)->trackParticle(1)->charge() << ", " << (*vxcItr)->trackParticle(2)->charge() );
+               continue;
+           }
+
+           // Check D_(s)+/- candidate invariant mass and skip if need be
+           double mass_D;
+           if(abs(m_Dx_pid)==411 && (*vxcItr)->trackParticle(2)->charge()<0) // D- 
+               mass_D = m_V0Tools->invariantMass(*vxcItr,massesDm);
+           else // D+, D_s+/-
+               mass_D = m_V0Tools->invariantMass(*vxcItr,massesDx);
+           ATH_MSG_DEBUG("D_(s) mass " << mass_D);
+           if(mass_D < m_DxMassLower || mass_D > m_DxMassUpper) {
+               ATH_MSG_DEBUG(" Original D_(s) candidate rejected by the mass cut: mass = "
+                              << mass_D << " != (" << m_DxMassLower << ", " << m_DxMassUpper << ")" );
+               continue;
+           }
+
+           // Add loose cut on K+k- mass for D_s->phi pi
+           if(m_Dx_pid==431){
+              TLorentzVector p4Kp_in, p4Km_in;
+              p4Kp_in.SetPtEtaPhiM( (*vxcItr)->trackParticle(0)->pt(), 
+                                    (*vxcItr)->trackParticle(0)->eta(),
+                                    (*vxcItr)->trackParticle(0)->phi(), m_vtx1Daug1MassHypo); 
+              p4Km_in.SetPtEtaPhiM( (*vxcItr)->trackParticle(1)->pt(), 
+                                    (*vxcItr)->trackParticle(1)->eta(),
+                                    (*vxcItr)->trackParticle(1)->phi(), m_vtx1Daug2MassHypo); 
+              double mass_phi = (p4Kp_in + p4Km_in).M();
+              ATH_MSG_DEBUG("phi mass " << mass_phi);
+              if(mass_phi > 1200) {
+                  ATH_MSG_DEBUG(" Original phi candidate rejected by the mass cut: mass = " << mass_phi );
+                  continue;
+              }
+           }
+           selectedDxCandidates.push_back(*vxcItr);
+        }
+        if(selectedDxCandidates.size()<1) return StatusCode::SUCCESS;
+
+        // Select J/psi D_(s)+ candidates
+        // Iterate over Jpsi vertices
+        for(auto jpsiItr=selectedJpsiCandidates.cbegin(); jpsiItr!=selectedJpsiCandidates.cend(); ++jpsiItr) {
+
+           size_t jpsiTrkNum = (*jpsiItr)->nTrackParticles();
+           tracksJpsi.clear();
+           for( unsigned int it=0; it<jpsiTrkNum; it++) tracksJpsi.push_back((*jpsiItr)->trackParticle(it));
+
+           if (tracksJpsi.size() != 2 || massesJpsi.size() != 2 ) {
+             ATH_MSG_INFO("problems with Jpsi input");
+           }
+
+           // Iterate over D_(s)+/- vertices
+           for(auto dxItr=selectedDxCandidates.cbegin(); dxItr!=selectedDxCandidates.cend(); ++dxItr) {
+
+              // Check identical tracks in input
+              if(std::find(tracksJpsi.cbegin(), tracksJpsi.cend(), (*dxItr)->trackParticle(0)) != tracksJpsi.cend()) continue; 
+              if(std::find(tracksJpsi.cbegin(), tracksJpsi.cend(), (*dxItr)->trackParticle(1)) != tracksJpsi.cend()) continue; 
+              if(std::find(tracksJpsi.cbegin(), tracksJpsi.cend(), (*dxItr)->trackParticle(2)) != tracksJpsi.cend()) continue; 
+
+              size_t dxTrkNum = (*dxItr)->nTrackParticles();
+              tracksDx.clear();
+              for( unsigned int it=0; it<dxTrkNum; it++) tracksDx.push_back((*dxItr)->trackParticle(it));
+              if (tracksDx.size() != 3 || massesDx.size() != 3 ) {
+                ATH_MSG_INFO("problems with D_(s) input");
+              }
+
+              ATH_MSG_DEBUG("using tracks" << tracksJpsi[0] << ", " << tracksJpsi[1] << ", " << tracksDx[0] << ", " << tracksDx[1] << ", " << tracksDx[2]);
+              tracksBc.clear();
+              for( unsigned int it=0; it<jpsiTrkNum; it++) tracksBc.push_back((*jpsiItr)->trackParticle(it));
+              for( unsigned int it=0; it<dxTrkNum; it++) tracksBc.push_back((*dxItr)->trackParticle(it));
+
+              // Apply the user's settings to the fitter
+              // Reset
+              std::unique_ptr<Trk::IVKalState> state (m_iVertexFitter->makeState());
+              // Robustness
+              int robustness = 0;
+              m_iVertexFitter->setRobustness(robustness, *state);
+              // Build up the topology
+              // Vertex list
+              std::vector<Trk::VertexID> vrtList;
+              // D_(s)+/- vertex
+              Trk::VertexID vID;
+              if (m_constrDx) {
+                if(abs(m_Dx_pid)==411 && (*dxItr)->trackParticle(2)->charge()<0) // D- 
+                  vID = m_iVertexFitter->startVertex(tracksDx,massesDm,*state,mass_d);
+                else // D+, D_s+/-
+                  vID = m_iVertexFitter->startVertex(tracksDx,massesDx,*state,mass_d);
+              } else {
+                if(abs(m_Dx_pid)==411 && (*dxItr)->trackParticle(2)->charge()<0) // D-
+                  vID = m_iVertexFitter->startVertex(tracksDx,massesDm,*state);
+                else // D+, D_s+/-
+                  vID = m_iVertexFitter->startVertex(tracksDx,massesDx,*state);
+              }
+              vrtList.push_back(vID);
+              // B vertex including Jpsi
+              Trk::VertexID vID2 = m_iVertexFitter->nextVertex(tracksJpsi,massesJpsi,vrtList,*state);
+              if (m_constrJpsi) {
+                std::vector<Trk::VertexID> cnstV;
+                cnstV.clear();
+                if ( !m_iVertexFitter->addMassConstraint(vID2,tracksJpsi,cnstV,*state,m_mass_jpsi).isSuccess() ) {
+                  ATH_MSG_WARNING("addMassConstraint failed");
+                  //return StatusCode::FAILURE;
+                }
+              }
+              // Do the work
+              std::unique_ptr<Trk::VxCascadeInfo> result(m_iVertexFitter->fitCascade(*state));
+
+              if (result != nullptr) {
+                // reset links to original tracks
+                BPhysPVCascadeTools::PrepareVertexLinks(result.get(), trackContainer);
+                ATH_MSG_DEBUG("storing tracks " << ((result->vertices())[0])->trackParticle(0) << ", "
+                                                << ((result->vertices())[0])->trackParticle(1) << ", "
+                                                << ((result->vertices())[0])->trackParticle(2) << ", "
+                                                << ((result->vertices())[1])->trackParticle(0) << ", "
+                                                << ((result->vertices())[1])->trackParticle(1));
+                // necessary to prevent memory leak
+                result->setSVOwnership(true);
+
+                // Chi2/DOF cut
+                double bChi2DOF = result->fitChi2()/result->nDoF();
+                ATH_MSG_DEBUG("Candidate chi2/DOF is " << bChi2DOF);
+                bool chi2CutPassed = (m_chi2cut <= 0.0 || bChi2DOF < m_chi2cut);
+
+                const std::vector< std::vector<TLorentzVector> > &moms = result->getParticleMoms();
+                double mass = m_CascadeTools->invariantMass(moms[1]);
+                if(chi2CutPassed) {
+                  if (mass >= m_MassLower && mass <= m_MassUpper) {
+                    cascadeinfoContainer->push_back(result.release());
+                  } else {
+                    ATH_MSG_DEBUG("Candidate rejected by the mass cut: mass = "
+                                  << mass << " != (" << m_MassLower << ", " << m_MassUpper << ")" );
+                  }
+                }
+              }
+
+           } //Iterate over D_(s)+ vertices
+
+        } //Iterate over Jpsi vertices
+
+        ATH_MSG_DEBUG("cascadeinfoContainer size " << cascadeinfoContainer->size());
+
+        return StatusCode::SUCCESS;
+    }
+
+}
+
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/JpsiPlusV0Cascade.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/JpsiPlusV0Cascade.cxx
new file mode 100644
index 000000000000..6f66478553aa
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/JpsiPlusV0Cascade.cxx
@@ -0,0 +1,576 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+/////////////////////////////////////////////////////////////////
+// JpsiPlusV0Cascade.cxx, (c) ATLAS Detector software
+/////////////////////////////////////////////////////////////////
+#include "DerivationFrameworkBPhys/JpsiPlusV0Cascade.h"
+#include "TrkVertexFitterInterfaces/IVertexFitter.h"
+#include "TrkVKalVrtFitter/TrkVKalVrtFitter.h"
+#include "TrkVertexAnalysisUtils/V0Tools.h"
+#include "GaudiKernel/IPartPropSvc.h"
+#include "DerivationFrameworkBPhys/CascadeTools.h"
+#include "DerivationFrameworkBPhys/BPhysPVCascadeTools.h"
+#include "xAODTracking/VertexAuxContainer.h"
+#include "BeamSpotConditionsData/BeamSpotData.h"
+#include "xAODBPhys/BPhysHypoHelper.h"
+#include <algorithm>
+#include "xAODTracking/VertexContainer.h"
+#include "DerivationFrameworkBPhys/LocalVector.h"
+#include "HepPDT/ParticleDataTable.hh"
+
+namespace DerivationFramework {
+    typedef ElementLink<xAOD::VertexContainer> VertexLink;
+    typedef std::vector<VertexLink> VertexLinkVector;
+    typedef std::vector<const xAOD::TrackParticle*> TrackBag;
+
+
+    StatusCode JpsiPlusV0Cascade::initialize() {
+
+        // retrieving vertex Fitter
+        if ( m_iVertexFitter.retrieve().isFailure() ) {
+            ATH_MSG_FATAL("Failed to retrieve tool " << m_iVertexFitter);
+            return StatusCode::FAILURE;
+        } else {
+            ATH_MSG_DEBUG("Retrieved tool " << m_iVertexFitter);
+        }
+        
+        // retrieving the V0 tools
+        if ( m_V0Tools.retrieve().isFailure() ) {
+          ATH_MSG_FATAL("Failed to retrieve tool " << m_V0Tools);
+          return StatusCode::FAILURE;
+        } else {
+          ATH_MSG_INFO("Retrieved tool " << m_V0Tools);
+        }
+
+        // retrieving the Cascade tools
+        if ( m_CascadeTools.retrieve().isFailure() ) {
+          ATH_MSG_FATAL("Failed to retrieve tool " << m_CascadeTools);
+          return StatusCode::FAILURE;
+        } else {
+          ATH_MSG_INFO("Retrieved tool " << m_CascadeTools);
+        }
+
+        ATH_CHECK(m_beamSpotKey.initialize());
+
+        IPartPropSvc* partPropSvc = 0;
+        StatusCode sc = service("PartPropSvc", partPropSvc, true);
+        if (sc.isFailure()) {
+          msg(MSG::ERROR) << "Could not initialize Particle Properties Service" << endmsg;
+          return StatusCode::FAILURE;
+        }
+        const HepPDT::ParticleDataTable* pdt = partPropSvc->PDT();
+
+        // retrieve particle masses
+        m_mass_muon     = BPhysPVCascadeTools::getParticleMass(pdt, PDG::mu_minus);
+        m_mass_pion     = BPhysPVCascadeTools::getParticleMass(pdt, PDG::pi_plus);
+        m_mass_proton   = BPhysPVCascadeTools::getParticleMass(pdt, PDG::p_plus);
+        m_mass_lambda   = BPhysPVCascadeTools::getParticleMass(pdt, PDG::Lambda0);
+        m_mass_ks       = BPhysPVCascadeTools::getParticleMass(pdt, PDG::K_S0);
+        m_mass_jpsi     = BPhysPVCascadeTools::getParticleMass(pdt, PDG::J_psi);
+        m_mass_b0       = BPhysPVCascadeTools::getParticleMass(pdt, PDG::B0);
+        m_mass_lambdaB  = BPhysPVCascadeTools::getParticleMass(pdt, PDG::Lambda_b0);
+
+        return StatusCode::SUCCESS;
+    }
+
+
+    StatusCode JpsiPlusV0Cascade::addBranches() const
+    {
+      std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
+      constexpr int topoN = 2;
+      std::array<xAOD::VertexContainer*, topoN> Vtxwritehandles;
+      std::array<xAOD::VertexAuxContainer*, topoN> Vtxwritehandlesaux;
+      if(m_cascadeOutputsKeys.size() !=topoN)  { ATH_MSG_FATAL("Incorrect number of VtxContainers"); return StatusCode::FAILURE; }
+
+      for(int i =0; i<topoN;i++){
+         Vtxwritehandles[i] = new xAOD::VertexContainer();
+         Vtxwritehandlesaux[i] = new xAOD::VertexAuxContainer();
+         Vtxwritehandles[i]->setStore(Vtxwritehandlesaux[i]);
+         CHECK(evtStore()->record(Vtxwritehandles[i]   , m_cascadeOutputsKeys[i]       ));
+         CHECK(evtStore()->record(Vtxwritehandlesaux[i], m_cascadeOutputsKeys[i] + "Aux."));
+      }
+
+      //----------------------------------------------------
+      // retrieve primary vertices
+      //----------------------------------------------------
+      const xAOD::Vertex * primaryVertex(nullptr);
+      const xAOD::VertexContainer *pvContainer(nullptr);
+      CHECK(evtStore()->retrieve(pvContainer, m_VxPrimaryCandidateName));
+      ATH_MSG_DEBUG("Found " << m_VxPrimaryCandidateName << " in StoreGate!");
+
+      if (pvContainer->size()==0){
+        ATH_MSG_WARNING("You have no primary vertices: " << pvContainer->size());
+        return StatusCode::RECOVERABLE;
+      } else {
+        primaryVertex = (*pvContainer)[0];
+      }
+
+      //----------------------------------------------------
+      // Try to retrieve refitted primary vertices
+      //----------------------------------------------------
+      xAOD::VertexContainer*    refPvContainer    = NULL;
+      xAOD::VertexAuxContainer* refPvAuxContainer = NULL;
+      if (m_refitPV) {
+        if (evtStore()->contains<xAOD::VertexContainer>(m_refPVContainerName)) {
+          // refitted PV container exists. Get it from the store gate
+          CHECK(evtStore()->retrieve(refPvContainer   , m_refPVContainerName       ));
+          CHECK(evtStore()->retrieve(refPvAuxContainer, m_refPVContainerName + "Aux."));
+        } else {
+          // refitted PV container does not exist. Create a new one.
+          refPvContainer = new xAOD::VertexContainer;
+          refPvAuxContainer = new xAOD::VertexAuxContainer;
+          refPvContainer->setStore(refPvAuxContainer);
+          CHECK(evtStore()->record(refPvContainer   , m_refPVContainerName));
+          CHECK(evtStore()->record(refPvAuxContainer, m_refPVContainerName+"Aux."));
+        }
+      }
+
+      ATH_CHECK(performSearch(&cascadeinfoContainer));
+
+      SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey };
+      if(not beamSpotHandle.isValid()) ATH_MSG_ERROR("Cannot Retrieve " << m_beamSpotKey.key() );
+      BPhysPVCascadeTools helper(&(*m_CascadeTools), beamSpotHandle.cptr());
+      helper.SetMinNTracksInPV(m_PV_minNTracks);
+
+      // Decorators for the main vertex: chi2, ndf, pt and pt error, plus the V0 vertex variables
+      SG::AuxElement::Decorator<VertexLinkVector> CascadeLinksDecor("CascadeVertexLinks"); 
+      SG::AuxElement::Decorator<VertexLinkVector> JpsiLinksDecor("JpsiVertexLinks"); 
+      SG::AuxElement::Decorator<VertexLinkVector> V0LinksDecor("V0VertexLinks"); 
+      SG::AuxElement::Decorator<float> chi2_decor("ChiSquared");
+      SG::AuxElement::Decorator<float> ndof_decor("NumberDoF");
+      SG::AuxElement::Decorator<float> Pt_decor("Pt");
+      SG::AuxElement::Decorator<float> PtErr_decor("PtErr");
+      SG::AuxElement::Decorator<float> Mass_svdecor("V0_mass");
+      SG::AuxElement::Decorator<float> MassErr_svdecor("V0_massErr");
+      SG::AuxElement::Decorator<float> Pt_svdecor("V0_Pt");
+      SG::AuxElement::Decorator<float> PtErr_svdecor("V0_PtErr");
+      SG::AuxElement::Decorator<float> Lxy_svdecor("V0_Lxy");
+      SG::AuxElement::Decorator<float> LxyErr_svdecor("V0_LxyErr");
+      SG::AuxElement::Decorator<float> Tau_svdecor("V0_Tau");
+      SG::AuxElement::Decorator<float> TauErr_svdecor("V0_TauErr");
+
+      ATH_MSG_DEBUG("cascadeinfoContainer size " << cascadeinfoContainer.size());
+
+      // Get Jpsi container and identify the input Jpsi
+      const xAOD::VertexContainer  *jpsiContainer(nullptr);
+      CHECK(evtStore()->retrieve(jpsiContainer   , m_vertexContainerKey       ));
+      const xAOD::VertexContainer  *v0Container(nullptr);
+      CHECK(evtStore()->retrieve(v0Container   , m_vertexV0ContainerKey       ));
+
+      for (Trk::VxCascadeInfo* x : cascadeinfoContainer) {
+        if(x==nullptr) ATH_MSG_ERROR("cascadeinfoContainer is null");
+
+        // the cascade fitter returns:
+        // std::vector<xAOD::Vertex*>, each xAOD::Vertex contains the refitted track parameters (perigee at the vertex position)
+        //   vertices[iv]              the links to the original TPs and a covariance of size 3+5*NTRK; the chi2 of the total fit
+        //                             is split between the cascade vertices as per track contribution
+        // std::vector< std::vector<TLorentzVector> >, each std::vector<TLorentzVector> contains the refitted momenta (TLorentzVector)
+        //   momenta[iv][...]          of all tracks in the corresponding vertex, including any pseudotracks (from cascade vertices)
+        //                             originating in this vertex; the masses are as assigned in the cascade fit
+        // std::vector<Amg::MatrixX>,  the corresponding covariance matrices in momentum space
+        //   covariance[iv]
+        // int nDoF, double Chi2
+        //
+        // the invariant mass, pt, lifetime etc. errors should be calculated using the covariance matrices in momentum space as these
+        // take into account the full track-track and track-vertex correlations
+        //
+        // in the case of Jpsi+V0: vertices[0] is the V0 vertex, vertices[1] is the B/Lambda_b(bar) vertex, containing the 2 Jpsi tracks.
+        // The covariance terms between the two vertices are not stored. In momentum space momenta[0] contains the 2 V0 tracks,
+        // their momenta add up to the momentum of the 3rd track in momenta[1], the first two being the Jpsi tracks
+
+        const std::vector<xAOD::Vertex*> &cascadeVertices = x->vertices();
+        if(cascadeVertices.size()!=topoN)
+          ATH_MSG_ERROR("Incorrect number of vertices");
+        if(cascadeVertices[0] == nullptr || cascadeVertices[1] == nullptr) ATH_MSG_ERROR("Error null vertex");
+        // Keep vertices (bear in mind that they come in reverse order!)
+        for(int i =0;i<topoN;i++) Vtxwritehandles[i]->push_back(cascadeVertices[i]);
+        
+        x->setSVOwnership(false); // Prevent Container from deleting vertices
+        const auto mainVertex = cascadeVertices[1];   // this is the Bd (Bd, Lambda_b, Lambda_bbar) vertex
+        //const auto v0Vertex = cascadeVertices[0];   // this is the V0 (Kshort, Lambda, Lambdabar) vertex
+        const std::vector< std::vector<TLorentzVector> > &moms = x->getParticleMoms();
+
+        // Set links to cascade vertices
+        std::vector<const xAOD::Vertex*> verticestoLink;
+        verticestoLink.push_back(cascadeVertices[0]);
+        if(Vtxwritehandles[1] == nullptr) ATH_MSG_ERROR("Vtxwritehandles[1] is null");
+        if(!BPhysPVCascadeTools::LinkVertices(CascadeLinksDecor, verticestoLink, Vtxwritehandles[0], cascadeVertices[1]))
+            ATH_MSG_ERROR("Error decorating with cascade vertices");
+
+        // Identify the input Jpsi
+        const xAOD::Vertex* jpsiVertex = BPhysPVCascadeTools::FindVertex<2>(jpsiContainer, cascadeVertices[1]);
+        ATH_MSG_DEBUG("1 pt Jpsi tracks " << cascadeVertices[1]->trackParticle(0)->pt() << ", " << cascadeVertices[1]->trackParticle(1)->pt());
+        if (jpsiVertex) ATH_MSG_DEBUG("2 pt Jpsi tracks " << jpsiVertex->trackParticle(0)->pt() << ", " << jpsiVertex->trackParticle(1)->pt());
+
+        // Identify the input V0
+        const xAOD::Vertex* v0Vertex = BPhysPVCascadeTools::FindVertex<2>(v0Container, cascadeVertices[0]);;
+        ATH_MSG_DEBUG("1 pt V0 tracks " << cascadeVertices[0]->trackParticle(0)->pt() << ", " << cascadeVertices[0]->trackParticle(1)->pt());
+        if (v0Vertex) ATH_MSG_DEBUG("2 pt V0 tracks " << v0Vertex->trackParticle(0)->pt() << ", " << v0Vertex->trackParticle(1)->pt());
+
+        // Set links to input vertices
+        std::vector<const xAOD::Vertex*> jpsiVerticestoLink;
+        if (jpsiVertex) jpsiVerticestoLink.push_back(jpsiVertex);
+        else ATH_MSG_WARNING("Could not find linking Jpsi");
+        if(!BPhysPVCascadeTools::LinkVertices(JpsiLinksDecor, jpsiVerticestoLink, jpsiContainer, cascadeVertices[1]))
+            ATH_MSG_ERROR("Error decorating with Jpsi vertices");
+
+        std::vector<const xAOD::Vertex*> v0VerticestoLink;
+        if (v0Vertex) v0VerticestoLink.push_back(v0Vertex);
+        else ATH_MSG_WARNING("Could not find linking V0");
+        if(!BPhysPVCascadeTools::LinkVertices(V0LinksDecor, v0VerticestoLink, v0Container, cascadeVertices[1]))
+            ATH_MSG_ERROR("Error decorating with V0 vertices");
+
+        double mass_v0 = m_mass_ks; 
+        double mass_b = m_mass_b0;
+        std::vector<double> massesJpsi(2, m_mass_muon);
+        std::vector<double> massesV0;
+        std::vector<double> Masses(2, m_mass_muon);
+        if (m_v0_pid == 310) {
+           massesV0.push_back(m_mass_pion);
+           massesV0.push_back(m_mass_pion);
+           Masses.push_back(m_mass_ks);
+        } else if (m_v0_pid == 3122) {
+           massesV0.push_back(m_mass_proton);
+           massesV0.push_back(m_mass_pion);
+           Masses.push_back(m_mass_lambda);
+           mass_v0 = m_mass_lambda;
+           mass_b = m_mass_lambdaB;
+        } else if (m_v0_pid == -3122) {
+           massesV0.push_back(m_mass_pion);
+           massesV0.push_back(m_mass_proton);
+           Masses.push_back(m_mass_lambda);
+           mass_v0 = m_mass_lambda;
+           mass_b = m_mass_lambdaB;
+        }
+
+        // loop over candidates -- Don't apply PV_minNTracks requirement here
+        // because it may result in exclusion of the high-pt PV.
+        // get good PVs
+
+        xAOD::BPhysHypoHelper vtx(m_hypoName, mainVertex);
+
+        BPhysPVCascadeTools::SetVectorInfo(vtx, x);
+        
+
+        // Decorate main vertex
+        //
+        // 1.a) mass, mass error
+        BPHYS_CHECK( vtx.setMass(m_CascadeTools->invariantMass(moms[1])) );
+        BPHYS_CHECK( vtx.setMassErr(m_CascadeTools->invariantMassError(moms[1],x->getCovariance()[1])) );
+        // 1.b) pt and pT error (the default pt of mainVertex is != the pt of the full cascade fit!)
+        Pt_decor(*mainVertex) = m_CascadeTools->pT(moms[1]);
+        PtErr_decor(*mainVertex) = m_CascadeTools->pTError(moms[1],x->getCovariance()[1]);
+        // 1.c) chi2 and ndof (the default chi2 of mainVertex is != the chi2 of the full cascade fit!)
+        chi2_decor(*mainVertex) = x->fitChi2();
+        ndof_decor(*mainVertex) = x->nDoF();
+
+        ATH_CHECK(helper.FillCandwithRefittedVertices(m_refitPV, pvContainer, 
+                                    refPvContainer, &(*m_pvRefitter), m_PV_max, m_DoVertexType, x, 1, mass_b, vtx));
+
+        // 4) decorate the main vertex with V0 vertex mass, pt, lifetime and lxy values (plus errors) 
+        // V0 points to the main vertex, so lifetime and lxy are w.r.t the main vertex
+        Mass_svdecor(*mainVertex) = m_CascadeTools->invariantMass(moms[0]);
+        MassErr_svdecor(*mainVertex) = m_CascadeTools->invariantMassError(moms[0],x->getCovariance()[0]);
+        Pt_svdecor(*mainVertex) = m_CascadeTools->pT(moms[0]);
+        PtErr_svdecor(*mainVertex) = m_CascadeTools->pTError(moms[0],x->getCovariance()[0]);
+        Lxy_svdecor(*mainVertex) = m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
+        LxyErr_svdecor(*mainVertex) = m_CascadeTools->lxyError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
+        Tau_svdecor(*mainVertex) = m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1]);
+        TauErr_svdecor(*mainVertex) = m_CascadeTools->tauError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
+
+        // Some checks in DEBUG mode
+        ATH_MSG_DEBUG("chi2 " << x->fitChi2()
+                  << " chi2_1 " << m_V0Tools->chisq(cascadeVertices[0])
+                  << " chi2_2 " << m_V0Tools->chisq(cascadeVertices[1])
+                  << " vprob " << m_CascadeTools->vertexProbability(x->nDoF(),x->fitChi2()));
+        ATH_MSG_DEBUG("ndf " << x->nDoF() << " ndf_1 " << m_V0Tools->ndof(cascadeVertices[0]) << " ndf_2 " << m_V0Tools->ndof(cascadeVertices[1]));
+        ATH_MSG_DEBUG("V0Tools mass_v0 " << m_V0Tools->invariantMass(cascadeVertices[0],massesV0)
+                   << " error " << m_V0Tools->invariantMassError(cascadeVertices[0],massesV0)
+                   << " mass_J " << m_V0Tools->invariantMass(cascadeVertices[1],massesJpsi)
+                   << " error " << m_V0Tools->invariantMassError(cascadeVertices[1],massesJpsi));
+        // masses and errors, using track masses assigned in the fit
+        double Mass_B = m_CascadeTools->invariantMass(moms[1]);
+        double Mass_V0 = m_CascadeTools->invariantMass(moms[0]);
+        double Mass_B_err = m_CascadeTools->invariantMassError(moms[1],x->getCovariance()[1]);
+        double Mass_V0_err = m_CascadeTools->invariantMassError(moms[0],x->getCovariance()[0]);
+        ATH_MSG_DEBUG("Mass_B " << Mass_B << " Mass_V0 " << Mass_V0);
+        ATH_MSG_DEBUG("Mass_B_err " << Mass_B_err << " Mass_V0_err " << Mass_V0_err);
+        double mprob_B = m_CascadeTools->massProbability(mass_b,Mass_B,Mass_B_err);
+        double mprob_V0 = m_CascadeTools->massProbability(mass_v0,Mass_V0,Mass_V0_err);
+        ATH_MSG_DEBUG("mprob_B " << mprob_B << " mprob_V0 " << mprob_V0);
+        // masses and errors, assigning user defined track masses
+        ATH_MSG_DEBUG("Mass_b " << m_CascadeTools->invariantMass(moms[1],Masses)
+                  << " Mass_v0 " << m_CascadeTools->invariantMass(moms[0],massesV0));
+        ATH_MSG_DEBUG("Mass_b_err " << m_CascadeTools->invariantMassError(moms[1],x->getCovariance()[1],Masses)
+                  << " Mass_v0_err " << m_CascadeTools->invariantMassError(moms[0],x->getCovariance()[0],massesV0));
+        ATH_MSG_DEBUG("pt_b " << m_CascadeTools->pT(moms[1])
+                  << " pt_v " << m_CascadeTools->pT(moms[0])
+                  << " pt_v0 " << m_V0Tools->pT(cascadeVertices[0]));
+        ATH_MSG_DEBUG("ptErr_b " << m_CascadeTools->pTError(moms[1],x->getCovariance()[1])
+                  << " ptErr_v " << m_CascadeTools->pTError(moms[0],x->getCovariance()[0])
+                  << " ptErr_v0 " << m_V0Tools->pTError(cascadeVertices[0]));
+        ATH_MSG_DEBUG("lxy_B " << m_V0Tools->lxy(cascadeVertices[1],primaryVertex) << " lxy_V " << m_V0Tools->lxy(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("lxy_b " << m_CascadeTools->lxy(moms[1],cascadeVertices[1],primaryVertex) << " lxy_v " << m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("lxyErr_b " << m_CascadeTools->lxyError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
+                  << " lxyErr_v " << m_CascadeTools->lxyError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
+                  << " lxyErr_v0 " << m_V0Tools->lxyError(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("tau_B " << m_CascadeTools->tau(moms[1],cascadeVertices[1],primaryVertex,mass_b)
+                   << " tau_v0 " << m_V0Tools->tau(cascadeVertices[0],cascadeVertices[1],massesV0));
+        ATH_MSG_DEBUG("tau_b " << m_CascadeTools->tau(moms[1],cascadeVertices[1],primaryVertex)
+                   << " tau_v " << m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1])
+                   << " tau_V " << m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1],mass_v0));
+        ATH_MSG_DEBUG("tauErr_b " << m_CascadeTools->tauError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
+                  << " tauErr_v " << m_CascadeTools->tauError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
+                  << " tauErr_v0 " << m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesV0));
+        ATH_MSG_DEBUG("TauErr_b " << m_CascadeTools->tauError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex,mass_b)
+                  << " TauErr_v " << m_CascadeTools->tauError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1],mass_v0)
+                  << " TauErr_v0 " << m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesV0,mass_v0));
+
+        ATH_MSG_DEBUG("CascadeTools main vert wrt PV " << " CascadeTools SV " << " V0Tools SV");
+        ATH_MSG_DEBUG("a0z " << m_CascadeTools->a0z(moms[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0z(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("a0zErr " << m_CascadeTools->a0zError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0zError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0zError(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("a0xy " << m_CascadeTools->a0xy(moms[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0xy(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("a0xyErr " << m_CascadeTools->a0xyError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0xyError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0xyError(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("a0 " << m_CascadeTools->a0(moms[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0(moms[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("a0Err " << m_CascadeTools->a0Error(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
+                   << ", " << m_CascadeTools->a0Error(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
+                   << ", " << m_V0Tools->a0Error(cascadeVertices[0],cascadeVertices[1]));
+        ATH_MSG_DEBUG("x0 " << m_V0Tools->vtx(cascadeVertices[0]).x() << " y0 " << m_V0Tools->vtx(cascadeVertices[0]).y() << " z0 " << m_V0Tools->vtx(cascadeVertices[0]).z());
+        ATH_MSG_DEBUG("x1 " << m_V0Tools->vtx(cascadeVertices[1]).x() << " y1 " << m_V0Tools->vtx(cascadeVertices[1]).y() << " z1 " << m_V0Tools->vtx(cascadeVertices[1]).z());
+        ATH_MSG_DEBUG("X0 " << primaryVertex->x() << " Y0 " << primaryVertex->y() << " Z0 " << primaryVertex->z());
+        ATH_MSG_DEBUG("rxy0 " << m_V0Tools->rxy(cascadeVertices[0]) << " rxyErr0 " << m_V0Tools->rxyError(cascadeVertices[0]));
+        ATH_MSG_DEBUG("rxy1 " << m_V0Tools->rxy(cascadeVertices[1]) << " rxyErr1 " << m_V0Tools->rxyError(cascadeVertices[1]));
+        ATH_MSG_DEBUG("Rxy0 wrt PV " << m_V0Tools->rxy(cascadeVertices[0],primaryVertex) << " RxyErr0 wrt PV " << m_V0Tools->rxyError(cascadeVertices[0],primaryVertex));
+        ATH_MSG_DEBUG("Rxy1 wrt PV " << m_V0Tools->rxy(cascadeVertices[1],primaryVertex) << " RxyErr1 wrt PV " << m_V0Tools->rxyError(cascadeVertices[1],primaryVertex));
+        ATH_MSG_DEBUG("number of covariance matrices " << (x->getCovariance()).size());
+        //const Amg::MatrixX& cov30 = (cascadeVertices[0])->covariancePosition();
+        //const Amg::MatrixX& cov31 = (cascadeVertices[1])->covariancePosition();
+        //ATH_MSG_DEBUG("cov30 " << cov30);
+        //ATH_MSG_DEBUG("cov31 " << cov31);
+
+
+      } // loop over cascadeinfoContainer
+
+      // Deleting cascadeinfo since this won't be stored.
+      // Vertices have been kept in m_cascadeOutputs and should be owned by their container
+      for (auto x : cascadeinfoContainer) delete x;
+
+      return StatusCode::SUCCESS;
+    }
+
+
+    JpsiPlusV0Cascade::JpsiPlusV0Cascade(const std::string& t, const std::string& n, const IInterface* p)  : AthAlgTool(t,n,p),
+    m_vertexContainerKey(""),
+    m_vertexV0ContainerKey(""),
+    m_cascadeOutputsKeys{ "JpsiPlusV0CascadeVtx1", "JpsiPlusV0CascadeVtx2" },
+    m_VxPrimaryCandidateName("PrimaryVertices"),
+    m_jpsiMassLower(0.0),
+    m_jpsiMassUpper(10000.0),
+    m_V0MassLower(0.0),
+    m_V0MassUpper(10000.0),
+    m_MassLower(0.0),
+    m_MassUpper(20000.0),
+    m_mass_muon   ( 0 ),
+    m_mass_pion   ( 0 ),
+    m_mass_proton ( 0 ),
+    m_mass_lambda ( 0 ),
+    m_mass_ks     ( 0 ),
+    m_mass_jpsi   ( 0 ),
+    m_mass_b0     ( 0 ),
+    m_mass_lambdaB( 0 ),
+    m_v0_pid(310),
+    m_constrV0(true),
+    m_constrJpsi(true),
+    m_iVertexFitter("Trk::TrkVKalVrtFitter"),
+    m_pvRefitter("Analysis::PrimaryVertexRefitter"),
+    m_V0Tools("Trk::V0Tools"),
+    m_CascadeTools("DerivationFramework::CascadeTools")
+    {
+       declareProperty("JpsiVertices", m_vertexContainerKey);
+       declareProperty("V0Vertices", m_vertexV0ContainerKey);
+       declareProperty("VxPrimaryCandidateName", m_VxPrimaryCandidateName);
+       declareProperty("RefPVContainerName", m_refPVContainerName  = "RefittedPrimaryVertices");
+       declareProperty("JpsiMassLowerCut", m_jpsiMassLower);
+       declareProperty("JpsiMassUpperCut", m_jpsiMassUpper);
+       declareProperty("V0MassLowerCut", m_V0MassLower);
+       declareProperty("V0MassUpperCut", m_V0MassUpper);
+       declareProperty("MassLowerCut", m_MassLower);
+       declareProperty("MassUpperCut", m_MassUpper);
+       declareProperty("HypothesisName",            m_hypoName               = "Bd");
+       declareProperty("V0Hypothesis",              m_v0_pid);
+       declareProperty("ApplyV0MassConstraint",     m_constrV0);
+       declareProperty("ApplyJpsiMassConstraint",   m_constrJpsi);
+       declareProperty("RefitPV",                   m_refitPV                = true);
+       declareProperty("MaxnPV",                    m_PV_max                 = 999);
+       declareProperty("MinNTracksInPV",            m_PV_minNTracks          = 0);
+       declareProperty("DoVertexType",              m_DoVertexType           = 7);
+       declareProperty("TrkVertexFitterTool",       m_iVertexFitter);
+       declareProperty("PVRefitter",                m_pvRefitter);
+       declareProperty("V0Tools",                   m_V0Tools);
+       declareProperty("CascadeTools",              m_CascadeTools);
+       declareProperty("CascadeVertexCollections",  m_cascadeOutputsKeys);
+    }
+
+    JpsiPlusV0Cascade::~JpsiPlusV0Cascade(){ }
+
+    StatusCode JpsiPlusV0Cascade::performSearch(std::vector<Trk::VxCascadeInfo*> *cascadeinfoContainer) const
+    {
+        ATH_MSG_DEBUG( "JpsiPlusV0Cascade::performSearch" );
+        assert(cascadeinfoContainer!=nullptr);
+
+        // Get TrackParticle container (for setting links to the original tracks)
+        const xAOD::TrackParticleContainer  *trackContainer(nullptr);
+        CHECK(evtStore()->retrieve(trackContainer   , "InDetTrackParticles"      ));
+
+        // Get Jpsi container
+        const xAOD::VertexContainer  *jpsiContainer(nullptr);
+        CHECK(evtStore()->retrieve(jpsiContainer   , m_vertexContainerKey       ));
+
+        // Get V0 container
+        const xAOD::VertexContainer  *v0Container(nullptr);
+        CHECK(evtStore()->retrieve(v0Container   , m_vertexV0ContainerKey       ));
+
+        double mass_v0 = m_mass_ks; 
+        std::vector<const xAOD::TrackParticle*> tracksJpsi;
+        std::vector<const xAOD::TrackParticle*> tracksV0;
+        std::vector<double> massesJpsi(2, m_mass_muon);
+        std::vector<double> massesV0;
+        std::vector<double> Masses(2, m_mass_muon);
+        if (m_v0_pid == 310) {
+           massesV0.push_back(m_mass_pion);
+           massesV0.push_back(m_mass_pion);
+           Masses.push_back(m_mass_ks);
+        } else if (m_v0_pid == 3122) {
+           massesV0.push_back(m_mass_proton);
+           massesV0.push_back(m_mass_pion);
+           mass_v0 = m_mass_lambda;
+           Masses.push_back(m_mass_lambda);
+        } else if (m_v0_pid == -3122) {
+           massesV0.push_back(m_mass_pion);
+           massesV0.push_back(m_mass_proton);
+           mass_v0 = m_mass_lambda;
+           Masses.push_back(m_mass_lambda);
+        }
+
+        for(auto jpsi : *jpsiContainer) { //Iterate over Jpsi vertices
+
+           size_t jpsiTrkNum = jpsi->nTrackParticles();
+           tracksJpsi.clear();
+           for( unsigned int it=0; it<jpsiTrkNum; it++) tracksJpsi.push_back(jpsi->trackParticle(it));
+
+           if (tracksJpsi.size() != 2 || massesJpsi.size() != 2 ) {
+             ATH_MSG_INFO("problems with Jpsi input");
+           }
+           double mass_Jpsi = m_V0Tools->invariantMass(jpsi,massesJpsi);
+           ATH_MSG_DEBUG("Jpsi mass " << mass_Jpsi);
+           if (mass_Jpsi < m_jpsiMassLower || mass_Jpsi > m_jpsiMassUpper) {
+             ATH_MSG_DEBUG(" Original Jpsi candidate rejected by the mass cut: mass = "
+                           << mass_Jpsi << " != (" << m_jpsiMassLower << ", " << m_jpsiMassUpper << ")" );
+             continue;
+           }
+
+           for(auto v0 : *v0Container) { //Iterate over V0 vertices
+
+              size_t v0TrkNum = v0->nTrackParticles();
+              tracksV0.clear();
+              for( unsigned int it=0; it<v0TrkNum; it++) tracksV0.push_back(v0->trackParticle(it));
+              if (tracksV0.size() != 2 || massesV0.size() != 2 ) {
+                ATH_MSG_INFO("problems with V0 input");
+              }
+              double mass_V0 = m_V0Tools->invariantMass(v0,massesV0);
+              ATH_MSG_DEBUG("V0 mass " << mass_V0);
+              if (mass_V0 < m_V0MassLower || mass_V0 > m_V0MassUpper) {
+                 ATH_MSG_DEBUG(" Original V0 candidate rejected by the mass cut: mass = "
+                               << mass_V0 << " != (" << m_V0MassLower << ", " << m_V0MassUpper << ")" );
+                continue;
+              }
+              ATH_MSG_DEBUG("using tracks" << tracksJpsi[0] << ", " << tracksJpsi[1] << ", " << tracksV0[0] << ", " << tracksV0[1]);
+              if(!BPhysPVCascadeTools::uniqueCollection(tracksJpsi, tracksV0)) continue;
+
+
+              //if (std::find(trackContainer->begin(), trackContainer->end(), tracksJpsi[0]) == trackContainer->end()) {
+              //   ATH_MSG_ERROR("Track is not in standard container");
+              //} else {
+              //   ATH_MSG_DEBUG("Track " << tracksJpsi[0] << " is at position " << std::distance(trackContainer->begin(), std::find(trackContainer->begin(), trackContainer->end(), tracksJpsi[0])) );
+              //}
+              //ATH_MSG_DEBUG("using tracks " << tracksJpsi[0] << ", " << tracksJpsi[1] << ", " << tracksV0[0] << ", " << tracksV0[1]);
+
+              // Apply the user's settings to the fitter
+              // Reset
+              std::unique_ptr<Trk::IVKalState> state = m_iVertexFitter->makeState();
+              // Robustness
+              int robustness = 0;
+              m_iVertexFitter->setRobustness(robustness, *state);
+              // Build up the topology
+              // Vertex list
+              std::vector<Trk::VertexID> vrtList;
+              // V0 vertex
+              Trk::VertexID vID;
+              if (m_constrV0) {
+                vID = m_iVertexFitter->startVertex(tracksV0,massesV0,*state, mass_v0);
+              } else {
+                vID = m_iVertexFitter->startVertex(tracksV0,massesV0, *state);
+              }
+              vrtList.push_back(vID);
+              // B vertex including Jpsi
+              Trk::VertexID vID2 = m_iVertexFitter->nextVertex(tracksJpsi,massesJpsi,vrtList, *state);
+              if (m_constrJpsi) {
+                std::vector<Trk::VertexID> cnstV;
+                cnstV.clear();
+                if ( !m_iVertexFitter->addMassConstraint(vID2,tracksJpsi,cnstV,*state, m_mass_jpsi).isSuccess() ) {
+                  ATH_MSG_WARNING("addMassConstraint failed");
+                  //return StatusCode::FAILURE;
+                }
+              }
+              // Do the work
+              std::unique_ptr<Trk::VxCascadeInfo> result(m_iVertexFitter->fitCascade(*state));
+
+              if (result != NULL) {
+                // reset links to original tracks
+                BPhysPVCascadeTools::PrepareVertexLinks(result.get(), trackContainer);
+
+                ATH_MSG_DEBUG("storing tracks " << ((result->vertices())[0])->trackParticle(0) << ", "
+                                                << ((result->vertices())[0])->trackParticle(1) << ", "
+                                                << ((result->vertices())[1])->trackParticle(0) << ", "
+                                                << ((result->vertices())[1])->trackParticle(1));
+
+                // necessary to prevent memory leak
+                result->setSVOwnership(true);
+                const std::vector< std::vector<TLorentzVector> > &moms = result->getParticleMoms();
+                if(moms.size() < 2){
+                    ATH_MSG_FATAL("Incorrect size " << __FILE__ << __LINE__ );
+                    return StatusCode::FAILURE;
+                }
+                double mass = m_CascadeTools->invariantMass(moms[1]);
+                if (mass >= m_MassLower && mass <= m_MassUpper) {
+
+                  cascadeinfoContainer->push_back(result.release());
+                } else {
+                  ATH_MSG_DEBUG("Candidate rejected by the mass cut: mass = "
+                                << mass << " != (" << m_MassLower << ", " << m_MassUpper << ")" );
+                }
+              }
+
+           } //Iterate over V0 vertices
+
+        } //Iterate over Jpsi vertices
+
+        ATH_MSG_DEBUG("cascadeinfoContainer size " << cascadeinfoContainer->size());
+
+        return StatusCode::SUCCESS;
+    }
+
+}
+
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/MuonExtrapolationTool.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/MuonExtrapolationTool.cxx
new file mode 100644
index 000000000000..4a55beb9601e
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/MuonExtrapolationTool.cxx
@@ -0,0 +1,182 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+// MuonExtrapolationTool.cxx
+#include "DerivationFrameworkBPhys/MuonExtrapolationTool.h"
+#include "xAODTruth/TruthParticleContainer.h"
+#include "xAODEventInfo/EventInfo.h"
+#include "TrkSurfaces/DiscSurface.h"
+#include "TrkSurfaces/CylinderSurface.h"
+#include "TrkExInterfaces/IExtrapolator.h"
+#include "TVector2.h"
+#include "xAODMuon/MuonContainer.h"
+//**********************************************************************
+
+namespace DerivationFramework {
+
+MuonExtrapolationTool::MuonExtrapolationTool(const std::string &t, const std::string& n, const IInterface* p)
+  : 
+    AthAlgTool(t, n, p),
+    m_extrapolator("Trk::Extrapolator/AtlasExtrapolator")
+{    
+  declareInterface<DerivationFramework::IAugmentationTool>(this);
+  declareProperty("EndcapPivotPlaneZ",             m_endcapPivotPlaneZ = 15525.);// z position of pivot plane in endcap region
+  declareProperty("EndcapPivotPlaneMinimumRadius", m_endcapPivotPlaneMinimumRadius = 0.);// minimum radius of pivot plane in endcap region
+  declareProperty("EndcapPivotPlaneMaximumRadius", m_endcapPivotPlaneMaximumRadius = 11977.); // maximum radius of pivot plane in endcap region
+  declareProperty("BarrelPivotPlaneRadius",        m_barrelPivotPlaneRadius = 8000.);// radius of pivot plane in barrel region
+  declareProperty("BarrelPivotPlaneHalfLength",    m_barrelPivotPlaneHalfLength = 9700.);// half length of pivot plane in barrel region
+  declareProperty("Extrapolator", m_extrapolator);
+  declareProperty("MuonCollection", m_muonContainerName = "Muons");
+}
+
+//**********************************************************************
+
+
+StatusCode MuonExtrapolationTool::initialize()
+{
+  ATH_CHECK(m_extrapolator.retrieve());
+  return StatusCode::SUCCESS;
+}
+
+
+//**********************************************************************
+
+bool MuonExtrapolationTool::extrapolateAndDecorateTrackParticle(const xAOD::TrackParticle* particle, float & eta, float & phi) const
+{
+
+  // decorators used to access or store the information 
+  static SG::AuxElement::Decorator< char > Decorated ("DecoratedPivotEtaPhi");
+  static SG::AuxElement::Decorator< float > Eta ("EtaTriggerPivot");
+  static SG::AuxElement::Decorator< float > Phi ("PhiTriggerPivot");
+
+  if (! Decorated.isAvailable(*particle) || !Decorated(*particle)){
+    // in the athena release, we can run the extrapolation if needed
+      const Trk::TrackParameters* pTag = extrapolateToTriggerPivotPlane(*particle);
+      if(!pTag) {
+        Decorated(*particle) = false;
+        return false;
+      }
+      Eta(*particle) = pTag->position().eta();
+      Phi(*particle) = pTag->position().phi();
+      Decorated(*particle) = true;
+      delete pTag;
+    }
+    // if we get here, the decoration was either already present or just added by us
+    // so we can finally read the values
+    eta = Eta(*particle);
+    phi = Phi(*particle);
+    return true;
+}
+
+//**********************************************************************
+
+const xAOD::TrackParticle* MuonExtrapolationTool::getPreferredTrackParticle (const xAOD::IParticle* muon) const
+{
+  if (dynamic_cast<const xAOD::TruthParticle*>(muon)){
+    ATH_MSG_WARNING("Pivot plane extrapolation not supported for Truth muons!");
+    return 0;
+  }
+  const xAOD::TrackParticle* muonTrack = dynamic_cast<const xAOD::TrackParticle*>(muon);
+  if(!muonTrack && dynamic_cast<const xAOD::Muon*>(muon)) {
+    const xAOD::Muon* theMuon = dynamic_cast<const xAOD::Muon*>(muon);
+    muonTrack = theMuon->trackParticle( xAOD::Muon::MuonSpectrometerTrackParticle );
+    if(!muonTrack) {
+      muonTrack = theMuon->primaryTrackParticle();
+      if(!muonTrack) {
+       muonTrack = theMuon->trackParticle( xAOD::Muon::InnerDetectorTrackParticle );
+      }
+    }
+  }
+  if(!muonTrack){
+    ATH_MSG_WARNING("no valid track found for extrapolating the muon to the pivot plane!");
+  }
+  return muonTrack;
+
+}
+
+StatusCode MuonExtrapolationTool::addBranches() const
+{
+    const xAOD::MuonContainer* muons = NULL;
+    CHECK(evtStore()->retrieve(muons, m_muonContainerName));
+    for(auto muon : *muons){
+       const xAOD::TrackParticle* track = getPreferredTrackParticle(muon);
+       float eta, phi = 0;
+       if( !extrapolateAndDecorateTrackParticle( track, eta, phi )){
+           if( muon->pt() > 3500.){
+             //only complain if the muon has sufficient pT to actually reach the pivot plane
+             //extrapolation will often fail for muons with pT < 3500 MeV
+             ATH_MSG_WARNING("Failed to extrapolate+decorate muon with pivot plane coords - Muon params: pt "<<muon->pt()<<", eta "<< muon->eta()<<", phi "<< muon->phi());
+           }
+        }   
+    }
+    return StatusCode::SUCCESS;
+}
+
+const Trk::TrackParameters* MuonExtrapolationTool::extrapolateToTriggerPivotPlane(const xAOD::TrackParticle& track) const
+{
+  // BARREL
+  const Trk::Perigee& perigee = track.perigeeParameters();
+  
+  // create the barrel as a cylinder surface centered at 0,0,0
+  Amg::Vector3D barrelCentre(0., 0., 0.);
+  Amg::Transform3D* matrix = new Amg::Transform3D(Amg::RotationMatrix3D::Identity(), barrelCentre);
+  
+  Trk::CylinderSurface* cylinder = 
+    new Trk::CylinderSurface(matrix,
+			     m_barrelPivotPlaneRadius,
+			     m_barrelPivotPlaneHalfLength);
+  if (!cylinder) {
+    ATH_MSG_WARNING("extrapolateToTriggerPivotPlane :: new Trk::CylinderSurface failed.");
+    delete matrix;
+    matrix = 0;
+    return 0;
+  }
+  // and then attempt to extrapolate our track to this surface, checking for the boundaries of the barrel
+  bool boundaryCheck = true;
+  const Trk::Surface* surface = cylinder;
+  const Trk::TrackParameters* p = m_extrapolator->extrapolate(perigee,
+							      *surface,
+							      Trk::alongMomentum,
+							      boundaryCheck,
+							      Trk::muon);
+  delete cylinder;
+  // if the extrapolation worked out (so we are in the barrel) we are done and can return the 
+  // track parameters at this surface. 
+  if (p) return p;
+
+  // if we get here, the muon did not cross the barrel surface
+  // so we assume it is going into the endcap. 
+  // ENDCAP
+
+  // After 2 years of using this code, we realised that ATLAS actually has endcaps on both sides ;-)
+  // So better make sure we place our endcap at the correct side of the detector!  
+  // Hopefully no-one will ever read this comment... 
+  float SignOfEta = track.eta() > 0 ? 1. : -1.;
+
+  Amg::Vector3D endcapCentre(0., 0., m_endcapPivotPlaneZ);
+  // much better!
+  matrix = new Amg::Transform3D(Amg::RotationMatrix3D::Identity(), SignOfEta * endcapCentre);
+  
+  Trk::DiscSurface* disc = 
+    new Trk::DiscSurface(matrix,
+			 m_endcapPivotPlaneMinimumRadius,
+			 m_endcapPivotPlaneMaximumRadius);
+  if (!disc) {
+    ATH_MSG_WARNING("extrapolateToTriggerPivotPlane :: new Trk::DiscSurface failed."); 
+    delete matrix; 
+    matrix = 0; 
+    return 0;
+  }
+  
+  // for the endcap, we turn off the boundary check, extending the EC infinitely to catch stuff heading for the transition region
+  boundaryCheck = false;
+  surface = disc;
+  p = m_extrapolator->extrapolate(perigee,
+				  *surface,
+				  Trk::alongMomentum,
+				  boundaryCheck,
+				  Trk::muon);
+  delete disc; 
+  return p;
+}
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/ReVertex.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/ReVertex.cxx
new file mode 100644
index 000000000000..9ca252404125
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/ReVertex.cxx
@@ -0,0 +1,284 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+// ****************************************************************************
+// ----------------------------------------------------------------------------
+// ReVertex
+//
+// Konstantin Beloborodov <Konstantin.Beloborodov@cern.ch>
+//
+// ----------------------------------------------------------------------------
+// ****************************************************************************
+#include "DerivationFrameworkBPhys/ReVertex.h"
+#include "xAODTracking/VertexContainer.h"
+#include "xAODTracking/VertexAuxContainer.h"
+#include "JpsiUpsilonTools/PrimaryVertexRefitter.h"
+#include "JpsiUpsilonTools/JpsiUpsilonCommon.h"
+
+#include "TrkVertexAnalysisUtils/V0Tools.h"
+#include "BeamSpotConditionsData/BeamSpotData.h"
+#include "DerivationFrameworkBPhys/BPhysPVTools.h"
+#include "TrkVertexFitterInterfaces/IVertexFitter.h"
+#include "TrkVKalVrtFitter/TrkVKalVrtFitter.h"
+#include "InDetConversionFinderTools/VertexPointEstimator.h"
+#include "xAODBPhys/BPhysHypoHelper.h"
+
+using namespace DerivationFramework;
+
+ReVertex::ReVertex(const std::string& t,
+                   const std::string& n,
+                   const IInterface* p) :
+    AthAlgTool(t,n,p), m_vertexEstimator("InDet::VertexPointEstimator"), m_iVertexFitter("Trk::TrkVKalVrtFitter"),
+    m_massConst(0.),
+    m_totalMassConst(0.),
+    m_v0Tools("Trk::V0Tools"),
+    m_pvRefitter("Analysis::PrimaryVertexRefitter"),
+    m_doMassConst(false),
+    m_vertexFittingWithPV(false),
+    m_chi2cut(-1.0),
+    m_trkDeltaZ(-1.0),
+    m_useAdditionalTrack(false)
+{
+
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+    declareProperty("TrackIndices", m_TrackIndices);
+    declareProperty("TrkVertexFitterTool", m_iVertexFitter);
+    declareProperty("VertexPointEstimator",m_vertexEstimator);
+
+    declareProperty("OutputVtxContainerName", m_OutputContainerName);
+    declareProperty("InputVtxContainerName", m_inputContainerName);
+    declareProperty("TrackContainerName", m_trackContainer = "InDetTrackParticles");
+    declareProperty("UseVertexFittingWithPV", m_vertexFittingWithPV);
+
+    declareProperty("HypothesisNames",m_hypoNames);
+   
+    declareProperty("V0Tools"               , m_v0Tools);
+    declareProperty("PVRefitter"            , m_pvRefitter);
+    declareProperty("PVContainerName"       , m_pvContainerName        = "PrimaryVertices");
+    declareProperty("RefPVContainerName"    , m_refPVContainerName     = "RefittedPrimaryVertices");
+
+    declareProperty("UseMassConstraint", m_doMassConst);
+    declareProperty("VertexMass", m_totalMassConst);
+    declareProperty("SubVertexMass", m_massConst);
+    declareProperty("MassInputParticles", m_trkMasses);
+    declareProperty("SubVertexTrackIndices", m_indices);
+   
+    declareProperty("UseAdditionalTrack", m_useAdditionalTrack);
+
+    declareProperty("RefitPV"               , m_refitPV                = false);
+    //This parameter will allow us to optimize the number of PVs under consideration as the probability
+    //of a useful primary vertex drops significantly the higher you go
+    declareProperty("MaxPVrefit"            , m_PV_max                = 1000);
+    declareProperty("DoVertexType"          , m_DoVertexType           = 7);
+    // minimum number of tracks for PV to be considered for PV association
+    declareProperty("MinNTracksInPV"        , m_PV_minNTracks          = 0);
+    declareProperty("Do3d"        , m_do3d          = false);
+    declareProperty("AddPVData"        , m_AddPVData          = true);
+    declareProperty("StartingPoint0"        , m_startingpoint0     = false);
+    declareProperty("BMassUpper",m_BMassUpper = std::numeric_limits<double>::max() );
+    declareProperty("BMassLower",m_BMassLower = std::numeric_limits<double>::min() );
+    declareProperty("Chi2Cut",m_chi2cut = std::numeric_limits<double>::max() );
+    declareProperty("TrkDeltaZ",m_trkDeltaZ);
+    
+    
+}
+
+StatusCode ReVertex::initialize() {
+    ATH_MSG_DEBUG("in initialize()");
+    if(m_TrackIndices.empty()) {
+        ATH_MSG_FATAL("No Indices provided");
+        return StatusCode::FAILURE;
+    }
+    m_VKVFitter = dynamic_cast<Trk::TrkVKalVrtFitter*>(&(*m_iVertexFitter));
+    if(m_VKVFitter==nullptr) return StatusCode::FAILURE;
+    ATH_CHECK(m_OutputContainerName.initialize());
+    ATH_CHECK(m_inputContainerName.initialize());
+    ATH_CHECK(m_trackContainer.initialize());
+    ATH_CHECK(m_pvContainerName.initialize());
+    ATH_CHECK(m_refPVContainerName.initialize());
+
+    return StatusCode::SUCCESS;
+}
+
+
+StatusCode ReVertex::addBranches() const {
+
+    SG::WriteHandle<xAOD::VertexContainer> vtxContainer(m_OutputContainerName);
+    ATH_CHECK(vtxContainer.record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()));
+
+    const size_t Ntracks = m_TrackIndices.size();
+
+    SG::ReadHandle<xAOD::VertexContainer> InVtxContainer(m_inputContainerName);
+    SG::ReadHandle<xAOD::TrackParticleContainer> importedTrackCollection(m_trackContainer);
+    ATH_CHECK(InVtxContainer.isValid());
+    ATH_CHECK(importedTrackCollection.isValid());
+    //----------------------------------------------------
+    // retrieve primary vertices
+    //----------------------------------------------------
+    SG::ReadHandle<xAOD::VertexContainer> pvContainer(m_pvContainerName);
+    ATH_CHECK(pvContainer.isValid());
+
+    std::vector<const xAOD::TrackParticle*> fitpair(Ntracks + m_useAdditionalTrack);
+    for(const xAOD::Vertex* v : *InVtxContainer)
+    {
+
+      bool passed = false;
+      for(size_t i=0;i<m_hypoNames.size();i++) {
+	 xAOD::BPhysHypoHelper onia(m_hypoNames.at(i), v);
+	 passed |= onia.pass();
+      }
+      if (!passed && m_hypoNames.size()) continue;
+       
+        for(size_t i =0; i<Ntracks; i++)
+        {
+            size_t trackN = m_TrackIndices[i];
+            if(trackN >= v->nTrackParticles())
+            {
+                ATH_MSG_FATAL("Indices exceeds limit in particle");
+                return StatusCode::FAILURE;
+            }
+            fitpair[i] = v->trackParticle(trackN);
+        }
+
+       if (m_useAdditionalTrack) 
+       {
+	  // Loop over ID tracks, call vertexing
+	  for (auto trkItr=importedTrackCollection->cbegin(); trkItr!=importedTrackCollection->cend(); ++trkItr) {
+	     const xAOD::TrackParticle* tp (*trkItr);
+	     fitpair.back() = nullptr;
+	     if (Analysis::JpsiUpsilonCommon::isContainedIn(tp,fitpair)) continue; // remove tracks which were used to build J/psi+2Tracks
+	     fitpair.back() = tp;
+
+	      // Daniel Scheirich: remove track too far from the Jpsi+2Tracks vertex (DeltaZ cut)
+	      if(m_trkDeltaZ>0 &&
+		 std::abs((tp)->z0() + (tp)->vz() - v->z()) > m_trkDeltaZ )
+	       continue;
+	     
+	     fitAndStore(vtxContainer.ptr(),v,InVtxContainer.cptr(),fitpair,importedTrackCollection.cptr(),pvContainer.cptr());
+	  }
+       }
+       else 
+       {
+	  fitAndStore(vtxContainer.ptr(),v,InVtxContainer.cptr(),fitpair,importedTrackCollection.cptr(),pvContainer.cptr());
+       }
+    }
+
+    if(m_AddPVData){
+     // Give the helper class the ptr to v0tools and beamSpotsSvc to use
+     SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey };
+     if(not beamSpotHandle.isValid()) ATH_MSG_ERROR("Cannot Retrieve " << m_beamSpotKey.key() );
+     BPhysPVTools helper(&(*m_v0Tools), beamSpotHandle.cptr());
+     helper.SetMinNTracksInPV(m_PV_minNTracks);
+     helper.SetSave3d(m_do3d);
+
+    if(m_refitPV) {
+        //----------------------------------------------------
+        // Try to retrieve refitted primary vertices
+        //----------------------------------------------------
+        SG::WriteHandle<xAOD::VertexContainer> refPvContainer(m_refPVContainerName);
+        ATH_CHECK(refPvContainer.record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()));
+
+        if(vtxContainer->size() >0){
+          ATH_CHECK(helper.FillCandwithRefittedVertices(vtxContainer.ptr(), pvContainer.cptr(), refPvContainer.ptr(), &(*m_pvRefitter) ,  m_PV_max, m_DoVertexType));
+        }
+     }else{
+         if(vtxContainer->size() >0) ATH_CHECK(helper.FillCandExistingVertices(vtxContainer.ptr(), pvContainer.cptr(), m_DoVertexType));
+     }
+    }
+
+    return StatusCode::SUCCESS;
+}
+
+void ReVertex::fitAndStore(xAOD::VertexContainer* vtxContainer,
+				    const xAOD::Vertex* v,
+				    const xAOD::VertexContainer    *InVtxContainer,
+				    const std::vector<const xAOD::TrackParticle*> &inputTracks,
+				    const xAOD::TrackParticleContainer* importedTrackCollection,
+				    const xAOD::VertexContainer* pvContainer) const
+{
+   std::unique_ptr<xAOD::Vertex> ptr(fit(inputTracks, nullptr));
+   if(!ptr)return;
+
+   double chi2DOF = ptr->chiSquared()/ptr->numberDoF();
+   ATH_MSG_DEBUG("Candidate chi2/DOF is " << chi2DOF);
+   bool chi2CutPassed = (m_chi2cut <= 0.0 || chi2DOF < m_chi2cut);
+   if(!chi2CutPassed) { ATH_MSG_DEBUG("Chi Cut failed!");  return; }
+   xAOD::BPhysHelper bHelper(ptr.get());//"get" does not "release" still automatically deleted
+   bHelper.setRefTrks();
+   if (m_trkMasses.size()==inputTracks.size()) {
+      TLorentzVector bMomentum = bHelper.totalP(m_trkMasses);
+      double bMass = bMomentum.M();
+      bool passesCuts = (m_BMassUpper > bMass && bMass > m_BMassLower);
+      if(!passesCuts)return;
+   }
+	  
+   DerivationFramework::BPhysPVTools::PrepareVertexLinks( ptr.get(), importedTrackCollection );
+   std::vector<const xAOD::Vertex*> thePreceding;
+   thePreceding.push_back(v);
+   if(m_vertexFittingWithPV){
+      const xAOD::Vertex* closestPV = Analysis::JpsiUpsilonCommon::ClosestPV(bHelper, pvContainer);
+      if (!closestPV) return;
+      std::unique_ptr<xAOD::Vertex> ptrPV(fit(inputTracks, closestPV));
+      if(!ptrPV) return;
+
+      double chi2DOFPV = ptrPV->chiSquared()/ptrPV->numberDoF();
+      ATH_MSG_DEBUG("CandidatePV chi2/DOF is " << chi2DOFPV);
+      bool chi2CutPassed = (m_chi2cut <= 0.0 || chi2DOFPV < m_chi2cut);
+      if(!chi2CutPassed) { ATH_MSG_DEBUG("Chi Cut failed!");  return; }
+      xAOD::BPhysHelper bHelperPV(ptrPV.get());//"get" does not "release" still automatically deleted
+      bHelperPV.setRefTrks();
+      if (m_trkMasses.size()==inputTracks.size()) {
+	 TLorentzVector bMomentumPV = bHelperPV.totalP(m_trkMasses);
+	 double bMass = bMomentumPV.M();
+	 bool passesCuts = (m_BMassUpper > bMass && bMass > m_BMassLower);
+	 if(!passesCuts)return;
+      }
+      
+      bHelperPV.setPrecedingVertices(thePreceding, InVtxContainer);
+      vtxContainer->push_back(ptrPV.release());
+      return; //Don't store other vertex
+   }
+   bHelper.setPrecedingVertices(thePreceding, InVtxContainer);
+   vtxContainer->push_back(ptr.release());
+}
+
+    // *********************************************************************************
+    
+    // ---------------------------------------------------------------------------------
+    // fit - does the fit
+    // ---------------------------------------------------------------------------------
+    
+xAOD::Vertex* ReVertex::fit(const std::vector<const xAOD::TrackParticle*> &inputTracks,
+				     const xAOD::Vertex* pv) const
+{
+   std::unique_ptr<Trk::IVKalState> state = m_VKVFitter->makeState();
+   if (m_doMassConst && (m_trkMasses.size()==inputTracks.size())) {
+      m_VKVFitter->setMassInputParticles(m_trkMasses, *state);
+      if (m_totalMassConst) m_VKVFitter->setMassForConstraint(m_totalMassConst, *state);
+      if (m_massConst) m_VKVFitter->setMassForConstraint(m_massConst, m_indices, *state);
+   }
+   if (pv) {
+      m_VKVFitter->setCnstType(8, *state);
+      m_VKVFitter->setVertexForConstraint(pv->position().x(),
+					  pv->position().y(),
+					  pv->position().z(), *state);
+      m_VKVFitter->setCovVrtForConstraint(pv->covariancePosition()(Trk::x,Trk::x),
+					  pv->covariancePosition()(Trk::y,Trk::x),
+					  pv->covariancePosition()(Trk::y,Trk::y),
+					  pv->covariancePosition()(Trk::z,Trk::x),
+					  pv->covariancePosition()(Trk::z,Trk::y),
+					  pv->covariancePosition()(Trk::z,Trk::z), *state );
+   }
+
+   // Do the fit itself.......
+   // Starting point (use the J/psi position)
+   const Trk::Perigee& aPerigee1 = inputTracks[0]->perigeeParameters();
+   const Trk::Perigee& aPerigee2 = inputTracks[1]->perigeeParameters();
+   int sflag = 0;
+   int errorcode = 0;
+   Amg::Vector3D startingPoint = m_vertexEstimator->getCirclesIntersectionPoint(&aPerigee1,&aPerigee2,sflag,errorcode);
+   if (errorcode != 0) {startingPoint(0) = 0.0; startingPoint(1) = 0.0; startingPoint(2) = 0.0;}
+   xAOD::Vertex* theResult = m_VKVFitter->fit(inputTracks, startingPoint, *state);
+
+   return theResult;
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Reco_4mu.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Reco_4mu.cxx
new file mode 100644
index 000000000000..4d4a7c80258d
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Reco_4mu.cxx
@@ -0,0 +1,269 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/////////////////////////////////////////////////////////////////
+// Reco_4mu.cxx
+///////////////////////////////////////////////////////////////////
+// Author: James Catmore <james.catmore@cern.ch>
+
+#include "DerivationFrameworkBPhys/Reco_4mu.h"
+#include "xAODTracking/VertexContainer.h"
+#include "xAODTracking/VertexAuxContainer.h"
+#include "TrkVertexAnalysisUtils/V0Tools.h"
+#include "DerivationFrameworkBPhys/BPhysPVTools.h"
+#include "xAODBPhys/BPhysHypoHelper.h"
+
+namespace DerivationFramework {
+    
+    Reco_4mu::Reco_4mu(const std::string& t,
+                       const std::string& n,
+                       const IInterface* p) :
+    AthAlgTool(t,n,p),
+    m_v0Tools("Trk::V0Tools"),
+    m_fourMuonTool("DerivationFramework::FourMuonTool"),
+    m_pvRefitter("Analysis::PrimaryVertexRefitter")
+    {
+        declareInterface<DerivationFramework::ISkimmingTool>(this);
+        
+        // Declare tools
+        declareProperty("V0Tools"   , m_v0Tools);
+        declareProperty("FourMuonTool", m_fourMuonTool);
+        declareProperty("PVRefitter", m_pvRefitter);
+        
+        // Declare user-defined properties
+        declareProperty("PairContainerName"      , m_pairName           = "Pairs");
+        declareProperty("QuadrupletContainerName", m_quadName           = "Quadruplets");
+        declareProperty("PVContainerName"        , m_pvContainerName    = "PrimaryVertices");
+        declareProperty("RefPVContainerName"    , m_refPVContainerName = "RefittedPrimaryVertices");
+        declareProperty("RefitPV"                , m_refitPV            = false);
+        declareProperty("MaxPVrefit"             , m_PV_max             = 1);
+        declareProperty("DoVertexType"           , m_DoVertexType       = 1);
+    }
+    
+    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+    
+    StatusCode Reco_4mu::initialize()
+    {
+        
+        ATH_MSG_DEBUG("in initialize()");
+        
+        // retrieve V0 tools
+        CHECK( m_v0Tools.retrieve() );
+        
+        // get the JpsiFinder tool
+        CHECK( m_fourMuonTool.retrieve() );
+        
+        // get the PrimaryVertexRefitter tool
+        CHECK( m_pvRefitter.retrieve() );
+        
+        return StatusCode::SUCCESS;
+        
+    }
+    
+    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+    
+    StatusCode Reco_4mu::finalize()
+    {
+        // everything all right
+        return StatusCode::SUCCESS;
+    }
+    
+    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+    
+    bool Reco_4mu::eventPassesFilter() const
+    {
+        // Output containers and its auxilliary store
+        xAOD::VertexContainer*    pairContainer = NULL;
+        xAOD::VertexAuxContainer* pairAuxContainer = NULL;
+        xAOD::VertexContainer*    quadContainer = NULL;
+        xAOD::VertexAuxContainer* quadAuxContainer = NULL;
+        bool acceptEvent(false); 
+        //----------------------------------------------------
+        // call  finder
+        //----------------------------------------------------
+        if( !m_fourMuonTool->performSearch(pairContainer, pairAuxContainer, quadContainer, quadAuxContainer, acceptEvent).isSuccess() ) {
+            ATH_MSG_FATAL("4mu tool (" << m_fourMuonTool << ") failed.");
+            return(false);
+        }
+        
+        //----------------------------------------------------
+        // event selection
+        //----------------------------------------------------
+        /*if (quadContainer->size()==0) {
+            if (pairContainer!=NULL) delete pairContainer;
+            if (pairAuxContainer!=NULL) delete pairAuxContainer;
+            if (quadContainer!=NULL) delete quadContainer;
+            if (quadAuxContainer!=NULL) delete quadAuxContainer;
+            return(acceptEvent); 
+	    // acceptEvent based on muon selection only, not quads
+        }*/
+        
+        //----------------------------------------------------
+        // retrieve primary vertices
+        //----------------------------------------------------
+        const xAOD::VertexContainer*    pvContainer = NULL;
+        auto sc = evtStore()->retrieve(pvContainer, m_pvContainerName);
+        if(sc.isFailure()){
+            ATH_MSG_FATAL("Cannot find PV Container");
+            return false;
+        }
+        //----------------------------------------------------
+        // Refit primary vertices
+        //----------------------------------------------------
+        xAOD::VertexContainer*    refPvContainer = NULL;
+        xAOD::VertexAuxContainer* refPvAuxContainer = NULL;
+        
+        if(m_refitPV) {
+            refPvContainer = new xAOD::VertexContainer;
+            refPvAuxContainer = new xAOD::VertexAuxContainer;
+            refPvContainer->setStore(refPvAuxContainer);
+        }
+        
+        BPhysPVTools helper(&(*m_v0Tools));//Give the helper class the ptr to v0tools to use
+        
+        if(m_refitPV){
+            if(quadContainer->size() >0){
+                StatusCode SC = helper.FillCandwithRefittedVertices(quadContainer,  pvContainer, refPvContainer, &(*m_pvRefitter) , m_PV_max, m_DoVertexType);
+                if(SC.isFailure()){
+                    ATH_MSG_FATAL("refitting failed - check the vertices you passed");
+                    return false;
+                }
+            }
+            if(pairContainer->size()>0) {
+                StatusCode SC = helper.FillCandwithRefittedVertices(pairContainer,  pvContainer, refPvContainer, &(*m_pvRefitter) , m_PV_max, m_DoVertexType);
+                if(SC.isFailure()){
+                    ATH_MSG_FATAL("refitting failed - check the vertices you passed");
+                    return false;
+                }
+            }
+        }else{
+            if(quadContainer->size() >0){
+            	auto sc = helper.FillCandExistingVertices(quadContainer, pvContainer, m_DoVertexType);
+                sc.ignore();
+            }
+            if(pairContainer->size() >0)
+            {
+            	auto sc = helper.FillCandExistingVertices(pairContainer, pvContainer, m_DoVertexType);
+                sc.ignore();
+            }
+        }
+
+        //----------------------------------------------------
+        // Mass-hypothesis dependent quantities
+        //----------------------------------------------------
+        
+        std::vector<double> muonPairMasses = std::vector<double>(2, 105.658);
+        std::vector<double> muonQuadMasses = std::vector<double>(4, 105.658);
+        
+        bool doPt   = (m_DoVertexType & 1) != 0;
+        bool doA0   = (m_DoVertexType & 2) != 0;
+        bool doZ0   = (m_DoVertexType & 4) != 0;
+        bool doZ0BA = (m_DoVertexType & 8) != 0;
+        
+        // loop over pairs
+        xAOD::VertexContainer::iterator pairItr = pairContainer->begin();
+        ATH_MSG_DEBUG("Indices/masses of pairs follows....");
+        for(; pairItr!=pairContainer->end(); ++pairItr) {
+            // create BPhysHypoHelper
+            xAOD::BPhysHypoHelper pairHelper("PAIR", *pairItr);
+            
+            //----------------------------------------------------
+            // decorate the vertex
+            //----------------------------------------------------
+            // a) invariant mass and error
+            if( !pairHelper.setMass(muonPairMasses) ) ATH_MSG_WARNING("Decoration pair.setMass failed");
+            
+            double massErr = m_v0Tools->invariantMassError(pairHelper.vtx(), muonPairMasses);
+            if( !pairHelper.setMassErr(massErr) ) ATH_MSG_WARNING("Decoration pair.setMassErr failed");
+            
+            // b) proper decay time and error:
+            // retrieve the refitted PV (or the original one, if the PV refitting was turned off)
+            if(doPt) ProcessVertex(pairHelper, xAOD::BPhysHelper::PV_MAX_SUM_PT2, muonPairMasses);
+            if(doA0) ProcessVertex(pairHelper, xAOD::BPhysHelper::PV_MIN_A0, muonPairMasses);
+            if(doZ0) ProcessVertex(pairHelper, xAOD::BPhysHelper::PV_MIN_Z0, muonPairMasses);
+            if(doZ0BA) ProcessVertex(pairHelper, xAOD::BPhysHelper::PV_MIN_Z0_BA, muonPairMasses);
+            ATH_MSG_DEBUG((*pairItr)->auxdata<std::string>("CombinationCode") << " : " << pairHelper.mass() << " +/- " << pairHelper.massErr());
+        }
+        
+        // loop over quadruplets
+        xAOD::VertexContainer::iterator quadItr = quadContainer->begin();
+        ATH_MSG_DEBUG("Indices/masses of quadruplets follows....");
+        for(; quadItr!=quadContainer->end(); ++quadItr) {
+            // create BPhysHypoHelper
+            xAOD::BPhysHypoHelper quadHelper("QUAD", *quadItr);
+            
+            //----------------------------------------------------
+            // decorate the vertex
+            //----------------------------------------------------
+            // a) invariant mass and error
+            if( !quadHelper.setMass(muonQuadMasses) ) ATH_MSG_WARNING("Decoration quad.setMass failed");
+            
+            double massErr = m_v0Tools->invariantMassError(quadHelper.vtx(), muonQuadMasses);
+            if( !quadHelper.setMassErr(massErr) ) ATH_MSG_WARNING("Decoration quad.setMassErr failed");
+            
+            // b) proper decay time and error:
+            // retrieve the refitted PV (or the original one, if the PV refitting was turned off)
+            if(doPt) ProcessVertex(quadHelper, xAOD::BPhysHelper::PV_MAX_SUM_PT2, muonQuadMasses);
+            if(doA0) ProcessVertex(quadHelper, xAOD::BPhysHelper::PV_MIN_A0, muonQuadMasses);
+            if(doZ0) ProcessVertex(quadHelper, xAOD::BPhysHelper::PV_MIN_Z0, muonQuadMasses);
+            if(doZ0BA) ProcessVertex(quadHelper, xAOD::BPhysHelper::PV_MIN_Z0_BA, muonQuadMasses);
+            ATH_MSG_DEBUG((*quadItr)->auxdata<std::string>("CombinationCode") << " : " << quadHelper.mass() << " +/- " << quadHelper.massErr());
+        }
+        
+        //----------------------------------------------------
+        // save in the StoreGate
+        //----------------------------------------------------
+        // Pairs
+        if (!evtStore()->contains<xAOD::VertexContainer>(m_pairName))
+            evtStore()->record(pairContainer, m_pairName).ignore();
+        if (!evtStore()->contains<xAOD::VertexAuxContainer>(m_pairName+"Aux."))
+            evtStore()->record(pairAuxContainer, m_pairName+"Aux.").ignore();
+        
+        // Quads
+        if (!evtStore()->contains<xAOD::VertexContainer>(m_quadName))
+            evtStore()->record(quadContainer, m_quadName).ignore();
+        if (!evtStore()->contains<xAOD::VertexAuxContainer>(m_quadName+"Aux."))
+            evtStore()->record(quadAuxContainer, m_quadName+"Aux.").ignore();
+        
+        // Refitted PVs
+        if(m_refitPV) {
+            evtStore()->record(refPvContainer   , m_refPVContainerName).ignore();
+            evtStore()->record(refPvAuxContainer, m_refPVContainerName+"Aux.").ignore();
+        }
+        
+        return(acceptEvent);
+    }
+    
+    
+    void Reco_4mu::ProcessVertex(xAOD::BPhysHypoHelper &hypoHelper, xAOD::BPhysHelper::pv_type pv_t, std::vector<double> trackMasses) const{
+        
+        const xAOD::Vertex* pv = hypoHelper.pv(pv_t);
+        if(pv) {
+            // decorate the vertex.
+            
+            BPHYS_CHECK( hypoHelper.setTau( m_v0Tools->tau(hypoHelper.vtx(), pv,  trackMasses),
+                                           pv_t,
+                                           xAOD::BPhysHypoHelper::TAU_INV_MASS) );
+            
+            BPHYS_CHECK( hypoHelper.setTauErr( m_v0Tools->tauError(hypoHelper.vtx(), pv,  trackMasses),
+                                              pv_t,
+                                              xAOD::BPhysHypoHelper::TAU_INV_MASS) );
+            
+            //enum pv_type {PV_MAX_SUM_PT2, PV_MIN_A0, PV_MIN_Z0, PV_MIN_Z0BA};
+        }else{
+            
+            const float errConst = -9999999;
+            BPHYS_CHECK( hypoHelper.setTau( errConst,
+                                           pv_t,
+                                           xAOD::BPhysHypoHelper::TAU_INV_MASS) );
+            
+            BPHYS_CHECK( hypoHelper.setTauErr( errConst,
+                                              pv_t,
+                                              xAOD::BPhysHypoHelper::TAU_INV_MASS) );
+        }
+        
+        return;
+    }
+    
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Reco_V0Finder.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Reco_V0Finder.cxx
new file mode 100644
index 000000000000..0b19d017b136
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Reco_V0Finder.cxx
@@ -0,0 +1,307 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+/////////////////////////////////////////////////////////////////
+// Reco_V0Finder.cxx, (c) ATLAS Detector software
+///////////////////////////////////////////////////////////////////
+// Author: Adam Barton
+#include "DerivationFrameworkBPhys/Reco_V0Finder.h"
+#include "xAODTracking/VertexContainer.h"
+#include "xAODTracking/VertexAuxContainer.h"
+#include "TrkVertexAnalysisUtils/V0Tools.h"
+#include "GaudiKernel/IPartPropSvc.h"
+#include "EventKernel/PdtPdg.h"
+
+namespace DerivationFramework {
+
+  Reco_V0Finder::Reco_V0Finder(const std::string& t,
+      const std::string& n,
+      const IInterface* p) : 
+    AthAlgTool(t,n,p),
+    m_v0FinderTool("InDet::V0FinderTool"),
+    m_V0Tools("Trk::V0Tools"),
+    m_particleDataTable(nullptr),
+    m_masses(1),
+    m_masspi(139.57),
+    m_massp(938.272),
+    m_masse(0.510999),
+    m_massK0S(497.672),
+    m_massLambda(1115.68),
+    m_VxPrimaryCandidateName("PrimaryVertices"),
+    m_v0ContainerName("RecoV0Candidates"),
+    m_ksContainerName("RecoKshortCandidates"),
+    m_laContainerName("RecoLambdaCandidates"),
+    m_lbContainerName("RecoLambdabarCandidates")
+  {
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+    
+    // Declare user-defined properties
+    declareProperty("CheckVertexContainers", m_CollectionsToCheck);
+    declareProperty("V0FinderTool", m_v0FinderTool);
+    declareProperty("V0Tools", m_V0Tools);
+    declareProperty("masses", m_masses);
+    declareProperty("masspi", m_masspi);
+    declareProperty("massp", m_massp);
+    declareProperty("masse", m_masse);
+    declareProperty("massK0S", m_massK0S);
+    declareProperty("massLambda", m_massLambda);
+    declareProperty("VxPrimaryCandidateName", m_VxPrimaryCandidateName);
+    declareProperty("V0ContainerName", m_v0ContainerName);
+    declareProperty("KshortContainerName", m_ksContainerName);
+    declareProperty("LambdaContainerName", m_laContainerName);
+    declareProperty("LambdabarContainerName", m_lbContainerName);
+  }
+
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
+  
+  StatusCode Reco_V0Finder::initialize()
+  {
+  
+    ATH_MSG_DEBUG("in initialize()");
+ 
+    // get the V0Finder tool
+    ATH_CHECK( m_v0FinderTool.retrieve());
+
+    // uploading the V0 tools
+    ATH_CHECK( m_V0Tools.retrieve());
+
+    // get the Particle Properties Service
+    IPartPropSvc* partPropSvc = nullptr;
+    StatusCode sc = service("PartPropSvc", partPropSvc, true);
+    if (sc.isFailure()) {
+      msg(MSG::ERROR) << "Could not initialize Particle Properties Service" << endmsg;
+      return StatusCode::FAILURE;
+    }
+    m_particleDataTable = partPropSvc->PDT();
+
+    const HepPDT::ParticleData* pd_pi = m_particleDataTable->particle(PDG::pi_plus);
+    const HepPDT::ParticleData* pd_p  = m_particleDataTable->particle(PDG::p_plus);
+    const HepPDT::ParticleData* pd_e  = m_particleDataTable->particle(PDG::e_minus);
+    const HepPDT::ParticleData* pd_K  = m_particleDataTable->particle(PDG::K_S0);
+    const HepPDT::ParticleData* pd_L  = m_particleDataTable->particle(PDG::Lambda0);
+    if (m_masses == 1) {
+     m_masspi     = pd_pi->mass();
+     m_massp      = pd_p->mass();
+     m_masse      = pd_e->mass();
+     m_massK0S    = pd_K->mass();
+     m_massLambda = pd_L->mass();
+    }
+
+
+    return StatusCode::SUCCESS;
+    
+  }
+  
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
+
+  StatusCode Reco_V0Finder::finalize()
+  {
+    // everything all right
+    return StatusCode::SUCCESS;
+  }
+
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
+  
+  StatusCode Reco_V0Finder::addBranches() const
+  {
+    bool callV0Finder = false;
+    // Jpsi container and its auxilliary store
+    for(const auto &str : m_CollectionsToCheck){
+       const xAOD::VertexContainer*    vertContainer = nullptr;
+       ATH_CHECK( evtStore()->retrieve(vertContainer, str) );
+       if(vertContainer->size() == 0) {
+          ATH_MSG_DEBUG("Container VertexContainer (" << str << ") is empty");
+       }else{
+          callV0Finder = true;
+          ATH_MSG_DEBUG("Container VertexContainer (" << str << ") has events N= " << vertContainer->size());
+          break;//No point checking other containers
+       }
+    }
+
+    // Call V0Finder
+
+
+// InDetV0 container and its auxilliary store
+    xAOD::VertexContainer*    v0Container(nullptr);
+    xAOD::VertexAuxContainer* v0AuxContainer(nullptr);
+    xAOD::VertexContainer*    ksContainer(nullptr);
+    xAOD::VertexAuxContainer* ksAuxContainer(nullptr);
+    xAOD::VertexContainer*    laContainer(nullptr);
+    xAOD::VertexAuxContainer* laAuxContainer(nullptr);
+    xAOD::VertexContainer*    lbContainer(nullptr);
+    xAOD::VertexAuxContainer* lbAuxContainer(nullptr);
+
+    if (callV0Finder) {
+
+    // Get primary vertex from StoreGate
+    const xAOD::Vertex * primaryVertex(0);
+    const xAOD::VertexContainer * importedVxContainer(0);
+    ATH_CHECK( evtStore()->retrieve(importedVxContainer, m_VxPrimaryCandidateName) );
+    ATH_MSG_DEBUG("Found " << m_VxPrimaryCandidateName << " in StoreGate!");
+    if (importedVxContainer->size()==0){
+        ATH_MSG_WARNING("You have no primary vertices: " << importedVxContainer->size());
+    } else {
+        primaryVertex = (*importedVxContainer)[0];
+    }
+
+    ATH_CHECK(m_v0FinderTool->performSearch(v0Container, v0AuxContainer, ksContainer, ksAuxContainer, laContainer, laAuxContainer, lbContainer, lbAuxContainer, primaryVertex, importedVxContainer));
+
+    ATH_MSG_DEBUG("Reco_V0Finder v0Container->size() " << v0Container->size());
+    ATH_MSG_DEBUG("Reco_V0Finder ksContainer->size() " << ksContainer->size());
+    ATH_MSG_DEBUG("Reco_V0Finder laContainer->size() " << laContainer->size());
+    ATH_MSG_DEBUG("Reco_V0Finder lbContainer->size() " << lbContainer->size());
+
+    SG::AuxElement::Decorator<float> mDecor_Ksmass("Kshort_mass");
+    SG::AuxElement::Decorator<float> mDecor_Ksmasse("Kshort_massError");
+    SG::AuxElement::Decorator<float> mDecor_Lamass("Lambda_mass");
+    SG::AuxElement::Decorator<float> mDecor_Lamasse("Lambda_massError");
+    SG::AuxElement::Decorator<float> mDecor_Lbmass("Lambdabar_mass");
+    SG::AuxElement::Decorator<float> mDecor_Lbmasse("Lambdabar_massError");
+    SG::AuxElement::Decorator<float> mDecor_mass("mass");
+    SG::AuxElement::Decorator<float> mDecor_massError("massError");
+    SG::AuxElement::Decorator<float> mDecor_pt("pT");
+    SG::AuxElement::Decorator<float> mDecor_ptError("pTError");
+    SG::AuxElement::Decorator<float> mDecor_rxy("Rxy");
+    SG::AuxElement::Decorator<float> mDecor_rxyError("RxyError");
+    SG::AuxElement::Decorator<float> mDecor_px("px");
+    SG::AuxElement::Decorator<float> mDecor_py("py");
+    SG::AuxElement::Decorator<float> mDecor_pz("pz");
+
+    xAOD::VertexContainer::const_iterator v0Itr = v0Container->begin();
+    for ( v0Itr=v0Container->begin(); v0Itr!=v0Container->end(); ++v0Itr )
+    {
+      const xAOD::Vertex * unconstrV0 = (*v0Itr);
+      double mass_ks = m_V0Tools->invariantMass(unconstrV0,m_masspi,m_masspi);
+      double mass_error_ks = m_V0Tools->invariantMassError(unconstrV0,m_masspi,m_masspi);
+      double mass_la = m_V0Tools->invariantMass(unconstrV0,m_massp,m_masspi);
+      double mass_error_la = m_V0Tools->invariantMassError(unconstrV0,m_massp,m_masspi);
+      double mass_lb = m_V0Tools->invariantMass(unconstrV0,m_masspi,m_massp);
+      double mass_error_lb = m_V0Tools->invariantMassError(unconstrV0,m_masspi,m_massp);
+      double pt = m_V0Tools->pT(unconstrV0);
+      double ptError = m_V0Tools->pTError(unconstrV0);
+      double rxy = m_V0Tools->rxy(unconstrV0);
+      double rxyError = m_V0Tools->rxyError(unconstrV0);
+      Amg::Vector3D momentum = m_V0Tools->V0Momentum(unconstrV0);
+      mDecor_Ksmass( *unconstrV0 ) = mass_ks;
+      mDecor_Ksmasse( *unconstrV0 ) = mass_error_ks;
+      mDecor_Lamass( *unconstrV0 ) = mass_la;
+      mDecor_Lamasse( *unconstrV0 ) = mass_error_la;
+      mDecor_Lbmass( *unconstrV0 ) = mass_lb;
+      mDecor_Lbmasse( *unconstrV0 ) = mass_error_lb;
+      mDecor_pt( *unconstrV0 ) = pt;
+      mDecor_ptError( *unconstrV0 ) = ptError;
+      mDecor_rxy( *unconstrV0 ) = rxy;
+      mDecor_rxyError( *unconstrV0 ) = rxyError;
+      mDecor_px( *unconstrV0 ) = momentum.x();
+      mDecor_py( *unconstrV0 ) = momentum.y();
+      mDecor_pz( *unconstrV0 ) = momentum.z();
+      ATH_MSG_DEBUG("Reco_V0Finder mass_ks " << mass_ks << " mass_la " << mass_la << " mass_lb " << mass_lb);
+    }
+    xAOD::VertexContainer::const_iterator ksItr = ksContainer->begin();
+    for ( ksItr=ksContainer->begin(); ksItr!=ksContainer->end(); ++ksItr )
+    {
+      const xAOD::Vertex * ksV0 = (*ksItr);
+      double mass_ks = m_V0Tools->invariantMass(ksV0,m_masspi,m_masspi);
+      double mass_error_ks = m_V0Tools->invariantMassError(ksV0,m_masspi,m_masspi);
+      double pt = m_V0Tools->pT(ksV0);
+      double ptError = m_V0Tools->pTError(ksV0);
+      double rxy = m_V0Tools->rxy(ksV0);
+      double rxyError = m_V0Tools->rxyError(ksV0);
+      Amg::Vector3D momentum = m_V0Tools->V0Momentum(ksV0);
+      mDecor_mass( *ksV0 ) = mass_ks;
+      mDecor_massError( *ksV0 ) = mass_error_ks;
+      mDecor_pt( *ksV0 ) = pt;
+      mDecor_ptError( *ksV0 ) = ptError;
+      mDecor_rxy( *ksV0 ) = rxy;
+      mDecor_rxyError( *ksV0 ) = rxyError;
+      mDecor_px( *ksV0 ) = momentum.x();
+      mDecor_py( *ksV0 ) = momentum.y();
+      mDecor_pz( *ksV0 ) = momentum.z();
+      ATH_MSG_DEBUG("Reco_V0Finder mass_ks " << mass_ks << " mass_error_ks " << mass_error_ks << " pt " << pt << " rxy " << rxy);
+    }
+    xAOD::VertexContainer::const_iterator laItr = laContainer->begin();
+    for ( laItr=laContainer->begin(); laItr!=laContainer->end(); ++laItr )
+    {
+      const xAOD::Vertex * laV0 = (*laItr);
+      double mass_la = m_V0Tools->invariantMass(laV0,m_massp,m_masspi);
+      double mass_error_la = m_V0Tools->invariantMassError(laV0,m_massp,m_masspi);
+      double pt = m_V0Tools->pT(laV0);
+      double ptError = m_V0Tools->pTError(laV0);
+      double rxy = m_V0Tools->rxy(laV0);
+      double rxyError = m_V0Tools->rxyError(laV0);
+      Amg::Vector3D momentum = m_V0Tools->V0Momentum(laV0);
+      mDecor_mass( *laV0 ) = mass_la;
+      mDecor_massError( *laV0 ) = mass_error_la;
+      mDecor_pt( *laV0 ) = pt;
+      mDecor_ptError( *laV0 ) = ptError;
+      mDecor_rxy( *laV0 ) = rxy;
+      mDecor_rxyError( *laV0 ) = rxyError;
+      mDecor_px( *laV0 ) = momentum.x();
+      mDecor_py( *laV0 ) = momentum.y();
+      mDecor_pz( *laV0 ) = momentum.z();
+      ATH_MSG_DEBUG("Reco_V0Finder mass_la " << mass_la << " mass_error_la " << mass_error_la << " pt " << pt << " rxy " << rxy);
+    }
+    xAOD::VertexContainer::const_iterator lbItr = lbContainer->begin();
+    for ( lbItr=lbContainer->begin(); lbItr!=lbContainer->end(); ++lbItr )
+    {
+      const xAOD::Vertex * lbV0 = (*lbItr);
+      double mass_lb = m_V0Tools->invariantMass(lbV0,m_masspi,m_massp);
+      double mass_error_lb = m_V0Tools->invariantMassError(lbV0,m_masspi,m_massp);
+      double pt = m_V0Tools->pT(lbV0);
+      double ptError = m_V0Tools->pTError(lbV0);
+      double rxy = m_V0Tools->rxy(lbV0);
+      double rxyError = m_V0Tools->rxyError(lbV0);
+      Amg::Vector3D momentum = m_V0Tools->V0Momentum(lbV0);
+      mDecor_mass( *lbV0 ) = mass_lb;
+      mDecor_massError( *lbV0 ) = mass_error_lb;
+      mDecor_pt( *lbV0 ) = pt;
+      mDecor_ptError( *lbV0 ) = ptError;
+      mDecor_rxy( *lbV0 ) = rxy;
+      mDecor_rxyError( *lbV0 ) = rxyError;
+      mDecor_px( *lbV0 ) = momentum.x();
+      mDecor_py( *lbV0 ) = momentum.y();
+      mDecor_pz( *lbV0 ) = momentum.z();
+      ATH_MSG_DEBUG("Reco_V0Finder mass_lb " << mass_lb << " mass_error_lb " << mass_error_lb << " pt " << pt << " rxy " << rxy);
+    }
+    }
+
+
+    if(!callV0Finder){ //Fill with empty containers
+      v0Container = new xAOD::VertexContainer;
+      v0AuxContainer = new xAOD::VertexAuxContainer;
+      v0Container->setStore(v0AuxContainer);
+      ksContainer = new xAOD::VertexContainer;
+      ksAuxContainer = new xAOD::VertexAuxContainer;
+      ksContainer->setStore(ksAuxContainer);
+      laContainer = new xAOD::VertexContainer;
+      laAuxContainer = new xAOD::VertexAuxContainer;
+      laContainer->setStore(laAuxContainer);
+      lbContainer = new xAOD::VertexContainer;
+      lbAuxContainer = new xAOD::VertexAuxContainer;
+      lbContainer->setStore(lbAuxContainer);
+    }
+
+    //---- Recording section: write the results to StoreGate ---//
+    CHECK(evtStore()->record(v0Container, m_v0ContainerName));
+  
+    CHECK(evtStore()->record(v0AuxContainer, m_v0ContainerName+"Aux."));
+  
+    CHECK(evtStore()->record(ksContainer, m_ksContainerName));
+  
+    CHECK(evtStore()->record(ksAuxContainer, m_ksContainerName+"Aux."));
+  
+    CHECK(evtStore()->record(laContainer, m_laContainerName));
+  
+    CHECK(evtStore()->record(laAuxContainer, m_laContainerName+"Aux."));
+  
+    CHECK(evtStore()->record(lbContainer, m_lbContainerName));
+  
+    CHECK(evtStore()->record(lbAuxContainer, m_lbContainerName+"Aux."));
+
+    return StatusCode::SUCCESS;    
+  }
+}
+
+
+
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Reco_Vertex.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Reco_Vertex.cxx
new file mode 100644
index 000000000000..9d2b236c8415
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Reco_Vertex.cxx
@@ -0,0 +1,163 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+
+/////////////////////////////////////////////////////////////////
+// Reco_Vertex.cxx
+///////////////////////////////////////////////////////////////////
+// Author: Daniel Scheirich <daniel.scheirich@cern.ch>
+// Based on the Integrated Simulation Framework
+//
+// Basic Jpsi->mu mu derivation example
+
+#include "DerivationFrameworkBPhys/Reco_Vertex.h"
+#include "DerivationFrameworkBPhys/BPhysPVTools.h"
+#include "xAODTracking/VertexContainer.h"
+#include "xAODTracking/VertexAuxContainer.h"
+
+namespace DerivationFramework {
+
+  Reco_Vertex::Reco_Vertex(const std::string& t,
+      const std::string& n,
+      const IInterface* p) : 
+    AthAlgTool(t,n,p),
+    m_v0Tools("Trk::V0Tools"),
+    m_SearchTool(),
+    m_pvRefitter("Analysis::PrimaryVertexRefitter")
+  {
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+    
+    // Declare tools    
+    declareProperty("V0Tools"   , m_v0Tools);
+    declareProperty("VertexSearchTool", m_SearchTool);
+    declareProperty("PVRefitter", m_pvRefitter);
+    
+    // Declare user-defined properties
+    declareProperty("OutputVtxContainerName", m_outputVtxContainerName = "OniaCandidates");
+    declareProperty("PVContainerName"       , m_pvContainerName        = "PrimaryVertices");
+    declareProperty("RefPVContainerName"    , m_refPVContainerName     = "RefittedPrimaryVertices");
+    declareProperty("RefitPV"               , m_refitPV                = false);
+    declareProperty("MaxPVrefit"            , m_PV_max                 = 1000);
+    declareProperty("DoVertexType"          , m_DoVertexType           = 7);
+    // minimum number of tracks for PV to be considered for PV association
+    declareProperty("MinNTracksInPV"        , m_PV_minNTracks          = 0);
+    declareProperty("Do3d"                  , m_do3d                   = false);
+    declareProperty("CheckCollections"      , m_checkCollections       = false);
+    declareProperty("CheckVertexContainers" , m_CollectionsToCheck);
+  }
+
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
+  
+  StatusCode Reco_Vertex::initialize()
+  {
+  
+    ATH_MSG_DEBUG("in initialize()");
+ 
+    // retrieve V0 tools
+    CHECK( m_v0Tools.retrieve() );
+    
+    // get the Search tool
+    CHECK( m_SearchTool.retrieve() );
+     
+    // get the PrimaryVertexRefitter tool
+    CHECK( m_pvRefitter.retrieve() );
+
+    // Get the beam spot service
+    ATH_CHECK(m_beamSpotKey.initialize());
+
+
+    ATH_CHECK(m_outputVtxContainerName.initialize());
+    ATH_CHECK(m_pvContainerName.initialize());
+    ATH_CHECK(m_refPVContainerName.initialize());
+    if(m_checkCollections) ATH_CHECK(m_CollectionsToCheck.initialize());
+    return StatusCode::SUCCESS;
+    
+  }
+
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
+  
+  StatusCode Reco_Vertex::addBranches() const
+  {
+    bool callTool = true;
+    if(m_checkCollections) {
+      for(const auto &str : m_CollectionsToCheck){
+         SG::ReadHandle<xAOD::VertexContainer> handle(str);
+         ATH_CHECK(handle.isValid());
+         if(handle->size() == 0) {
+            callTool = false;
+            ATH_MSG_DEBUG("Container VertexContainer (" << str << ") is empty");
+            break;//No point checking other containers
+         }
+      }
+    }
+
+    // Vertex container and its auxilliary store
+    xAOD::VertexContainer*    vtxContainer = nullptr;
+    xAOD::VertexAuxContainer* vtxAuxContainer = nullptr;
+    
+    if(callTool) {
+    //----------------------------------------------------
+    // call Tool
+    //----------------------------------------------------
+    if( !m_SearchTool->performSearch(vtxContainer, vtxAuxContainer).isSuccess() ) {
+      ATH_MSG_FATAL("Tool (" << m_SearchTool << ") failed.");
+      return StatusCode::FAILURE;
+    }
+
+    //----------------------------------------------------
+    // retrieve primary vertices
+    //----------------------------------------------------
+    SG::ReadHandle<xAOD::VertexContainer> pvContainer(m_pvContainerName);
+
+    //----------------------------------------------------
+    // Try to retrieve refitted primary vertices
+    //----------------------------------------------------
+    xAOD::VertexContainer*    refPvContainer = nullptr;
+    xAOD::VertexAuxContainer* refPvAuxContainer = nullptr;
+    if(m_refitPV) {
+        // refitted PV container does not exist. Create a new one.
+        refPvContainer = new xAOD::VertexContainer;
+        refPvAuxContainer = new xAOD::VertexAuxContainer;
+        refPvContainer->setStore(refPvAuxContainer);
+    }
+    
+    // Give the helper class the ptr to v0tools and beamSpotsSvc to use
+    SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey };
+    if(not beamSpotHandle.isValid()) ATH_MSG_ERROR("Cannot Retrieve " << m_beamSpotKey.key() );
+    BPhysPVTools helper(&(*m_v0Tools), beamSpotHandle.cptr());
+    helper.SetMinNTracksInPV(m_PV_minNTracks);
+    helper.SetSave3d(m_do3d);
+
+    if(m_refitPV){ 
+       if(vtxContainer->size() >0){
+        StatusCode SC = helper.FillCandwithRefittedVertices(vtxContainer,  pvContainer.cptr(), refPvContainer, &(*m_pvRefitter) , m_PV_max, m_DoVertexType);
+        if(SC.isFailure()){
+            ATH_MSG_FATAL("refitting failed - check the vertices you passed");
+            return SC;
+        }
+        }
+    }else{
+        if(vtxContainer->size() >0)CHECK(helper.FillCandExistingVertices(vtxContainer, pvContainer.cptr(), m_DoVertexType));
+    }
+    
+    //----------------------------------------------------
+    // save in the StoreGate
+    //----------------------------------------------------
+    SG::WriteHandle<xAOD::VertexContainer> handle(m_outputVtxContainerName);
+    ATH_CHECK(handle.record(std::unique_ptr<xAOD::VertexContainer>(vtxContainer ), std::unique_ptr<xAOD::VertexAuxContainer>(vtxAuxContainer )));
+    
+    if(m_refitPV) {
+       SG::WriteHandle<xAOD::VertexContainer> handle(m_refPVContainerName);
+       ATH_CHECK(handle.record(std::unique_ptr<xAOD::VertexContainer>(refPvContainer ), std::unique_ptr<xAOD::VertexAuxContainer>(refPvAuxContainer )));
+    }
+    }
+
+    if (!callTool) { //Fill with empty containers
+      SG::WriteHandle<xAOD::VertexContainer> handle(m_outputVtxContainerName);
+      ATH_CHECK(handle.record(std::unique_ptr<xAOD::VertexContainer>(new xAOD::VertexContainer ),
+          std::unique_ptr<xAOD::VertexAuxContainer>(new xAOD::VertexAuxContainer )));
+    }
+    
+    return StatusCode::SUCCESS;
+  }  
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Select_Bmumu.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Select_Bmumu.cxx
new file mode 100644
index 000000000000..d1027b9b2c35
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Select_Bmumu.cxx
@@ -0,0 +1,563 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+
+//============================================================================
+// Select_Bmumu.cxx
+//============================================================================
+// 
+// Author : Wolfgang Walkowiak <Wolfgang.Walkowiak@cern.ch.>
+// Changes:
+// 
+// Based on Select_onia2mumu.h.
+// Original author: Daniel Scheirich <daniel.scheirich@cern.ch>
+//
+// Select B candidates for the B(s)mumu analysis including for
+// the reference channels used.
+//
+// For an example see BPHY8.py .
+//
+// Job options provided by this class:
+// - V0Tools                 -- ToolHandle for V0Tools (default: Trk::V0Tools) 
+// - HypothesisName          -- name given to the hypothesis (passed flag)
+// - InputVtxContainerName   -- name of the input vertex container
+// - TrkMasses"              -- list of masses to be assigned to the tracks
+//                              used for lifetime calculation
+//                              (Make sure to give them in correct order!)
+//  - VtxMassHypo            -- mass used in the calculation of lifetime
+//  - MassMin                -- minimum of mass range
+//  - MassMax                -- maximum of mass range
+//  - Chi2Max                -- maximum chi2 cut
+//  - DoVertexType           -- bits defining vertex association types
+//                              to be used
+//  - Do3d                   -- add 3d proper time
+//  - BlindMassMin           -- minimum of blinded mass range
+//  - BlindMassMax           -- maximum blinded mass range
+//  - DoBlinding             -- switch to enable blinding (default: false)
+//  - DoCutBlinded           -- cut blinded vertices (default: false)
+//  - BlindOnlyAllMuonsTight -- only blind candidates with all tight muons
+//  - UseMuCalcMass          -- use MUCALC mass in mass cuts (default: false)
+//  - SubDecVtxContNames     -- names of containers with sub-decay candidates
+//                              (in order of sub decays)
+//  - SubDecVtxHypoCondNames -- names of hypothesis required to be passed
+//                              by sub-decay candidates
+//  - SubDecVtxHypoFlagNames -- names of hypothesis passed flags set by
+//                              this algorithm on sub-decay candidates
+//                              (taken as
+//                               SupDecVtxHypoCondName+'_'+HypthesisName
+//                               if not explicitely given)
+//                           
+//============================================================================
+//
+#include "DerivationFrameworkBPhys/Select_Bmumu.h"
+
+#include <vector>
+#include <string>
+#include "TVector3.h"
+
+#include "TrkVertexAnalysisUtils/V0Tools.h"
+#include "xAODTracking/VertexContainer.h"
+#include "xAODTracking/VertexAuxContainer.h"
+#include "xAODBPhys/BPhysHypoHelper.h"
+#include "AthContainers/AuxElement.h"
+
+/*
+ *  Some useful typedefs
+ */
+typedef ElementLink<xAOD::VertexContainer> VertexLink;
+typedef std::vector<VertexLink> VertexLinkVector;
+
+namespace DerivationFramework {
+
+  Select_Bmumu::Select_Bmumu(const std::string& t,
+      const std::string& n,
+      const IInterface* p) : 
+    CfAthAlgTool(t,n,p),
+    m_v0Tools("Trk::V0Tools"),
+    m_muSelectionTool("CP::MuonSelectionTool/MuonSelectionTool") {
+    
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+
+    // Declare tools    
+    declareProperty("V0Tools", m_v0Tools);
+    declareProperty("MuonSelectionTool", m_muSelectionTool);
+
+    // Declare user-defined properties
+    
+    declareProperty("HypothesisName"        , m_hypoName               = "A");
+    declareProperty("InputVtxContainerName" , m_inputVtxContainerName  = "JpsiCandidates");
+    declareProperty("TrkMasses"             , m_trkMasses              = std::vector<double>(2, 105.658) );
+    declareProperty("VtxMassHypo"           , m_massHypo               = 3096.916 );
+    declareProperty("MassMax"               , m_massMax                = 6000);
+    declareProperty("MassMin"               , m_massMin                = 2000);
+    declareProperty("Chi2Max"               , m_chi2Max                = 200);
+    declareProperty("DoVertexType"          , m_DoVertexType           = 7);
+    declareProperty("Do3d"                  , m_do3d                   = false);
+    declareProperty("BlindMassMin"          , m_blindMassMin           = 0.);
+    declareProperty("BlindMassMax"          , m_blindMassMax           = 0.);
+    declareProperty("DoBlinding"            , m_doBlinding             = false);
+    declareProperty("DoCutBlinded"          , m_doCutBlinded           = false);
+    declareProperty("BlindOnlyAllMuonsTight", m_blindOnlyAllMuonsTight = false);
+    declareProperty("UseMuCalcMass"         , m_useMuCalcMass          = false);
+    declareProperty("SubDecVtxContNames"    , m_subDecVtxContNames     = {});
+    declareProperty("SubDecVtxHypoCondNames", m_subDecVtxHypoCondNames = {});
+    declareProperty("SubDecVtxHypoFlagNames", m_subDecVtxHypoFlagNames = {});
+  }
+  //----------------------------------------------------------------------------
+  StatusCode Select_Bmumu::initialize() {
+  
+    ATH_MSG_DEBUG("in initialize()");
+    
+    // retrieve V0 tools
+    CHECK( m_v0Tools.retrieve() );
+
+    // retrieve MuonSelectionTool
+    if ( m_blindOnlyAllMuonsTight ) {
+      CHECK( m_muSelectionTool.retrieve() );
+    }
+    
+    // check length of sub-decay vertex container and required hypo name
+    // vectors
+    if ( m_subDecVtxContNames.size() != m_subDecVtxHypoCondNames.size() ) {
+      ATH_MSG_ERROR("initialize(): number of elements for options "
+		    << "SubDecVtxContNames and SubDecVtxHypoCondNames does not "
+		    << "match : " << m_subDecVtxContNames.size()
+		    << " != " << m_subDecVtxHypoCondNames << " !!");
+    }
+    // check the length of condition and flag hypo name vectors and append
+    // to the later if necessary
+    if ( m_subDecVtxHypoCondNames.size() > m_subDecVtxHypoFlagNames.size() ) {
+      ATH_MSG_INFO("initialize(): SubDecVtxHypoFlagNames ("
+                   << m_subDecVtxHypoFlagNames.size()
+                   << ") < SubDecVtxHypoCondNames ("
+                   << m_subDecVtxHypoCondNames.size()
+                   << ") ... appending to the first.");
+      for ( unsigned int i = m_subDecVtxHypoFlagNames.size();
+            i < m_subDecVtxHypoCondNames.size(); ++i) {
+        std::string flagname = m_hypoName+"_"+m_subDecVtxHypoCondNames[i];
+        ATH_MSG_INFO("initialize(): SubDecVtxHypoFlagNames[" << i << "] = "
+                     << flagname);
+        m_subDecVtxHypoFlagNames.push_back(flagname);
+      }
+    } else if ( m_subDecVtxHypoCondNames.size()
+                < m_subDecVtxHypoFlagNames.size() ) {
+      ATH_MSG_ERROR("initialize(): SubDecVtxHypoFlagNames ("
+                    << m_subDecVtxHypoFlagNames.size()
+                    << ") > SubDecVtxHypoCondNames ("
+                    << m_subDecVtxHypoCondNames.size()
+                    << ") ! Configuration error!");
+    }
+    return StatusCode::SUCCESS;
+  }
+  //----------------------------------------------------------------------------
+  StatusCode Select_Bmumu::finalize() {
+
+    // everything all right
+    return StatusCode::SUCCESS;
+  }
+  //---------------------------------------------------------------------------
+  void Select_Bmumu::ProcessVertex(xAOD::BPhysHypoHelper &bcand,
+                                   xAOD::BPhysHelper::pv_type pv_t) const {
+
+      constexpr float errConst = -9999999;
+      const xAOD::Vertex* pv = bcand.pv(pv_t); 
+      if (pv) {
+        // decorate the vertex. 
+        // Proper decay time assuming constant mass hypothesis m_massHypo
+        BPHYS_CHECK( bcand.setTau(m_v0Tools->tau(bcand.vtx(), pv, m_massHypo), 
+                                  pv_t,
+                                  xAOD::BPhysHypoHelper::TAU_CONST_MASS) );
+        // Proper decay time assuming error constant mass hypothesis m_massHypo
+        BPHYS_CHECK( bcand.setTauErr( m_v0Tools->tauError(bcand.vtx(), pv,
+                                                          m_massHypo), 
+                                      pv_t,
+                                      xAOD::BPhysHypoHelper::TAU_CONST_MASS) );
+        
+        BPHYS_CHECK( bcand.setTau(m_v0Tools->tau(bcand.vtx(),pv, m_trkMasses), 
+                                  pv_t,
+                                  xAOD::BPhysHypoHelper::TAU_INV_MASS) );
+        
+        BPHYS_CHECK( bcand.setTauErr(m_v0Tools->tauError(bcand.vtx(), pv,
+                                                         m_trkMasses), 
+                                     pv_t,
+                                     xAOD::BPhysHypoHelper::TAU_INV_MASS) );
+        //enum pv_type {PV_MAX_SUM_PT2, PV_MIN_A0, PV_MIN_Z0, PV_MIN_Z0_BA};
+      } else {
+        
+        BPHYS_CHECK( bcand.setTau(errConst, pv_t,
+                                  xAOD::BPhysHypoHelper::TAU_CONST_MASS) );
+        // Proper decay time assuming error constant mass hypothesis m_massHypo
+        BPHYS_CHECK( bcand.setTauErr( errConst, 
+                                      pv_t,
+                                      xAOD::BPhysHypoHelper::TAU_CONST_MASS) );
+        
+        BPHYS_CHECK( bcand.setTau( errConst, 
+                                   pv_t,
+                                   xAOD::BPhysHypoHelper::TAU_INV_MASS) );
+	
+        BPHYS_CHECK( bcand.setTauErr( errConst, 
+                                      pv_t,
+                                      xAOD::BPhysHypoHelper::TAU_INV_MASS) );
+      }
+
+      if(m_do3d){
+
+        BPHYS_CHECK( bcand.setTau3d( pv ?
+                                     m_v0Tools->tau3D(bcand.vtx(), pv,
+                                                      m_massHypo)
+                                     : errConst, pv_t,
+                                     xAOD::BPhysHypoHelper::TAU_CONST_MASS) );
+        // Proper decay time assuming error constant mass hypothesis m_massHypo
+        BPHYS_CHECK( bcand.setTau3dErr( pv ?
+                                        m_v0Tools->tau3DError(bcand.vtx(), pv,
+                                                              m_massHypo)
+                                        : errConst, pv_t,
+                                        xAOD::BPhysHypoHelper::TAU_CONST_MASS)
+                     );
+
+        BPHYS_CHECK( bcand.setTau3d( pv ?
+                                     m_v0Tools->tau3D(bcand.vtx(), pv,
+                                                      m_trkMasses)
+                                     : errConst, pv_t,
+                                     xAOD::BPhysHypoHelper::TAU_INV_MASS) );
+        
+        BPHYS_CHECK( bcand.setTau3dErr( pv ?
+                                        m_v0Tools->tau3DError(bcand.vtx(), pv,
+                                                              m_trkMasses)
+                                        : errConst, pv_t,
+                                        xAOD::BPhysHypoHelper::TAU_INV_MASS)
+                     );
+      }
+
+  } 
+  //---------------------------------------------------------------------------
+  StatusCode Select_Bmumu::addBranches() const {
+
+    // Jpsi container and its auxilliary store
+    xAOD::VertexContainer*    bcandContainer    = NULL;
+    xAOD::VertexAuxContainer* bcandAuxContainer = NULL;
+    
+    // retrieve from the StoreGate
+    CHECK(evtStore()->retrieve(bcandContainer, m_inputVtxContainerName));
+    CHECK(evtStore()->retrieve(bcandAuxContainer,
+			       m_inputVtxContainerName+"Aux."));
+
+    // for sub-decays
+    std::vector<xAOD::VertexContainer*>    subCandConts;
+    std::vector<xAOD::VertexAuxContainer*> subCandAuxConts;
+
+    // retrieve from StoreGate
+    for (auto cname : m_subDecVtxContNames) {
+      xAOD::VertexContainer*    subCandCont    = NULL;
+      xAOD::VertexAuxContainer* subCandAuxCont = NULL;
+      CHECK(evtStore()->retrieve(subCandCont   , cname));
+      CHECK(evtStore()->retrieve(subCandAuxCont, cname+"Aux."));
+      subCandConts.push_back(subCandCont);
+      subCandAuxConts.push_back(subCandAuxCont);
+    }
+
+    // preset pass flag to false for subdecays
+    for (unsigned int isub=0; isub < subCandConts.size(); ++isub) {
+      xAOD::VertexContainer* subCandCont = subCandConts[isub];
+      if ( subCandCont != NULL ) {
+        for (xAOD::VertexContainer::iterator it = subCandCont->begin();
+             it != subCandCont->end(); ++it) {
+          if ( *it != NULL ) {
+            // only set subdecay passed flag to false if not yet set at all
+            setPassIfNotAvailable(**it, m_subDecVtxHypoFlagNames[isub], false);
+            // set subdecay blinding flag to true if not yet set at all
+            // and blinding is requested
+            if ( m_doBlinding ) {
+              setPassIfNotAvailable(**it,
+                                    m_subDecVtxHypoFlagNames[isub]+"_blinded",
+                                    true);
+            }
+          } else {
+            ATH_MSG_WARNING("addBranches(): NULL pointer elements in "
+                            "xAOD::VertexContainer !!");
+          }
+        } // for subCandCont
+      } // if subCandCont != NULL
+    } // for subCandConts
+
+    bool doPt   = (m_DoVertexType & 1) != 0;
+    bool doA0   = (m_DoVertexType & 2) != 0;
+    bool doZ0   = (m_DoVertexType & 4) != 0;
+    bool doZ0BA = (m_DoVertexType & 8) != 0;
+
+    // loop over B candidates and perform selection and augmentation
+    // counters
+    int nPassMassCuts                 = 0;
+    int nPassChi2Cut                  = 0;
+    int nPassPrecVtxCut               = 0;
+    int nInBlindedRegion              = 0;
+    int nInBlindedRegionAllMuonsTight = 0;
+    xAOD::VertexContainer::iterator bcandItr = bcandContainer->begin();
+    for (; bcandItr!=bcandContainer->end(); ++bcandItr) {
+      // create BPhysHypoHelper
+      xAOD::BPhysHypoHelper bcand(m_hypoName, *bcandItr);
+      
+      //----------------------------------------------------
+      // decorate the vertex - part 1
+      //----------------------------------------------------
+      // a) invariant mass and error
+      if ( !bcand.setMass(m_trkMasses) )
+        ATH_MSG_WARNING("Decoration bcand.setMass failed");
+      
+      double massErr = m_v0Tools->invariantMassError(bcand.vtx(), m_trkMasses);
+      if ( !bcand.setMassErr(massErr) )
+        ATH_MSG_WARNING("Decoration bcand.setMassErr failed");
+      
+      // b) proper decay time and error: 
+      // retrieve the refitted PV (or the original one,
+      // if the PV refitting was turned off)
+      // -- deferred to after the selection --
+      /*
+      if (doPt)   ProcessVertex(bcand, xAOD::BPhysHelper::PV_MAX_SUM_PT2);
+      if (doA0)   ProcessVertex(bcand, xAOD::BPhysHelper::PV_MIN_A0);
+      if (doZ0)   ProcessVertex(bcand, xAOD::BPhysHelper::PV_MIN_Z0);
+      if (doZ0BA) ProcessVertex(bcand, xAOD::BPhysHelper::PV_MIN_Z0_BA);
+      */
+      
+      //----------------------------------------------------
+      // perform the selection (i.e. flag the vertex)
+      //----------------------------------------------------
+      // flag the vertex indicating that it is selected by this selector
+      bcand.setPass(true);
+      if ( m_doBlinding ) {
+        setPass(*bcand.vtx(),
+                m_hypoName+"_blinded", false);
+      }
+      
+      // now we check other cuts. if one of them didn't pass, set the flag to 0
+      // and continue to the next candidate:
+      
+      // 1) invariant mass cuts
+      bool passedMuCalcMassCut(m_useMuCalcMass);
+      bool blindedMuCalcMass(true);
+      if ( m_useMuCalcMass ) {
+        std::string bname = m_hypoName+"_MUCALC_mass";
+        static SG::AuxElement::Accessor<float> mucalcAcc(bname);
+        if ( mucalcAcc.isAvailable(**bcandItr) ) {
+          passedMuCalcMassCut = massCuts(mucalcAcc(**bcandItr));
+          blindedMuCalcMass = massInBlindedRegion(mucalcAcc(**bcandItr));
+        } else {
+          passedMuCalcMassCut = false;
+          blindedMuCalcMass   = false;
+          ATH_MSG_INFO("MUCALC mass not available: " << bname << " !");
+        }
+      }
+      bool passedMassCut = massCuts(bcand.mass());
+      bool blindedMass   = massInBlindedRegion(bcand.mass());
+
+      // 1a) muon quality cuts
+      bool allMuonsTight =
+        !m_blindOnlyAllMuonsTight || checkAllMuonsTight(bcand.muons()); 
+
+      // 1b) mark candidates in blinded region
+      if ( blindedMass && blindedMuCalcMass ) {
+        if ( m_doBlinding ) {
+          nInBlindedRegion++;
+          if ( allMuonsTight ) {
+            nInBlindedRegionAllMuonsTight++;
+            setPass(*bcand.vtx(),
+                    m_hypoName+"_blinded", true);
+          }
+        }
+      }
+
+      // 1c) cut on the mass range
+      if ( !(passedMassCut || passedMuCalcMassCut) ) {
+        bcand.setPass(false); // flag as failed
+        continue;
+      }
+      nPassMassCuts++;
+
+      // 2) chi2 cut
+      if ( bcand.vtx()->chiSquared() > m_chi2Max) {
+        bcand.setPass(false);; // flag as failed
+        continue;
+      }
+      nPassChi2Cut++;
+
+      // 3) preceeding vertices: within their mass ranges?
+      int npVtx = bcand.nPrecedingVertices();
+      if ( npVtx > (int)m_subDecVtxContNames.size() ) {
+        ATH_MSG_WARNING("addBranches(): npVtx > m_subDecVtxContNames.size() !"
+                        " (" << npVtx << " > " << m_subDecVtxContNames.size()
+                        << ")");
+      }
+      npVtx = std::min(npVtx, (int)m_subDecVtxContNames.size());
+      // check preceeding vertices
+      bool pVtxOk = true;
+      for (int ipv=0; ipv<npVtx; ++ipv) {
+        const xAOD::Vertex* pVtx = bcand.precedingVertex(ipv);
+        if ( !pass(*pVtx, m_subDecVtxHypoCondNames[ipv]) ) {
+          pVtxOk = false;
+          continue;
+        }
+      }
+      if ( !pVtxOk ) {
+        bcand.setPass(false);; // flag as failed
+        continue;
+      }
+      // mark preceeding vertices
+      for (int ipv=0; ipv<npVtx; ++ipv) {
+        setPass(*bcand.precedingVertex(ipv),
+                m_subDecVtxHypoFlagNames[ipv], true);
+        if ( m_doBlinding && !(blindedMass && blindedMuCalcMass
+                               && allMuonsTight) ) {
+          setPass(*bcand.precedingVertex(ipv),
+                  m_subDecVtxHypoFlagNames[ipv]+"_blinded", false);
+        }
+      }
+      nPassPrecVtxCut++;
+
+      //----------------------------------------------------
+      // decorate the vertex - part 2
+      //----------------------------------------------------
+      // b) proper decay time and error: 
+      // retrieve the refitted PV (or the original one,
+      // if the PV refitting was turned off)
+      if (doPt)   ProcessVertex(bcand, xAOD::BPhysHelper::PV_MAX_SUM_PT2);
+      if (doA0)   ProcessVertex(bcand, xAOD::BPhysHelper::PV_MIN_A0);
+      if (doZ0)   ProcessVertex(bcand, xAOD::BPhysHelper::PV_MIN_Z0);
+      if (doZ0BA) ProcessVertex(bcand, xAOD::BPhysHelper::PV_MIN_Z0_BA);
+      
+    } // end of loop over bcand candidates
+
+    // counters
+    // event level
+    addEvent("allEvents");
+    if ( bcandContainer->size() > 0 ) addEvent("eventsWithCands");
+    if ( nPassMassCuts    > 0 )       addEvent("massCutEvents");
+    if ( nPassChi2Cut     > 0 )       addEvent("chi2CutEvents");
+    if ( nPassPrecVtxCut  > 0 )       addEvent("precVtxCutEvents");
+    if ( m_doBlinding && nInBlindedRegion > 0 ) addEvent("blindedRegionEvents");
+    // candidate level
+    addToCounter("allCandidates"       , bcandContainer->size());
+    addToCounter("massCutCandidates"   , nPassMassCuts);
+    addToCounter("chi2CutCandidates"   , nPassChi2Cut);
+    addToCounter("precVtxCutCandidates", nPassPrecVtxCut);
+    if ( m_doBlinding ) {
+      addToCounter("blindedRegionCandidates", nInBlindedRegion);
+      if ( m_blindOnlyAllMuonsTight ) {
+        addToCounter("blindedRegionCandidatesWithAllMuonsTight",
+                     nInBlindedRegionAllMuonsTight);
+      }
+    }
+    
+    // all OK
+    return StatusCode::SUCCESS;
+  }  
+  //---------------------------------------------------------------------------
+  // Check whether mass cuts (including a possibly blinding region cut)
+  // are passed.
+  //---------------------------------------------------------------------------
+  bool Select_Bmumu::massCuts(float mass) const {
+ 
+    return (mass > m_massMin && mass < m_massMax)
+      && !(m_doBlinding && m_doCutBlinded && massInBlindedRegion(mass) );
+  }
+  //---------------------------------------------------------------------------
+  // Check whether mass cuts (including a possibly blinding region cut)
+  // are passed.
+  //---------------------------------------------------------------------------
+  bool Select_Bmumu::massInBlindedRegion(float mass) const {
+    return ( mass > m_blindMassMin && mass < m_blindMassMax ); 
+  }
+  //--------------------------------------------------------------------------
+  // Check whether all muons are of quality tight.
+  //--------------------------------------------------------------------------
+  bool Select_Bmumu::checkAllMuonsTight(const std::vector<const xAOD::Muon*>&
+                                        muons, int maxMuonsToCheck) const {
+
+    bool allTight(true);
+    int  ncheckMax = muons.size();
+    if ( maxMuonsToCheck > -1 ) {
+      ncheckMax = std::min((int)muons.size(), maxMuonsToCheck);
+    }
+    for (int imu=0; imu < ncheckMax; ++imu) {
+      xAOD::Muon::Quality muQuality =
+        m_muSelectionTool->getQuality(*muons[imu]);
+      if ( !(muQuality <= xAOD::Muon::Tight) ) {
+        allTight = false;
+        break;
+      }
+    }
+    return allTight;
+  }
+  //---------------------------------------------------------------------------
+  // Helper to check whether an element is marked as passing a specific
+  // hypothesis.
+  //---------------------------------------------------------------------------
+  bool Select_Bmumu::pass(const SG::AuxElement& em, std::string hypo) const {
+
+    SG::AuxElement::Accessor<Char_t> flagAcc("passed_"+hypo);
+    return flagAcc.isAvailable(em) && flagAcc(em) != 0;
+  }
+  //---------------------------------------------------------------------------
+  // Helper to set an element marked as passing a specific hypothesis.
+  //---------------------------------------------------------------------------
+  bool Select_Bmumu::setPass(const SG::AuxElement& em, std::string hypo,
+                             bool passVal) const {
+
+    SG::AuxElement::Decorator<Char_t> flagDec("passed_"+hypo);
+    flagDec(em) = passVal;
+    return true;
+  }
+  //---------------------------------------------------------------------------
+  // Helper to set an element marked as passing a specific hypothesis
+  // if the element doesn't have the specific flag yet.
+  // Returns true if action had to be taken.
+  //---------------------------------------------------------------------------
+  bool Select_Bmumu::setPassIfNotAvailable(SG::AuxElement& em, std::string hypo,
+                                           bool passVal) const {
+    
+    SG::AuxElement::Accessor<Char_t> flagAcc("passed_"+hypo);
+    bool exists = flagAcc.isAvailable(em);
+    if ( !exists ) {
+      setPass(em, hypo, passVal);
+    }
+    return !exists;
+  }
+  //---------------------------------------------------------------------------
+  // Fetch a vector of preceeding vertices for a specific vertex
+  //---------------------------------------------------------------------------
+  /*
+  std::vector<xAOD::Vertex*>
+  Select_Bmumu::getPrecedingVertices(const xAOD::Vertex* vtx) {
+
+    // new vector of vertices
+    std::vector<xAOD::Vertex*> vtxList;
+
+    // Create auxiliary branches accessors
+    static SG::AuxElement::Accessor<VertexLinkVector>
+      precedingVertexLinksAcc("PrecedingVertexLinks");
+
+    // check if branch exists
+    if( precedingVertexLinksAcc.isAvailable(*vtx) ) {
+      
+      // retrieve the precedingVertex links...
+      const VertexLinkVector& precedingVertexLinks =
+	precedingVertexLinksAcc(*vtx);
+      
+      // ... and check if they are all valid
+      for ( VertexLinkVector::const_iterator precedingVertexLinksItr =
+	     precedingVertexLinks.begin();
+	   precedingVertexLinksItr!=precedingVertexLinks.end();
+	   ++precedingVertexLinksItr) {
+      // check if links are valid
+	if( (*precedingVertexLinksItr).isValid() ) {
+	  // xAOD::Vertex* vtx2 = *precedingVertexLinkItr;
+	  // vtxList.push_back(*(*precedingVertexLinksItr));
+	}
+      } // for
+    } // if available
+
+    return vtxList;
+  }
+  */
+  //---------------------------------------------------------------------------
+
+} // namespace DerivationFramework
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Select_onia2mumu.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Select_onia2mumu.cxx
new file mode 100644
index 000000000000..33913419bf79
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Select_onia2mumu.cxx
@@ -0,0 +1,197 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/////////////////////////////////////////////////////////////////
+// Select_onia2mumu.cxx
+///////////////////////////////////////////////////////////////////
+// Author: Daniel Scheirich <daniel.scheirich@cern.ch>
+// Based on the Integrated Simulation Framework
+//
+// Basic Jpsi->mu mu derivation example
+
+#include "DerivationFrameworkBPhys/Select_onia2mumu.h"
+
+#include "TrkVertexAnalysisUtils/V0Tools.h"
+#include "xAODBPhys/BPhysHypoHelper.h"
+
+#include <vector>
+#include <string>
+
+namespace DerivationFramework {
+
+  Select_onia2mumu::Select_onia2mumu(const std::string& t,
+      const std::string& n,
+      const IInterface* p) : 
+    AthAlgTool(t,n,p),
+    m_v0Tools("Trk::V0Tools")
+  {
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+
+    // Declare tools    
+    declareProperty("V0Tools", m_v0Tools);
+
+    // Declare user-defined properties
+    
+    declareProperty("HypothesisName"       , m_hypoName              = "A");
+    declareProperty("InputVtxContainerName", m_inputVtxContainerName = "JpsiCandidates");
+    declareProperty("TrkMasses"            , m_trkMasses             = std::vector<double>(2, 105.658) );    
+    declareProperty("VtxMassHypo"          , m_massHypo              = 3096.916 );                  
+    declareProperty("MassMax"              , m_massMax               = 6000);                   
+    declareProperty("MassMin"              , m_massMin               = 2000);                   
+    declareProperty("Chi2Max"              , m_chi2Max               = 200);
+    declareProperty("DoVertexType"         , m_DoVertexType          = 7);
+    declareProperty("LxyMin"               , m_lxyMin                = std::numeric_limits<double>::lowest());
+    declareProperty("Do3d"                 , m_do3d = false);
+    
+  }
+
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
+  
+  StatusCode Select_onia2mumu::initialize()
+  {
+  
+    ATH_MSG_DEBUG("in initialize()");
+    
+    // retrieve V0 tools
+    CHECK( m_v0Tools.retrieve() );
+    ATH_CHECK(m_inputVtxContainerName.initialize());
+
+    return StatusCode::SUCCESS;
+    
+  }
+  
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
+  
+  void Select_onia2mumu::ProcessVertex(xAOD::BPhysHypoHelper &onia, xAOD::BPhysHelper::pv_type pv_t) const{
+      constexpr float errConst = -9999999;
+      const xAOD::Vertex* pv = onia.pv(pv_t); 
+      if(pv) {
+        // decorate the vertex. 
+        // Proper decay time assuming constant mass hypothesis m_massHypo
+        BPHYS_CHECK( onia.setTau( m_v0Tools->tau(onia.vtx(), pv,  m_massHypo), 
+                                  pv_t,
+                                  xAOD::BPhysHypoHelper::TAU_CONST_MASS) );
+        // Proper decay time assuming error constant mass hypothesis m_massHypo
+        BPHYS_CHECK( onia.setTauErr( m_v0Tools->tauError(onia.vtx(), pv,  m_massHypo), 
+                                     pv_t,
+                                     xAOD::BPhysHypoHelper::TAU_CONST_MASS) );
+        
+        BPHYS_CHECK( onia.setTau( m_v0Tools->tau(onia.vtx(), pv,  m_trkMasses), 
+                                  pv_t,
+                                  xAOD::BPhysHypoHelper::TAU_INV_MASS) );
+
+        BPHYS_CHECK( onia.setTauErr( m_v0Tools->tauError(onia.vtx(), pv,  m_trkMasses), 
+                                     pv_t,
+                                     xAOD::BPhysHypoHelper::TAU_INV_MASS) );       
+        
+        //enum pv_type {PV_MAX_SUM_PT2, PV_MIN_A0, PV_MIN_Z0, PV_MIN_Z0_BA};
+      }else{
+      
+
+        BPHYS_CHECK( onia.setTau(errConst, pv_t,
+                                  xAOD::BPhysHypoHelper::TAU_CONST_MASS) );
+        // Proper decay time assuming error constant mass hypothesis m_massHypo
+        BPHYS_CHECK( onia.setTauErr( errConst, 
+                                     pv_t,
+                                     xAOD::BPhysHypoHelper::TAU_CONST_MASS) );
+        
+        BPHYS_CHECK( onia.setTau( errConst, 
+                                  pv_t,
+                                  xAOD::BPhysHypoHelper::TAU_INV_MASS) );
+
+        BPHYS_CHECK( onia.setTauErr( errConst, 
+                                     pv_t,
+                                     xAOD::BPhysHypoHelper::TAU_INV_MASS) );        
+    }
+
+    if(m_do3d){
+        BPHYS_CHECK( onia.setTau3d( pv ? m_v0Tools->tau3D(onia.vtx(), pv,  m_massHypo) : errConst, 
+                                  pv_t,
+                                  xAOD::BPhysHypoHelper::TAU_CONST_MASS) );
+        // Proper decay time assuming error constant mass hypothesis m_massHypo
+        BPHYS_CHECK( onia.setTau3dErr( pv ? m_v0Tools->tau3DError(onia.vtx(), pv,  m_massHypo) : errConst,
+                                     pv_t,
+                                     xAOD::BPhysHypoHelper::TAU_CONST_MASS) );
+        
+        BPHYS_CHECK( onia.setTau3d( pv ? m_v0Tools->tau3D(onia.vtx(), pv,  m_trkMasses) : errConst,
+                                  pv_t,
+                                  xAOD::BPhysHypoHelper::TAU_INV_MASS) );
+
+        BPHYS_CHECK( onia.setTau3dErr( pv ? m_v0Tools->tau3DError(onia.vtx(), pv,  m_trkMasses) : errConst,
+                                     pv_t,
+                                     xAOD::BPhysHypoHelper::TAU_INV_MASS) );    
+
+    }
+
+  }
+  
+  
+  StatusCode Select_onia2mumu::addBranches() const
+  {
+    
+    SG::ReadHandle<xAOD::VertexContainer> oniaContainer(m_inputVtxContainerName);
+
+    bool doPt   = (m_DoVertexType & 1) != 0;
+    bool doA0   = (m_DoVertexType & 2) != 0;
+    bool doZ0   = (m_DoVertexType & 4) != 0;
+    bool doZ0BA = (m_DoVertexType & 8) != 0;
+    // loop over onia candidates and perform selection and augmentation
+    xAOD::VertexContainer::const_iterator oniaItr = oniaContainer->begin();
+    for(; oniaItr!=oniaContainer->end(); ++oniaItr) {
+      // create BPhysHypoHelper
+      xAOD::BPhysHypoHelper onia(m_hypoName, *oniaItr);
+      if((*oniaItr)->nTrackParticles() != m_trkMasses.size())
+          ATH_MSG_WARNING("Vertex has " << (*oniaItr)->nTrackParticles() << " while provided masses " << m_trkMasses.size());
+      //----------------------------------------------------
+      // decorate the vertex
+      //----------------------------------------------------
+      // a) invariant mass and error
+      if( !onia.setMass(m_trkMasses) ) ATH_MSG_WARNING("Decoration onia.setMass failed");
+      
+      double massErr = m_v0Tools->invariantMassError(onia.vtx(), m_trkMasses);
+      if( !onia.setMassErr(massErr) ) ATH_MSG_WARNING("Decoration onia.setMassErr failed");
+      
+      // b) proper decay time and error: 
+      // retrieve the refitted PV (or the original one, if the PV refitting was turned off)
+      if(doPt)   ProcessVertex(onia, xAOD::BPhysHelper::PV_MAX_SUM_PT2);
+      if(doA0)   ProcessVertex(onia, xAOD::BPhysHelper::PV_MIN_A0);
+      if(doZ0)   ProcessVertex(onia, xAOD::BPhysHelper::PV_MIN_Z0);
+      if(doZ0BA) ProcessVertex(onia, xAOD::BPhysHelper::PV_MIN_Z0_BA);
+      
+      //----------------------------------------------------
+      // perform the selection (i.e. flag the vertex)
+      //----------------------------------------------------
+      // flag the vertex indicating that it is selected by this selector
+      onia.setPass(true);
+      
+      // now we check othe cuts. if one of them didn't pass, set the flag to 0
+      // and continue to the next candidate:
+      
+      // 1) invariant mass cut
+      if( onia.mass() < m_massMin || onia.mass() > m_massMax) {
+        onia.setPass(false); // flag as failed
+        continue;
+      }
+
+      // 2) chi2 cut
+      if( onia.vtx()->chiSquared() > m_chi2Max) {
+        onia.setPass(false);; // flag as failed
+        continue;
+      }
+      // 3) lxy cut
+      if( onia.lxy(xAOD::BPhysHelper::PV_MAX_SUM_PT2) < m_lxyMin) {
+        onia.setPass(false);; // flag as failed
+        continue;
+      }
+
+    } // end of loop over onia candidates
+    
+    // all OK
+    return StatusCode::SUCCESS;
+  }  
+  
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
+  
+  
+}
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Thin_vtxDuplicates.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Thin_vtxDuplicates.cxx
new file mode 100644
index 000000000000..abb34bcd436c
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Thin_vtxDuplicates.cxx
@@ -0,0 +1,176 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/////////////////////////////////////////////////////////////////
+// Thin_vtxDuplicates.cxx
+///////////////////////////////////////////////////////////////////
+// Matteo Bedognetti (matteo.bedognetti@cern.ch)
+//Based on Thin_vtxTrk.cxx, by
+
+
+
+#include "DerivationFrameworkBPhys/Thin_vtxDuplicates.h"
+#include "xAODTracking/TrackParticleContainer.h"
+#include "xAODBPhys/BPhysHypoHelper.h"
+#include <vector>
+#include <string>
+#include <algorithm>  // for the sort function
+#include <iomanip>
+#include "StoreGate/ThinningHandle.h"
+// Constructor
+DerivationFramework::Thin_vtxDuplicates::Thin_vtxDuplicates(const std::string& t, const std::string& n, const IInterface* p ) :
+  AthAlgTool(t,n,p),
+ // m_acceptanceR(-1.),
+  m_noFlags(false),
+  m_nVtxTot(0),
+  m_nVtxPass(0)
+{
+  declareInterface<DerivationFramework::IThinningTool>(this);
+  
+  declareProperty("VertexContainerName"      , m_vertexContainerNames);
+  declareProperty("PassFlags"                 , m_passFlags);
+  //declareProperty("AcceptanceRadius"          , m_acceptanceR);
+  declareProperty("ApplyAnd"                  , m_and = true);  //This will be applied depending on the order in which the thinning tools are added to the kernel
+  declareProperty("IgnoreFlags"               , m_noFlags);
+  //declareProperty("ApplyAndForTracks"         , m_trackAnd = false);
+  //declareProperty("ThinTracks"                , m_thinTracks = true);
+}
+
+// Destructor
+DerivationFramework::Thin_vtxDuplicates::~Thin_vtxDuplicates() = default;
+
+// Athena initialize and finalize
+StatusCode DerivationFramework::Thin_vtxDuplicates::initialize()
+{
+  // Decide which collections need to be checked for ID TrackParticles
+  ATH_MSG_VERBOSE("initialize() ...");
+  ATH_CHECK(m_vertexContainerNames.initialize(m_streamName));
+
+  
+  if (m_passFlags.empty()) {
+    ATH_MSG_FATAL("No pass flags provided for thinning.");
+    return StatusCode::FAILURE;
+  } else {
+    for(auto itr = m_passFlags.cbegin(); itr!=m_passFlags.cend(); ++itr) {
+      ATH_MSG_INFO("Vertices must pass the \"" << itr->key() << "\" selection");
+    }
+  }
+
+  for(auto &key : m_passFlags){
+        key = m_vertexContainerNames.key() + '.' + key.key();
+  }
+  ATH_CHECK(m_passFlags.initialize());
+  return StatusCode::SUCCESS;
+}
+
+StatusCode DerivationFramework::Thin_vtxDuplicates::finalize()
+{
+  ATH_MSG_VERBOSE("finalize() ...");
+  ATH_MSG_INFO("Processed "<< m_nVtxTot <<" vertices, "<< m_nVtxPass<< " were retained ");
+  
+  return StatusCode::SUCCESS;
+}
+
+// The thinning itself
+StatusCode DerivationFramework::Thin_vtxDuplicates::doThinning() const
+{
+    // retieve vertex 
+    SG::ThinningHandle< xAOD::VertexContainer > vertexContainer(m_vertexContainerNames);
+    std::vector<bool> vtxMask(vertexContainer->size(), true); // default: keep all vertices
+    int vtxTot = 0;
+    int nVtxPass = 0;
+    // loop over vertices
+    int k = 0;
+    std::vector<SG::ReadDecorHandle<xAOD::VertexContainer, Char_t>> handles;
+    handles.reserve(m_passFlags.size());
+    for(const auto &key : m_passFlags){
+        handles.emplace_back(key);
+        if(!handles.back().isPresent()) return StatusCode::FAILURE;
+    }
+    for(auto vtxItr = vertexContainer->cbegin(); vtxItr!=vertexContainer->cend(); ++vtxItr, ++k) {
+      const xAOD::Vertex* vtx = *vtxItr;
+      // check if the vertex passed the required selections criteria (is run when the vertex is already excluded, because the counter needs the info)
+      bool passed = false;
+      if(m_noFlags){passed = true; vtxTot++; }
+      else{
+        for(auto &flagAcc : handles) {
+          if(flagAcc(*vtx) != 0) {
+            passed = true;
+            vtxTot++;//Have to count the ones which are accepted to start with
+            break;
+          }
+        } // end of loop over flags
+      }
+
+      // Skip if it has already been identified as duplicate
+      if(vtxMask[k] == false)continue;  //After the flag-check to have the total-passed work correctly
+
+      if(!passed)vtxMask[k]= false;
+
+      if(passed) {
+          // vertex passed the selection
+    	  nVtxPass++;
+
+          // determine the sum of the tracks at vertex as centre for the cone
+    	  std::vector<const xAOD::TrackParticle*> presentVertex, compareVertex;
+
+    	  //Fill in the present vertex, for later comparison against other vertices
+	          presentVertex.clear();
+		  for(uint j=0; j<vtx->nTrackParticles(); ++j) {
+			presentVertex.push_back(vtx->trackParticle(j));
+		  }
+		  sort( presentVertex.begin(), presentVertex.end() );  //Sort the trackparticles BY POINTER ADDRESS
+
+		  //Loop over the remaining vertices and remove them if needed
+		  int loop_k = k+1;
+		  for(auto vtxLoopItr = vtxItr+1; vtxLoopItr!=vertexContainer->cend(); vtxLoopItr++, loop_k++){
+
+			  const xAOD::Vertex* loop_vtx = *vtxLoopItr;
+
+		      //Vertices are distinct if have different size
+		      if(vtx->nTrackParticles() !=  loop_vtx->nTrackParticles())continue;
+
+			  //If the vertex is still active load and compare
+			  if(vtxMask[loop_k]){
+
+					compareVertex.clear();
+				  for(uint j=0; j<loop_vtx->nTrackParticles(); ++j) {
+					compareVertex.push_back(loop_vtx->trackParticle(j));
+				  } 
+
+				  std::sort( compareVertex.begin(), compareVertex.end());
+
+				  vtxMask[loop_k] = false;
+			
+				  ATH_MSG_DEBUG("Compared tracks: ");
+                  ATH_MSG_DEBUG(std::setw(14)<<compareVertex[0]<<std::setw(14) << compareVertex[1]<<std::setw(14)<<compareVertex[2]);
+                  ATH_MSG_DEBUG(std::setw(14)<<presentVertex[0]<<std::setw(14) << presentVertex[1]<<std::setw(14)<<presentVertex[2]);
+
+				  for(uint j=0; j<loop_vtx->nTrackParticles(); ++j) {
+					if( compareVertex[j] != presentVertex[j] ){vtxMask[loop_k] = true;  break;}
+				  }
+				  ATH_MSG_DEBUG("Verdict:"<<(vtxMask[loop_k]? "keep": "erase") );
+			  }
+
+		  } // Endo of extra loop over remaining vertices
+
+      } // if( passed )
+    } // end of loop over vertices
+    
+    // Execute the thinning service based on the vtxMask.
+    if (m_and) {
+      vertexContainer.keep(vtxMask, SG::ThinningHandleBase::Op::And);
+    }
+    if (!m_and) {
+      vertexContainer.keep(vtxMask, SG::ThinningHandleBase::Op::Or);
+    }
+    
+    m_nVtxTot.fetch_add( vtxTot, std::memory_order_relaxed);
+    m_nVtxPass.fetch_add( nVtxPass, std::memory_order_relaxed);
+
+  
+
+  return StatusCode::SUCCESS;
+}
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Thin_vtxTrk.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Thin_vtxTrk.cxx
new file mode 100644
index 000000000000..14628f870cdc
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/Thin_vtxTrk.cxx
@@ -0,0 +1,200 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/////////////////////////////////////////////////////////////////
+// Thin_vtxTrk.cxx
+///////////////////////////////////////////////////////////////////
+// Author: James Catmore (James.Catmore@cern.ch)
+// This is a trivial example of an implementation of a thinning tool
+// which removes all ID tracks which do not pass a user-defined cut
+
+#include "DerivationFrameworkBPhys/Thin_vtxTrk.h"
+
+#include "xAODBPhys/BPhysHypoHelper.h"
+#include "StoreGate/ThinningHandle.h"
+#include <vector>
+#include <string>
+// Constructor
+DerivationFramework::Thin_vtxTrk::Thin_vtxTrk(const std::string& t, const std::string& n, const IInterface* p ) :
+  AthAlgTool(t,n,p),
+  m_ntot(0),
+  m_npass(0),
+  m_acceptanceR(-1.),  // Do not add tracks within a cone from the vertex by default
+  m_nVtxTot(0),
+  m_nVtxPass(0),
+  m_noFlags(false)
+{
+  declareInterface<DerivationFramework::IThinningTool>(this);
+  
+  declareProperty("TrackParticleContainerName", m_trackParticleContainerName = "InDetTrackParticles");
+  declareProperty("VertexContainerNames"      , m_vertexContainerName);
+  declareProperty("PassFlags"                 , m_passFlags);
+  declareProperty("AcceptanceRadius"          , m_acceptanceR);
+  declareProperty("IgnoreFlags"                   , m_noFlags);
+  declareProperty("ApplyAnd"                  , m_and = false);
+  declareProperty("ApplyAndForTracks"         , m_trackAnd = false);
+  declareProperty("ThinTracks"                , m_thinTracks = true);
+}
+
+// Destructor
+DerivationFramework::Thin_vtxTrk::~Thin_vtxTrk() = default;
+
+// Athena initialize and finalize
+StatusCode DerivationFramework::Thin_vtxTrk::initialize()
+{
+  // Decide which collections need to be checked for ID TrackParticles
+  ATH_MSG_VERBOSE("initialize() ...");
+  ATH_CHECK(m_trackParticleContainerName.initialize(m_streamName));
+
+
+  if( m_noFlags){
+    ATH_MSG_INFO("IgnoreFlags is set, all vertices in the container will be kept");
+  }
+
+  if( ! m_noFlags){
+    if (m_passFlags.empty()) {
+      ATH_MSG_FATAL("No pass flags provided for thinning.");
+      return StatusCode::FAILURE;
+    } else {
+      for(auto itr = m_passFlags.begin(); itr!=m_passFlags.end(); ++itr) {
+        ATH_MSG_INFO("Vertices must pass the \"" << *itr << "\" selection");
+      }
+    }
+  }
+  
+  if (m_acceptanceR > 0.) {
+      ATH_MSG_INFO("Extra tracks must be within cone of "<<m_acceptanceR<<" from vertex candidate.");
+  }
+
+  for(auto &handle : m_vertexContainerName){
+    ATH_CHECK(handle.initialize(m_streamName));
+  }
+  for(const auto &tracknames : m_vertexContainerName){
+     for(const auto &str : m_passFlags){
+        m_passArray.emplace_back(tracknames.key() + '.' + str);
+     }
+  }
+  ATH_CHECK(m_passArray.initialize());
+  return StatusCode::SUCCESS;
+}
+
+StatusCode DerivationFramework::Thin_vtxTrk::finalize()
+{
+  ATH_MSG_VERBOSE("finalize() ...");
+  ATH_MSG_INFO("Processed "<< m_ntot <<" tracks, "<< m_npass<< " were retained ");
+  ATH_MSG_INFO("Processed "<< m_nVtxTot <<" vertices, "<< m_nVtxPass<< " were retained ");
+  
+  return StatusCode::SUCCESS;
+}
+
+// The thinning itself
+StatusCode DerivationFramework::Thin_vtxTrk::doThinning() const
+{
+  // Retrieve main TrackParticle collection
+  SG::ThinningHandle<xAOD::TrackParticleContainer> importedTrackParticles(m_trackParticleContainerName);
+  
+  // Check the event contains tracks
+  unsigned int nTracks = importedTrackParticles->size();
+  if (nTracks==0) return StatusCode::SUCCESS;
+  
+  // Set up a trackMask with the same entries as the full TrackParticle collection
+  std::vector<bool> trackMask(nTracks,false); // default: don't keep any tracks
+  m_ntot += nTracks;
+  int nVtxTot =0;
+  int nVtxPass=0;
+
+  std::unordered_map<std::string, SG::ReadDecorHandle<xAOD::VertexContainer, Char_t>> handles;
+  handles.reserve(m_passArray.size());
+  for(const auto &key : m_passArray){
+        auto it = handles.emplace(key.key(), key);
+        if(!(*it.first).second.isPresent()) return StatusCode::FAILURE;
+  }
+
+  // retieve vertex 
+  for(const auto& name : m_vertexContainerName){
+    SG::ThinningHandle<xAOD::VertexContainer> vertexContainer(name);
+    std::vector<bool> vtxMask(vertexContainer->size(), false); // default: don't keep any vertices
+    
+    // loop over vertices
+    int k = 0;
+    for(auto vtxItr = vertexContainer->begin(); vtxItr!=vertexContainer->end(); ++vtxItr, ++k) {
+      const xAOD::Vertex* vtx = *vtxItr;
+      nVtxTot++;
+      
+      // check if the vertex passed the required selections criteria
+      bool passed = false;
+      for(std::vector<std::string>::const_iterator flagItr = m_passFlags.begin(); flagItr!=m_passFlags.end(); ++flagItr) {
+        std::string lookupstr = name.key() + '.' + (*flagItr);
+        const auto& handle = handles.at(lookupstr);
+        if(handle(*vtx) != 0) {
+          passed = true;
+          break;
+        }
+      } // end of loop over flags
+      
+      if(passed || m_noFlags) {
+        // vertex passed the selection
+    	vtxMask[k] = true;
+    	nVtxPass++;
+
+        // Add tracks according to DR selection
+        if(m_acceptanceR > 0.){
+
+          // determine the sum of the tracks at vertex as centre for the cone
+          TLorentzVector centreCandidate;
+          for(uint j=0; j<vtx->nTrackParticles(); ++j) {
+	    centreCandidate += vtx->trackParticle(j)->p4();
+          }
+
+          for(uint i=0; i<nTracks; ++i) {
+	    if(!trackMask[i]) {  // do this only for tracks that haven't been selected, yet
+	      const xAOD::TrackParticle* track = (*importedTrackParticles)[i];
+	      if(centreCandidate.DeltaR(track->p4()) < m_acceptanceR) trackMask[i]= true;
+	    }
+          }
+        }// end adding tracks according to DR selection
+
+        if(m_thinTracks) {
+          // loop over all tracks
+          for(uint i=0; i<nTracks; ++i) {
+            if(!trackMask[i]) {  // do this only for tracks that haven't been selected, yet
+              const xAOD::TrackParticle* track = (*importedTrackParticles)[i];
+              // loop over tracks at vertex
+              for(uint j=0; j<vtx->nTrackParticles(); ++j) {
+                if(vtx->trackParticle(j) == track) {
+                  trackMask[i] = true;  // accept track
+                }
+              } // end of loop over tracks at vertex
+            }
+          } // end of loop over all tracks
+        }
+      }
+    } // end of loop over vertices
+    
+    // Execute the thinning service based on the vtxMask.
+    if (m_and) {
+      vertexContainer.keep(vtxMask, SG::ThinningHandleBase::Op::And);
+    }
+    if (!m_and) {
+      vertexContainer.keep(vtxMask, SG::ThinningHandleBase::Op::Or);
+    }
+  }
+  
+  // Count up the trackMask contents
+  m_npass += std::accumulate(trackMask.begin(), trackMask.end(), 0);
+  m_nVtxTot += nVtxTot;
+  m_nVtxPass+= nVtxPass;
+  if(m_thinTracks || m_acceptanceR > 0.) {
+    // Execute the thinning service based on the trackMask. Finish.
+    if (m_trackAnd) {
+      importedTrackParticles.keep(trackMask, SG::ThinningHandleBase::Op::And);
+    }
+    if (!m_trackAnd) {
+      importedTrackParticles.keep(trackMask, SG::ThinningHandleBase::Op::Or);
+    }
+  }
+
+  return StatusCode::SUCCESS;
+}
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/TriggerCountToMetadata.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/TriggerCountToMetadata.cxx
new file mode 100644
index 000000000000..58af23444ecf
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/TriggerCountToMetadata.cxx
@@ -0,0 +1,62 @@
+/*
+Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+//============================================================================
+// 
+// Author : Matteo Bedognetti <matteo.bedognetti@cern.ch.>
+// Changes:
+//
+// Store trigger counts for specific chains in the DAOD's MetaData.
+// This allows it to store information about triggers upon which events are NOT selected during the derivation
+//
+// Job options:
+// - TriggerList   -- a vector containing all triggers to store as strings
+// - FolderName -- Is supposed to be the derivation name (some convention I guess)
+// - TrigDecisionTool -- if one wants to pass this a specific TrigDecisionTool
+//                           
+//============================================================================
+//
+
+#include "DerivationFrameworkBPhys/TriggerCountToMetadata.h"
+#include "AthenaPoolUtilities/CondAttrListCollection.h"
+
+#include <memory>
+
+namespace DerivationFramework {
+
+  //--------------------------------------------------------------------------
+  TriggerCountToMetadata::TriggerCountToMetadata(const std::string& t,
+				       const std::string& n,
+				       const IInterface*  p)
+    : CfAthAlgTool(t,n,p),   m_trigDecisionTool( "Trig::TrigDecisionTool/TrigDecisionTool" )
+ {
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+    
+    declareProperty("TrigDecisionTool", m_trigDecisionTool );
+    declareProperty("FolderName",       m_folderName = "DerivationLevel");
+    declareProperty("TriggerList",      m_triggerList);
+
+  }
+  //--------------------------------------------------------------------------
+  StatusCode TriggerCountToMetadata::initialize() {
+    ATH_CHECK(m_trigDecisionTool.retrieve());
+
+    return StatusCode::SUCCESS;
+  }  
+
+  //--------------------------------------------------------------------------
+  StatusCode TriggerCountToMetadata::addBranches() const {
+
+	  ATH_MSG_DEBUG("Inside TriggerCountToMetadata::addBranches()");
+
+	  // W.w. method
+	  addEvent("AllEvents");
+
+	  for( unsigned int i=0; i<m_triggerList.size(); i++){
+	  	addEvent(m_triggerList[i] , m_trigDecisionTool->isPassed(m_triggerList[i]) );
+	  }
+
+	  return StatusCode::SUCCESS;
+  }  
+
+}  // End of namespace DerivationFramework
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/VertexCaloIsolation.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/VertexCaloIsolation.cxx
new file mode 100644
index 000000000000..c47d71389e39
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/VertexCaloIsolation.cxx
@@ -0,0 +1,583 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// VertexCaloIsolation.cxx by Matteo Bedognetti
+//
+// This code is based on CaloIsolationTool of IsolationTools package
+//
+// Etcone is determined as a topoCluster-isolation value minus Energy Density (ED) correction and minus the energy depositions of the muons
+// Muon's energy deposition is already stored in side the xAOD::Muon objects, but the muon-clusters are used to correct for the fact that they muons may have overlapping clusters
+// The muon-clusters are stored as well in connection with the muons themselves
+//
+// The idea of comparing topoClusters with muon-clusters to decide what part of the muon's deposition is of 
+// importance had to be abandoned because topCluster cells are not present in xAOD
+//
+// It enforces the fact that for muons no core-surface is removed for the energy-density correction (thus the corrections are independent from each other)
+//
+// "isReliable" flag reports of each isolation value if all particles crossing the cone have been correctly corrected for.
+// In the case of 2mu+ 1 track it mirrors the fact that the track does not extrapolate into the cone (as tracks have no muon-cluster from which to determine the core-correction)
+//
+
+
+
+
+#include "DerivationFrameworkBPhys/VertexCaloIsolation.h"
+
+#include <vector>
+#include <string>
+#include "TVector3.h"
+
+#include "xAODTracking/VertexContainer.h"
+#include "xAODTracking/VertexAuxContainer.h"
+#include "xAODBPhys/BPhysHelper.h"
+#include "xAODBPhys/BPhysHypoHelper.h"
+#include "TrkVertexAnalysisUtils/V0Tools.h"
+
+//#include "IsolationTool/CaloIsolationTool.h"
+//#include "IsolationTool/CaloIsolationTool.h"
+
+#include "RecoToolInterfaces/ICaloTopoClusterIsolationTool.h"
+
+//#include "IsolationTool/IsolationHelper.h"
+//#include "InDetTrackSelectionTool/InDetTrackSelectionTool.h"
+#include "CaloEvent/CaloCell.h"	//Is used (though shown as auto)
+//#include "TrkParameters/TrackParameters.h"
+#include "CaloInterface/ICaloNoiseTool.h"
+#include "TrkCaloExtension/CaloExtension.h"
+//#include "CaloUtils/CaloClusterStoreHelper.h"
+//#include "CaloUtils/CaloCellList.h"
+//#include "CaloEvent/CaloCellContainer.h"
+#include "xAODTracking/TrackingPrimitives.h"
+#include "xAODPrimitives/IsolationHelpers.h"
+#include "TrackToCalo/CaloCellCollector.h"
+#include <set>
+
+//#include "Identifier/Identifier32.h"
+using namespace std;
+namespace DerivationFramework {
+
+  VertexCaloIsolation::VertexCaloIsolation(const std::string& t,
+      const std::string& n,
+      const IInterface* p) : 
+    AthAlgTool(t,n,p),
+    m_caloIsoTool("xAOD::CaloIsolationTool/CaloIsolationTool"),
+    m_trackContainerName("InDetTrackParticles"),
+    m_vertexContainerName("NONE"),
+    m_caloClusterContainerName("CaloCalTopoClusters"),
+    m_muonContainerName("Muons"),
+    m_caloExtTool("Trk::ParticleCaloExtensionTool/ParticleCaloExtensionTool"),
+    //m_caloNoiseTool(""),
+    m_cones(),
+    m_sigmaCaloNoiseCut(3.4),
+    m_vertexType(7)
+
+
+   // m_cellCollector("")
+
+
+//  m_caloExtTool
+//  m_caloNoiseTool, m_applyCaloNoiseCut, m_sigmaCaloNoiseCut
+//  m_cellCollector
+
+  {
+        ATH_MSG_DEBUG("in constructor");
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+    
+    // Declare tools                      
+    declareProperty("CaloIsoTool" , m_caloIsoTool);
+    declareProperty("TrackContainer" , m_trackContainerName);
+    declareProperty("InputVertexContainer" , m_vertexContainerName);
+    declareProperty("CaloClusterContainer" , m_caloClusterContainerName);
+    declareProperty("ParticleCaloExtensionTool",       m_caloExtTool);
+    declareProperty("MuonContainer",       m_muonContainerName);
+    declareProperty("PassFlags"                 , m_passFlags);
+    declareProperty("IsolationTypes"                 , m_cones);
+    declareProperty("DoVertexTypes"                 , m_vertexType);
+
+
+
+  }
+
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
+  
+  StatusCode VertexCaloIsolation::initialize()
+  {
+  
+    ATH_MSG_DEBUG("in initialize()");
+ 
+    // retrieve CaloIsolationTool
+    CHECK( m_caloIsoTool.retrieve() );
+    
+    // retrieve CaloIsolationTool
+    CHECK( m_caloExtTool.retrieve() );
+
+    //Check that flags were given to tag the correct vertices
+    if(m_passFlags.empty()){
+        ATH_MSG_WARNING("As no pass-flags are given, no vertices will be decorated");
+    }
+
+    // Control the IsolationType sequence
+    if(m_cones.empty()){
+	    m_cones.push_back(xAOD::Iso::etcone40);
+	    m_cones.push_back(xAOD::Iso::etcone30);
+	    m_cones.push_back(xAOD::Iso::etcone20);
+    }
+
+    //if(m_applyCaloNoiseCut){
+            //ATH_MSG_ERROR("No handle to a caloNoiseTool is kept in this tool, ");
+            //return StatusCode::FAILURE;
+    //}
+
+    return StatusCode::SUCCESS;
+    
+  }
+  
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
+
+  StatusCode VertexCaloIsolation::finalize()
+  {
+    // everything all right
+    return StatusCode::SUCCESS;
+  }
+
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
+  
+  StatusCode VertexCaloIsolation::addBranches() const {
+
+
+	  // There is also the "MuonClusterCollection" which may already contain all the muon's clusters
+
+    const xAOD::TrackParticleContainer*    idTrackParticleContainer = NULL;
+    const xAOD::VertexContainer*  vertexContainer = NULL;
+
+    Rec::CaloCellCollector  cellCollector;  //To keep private dependence for this package it is used here
+
+
+    const xAOD::MuonContainer* muons = NULL;
+
+
+    //Load InDetTrackParticles
+    if(evtStore()->contains<xAOD::TrackParticleContainer>(m_trackContainerName)) {
+        CHECK( evtStore()->retrieve(idTrackParticleContainer, m_trackContainerName) );
+    }
+    else{ATH_MSG_ERROR("Failed loading IdTrackparticleContainer container");
+    	return StatusCode::FAILURE;
+    }
+
+    //	load vertices
+    if(evtStore()->contains<xAOD::VertexContainer>(m_vertexContainerName)) {
+        CHECK( evtStore()->retrieve(vertexContainer, m_vertexContainerName) );
+    }
+    else{ATH_MSG_ERROR("Failed loading vertex container");
+    	return StatusCode::FAILURE;
+    }
+
+
+    const xAOD::CaloClusterContainer*  caloClusterContainer = NULL;
+    //  load CaloCalTopoClusters
+    if(evtStore()->contains<xAOD::CaloClusterContainer>(m_caloClusterContainerName)) {
+        CHECK( evtStore()->retrieve(caloClusterContainer, m_caloClusterContainerName) );
+    }
+    else{ATH_MSG_ERROR("Failed loading vertex container");
+    	return StatusCode::FAILURE;
+    }
+
+
+    //Retrieve muon container
+    if(evtStore()->contains<xAOD::MuonContainer>(m_muonContainerName)) {
+        CHECK( evtStore()->retrieve(muons, m_muonContainerName) );
+    }
+    else{ATH_MSG_ERROR("Failed loading muon contianer");
+    	return StatusCode::FAILURE;
+    }
+
+
+//-------------------------------------------------
+
+    std::vector<xAOD::Iso::IsolationType> cones; cones.resize(m_cones.size());
+
+//    for(unsigned int cone : m_cones)
+//    	cones.push_back(xAOD::Iso::IsolationType(cone));
+
+    for (unsigned int i =0; i< m_cones.size(); i++)
+    	cones[i] = xAOD::Iso::IsolationType(m_cones[i]);
+
+
+
+    //Loop over vertices
+    for(auto vertex : *vertexContainer){
+
+      bool passed = false;
+      for(std::vector<std::string>::const_iterator flagItr = m_passFlags.begin(); flagItr!=m_passFlags.end(); ++flagItr) {
+        SG::AuxElement::Accessor<Char_t> flagAcc(*flagItr);
+        if(flagAcc.isAvailable(*vertex) && flagAcc(*vertex) != 0) {
+          passed = true;
+          break;
+        }
+      } // end of loop over flags
+      if(passed){
+    	ATH_MSG_DEBUG("Entered loop over vertices");
+    	if(vertex->trackParticleLinks().size() != 3)ATH_MSG_WARNING("Vertex without 3 tracks, it has "<< vertex->trackParticleLinks().size() <<" instead");
+
+		TLorentzVector candidate;
+
+		std::set<const xAOD::TrackParticle*> exclusionset;
+
+		for(auto part : vertex->trackParticleLinks()){ //Loop over tracks linked to vertex
+			candidate += (*part)->p4();
+			exclusionset.insert( *part ); //If it crashes use the direct TP from the vertex
+		}
+
+	    //List of corrections: only the pileup correction is applied within the tool
+		xAOD::CaloCorrection corrlist;
+		corrlist.calobitset.set(static_cast<unsigned int>(xAOD::Iso::pileupCorrection));
+
+
+
+	    std::vector<const xAOD::Muon*> vtxMuons;
+	    std::vector<TLorentzVector> extrVtxMuons ;
+	    std::vector<const xAOD::CaloCluster*> vtxMuonCluster;
+
+	    std::vector<const xAOD::TrackParticle*> usedVtxTracks;
+	    //The information whether we are missing some core-corrections in the final isolation value
+	    map<xAOD::Iso::IsolationType, bool> is_reliable;
+
+
+    	    TLorentzVector muonref;  //Place holder for the extrapolated position
+	    //Load the caloclusters of the various muons (which you need to load from here)
+	    const xAOD::MuonContainer* muons = 0;
+	    CHECK( evtStore()->retrieve( muons, "Muons" ) );
+	    for ( auto muon : *muons ) {
+	    	//I ask for all information to be fine before filling in an entry (so all containers will have the same -matching- objects)
+	    	if(muon->inDetTrackParticleLink().isValid() &&  exclusionset.find(*muon->inDetTrackParticleLink() ) != exclusionset.end() ){
+	 	       const xAOD::CaloCluster* clus = muon->cluster();
+				   if(clus && extrapolateMuon(muonref, clus)){
+					   // have a muon, an extrapolation and a cluster (hurray)
+					   vtxMuonCluster.push_back(clus);
+					   vtxMuons.push_back(muon);
+					   usedVtxTracks.push_back( *muon->inDetTrackParticleLink() );
+					   extrVtxMuons.push_back(muonref);
+				   }else{
+				     ATH_MSG_DEBUG("Cannot find clusters. Would need a consistent set of Trk::Tracks to run extrapolation.");
+
+					   // //If working with the cluster failed, try extrapolating the track
+					   // if(extrapolateTrack(muonref, *muon)){ //This does not use the muonic cluster, but uses both its tracks to determine a precise position
+					   // 	   vtxMuonCluster.push_back(clus); //Note clus can also be NULL (for if it's not in the cone there is no point to fret)
+					   // 	   vtxMuons.push_back(muon);
+					   // 	   usedVtxTracks.push_back( *muon->inDetTrackParticleLink() );
+					   // 	   extrVtxMuons.push_back(muonref);
+					   //}
+				   }
+	    	}
+	    }
+
+
+	    //What if there was a track and not a muon??
+	    //Should be treated like the muon-without-cluster case
+
+	    if(vtxMuonCluster.size()  !=3){  //remember that some of the ctxMuonCluster elements may be NULL
+		    ATH_MSG_DEBUG( "Attempt at extrapolating the IDtrack" );
+
+		    //Attempt extrapolating the IDtrack for the missing cases
+		    for(const xAOD::TrackParticle* missingTrk : exclusionset){
+		    	if(std::find(usedVtxTracks.begin(), usedVtxTracks.end(), missingTrk) == usedVtxTracks.end()){
+				if(extrapolateTrack(muonref, *missingTrk)){
+					vtxMuonCluster.push_back(NULL); //Null, for we didn't start from a muon
+					usedVtxTracks.push_back( missingTrk );
+					extrVtxMuons.push_back(muonref);
+				}
+			}
+		    }
+
+		    //If there are still missing ones values cannot be guaranteed to be reliable
+	            if(vtxMuonCluster.size()  !=3){
+                       	ATH_MSG_DEBUG( "For this vertex there were less than 3 muons found (or extrapolated)" );
+		        for(xAOD::Iso::IsolationType isoCone : cones) is_reliable[isoCone] = false;
+                    }
+	    }
+	    else{
+		    for(xAOD::Iso::IsolationType isoCone : cones)
+		    	is_reliable[isoCone] = true;
+	    }
+
+
+	    // Adapt this loop!
+
+		 for(unsigned int vertex_type = 0 ; vertex_type<= xAOD::BPhysHelper::PV_MIN_Z0 ; vertex_type++ ){
+
+			if((m_vertexType & (1 << vertex_type ) ) == 0)continue; //Stop if the type of vertex is not required
+
+			//This can be in an inside loop
+
+			xAOD::BPhysHelper::pv_type this_type = static_cast<xAOD::BPhysHelper::pv_type>( vertex_type );
+
+			xAOD::TrackParticle candidate_slyTrack;
+			makeSlyTrack(candidate_slyTrack, candidate, vertex, this_type);
+
+
+			xAOD::CaloIsolation result;
+
+			ATH_MSG_DEBUG("Check if the caloclus container has to be given or not... see line from 755 on of CaloIsolationTool");
+
+			bool successful = m_caloIsoTool->caloTopoClusterIsolation(result, candidate_slyTrack, cones, corrlist, caloClusterContainer);
+			if( !successful ) {
+			  ATH_MSG_DEBUG("Calculation of caloTopoClusterIsolation failed");
+				 return StatusCode::FAILURE;
+			}
+
+			// Make the extension to the calorimeter, as it is done inside the other tools...
+			TLorentzVector extr_candidate;
+			if( !extrapolateTrack(extr_candidate, candidate_slyTrack) ){
+				ATH_MSG_WARNING("Failure extrapolating the slyTrack "<<"pt="<<candidate_slyTrack.pt()<<" eta="<<candidate_slyTrack.eta()<<" phi="<<candidate_slyTrack.phi());
+				ATH_MSG_WARNING("Taking the original coordinates");
+			}
+
+
+				 std::map<xAOD::Iso::IsolationType,float> coreCorrections;
+
+				//See if this is inside the cone, to determine the correct correction ^^
+				for(xAOD::Iso::IsolationType isoType : cones){
+
+					double conesize = xAOD::Iso::coneSize(isoType);
+					//check what is inside the cone
+					std::vector<xAOD::CaloCluster> clustersInCone;
+
+					for(unsigned int j=0; j < vtxMuonCluster.size(); j++){
+						auto mucluster = vtxMuonCluster[j];
+						// I should use the propagated values here, though the variation is very small, coming from the vertex position
+						float dr=extrVtxMuons[j].DeltaR(extr_candidate);
+
+
+
+						ATH_MSG_DEBUG("Cone size: "<<conesize<<" dr="<<dr);
+						ATH_MSG_DEBUG(extrVtxMuons[j].Eta() <<" - "<<extr_candidate.Eta()<<" and "<<extrVtxMuons[j].Phi() <<" - "<<extr_candidate.Phi());
+
+						if(	dr < conesize ){       //This makes a copy, such that I can remove some cells if needed
+
+
+							//here do the check for the cluster, if it should go in, then prevent and set the bad for this cone
+							if(mucluster != NULL) clustersInCone.push_back( xAOD::CaloCluster(*mucluster) );
+							else is_reliable[isoType] = false;
+
+
+
+						}
+					}
+
+	//			    ATH_MSG_DEBUG("Muon clusters in cone "<<xAOD::Iso::toString(isoType)<<"  "<< clustersInCone.size());
+	//			    if( msgLvl(MSG::DEBUG) ){
+	//					for(auto muon : vtxMuons)
+	//						if(muon->isAvailable<float>("ET_Core"))	ATH_MSG_DEBUG("ET_core stored inside: "<< muon->auxdataConst<float>("ET_Core") );
+	//			    }
+					//remove eventually doubles in cells
+					if(clustersInCone.size() == 2){
+						for(auto cell : clustersInCone[0]){
+							clustersInCone[1].removeCell(cell);
+						}
+					}
+					if(clustersInCone.size() == 3){
+						for(auto cell : clustersInCone[0]){
+							clustersInCone[1].removeCell(cell);
+							clustersInCone[2].removeCell(cell);
+						}
+						for(auto cell : clustersInCone[1]){
+							clustersInCone[2].removeCell(cell);
+						}
+					}
+
+					//Calculate the core-correction
+					std::vector<float> etcore(4, 0.);
+					float coreCorr=0.;
+					for(auto cl : clustersInCone){
+						if(cl.size() != 0){	//Maybe two muons have a full cluster overlap??
+							ATH_MSG_DEBUG("Cells in this cluster: "<< cl.size());
+                                                         
+							cellCollector.collectEtCore( cl, etcore, nullptr, m_sigmaCaloNoiseCut );  //Note an empty handle to ICaloNoiseTool is passed
+							coreCorr += etcore[Rec::CaloCellCollector::ET_Core];
+							ATH_MSG_DEBUG("Their core-energy: "<< etcore[Rec::CaloCellCollector::ET_Core]);
+
+						}
+					}
+
+					//Store the core-correction
+					coreCorrections[isoType] = coreCorr;
+
+				}
+
+				//For a pion I have no such cone energy, do I? But then I should also see what the original vertex was
+				//If something is not a muon there is no way the calocluster was stored, I think
+				//Would need further study
+
+
+			//Collect all the required information
+			string ED("_EDcorr");
+			string core("_COREcorr");
+			string reliable("_isReliable");
+
+
+			string vtx_type[3] = {"SumPt", "A0", "Z0"};
+
+			string vtx = vtx_type[ vertex_type ];
+
+			ATH_MSG_DEBUG("Detailed: ");
+			for(unsigned int i=0; i< cones.size(); i++){
+				xAOD::Iso::IsolationType isoType = cones[i];
+				result.etcones[i] -= coreCorrections[isoType];  //Finish correcting the energy
+
+
+	//	    	if(fabs(result.etcones[i]) < 0.1){
+	//
+	//	    	ATH_MSG_INFO("Isolation: "<<xAOD::Iso::toString(isoType) ); // The name of the isolation
+	//	    	ATH_MSG_ERROR(result.etcones[i]<<" + "<<(result.noncoreCorrections[xAOD::Iso::pileupCorrection])[i]<<" + "<<coreCorrections[isoType] );
+	//	    	}
+
+				//Here do the decoration (store all, and as well if three muons are found)
+
+
+				string variableName = xAOD::Iso::toString(isoType) + vtx; //I corrected for the closest vertex in A0
+				SG::AuxElement::Decorator<float> isolation(variableName);
+				isolation(*vertex) = result.etcones[i];
+
+				isolation = SG::AuxElement::Decorator<float>(variableName + ED);
+				isolation(*vertex) = (result.noncoreCorrections[xAOD::Iso::pileupCorrection])[i];
+
+				isolation = SG::AuxElement::Decorator<float>(variableName + core);
+				isolation(*vertex) = coreCorrections[isoType];
+
+				//This variable contains the info whether 3 caloclusters have been found in the muons
+				//Future would be to see if their extrapolations are of interest anyhow (if not missing them is no issue)
+				//Fore some reason these seem to become chars (instead of bools) in the output
+				SG::AuxElement::Decorator<bool> reliability(variableName + reliable);
+				reliability(*vertex) = is_reliable[isoType];
+
+			}
+		 } //Loop over primaryVertex choice
+
+	    //Decorate the candidate with the new information
+
+
+//		 return StatusCode::SUCCESS;
+//
+//	    ///////////////////////////////////
+
+      }
+
+//END OF NEW PART
+    }//End of loop over vertices
+    return StatusCode::SUCCESS;
+  }
+
+  //Note that the full version had a different method for muons!!!! Maybe I should use that one instead!
+
+  //This is almost a perfect copy of CaloIsolationTool::GetExtrapEtaPhi, but only for the part relative to tracks
+  bool VertexCaloIsolation::extrapolateTrack(TLorentzVector& extr_tp, const xAOD::IParticle& tp) const{
+  	extr_tp = tp.p4(); //Pre-set the output TLorentzVector to the input's 4-momentum
+  	ATH_MSG_ERROR("VertexCaloIsolation::extrapolateTrack needs to be rewritten because of changes to the caloExtension");
+  	throw std::runtime_error("VertexCaloIsolation::extrapolateTrack needs to be rewritten because of changes to the caloExtension");
+/*
+	    
+
+		const Trk::CaloExtension* caloExtension = 0;
+		if(!m_caloExtTool->caloExtension(tp,caloExtension)){
+		  ATH_MSG_WARNING("Can not get caloExtension.");
+		  return false;
+		}
+
+		const std::vector<const Trk::CurvilinearParameters*>& intersections = caloExtension->caloLayerIntersections();
+		if (intersections.size()>0) {
+			Amg::Vector3D avePoint(0,0,0);
+			for (unsigned int i = 0; i < intersections.size(); ++i){
+			  const Amg::Vector3D& point = intersections[i]->position();
+			  avePoint += point;
+			}
+			avePoint = (1./intersections.size())*avePoint;
+
+
+			extr_tp.SetPtEtaPhiE(1., avePoint.eta(), avePoint.phi(), 10.); //Using the three-vector constructor
+			//eta = avePoint.eta();
+			//phi = avePoint.phi();
+			ATH_MSG_DEBUG("Successfully extrapolated candidate eta/phi : "<<tp.eta()<<"/"<<tp.phi()<<" --> "<< extr_tp.Eta()<<"/"<<extr_tp.Phi());
+
+		  }
+		else{	//This is very unlikely, it happens if a few cases in MC
+			ATH_MSG_WARNING("Candidate extrapolation failed. Keeping track's eta/phi values");
+			return false;
+
+		}
+
+	  return true;
+*/
+
+  }
+
+  //Version for the muons
+  bool VertexCaloIsolation::extrapolateMuon(TLorentzVector& extr_tp, const xAOD::CaloCluster* cluster) const
+  {
+      //auto cluster = mu->cluster(); //done outside
+      if(cluster){
+        float etaT = 0, phiT = 0;
+        int nSample = 0;
+        for(unsigned int i=0; i<CaloSampling::Unknown; i++) // dangerous?
+        {
+          auto s = static_cast<CaloSampling::CaloSample>(i);
+          if(!cluster->hasSampling(s)) continue;
+          //ATH_MSG_DEBUG("Sampling: " << i << "eta-phi (" << cluster->etaSample(s) << ", " << cluster->phiSample(s) << ")");
+          etaT += cluster->etaSample(s);
+          phiT += cluster->phiSample(s);
+          nSample++;
+        }
+        if(nSample>0){
+
+            extr_tp.SetPtEtaPhiE(1., etaT/nSample, phiT/nSample, 10.); //Using the three-vector constructor
+            return true ;
+
+        }else{
+          ATH_MSG_WARNING("Muon calo cluster is empty????");
+          return false;
+        }
+      }else{
+        ATH_MSG_WARNING("Muon calo cluster not found. Calo extension can not be obtained!!!");
+        return false;
+      }
+   }
+
+  //Make a sly track to be fed to the CaloIsolationTool
+  xAOD::TrackParticle&  VertexCaloIsolation::makeSlyTrack(xAOD::TrackParticle& candidate_slyTrack, const TLorentzVector& candidate, const xAOD::Vertex* vertex, xAOD::BPhysHelper::pv_type vertexType) const {
+
+		candidate_slyTrack.makePrivateStore();
+		candidate_slyTrack.setDefiningParameters(0, 0., candidate.Phi(), candidate.Theta(), 0. );  // avoided q/p = 1./candidate.P()
+
+		//I should set the correct d0 and z0, while setting momentum to enormous, to obtain a straight line
+		//I fear that q/p == 0 might cause some divide by 0, though.
+
+		//Somewhere this information will be checked, so I need to provide it
+		SG::AuxElement::Decorator<uint8_t> hypothesis("particleHypothesis");
+		hypothesis(candidate_slyTrack) = xAOD::undefined;  //Value 99 as none of the common types (muon, pion, kaon, etc.)
+		SG::AuxElement::Decorator<std::vector<float> > covmat( "definingParametersCovMatrix" );
+		covmat(candidate_slyTrack) = std::vector<float>(25, 0.); // I am saying that there are no errors on my parameters
+		//The precision goes down a bit, but it's a matter of 10e-7 with our values of interest
+
+		xAOD::BPhysHelper vertex_h(vertex); //Use the BPhysHelper to access vertex quantities
+
+		SG::AuxElement::Decorator<float> vx( "vx" );
+		vx(candidate_slyTrack) = vertex_h.pv(vertexType)->x();
+
+		SG::AuxElement::Decorator<float> vy( "vy" );
+		vy(candidate_slyTrack) = vertex_h.pv(vertexType)->y();
+
+		SG::AuxElement::Decorator<float> vz( "vz" );
+		vz(candidate_slyTrack) = vertex_h.pv(vertexType)->z();
+		//The precision goes down a bit, but it's a matter of 10e-7 with our values of interest
+
+	    return candidate_slyTrack;
+
+
+  }
+
+
+
+
+}//End of namespace DerivationFramework
+
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/VertexPlus1TrackCascade.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/VertexPlus1TrackCascade.cxx
new file mode 100644
index 000000000000..b3c4c221dd4a
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/VertexPlus1TrackCascade.cxx
@@ -0,0 +1,215 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+
+#include "DerivationFrameworkBPhys/VertexPlus1TrackCascade.h"
+
+#include "TrkVertexFitterInterfaces/IVertexFitter.h"
+#include "TrkVKalVrtFitter/TrkVKalVrtFitter.h"
+#include "TrkToolInterfaces/ITrackSelectorTool.h"
+
+namespace DerivationFramework {
+
+
+    typedef std::vector<const xAOD::TrackParticle*> TrackBag;
+
+    StatusCode VertexPlus1TrackCascade::initialize() {
+
+        // retrieving vertex Fitter
+        if ( m_iVertexFitter.retrieve().isFailure() ) {
+            ATH_MSG_FATAL("Failed to retrieve tool " << m_iVertexFitter);
+            return StatusCode::FAILURE;
+        } else {
+            ATH_MSG_DEBUG("Retrieved tool " << m_iVertexFitter);
+        }
+        
+        // Get the track selector tool from ToolSvc
+        if ( m_trkSelector.retrieve().isFailure() ) {
+            ATH_MSG_FATAL("Failed to retrieve tool " << m_trkSelector);
+            return StatusCode::FAILURE;
+        } else {
+            ATH_MSG_DEBUG("Retrieved tool " << m_trkSelector);
+        }
+        if(!m_vertexContainerKey.key().empty()) ATH_CHECK(m_vertexContainerKey.initialize());
+	if(!m_TrackPContainerKey.key().empty()) ATH_CHECK(m_TrackPContainerKey.initialize());
+	if(!m_MuonsUsedInJpsiKey.key().empty()) ATH_CHECK(m_MuonsUsedInJpsiKey.initialize());
+
+        return StatusCode::SUCCESS;
+    }
+
+    StatusCode VertexPlus1TrackCascade::finalize() {
+        
+        return StatusCode::SUCCESS;
+        
+    }
+
+    VertexPlus1TrackCascade::VertexPlus1TrackCascade(const std::string& t, const std::string& n, const IInterface* p)  : AthAlgTool(t,n,p),
+    m_vertexContainerKey(""),
+    m_TrackPContainerKey(""),
+    m_MuonsUsedInJpsiKey(""),
+    m_Vtx1MassConstraint(0.),
+    m_Vtx2MassConstraint(0.0),
+    m_trkThresholdPt(0.0),
+    m_trkMaxEta(102.5),
+//    m_BThresholdPt(0.0),
+//    m_BMassUpper(0.0),
+//    m_BMassLower(0.0),
+    m_roughMassLower(0.0),
+    m_roughMassUpper(0.0),
+    m_iVertexFitter("Trk::TrkVKalVrtFitter"),
+    m_trkSelector("InDet::TrackSelectorTool")
+    {
+       declareProperty("InitialVertices", m_vertexContainerKey);
+       declareProperty("TrackParticleCollection", m_TrackPContainerKey);
+       declareProperty("MuonCollection", m_MuonsUsedInJpsiKey);
+       declareProperty("MassHypthesis", m_massHypothesis);
+       declareProperty("MassContraintTracksVtx1", m_massConstraintTracksVtx1);
+       declareProperty("MassContraintTracksVtx2", m_massConstraintTracksVtx2);
+
+       declareProperty("Vtx1MassConstraint", m_Vtx1MassConstraint);
+       declareProperty("Vtx2MassConstraint", m_Vtx2MassConstraint);
+
+       declareProperty("trkThresholdPtCut", m_trkThresholdPt);
+       declareProperty("trkMassEtaCut", m_trkMaxEta);
+//       declareProperty("BThresholdPtCut", m_BThresholdPt);
+//       declareProperty("BMassUpperCut", m_BMassUpper);
+//       declareProperty("BMassLowerCut", m_BMassLower);
+
+       declareProperty("RoughMassUpperCut", m_roughMassLower);
+       declareProperty("RoughMassLowerCut", m_roughMassUpper);
+
+    }
+
+    VertexPlus1TrackCascade::~VertexPlus1TrackCascade(){ }
+
+    double VertexPlus1TrackCascade::getInvariantMass(const TrackBag &Tracks, const std::vector<double> &massHypotheses){
+
+      TLorentzVector total;
+      total.SetVectM(Tracks[0]->p4().Vect(), massHypotheses[0]);
+      TLorentzVector temp;
+      for(size_t i=1; i < Tracks.size(); i++){
+           temp.SetVectM(Tracks[i]->p4().Vect(), massHypotheses[i]);
+           total += temp;
+      }
+      return total.M();
+    }
+
+    bool VertexPlus1TrackCascade::isContainedIn(const xAOD::TrackParticle* theTrack, const xAOD::MuonContainer* theColl) {
+        bool isContained(false);
+        for (auto muItr=theColl->cbegin(); muItr!=theColl->cend(); ++muItr) {
+            auto& link = ( *muItr )->inDetTrackParticleLink();
+            if ( link.isValid() && ( *link == theTrack ) ) {isContained=true; break;}
+        }
+        return isContained;
+    }
+
+    StatusCode VertexPlus1TrackCascade::performSearch(std::vector<Trk::VxCascadeInfo*> *cascadeinfoContainer) const
+    {
+        ATH_MSG_DEBUG( "VertexPlus1TrackCascade::performSearch" );
+        assert(cascadeinfoContainer!=nullptr);
+        SG::ReadHandle<xAOD::VertexContainer>  vertexContainer(m_vertexContainerKey);
+        if(!vertexContainer.isValid()){
+            ATH_MSG_ERROR("No VertexContainer with key " << m_vertexContainerKey.key() << " found in StoreGate. BCandidates will be EMPTY!");
+            return StatusCode::FAILURE;
+        }
+
+        // Get tracks
+        SG::ReadHandle<xAOD::TrackParticleContainer> TrackPContainer(m_TrackPContainerKey);
+        if(!TrackPContainer.isValid()){
+            ATH_MSG_ERROR("No track particle collection with name " << m_TrackPContainerKey.key() << " found in StoreGate!");
+            return StatusCode::FAILURE;
+        }
+
+
+        // Get the muon collection used to build the J/psis
+        const xAOD::MuonContainer*  importedMuonCollection = nullptr;
+        if (!m_MuonsUsedInJpsiKey.key().empty()) {
+            SG::ReadHandle<xAOD::MuonContainer>  handle(m_MuonsUsedInJpsiKey);
+            if(handle.isValid()) importedMuonCollection = handle.cptr();
+            else {
+              ATH_MSG_FATAL("problem retrieving MuonContainer " << m_MuonsUsedInJpsiKey.key());
+              return StatusCode::FAILURE;
+            }
+            ATH_MSG_DEBUG("Muon container size "<< importedMuonCollection->size());
+        }
+        
+        // Select the inner detector tracks
+        TrackBag theIDTracksAfterSelection;
+        for (auto tp : *TrackPContainer){
+            if ( tp->pt()<m_trkThresholdPt ) continue;
+            if ( fabs(tp->eta())>m_trkMaxEta ) continue;
+            if (importedMuonCollection!=NULL) {
+                if (isContainedIn(tp, importedMuonCollection)) continue;
+            }
+            if ( m_trkSelector->decision(*tp, NULL) ) theIDTracksAfterSelection.push_back(tp);
+        }
+
+        const std::vector<double> &fullMassHypoth = (m_massHypothesis);
+        const std::vector<double> initialVertexMassHypo(fullMassHypoth.begin(), fullMassHypoth.end()-1);
+
+        TrackBag originalVertexTracks(initialVertexMassHypo.size());
+        TrackBag secondVertexTracks(fullMassHypoth.size());
+
+        const std::vector< Trk::VertexID > emptyVtxList;
+        TrackBag ConstraintTracksVtx1(m_massConstraintTracksVtx1.size());
+        TrackBag ConstraintTracksVtx2(m_massConstraintTracksVtx2.size());        
+
+        assert(fullMassHypoth.size() == secondVertexTracks.size());
+
+        for(auto vertex : *vertexContainer){ //Iterate over previous vertices
+
+	   size_t OriginaltrackNum = vertex->nTrackParticles();
+           if(initialVertexMassHypo.size() != OriginaltrackNum){
+               ATH_MSG_FATAL("Mass hypothesis not correctly set");
+               return StatusCode::FAILURE;
+           }
+           for(size_t i = 0;i<OriginaltrackNum;i++) 
+              originalVertexTracks[i] = secondVertexTracks[i] =  (vertex->trackParticle(i));
+           
+           for(auto newtrack : theIDTracksAfterSelection){
+              //Skip any track already used in vertex
+              if(std::find(originalVertexTracks.begin(), originalVertexTracks.end(), newtrack) != originalVertexTracks.end()) continue;
+
+              secondVertexTracks.back() = newtrack;
+
+              double roughmass = getInvariantMass(secondVertexTracks, fullMassHypoth);
+
+              if(m_roughMassUpper > 0.0 && (roughmass < m_roughMassLower || roughmass > m_roughMassUpper)) continue;
+
+              std::unique_ptr<Trk::IVKalState> state = m_iVertexFitter->makeState();
+              m_iVertexFitter->setRobustness( 0, *state );
+
+              auto vID1 = m_iVertexFitter->startVertex( originalVertexTracks, initialVertexMassHypo, *state );
+              auto vID2 = m_iVertexFitter->nextVertex( secondVertexTracks, fullMassHypoth, *state );
+
+              if(!m_massConstraintTracksVtx1.empty()){
+                  for(size_t i =0; i<m_massConstraintTracksVtx1.size(); i++) ConstraintTracksVtx1[i] = originalVertexTracks.at(m_massConstraintTracksVtx1[i]);
+                  if( !m_iVertexFitter->addMassConstraint( vID1, ConstraintTracksVtx1, emptyVtxList, *state, m_Vtx1MassConstraint ).isSuccess() ) {
+                      ATH_MSG_WARNING( "cascade fit: addMassConstraint failed" );
+                  }
+              }
+
+              if(!m_massConstraintTracksVtx2.empty()){
+                  for(size_t i =0; i<m_massConstraintTracksVtx2.size(); i++) ConstraintTracksVtx2[i] = secondVertexTracks.at(m_massConstraintTracksVtx2[i]);
+                  if( !m_iVertexFitter->addMassConstraint( vID2, ConstraintTracksVtx2, emptyVtxList,*state, m_Vtx2MassConstraint ).isSuccess() ) {
+                      ATH_MSG_WARNING( "cascade fit: addMassConstraint failed" );
+                  }
+              }
+              
+              auto result  = m_iVertexFitter->fitCascade(*state);
+              if(result ==nullptr ){  ATH_MSG_WARNING("Cascade Fit failed"); continue; }
+              assert(result->vertices().size()==2);
+              cascadeinfoContainer->push_back(result);
+              
+           }
+
+        }
+        ATH_MSG_DEBUG("cascadeinfoContainer size " << cascadeinfoContainer->size());
+        return StatusCode::SUCCESS;
+    }
+
+
+}
+
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/VertexTrackIsolation.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/VertexTrackIsolation.cxx
new file mode 100644
index 000000000000..7ce8df7972fe
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/VertexTrackIsolation.cxx
@@ -0,0 +1,274 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+
+#include "DerivationFrameworkBPhys/VertexTrackIsolation.h"
+
+#include <vector>
+#include <string>
+#include "TVector3.h"
+
+#include "xAODTracking/VertexContainer.h"
+#include "xAODTracking/VertexAuxContainer.h"
+#include "xAODBPhys/BPhysHelper.h"
+#include "xAODBPhys/BPhysHypoHelper.h"
+#include "TrkVertexAnalysisUtils/V0Tools.h"
+
+//#include "IsolationTool/CaloIsolationTool.h"
+//#include "IsolationTool/TrackIsolationTool.h"
+#include "RecoToolInterfaces/ITrackIsolationTool.h"
+#include "xAODPrimitives/IsolationHelpers.h"  //For the definition of Iso::conesize
+
+//#include "IsolationTool/IsolationHelper.h"
+//#include "InDetTrackSelectionTool/InDetTrackSelectionTool.h"
+
+
+//#include "Identifier/Identifier32.h"
+using namespace std;
+namespace DerivationFramework {
+
+  VertexTrackIsolation::VertexTrackIsolation(const std::string& t,
+      const std::string& n,
+      const IInterface* p) : 
+    AthAlgTool(t,n,p),
+    m_trackIsoTool("xAOD::TrackIsolationTool"),
+    m_trackContainerName("InDetTrackParticles"),
+    m_vertexContainerName("NONE"),
+    m_cones(),
+    m_vertexType(7),
+    
+    m_doIsoPerTrk(false),
+    m_removeDuplicate(2)
+  {
+        ATH_MSG_DEBUG("in constructor");
+    declareInterface<DerivationFramework::IAugmentationTool>(this);
+    
+    // Declare tools                      
+    declareProperty("TrackIsoTool" , m_trackIsoTool);
+
+    declareProperty("TrackContainer" , m_trackContainerName);
+    declareProperty("InputVertexContainer" , m_vertexContainerName);
+    declareProperty("PassFlags"                 , m_passFlags);
+    declareProperty("IsolationTypes"                 , m_cones);
+    declareProperty("DoVertexTypes"                 , m_vertexType);
+
+    declareProperty("DoIsoPerTrk"                , m_doIsoPerTrk, "New property to deal with track isolation per track, the default option (m_doIsoPerTrk=false) preserves the old behavior");
+    declareProperty("RemoveDuplicate"            , m_removeDuplicate, "Used with DoIsoPerTrk");
+  }
+
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
+  
+  StatusCode VertexTrackIsolation::initialize()
+  {
+  
+    ATH_MSG_DEBUG("in initialize()");
+ 
+    // retrieve TrackIsolationTool
+    CHECK( m_trackIsoTool.retrieve() );
+    
+    //Check that flags were given to tag the correct vertices
+    if(m_passFlags.empty()){
+        ATH_MSG_WARNING("As no pass-flags are given, no vertices will be decorated");
+    }
+
+    // Control the IsolationType sequence
+    if(m_cones.empty()){
+        ATH_MSG_INFO("Setting ptcones to default");
+
+	    if(m_doIsoPerTrk) m_cones.push_back(xAOD::Iso::ptcone50);
+	    m_cones.push_back(xAOD::Iso::ptcone40);
+	    m_cones.push_back(xAOD::Iso::ptcone30);
+	    m_cones.push_back(xAOD::Iso::ptcone20);
+
+    }
+
+    return StatusCode::SUCCESS;
+    
+  }
+  
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
+
+  StatusCode VertexTrackIsolation::finalize()
+  {
+    // everything all right
+    return StatusCode::SUCCESS;
+  }
+
+  // check if the two vertices are composed of the same set of tracks
+  bool VertexTrackIsolation::isSame(const xAOD::Vertex* theVtx1, const xAOD::Vertex* theVtx2) const {
+    if(!theVtx1 || !theVtx2) return false;
+    if(theVtx1==theVtx2) return true;
+    if(theVtx1->nTrackParticles() != theVtx2->nTrackParticles()) return false;
+
+    if(m_removeDuplicate==2 && theVtx1->nTrackParticles()==4) { // a special case with sub-structure
+      bool firstTwoAreSame = std::set<const xAOD::TrackParticle*>( { theVtx1->trackParticle(0), theVtx1->trackParticle(1)} ) == std::set<const xAOD::TrackParticle*>( {theVtx2->trackParticle(0), theVtx2->trackParticle(1)} ); // the 1st pair of tracks
+      bool lastTwoAreSame = std::set<const xAOD::TrackParticle*>( { theVtx1->trackParticle(2), theVtx1->trackParticle(3)} ) == std::set<const xAOD::TrackParticle*>( {theVtx2->trackParticle(2), theVtx2->trackParticle(3)} ); // the 2nd pair of tracks
+      if(firstTwoAreSame && lastTwoAreSame) return true;
+      else return false;
+    }
+    else { // the general case
+      std::set<const xAOD::TrackParticle*> vtxset1;
+      std::set<const xAOD::TrackParticle*> vtxset2;
+      for(size_t i=0; i<theVtx1->nTrackParticles(); i++) vtxset1.insert(theVtx1->trackParticle(i));
+      for(size_t i=0; i<theVtx2->nTrackParticles(); i++) vtxset2.insert(theVtx2->trackParticle(i));
+      return vtxset1 == vtxset2;
+    }
+  }
+  
+  bool VertexTrackIsolation::isContainedIn(const xAOD::Vertex* theVtx, const std::vector<const xAOD::Vertex*> &theColl) const {
+    for ( const auto vtxPtr : theColl ) {
+      if ( isSame(vtxPtr, theVtx) ) return true;
+    }
+    return false;
+  }
+  
+  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
+  
+  StatusCode VertexTrackIsolation::addBranches() const {
+
+    const xAOD::TrackParticleContainer*    idTrackParticleContainer = NULL;
+    const xAOD::VertexContainer*  vertexContainer = NULL;
+
+    if(evtStore()->contains<xAOD::TrackParticleContainer>(m_trackContainerName)) {
+        CHECK( evtStore()->retrieve(idTrackParticleContainer, m_trackContainerName) );
+    }
+    else{ATH_MSG_ERROR("Failed loading IdTrackparticleContainer container");
+    	return StatusCode::FAILURE;
+    }
+
+    //	load vertices
+    if(evtStore()->contains<xAOD::VertexContainer>(m_vertexContainerName)) {
+        CHECK( evtStore()->retrieve(vertexContainer, m_vertexContainerName) );
+    }
+    else{ATH_MSG_ERROR("Failed loading vertex container");
+    	return StatusCode::FAILURE;
+    }
+
+    std::vector<const xAOD::Vertex*> outVtxContainer;
+
+    //Convert m_cones (done per-event to avoid needing extra public dependency)
+
+    std::vector<xAOD::Iso::IsolationType> cones; cones.resize(m_cones.size());
+
+    for (unsigned int i =0; i< m_cones.size(); i++)
+    	cones[i] = xAOD::Iso::IsolationType(m_cones[i]);
+    //for(unsigned int cone : m_cones)
+    //	cones.push_back(xAOD::Iso::IsolationType(cone));
+
+    ATH_MSG_DEBUG("The provided IsolationTypes are re-ordered internally");
+    std::sort(cones.begin(),cones.end(),[](xAOD::Iso::IsolationType i, xAOD::Iso::IsolationType j) { return xAOD::Iso::coneSize(i) > xAOD::Iso::coneSize(j); } );
+
+    //	loop over vertices
+    for(auto vertex : *vertexContainer){
+
+      bool passed = false;
+      for(std::vector<std::string>::const_iterator flagItr = m_passFlags.begin(); flagItr!=m_passFlags.end(); ++flagItr) {
+        SG::AuxElement::Accessor<Char_t> flagAcc(*flagItr);
+        if(flagAcc.isAvailable(*vertex) && flagAcc(*vertex) != 0) {
+          passed = true;
+          break;
+        }
+      } // end of loop over flags
+      if(passed){
+	        if(!m_doIsoPerTrk) { // for legacy
+		  if(vertex->trackParticleLinks().size() != 3)ATH_MSG_WARNING("Vertex without 3 tracks, it has "<< vertex->trackParticleLinks().size() <<" instead");
+		}
+		else {
+		  if(m_removeDuplicate) {
+		    if( isContainedIn(vertex, outVtxContainer) ) continue;
+		    outVtxContainer.push_back(vertex);
+		  }
+		}
+
+		TLorentzVector candidate;
+
+		std::set<const xAOD::TrackParticle*> exclusionset;
+
+		for(auto part : vertex->trackParticleLinks()){ //Loop over tracks linked to vertex
+			candidate += (*part)->p4();
+			exclusionset.insert( *part ); //If it crashes use the direct TP from the vertex
+		}
+		//No! the above candidate will fail acceptance of isolation() because it's neither a muon nor a TrackParticle
+
+		//Make a dummy TrackParticle, otherwise TrackIsolationTool cannot deal with it
+		xAOD::TrackParticle candidate_slyTrack;
+		candidate_slyTrack.makePrivateStore();
+		candidate_slyTrack.setDefiningParameters(0, 0., candidate.Phi(), candidate.Theta(), 0./*1./candidate.P()*/);
+		//The precision goes down a bit, but it's a matter of 10e-7 with our values of interest
+
+		//Make a correctionlist such that the given exclusionset will be removed from the used tracks
+		//There is no danger that the input particle will be excluded, as it is not part of inDetTrackContainer
+		xAOD::TrackCorrection corrlist;
+		corrlist.trackbitset.set(static_cast<unsigned int>(xAOD::Iso::coreTrackPtr));
+
+
+		string vtxType_name[3] = {"SumPt", "A0", "Z0"};
+
+		xAOD::BPhysHelper vertex_h(vertex); //Use the BPhysHelper to access vertex quantities
+
+
+		//Loop over refitted primary vertex choice
+		for(unsigned int vertex_type = 0 ; vertex_type<= xAOD::BPhysHelper::PV_MIN_Z0 ; vertex_type++ ){
+
+			if((m_vertexType & (1 << vertex_type ) ) == 0)continue; //Stop if the type of vertex is not required
+
+
+			//if(debug should go outside!!!)
+
+			ATH_MSG_DEBUG("List of cone types" );
+
+
+					for(unsigned int i =0; i < cones.size(); i++){
+
+						ATH_MSG_DEBUG("cone type = "<< 	xAOD::Iso::toString(xAOD::Iso::IsolationType(cones[i])) );
+					//	ATH_MSG_DEBUG("isolation value "<< vtxType_name[vertex_type] << " = "<< result.ptcones[i] );
+					//	ATH_MSG_DEBUG("isolation value "<<vtxType_name[vertex_type] <<" = "<< result.ptcones[i] );
+					}
+
+
+
+			const xAOD::Vertex* refVtx = vertex_h.pv( static_cast<xAOD::BPhysHelper::pv_type>(vertex_type) ); //Fix the cast
+
+			xAOD::TrackIsolation result;
+
+			if(!m_doIsoPerTrk) {
+			  m_trackIsoTool->trackIsolation(result, candidate_slyTrack, cones, corrlist, refVtx, &exclusionset, idTrackParticleContainer);
+
+
+			  //Decorate the vertex with all the isolation values
+			  for(unsigned int i =0; i < cones.size(); i++){
+
+				string variableName;
+
+				variableName = xAOD::Iso::toString(xAOD::Iso::IsolationType(cones[i]));
+				variableName += vtxType_name[vertex_type];
+
+				SG::AuxElement::Decorator<float> isolation(variableName);
+				isolation(*vertex) = result.ptcones[i];
+
+			  }
+			}
+			else {
+			  for(size_t i=0; i<vertex->nTrackParticles(); i++) {
+			    m_trackIsoTool->trackIsolation(result, *vertex->trackParticle(i), cones, corrlist, refVtx, &exclusionset, idTrackParticleContainer);
+
+			    for(unsigned int j =0; j < cones.size(); j++) {
+			      string variableName;
+			      variableName = xAOD::Iso::toString(xAOD::Iso::IsolationType(cones[j]));
+			      variableName += vtxType_name[vertex_type] + "_trk" + std::to_string(i+1);
+			      SG::AuxElement::Decorator<float> isolation(variableName);
+			      isolation(*vertex) = result.ptcones[j];
+			    }
+			  }
+			}
+		}
+	
+      }// End of if passed
+    }// end of loop over vertices
+
+    return StatusCode::SUCCESS;
+  }
+
+}//End of namespace DerivationFramework
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/components/DerivationFrameworkBPhys_entries.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/components/DerivationFrameworkBPhys_entries.cxx
new file mode 100644
index 000000000000..9bd3917c40d8
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkBPhys/src/components/DerivationFrameworkBPhys_entries.cxx
@@ -0,0 +1,74 @@
+#include "DerivationFrameworkBPhys/Reco_Vertex.h"
+#include "DerivationFrameworkBPhys/Reco_4mu.h"
+#include "DerivationFrameworkBPhys/Select_onia2mumu.h"
+#include "DerivationFrameworkBPhys/Thin_vtxTrk.h"
+#include "DerivationFrameworkBPhys/Thin_vtxDuplicates.h"
+#include "DerivationFrameworkBPhys/AugOriginalCounts.h"
+#include "DerivationFrameworkBPhys/BPhysPVThinningTool.h"
+#include "DerivationFrameworkBPhys/VertexCaloIsolation.h"
+#include "DerivationFrameworkBPhys/VertexTrackIsolation.h"
+#include "DerivationFrameworkBPhys/BPhysMetadataBase.h"
+#include "DerivationFrameworkBPhys/Bmumu_metadata.h"
+//#include "DerivationFrameworkBPhys/CfAthAlgTool.h"
+#include "DerivationFrameworkBPhys/Bmumu_reco_mumu.h"
+#include "DerivationFrameworkBPhys/FourMuonTool.h"
+//#include "DerivationFrameworkBPhys/BPhysAddMuonBasedInvMass.h"
+//#include "DerivationFrameworkBPhys/BPhysVertexTrackBase.h"
+//#include "DerivationFrameworkBPhys/BVertexTrackIsoTool.h"
+//#include "DerivationFrameworkBPhys/BMuonTrackIsoTool.h"
+//#include "DerivationFrameworkBPhys/BVertexClosestTrackTool.h"
+#include "DerivationFrameworkBPhys/BTrackVertexMapLogger.h"
+//#include "DerivationFrameworkBPhys/Select_Bmumu.h"
+//#include "DerivationFrameworkBPhys/BPhysVarBlinder.h"
+//#include "DerivationFrameworkBPhys/BmumuThinningTool.h"
+#include "DerivationFrameworkBPhys/VertexPlus1TrackCascade.h"
+#include "DerivationFrameworkBPhys/TriggerCountToMetadata.h"
+#include "DerivationFrameworkBPhys/MuonExtrapolationTool.h"
+#include "DerivationFrameworkBPhys/CascadeTools.h"
+#include "DerivationFrameworkBPhys/Reco_V0Finder.h"
+#include "DerivationFrameworkBPhys/JpsiPlusV0Cascade.h"
+#include "DerivationFrameworkBPhys/JpsiPlusDsCascade.h"
+#include "DerivationFrameworkBPhys/JpsiPlusDpstCascade.h"
+#include "DerivationFrameworkBPhys/JpsiPlusDs1Cascade.h"
+#include "DerivationFrameworkBPhys/ReVertex.h"
+#include "DerivationFrameworkBPhys/BPhysConversionFinder.h"
+#include "DerivationFrameworkBPhys/Cascade3Plus1.h"
+
+using namespace DerivationFramework;
+
+DECLARE_COMPONENT( Reco_4mu )
+DECLARE_COMPONENT( Reco_Vertex )
+DECLARE_COMPONENT( Select_onia2mumu )
+DECLARE_COMPONENT( Thin_vtxTrk )
+DECLARE_COMPONENT( Thin_vtxDuplicates )
+DECLARE_COMPONENT( AugOriginalCounts )
+DECLARE_COMPONENT( BPhysPVThinningTool )
+DECLARE_COMPONENT( VertexCaloIsolation )
+DECLARE_COMPONENT( VertexTrackIsolation )
+DECLARE_COMPONENT( BPhysMetadataBase )
+DECLARE_COMPONENT( Bmumu_metadata )
+//DECLARE_COMPONENT( CfAthAlgTool )
+//DECLARE_COMPONENT( Bmumu_reco_mumu )
+DECLARE_COMPONENT( FourMuonTool )
+//DECLARE_COMPONENT( BPhysAddMuonBasedInvMass )
+//DECLARE_COMPONENT( BPhysVertexTrackBase )
+//DECLARE_COMPONENT( BVertexTrackIsoTool )
+//DECLARE_COMPONENT( BMuonTrackIsoTool )
+//DECLARE_COMPONENT( BVertexClosestTrackTool )
+DECLARE_COMPONENT( BTrackVertexMapLogger )
+//DECLARE_COMPONENT( Select_Bmumu )
+//DECLARE_COMPONENT( BPhysVarBlinder )
+//DECLARE_COMPONENT( BmumuThinningTool )
+DECLARE_COMPONENT( VertexPlus1TrackCascade )
+DECLARE_COMPONENT( TriggerCountToMetadata )
+DECLARE_COMPONENT( MuonExtrapolationTool )
+DECLARE_COMPONENT( CascadeTools )
+DECLARE_COMPONENT( Reco_V0Finder )
+DECLARE_COMPONENT( JpsiPlusV0Cascade )
+DECLARE_COMPONENT( JpsiPlusDsCascade )
+DECLARE_COMPONENT( JpsiPlusDpstCascade )
+DECLARE_COMPONENT( JpsiPlusDs1Cascade )
+DECLARE_COMPONENT( ReVertex )
+DECLARE_COMPONENT( BPhysConversionFinder )
+DECLARE_COMPONENT( Cascade3Plus1 )
+
-- 
GitLab


From 8b59aed5ac2aca8731229aef841895076af22a33 Mon Sep 17 00:00:00 2001
From: Walter Lampl <Walter.Lampl@cern.ch>
Date: Wed, 16 Dec 2020 11:21:11 +0100
Subject: [PATCH 067/225] make ComponentAccumulator.conf2toConfigurable less
 verbose

---
 .../python/ComponentAccumulator.py                 | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/Control/AthenaConfiguration/python/ComponentAccumulator.py b/Control/AthenaConfiguration/python/ComponentAccumulator.py
index b08120e3ecfd..76da75a712ea 100644
--- a/Control/AthenaConfiguration/python/ComponentAccumulator.py
+++ b/Control/AthenaConfiguration/python/ComponentAccumulator.py
@@ -884,7 +884,7 @@ def conf2toConfigurable( comp, indent="", suppressDupes=False ):
         _log.warning( "%sComponent: \"%s\" is of type string, no conversion, some properties possibly not set?", indent, comp )
         return comp
 
-    _log.info( "%sConverting from GaudiConfig2 object %s type %s", indent, compName(comp), comp.__class__.__name__ )
+    _log.debug( "%sConverting from GaudiConfig2 object %s type %s", indent, compName(comp), comp.__class__.__name__ )
 
     def __alreadyConfigured( instanceName ):
         from AthenaCommon.Configurable import Configurable
@@ -1018,14 +1018,14 @@ def conf2toConfigurable( comp, indent="", suppressDupes=False ):
                     pvalue=pvalue.data
 
                 if pname not in alreadySetProperties:
-                    _log.info( "%sAdding property: %s for %s", indent, pname, newConf2Instance.getName() )
+                    _log.debug( "%sAdding property: %s for %s", indent, pname, newConf2Instance.getName() )
                     try:
                         setattr(existingConfigurableInstance, pname, pvalue)
                     except AttributeError:
                         _log.info("%s Could not set attribute. Type of existingConfigurableInstance %s.",indent, type(existingConfigurableInstance) )
                         raise
                 elif alreadySetProperties[pname] != pvalue:
-                    _log.info( "%sMerging property: %s for %s", indent, pname, newConf2Instance.getName() )
+                    _log.debug( "%sMerging property: %s for %s", indent, pname, newConf2Instance.getName() )
                     # create surrogate
                     clone = newConf2Instance.getInstance("Clone")
                     setattr(clone, pname, alreadySetProperties[pname])
@@ -1041,10 +1041,10 @@ def conf2toConfigurable( comp, indent="", suppressDupes=False ):
 
                     setattr(existingConfigurableInstance, pname, updatedPropValue)
                     del clone
-                    _log.info("%s invoked GaudiConf2 semantics to merge the %s and the %s to %s "
-                              "for property %s of %s",
-                              indent, alreadySetProperties[pname], pvalue, pname,
-                              updatedPropValue, existingConfigurable.getFullName())
+                    _log.debug("%s invoked GaudiConf2 semantics to merge the %s and the %s to %s "
+                               "for property %s of %s",
+                               indent, alreadySetProperties[pname], pvalue, pname,
+                               updatedPropValue, existingConfigurable.getFullName())
 
     _log.debug( "%s Conf2 Full name: %s ", indent, comp.getFullJobOptName() )
     existingConfigurable = __alreadyConfigured( comp.name )
-- 
GitLab


From ffd019cfddac83e4598605839baa1eed0e53be5b Mon Sep 17 00:00:00 2001
From: Denis Damazio <damazio@mail.cern.ch>
Date: Wed, 16 Dec 2020 11:39:41 +0100
Subject: [PATCH 068/225] fix for missing type specification in log output
 variable

---
 .../LArExample/LArConditionsCommon/python/LArCondFlags.py       | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/LArCalorimeter/LArExample/LArConditionsCommon/python/LArCondFlags.py b/LArCalorimeter/LArExample/LArConditionsCommon/python/LArCondFlags.py
index a809b87757cc..7b17f47c9a26 100644
--- a/LArCalorimeter/LArExample/LArConditionsCommon/python/LArCondFlags.py
+++ b/LArCalorimeter/LArExample/LArConditionsCommon/python/LArCondFlags.py
@@ -468,7 +468,7 @@ class LArCondFlags(JobPropertyContainer):
             
         # set the tag for FebRodMap
         if "/LAR/Identifier/FebRodMap" in self.LArCondFolderTags():
-            self._log.info(' using user specified tag for /LAR/Identifier/FebRodMap' , self.LArCondFolderTags()['/LAR/Identifier/FebRodMap'])
+            self._log.info(' using user specified tag for /LAR/Identifier/FebRodMap %s' , self.LArCondFolderTags()['/LAR/Identifier/FebRodMap'])
 
         else :
             if DDVtype=="" or DDVtype not in self.DDVtoFebRodIdMCTag():
-- 
GitLab


From 2ecb298d05f8a55cd751b56b1e81970dbd6c64ff Mon Sep 17 00:00:00 2001
From: Julie Kirk <Julie.Kirk@cern.ch>
Date: Wed, 16 Dec 2020 12:10:31 +0100
Subject: [PATCH 069/225] TrigInDetValidation: Add "release" parameter for ART
 tests

---
 .../python/TrigInDetNewArtSteps.py            | 35 +++++++++++--------
 .../share/TrigInDetValidation_NewBase.py      |  3 +-
 2 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/Trigger/TrigValidation/TrigInDetValidation/python/TrigInDetNewArtSteps.py b/Trigger/TrigValidation/TrigInDetValidation/python/TrigInDetNewArtSteps.py
index f36db2004b19..9be14b5c66a8 100644
--- a/Trigger/TrigValidation/TrigInDetValidation/python/TrigInDetNewArtSteps.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/python/TrigInDetNewArtSteps.py
@@ -35,6 +35,7 @@ class TrigInDetReco(ExecStep):
         self.slices = []
         self.preexec_trig = ' '
         self.postinclude_trig = postinclude_file
+        self.release = 'latest'
         self.preexec_reco =  ';'.join([
             'from RecExConfig.RecFlags import rec',
             'rec.doForwardDet=False',
@@ -60,21 +61,8 @@ class TrigInDetReco(ExecStep):
         self.postexec_trig = "from AthenaCommon.AppMgr import ServiceMgr; ServiceMgr.AthenaPoolCnvSvc.MaxFileSizes=['tmp.RDO_TRIG=100000000000']"
 
 
-        # get the cuttent atlas base release, and the previous base release
-        import os
-        DVERSION=os.getenv('Athena_VERSION')
-        if ( DVERSION is None ) :
-            AVERSION = "22.0.20"
-        else :
-            BASE=DVERSION[:5]
-            SUB=int(DVERSION[5:])
-            SUB -= 1
-            AVERSION=BASE+str(SUB)
-
-        print( "remapping athena base release version: ", DVERSION, " -> ", AVERSION )
-
         self.postexec_reco = "from AthenaCommon.AppMgr import ServiceMgr; ServiceMgr.AthenaPoolCnvSvc.MaxFileSizes=['tmp.ESD=100000000000']"
-        self.args = '--outputAODFile=AOD.pool.root --steering="doRDO_TRIG" --asetup "RAWtoESD:Athena,'+AVERSION+'" "ESDtoAOD:Athena,'+AVERSION+'" '
+        self.args = '--outputAODFile=AOD.pool.root --steering="doRDO_TRIG"'
 
 
     def configure(self, test):
@@ -114,6 +102,25 @@ class TrigInDetReco(ExecStep):
         chains += ']'
         self.preexec_trig = 'doEmptyMenu=True;'+flags+'selectChains='+chains
 
+        if (self.release == 'current'):
+            print( "Using current release for offline Reco steps  " )
+        else:
+            # get the current atlas base release, and the previous base release
+            import os
+            DVERSION=os.getenv('Athena_VERSION')
+            if (self.release == 'latest'):
+                if ( DVERSION is None ) :
+                    AVERSION = "22.0.20"
+                else:
+                    BASE=DVERSION[:5]
+                    SUB=int(DVERSION[5:])
+                    SUB -= 1
+                    AVERSION=BASE+str(SUB)
+            else:
+                AVERSION = self.release
+            self.args += ' --asetup "RAWtoESD:Athena,'+AVERSION+'" "ESDtoAOD:Athena,'+AVERSION+'" '
+            print( "remapping athena base release version for offline Reco steps: ", DVERSION, " -> ", AVERSION )
+
 
         self.args += ' --preExec "RDOtoRDOTrigger:{:s};" "all:{:s};" "RAWtoESD:{:s};" "ESDtoAOD:{:s};"'.format(
             self.preexec_trig, self.preexec_all, self.preexec_reco, self.preexec_aod)
diff --git a/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_NewBase.py b/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_NewBase.py
index afbbee8fe151..7315cccd423b 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_NewBase.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_NewBase.py
@@ -73,7 +73,8 @@ rdo2aod.slices            = Slices
 rdo2aod.threads           = Threads
 rdo2aod.concurrent_events = Slots 
 rdo2aod.config_only       = testconfig
-
+if 'Release' in dir():
+    rdo2aod.release           = Release
 
 
 if "Args" not in locals() : 
-- 
GitLab


From acd4de829065eccbf9e6e267439c31df4340e2af Mon Sep 17 00:00:00 2001
From: Albert Kong <albert.xing.yi.kong@cern.ch>
Date: Wed, 16 Dec 2020 12:25:44 +0000
Subject: [PATCH 070/225] Decorate each component of the JetFourMom
 individually

Note that this currently generates a compile error since fv.m() is not a valid way to access that component any more
---
 .../python/ExtendedJetCommon.py               |  77 +++-
 .../src/JetAugmentationTool.cxx               |  97 +++++-
 .../src/JetAugmentationTool.h                 |   8 +-
 .../DerivationFrameworkPhys/share/PHYS.py     |   4 +-
 .../Jet/JetMomentTools/CMakeLists.txt         |   4 +-
 .../JetMomentTools/JetForwardPFlowJvtTool.h   | 170 +++++++++
 .../Root/JetForwardPFlowJvtTool.cxx           | 328 ++++++++++++++++++
 .../src/components/JetMomentTools_entries.cxx |   2 +
 8 files changed, 667 insertions(+), 23 deletions(-)
 create mode 100644 Reconstruction/Jet/JetMomentTools/JetMomentTools/JetForwardPFlowJvtTool.h
 create mode 100644 Reconstruction/Jet/JetMomentTools/Root/JetForwardPFlowJvtTool.cxx

diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/python/ExtendedJetCommon.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/python/ExtendedJetCommon.py
index b255d5cc77de..8d4942a7a588 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/python/ExtendedJetCommon.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/python/ExtendedJetCommon.py
@@ -265,7 +265,7 @@ def applyJetCalibration(jetalg,algname,sequence,largeRjetconfig = 'comb', suffix
                       'AntiKt4LCTopo':('JES_data2016_data2015_Recommendation_Dec2016_rel21.config',
                                        'JetArea_Residual_EtaJES_GSC'),
                       'AntiKt4EMPFlow':('JES_MC16Recommendation_Consolidated_PFlow_Apr2019_Rel21.config',
-                                        'JetArea_Residual_EtaJES_GSC_Smear'),
+                                        'JetArea_Residual_EtaJES_GSC'),
                       'AntiKt10LCTopoTrimmedPtFrac5SmallR20':('JES_MC15recommendation_FatJet_Nov2016_QCDCombinationUncorrelatedWeights.config',
                                                               'EtaJES_JMS'),
                       'AntiKt2LCTopo':('JES_2015_2016_data_Rscan2LC_18Dec2018_R21.config',
@@ -448,6 +448,79 @@ def addJetTruthLabel(jetalg,algname,labelname,sequence):
         extjetlog.info('ExtendedJetCommon: Applying JetTruthLabel augmentation to jet collection: ' + jetalg + 'Jets' + ' using ' + labelname +' definition')
         applyJetAugmentation(jetalg,algname,sequence,jetaugtool)
 
+##################################################################  
+
+def getPFlowfJVT(jetalg,algname,sequence,primaryVertexCont="PrimaryVertices",trackVertexAssociation="JetTrackVtxAssoc",overlapLabel="",outLabel="fJvt",includePV=False):
+    supportedJets = ['AntiKt4EMPFlow','AntiKt4PFlowCustomVtxHgg']
+    if jetalg not in supportedJets:
+        extjetlog.error('*** PFlow fJvt augmentation requested for unsupported jet collection {}! ***'.format(jetalg))
+        return
+    else:
+        from AthenaCommon.AppMgr import ToolSvc
+        jetaugtool = getJetAugmentationTool(jetalg,suffix=algname)
+
+        #Check if the calibration and JVT tools exist already
+        jetcalibtoolname_default = 'DFJetCalib_'+jetalg
+        jetjvttoolname_default = 'DFJetJvt_'+jetalg
+
+        if '_BTagging' in jetalg:
+            jetalg_basename = jetalg[:jetalg.find('_BTagging')]
+        elif 'PFlowCustomVtx' in jetalg:
+            jetalg_basename = 'AntiKt4EMPFlow'
+        else:
+            jetalg_basename = jetalg
+
+        jvtefftoolname = getJvtEffToolName(jetalg_basename)
+
+        #Jet calibration tool 
+        if hasattr(ToolSvc, jetcalibtoolname_default):
+            jetaugtool.JetCalibTool = getattr(ToolSvc, jetcalibtoolname_default)
+        else:
+            applyJetCalibration(jetalg,algname,sequence,suffix=algname)
+
+        #JVT tool
+        if hasattr(ToolSvc, jetjvttoolname_default) and hasattr(ToolSvc, jvtefftoolname):
+            jetaugtool.JetJvtTool = getattr(ToolSvc, jetjvttoolname_default)
+            jetaugtool.JetJvtEffTool = getattr(ToolSvc, jvtefftoolname)
+        else:
+            updateJVT(jetalg,algname,sequence,customVxColl=primaryVertexCont,suffix=algname)
+
+        # Calibration tool specific for pFlow fJVT: without GSC and smearing
+        jetcalibtoolname = 'DFJetCalib_PFfJvt_'+jetalg
+        if hasattr(ToolSvc, jetcalibtoolname):
+            jetaugtool.JetCalibToolfJvt = getattr(ToolSvc,jetcalibtoolname)
+        else:
+            jetcalibrationtool = CfgMgr.JetCalibrationTool(jetcalibtoolname,
+                                                           JetCollection=jetalg,
+                                                           ConfigFile="JES_MC16Recommendation_Consolidated_PFlow_Apr2019_Rel21.config",
+                                                           CalibSequence="JetArea_Residual_EtaJES",
+                                                           CalibArea="00-04-82",
+                                                           IsData=False)
+
+            ToolSvc += jetcalibrationtool
+
+        wpfotoolname = "DFwPFO_"+jetalg+algname
+        wpfotool = CfgMgr.CP__WeightPFOTool(wpfotoolname)
+
+        pffjvttoolname = 'DFJetPFfJvt_'+jetalg+algname
+        jetCont = jetalg+"Jets"
+
+        if hasattr(ToolSvc,pffjvttoolname):
+            jetaugtool.JetForwardPFlowJvtTool = getattr(ToolSvc,pffjvttoolname)
+            jetaugtool.fJvtMomentKey = outLabel
+        else:
+            pffjvttool = CfgMgr.JetForwardPFlowJvtTool(pffjvttoolname,
+                verticesName=primaryVertexCont, JetContainer=jetCont,
+                TrackVertexAssociation=jtm.tvassoc.TrackVertexAssociation,
+                WeightPFOTool=wpfotool, JetCalibrationTool=jetcalibrationtool,
+                ORName=overlapLabel, FjvtRawName='DFCommonJets_'+outLabel, includePV=includePV)
+            ToolSvc += pffjvttool
+            jetaugtool.JetForwardPFlowJvtTool = pffjvttool
+            jetaugtool.fJvtMomentKey = outLabel
+
+        extjetlog.info('ExtendedJetCommon: Applying PFlow fJvt augmentation to jet collection: '+jetalg+'Jets')
+        applyJetAugmentation(jetalg,algname,sequence,jetaugtool)
+
 ################################################################## 
 
 def applyBTaggingAugmentation(jetalg,algname='default',sequence=DerivationFrameworkJob,btagtooldict={}):
@@ -787,6 +860,8 @@ def addCHSPFlowObjects():
 ##################################################################
 applyJetCalibration_xAODColl("AntiKt4EMTopo")
 updateJVT_xAODColl("AntiKt4EMTopo")
+applyJetCalibration_xAODColl("AntiKt4EMPFlow")
+updateJVT_xAODColl("AntiKt4EMPFlow")
 
 applyOverlapRemoval()
 eventCleanLoose_xAODColl("AntiKt4EMTopo")
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/src/JetAugmentationTool.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/src/JetAugmentationTool.cxx
index dba95878b6df..ce917ddba396 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/src/JetAugmentationTool.cxx
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/src/JetAugmentationTool.cxx
@@ -23,6 +23,7 @@ namespace DerivationFramework {
     m_jvtTool(""),
     m_jetJvtEfficiencyTool(""),
     m_dojvt(false),
+    m_dofjvt(false),
     m_dobtag(false),
     m_jetTrackSumMomentsTool(""),
     m_decoratetracksum(false),
@@ -44,6 +45,8 @@ namespace DerivationFramework {
     declareProperty("JvtMomentKey",   m_jvtMomentKey = "Jvt");
     declareProperty("JetJvtTool",     m_jvtTool);
     declareProperty("JetJvtEffTool",  m_jetJvtEfficiencyTool);
+    declareProperty("fJvtMomentKey",  m_fjvtMomentKey = "fJvt");
+    declareProperty("JetForwardPFlowJvtTool", m_fjvtTool);
     declareProperty("JetBtagTools",   m_btagSelTools);
     declareProperty("JetBtagWPs",     m_btagWP);
     declareProperty("JetTrackSumMomentsTool", m_jetTrackSumMomentsTool);
@@ -58,6 +61,9 @@ namespace DerivationFramework {
   {
     ATH_MSG_INFO("Initialising JetAugmentationTool");
 
+    m_container_key = m_containerName;
+    ATH_CHECK(m_container_key.initialize());
+
     if(!m_jetCalibTool.empty()) {
       CHECK(m_jetCalibTool.retrieve());
       ATH_MSG_INFO("Augmenting jets with calibration \"" << m_momentPrefix+m_calibMomentKey << "\"");
@@ -79,12 +85,27 @@ namespace DerivationFramework {
 	ATH_MSG_INFO("Augmenting jets with updated JVT \"" << m_momentPrefix+m_jvtMomentKey << "\"");
 	m_dojvt = true;
 
+	m_acc_JVT = std::make_unique< SG::AuxElement::ConstAccessor<float> >(m_momentPrefix+m_jvtMomentKey);
+	m_acc_passJVT = std::make_unique< SG::AuxElement::ConstAccessor<char> >(m_momentPrefix+"pass"+m_jvtMomentKey);
+
 	m_jvt_key = m_containerName + "." + m_momentPrefix + m_jvtMomentKey;
 	m_passJvt_key = m_containerName + "." + m_momentPrefix + "pass" + m_jvtMomentKey;
 
 	ATH_CHECK(m_jvt_key.initialize());
 	ATH_CHECK(m_passJvt_key.initialize());
 
+	// PFlow fJVT tool
+	if(!m_fjvtTool.empty()) {
+	  CHECK(m_fjvtTool.retrieve());
+	  ATH_MSG_INFO("Augmenting (PFlow) jets with fJVT \"" << m_momentPrefix+m_fjvtMomentKey << "\"");
+	  m_dofjvt = true;
+
+	  m_acc_fJVT = std::make_unique< SG::AuxElement::ConstAccessor<float> >(m_momentPrefix+m_fjvtMomentKey);
+
+	  m_fjvt_key = m_containerName + "." + m_momentPrefix + m_fjvtMomentKey;
+	  ATH_CHECK(m_fjvt_key.initialize());
+	}
+
 	if(!m_btagSelTools.empty()) {
 	  size_t ibtag(0);
 	  for(const auto& tool : m_btagSelTools) {
@@ -106,6 +127,7 @@ namespace DerivationFramework {
     }
 
     if(!m_jetTrackSumMomentsTool.empty()) {
+      ATH_MSG_INFO("Augmenting jets with track sum moments \"" << m_momentPrefix << "TrackSumMass,Pt\"");
       CHECK(m_jetTrackSumMomentsTool.retrieve());
       ATH_MSG_INFO("Augmenting jets with track sum moments \"" << m_momentPrefix << "TrackSumMass,Pt\"");
       m_decoratetracksum = true;
@@ -168,7 +190,7 @@ namespace DerivationFramework {
 	}
       }
     }
-    
+
     if(!m_jetTruthLabelingTool.empty()) {
       CHECK(m_jetTruthLabelingTool.retrieve());
       ATH_MSG_INFO("Augmenting jets with truthlabeling");
@@ -211,10 +233,11 @@ namespace DerivationFramework {
 
   StatusCode JetAugmentationTool::addBranches() const
   {
+
     // retrieve container
-    const xAOD::JetContainer* jets(0);
-    if( evtStore()->retrieve( jets, m_containerName ).isFailure() ) {
-      ATH_MSG_WARNING ("Couldn't retrieve jets with key: " << m_containerName );
+    SG::ReadHandle<xAOD::JetContainer> jets(m_container_key);
+    if( !jets.isValid() ) {
+      ATH_MSG_WARNING ("Couldn't retrieve jets with key: " << m_container_key.key() );
       return StatusCode::FAILURE;
     }
 
@@ -229,6 +252,31 @@ namespace DerivationFramework {
 	ATH_MSG_WARNING("Problem applying jet calibration");
 	return StatusCode::FAILURE;
       }
+
+      if(m_dojvt){
+
+	SG::WriteDecorHandle<xAOD::JetContainer, float> jvt_handle(m_jvt_key);
+	SG::WriteDecorHandle<xAOD::JetContainer, char> passJvt_handle(m_passJvt_key);
+
+	//First update the Jvt criteria (needed for fJVT)
+	for(const xAOD::Jet *jet : *jets_copy) { 
+	  
+	  float jvt_value = m_jvtTool->updateJvt(*jet);
+	  jvt_handle(*jet)= jvt_value;
+	  ATH_MSG_VERBOSE("Calibrated JVT: " << jvt_value);
+	  
+	  bool passJVT = m_jetJvtEfficiencyTool->passesJvtCut(*jet);
+	  passJvt_handle(*jet) = passJVT;
+	}
+
+	// pFlow fJVT
+	if(m_dofjvt){
+	  if((m_fjvtTool->modify(*jets_copy)).isFailure()){
+	    ATH_MSG_ERROR("Problem computing fJVT");
+	    return StatusCode::FAILURE;
+	  }
+	}
+      }
     }
 
     if(m_decoratetracksum){
@@ -291,16 +339,28 @@ namespace DerivationFramework {
 
 	if(m_dojvt) {
 
-	  SG::WriteDecorHandle<xAOD::JetContainer, float> jvt_handle(m_jvt_key);
-	  SG::WriteDecorHandle<xAOD::JetContainer, char> passJvt_handle(m_passJvt_key);
+	  SG::WriteDecorHandle<xAOD::JetContainer, float> jvt_handle(m_jvt_key); 
+	  SG::WriteDecorHandle<xAOD::JetContainer, char> passJvt_handle(m_passJvt_key); 
+
+	  if(m_acc_JVT->isAvailable(*jet)){
+	    jvt_handle(jet_orig) = (*m_acc_JVT)(*jet);
+	  }
+
+	  bool passJVT = false;
+
+	  if(m_acc_passJVT->isAvailable(*jet)){
+	    passJVT = (*m_acc_passJVT)(*jet);
+	    passJvt_handle(jet_orig) = passJVT;
+          }
+
+	  if(m_dofjvt){
+
+	    SG::WriteDecorHandle<xAOD::JetContainer, float> fjvt_handle(m_fjvt_key);
+	    if(m_acc_fJVT->isAvailable(*jet)){
+	      fjvt_handle(jet_orig) = (*m_acc_fJVT)(*jet);
+	    }
+	  }
 
-	  float jvt_value = m_jvtTool->updateJvt(*jet);
-	  jvt_handle(jet_orig)= jvt_value;
-	  ATH_MSG_VERBOSE("Calibrated JVT: " << jvt_value);
-	  
-	  bool passJVT = m_jetJvtEfficiencyTool->passesJvtCut(jet_orig);
-	  passJvt_handle(jet_orig) = passJVT;
-	  
 	  if(m_dobtag) {
 	    size_t ibtag(0);
 	    for(const auto& tool : m_btagSelTools) {
@@ -332,14 +392,14 @@ namespace DerivationFramework {
 
         if(m_acc_GhostTruthAssociationFraction->isAvailable(*jet)){
 	  ghostTruthAssocFrac_handle(jet_orig) = (*m_acc_GhostTruthAssociationFraction)(*jet);
-	  ATH_MSG_INFO("GhostTruthAssociationFraction: " << (*m_acc_GhostTruthAssociationFraction)(jet_orig) );
+	  ATH_MSG_VERBOSE("GhostTruthAssociationFraction: " << (*m_acc_GhostTruthAssociationFraction)(jet_orig) );
 	}
 	if(m_acc_GhostTruthAssociationLink->isAvailable(*jet)){
 	  ghostTruthAssocLink_handle(jet_orig) = (*m_acc_GhostTruthAssociationLink)(*jet);
-	  ATH_MSG_INFO("GhostTruthAssociationLink: " << (*m_acc_GhostTruthAssociationLink)(jet_orig) );
+	  ATH_MSG_VERBOSE("GhostTruthAssociationLink: " << (*m_acc_GhostTruthAssociationLink)(jet_orig) );
 	}
       }
-      
+
       if(m_decoratetruthlabel){
 
 	SG::WriteDecorHandle<xAOD::JetContainer, float> truthLabel_dRW_handle(m_truthLabel_dRW_key);
@@ -376,9 +436,12 @@ namespace DerivationFramework {
 	if(m_acc_Associated_truthjet_pt->isAvailable(*jet)) associated_truthjet_pt_handle(jet_orig) = (*m_acc_Associated_truthjet_pt)(*jet);
 	if(m_acc_Associated_truthjet_eta->isAvailable(*jet)) associated_truthjet_eta_handle(jet_orig) = (*m_acc_Associated_truthjet_eta)(*jet);
       }
-      
+
     }
 
     return StatusCode::SUCCESS;
   }
+
 }
+
+ 
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/src/JetAugmentationTool.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/src/JetAugmentationTool.h
index 9363efa601c4..ff38519d9af7 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/src/JetAugmentationTool.h
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/src/JetAugmentationTool.h
@@ -43,6 +43,7 @@ namespace DerivationFramework {
   private:
     std::string m_momentPrefix;
     std::string m_containerName;
+    SG::ReadHandleKey<xAOD::JetContainer> m_container_key {this, "InputJetsKey", "", "Accessor for input JetContainer"};
     //
     // implement augmentations explicitly to avoid need to parse lists of moments to copy
     //
@@ -63,10 +64,15 @@ namespace DerivationFramework {
     ToolHandle<CP::IJetJvtEfficiency> m_jetJvtEfficiencyTool;
     std::string m_jvtMomentKey;
     bool m_dojvt;
+    std::unique_ptr< SG::AuxElement::ConstAccessor<float> > m_acc_JVT;
+    std::unique_ptr< SG::AuxElement::ConstAccessor<char> > m_acc_passJVT;
 
     //PFlow fJVT
-    std::unique_ptr< SG::AuxElement::ConstAccessor<float> > m_acc_fjvt;
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_fjvt_key {this, "fJVTKey", "", "Decoration for fJVT"};
+    ToolHandle<IJetModifier> m_fjvtTool;
     std::string m_fjvtMomentKey;
+    bool m_dofjvt;
+    std::unique_ptr< SG::AuxElement::ConstAccessor<float> > m_acc_fJVT;
 
     // b-tagging       @author tripiana@cern.ch
     std::vector<std::string> m_btagWP;
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/share/PHYS.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/share/PHYS.py
index e9e483b64cb8..64a386f315ec 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/share/PHYS.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkPhys/share/PHYS.py
@@ -14,7 +14,7 @@ from DerivationFrameworkEGamma import EGammaCommon
 from DerivationFrameworkEGamma import ElectronsCPDetailedContent
 from DerivationFrameworkMuons import MuonsCommon
 from DerivationFrameworkJetEtMiss.JetCommon import OutputJets
-from DerivationFrameworkJetEtMiss.ExtendedJetCommon import replaceAODReducedJets, addDefaultTrimmedJets, addJetTruthLabel, addQGTaggerTool
+from DerivationFrameworkJetEtMiss.ExtendedJetCommon import replaceAODReducedJets, addDefaultTrimmedJets, addJetTruthLabel, addQGTaggerTool, getPFlowfJVT
 from DerivationFrameworkJetEtMiss import METCommon
 from TriggerMenu.api.TriggerAPI import TriggerAPI
 from TriggerMenu.api.TriggerEnums import TriggerPeriod, TriggerType
@@ -189,7 +189,7 @@ addQGTaggerTool(jetalg="AntiKt4EMTopo",sequence=SeqPHYS,algname="QGTaggerToolAlg
 addQGTaggerTool(jetalg="AntiKt4EMPFlow",sequence=SeqPHYS,algname="QGTaggerToolPFAlg")
 
 # fJVT
-# getPFlowfJVT(jetalg='AntiKt4EMPFlow',sequence=SeqPHYS, algname='PHYSJetForwardPFlowJvtToolAlg')
+getPFlowfJVT(jetalg='AntiKt4EMPFlow',sequence=SeqPHYS, algname='PHYSJetForwardPFlowJvtToolAlg')
 
 #====================================================================
 # EGAMMA
diff --git a/Reconstruction/Jet/JetMomentTools/CMakeLists.txt b/Reconstruction/Jet/JetMomentTools/CMakeLists.txt
index 3380b03d56bb..832412f36321 100644
--- a/Reconstruction/Jet/JetMomentTools/CMakeLists.txt
+++ b/Reconstruction/Jet/JetMomentTools/CMakeLists.txt
@@ -13,7 +13,7 @@ atlas_add_library( JetMomentToolsLib
    JetMomentTools/*.h Root/*.cxx
    PUBLIC_HEADERS JetMomentTools
    INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${FASTJET_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS}
-   LINK_LIBRARIES ${Boost_LIBRARIES} ${FASTJET_LIBRARIES} ${ROOT_LIBRARIES} AsgDataHandlesLib AsgTools InDetTrackSelectionToolLib JetEDM JetInterface JetRecLib JetUtils PFlowUtilsLib TrackVertexAssociationToolLib xAODCaloEvent xAODEventInfo xAODJet xAODMissingET xAODTracking xAODTruth
+   LINK_LIBRARIES ${Boost_LIBRARIES} ${FASTJET_LIBRARIES} ${ROOT_LIBRARIES} AsgDataHandlesLib AsgTools InDetTrackSelectionToolLib JetCalibToolsLib JetEDM JetInterface JetRecLib JetUtils PFlowUtilsLib TrackVertexAssociationToolLib xAODCaloEvent xAODEventInfo xAODJet xAODMissingET xAODTracking xAODTruth
    PRIVATE_LINK_LIBRARIES CaloGeoHelpers xAODMetaData xAODPFlow PathResolver )
 
 if( NOT XAOD_STANDALONE )
@@ -24,7 +24,7 @@ if( NOT XAOD_STANDALONE )
    atlas_add_component( JetMomentTools
       src/*.h src/*.cxx src/components/*.cxx
       INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${FASTJET_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS}
-      LINK_LIBRARIES ${Boost_LIBRARIES} ${FASTJET_LIBRARIES} ${ROOT_LIBRARIES} AsgTools CaloIdentifier xAODCaloEvent xAODJet GaudiKernel JetEDM JetInterface JetRecLib JetUtils PFlowUtilsLib PathResolver JetMomentToolsLib ${extra_libs} )
+      LINK_LIBRARIES ${Boost_LIBRARIES} ${FASTJET_LIBRARIES} ${ROOT_LIBRARIES} AsgTools CaloIdentifier xAODCaloEvent xAODJet GaudiKernel JetCalibToolsLib JetEDM JetInterface JetRecLib JetUtils PFlowUtilsLib PathResolver JetMomentToolsLib ${extra_libs} )
 endif()
 
 #if( XAOD_STANDALONE )
diff --git a/Reconstruction/Jet/JetMomentTools/JetMomentTools/JetForwardPFlowJvtTool.h b/Reconstruction/Jet/JetMomentTools/JetMomentTools/JetForwardPFlowJvtTool.h
new file mode 100644
index 000000000000..7936f747f7bd
--- /dev/null
+++ b/Reconstruction/Jet/JetMomentTools/JetMomentTools/JetForwardPFlowJvtTool.h
@@ -0,0 +1,170 @@
+///////////////////////// -*- C++ -*- /////////////////////////////
+
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+// JetForwardPFlowJvtTool.h
+// Header file for class JetForwardPFlowJvtTool
+// Author: Anastasia Kotsokechagia <anastasia.kotsokechagia@cern.ch>
+
+// Tool for calculating fjvt values for pflow jets. 
+// Short describtion of the tool;
+//   First central PU jets are built per vertex.
+//   Reconstructed calibrated jets are then used to calculate the per vertex missing momentum (miss-mom). 
+//   The per vertex missing momentum is defined as: The vector some of the calibrated jet momenta (for jets with pt>20GeV && Rpt>0.1 wrt to the vertex) + tracks assosiated to the vertex (otherwise). 
+//   PU Jets closeby (dR<0.3) to a HS jet are not considered.
+//   The fJVT value for every forward jet (fj) of the event is then calculated choosing the vertex with the largest negative miss-mom projection on the fj.  
+//   User action: After initializing the tool the user has to call the modify(xAOD::JetContainer& jetCont) function. Argument in this fuction is the PFlow jet container of the event. 
+//   The fjvt value for every forward jet of the container is then calculated and can be retrieved.
+///////////////////////////////////////////////////////////////////
+    //Parameters
+    // m_orLabel:  ""  
+    // m_jetsName : "Container name for the output reconstructed PU jets " 
+    // m_tightOP: "If true a tight fjvt threshold value is applied" 
+    // m_outLabelFjvt: "Decorator for passing fJVT threshold (tight or loose)"                            
+    // m_jetchargedp4: "Name of the jet charged momentum 4-vector" 
+    // m_etaThresh: "Maximum eta value for considering a jet as central" 
+    // m_forwardMinPt: "Minimum forward jet pt" 
+    // m_forwardMaxPt: "Maximum forward jet pt. If -1 no threshold is applied" 
+    // m_centerMinPt: "Minimum central jet pt"  
+    // m_centerMaxPt: "Maximum central jet pt. If -1 no threshold is applied" 
+    // m_pvind: "Hard-Scatter primary vertex index of the event. If -1 it's automatically retrieved from the event"
+    // m_rptCut: "Rpt cut value for central PU jets contributing in the missing momentum calculation" 
+    // m_jvtCut: "JVT threshold value for considering a central PU jet as HS" 
+    // m_dzCut: "Dz=z-z0 cut value for pfo objects participating in the HS vertex jet reco" 
+    // m_vertices: "Number of vertices for which the missing momentum is calculated"
+    // m_maxRap: "Maximum rapidity value in fastjet::AreaDefinition" 
+    // m_neutMaxRap: "Maximum rapidity value for neutral pfos participating in jet reco"
+    // m_weight: "PFO weight value"
+    // m_pfoToolName: "Name of PFO retriever tool"
+    // m_wpfoToolName: "Name of PFO weighting tool"
+    // m_pfoJESName: "Name of jet calibration tool"
+    // m_jetAlgo: "Jet calibration collection name"
+    // m_calibconfig: "Calibration config for PFlow jets, need to be updated with latest one"
+    // m_calibSeq: "Calibration sequence to be applied"
+    // m_calibArea: "Calibration area" 
+    // m_isdata: "True if data"
+
+
+#ifndef FORWARDPFLOWJVTTOOL_JVT_FORWARDPFLOWJVTTOOL_H
+#define FORWARDPFLOWJVTTOOL_JVT_FORWARDPFLOWJVTTOOL_H 1
+
+// STL includes
+#include <string>
+
+// FrameWork includes
+#include "AsgTools/ToolHandle.h"
+#include "AsgTools/AsgTool.h"
+#include "AsgTools/PropertyWrapper.h"
+#include "JetInterface/IJetDecorator.h"
+#include "JetEDM/TrackVertexAssociation.h"
+#include "xAODJet/JetContainer.h"
+#include "xAODJet/JetAuxContainer.h"
+
+#include "AsgDataHandles/ReadDecorHandleKey.h"
+#include "AsgDataHandles/ReadDecorHandle.h"
+#include "AsgDataHandles/WriteDecorHandleKey.h"
+#include "AsgDataHandles/WriteDecorHandle.h"
+
+// Pflow tools 
+#include "PFlowUtils/IWeightPFOTool.h"
+#include "PFlowUtils/WeightPFOTool.h"
+#include "JetCalibTools/IJetCalibrationTool.h"
+
+#include "AsgTools/ToolHandle.h"
+#include "JetCalibTools/IJetCalibrationTool.h"
+
+namespace pflow {
+  struct puJets {
+    std::shared_ptr<xAOD::JetContainer> jetCont;
+    std::shared_ptr<xAOD::JetAuxContainer> jetAuxCont;
+  };
+}
+
+  class JetForwardPFlowJvtTool
+  : public asg::AsgTool,
+    virtual public IJetDecorator{
+    ASG_TOOL_CLASS(JetForwardPFlowJvtTool,IJetDecorator)
+
+    ///////////////////////////////////////////////////////////////////
+    // Public methods:
+    ///////////////////////////////////////////////////////////////////
+  public:
+
+    /// Constructor with parameters:
+    JetForwardPFlowJvtTool(const std::string& name);
+
+    /// Destructor:
+    virtual ~JetForwardPFlowJvtTool();
+
+    virtual StatusCode  initialize() override;
+ 
+
+    virtual StatusCode decorate(const xAOD::JetContainer& jetCont) const override;
+
+    float getFJVT(const xAOD::Jet *jet,std::vector<TVector2> pileupMomenta) const;
+    bool isForwardJet(const xAOD::Jet *jet) const;
+    bool isCentralJet(const xAOD::Jet *jet) const;
+
+    StatusCode tagTruth(const xAOD::JetContainer *jets,const xAOD::JetContainer *truthJets);
+    std::vector<TVector2> calculateVertexMomenta(const xAOD::JetContainer *jets,int pvind, int vertices) const;
+    pflow::puJets buildPFlowPUjets(const xAOD::Vertex &vx) const;
+    bool hasCloseByHSjet(const xAOD::Jet *jet, const xAOD::JetContainer *pjets ) const;
+    double getRpt(const xAOD::Jet *jet) const;
+    fastjet::PseudoJet pfoToPseudoJet(const xAOD::PFO* pfo, const CP::PFO_JetMETConfig_charge& theCharge, const xAOD::Vertex *vx) const;
+
+  private:
+
+    SG::ReadHandleKey<jet::TrackVertexAssociation> m_tvaKey{this, "TrackVertexAssociation", "", "Input track-vertex association"};
+    Gaudi::Property<std::string> m_jetContainerName{this, "JetContainer", "", "SG key for the input jet container"};
+    Gaudi::Property<std::string> m_jetsName{this, "jetsName", "AntiKt4PUPFlowJets", "Container name for the output reconstructed PU jets"};
+    Gaudi::Property<std::string> m_jetchargedp4{this, "jetchargedp4", "JetChargedScaleMomentum", "Name of the jet charged momentum 4-vector"};
+    Gaudi::Property<std::string> m_pfoToolName{this, "pfoToolName", "PFOTool", "Name of PFO retriever tool"};
+    Gaudi::Property<std::string> m_wpfoToolName{this, "wpfoToolName", "WPFOTool", "Name of PFO weighting tool"};
+    Gaudi::Property<std::string> m_pfoJESName{this, "pfoJESName", "pfoJES", "Name of jet claibration tool"};
+    Gaudi::Property<std::string> m_jetAlgo{this, "jetAlgo", "AntiKt4EMPFlow", "Jet calibration collection name"};
+    Gaudi::Property<std::string> m_calibconfig{this, "calibconfig", "JES_MC16Recommendation_Consolidated_PFlow_Apr2019_Rel21.config", "Calibration config for PFlow jets, need to be updated with latest one"};
+    Gaudi::Property<std::string> m_calibSeq{this, "calibSeq", "JetArea_Residual_EtaJES", "Calibration sequence to be applied"};
+    Gaudi::Property<std::string> m_calibArea{this, "calibArea", "00-04-82", "Calibration area"};
+    
+    Gaudi::Property<bool> m_isdata{this, "isdata", false, "True if data"};
+    Gaudi::Property<int> m_pvind{this, "pvind", -1, "Hard-Scatter primary vertex index of the event. If -1 it will be automatically retrieved from the event"};
+    Gaudi::Property<int> m_vertices{this, "vertices", 10, "Number of vertices for which the missing momentum is calculated"};
+    Gaudi::Property<bool> m_includePV{this, "includePV", false, "Flag to include jets and tracks associated to PV in the calculation"};
+    Gaudi::Property<double> m_etaThresh{this, "etaThresh", 2.5, "Maximum eta value for considering a jet as central"};
+    Gaudi::Property<double> m_forwardMinPt{this, "forwardMinPt", 20e3, "Minimum forward jet pt"};
+    Gaudi::Property<double> m_forwardMaxPt{this, "forwardMaxPt", -1, "Maximum forward jet pt. If -1 no threshold is applied"};
+    Gaudi::Property<double> m_centerMinPt{this, "centralMinPt", 20e3, "Minimum central jet pt"};
+    Gaudi::Property<double> m_centerMaxPt{this, "centralMaxPt", -1, "Maximum central jet pt. If -1 no threshold is applied"};
+    Gaudi::Property<double> m_fjvtThresh{this, "fjvtThresh", 15e3, "fjvt threshold value"};
+    Gaudi::Property<double> m_rptCut{this, "rptCut", 0.1, "Rpt cut value for central PU jets contributing in the missing momentum calculation"};
+    Gaudi::Property<double> m_jvtCut{this, "jvtCut", 0.2, "JVT threshold value for considering a central PU jet as HS"};
+    Gaudi::Property<double> m_dzCut{this, "dzCut", 2.0, "Dz=z=-z0 cut for pfo objects participating in the HS vertex jet reco"};
+    Gaudi::Property<double> m_maxRap{this, "maxRap", 2.5, "Maximum rapidity value in fastjet::AreaDefinition"};
+    Gaudi::Property<double> m_neutMaxRap{this, "neutMaxRap", 2.5, "Maximum rapidity value for neutral pfos participating in jet reco"};
+    Gaudi::Property<float>  m_weight{this, "weight", 0, "PFO weight value"};
+    Gaudi::Property<bool> m_tightOP{this, "tightOP", false, "If true a tight fjvt threshold value is applied"};
+
+    // not used?
+    //Gaudi::Property<std::string> m_jvtMomentName{"jvtMomentName", "", ""};
+    //Gaudi::Property<double> m_centerJvtThresh{"", 0, ""};
+
+    SG::ReadHandleKey<xAOD::VertexContainer> m_vxContKey{this, "verticesName", "PrimaryVertices", "Container name of vertices to be retrieved"};
+    SG::ReadHandleKey<xAOD::PFOContainer> m_PFOKey{this, "PFOName", "CHSParticleFlowObjects", "SG Key for CHS PFO Container"};
+
+    SG::ReadDecorHandleKey<xAOD::JetContainer> m_jvtKey{this, "jvtName", "Jvt", "SG key for the Jvt decoration"};
+    SG::ReadDecorHandleKey<xAOD::PFO> m_orKey{this, "ORName", "", "OR label"};
+    
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_fjvtKey{this, "FjvtName", "passOnlyFJVT", "Decorator for passing fJVT threshold (tight or loose)"};
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_fjvtRawKey{this, "FjvtRawName", "fJvt", "Decorator for raw fJVT variable"};
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_isHSKey{this, "isHSName", "isJVTHS", "SG key for output isJVTHS decoration"};
+    SG::WriteDecorHandleKey<xAOD::JetContainer> m_isPUKey{this, "isPUName", "isJvtPU", "SG key for output isJVTPU decoration"};
+    
+    ToolHandle<CP::WeightPFOTool> m_wpfotool{this,"WeightPFOTool", "", "Weight PFO tool name"};
+    ToolHandle<IJetCalibrationTool> m_pfoJES{this,"JetCalibrationTool", "", "Jet calibration tool name"};
+
+    std::size_t getPV() const;
+
+  };
+#endif //> !FORWARDJVTTOOL_JVT_FORWARDJVTTOOL_H
diff --git a/Reconstruction/Jet/JetMomentTools/Root/JetForwardPFlowJvtTool.cxx b/Reconstruction/Jet/JetMomentTools/Root/JetForwardPFlowJvtTool.cxx
new file mode 100644
index 000000000000..18d25c683331
--- /dev/null
+++ b/Reconstruction/Jet/JetMomentTools/Root/JetForwardPFlowJvtTool.cxx
@@ -0,0 +1,328 @@
+///////////////////////// -*- C++ -*- /////////////////////////////
+
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+// JetForwardPFlowJvtTool.cxx
+// Implementation file for class JetForwardPFlowJvtTool
+// Author: Anastasia Kotsokechagia <anastasia.kotsokechagia@cern.ch>
+///////////////////////////////////////////////////////////////////
+
+// JetForwardPFlowJvtTool includes
+#include "JetMomentTools/JetForwardPFlowJvtTool.h"
+
+// Jet EDM
+#include "xAODJet/JetAttributes.h"
+
+// FastJet
+#include "fastjet/ClusterSequence.hh"
+#include "fastjet/ClusterSequenceArea.hh"
+#include <fastjet/AreaDefinition.hh>
+
+// Jet
+#include "JetRec/JetFromPseudojet.h"
+
+  ///////////////////////////////////////////////////////////////////
+  // Public methods:
+  ///////////////////////////////////////////////////////////////////
+
+  // Constructors
+  ////////////////
+  JetForwardPFlowJvtTool::JetForwardPFlowJvtTool(const std::string& name) :
+    AsgTool(name) {
+  }
+  
+ // Destructor
+  ///////////////
+  JetForwardPFlowJvtTool::~JetForwardPFlowJvtTool()
+  {}
+
+  // Athena algtool's Hooks
+  ////////////////////////////
+  StatusCode JetForwardPFlowJvtTool::initialize()
+  {
+    ATH_MSG_INFO ("Initializing " << name() << "...");
+    if (m_tightOP) m_fjvtThresh = 0.53;
+    else m_fjvtThresh = 0.72;
+
+    ATH_CHECK( m_tvaKey.initialize() );
+
+    if(m_jetContainerName.empty()){
+      ATH_MSG_ERROR("JetForwardPFlowJvtTool needs to have its input jet container configured!");
+      return StatusCode::FAILURE;
+    }
+
+    if(!m_orKey.key().empty()){
+      m_orKey = m_jetContainerName + "." + m_orKey.key();
+      ATH_CHECK(m_orKey.initialize());
+    }
+    m_fjvtKey = m_jetContainerName + "." + m_fjvtKey.key();
+    m_fjvtRawKey = m_jetContainerName + "." + m_fjvtRawKey.key();
+    m_isHSKey = m_jetContainerName + "." + m_isHSKey.key();
+    m_isPUKey = m_jetContainerName + "." + m_isPUKey.key();
+    m_jvtKey = m_jetContainerName + "." + m_jvtKey.key();
+
+    ATH_CHECK(m_fjvtKey.initialize());
+    ATH_CHECK(m_fjvtRawKey.initialize());
+    ATH_CHECK(m_isHSKey.initialize());
+    ATH_CHECK(m_isPUKey.initialize());
+    ATH_CHECK(m_jvtKey.initialize());
+
+    ATH_CHECK(m_vxContKey.initialize());
+    ATH_CHECK(m_PFOKey.initialize());
+    
+    return StatusCode::SUCCESS;
+  }
+
+  StatusCode JetForwardPFlowJvtTool::decorate(const xAOD::JetContainer& jetCont) const {
+    std::vector<TVector2> pileupMomenta;
+
+    pileupMomenta=calculateVertexMomenta(&jetCont,m_pvind, m_vertices);
+
+    SG::WriteDecorHandle<xAOD::JetContainer, char> fjvtHandle(m_fjvtKey);
+    SG::WriteDecorHandle<xAOD::JetContainer, float> fjvtRawHandle(m_fjvtRawKey);
+    if(pileupMomenta.size()==0) {
+      ATH_MSG_DEBUG( "pileupMomenta is empty, this can happen for events with no PU vertices."
+                     <<" fJVT won't be computed for this event and will be set to 0 instead." );
+      for(const xAOD::Jet* jetF : jetCont) {
+	fjvtHandle(*jetF) = 1;
+	fjvtRawHandle(*jetF) = 0;
+      }
+      return StatusCode::SUCCESS;
+    }
+
+    for(const xAOD::Jet* jetF : jetCont) {
+      fjvtHandle(*jetF) = 1;
+      fjvtRawHandle(*jetF) = 0;
+
+      if (isForwardJet(jetF)){
+       double fjvt = getFJVT(jetF,pileupMomenta);
+       if (fjvt>m_fjvtThresh) fjvtHandle(*jetF) = 0;
+       fjvtRawHandle(*jetF) = fjvt;
+      }
+    }
+    return StatusCode::SUCCESS;
+  }
+
+  float JetForwardPFlowJvtTool::getFJVT(const xAOD::Jet *jet, std::vector<TVector2> pileupMomenta) const {
+    TVector2 fjet(jet->pt()*cos(jet->phi()),jet->pt()*sin(jet->phi()));
+    double fjvt = 0;
+    for (const TVector2& pu : pileupMomenta) {
+      double projection = pu*fjet/fjet.Mod();
+      if (projection<fjvt) fjvt = projection;
+    }
+    return -1*fjvt/fjet.Mod();
+  }
+
+  std::vector<TVector2> JetForwardPFlowJvtTool::calculateVertexMomenta(const xAOD::JetContainer *pjets,
+                                                                       int pvind, int vertices) const {
+    std::vector<TVector2> pileupMomenta;
+    // -- Retrieve PV index if not provided by user
+    const std::size_t pv_index = (pvind==-1) ? getPV() : std::size_t(pvind);
+
+    SG::ReadHandle<xAOD::VertexContainer> vxContHandle(m_vxContKey);
+
+    for(const xAOD::Vertex* vx: *vxContHandle) {
+      if(vx->vertexType()!=xAOD::VxType::PriVtx && vx->vertexType()!=xAOD::VxType::PileUp) continue;
+      if(vx->index()==(size_t)pv_index) continue;
+
+      TString jname = m_jetsName.value();
+      jname += vx->index();
+
+      pflow::puJets vertjets = buildPFlowPUjets(*vx);
+      if( !vertjets.jetCont || !vertjets.jetAuxCont ){
+        ATH_MSG_WARNING(" Some issue appeared while building the pflow pileup jets for vertex "
+                        << vx->index() << " (vxType = " << vx->vertexType()<<" )!" );
+        return pileupMomenta;
+      }
+      
+      TVector2 vertex_met;
+      for( const xAOD::Jet *jet : *(vertjets.jetCont) ) {
+
+        // Remove jets which are close to hs
+        if (!m_includePV && hasCloseByHSjet(jet,pjets)) continue;
+
+        // Calculate vertex missing momentum
+        if (isCentralJet(jet) && getRpt(jet)> m_rptCut)
+        { 
+          vertex_met += TVector2(jet->pt()*cos(jet->phi()),jet->pt()*sin(jet->phi()) ) ;
+        } 
+        else{
+          vertex_met += TVector2(jet->jetP4(m_jetchargedp4).Pt()*cos(jet->jetP4(m_jetchargedp4).Phi()),
+                                 jet->jetP4(m_jetchargedp4).Pt()*sin(jet->jetP4(m_jetchargedp4).Phi()) );
+        }
+      }
+
+      pileupMomenta.push_back(vertex_met);
+      if(vertices!=-1 && int(vx->index())==vertices) break;
+    }
+    return pileupMomenta;
+  }
+
+  bool JetForwardPFlowJvtTool::hasCloseByHSjet(const xAOD::Jet *jet, const xAOD::JetContainer *pjets ) const {
+    for (const xAOD::Jet* pjet : *pjets) {
+      float jet_jvt=0;
+      SG::ReadDecorHandle<xAOD::JetContainer, float> jvtHandle(m_jvtKey);
+      jet_jvt = jvtHandle(*pjet);
+     if (pjet->p4().DeltaR(jet->p4())<0.3 && jet_jvt>m_jvtCut && isCentralJet(pjet) ) return true;
+    }
+    return false;
+  }
+
+  pflow::puJets JetForwardPFlowJvtTool::buildPFlowPUjets(const xAOD::Vertex &vx) const {
+    pflow::puJets pu_jets;
+    const std::size_t pv_index = (m_pvind==-1) ? getPV() : std::size_t (m_pvind);
+
+    std::vector<fastjet::PseudoJet> input_pfo;
+    std::set<int> charged_pfo;
+
+    SG::ReadHandle<jet::TrackVertexAssociation> tvaHandle(m_tvaKey);
+    SG::ReadHandle<xAOD::PFOContainer> PFOHandle(m_PFOKey);
+        
+    if (!tvaHandle.isValid()){
+      ATH_MSG_ERROR("Could not retrieve the TrackVertexAssociation: "
+                    << m_tvaKey.key());
+      return pu_jets;
+    }
+    for(const xAOD::PFO* pfo : *PFOHandle){
+      if (m_orKey.key().empty()) continue;
+      SG::ReadDecorHandle<xAOD::PFO, char> orHandle(m_orKey);
+      if (!orHandle(*pfo)) continue;
+      if (pfo->isCharged()) { 
+        if (vx.index()==pv_index && std::abs((vx.z()-pfo->track(0)->z0())*sin(pfo->track(0)->theta()))>m_dzCut)
+          continue;
+        if (vx.index()!=pv_index
+            && (!tvaHandle->associatedVertex(pfo->track(0))
+                || vx.index()!=tvaHandle->associatedVertex(pfo->track(0))->index())
+            ) continue;
+        input_pfo.push_back(pfoToPseudoJet(pfo, CP::charged, &vx) );
+        charged_pfo.insert(pfo->index());
+      } 
+      else if (std::abs(pfo->eta())<m_neutMaxRap && !pfo->isCharged() && pfo->eEM()>0)
+      { 
+        input_pfo.push_back(pfoToPseudoJet(pfo, CP::neutral, &vx) );
+      }
+    }
+    std::shared_ptr<xAOD::JetContainer> vertjets = std::make_shared<xAOD::JetContainer>();
+    std::shared_ptr<xAOD::JetAuxContainer> vertjetsAux = std::make_shared<xAOD::JetAuxContainer>();
+
+    vertjets->setStore(vertjetsAux.get());
+    TString newname = m_jetsName.value();
+    newname += vx.index();
+
+    fastjet::JetDefinition jet_def(fastjet::antikt_algorithm,0.4);
+    fastjet::AreaDefinition area_def(fastjet::active_area_explicit_ghosts,
+                                     fastjet::GhostedAreaSpec(fastjet::SelectorAbsRapMax(m_maxRap)));
+    fastjet::ClusterSequenceArea clust_pfo(input_pfo,jet_def,area_def);
+    std::vector<fastjet::PseudoJet> inclusive_jets = sorted_by_pt(clust_pfo.inclusive_jets(5000.));
+
+    for (size_t i = 0; i < inclusive_jets.size(); i++) {
+      xAOD::Jet* jet=  new xAOD::Jet();
+      xAOD::JetFourMom_t tempjetp4(inclusive_jets[i].pt(),
+                                   inclusive_jets[i].eta(),
+                                   inclusive_jets[i].phi(),
+                                   inclusive_jets[i].m());
+      xAOD::JetFourMom_t newArea(inclusive_jets[i].area_4vector().perp(),
+                                 inclusive_jets[i].area_4vector().eta(),
+                                 inclusive_jets[i].area_4vector().phi(),
+                                 inclusive_jets[i].area_4vector().m());
+      vertjets->push_back(jet);
+      jet->setJetP4(tempjetp4);
+      jet->setJetP4("JetConstitScaleMomentum",tempjetp4);
+      jet->setJetP4("JetPileupScaleMomentum",tempjetp4);
+      jet->setAttribute("ActiveArea4vec",newArea);
+      jet->setAttribute("DetectorEta",jet->eta());
+      std::vector<fastjet::PseudoJet> constituents = inclusive_jets[i].constituents();
+      float chargedpart = 0;
+      for (size_t j = 0; j < constituents.size(); j++) {
+        if (charged_pfo.count(constituents[j].user_index())>=1) {
+          chargedpart += constituents[j].perp(); 
+        }
+      }
+      xAOD::JetFourMom_t chargejetp4(chargedpart,inclusive_jets[i].eta(),inclusive_jets[i].phi(),inclusive_jets[i].m());
+      jet->setJetP4(m_jetchargedp4,chargejetp4);
+    }
+
+    if((m_pfoJES->modify(*vertjets)).isFailure()){
+      ATH_MSG_ERROR(" Failed to calibrate PU jet container ");
+      return pu_jets;
+    }
+
+    pu_jets.jetCont = vertjets;
+    pu_jets.jetAuxCont = vertjetsAux;
+    return pu_jets;
+  }
+
+  fastjet::PseudoJet JetForwardPFlowJvtTool::pfoToPseudoJet(const xAOD::PFO* pfo, const CP::PFO_JetMETConfig_charge& theCharge, const xAOD::Vertex *vx) const {
+    TLorentzVector pfo_p4;
+    if (CP::charged == theCharge){
+      float pweight = m_weight;
+      if( (m_wpfotool->fillWeight(*pfo,pweight)).isSuccess() ){
+	// Create a PSeudojet with the momentum of the selected IParticle
+	pfo_p4= TLorentzVector(pfo->p4().Px()*pweight,pfo->p4().Py()*pweight,pfo->p4().Pz()*pweight,pfo->e()*pweight);
+      }
+    } else if (CP::neutral == theCharge){ 
+      pfo_p4= pfo->GetVertexCorrectedEMFourVec(*vx);
+    }
+    fastjet::PseudoJet psj(pfo_p4);
+    // User index is used to identify the xAOD object used for the PSeudoJet
+    if (CP::charged == theCharge){
+      psj.set_user_index(pfo->index());
+    }else{
+      psj.set_user_index(-1);
+    }
+
+    return psj;
+  }
+
+  bool JetForwardPFlowJvtTool::isForwardJet(const xAOD::Jet *jet) const {
+    if (std::abs(jet->eta())<m_etaThresh) return false;
+    if (jet->pt()<m_forwardMinPt || (m_forwardMaxPt>0 && jet->pt()>m_forwardMaxPt) ) return false;
+    return true;
+  }
+
+  bool JetForwardPFlowJvtTool::isCentralJet(const xAOD::Jet *jet) const {
+    if (std::abs(jet->eta())>m_etaThresh) return false;
+    if (jet->pt()<m_centerMinPt || (m_centerMaxPt>0 && jet->pt()>m_centerMaxPt)) return false;
+    return true;
+  }
+
+  double JetForwardPFlowJvtTool::getRpt(const xAOD::Jet *jet) const {
+    double Rpt;
+    Rpt= jet->jetP4(m_jetchargedp4).Pt()/ jet->pt();
+    return Rpt;
+  }
+
+  std::size_t JetForwardPFlowJvtTool::getPV() const{
+    if (m_includePV) return -1;
+
+    //const xAOD::VertexContainer *vxCont = 0;
+    SG::ReadHandle<xAOD::VertexContainer> vxContHandle(m_vxContKey);
+      ATH_MSG_DEBUG("Successfully retrieved primary vertex container");
+      for(const xAOD::Vertex *vx : *vxContHandle) {
+        if(vx->vertexType()==xAOD::VxType::PriVtx) return vx->index();
+      }
+    ATH_MSG_WARNING("Couldn't identify the hard-scatter primary vertex (no vertex with \"vx->vertexType()==xAOD::VxType::PriVtx\" in the container)!");
+    // this almost certainly isn't what we should do here, the
+    // caller doesn't check this for errors
+    return 0;
+  }
+
+  StatusCode JetForwardPFlowJvtTool::tagTruth(const xAOD::JetContainer *jets,const xAOD::JetContainer *truthJets) {
+    SG::WriteDecorHandle<xAOD::JetContainer, bool> isHSHandle(m_isHSKey);
+    SG::WriteDecorHandle<xAOD::JetContainer, bool> isPUHandle(m_isPUKey);
+    
+    for(const xAOD::Jet *jet : *jets) {
+      bool ishs = false;
+      bool ispu = true;
+      for(const xAOD::Jet *tjet : *truthJets) {
+        if (tjet->p4().DeltaR(jet->p4())<0.3 && tjet->pt()>10e3) ishs = true;
+        if (tjet->p4().DeltaR(jet->p4())<0.6) ispu = false;
+      }
+      isHSHandle(*jet)=ishs;
+      isPUHandle(*jet)=ispu;
+    }
+    return StatusCode::SUCCESS;
+  }
+
diff --git a/Reconstruction/Jet/JetMomentTools/src/components/JetMomentTools_entries.cxx b/Reconstruction/Jet/JetMomentTools/src/components/JetMomentTools_entries.cxx
index e9286347a605..674e17470368 100644
--- a/Reconstruction/Jet/JetMomentTools/src/components/JetMomentTools_entries.cxx
+++ b/Reconstruction/Jet/JetMomentTools/src/components/JetMomentTools_entries.cxx
@@ -5,6 +5,7 @@
 #include "JetMomentTools/JetVertexFractionTool.h"
 #include "JetMomentTools/JetVertexTaggerTool.h"
 #include "JetMomentTools/JetForwardJvtTool.h"
+#include "JetMomentTools/JetForwardPFlowJvtTool.h"
 #include "JetMomentTools/JetTrackMomentsTool.h"
 #include "JetMomentTools/JetTrackSumMomentsTool.h"
 #include "JetMomentTools/JetClusterMomentsTool.h"
@@ -29,6 +30,7 @@ DECLARE_COMPONENT( JetWidthTool )
 DECLARE_COMPONENT( JetVertexFractionTool )
 DECLARE_COMPONENT( JetVertexTaggerTool )
 DECLARE_COMPONENT( JetForwardJvtTool )
+DECLARE_COMPONENT(JetForwardPFlowJvtTool)
 DECLARE_COMPONENT( JetTrackMomentsTool )
 DECLARE_COMPONENT( JetTrackSumMomentsTool )
 DECLARE_COMPONENT( JetClusterMomentsTool )
-- 
GitLab


From dcd998f578e507554c134acd4d6b780718a4ff17 Mon Sep 17 00:00:00 2001
From: Tomasz Bold <tomasz.bold@gmail.com>
Date: Wed, 16 Dec 2020 12:34:17 +0000
Subject: [PATCH 071/225] Add precision calo to electron chain

---
 .../CaloRec/python/CaloTopoClusterConfig.py   | 129 +++++++-------
 .../TrigCaloRec/python/TrigCaloRecConfig.py   |  82 +++++++++
 .../python/TrigEgammaPrecisionCaloHypoTool.py |   7 +-
 .../share/runHLT_standalone_newJO.py          |   2 +
 .../Electron/ElectronRecoSequences.py         |   2 +-
 .../Electron/generateElectron.py              | 160 ++++++++++--------
 .../HLTMenuConfig/Menu/MenuComponents.py      |  15 ++
 .../python/HLTMenuConfig/Muon/generateMuon.py |   8 +-
 8 files changed, 271 insertions(+), 134 deletions(-)

diff --git a/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py b/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py
index 7f334ebd4458..a3120b9b9714 100644
--- a/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py
+++ b/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py
@@ -76,7 +76,7 @@ def getTopoClusterLocalCalibTools(configFlags):
     LCDeadMaterial   = CaloLCDeadMaterialTool("LCDeadMaterial")
     LCDeadMaterial.HadDMCoeffKey       = "HadDMCoeff2"
     LCDeadMaterial.ClusterRecoStatus   = 0
-    LCDeadMaterial.WeightModeDM        = 2 
+    LCDeadMaterial.WeightModeDM        = 2
     LCDeadMaterial.UseHadProbability   = True
     LCDeadMaterial.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
 
@@ -101,13 +101,13 @@ def getTopoMoments(configFlags):
     TopoMoments.MaxAxisAngle = 20*deg
     TopoMoments.TwoGaussianNoise = configFlags.Calo.TopoCluster.doTwoGaussianNoise
     TopoMoments.MinBadLArQuality = 4000
-    TopoMoments.MomentsNames = ["FIRST_PHI" 
+    TopoMoments.MomentsNames = ["FIRST_PHI"
                                 ,"FIRST_ETA"
-                                ,"SECOND_R" 
+                                ,"SECOND_R"
                                 ,"SECOND_LAMBDA"
                                 ,"DELTA_PHI"
                                 ,"DELTA_THETA"
-                                ,"DELTA_ALPHA" 
+                                ,"DELTA_ALPHA"
                                 ,"CENTER_X"
                                 ,"CENTER_Y"
                                 ,"CENTER_Z"
@@ -115,12 +115,12 @@ def getTopoMoments(configFlags):
                                 ,"CENTER_LAMBDA"
                                 ,"LATERAL"
                                 ,"LONGITUDINAL"
-                                ,"FIRST_ENG_DENS" 
-                                ,"ENG_FRAC_EM" 
-                                ,"ENG_FRAC_MAX" 
-                                ,"ENG_FRAC_CORE" 
-                                ,"FIRST_ENG_DENS" 
-                                ,"SECOND_ENG_DENS" 
+                                ,"FIRST_ENG_DENS"
+                                ,"ENG_FRAC_EM"
+                                ,"ENG_FRAC_MAX"
+                                ,"ENG_FRAC_CORE"
+                                ,"FIRST_ENG_DENS"
+                                ,"SECOND_ENG_DENS"
                                 ,"ISOLATION"
                                 ,"ENG_BAD_CELLS"
                                 ,"N_BAD_CELLS"
@@ -222,7 +222,7 @@ def getTopoCalibMoments(configFlags):
                                      ,"ENG_CALIB_FRAC_EM"
                                      ,"ENG_CALIB_FRAC_HAD"
                                      ,"ENG_CALIB_FRAC_REST"]
-    
+
     TopoCalibMoments.CalibrationHitContainerNames = ["LArCalibrationHitInactive"
                                                      ,"LArCalibrationHitActive"
                                                      ,"TileCalibHitActiveCell"
@@ -231,43 +231,11 @@ def getTopoCalibMoments(configFlags):
                                                        ,"TileCalibHitDeadMaterial"]
     return TopoCalibMoments
 
-# Steering options for trigger
-# Maybe offline reco options should be extracted from flags elsewhere
-def CaloTopoClusterCfg(configFlags,cellsname="AllCalo",clustersname="",doLCCalib=None,sequenceName='AthAlgSeq'):
+def CaloTopoClusterToolCfg(configFlags, cellsname):
     result=ComponentAccumulator()
-    if (sequenceName != 'AthAlgSeq'):
-        from AthenaCommon.CFElements import seqAND
-        #result.mainSeq( seqAND( sequenceName ) )
-        result.addSequence( seqAND(sequenceName) )
-
-    if not clustersname:
-        clustersname = "CaloTopoClusters"
-
-    from LArGeoAlgsNV.LArGMConfig import LArGMCfg
-    from TileGeoModel.TileGMConfig import TileGMCfg
-    from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
-    # Schedule total noise cond alg
-    result.merge(CaloNoiseCondAlgCfg(configFlags,"totalNoise"))
-    # Schedule electronic noise cond alg (needed for LC weights)
-    result.merge(CaloNoiseCondAlgCfg(configFlags,"electronicNoise"))
-    
-    CaloTopoClusterMaker, CaloTopoClusterSplitter, CaloClusterMaker, CaloClusterSnapshot=CompFactory.getComps("CaloTopoClusterMaker","CaloTopoClusterSplitter","CaloClusterMaker","CaloClusterSnapshot",)
-
-    result.merge(LArGMCfg(configFlags))
-
-    from LArCalibUtils.LArHVScaleConfig import LArHVScaleCfg
-    result.merge(LArHVScaleCfg(configFlags))
-
-    result.merge(TileGMCfg(configFlags))
-
-    if not doLCCalib:
-        theCaloClusterSnapshot=CaloClusterSnapshot(OutputName=clustersname+"snapshot",SetCrossLinks=True)
-    else:
-        theCaloClusterSnapshot=CaloClusterSnapshot(OutputName=clustersname,SetCrossLinks=True)
-         
     # maker tools
-    TopoMaker = CaloTopoClusterMaker("TopoMaker")
-        
+    TopoMaker = CompFactory.CaloTopoClusterMaker("TopoMaker")
+
     TopoMaker.CellsName = cellsname
     TopoMaker.CalorimeterNames=["LAREM",
                                 "LARHEC",
@@ -281,7 +249,7 @@ def CaloTopoClusterCfg(configFlags,cellsname="AllCalo",clustersname="",doLCCalib
                                    "TileBar0", "TileBar1", "TileBar2",
                                    "TileExt0", "TileExt1", "TileExt2",
                                    "TileGap1", "TileGap2", "TileGap3",
-                                   "FCAL0", "FCAL1", "FCAL2"] 
+                                   "FCAL0", "FCAL1", "FCAL2"]
     TopoMaker.NeighborOption = "super3D"
     TopoMaker.RestrictHECIWandFCalNeighbors  = False
     TopoMaker.RestrictPSNeighbors  = True
@@ -294,18 +262,22 @@ def CaloTopoClusterCfg(configFlags,cellsname="AllCalo",clustersname="",doLCCalib
     TopoMaker.CutOOTseed = configFlags.Calo.TopoCluster.extendTimeCut and configFlags.Calo.TopoCluster.doTimeCut
     TopoMaker.UseTimeCutUpperLimit = configFlags.Calo.TopoCluster.useUpperLimitForTimeCut
     TopoMaker.TimeCutUpperLimit = 20.0
-    
-    # note E or AbsE 
+
+    # note E or AbsE
     #
     # the following property must be set to TRUE in order to make double
-    # sided cuts on the seed and the cluster level 
+    # sided cuts on the seed and the cluster level
     #
     TopoMaker.SeedCutsInAbsE                 = True
     TopoMaker.ClusterEtorAbsEtCut            = 0.0*MeV
     # use 2-gaussian or single gaussian noise for TileCal
     TopoMaker.TwoGaussianNoise = configFlags.Calo.TopoCluster.doTwoGaussianNoise
-        
-    TopoSplitter = CaloTopoClusterSplitter("TopoSplitter")
+    result.setPrivateTools(TopoMaker)
+    return result
+
+def CaloTopoClusterSplitterToolCfg(configFlags):
+    result=ComponentAccumulator()
+    TopoSplitter = CompFactory.CaloTopoClusterSplitter("TopoSplitter")
     # cells from the following samplings will be able to form local
     # maxima. The excluded samplings are PreSamplerB, EMB1,
     # PreSamplerE, EME1, all Tile samplings, all HEC samplings and the
@@ -326,6 +298,45 @@ def CaloTopoClusterCfg(configFlags,cellsname="AllCalo",clustersname="",doLCCalib
     TopoSplitter.ShareBorderCells = True
     TopoSplitter.RestrictHECIWandFCalNeighbors  = False
     TopoSplitter.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
+    result.setPrivateTools(TopoSplitter)
+    return result
+
+# Steering options for trigger
+# Maybe offline reco options should be extracted from flags elsewhere
+def CaloTopoClusterCfg(configFlags,cellsname="AllCalo",clustersname="",doLCCalib=None,sequenceName='AthAlgSeq'):
+    result=ComponentAccumulator()
+    if (sequenceName != 'AthAlgSeq'):
+        from AthenaCommon.CFElements import seqAND
+        #result.mainSeq( seqAND( sequenceName ) )
+        result.addSequence( seqAND(sequenceName) )
+
+    if not clustersname:
+        clustersname = "CaloTopoClusters"
+
+    from LArGeoAlgsNV.LArGMConfig import LArGMCfg
+    from TileGeoModel.TileGMConfig import TileGMCfg
+    from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
+    # Schedule total noise cond alg
+    result.merge(CaloNoiseCondAlgCfg(configFlags,"totalNoise"))
+    # Schedule electronic noise cond alg (needed for LC weights)
+    result.merge(CaloNoiseCondAlgCfg(configFlags,"electronicNoise"))
+
+    CaloClusterMaker, CaloClusterSnapshot=CompFactory.getComps("CaloClusterMaker","CaloClusterSnapshot",)
+
+    result.merge(LArGMCfg(configFlags))
+
+    from LArCalibUtils.LArHVScaleConfig import LArHVScaleCfg
+    result.merge(LArHVScaleCfg(configFlags))
+
+    result.merge(TileGMCfg(configFlags))
+
+    if not doLCCalib:
+        theCaloClusterSnapshot=CaloClusterSnapshot(OutputName=clustersname+"snapshot",SetCrossLinks=True)
+    else:
+        theCaloClusterSnapshot=CaloClusterSnapshot(OutputName=clustersname,SetCrossLinks=True)
+
+    TopoMaker = result.popToolsAndMerge( CaloTopoClusterToolCfg(configFlags, cellsname=cellsname))
+    TopoSplitter = result.popToolsAndMerge( CaloTopoClusterSplitterToolCfg(configFlags) )
     #
     # the following options are not set, since these are the default
     # values
@@ -333,13 +344,13 @@ def CaloTopoClusterCfg(configFlags,cellsname="AllCalo",clustersname="",doLCCalib
     # NeighborOption                = "super3D",
     # NumberOfCellsCut              = 4,
     # EnergyCut                     = 500*MeV,
-        
+
 
     CaloTopoCluster=CaloClusterMaker(clustersname)
     CaloTopoCluster.ClustersOutputName=clustersname
 
     CaloTopoCluster.ClusterMakerTools = [TopoMaker, TopoSplitter]
-    
+
     from CaloBadChannelTool.CaloBadChanToolConfig import CaloBadChanToolCfg
     caloBadChanTool = result.popToolsAndMerge( CaloBadChanToolCfg(configFlags) )
     CaloClusterBadChannelList=CompFactory.CaloClusterBadChannelList
@@ -375,20 +386,20 @@ if __name__=="__main__":
 
     ConfigFlags.lock()
 
-    from AthenaConfiguration.MainServicesConfig import MainServicesCfg 
+    from AthenaConfiguration.MainServicesConfig import MainServicesCfg
     from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
 
     cfg=MainServicesCfg(ConfigFlags)
     cfg.merge(PoolReadCfg(ConfigFlags))
     # from IOVDbSvc.IOVDbSvcConfig import IOVDbSvcCfg
     # cfg.mergeAll(IOVDbSvcCfg(ConfigFlags))
-    
+
     theKey="CaloCalTopoClustersNew"
 
     topoAcc=CaloTopoClusterCfg(ConfigFlags)
     topoAlg = topoAcc.getPrimary()
     topoAlg.ClustersOutputName=theKey
-    
+
     cfg.merge(topoAcc)
 
     from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
@@ -405,11 +416,11 @@ if __name__=="__main__":
         StreamName = 'StreamAOD'
     )
     cfg.addEventAlgo(theNegativeEnergyCaloClustersThinner,"AthAlgSeq")
-  
+
 #    cfg.getService("StoreGateSvc").Dump=True
 
     cfg.run(10)
     #f=open("CaloTopoCluster.pkl","wb")
     #cfg.store(f)
     #f.close()
-    
+
diff --git a/Trigger/TrigAlgorithms/TrigCaloRec/python/TrigCaloRecConfig.py b/Trigger/TrigAlgorithms/TrigCaloRec/python/TrigCaloRecConfig.py
index 484a9ac0bd53..e5e8f3b313a8 100755
--- a/Trigger/TrigAlgorithms/TrigCaloRec/python/TrigCaloRecConfig.py
+++ b/Trigger/TrigAlgorithms/TrigCaloRec/python/TrigCaloRecConfig.py
@@ -1707,3 +1707,85 @@ class TrigCaloClusterCalibratorMT_LC(TrigCaloClusterCalibratorMT):
         self.MonTool.defineHistogram('Eta', path='EXPERT', type='TH1F', title="Cluster #eta; #eta ; Number of Clusters", xbins=100, xmin=-2.5, xmax=2.5)
         self.MonTool.defineHistogram('Phi', path='EXPERT', type='TH1F', title="Cluster #phi; #phi ; Number of Clusters", xbins=64, xmin=-3.2, xmax=3.2)
         self.MonTool.defineHistogram('Eta,Phi', path='EXPERT', type='TH2F', title="Number of Clusters; #eta ; #phi ; Number of Clusters", xbins=100, xmin=-2.5, xmax=2.5, ybins=128, ymin=-3.2, ymax=3.2)
+
+
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
+
+
+def hltCaloCellMakerCfg(flags, FS=False, roisKey='UNSPECIFIED'):
+    acc = ComponentAccumulator()
+    from TrigT2CaloCommon.TrigCaloDataAccessConfig import trigCaloDataAccessSvcCfg
+    acc.merge(trigCaloDataAccessSvcCfg(flags))
+
+    cellMaker = CompFactory.HLTCaloCellMaker('HLTCaloCellMaker'+ ('FS' if FS else 'RoI'),
+                                             CellsName='CaloCells',
+                                             TrigDataAccessMT=acc.getService('TrigCaloDataAccessSvc'),
+                                             monitorCells=True,
+                                             ExtraInputs=[('TileEMScale', 'ConditionStore+TileEMScale'),
+                                                          ('TileBadChannels', 'ConditionStore+TileBadChannels'),
+                                                          ('LArOnOffIdMapping', 'ConditionStore+LArOnOffIdMap')], # TODO check if this depends on data/MC
+                                             RoIs=roisKey)
+
+    acc.addEventAlgo(cellMaker)
+    return acc
+
+def hltTopoClusterMakerCfg(flags, FS=False):
+    acc = ComponentAccumulator()
+    from CaloRec.CaloTopoClusterConfig import CaloTopoClusterToolCfg, CaloTopoClusterSplitterToolCfg
+    topoMaker = acc.popToolsAndMerge(CaloTopoClusterToolCfg(flags, cellsname='CaloCells'))
+    topoSplitter = acc.popToolsAndMerge(CaloTopoClusterSplitterToolCfg(flags))
+
+
+    topoMoments = CompFactory.CaloClusterMomentsMaker ('TrigTopoMoments')
+    topoMoments.MaxAxisAngle = 20*deg
+    topoMoments.TwoGaussianNoise = flags.Calo.TopoCluster.doTwoGaussianNoise
+    topoMoments.MinBadLArQuality = 4000
+    topoMoments.MomentsNames = ['FIRST_PHI',
+                                'FIRST_ETA',
+                                'SECOND_R' ,
+                                'SECOND_LAMBDA',
+                                'DELTA_PHI',
+                                'DELTA_THETA',
+                                'DELTA_ALPHA' ,
+                                'CENTER_X',
+                                'CENTER_Y',
+                                'CENTER_Z',
+                                'CENTER_MAG',
+                                'CENTER_LAMBDA',
+                                'LATERAL',
+                                'LONGITUDINAL',
+                                'FIRST_ENG_DENS',
+                                'ENG_FRAC_EM',
+                                'ENG_FRAC_MAX',
+                                'ENG_FRAC_CORE' ,
+                                'FIRST_ENG_DENS',
+                                'SECOND_ENG_DENS',
+                                'ISOLATION',
+                                'ENG_BAD_CELLS',
+                                'N_BAD_CELLS',
+                                'N_BAD_CELLS_CORR',
+                                'BAD_CELLS_CORR_E',
+                                'BADLARQ_FRAC',
+                                'ENG_POS',
+                                'SIGNIFICANCE',
+                                'CELL_SIGNIFICANCE',
+                                'CELL_SIG_SAMPLING',
+                                'AVG_LAR_Q',
+                                'AVG_TILE_Q'
+                                ]
+    from TrigEDMConfig.TriggerEDMRun3 import recordable
+    alg = CompFactory.TrigCaloClusterMakerMT('TrigCaloClusterMaker_topo'+('FS' if FS else 'RoI'),
+                                             Cells = 'CaloCells',
+                                             CaloClusters=recordable('HLT_TopoCaloClustersRoI'),
+                                             ClusterMakerTools = [ topoMaker, topoSplitter, topoMoments] # moments are missing yet
+                                            )
+    acc.addEventAlgo(alg)
+    return acc
+
+
+def hltCaloTopoClusteringCfg(flags, FS=False, roisKey='UNSPECIFIED'):
+    acc = ComponentAccumulator()
+    acc.merge(hltCaloCellMakerCfg(flags, FS=FS, roisKey=roisKey))
+    acc.merge(hltTopoClusterMakerCfg(flags, FS=FS))
+    return acc
diff --git a/Trigger/TrigHypothesis/TrigEgammaHypo/python/TrigEgammaPrecisionCaloHypoTool.py b/Trigger/TrigHypothesis/TrigEgammaHypo/python/TrigEgammaPrecisionCaloHypoTool.py
index 2d4e405e1a51..a2d0687ba5f7 100644
--- a/Trigger/TrigHypothesis/TrigEgammaHypo/python/TrigEgammaPrecisionCaloHypoTool.py
+++ b/Trigger/TrigHypothesis/TrigEgammaHypo/python/TrigEgammaPrecisionCaloHypoTool.py
@@ -4,9 +4,8 @@ from AthenaCommon.SystemOfUnits import GeV
 
 def _IncTool(name, threshold, sel):
 
-    from TrigEgammaHypo.TrigEgammaHypoConf import TrigEgammaPrecisionCaloHypoToolInc    
-
-    tool = TrigEgammaPrecisionCaloHypoToolInc( name ) 
+    from AthenaConfiguration.ComponentFactory import CompFactory
+    tool = CompFactory.TrigEgammaPrecisionCaloHypoToolInc(name)
 
     from AthenaMonitoringKernel.GenericMonitoringTool import GenericMonitoringTool, defineHistogram
     monTool = GenericMonitoringTool("MonTool_"+name)
@@ -22,7 +21,7 @@ def _IncTool(name, threshold, sel):
     monTool.Histograms += [ defineHistogram('CutCounter', type='TH1I', path='EXPERT', title="PrecisionCalo Hypo Passed Cuts;Cut",
                                             xbins=13, xmin=-1.5, xmax=12.5,  opt="kCumulative", xlabels=cuts) ]
 
-    monTool.HistPath = 'PrecisionCaloHypo/'+tool.name()
+    monTool.HistPath = 'PrecisionCaloHypo/'+tool.getName()
     tool.MonTool = monTool
 
 
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/share/runHLT_standalone_newJO.py b/Trigger/TriggerCommon/TriggerJobOpts/share/runHLT_standalone_newJO.py
index f824ab4af1ed..b524cd9622b4 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/share/runHLT_standalone_newJO.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/share/runHLT_standalone_newJO.py
@@ -106,6 +106,8 @@ acc.foreach_component("*/L1Decoder/*Tool").OutputLevel = DEBUG # tools
 acc.foreach_component("*HLTTop/*Hypo*").OutputLevel = DEBUG # hypo algs
 acc.foreach_component("*HLTTop/*Hypo*/*Tool*").OutputLevel = INFO # hypo tools
 acc.foreach_component("*HLTTop/RoRSeqFilter/*").OutputLevel = INFO# filters
+acc.foreach_component("*/FPrecisionCalo").OutputLevel = DEBUG# filters
+acc.foreach_component("*/CHElectronFTF").OutputLevel = DEBUG# filters
 acc.foreach_component("*HLTTop/*Input*").OutputLevel = DEBUG # input makers
 acc.foreach_component("*HLTTop/*HLTEDMCreator*").OutputLevel = WARNING # messaging from the EDM creators
 acc.foreach_component("*HLTTop/*GenericMonitoringTool*").OutputLevel = WARNING # silcence mon tools (addressing by type)
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Electron/ElectronRecoSequences.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Electron/ElectronRecoSequences.py
index fe7decdc9385..0d8f6ad75f62 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Electron/ElectronRecoSequences.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Electron/ElectronRecoSequences.py
@@ -1,5 +1,5 @@
 #
-#  Copyright (C) 2002-2010 CERN for the benefit of the ATLAS collaboration
+#  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 #
 
 from AthenaConfiguration.ComponentFactory import CompFactory
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Electron/generateElectron.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Electron/generateElectron.py
index a509b32e047a..031a5b0a752d 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Electron/generateElectron.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Electron/generateElectron.py
@@ -2,101 +2,129 @@
 
 from TriggerMenuMT.HLTMenuConfig.Electron.ElectronRecoSequences import l2CaloRecoCfg, l2CaloHypoCfg
 from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import CAMenuSequence, \
-    ChainStep, Chain, createStepView, EmptyMenuSequence, InViewReco
+    ChainStep, Chain, EmptyMenuSequence, InViewReco, SelectionCA
 
 from TrigEgammaHypo.TrigEgammaFastCaloHypoTool import TrigEgammaFastCaloHypoToolFromDict
-from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from TrigEDMConfig.TriggerEDMRun3 import recordable
 from AthenaConfiguration.ComponentFactory import CompFactory
 from TriggerMenuMT.HLTMenuConfig.Menu.DictFromChainName import getChainMultFromDict
 
 
 
-def generateChains( flags,  chainDict ):
-    import pprint
-    pprint.pprint( chainDict )
+def generateChains(flags, chainDict):
 
-    firstStepName = 'FastCaloElectron'
-    stepReco, stepView = createStepView(firstStepName)
+    def __fastCalo():
+        selAcc=SelectionCA('FastCaloElectron')
+        selAcc.mergeReco(l2CaloRecoCfg(flags))
 
-    accCalo = ComponentAccumulator()
-    accCalo.addSequence(stepView)
+        # this alg needs EventInfo decorated with the  pileup info
+        from LumiBlockComps.LumiBlockMuWriterConfig import LumiBlockMuWriterCfg
+        selAcc.merge(LumiBlockMuWriterCfg(flags))
 
-    l2CaloReco = l2CaloRecoCfg(flags)
-    accCalo.merge(l2CaloReco, sequenceName=stepReco.getName())
+        l2CaloHypo = l2CaloHypoCfg(flags,
+                                   name='L2ElectronCaloHypo',
+                                   CaloClusters=recordable('HLT_FastCaloEMClusters'))
 
-    # this alg needs EventInfo decorated with the  pileup info
-    from LumiBlockComps.LumiBlockMuWriterConfig import LumiBlockMuWriterCfg
-    accCalo.merge( LumiBlockMuWriterCfg(flags) )
+        selAcc.addHypoAlgo(l2CaloHypo)
 
-    l2CaloHypo =  l2CaloHypoCfg( flags, name = 'L2ElectronCaloHypo',
-                                 CaloClusters = recordable('HLT_FastCaloEMClusters'))
+        fastCaloSequence = CAMenuSequence(selAcc,
+                                          HypoToolGen=TrigEgammaFastCaloHypoToolFromDict)
 
-    accCalo.addEventAlgo(l2CaloHypo, sequenceName=stepView.getName())
+        # this cannot work for asymmetric combined chains....FP
+        return ChainStep(name=selAcc.name, Sequences=[fastCaloSequence], chainDicts=[chainDict], multiplicity=getChainMultFromDict(chainDict))
 
-    fastCaloSequence = CAMenuSequence(accCalo,
-                                     HypoToolGen = TrigEgammaFastCaloHypoToolFromDict)
+    def __ftf():
+        selAcc=SelectionCA('ElectronFTF')
 
-    accCalo.printConfig()
-    # this cannot work for asymmetric combined chains....FP
-    fastCaloStep = ChainStep(name=firstStepName, Sequences=[fastCaloSequence], chainDicts=[chainDict], multiplicity=getChainMultFromDict(chainDict))
-    
+        # # # fast ID (need to be customised because require secialised configuration of the views maker - i.e. parent has to be linked)
+        name = "IMFastElectron"
+        evtViewMaker = CompFactory.EventViewCreatorAlgorithm(name,
+                                                              ViewFallThrough = True,
+                                                              RoIsLink        = 'initialRoI',
+                                                              RoITool         = CompFactory.ViewCreatorInitialROITool(),
+                                                              InViewRoIs      = name+'RoIs',
+                                                              Views           = name+'Views',
+                                                              ViewNodeName    = name+"InView",
+                                                              RequireParentView = True)
+        del name
 
+        from TrigInDetConfig.TrigInDetConfig import trigInDetFastTrackingCfg
+        idTracking = trigInDetFastTrackingCfg(flags, roisKey=evtViewMaker.InViewRoIs, signatureName="Electron")
 
-    secondStepName = 'ElectronFTF'
-    stepReco, stepView = createStepView(secondStepName)
+        fastInDetReco = InViewReco('FastElectron', viewMaker=evtViewMaker)
+        fastInDetReco.mergeReco(idTracking)
+        fastInDetReco.addRecoAlgo(CompFactory.AthViews.ViewDataVerifier(name='VDVElectronFastCalo',
+                                  DataObjects=[('xAOD::TrigEMClusterContainer', 'StoreGateSvc+HLT_FastCaloEMClusters')]) )
 
-    accTrk = ComponentAccumulator()
-    accTrk.addSequence(stepView)
+        from TrigEgammaHypo.TrigEgammaFastElectronFexMTConfig import fastElectronFexAlgCfg
+        fastInDetReco.mergeReco(fastElectronFexAlgCfg(flags, rois=evtViewMaker.InViewRoIs))
+        selAcc.mergeReco(fastInDetReco)
 
-    # # # fast ID (need to be customised because require secialised configuration of the views maker - i.e. parent has to be linked)
-    name = "IMFastElectron"
-    evtViewMaker = CompFactory.EventViewCreatorAlgorithm(name,
-                                                          ViewFallThrough = True,
-                                                          RoIsLink        = 'initialRoI',
-                                                          RoITool         = CompFactory.ViewCreatorInitialROITool(),
-                                                          InViewRoIs      = name+'RoIs',
-                                                          Views           = name+'Views',
-                                                          ViewNodeName    = name+"InView",
-                                                          RequireParentView = True)
-    del name
+        fastElectronHypoAlg = CompFactory.TrigEgammaFastElectronHypoAlgMT()
+        fastElectronHypoAlg.Electrons = 'HLT_FastElectrons'
+        fastElectronHypoAlg.RunInView = True
+        selAcc.addHypoAlgo(fastElectronHypoAlg)
 
-    from TrigInDetConfig.TrigInDetConfig import trigInDetFastTrackingCfg
-    idTracking = trigInDetFastTrackingCfg(flags, roisKey=evtViewMaker.InViewRoIs, signatureName="Electron")
+        from TrigEgammaHypo.TrigEgammaFastElectronHypoTool import TrigEgammaFastElectronHypoToolFromDict
+        fastInDetSequence = CAMenuSequence(selAcc,
+                                           HypoToolGen=TrigEgammaFastElectronHypoToolFromDict)
 
-    fastInDetReco = InViewReco("FastElectron", viewMaker=evtViewMaker)
-    fastInDetReco.mergeReco(idTracking)
-    fastInDetReco.addRecoAlgo(CompFactory.AthViews.ViewDataVerifier(name='VDVElectronFastCalo',
-                              DataObjects=[('xAOD::TrigEMClusterContainer', 'StoreGateSvc+HLT_FastCaloEMClusters')]))
-
-    from TrigEgammaHypo.TrigEgammaFastElectronFexMTConfig import fastElectronFexAlgCfg
-    fastInDetReco.mergeReco(fastElectronFexAlgCfg(flags, rois=evtViewMaker.InViewRoIs))
-
-    accTrk.merge(fastInDetReco, sequenceName=stepReco.getName())
-
-
-    fastElectronHypoAlg = CompFactory.TrigEgammaFastElectronHypoAlgMT()
-    fastElectronHypoAlg.Electrons = "HLT_FastElectrons"
-    fastElectronHypoAlg.RunInView = True
-    accTrk.addEventAlgo(fastElectronHypoAlg, sequenceName=stepView.getName())
-
-    from TrigEgammaHypo.TrigEgammaFastElectronHypoTool import TrigEgammaFastElectronHypoToolFromDict
-    fastInDetSequence = CAMenuSequence(accTrk, 
-                                       HypoToolGen = TrigEgammaFastElectronHypoToolFromDict)
-
-    fastInDetStep = ChainStep( name=secondStepName, Sequences=[fastInDetSequence], chainDicts=[chainDict], multiplicity=getChainMultFromDict(chainDict))
+        return ChainStep( name=selAcc.name, Sequences=[fastInDetSequence], chainDicts=[chainDict], multiplicity=getChainMultFromDict(chainDict))
 
     l1Thresholds=[]
     for part in chainDict['chainParts']:
         l1Thresholds.append(part['L1threshold'])
-    
-    # # # EF calo
+
+    # # # Precision calo
+    def __precisonCalo():
+        recoAcc = InViewReco('ElectronRoITopoClusterReco')
+        recoAcc.addRecoAlgo(CompFactory.AthViews.ViewDataVerifier(name='VDV'+recoAcc.name,
+                                                                  DataObjects=[('TrigRoiDescriptorCollection', recoAcc.inputMaker().InViewRoIs),
+                                                                               ('CaloBCIDAverage', 'StoreGateSvc+CaloBCIDAverage')]))
+
+        from TrigCaloRec.TrigCaloRecConfig import hltCaloTopoClusteringCfg
+        recoAcc.mergeReco(hltCaloTopoClusteringCfg(flags,
+                                                   FS=False,
+                                                   roisKey=recoAcc.inputMaker().InViewRoIs)) # RoI
+
+        copier = CompFactory.egammaTopoClusterCopier('TrigEgammaTopoClusterCopierPrecisionCaloRoIs',
+                                                     InputTopoCollection='HLT_TopoCaloClustersRoI',
+                                                     OutputTopoCollection='HLT_CaloEMClusters',
+                                                     OutputTopoCollectionShallow='tmp_HLT_CaloEMClusters')
+        recoAcc.addRecoAlgo(copier)
+
+        selAcc = SelectionCA('PrecisionCalo')
+        selAcc.mergeReco(recoAcc)
+        hypoAlg = CompFactory.TrigEgammaPrecisionCaloHypoAlgMT(name='ElectronPrecisionCaloHypo',
+                                                               CaloClusters=recordable('HLT_CaloEMClusters'))
+        selAcc.addHypoAlgo(hypoAlg)
+        from TrigEgammaHypo.TrigEgammaPrecisionCaloHypoTool import TrigEgammaPrecisionCaloHypoToolFromDict
+        menuSequence = CAMenuSequence(selAcc,
+                                      HypoToolGen=TrigEgammaPrecisionCaloHypoToolFromDict)
+        return ChainStep(name=selAcc.name, Sequences=[menuSequence], chainDicts=[chainDict], multiplicity=getChainMultFromDict(chainDict))
 
     # # # Precison tracking
-    
+
 
     # # # offline egamma
     emptyStep = ChainStep(name="EmptyElStep", Sequences=[EmptyMenuSequence("EmptyElStep")], chainDicts=[chainDict])
-    chain = Chain(chainDict['chainName'], L1Thresholds=l1Thresholds, ChainSteps=[fastCaloStep, fastInDetStep, emptyStep, emptyStep])
-    
+    chain = Chain(chainDict['chainName'], L1Thresholds=l1Thresholds,
+                            ChainSteps=[__fastCalo(), __ftf(), __precisonCalo(), emptyStep, emptyStep,])
+
     return chain
+
+if __name__ == "__main__":
+    # run with: python -m TriggerMenuMT.HLTMenuConfig.Electron.generateElectron
+    from AthenaCommon.Configurable import Configurable
+    Configurable.configurableRun3Behavior=1
+    from AthenaConfiguration.AllConfigFlags import ConfigFlags
+    from AthenaConfiguration.TestDefaults import defaultTestFiles
+    ConfigFlags.Input.Files = defaultTestFiles.RAW
+    ConfigFlags.lock()
+    from ..Menu.DictFromChainName import dictFromChainName
+    chain = generateChains(ConfigFlags, dictFromChainName('HLT_e26_L1EM15'))
+    for step in chain.steps:
+        for s in step.sequences:
+            if not isinstance(s, EmptyMenuSequence):
+                s.ca.printConfig(withDetails=True, summariseProps=False) # flip the last arg to see all settings
+                s.ca.wasMerged() # to silence check for orphanted CAs
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py
index 394f04c9a13f..023c5dcc0011 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py
@@ -927,6 +927,21 @@ class InViewReco(ComponentAccumulator):
     def inputMaker( self ):
         return self.viewMakerAlg
 
+class SelectionCA(ComponentAccumulator):
+    def __init__(self, name):
+        self.name = name
+        super( SelectionCA, self ).__init__()
+        self.stepRecoSequence, self.stepViewSequence = createStepView(name)
+        self.addSequence(self.stepViewSequence)
+
+    def mergeReco(self, other):
+        self.merge(other, sequenceName=self.stepRecoSequence.name)
+
+    def mergeHypo(self, other):
+        self.merge(other, sequenceName=self.stepViewSequence.name)
+
+    def addHypoAlgo(self, algo):
+        self.addEventAlgo(algo, sequenceName=self.stepViewSequence.name)
 
 class RecoFragmentsPool(object):
     """ Class to host all the reco fragments that need to be reused """
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/generateMuon.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/generateMuon.py
index ab0236cf8252..cce859909024 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/generateMuon.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/generateMuon.py
@@ -400,11 +400,11 @@ def generateChains( flags, chainDict ):
         l1Thresholds.append(part['L1threshold'])
 
     log.debug('dictionary is: %s\n', pprint.pformat(chainDict))
-
+    def _empty(name):
+        return ChainStep(name="EmptyNoL2MuComb", Sequences=[EmptyMenuSequence("EmptyNoL2MuComb")], chainDicts=[chainDict])
     if 'msonly' in chainDict['chainName']:
-        emptyStep = ChainStep(name="EmptyNoL2MuComb", Sequences=[EmptyMenuSequence("EmptyNoL2MuComb")], chainDicts=[chainDict])
-        chain = Chain( name=chainDict['chainName'], L1Thresholds=l1Thresholds, ChainSteps=[ l2muFastStep, emptyStep, efmuMSStep, emptyStep ] )
+        chain = Chain( name=chainDict['chainName'], L1Thresholds=l1Thresholds, ChainSteps=[ l2muFastStep, _empty("EmptyNoL2MuComb"), efmuMSStep, _empty("EmptyNoEFCB"), _empty("JustEmpty") ] )
     else:
-        chain = Chain( name=chainDict['chainName'], L1Thresholds=l1Thresholds, ChainSteps=[ l2muFastStep, l2muCombStep, efmuMSStep, efmuCBStep ] )
+        chain = Chain( name=chainDict['chainName'], L1Thresholds=l1Thresholds, ChainSteps=[ l2muFastStep, l2muCombStep, efmuMSStep, efmuCBStep, _empty("JustEmpty") ] )
     return chain
 
-- 
GitLab


From 0a88e9a806b1b7b90cb951b767fd2e378dae9153 Mon Sep 17 00:00:00 2001
From: Nicolas Koehler <nicolas.koehler@cern.ch>
Date: Wed, 16 Dec 2020 12:35:50 +0000
Subject: [PATCH 072/225] Cleanup of MuonIdHelpers, fix mm/stgc/csc warnings
 (ATLASRECTS-4494)

---
 .../src/AtlasDetectorIDHelper.cxx             |  100 +-
 .../AtlasDetDescr/src/AtlasDetectorIDHelper.h |   27 +-
 .../share/CscRawDataCnv_p2_test.ref           |   29 +-
 .../share/CscRawDataCnv_p3_test.ref           |   29 +-
 .../share/CscRawDataCollectionCnv_p2_test.ref |   29 +-
 .../share/CscRawDataCollectionCnv_p3_test.ref |   29 +-
 .../share/RpcPadContainerCnv_p1_test.ref      |   17 +-
 .../share/RpcPadContainerCnv_p2_test.ref      |   17 +-
 ...ompetingMuonClustersOnTrackCnv_p2_test.ref |   98 +-
 .../share/CscClusterOnTrackCnv_p2_test.ref    |   98 +-
 .../share/CscPrepDataContainerCnv_p1_test.ref |   96 +-
 .../share/CscPrepDataContainerCnv_p2_test.ref |   96 +-
 .../CscStripPrepDataContainerCnv_p1_test.ref  |   96 +-
 .../share/MMPrepDataContainerCnv_p1_test.ref  |   96 +-
 .../share/MM_ClusterOnTrackCnv_p1_test.ref    |   98 +-
 .../share/MM_DigitContainerCnv_p1_test.ref    |   96 +-
 .../share/MM_DigitContainerCnv_p2_test.ref    |   96 +-
 .../MdtDriftCircleOnTrackCnv_p2_test.ref      |   98 +-
 .../share/MdtPrepDataContainerCnv_p1_test.ref |   96 +-
 .../share/MdtPrepDataContainerCnv_p2_test.ref |   96 +-
 .../share/RpcClusterOnTrackCnv_p3_test.ref    |   98 +-
 .../share/RpcCoinDataContainerCnv_p1_test.ref |   96 +-
 .../share/RpcPrepDataContainerCnv_p1_test.ref |   96 +-
 .../share/RpcPrepDataContainerCnv_p2_test.ref |   96 +-
 .../share/RpcPrepDataContainerCnv_p3_test.ref |   96 +-
 .../share/STGC_ClusterOnTrackCnv_p1_test.ref  |   98 +-
 .../share/STGC_DigitContainerCnv_p1_test.ref  |   96 +-
 .../STGC_RawDataContainerCnv_p1_test.ref      |   96 +-
 .../share/TgcClusterOnTrackCnv_p2_test.ref    |   98 +-
 .../share/TgcCoinDataContainerCnv_p1_test.ref |   96 +-
 .../share/TgcCoinDataContainerCnv_p2_test.ref |   96 +-
 .../share/TgcCoinDataContainerCnv_p3_test.ref |   96 +-
 .../share/TgcPrepDataContainerCnv_p1_test.ref |   96 +-
 .../share/TgcPrepDataContainerCnv_p2_test.ref |   96 +-
 .../share/TgcPrepDataContainerCnv_p3_test.ref |   96 +-
 .../sTgcPrepDataContainerCnv_p1_test.ref      |   96 +-
 .../MuonIdHelpers/MuonIdHelpers/CscIdHelper.h |    2 +-
 .../MuonIdHelpers/MuonIdHelper.h              |   13 +-
 .../MuonIdHelpers/MuonIdHelpers/TgcIdHelper.h |   12 +-
 .../MuonIdHelpers/share/muon_id_test.ref      | 3228 +----------------
 .../MuonIdHelpers/src/CscIdHelper.cxx         |   27 +-
 .../MuonIdHelpers/src/MdtIdHelper.cxx         |   15 +-
 .../MuonIdHelpers/src/MmIdHelper.cxx          |   14 +-
 .../MuonIdHelpers/src/MuonIdHelper.cxx        |   19 -
 .../MuonIdHelpers/src/RpcIdHelper.cxx         |    7 +-
 .../MuonIdHelpers/src/TgcIdHelper.cxx         |   32 +-
 .../MuonIdHelpers/src/sTgcIdHelper.cxx        |   15 +-
 .../share/emu_step_menu_processing.ref        |    4 +-
 .../share/emu_step_processing.ref             |    6 +-
 49 files changed, 289 insertions(+), 6084 deletions(-)

diff --git a/DetectorDescription/AtlasDetDescr/src/AtlasDetectorIDHelper.cxx b/DetectorDescription/AtlasDetDescr/src/AtlasDetectorIDHelper.cxx
index c6097206e00b..77154ebd815b 100755
--- a/DetectorDescription/AtlasDetDescr/src/AtlasDetectorIDHelper.cxx
+++ b/DetectorDescription/AtlasDetDescr/src/AtlasDetectorIDHelper.cxx
@@ -1,88 +1,40 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
-/***************************************************************************
- 
- -----------------------------------------
- ***************************************************************************/
-
-//<doc><file>	$Id: AtlasDetectorIDHelper.cxx,v 1.6 2006-01-11 09:24:23 schaffer Exp $
-//<version>	$Name: not supported by cvs2svn $
-
-//<<<<<< INCLUDES                                                       >>>>>>
-
 #include "AtlasDetectorIDHelper.h"
 #include "IdDict/IdDictDefs.h"  
 #include "AtlasDetDescr/AtlasDetectorID.h"
 #include "GaudiKernel/MsgStream.h"
 #include <iostream>
 
-//<<<<<< PRIVATE DEFINES                                                >>>>>>
-//<<<<<< PRIVATE CONSTANTS                                              >>>>>>
-//<<<<<< PRIVATE TYPES                                                  >>>>>>
-//<<<<<< PRIVATE VARIABLE DEFINITIONS                                   >>>>>>
-//<<<<<< PUBLIC VARIABLE DEFINITIONS                                    >>>>>>
-//<<<<<< CLASS STRUCTURE INITIALIZATION                                 >>>>>>
-//<<<<<< PRIVATE FUNCTION DEFINITIONS                                   >>>>>>
-//<<<<<< PUBLIC FUNCTION DEFINITIONS                                    >>>>>>
-//<<<<<< MEMBER FUNCTION DEFINITIONS                                    >>>>>>
-
-AtlasDetectorIDHelper::AtlasDetectorIDHelper(void)
-	:
-	m_isSLHC(false),
-	m_pixel_region_index(UNDEFINED),
-	m_sct_region_index(UNDEFINED),
-	m_trt_region_index(UNDEFINED),
-	m_lar_em_region_index(UNDEFINED),
-	m_lar_hec_region_index(UNDEFINED),
-	m_lar_fcal_region_index(UNDEFINED),
-        m_lvl1_region_index(UNDEFINED),
-        m_dm_region_index(UNDEFINED),
-	m_tile_region_index(UNDEFINED),
-	m_mdt_region_index(UNDEFINED),
-	m_csc_region_index(UNDEFINED),
-	m_rpc_region_index(UNDEFINED),
-	m_tgc_region_index(UNDEFINED),
-	m_mm_region_index(UNDEFINED),
-	m_stgc_region_index(UNDEFINED),
-	m_muon_station_index(UNDEFINED),
-        m_alfa_region_index(UNDEFINED),
-        m_bcm_region_index(UNDEFINED),
-        m_lucid_region_index(UNDEFINED),
-        m_zdc_region_index(UNDEFINED),
-	m_initialized(false),
-	m_station_field(0),
-        m_msgSvc(0)
-{}
-
-AtlasDetectorIDHelper::~AtlasDetectorIDHelper(void)
-{
+AtlasDetectorIDHelper::AtlasDetectorIDHelper(void) :
+    m_isSLHC(false),
+    m_pixel_region_index(UNDEFINED),
+    m_sct_region_index(UNDEFINED),
+    m_trt_region_index(UNDEFINED),
+    m_lar_em_region_index(UNDEFINED),
+    m_lar_hec_region_index(UNDEFINED),
+    m_lar_fcal_region_index(UNDEFINED),
+    m_lvl1_region_index(UNDEFINED),
+    m_dm_region_index(UNDEFINED),
+    m_tile_region_index(UNDEFINED),
+    m_mdt_region_index(UNDEFINED),
+    m_csc_region_index(UNDEFINED),
+    m_rpc_region_index(UNDEFINED),
+    m_tgc_region_index(UNDEFINED),
+    m_mm_region_index(UNDEFINED),
+    m_stgc_region_index(UNDEFINED),
+    m_muon_station_index(UNDEFINED),
+    m_alfa_region_index(UNDEFINED),
+    m_bcm_region_index(UNDEFINED),
+    m_lucid_region_index(UNDEFINED),
+    m_zdc_region_index(UNDEFINED),
+    m_initialized(false),
+    m_station_field(nullptr),
+    m_msgSvc(nullptr) {
 }
 
-// AtlasDetectorIDHelper::AtlasDetectorIDHelper (const AtlasDetectorIDHelper &)
-// {
-// }
-
-//  AtlasDetectorIDHelper & AtlasDetectorIDHelper::operator= (const AtlasDetectorIDHelper & other)
-//  {
-//      return other;
-//  }
-
-
-//  AtlasDetectorIDHelper * 
-//  AtlasDetectorIDHelper::instance()
-//  {
-
-//      static AtlasDetectorIDHelper* instance = 0;
-
-//      if (instance == 0) {
-//  	instance = new AtlasDetectorIDHelper;
-//      }
-//      return instance;
-//  }
-
-
 int         
 AtlasDetectorIDHelper::initialize_from_dictionary(const IdDictMgr& dict_mgr,
                                                   bool quiet)
diff --git a/DetectorDescription/AtlasDetDescr/src/AtlasDetectorIDHelper.h b/DetectorDescription/AtlasDetDescr/src/AtlasDetectorIDHelper.h
index 1302c606d06c..c168f01f0e86 100755
--- a/DetectorDescription/AtlasDetDescr/src/AtlasDetectorIDHelper.h
+++ b/DetectorDescription/AtlasDetDescr/src/AtlasDetectorIDHelper.h
@@ -1,19 +1,9 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
-/***************************************************************************
- 
- -----------------------------------------
- ***************************************************************************/
-
-//<doc><file>	$Id: AtlasDetectorIDHelper.h,v 1.6 2006-01-11 09:24:23 schaffer Exp $
-//<version>	$Name: not supported by cvs2svn $
-
 #ifndef SRC_ATLASDETECTORIDHELPER_H
-# define SRC_ATLASDETECTORIDHELPER_H
-
-//<<<<<< INCLUDES                                                       >>>>>>
+#define SRC_ATLASDETECTORIDHELPER_H
 
 #include "Identifier/Identifier.h"
 #include "Identifier/IdContext.h"
@@ -21,18 +11,9 @@
 #include <string>
 #include <vector>
 
-//<<<<<< PUBLIC DEFINES                                                 >>>>>>
-//<<<<<< PUBLIC CONSTANTS                                               >>>>>>
-//<<<<<< PUBLIC TYPES                                                   >>>>>>
-
 class IdDictField;
 
-//<<<<<< PUBLIC VARIABLES                                               >>>>>>
-//<<<<<< PUBLIC FUNCTIONS                                               >>>>>>
-//<<<<<< CLASS DECLARATIONS                                             >>>>>>
-
-class AtlasDetectorIDHelper
-{
+class AtlasDetectorIDHelper {
 public:
     
     enum ERRORS { UNDEFINED = 999 };
@@ -48,7 +29,7 @@ public:
     /// Initialization from the identifier dictionary
   int         initialize_from_dictionary(const IdDictMgr& dict_mgr, bool quiet);
 
-    ~AtlasDetectorIDHelper(void);
+    ~AtlasDetectorIDHelper()=default;
     
     size_type   pixel_region_index();
     size_type   sct_region_index();
diff --git a/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/CscRawDataCnv_p2_test.ref b/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/CscRawDataCnv_p2_test.ref
index b63df6294ab6..a832e5ee1416 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/CscRawDataCnv_p2_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/CscRawDataCnv_p2_test.ref
@@ -3,15 +3,9 @@
 ApplicationMgr       INFO Application Manager Configured successfully
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
-HistogramPersis...WARNING Histograms saving not required.
 ApplicationMgr       INFO Application Manager Initialized successfully
 ApplicationMgr Ready
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 241
 RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 241
 RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 241
@@ -19,12 +13,7 @@ RpcIdHelper          INFO Initializing RPC hash indices ...
 RpcIdHelper          INFO The element hash max is 600
 RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 210
 CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 237
 CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 241
@@ -33,12 +22,7 @@ CscIdHelper          INFO The element hash max is 32
 CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 210
 MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 241
 MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 241
@@ -46,12 +30,7 @@ MdtIdHelper          INFO Initializing MDT hash indices ...
 MdtIdHelper          INFO The element hash max is 1188
 MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 210
 TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 210
 TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 241
diff --git a/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/CscRawDataCnv_p3_test.ref b/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/CscRawDataCnv_p3_test.ref
index b63df6294ab6..a832e5ee1416 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/CscRawDataCnv_p3_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/CscRawDataCnv_p3_test.ref
@@ -3,15 +3,9 @@
 ApplicationMgr       INFO Application Manager Configured successfully
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
-HistogramPersis...WARNING Histograms saving not required.
 ApplicationMgr       INFO Application Manager Initialized successfully
 ApplicationMgr Ready
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 241
 RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 241
 RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 241
@@ -19,12 +13,7 @@ RpcIdHelper          INFO Initializing RPC hash indices ...
 RpcIdHelper          INFO The element hash max is 600
 RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 210
 CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 237
 CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 241
@@ -33,12 +22,7 @@ CscIdHelper          INFO The element hash max is 32
 CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 210
 MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 241
 MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 241
@@ -46,12 +30,7 @@ MdtIdHelper          INFO Initializing MDT hash indices ...
 MdtIdHelper          INFO The element hash max is 1188
 MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 210
 TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 210
 TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 241
diff --git a/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/CscRawDataCollectionCnv_p2_test.ref b/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/CscRawDataCollectionCnv_p2_test.ref
index b63df6294ab6..a832e5ee1416 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/CscRawDataCollectionCnv_p2_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/CscRawDataCollectionCnv_p2_test.ref
@@ -3,15 +3,9 @@
 ApplicationMgr       INFO Application Manager Configured successfully
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
-HistogramPersis...WARNING Histograms saving not required.
 ApplicationMgr       INFO Application Manager Initialized successfully
 ApplicationMgr Ready
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 241
 RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 241
 RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 241
@@ -19,12 +13,7 @@ RpcIdHelper          INFO Initializing RPC hash indices ...
 RpcIdHelper          INFO The element hash max is 600
 RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 210
 CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 237
 CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 241
@@ -33,12 +22,7 @@ CscIdHelper          INFO The element hash max is 32
 CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 210
 MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 241
 MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 241
@@ -46,12 +30,7 @@ MdtIdHelper          INFO Initializing MDT hash indices ...
 MdtIdHelper          INFO The element hash max is 1188
 MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 210
 TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 210
 TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 241
diff --git a/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/CscRawDataCollectionCnv_p3_test.ref b/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/CscRawDataCollectionCnv_p3_test.ref
index b63df6294ab6..a832e5ee1416 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/CscRawDataCollectionCnv_p3_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/CscRawDataCollectionCnv_p3_test.ref
@@ -3,15 +3,9 @@
 ApplicationMgr       INFO Application Manager Configured successfully
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
-HistogramPersis...WARNING Histograms saving not required.
 ApplicationMgr       INFO Application Manager Initialized successfully
 ApplicationMgr Ready
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 241
 RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 241
 RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 241
@@ -19,12 +13,7 @@ RpcIdHelper          INFO Initializing RPC hash indices ...
 RpcIdHelper          INFO The element hash max is 600
 RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 210
 CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 237
 CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 241
@@ -33,12 +22,7 @@ CscIdHelper          INFO The element hash max is 32
 CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 210
 MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 241
 MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 241
@@ -46,12 +30,7 @@ MdtIdHelper          INFO Initializing MDT hash indices ...
 MdtIdHelper          INFO The element hash max is 1188
 MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 210
 TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 210
 TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 241
diff --git a/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/RpcPadContainerCnv_p1_test.ref b/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/RpcPadContainerCnv_p1_test.ref
index 4a294b1ab94c..d56b817d62cf 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/RpcPadContainerCnv_p1_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/RpcPadContainerCnv_p1_test.ref
@@ -1,25 +1,11 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts ../share/MuonEventAthenaPool_test.txt
-JobOptionsSvc        INFO # =======> /afs/cern.ch/user/s/ssnyder/atlas-work3/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/../share/MuonEventAthenaPool_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore"]
-JobOptionsSvc        INFO # (3,1): TGCcablingServerSvc.forcedUse = 1
-JobOptionsSvc        INFO Job options successfully read in from ../share/MuonEventAthenaPool_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v29r0)
-                                          running on lxplus000.cern.ch on Wed Nov 22 22:09:33 2017
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 1844 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
-HistogramPersis...WARNING Histograms saving not required.
 ApplicationMgr       INFO Application Manager Initialized successfully
 ApplicationMgr Ready
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
 RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
 RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
@@ -27,5 +13,4 @@ RpcIdHelper          INFO Initializing RPC hash indices ...
 RpcIdHelper          INFO The element hash max is 600
 RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
-ClassIDSvc           INFO  getRegistryEntries: read 372 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/RpcPadContainerCnv_p2_test.ref b/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/RpcPadContainerCnv_p2_test.ref
index 7b7f6c23c624..a246a707f206 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/RpcPadContainerCnv_p2_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/RpcPadContainerCnv_p2_test.ref
@@ -1,25 +1,11 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts ../share/MuonEventAthenaPool_test.txt
-JobOptionsSvc        INFO # =======> /afs/cern.ch/user/s/ssnyder/atlas-work3/MuonSpectrometer/MuonCnv/MuonEventAthenaPool/share/../share/MuonEventAthenaPool_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore"]
-JobOptionsSvc        INFO # (3,1): TGCcablingServerSvc.forcedUse = 1
-JobOptionsSvc        INFO Job options successfully read in from ../share/MuonEventAthenaPool_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v29r0)
-                                          running on lxplus000.cern.ch on Wed Nov 22 21:23:47 2017
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 1844 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
-HistogramPersis...WARNING Histograms saving not required.
 ApplicationMgr       INFO Application Manager Initialized successfully
 ApplicationMgr Ready
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
 RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
 RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
@@ -27,6 +13,5 @@ RpcIdHelper          INFO Initializing RPC hash indices ...
 RpcIdHelper          INFO The element hash max is 600
 RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
-ClassIDSvc           INFO  getRegistryEntries: read 372 CLIDRegistry entries for module ALL
 test1
 test                 INFO  RPCcablingSvc obtained - hashmax  = 3
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CompetingMuonClustersOnTrackCnv_p2_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CompetingMuonClustersOnTrackCnv_p2_test.ref
index 309d5a1a4b96..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CompetingMuonClustersOnTrackCnv_p2_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CompetingMuonClustersOnTrackCnv_p2_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:34:39 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12361 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,87 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
-ClassIDSvc           INFO  getRegistryEntries: read 320 CLIDRegistry entries for module ALL
-ClassIDSvc           INFO  getRegistryEntries: read 170 CLIDRegistry entries for module ALL
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CscClusterOnTrackCnv_p2_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CscClusterOnTrackCnv_p2_test.ref
index 43c07e16f5d6..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CscClusterOnTrackCnv_p2_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CscClusterOnTrackCnv_p2_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:34:27 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12361 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,87 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
-ClassIDSvc           INFO  getRegistryEntries: read 320 CLIDRegistry entries for module ALL
-ClassIDSvc           INFO  getRegistryEntries: read 170 CLIDRegistry entries for module ALL
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CscPrepDataContainerCnv_p1_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CscPrepDataContainerCnv_p1_test.ref
index 54c1ab9d9c33..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CscPrepDataContainerCnv_p1_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CscPrepDataContainerCnv_p1_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:34:57 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12360 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CscPrepDataContainerCnv_p2_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CscPrepDataContainerCnv_p2_test.ref
index f8e21d8dc42f..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CscPrepDataContainerCnv_p2_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CscPrepDataContainerCnv_p2_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:34:59 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12360 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CscStripPrepDataContainerCnv_p1_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CscStripPrepDataContainerCnv_p1_test.ref
index 3f1b0d76cd20..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CscStripPrepDataContainerCnv_p1_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/CscStripPrepDataContainerCnv_p1_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:01 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12362 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MMPrepDataContainerCnv_p1_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MMPrepDataContainerCnv_p1_test.ref
index 3cd171c475c5..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MMPrepDataContainerCnv_p1_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MMPrepDataContainerCnv_p1_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:20 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12360 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MM_ClusterOnTrackCnv_p1_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MM_ClusterOnTrackCnv_p1_test.ref
index bc750a9634ec..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MM_ClusterOnTrackCnv_p1_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MM_ClusterOnTrackCnv_p1_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:34:33 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12361 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,87 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
-ClassIDSvc           INFO  getRegistryEntries: read 320 CLIDRegistry entries for module ALL
-ClassIDSvc           INFO  getRegistryEntries: read 170 CLIDRegistry entries for module ALL
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MM_DigitContainerCnv_p1_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MM_DigitContainerCnv_p1_test.ref
index 2585fcf71181..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MM_DigitContainerCnv_p1_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MM_DigitContainerCnv_p1_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:35 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12351 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MM_DigitContainerCnv_p2_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MM_DigitContainerCnv_p2_test.ref
index 7c761e86cccb..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MM_DigitContainerCnv_p2_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MM_DigitContainerCnv_p2_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:37 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12351 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MdtDriftCircleOnTrackCnv_p2_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MdtDriftCircleOnTrackCnv_p2_test.ref
index bbf4b00b1aee..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MdtDriftCircleOnTrackCnv_p2_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MdtDriftCircleOnTrackCnv_p2_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:34:37 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12361 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,87 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
-ClassIDSvc           INFO  getRegistryEntries: read 320 CLIDRegistry entries for module ALL
-ClassIDSvc           INFO  getRegistryEntries: read 170 CLIDRegistry entries for module ALL
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MdtPrepDataContainerCnv_p1_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MdtPrepDataContainerCnv_p1_test.ref
index 911568af82bf..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MdtPrepDataContainerCnv_p1_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MdtPrepDataContainerCnv_p1_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:03 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12360 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MdtPrepDataContainerCnv_p2_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MdtPrepDataContainerCnv_p2_test.ref
index 3934b603b410..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MdtPrepDataContainerCnv_p2_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/MdtPrepDataContainerCnv_p2_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:05 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12360 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcClusterOnTrackCnv_p3_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcClusterOnTrackCnv_p3_test.ref
index 1a0f13b1c0c2..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcClusterOnTrackCnv_p3_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcClusterOnTrackCnv_p3_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:34:29 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12361 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,87 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
-ClassIDSvc           INFO  getRegistryEntries: read 320 CLIDRegistry entries for module ALL
-ClassIDSvc           INFO  getRegistryEntries: read 170 CLIDRegistry entries for module ALL
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcCoinDataContainerCnv_p1_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcCoinDataContainerCnv_p1_test.ref
index 37d3bc57a50b..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcCoinDataContainerCnv_p1_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcCoinDataContainerCnv_p1_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:26 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12350 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcPrepDataContainerCnv_p1_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcPrepDataContainerCnv_p1_test.ref
index 5636415539d5..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcPrepDataContainerCnv_p1_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcPrepDataContainerCnv_p1_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:06 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12360 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcPrepDataContainerCnv_p2_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcPrepDataContainerCnv_p2_test.ref
index 997bc0557f5f..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcPrepDataContainerCnv_p2_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcPrepDataContainerCnv_p2_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:08 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12360 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcPrepDataContainerCnv_p3_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcPrepDataContainerCnv_p3_test.ref
index 7f8be9acd74d..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcPrepDataContainerCnv_p3_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/RpcPrepDataContainerCnv_p3_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:10 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12360 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/STGC_ClusterOnTrackCnv_p1_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/STGC_ClusterOnTrackCnv_p1_test.ref
index e9908470fc96..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/STGC_ClusterOnTrackCnv_p1_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/STGC_ClusterOnTrackCnv_p1_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:34:35 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12361 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,87 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
-ClassIDSvc           INFO  getRegistryEntries: read 320 CLIDRegistry entries for module ALL
-ClassIDSvc           INFO  getRegistryEntries: read 170 CLIDRegistry entries for module ALL
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/STGC_DigitContainerCnv_p1_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/STGC_DigitContainerCnv_p1_test.ref
index cb664f546514..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/STGC_DigitContainerCnv_p1_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/STGC_DigitContainerCnv_p1_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:40 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12351 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/STGC_RawDataContainerCnv_p1_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/STGC_RawDataContainerCnv_p1_test.ref
index 54c3f168fdbb..d23421fb19a6 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/STGC_RawDataContainerCnv_p1_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/STGC_RawDataContainerCnv_p1_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:42 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12350 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,87 +33,30 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
  Before has size: 2, after has size: 2
 Collection #1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcClusterOnTrackCnv_p2_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcClusterOnTrackCnv_p2_test.ref
index a216b0a3c4c5..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcClusterOnTrackCnv_p2_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcClusterOnTrackCnv_p2_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:34:31 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12361 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,87 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
-ClassIDSvc           INFO  getRegistryEntries: read 320 CLIDRegistry entries for module ALL
-ClassIDSvc           INFO  getRegistryEntries: read 170 CLIDRegistry entries for module ALL
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcCoinDataContainerCnv_p1_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcCoinDataContainerCnv_p1_test.ref
index fe8dd235360e..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcCoinDataContainerCnv_p1_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcCoinDataContainerCnv_p1_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:27 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12350 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcCoinDataContainerCnv_p2_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcCoinDataContainerCnv_p2_test.ref
index 7e2ea0595251..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcCoinDataContainerCnv_p2_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcCoinDataContainerCnv_p2_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:29 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12350 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcCoinDataContainerCnv_p3_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcCoinDataContainerCnv_p3_test.ref
index 08753e8b94b7..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcCoinDataContainerCnv_p3_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcCoinDataContainerCnv_p3_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:31 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12350 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcPrepDataContainerCnv_p1_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcPrepDataContainerCnv_p1_test.ref
index 6b326a928c9f..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcPrepDataContainerCnv_p1_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcPrepDataContainerCnv_p1_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:12 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12360 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcPrepDataContainerCnv_p2_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcPrepDataContainerCnv_p2_test.ref
index 6443a5ffd3b1..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcPrepDataContainerCnv_p2_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcPrepDataContainerCnv_p2_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:14 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12360 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcPrepDataContainerCnv_p3_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcPrepDataContainerCnv_p3_test.ref
index e4fb9369a6ad..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcPrepDataContainerCnv_p3_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/TgcPrepDataContainerCnv_p3_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:16 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12360 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/sTgcPrepDataContainerCnv_p1_test.ref b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/sTgcPrepDataContainerCnv_p1_test.ref
index 27d72f519f66..eafa59f97879 100644
--- a/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/sTgcPrepDataContainerCnv_p1_test.ref
+++ b/MuonSpectrometer/MuonCnv/MuonEventTPCnv/share/sTgcPrepDataContainerCnv_p1_test.ref
@@ -1,18 +1,6 @@
 
 
-Initializing Gaudi ApplicationMgr using job opts /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # =======> /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-JobOptionsSvc        INFO # (1,1): ApplicationMgr.Dlls += ["StoreGate", "CLIDComps"]
-JobOptionsSvc        INFO # (2,1): ApplicationMgr.ExtSvc += ["StoreGateSvc", "StoreGateSvc/DetectorStore", "StoreGateSvc/ConditionStore", "Athena::RCUSvc"]
-JobOptionsSvc        INFO Job options successfully read in from /home/emoyse/master2/build/x86_64-centos7-gcc8-opt/jobOptions/MuonEventTPCnv/MuonEventTPCnv_test.txt
-ApplicationMgr    SUCCESS 
-====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v34r0)
-                                          running on pcumass4 on Wed Nov  4 09:35:18 2020
-====================================================================================================================================
-ApplicationMgr       INFO Successfully loaded modules : StoreGate, CLIDComps
 ApplicationMgr       INFO Application Manager Configured successfully
-ClassIDSvc           INFO  getRegistryEntries: read 12360 CLIDRegistry entries for module ALL
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
 EventLoopMgr      WARNING No events will be processed from external input.
 ApplicationMgr       INFO Application Manager Initialized successfully
@@ -22,22 +10,7 @@ ApplicationMgr Ready
  Volume pmdum2 not found: returning 0
  Volume pmdum3 not found: returning 0
  INFO Initialize from dictionary
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet          decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG pixel          decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec            decode 1 vals -2,0,2          mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 0 1 0 2           mode  enumerated  
- DEBUG bec_shift      decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG lay_disk       decode 0 vals 0:2             mask/zero mask/shift/bits/offset 3   fe7fffffffffffff 55 2  7  indexes                     mode  both_bounded  
- DEBUG lay_disk_shift decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_mod        decode 0 vals 0:51            mask/zero mask/shift/bits/offset 3f  ff81ffffffffffff 49 6  9  indexes                     mode  both_bounded  
- DEBUG phi_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG eta_mod        decode 1 vals -6:6            mask/zero mask/shift/bits/offset f   fffe1fffffffffff 45 4  15 indexes                     mode  both_bounded  
- DEBUG eta_mod_shift  decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
- DEBUG phi_index      decode 0 vals 0:327           mask/zero mask/shift/bits/offset 1ff ffffe00fffffffff 36 9  19 indexes                     mode  both_bounded  
- DEBUG eta_index      decode 0 vals 0:191           mask/zero mask/shift/bits/offset ff  fffffff00fffffff 28 8  28 indexes                     mode  both_bounded  
- DEBUG bec_eta_mod    decode 0 vals 0               mask/zero mask/shift/bits/offset 0   0 0  0  0  indexes                     mode  both_bounded  
 indet 1 2,4,5,7,10,11,12,13 7 1fffffffffffffff 61 3 0 min/max 2 13 values  2 4 5 7 10 11 12 13 indexes  0 0 1 2 0 3 0 0 4 5 6 7 indices  8 prev  0 next  0 mode  enumerated  cont mode  none  
 pixel 1 1:3 3 e7ffffffffffffff 59 2 3 min/max 1 3 values  indexes  indices  3 prev  0 next  0 mode  both_bounded  cont mode  none  
 bec 1 -2,0,2 3 f9ffffffffffffff 57 2 5 min/max -2 2 values  -2 0 2 indexes  0 0 1 0 2 indices  3 prev  0 next  0 mode  enumerated  cont mode  none  
@@ -60,85 +33,28 @@ phi_module    4
 eta_module    5
 phi_index     6
 eta_index     7
- DEBUG PixelID::initialize_from_dict Set barrel field values: 0
- DEBUG PixelID::initialize_from_dict Set dbm field values: -999,999
- DEBUG PixelID::initialize_from_dict Found field values: InDet/Pixel 2/1
- DEBUG PixelID::init_neighbors 
- DEBUG PixelID::initialize_from_dict 
- DEBUG Wafer range -> 2/1/0/0/0:21/-6:6 | 2/1/0/1/0:37/-6:6 | 2/1/0/2/0:51/-6:6 | 2/1/-2,2/0:2/0:47/0
- DEBUG Pixel range -> 2/1/0/0/0:21/-6:6/0:327/0:191 | 2/1/0/1/0:37/-6:6/0:327/0:143 | 2/1/0/2/0:51/-6:6/0:327/0:143 | 2/1/-2,2/0:2/0:47/0/0:327/0:143
 INFO SCT_ID::initialize_from_dictionary 
  AtlasDetectorID::initialize_from_dictionary - OK 
 INFO Initialize from dictionary cout 0
- DEBUG (Re)initialize
  AtlasDetectorID::initialize_from_dictionary - OK 
- DEBUG decode index and bit fields for each level: 
- DEBUG indet     decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
- DEBUG trt       decode 1 vals 1:3             mask/zero mask/shift/bits/offset 3   e7ffffffffffffff 59 2  3  indexes                     mode  both_bounded  
- DEBUG bec       decode 1 vals -2,-1,1,2       mask/zero mask/shift/bits/offset 3   f9ffffffffffffff 57 2  5  indexes 0 1 0 2 3           mode  enumerated  
- DEBUG phi_mod   decode 0 vals 0:31            mask/zero mask/shift/bits/offset 1f  fe0fffffffffffff 52 5  7  indexes                     mode  both_bounded  
- DEBUG lay_wheel decode 0 vals 0:17            mask/zero mask/shift/bits/offset 1f  fff07fffffffffff 47 5  12 indexes                     mode  both_bounded  
- DEBUG str_lay   decode 0 vals 0:29            mask/zero mask/shift/bits/offset 1f  ffff83ffffffffff 42 5  17 indexes                     mode  both_bounded  
- DEBUG straw     decode 0 vals 0:28            mask/zero mask/shift/bits/offset 1f  fffffc1fffffffff 37 5  22 indexes                     mode  both_bounded  
- DEBUG  TRT_ID::initialize_from_dict Set barrel field values: -1,1
- DEBUG  TRT_ID::initialize_from_dict Found field values: InDet/TRT 2/3
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG TRT_ID::init_hashes  module hash max 1344
- DEBUG TRT_ID::init_hashes  straw layer hash max 19008
- DEBUG TRT_ID::init_hashes  straw hash max 424576
- DEBUG  TRT_ID::initialize_from_dict 
- DEBUG Module range -> 2/3/-1,1/0:31/0 | 2/3/-1,1/0:31/1 | 2/3/-1,1/0:31/2 | 2/3/-2,2/0:31/0:5 | 2/3/-2,2/0:31/6:13 | 2/3/-2,2/0:31/14:17
- DEBUG Straw layer range -> 2/3/-1,1/0:31/0/0 | 2/3/-1,1/0:31/0/1:4 | 2/3/-1,1/0:31/0/5:9 | 2/3/-1,1/0:31/0/10:14 | 2/3/-1,1/0:31/0/15:17 | 2/3/-1,1/0:31/0/18 | 2/3/-1,1/0:31/1/0 | 2/3/-1,1/0:31/1/1:5 | 2/3/-1,1/0:31/1/6:10 | 2/3/-1,1/0:31/1/11:15 | 2/3/-1,1/0:31/1/16:20 | 2/3/-1,1/0:31/1/21:22 | 2/3/-1,1/0:31/1/23 | 2/3/-1,1/0:31/2/0 | 2/3/-1,1/0:31/2/1:4 | 2/3/-1,1/0:31/2/5:9 | 2/3/-1,1/0:31/2/10:14 | 2/3/-1,1/0:31/2/15:19 | 2/3/-1,1/0:31/2/20:24 | 2/3/-1,1/0:31/2/25:28 | 2/3/-1,1/0:31/2/29 | 2/3/-2,2/0:31/0:5/0:15 | 2/3/-2,2/0:31/6:13/0:7 | 2/3/-2,2/0:31/14:17/0:15
- DEBUG Straw range -> 2/3/-1,1/0:31/0/0/0:14 | 2/3/-1,1/0:31/0/1:4/0:15 | 2/3/-1,1/0:31/0/5:9/0:16 | 2/3/-1,1/0:31/0/10:14/0:17 | 2/3/-1,1/0:31/0/15:17/0:18 | 2/3/-1,1/0:31/0/18/0:17 | 2/3/-1,1/0:31/1/0/0:18 | 2/3/-1,1/0:31/1/1:5/0:19 | 2/3/-1,1/0:31/1/6:10/0:20 | 2/3/-1,1/0:31/1/11:15/0:21 | 2/3/-1,1/0:31/1/16:20/0:22 | 2/3/-1,1/0:31/1/21:22/0:23 | 2/3/-1,1/0:31/1/23/0:22 | 2/3/-1,1/0:31/2/0/0:22 | 2/3/-1,1/0:31/2/1:4/0:23 | 2/3/-1,1/0:31/2/5:9/0:24 | 2/3/-1,1/0:31/2/10:14/0:25 | 2/3/-1,1/0:31/2/15:19/0:26 | 2/3/-1,1/0:31/2/20:24/0:27 | 2/3/-1,1/0:31/2/25:28/0:28 | 2/3/-1,1/0:31/2/29/0:27 | 2/3/-2,2/0:31/0:5/0:15/0:23 | 2/3/-2,2/0:31/6:13/0:7/0:23 | 2/3/-2,2/0:31/14:17/0:15/0:17
- AtlasDetectorID::initialize_from_dictionary - OK 
-CscIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-CscIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-CscIdHelper          INFO MultiRange built successfully to cscStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper          INFO Initializing CSC hash indices ... 
-CscIdHelper          INFO The element hash max is 32
-CscIdHelper          INFO The detector element hash max is 64
 CscIdHelper          INFO The channel hash max is 61440
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-RpcIdHelper          INFO MultiRange built successfully to doubletR: MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to detectorElement: DetectorElement MultiRange size is 261
-RpcIdHelper          INFO MultiRange built successfully to rpcStrip: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper          INFO Initializing RPC hash indices ... 
-RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-TgcIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 218
-TgcIdHelper          INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper          INFO Initializing TGC hash indices ... 
-TgcIdHelper          INFO The element hash max is 1578
-TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MdtIdHelper          INFO MultiRange built successfully to Technology: MultiRange size is 218
-MdtIdHelper          INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 261
-MdtIdHelper          INFO MultiRange built successfully to tube: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper          INFO Initializing MDT hash indices ... 
-MdtIdHelper          INFO The element hash max is 1188
-MdtIdHelper          INFO The detector element hash max is 2328
 MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-sTgcIdHelper         INFO MultiRange built successfully to Technology: MultiRange size is 218
-sTgcIdHelper         INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 253
-sTgcIdHelper         INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 sTgcIdHelper         INFO Initializing sTGC hash indices ... 
-sTgcIdHelper         INFO The element hash max is 96
-sTgcIdHelper         INFO The detector element hash max is 192
 sTgcIdHelper         INFO Initializing sTGC hash indices for finding neighbors ... 
- AtlasDetectorID::initialize_from_dictionary - OK 
-MmIdHelper           INFO MultiRange built successfully to Technology: MultiRange size is 218
-MmIdHelper           INFO MultiRange built successfully to detector element: Multilayer MultiRange size is 257
-MmIdHelper           INFO MultiRange built successfully to channel: MultiRange size is 261
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper           INFO Initializing MicroMegas hash indices ... 
-MmIdHelper           INFO The element hash max is 64
-MmIdHelper           INFO The detector element hash max is 128
 MmIdHelper           INFO Initializing MicroMegas hash indices for finding neighbors ... 
  AtlasDetectorID::initialize_from_dictionary - OK 
-ClassIDSvc           INFO  getRegistryEntries: read 379 CLIDRegistry entries for module ALL
 test1
diff --git a/MuonSpectrometer/MuonIdHelpers/MuonIdHelpers/CscIdHelper.h b/MuonSpectrometer/MuonIdHelpers/MuonIdHelpers/CscIdHelper.h
index 904c884a909d..cc98712eabfe 100644
--- a/MuonSpectrometer/MuonIdHelpers/MuonIdHelpers/CscIdHelper.h
+++ b/MuonSpectrometer/MuonIdHelpers/MuonIdHelpers/CscIdHelper.h
@@ -59,7 +59,7 @@ class CscIdHelper : public MuonIdHelper
 
   // Destructor
 
-  virtual ~CscIdHelper();
+  virtual ~CscIdHelper()=default;
 
   ///////////// compact identifier stuff begins ////////////////////////////////////// 
 
diff --git a/MuonSpectrometer/MuonIdHelpers/MuonIdHelpers/MuonIdHelper.h b/MuonSpectrometer/MuonIdHelpers/MuonIdHelpers/MuonIdHelper.h
index de81c50f2de4..011841697370 100644
--- a/MuonSpectrometer/MuonIdHelpers/MuonIdHelpers/MuonIdHelper.h
+++ b/MuonSpectrometer/MuonIdHelpers/MuonIdHelpers/MuonIdHelper.h
@@ -2,19 +2,9 @@
   Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
-// ******************************************************************************
-// ATLAS Muon Identifier Helpers Package
-// -----------------------------------------
-// ******************************************************************************
-
-//<doc><file> $Id: MuonIdHelper.h,v 1.31 2007-11-25 18:19:00 ketevi Exp $
-//<version>   $Name: not supported by cvs2svn $
-
 #ifndef DETECTORDESCRIPTION_MUONIDHELPER_H
 #define DETECTORDESCRIPTION_MUONIDHELPER_H
 
-// Includes
-
 #include "AtlasDetDescr/AtlasDetectorID.h"
 #include "Identifier/IdentifierHash.h"
 #include "IdDict/IdDictFieldImplementation.h"
@@ -30,7 +20,6 @@
 #include <stdexcept>
 
 class IdDictDictionary;
-class IMessageSvc;
 
 // ******************************************************************************
 // class MuonIdHelper
@@ -98,7 +87,7 @@ class MuonIdHelper : public AtlasDetectorID
 
   // Destructor
 
-  virtual ~MuonIdHelper();
+  virtual ~MuonIdHelper()=default;
 
   // Build identifier
 
diff --git a/MuonSpectrometer/MuonIdHelpers/MuonIdHelpers/TgcIdHelper.h b/MuonSpectrometer/MuonIdHelpers/MuonIdHelpers/TgcIdHelper.h
index d01841da25f3..94934bcca0bf 100644
--- a/MuonSpectrometer/MuonIdHelpers/MuonIdHelpers/TgcIdHelper.h
+++ b/MuonSpectrometer/MuonIdHelpers/MuonIdHelpers/TgcIdHelper.h
@@ -2,19 +2,9 @@
   Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
-// ******************************************************************************
-// ATLAS Muon Identifier Helpers Package
-// -----------------------------------------
-// ******************************************************************************
-
-//<doc><file> $Id: TgcIdHelper.h,v 1.32 2009-01-20 22:44:13 kblack Exp $
-//<version>   $Name: not supported by cvs2svn $
-
 #ifndef MUONIDHELPERS_TGCIDHELPER_H
 #define MUONIDHELPERS_TGCIDHELPER_H
 
-// Includes
-class MsgStream;
 #include "MuonIdHelpers/MuonIdHelper.h"
 
 // ******************************************************************************
@@ -67,7 +57,7 @@ class TgcIdHelper : public MuonIdHelper
 
   // Destructor
 
-  virtual ~TgcIdHelper();
+  virtual ~TgcIdHelper()=default;
 
   ///////////// compact identifier stuff begins ////////////////////////////////////// 
 
diff --git a/MuonSpectrometer/MuonIdHelpers/share/muon_id_test.ref b/MuonSpectrometer/MuonIdHelpers/share/muon_id_test.ref
index b004cb36366f..a4a61d6d926c 100644
--- a/MuonSpectrometer/MuonIdHelpers/share/muon_id_test.ref
+++ b/MuonSpectrometer/MuonIdHelpers/share/muon_id_test.ref
@@ -1,11 +1,11 @@
 =========>  checking dictionnary file=IdDictMuonSpectrometer_R.03.xml
 MdtIdHelper         DEBUG (Re)initialize
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID...  DEBUG initialize_from_dictionary - unable to find mm region index: group, region size 0 0
+AtlasDetectorID...  DEBUG initialize_from_dictionary - unable to find stgc region index: group, region size 0 0
+AtlasDetectorID     DEBUG initLevelsFromDict - there are no sTGC entries in the dictionary! 
+AtlasDetectorID     DEBUG initLevelsFromDict - there are no MM entries in the dictionary! 
+AtlasDetectorID     DEBUG initLevelsFromDict -  Could not get value for label 'no_side' of field 'DetZside' in dictionary 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper         DEBUG  MDT decode index and bit fields for each level: 
 MdtIdHelper         DEBUG  muon        decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
 MdtIdHelper         DEBUG  station     decode 1 vals 0,1,2,3,4,5,6,7,8,9,10,13,14,15,17,18,20,21,41,42,43,44,45,46,47,48,49,50,51,52,53,54 mask/zero mask/shift/bits/offset 1f  e0ffffffffffffff 56 5  3  indexes 0 1 2 3 4 5 6 7 8 9 10 0 0 11 12 13 0 14 15 0 16 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 19 20 21 22 23 24 25 26 27 28 29 30 31 mode  enumerated  
@@ -442,12 +442,12 @@ MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ..
 MdtIdHelper       VERBOSE MuonIdHelper::init_neighbors 
 MdtIdHelper         DEBUG  Maximum number of MDT tubes is 78
 RpcIdHelper         DEBUG (Re)initialize
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID...  DEBUG initialize_from_dictionary - unable to find mm region index: group, region size 0 0
+AtlasDetectorID...  DEBUG initialize_from_dictionary - unable to find stgc region index: group, region size 0 0
+AtlasDetectorID     DEBUG initLevelsFromDict - there are no sTGC entries in the dictionary! 
+AtlasDetectorID     DEBUG initLevelsFromDict - there are no MM entries in the dictionary! 
+AtlasDetectorID     DEBUG initLevelsFromDict -  Could not get value for label 'no_side' of field 'DetZside' in dictionary 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper         DEBUG  RPC decode index and bit fields for each level: 
 RpcIdHelper         DEBUG  muon        decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
 RpcIdHelper         DEBUG  station     decode 1 vals 0,1,2,3,4,5,6,7,8,9,10,13,14,15,17,18,20,21,41,42,43,44,45,46,47,48,49,50,51,52,53,54 mask/zero mask/shift/bits/offset 1f  e0ffffffffffffff 56 5  3  indexes 0 1 2 3 4 5 6 7 8 9 10 0 0 11 12 13 0 14 15 0 16 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 19 20 21 22 23 24 25 26 27 28 29 30 31 mode  enumerated  
@@ -629,1043 +629,17 @@ RpcIdHelper         DEBUG  full module range size is 54
 RpcIdHelper         DEBUG  full channel range size is 54
 RpcIdHelper          INFO Initializing RPC hash indices ... 
 RpcIdHelper          INFO The element hash max is 600
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6248880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6248980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6248c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6248d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6249880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6249980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6249c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6249d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6238880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6238c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6239880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6239980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6239c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6239d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624ad80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623ad80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6230880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6230980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6230c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6230d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6231880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6231980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6231c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6231d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6232880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6232980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6232c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6232d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6233880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6233980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6233c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6233d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6234880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6234980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6234c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6234d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6235880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6235980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6235c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6235d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6236880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6236980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6236c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6236d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6237880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6237980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6237c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6237d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6250880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6250980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6250c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6250d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6251880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6251980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6251c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6251d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6252880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6252980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6252c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6252d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6253880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6253980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6253c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6253d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6254880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6254980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6254c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6254d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6255880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6255980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6255c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6255d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6256880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6256980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6256c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6256d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6257880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6257980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6257c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6257d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6228880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6228980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6228c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6228d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6229880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6229980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6229c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6229d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622ad80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622bd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622cd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622dd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622fd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6258880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6258980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6258c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6258d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6259880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6259980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6259c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6259d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625ad80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625bd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625cd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625dd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625fd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6220880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6220c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6221880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6221c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6222880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6222c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6223880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6223c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6224880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6224c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6225880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6225c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6227880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6227c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6260880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6260c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6261880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6261c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6262880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6262c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6263880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6263c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6264880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6264c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6265880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6265c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6267880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6267c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6226880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6226c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6266880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6266c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6218880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6218c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6219880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6219c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6268880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6268c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6269880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6269c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6210880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6210980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6210c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6210d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6211880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6211980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6211c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6211d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6212880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6212980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6212c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6212d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6213880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6213980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6213c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6213d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6214880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6214980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6214c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6214d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6215880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6215980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6215c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6215d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6217880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6217980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6217c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6217d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6270880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6270980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6270c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6270d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6271880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6271980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6271c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6271d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6272880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6272980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6272c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6272d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6273880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6273980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6273c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6273d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6274880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6274980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6274c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6274d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6275880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6275980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6275c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6275d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6277880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6277980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6277c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6277d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6216880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6276880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6208880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6209880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6278880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6279880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x627a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x627b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x627c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x627d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x627f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6338880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6338980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6338c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6338d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6339880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6339980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6339c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6339d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633ad80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633bd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633cd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633fd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6348880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6348980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6348c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6348d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6349880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6349980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6349c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6349d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634ad80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634bd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634cd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634fd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6330880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6330980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6330c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6330d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6331880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6331980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6331c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6331d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6332880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6332980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6332c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6332d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6333880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6333980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6333c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6333d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6334880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6334980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6334c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6334d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6337880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6337980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6337c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6337d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6350880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6350980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6350c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6350d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6351880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6351980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6351c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6351d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6352880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6352980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6352c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6352d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6353880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6353980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6353c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6353d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6354880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6354980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6354c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6354d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6357880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6357980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6357c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6357d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6328880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6328980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6328c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6328d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6329880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6329980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6329c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6329d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632ad80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632bd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632cd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632fd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6358880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6358980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6358c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6358d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6359880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6359980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6359c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6359d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635ad80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635bd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635cd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635fd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6320880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6321880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6322880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6323880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6324880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6327880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6360880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6361880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6362880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6363880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6364880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6367880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6320c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6320d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6321c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6321d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6322c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6322d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6323c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6323d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6324c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6324d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6327c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6327d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6360c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6360d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6361c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6361d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6362c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6362d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6363c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6363d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6364c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6364d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6367c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6367d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6318880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6318c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6319880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6319c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x631a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x631ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x631b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x631bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x631c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x631cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x631f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x631fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6368880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6368c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6369880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6369c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x636a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x636ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x636b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x636bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x636c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x636cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x636f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x636fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6310880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6310980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6310c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6310d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6311880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6311980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6311c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6311d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6312880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6312980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6312c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6312d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6313880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6313980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6313c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6313d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6314880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6314980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6314c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6314d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6317880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6317980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6317c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6317d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6370880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6370980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6370c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6370d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6371880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6371980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6371c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6371d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6372880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6372980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6372c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6372d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6373880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6373980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6373c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6373d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6374880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6374980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6374c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6374d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6377880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6377980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6377c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6377d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6448880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6448980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6449880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6449980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6438880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6438980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6439880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6439980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6430880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6430980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6431880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6431980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6432880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6432980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6433880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6433980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6434880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6434980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6435880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6435980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6436880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6436980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6437880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6437980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6450880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6450980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6451880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6451980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6452880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6452980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6453880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6453980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6454880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6454980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6455880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6455980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6456880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6456980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6457880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6457980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6428880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6428980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6429880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6429980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6458880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6458980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6459880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6459980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6420880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6420980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6421880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6421980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6422880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6422980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6423880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6423980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6424880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6424980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6425880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6425980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6426880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6426980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6427880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6427980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6460880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6460980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6461880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6461980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6462880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6462980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6463880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6463980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6464880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6464980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6465880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6465980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6466880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6466980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6467880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6467980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6418880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6418980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6419880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6419980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6468880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6468980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6469880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6469980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6410880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6410980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6411880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6411980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6412880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6412980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6413880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6413980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6414880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6414980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6415880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6415980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6416880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6416980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6417880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6417980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6470880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6470980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6471880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6471980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6472880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6472980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6473880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6473980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6474880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6474980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6475880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6475980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6476880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6476980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6477880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6477980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6538880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6538980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6539880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6539980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x653a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x653a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x653b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x653b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x653c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x653c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x653f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x653f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6548880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6548980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6549880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6549980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x654a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x654a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x654b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x654b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x654c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x654c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x654f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x654f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6530880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6530980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6531880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6531980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6532880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6532980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6533880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6533980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6534880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6534980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6537880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6537980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6550880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6550980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6551880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6551980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6552880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6552980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6553880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6553980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6554880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6554980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6557880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6557980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6528880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6528980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6529880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6529980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6558880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6558980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6559880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6559980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x655a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x655a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x655b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x655b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x655c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x655c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x655f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x655f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6520880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6520980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6521880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6521980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6522880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6522980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6523880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6523980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6524880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6524980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6527880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6527980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6560880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6560980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6561880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6561980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6562880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6562980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6563880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6563980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6564880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6564980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6567880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6567980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6518880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6518980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6519880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6519980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6568880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6568980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6569880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6569980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x656a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x656a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x656b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x656b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x656c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x656c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x656f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x656f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6510880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6510980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6511880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6511980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6512880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6512980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6513880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6513980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6514880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6514980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6517880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6517980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6570880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6570980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6571880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6571980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6572880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6572980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6573880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6573980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6574880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6574980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6577880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6577980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x683d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x683d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x683dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x683dd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x683e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x683e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x683ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x683ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x684d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x684d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x684dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x684dd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x684e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x684e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x684ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x684ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6835880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6835980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6835c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6835d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6836880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6836980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6836c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6836d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6855880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6855980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6855c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6855d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6856880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6856980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6856c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6856d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x682d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x682e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x685d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x685e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x682dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x682dd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x682ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x682ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x685dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x685dd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x685ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x685ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x693d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x693d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x693e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x693e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x694d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x694d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x694e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x694e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6935880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6935980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6935c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6935d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6936880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6936980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6936c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6936d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6955880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6955980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6955c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6955d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6956880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6956980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6956c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6956d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x692d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x692d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x692dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x692dd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x692e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x692e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x692ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x692ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x695d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x695d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x695dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x695dd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x695e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x695e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x695ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x695ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6925880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6925c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6926880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6926c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6965880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6965c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6966880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6966c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a45880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a46880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a3d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a3e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a4d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a4e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a35880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a36880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a55880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a56880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a2d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a2dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a2e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a2ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a5d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a5dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a5e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a5ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a25880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a25c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a26880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a26c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a65880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a65c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a66880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a66c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x7e3e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x7e3ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x7e4e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x7e4ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6406880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6486880000000000
 RpcIdHelper          INFO The detector element hash max is 1122
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
 RpcIdHelper       VERBOSE MuonIdHelper::init_neighbors 
 RpcIdHelper         DEBUG  Maximum number of RPC gas gaps is 2
 TgcIdHelper         DEBUG (Re)initialize
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID...  DEBUG initialize_from_dictionary - unable to find mm region index: group, region size 0 0
+AtlasDetectorID...  DEBUG initialize_from_dictionary - unable to find stgc region index: group, region size 0 0
+AtlasDetectorID     DEBUG initLevelsFromDict - there are no sTGC entries in the dictionary! 
+AtlasDetectorID     DEBUG initLevelsFromDict - there are no MM entries in the dictionary! 
+AtlasDetectorID     DEBUG initLevelsFromDict -  Could not get value for label 'no_side' of field 'DetZside' in dictionary 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper         DEBUG  TGC decode index and bit fields for each level: 
 TgcIdHelper         DEBUG  muon        decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
 TgcIdHelper         DEBUG  station     decode 1 vals 0,1,2,3,4,5,6,7,8,9,10,13,14,15,17,18,20,21,41,42,43,44,45,46,47,48,49,50,51,52,53,54 mask/zero mask/shift/bits/offset 1f  e0ffffffffffffff 56 5  3  indexes 0 1 2 3 4 5 6 7 8 9 10 0 0 11 12 13 0 14 15 0 16 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 19 20 21 22 23 24 25 26 27 28 29 30 31 mode  enumerated  
@@ -1760,12 +734,12 @@ TgcIdHelper          INFO The detector element hash max is 1578
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
 TgcIdHelper       VERBOSE MuonIdHelper::init_neighbors 
 CscIdHelper         DEBUG (Re)initialize
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find mm region index: group, region size 0 0
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find stgc region index: group, region size 0 0
-AtlasDetectorID::initLevelsFromDict - there are no sTGC entries in the dictionary! 
-AtlasDetectorID::initLevelsFromDict - there are no MM entries in the dictionary! 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID...  DEBUG initialize_from_dictionary - unable to find mm region index: group, region size 0 0
+AtlasDetectorID...  DEBUG initialize_from_dictionary - unable to find stgc region index: group, region size 0 0
+AtlasDetectorID     DEBUG initLevelsFromDict - there are no sTGC entries in the dictionary! 
+AtlasDetectorID     DEBUG initLevelsFromDict - there are no MM entries in the dictionary! 
+AtlasDetectorID     DEBUG initLevelsFromDict -  Could not get value for label 'no_side' of field 'DetZside' in dictionary 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper         DEBUG  CSC decode index and bit fields for each level: 
 CscIdHelper         DEBUG  muon        decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
 CscIdHelper         DEBUG  station     decode 1 vals 0,1,2,3,4,5,6,7,8,9,10,13,14,15,17,18,20,21,41,42,43,44,45,46,47,48,49,50,51,52,53,54 mask/zero mask/shift/bits/offset 1f  e0ffffffffffffff 56 5  3  indexes 0 1 2 3 4 5 6 7 8 9 10 0 0 11 12 13 0 14 15 0 16 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 19 20 21 22 23 24 25 26 27 28 29 30 31 mode  enumerated  
@@ -1803,8 +777,8 @@ CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ..
 CscIdHelper       VERBOSE MuonIdHelper::init_neighbors 
 =========>  checking dictionnary file=IdDictMuonSpectrometer_R.09.02.Asym.xml
 MdtIdHelper         DEBUG (Re)initialize
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID     DEBUG initLevelsFromDict -  Could not get value for label 'no_side' of field 'DetZside' in dictionary 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper         DEBUG  MDT decode index and bit fields for each level: 
 MdtIdHelper         DEBUG  muon        decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
 MdtIdHelper         DEBUG  station     decode 1 vals 0,1,2,3,4,5,6,7,8,9,10,13,14,15,17,18,20,21,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 mask/zero mask/shift/bits/offset 3f  e07fffffffffffff 55 6  3  indexes 0 1 2 3 4 5 6 7 8 9 10 0 0 11 12 13 0 14 15 0 16 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 mode  enumerated  
@@ -2247,8 +1221,8 @@ MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ..
 MdtIdHelper       VERBOSE MuonIdHelper::init_neighbors 
 MdtIdHelper         DEBUG  Maximum number of MDT tubes is 108
 RpcIdHelper         DEBUG (Re)initialize
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID     DEBUG initLevelsFromDict -  Could not get value for label 'no_side' of field 'DetZside' in dictionary 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper         DEBUG  RPC decode index and bit fields for each level: 
 RpcIdHelper         DEBUG  muon        decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
 RpcIdHelper         DEBUG  station     decode 1 vals 0,1,2,3,4,5,6,7,8,9,10,13,14,15,17,18,20,21,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 mask/zero mask/shift/bits/offset 3f  e07fffffffffffff 55 6  3  indexes 0 1 2 3 4 5 6 7 8 9 10 0 0 11 12 13 0 14 15 0 16 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 mode  enumerated  
@@ -2433,1055 +1407,13 @@ RpcIdHelper         DEBUG  full module range size is 55
 RpcIdHelper         DEBUG  full channel range size is 55
 RpcIdHelper          INFO Initializing RPC hash indices ... 
 RpcIdHelper          INFO The element hash max is 608
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6124440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61244c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6124640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61246c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6124c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6124cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6124e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6124ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611c440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611c640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611cc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611ccc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611ce40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611cec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6125440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61254c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6125640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61256c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6127440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61274c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6127640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61276c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611d440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611d4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611d640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611d6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611f440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611f4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611f640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611f6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6125c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6125e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6126440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6126640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611dc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611de40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611e440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611e640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611ec40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611ee40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611fc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611fe40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6126c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6126e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6127c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6127e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6118440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61184c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6118640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61186c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6118c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6118cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6118e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6118ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6119440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61194c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6119640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61196c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6119c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6119cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6119e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6119ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611a440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611a4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611a640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611a6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611ac40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611acc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611ae40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611aec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611b440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611b4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611b640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611b6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611bc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611bcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611be40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x611bec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6128440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61284c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6128640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61286c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6128c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6128cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6128e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6128ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6129440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61294c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6129640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61296c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6129c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6129cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6129e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6129ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612a440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612a4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612a640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612a6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612ac40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612acc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612ae40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612aec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612b440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612b4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612b640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612b6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612bc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612bcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612be40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612bec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6114440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61144c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6114640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61146c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6114c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6114cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6114e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6114ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6115440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61154c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6115640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61156c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6115c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6115cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6115e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6115ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6116440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61164c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6116640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61166c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6116c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6116cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6116e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6116ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6117440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61174c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6117640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61176c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6117c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6117cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6117e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6117ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612c440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612c4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612c640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612c6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612cc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612ccc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612ce40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612cec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612d440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612d4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612d640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612d6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612dc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612dcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612de40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612dec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612e440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612e4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612e640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612e6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612ec40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612ecc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612ee40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612eec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612f440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612f4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612f640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612f6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612fc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612fcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612fe40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x612fec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6110440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6110640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6110c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6110e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6111440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6111640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6111c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6111e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6112440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6112640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6112c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6112e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6113c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6113e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6130440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6130640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6130c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6130e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6131440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6131640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6131c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6131e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6132440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6132640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6132c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6132e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6133c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6133e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6113440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6113640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6133440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6133640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610c440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610c640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610cc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610ce40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610d440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610d640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610dc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610de40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610e440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610e640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610ec40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610ee40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610fc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610fe40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6134440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6134640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6134c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6134e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6135440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6135640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6135c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6135e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6136440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6136640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6136c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6136e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6137c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6137e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610f440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610f4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610f640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610f6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6137440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61374c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6137640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61376c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6108440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61084c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6108640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61086c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6108c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6108cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6108e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6108ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6109440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61094c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6109640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61096c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6109c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6109cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6109e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6109ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610a440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610a4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610a640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610a6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610ac40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610acc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610ae40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610aec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610bc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610bcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610be40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610bec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6138440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61384c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6138640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61386c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6138c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6138cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6138e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6138ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6139440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61394c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6139640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61396c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6139c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6139cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6139e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6139ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613a440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613a4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613a640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613a6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613ac40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613acc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613ae40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613aec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613bc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613bcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613be40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613bec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610b440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613b440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6104440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6104c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6105440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6105c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6106440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6106c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6107c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613c440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613cc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613d440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613dc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613e440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613ec40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x613fc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619c440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619c4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619c640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619c6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619cc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619ccc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619ce40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619cec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619d440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619d4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619d640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619d6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619dc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619dcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619de40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619dec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619e440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619e4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619e640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619e6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619fc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619fcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619fe40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619fec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a4440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a44c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a4640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a46c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a4c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a4cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a4e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a4ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a5440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a54c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a5640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a56c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a5c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a5cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a5e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a5ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a6440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a64c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a6640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a66c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a7c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a7cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a7e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a7ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6198440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61984c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6198640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61986c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6198c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6198cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6198e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6198ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6199440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61994c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6199640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61996c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6199c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6199cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6199e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6199ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619a440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619a4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619a640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619a6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619bc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619bcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619be40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x619bec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a8440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a84c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a8640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a86c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a8c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a8cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a8e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a8ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a9440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a94c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a9640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a96c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a9c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a9cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a9e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61a9ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61aa440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61aa4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61aa640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61aa6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61abc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61abcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61abe40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61abec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6194440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61944c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6194640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61946c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6194c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6194cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6194e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6194ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6195440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61954c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6195640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61956c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6195c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6195cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6195e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6195ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6196440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61964c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6196640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61966c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6197c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6197cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6197e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6197ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ac440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ac4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ac640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ac6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61acc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61accc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ace40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61acec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ad440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ad4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ad640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ad6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61adc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61adcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ade40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61adec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ae440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ae4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ae640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ae6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61afc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61afcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61afe40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61afec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6190440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6190c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6191440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6191c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6192440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6193c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b0440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b0c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b1440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b1c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b2440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b3c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6190640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61906c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6190e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6190ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6191640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61916c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6191e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6191ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6192640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61926c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6193e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6193ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b0640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b06c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b0e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b0ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b1640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b16c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b1e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b1ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b2640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b26c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b3e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b3ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618c440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618c640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618cc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618ce40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618d440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618d640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618dc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618de40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618e440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618e640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618fc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618fe40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b4440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b4640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b4c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b4e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b5440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b5640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b5c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b5e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b6440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b6640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b7c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b7e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6188440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61884c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6188640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61886c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6188c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6188cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6188e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6188ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6189440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61894c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6189640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61896c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6189c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6189cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6189e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6189ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618a440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618a4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618a640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618a6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618bc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618bcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618be40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x618bec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b8440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b84c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b8640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b86c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b8c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b8cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b8e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b8ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b9440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b94c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b9640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b96c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b9c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b9cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b9e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61b9ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ba440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ba4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ba640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61ba6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61bbc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61bbcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61bbe40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x61bbec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6224440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62244c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6224c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6224cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6225440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62254c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6225c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6225cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6226440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62264c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6226c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6226cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6227440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62274c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6227c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6227cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621c440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621c4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621cc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621ccc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621d440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621d4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621dc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621dcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621e440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621e4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621ec40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621ecc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621f440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621f4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621fc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621fcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6218440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62184c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6218c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6218cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6219440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62194c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6219c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6219cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621a440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621a4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621ac40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621acc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621b440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621b4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621bc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621bcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6228440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62284c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6228c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6228cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6229440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62294c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6229c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6229cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622a440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622a4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622ac40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622acc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622b440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622b4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622bc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622bcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6214440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62144c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6214c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6214cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6215440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62154c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6215c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6215cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6216440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62164c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6216c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6216cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6217440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62174c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6217c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6217cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622c440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622c4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622cc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622ccc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622d440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622d4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622dc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622dcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622e440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622e4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622ec40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622ecc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622f440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622f4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622fc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622fcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6210440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62104c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6210c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6210cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6211440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62114c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6211c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6211cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6212440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62124c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6212c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6212cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6213440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62134c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6213c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6213cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6230440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62304c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6230c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6230cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6231440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62314c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6231c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6231cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6232440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62324c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6232c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6232cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6233440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62334c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6233c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6233cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620c440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620c4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620cc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620ccc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620d440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620d4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620dc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620dcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620e440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620e4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620ec40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620ecc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620f440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620f4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620fc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620fcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6234440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62344c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6234c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6234cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6235440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62354c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6235c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6235cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6236440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62364c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6236c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6236cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6237440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62374c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6237c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6237cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6208440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62084c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6208c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6208cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6209440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62094c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6209c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6209cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620a440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620a4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620ac40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620acc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620b440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620b4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620bc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620bcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6238440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62384c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6238c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6238cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6239440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62394c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6239c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6239cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623a440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623a4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623ac40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623acc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623b440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623b4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623bc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623bcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x629c440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x629c4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x629cc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x629ccc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x629d440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x629d4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x629dc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x629dcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x629e440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x629e4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x629fc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x629fcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a4440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a44c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a4c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a4cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a5440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a54c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a5c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a5cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a6440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a64c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a7c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a7cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6298440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62984c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6298c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6298cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6299440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62994c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6299c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6299cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x629a440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x629a4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x629bc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x629bcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a8440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a84c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a8c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a8cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a9440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a94c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a9c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62a9cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62aa440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62aa4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62abc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62abcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6294440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62944c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6294c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6294cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6295440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62954c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6295c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6295cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6296440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62964c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6297c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6297cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62ac440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62ac4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62acc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62accc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62ad440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62ad4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62adc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62adcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62ae440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62ae4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62afc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62afcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6290440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62904c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6290c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6290cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6291440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62914c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6291c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6291cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6292440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62924c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6293c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6293cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b0440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b04c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b0c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b0cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b1440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b14c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b1c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b1cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b2440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b24c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b3c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b3cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x628c440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x628c4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x628cc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x628ccc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x628d440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x628d4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x628dc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x628dcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x628e440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x628e4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x628fc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x628fcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b4440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b44c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b4c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b4cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b5440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b54c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b5c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b5cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b6440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b64c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b7c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b7cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6288440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62884c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6288c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6288cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6289440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62894c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6289c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6289cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x628a440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x628a4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x628bc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x628bcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b8440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b84c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b8c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b8cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b9440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b94c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b9c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62b9cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62ba440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62ba4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62bbc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x62bbcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641ec40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641ecc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641ee40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641eec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641f440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641f4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641f640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641f6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6426c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6426cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6426e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6426ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6427440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64274c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6427640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64276c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641ac40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641acc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641ae40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641aec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641b440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641b4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641b640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641b6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642ac40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642acc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642ae40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642aec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642b440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642b4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642b640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642b6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6416c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6417440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642ec40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642f440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6416e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6416ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6417640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64176c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642ee40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642eec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642f640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642f6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x649ec40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x649ecc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x649f440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x649f4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64a6c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64a6cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64a7440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64a74c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x649ac40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x649acc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x649ae40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x649aec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x649b440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x649b4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x649b640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x649b6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64aac40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64aacc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64aae40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64aaec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64ab440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64ab4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64ab640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64ab6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6496c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6496cc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6496e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6496ec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6497440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64974c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6497640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64976c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64aec40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64aecc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64aee40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64aeec0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64af440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64af4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64af640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64af6c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6492c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6492e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6493440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6493640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64b2c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64b2e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64b3440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x64b3640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6522c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6523440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651ec40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651f440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6526c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6527440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651ac40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651b440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652ac40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652b440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6516c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6516e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6517440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6517640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652ec40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652ee40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652f440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652f640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6512c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6512e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6513440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6513640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6532c40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6532e40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6533440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6533640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6f1f440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6f1f640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6f27440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6f27640000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6203440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6243440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x60bc440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x60bc4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x60bcc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x60bccc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x60bd440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x60bd4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x60bdc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x60bdcc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x60be440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x60be4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x60bec40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x60becc0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x60bf440000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x60bf4c0000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x60bfc40000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x60bfcc0000000000
 RpcIdHelper          INFO The detector element hash max is 1138
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
 RpcIdHelper       VERBOSE MuonIdHelper::init_neighbors 
 RpcIdHelper         DEBUG  Maximum number of RPC gas gaps is 3
 TgcIdHelper         DEBUG (Re)initialize
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID     DEBUG initLevelsFromDict -  Could not get value for label 'no_side' of field 'DetZside' in dictionary 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper         DEBUG  TGC decode index and bit fields for each level: 
 TgcIdHelper         DEBUG  muon        decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
 TgcIdHelper         DEBUG  station     decode 1 vals 0,1,2,3,4,5,6,7,8,9,10,13,14,15,17,18,20,21,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 mask/zero mask/shift/bits/offset 3f  e07fffffffffffff 55 6  3  indexes 0 1 2 3 4 5 6 7 8 9 10 0 0 11 12 13 0 14 15 0 16 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 mode  enumerated  
@@ -3576,8 +1508,8 @@ TgcIdHelper          INFO The detector element hash max is 1554
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
 TgcIdHelper       VERBOSE MuonIdHelper::init_neighbors 
 CscIdHelper         DEBUG (Re)initialize
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID     DEBUG initLevelsFromDict -  Could not get value for label 'no_side' of field 'DetZside' in dictionary 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 CscIdHelper         DEBUG  CSC decode index and bit fields for each level: 
 CscIdHelper         DEBUG  muon        decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
 CscIdHelper         DEBUG  station     decode 1 vals 0,1,2,3,4,5,6,7,8,9,10,13,14,15,17,18,20,21,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 mask/zero mask/shift/bits/offset 3f  e07fffffffffffff 55 6  3  indexes 0 1 2 3 4 5 6 7 8 9 10 0 0 11 12 13 0 14 15 0 16 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 mode  enumerated  
@@ -3606,8 +1538,8 @@ CscIdHelper          INFO The channel hash max is 15360
 CscIdHelper          INFO Initializing CSC hash indices for finding neighbors ... 
 CscIdHelper       VERBOSE MuonIdHelper::init_neighbors 
 TgcIdHelper         DEBUG (Re)initialize
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID     DEBUG initLevelsFromDict -  Could not get value for label 'no_side' of field 'DetZside' in dictionary 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper         DEBUG  TGC decode index and bit fields for each level: 
 TgcIdHelper         DEBUG  muon        decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
 TgcIdHelper         DEBUG  station     decode 1 vals 0,1,2,3,4,5,6,7,8,9,10,13,14,15,17,18,20,21,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 mask/zero mask/shift/bits/offset 3f  e07fffffffffffff 55 6  3  indexes 0 1 2 3 4 5 6 7 8 9 10 0 0 11 12 13 0 14 15 0 16 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 mode  enumerated  
@@ -3702,8 +1634,8 @@ TgcIdHelper          INFO The detector element hash max is 1554
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
 TgcIdHelper       VERBOSE MuonIdHelper::init_neighbors 
 MmIdHelper          DEBUG (Re)initialize 
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID     DEBUG initLevelsFromDict -  Could not get value for label 'no_side' of field 'DetZside' in dictionary 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper          DEBUG  MicroMegas decode index and bit fields for each level: 
 MmIdHelper          DEBUG  muon        decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
 MmIdHelper          DEBUG  station     decode 1 vals 0,1,2,3,4,5,6,7,8,9,10,13,14,15,17,18,20,21,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 mask/zero mask/shift/bits/offset 3f  e07fffffffffffff 55 6  3  indexes 0 1 2 3 4 5 6 7 8 9 10 0 0 11 12 13 0 14 15 0 16 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 mode  enumerated  
@@ -3739,9 +1671,9 @@ MmIdHelper           INFO Initializing MicroMegas hash indices for finding neigh
 MmIdHelper        VERBOSE MuonIdHelper::init_neighbors 
 =========>  checking dictionnary file=IdDictMuonSpectrometer_R.09.02.xml
 MdtIdHelper         DEBUG (Re)initialize
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find csc region index: group, region size 0 0
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID...  DEBUG initialize_from_dictionary - unable to find csc region index: group, region size 0 0
+AtlasDetectorID     DEBUG initLevelsFromDict -  Could not get value for label 'no_side' of field 'DetZside' in dictionary 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MdtIdHelper         DEBUG  MDT decode index and bit fields for each level: 
 MdtIdHelper         DEBUG  muon        decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
 MdtIdHelper         DEBUG  station     decode 1 vals 0,1,2,3,4,5,6,7,8,9,10,13,14,15,17,18,20,21,41,42,43,44,45,46,48,52,53,54,55,56,57,58 mask/zero mask/shift/bits/offset 1f  e0ffffffffffffff 56 5  3  indexes 0 1 2 3 4 5 6 7 8 9 10 0 0 11 12 13 0 14 15 0 16 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 19 20 21 22 23 0 24 0 0 0 25 26 27 28 29 30 31 mode  enumerated  
@@ -4160,9 +2092,9 @@ MdtIdHelper          INFO Initializing MDT hash indices for finding neighbors ..
 MdtIdHelper       VERBOSE MuonIdHelper::init_neighbors 
 MdtIdHelper         DEBUG  Maximum number of MDT tubes is 108
 RpcIdHelper         DEBUG (Re)initialize
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find csc region index: group, region size 0 0
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID...  DEBUG initialize_from_dictionary - unable to find csc region index: group, region size 0 0
+AtlasDetectorID     DEBUG initLevelsFromDict -  Could not get value for label 'no_side' of field 'DetZside' in dictionary 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 RpcIdHelper         DEBUG  RPC decode index and bit fields for each level: 
 RpcIdHelper         DEBUG  muon        decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
 RpcIdHelper         DEBUG  station     decode 1 vals 0,1,2,3,4,5,6,7,8,9,10,13,14,15,17,18,20,21,41,42,43,44,45,46,48,52,53,54,55,56,57,58 mask/zero mask/shift/bits/offset 1f  e0ffffffffffffff 56 5  3  indexes 0 1 2 3 4 5 6 7 8 9 10 0 0 11 12 13 0 14 15 0 16 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 19 20 21 22 23 0 24 0 0 0 25 26 27 28 29 30 31 mode  enumerated  
@@ -4347,1072 +2279,14 @@ RpcIdHelper         DEBUG  full module range size is 55
 RpcIdHelper         DEBUG  full channel range size is 55
 RpcIdHelper          INFO Initializing RPC hash indices ... 
 RpcIdHelper          INFO The element hash max is 616
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6248880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6248980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6248c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6248d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6249880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6249980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6249c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6249d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6238880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6238c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6239880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6239980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6239c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6239d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624ad80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623ad80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x623fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x624fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6230880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6230980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6230c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6230d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6231880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6231980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6231c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6231d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6232880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6232980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6232c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6232d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6233880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6233980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6233c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6233d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6234880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6234980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6234c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6234d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6235880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6235980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6235c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6235d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6236880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6236980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6236c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6236d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6237880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6237980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6237c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6237d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6250880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6250980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6250c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6250d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6251880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6251980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6251c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6251d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6252880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6252980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6252c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6252d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6253880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6253980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6253c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6253d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6254880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6254980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6254c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6254d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6255880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6255980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6255c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6255d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6256880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6256980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6256c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6256d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6257880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6257980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6257c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6257d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6228880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6228980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6228c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6228d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6229880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6229980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6229c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6229d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622ad80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622bd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622cd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622dd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x622fd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6258880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6258980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6258c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6258d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6259880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6259980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6259c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6259d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625ad80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625bd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625cd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625dd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x625fd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6220880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6220c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6221880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6221c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6222880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6222c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6223880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6223c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6224880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6224c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6225880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6225c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6227880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6227c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6260880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6260c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6261880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6261c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6262880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6262c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6263880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6263c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6264880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6264c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6265880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6265c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6267880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6267c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6226880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6226c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6266880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6266c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6218880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6218c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6219880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6219c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6268880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6268c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6269880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6269c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x621ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x626ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6210880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6210980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6210c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6210d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6211880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6211980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6211c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6211d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6212880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6212980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6212c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6212d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6213880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6213980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6213c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6213d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6214880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6214980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6214c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6214d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6215880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6215980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6215c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6215d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6217880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6217980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6217c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6217d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6270880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6270980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6270c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6270d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6271880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6271980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6271c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6271d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6272880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6272980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6272c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6272d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6273880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6273980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6273c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6273d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6274880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6274980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6274c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6274d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6275880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6275980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6275c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6275d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6277880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6277980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6277c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6277d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6216880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6276880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6208880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6209880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x620f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6278880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6279880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x627a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x627b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x627c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x627d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x627f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6338880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6338980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6338c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6338d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6339880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6339980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6339c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6339d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633ad80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633bd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633cd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x633fd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6348880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6348980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6348c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6348d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6349880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6349980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6349c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6349d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634ad80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634bd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634cd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x634fd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6330880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6330980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6330c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6330d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6331880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6331980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6331c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6331d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6332880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6332980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6332c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6332d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6333880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6333980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6333c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6333d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6334880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6334980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6334c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6334d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6337880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6337980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6337c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6337d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6350880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6350980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6350c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6350d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6351880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6351980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6351c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6351d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6352880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6352980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6352c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6352d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6353880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6353980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6353c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6353d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6354880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6354980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6354c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6354d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6357880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6357980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6357c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6357d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6328880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6328980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6328c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6328d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6329880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6329980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6329c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6329d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632ad80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632bd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632cd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x632fd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6358880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6358980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6358c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6358d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6359880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6359980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6359c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6359d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635ad80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635bd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635cd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x635fd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6320880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6321880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6322880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6323880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6324880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6327880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6360880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6361880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6362880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6363880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6364880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6367880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6320c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6320d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6321c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6321d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6322c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6322d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6323c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6323d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6324c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6324d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6327c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6327d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6360c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6360d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6361c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6361d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6362c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6362d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6363c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6363d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6364c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6364d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6367c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6367d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6318880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6318c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6319880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6319c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x631a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x631ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x631b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x631bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x631c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x631cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x631f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x631fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6368880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6368c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6369880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6369c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x636a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x636ac80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x636b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x636bc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x636c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x636cc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x636f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x636fc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6310880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6310980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6310c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6310d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6311880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6311980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6311c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6311d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6312880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6312980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6312c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6312d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6313880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6313980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6313c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6313d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6314880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6314980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6314c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6314d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6317880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6317980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6317c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6317d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6370880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6370980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6370c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6370d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6371880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6371980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6371c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6371d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6372880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6372980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6372c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6372d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6373880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6373980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6373c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6373d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6374880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6374980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6374c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6374d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6377880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6377980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6377c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6377d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6448880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6448980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6449880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6449980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x644f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6438880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6438980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6439880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6439980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x643f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6430880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6430980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6431880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6431980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6432880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6432980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6433880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6433980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6434880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6434980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6435880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6435980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6436880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6436980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6437880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6437980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6450880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6450980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6451880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6451980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6452880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6452980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6453880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6453980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6454880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6454980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6455880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6455980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6456880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6456980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6457880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6457980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6428880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6428980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6429880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6429980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x642f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6458880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6458980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6459880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6459980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x645f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6420880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6420980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6421880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6421980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6422880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6422980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6423880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6423980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6424880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6424980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6425880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6425980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6426880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6426980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6427880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6427980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6460880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6460980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6461880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6461980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6462880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6462980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6463880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6463980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6464880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6464980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6465880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6465980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6466880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6466980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6467880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6467980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6418880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6418980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6419880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6419980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x641f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6468880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6468980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6469880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6469980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x646f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6410880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6410980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6411880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6411980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6412880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6412980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6413880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6413980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6414880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6414980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6415880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6415980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6416880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6416980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6417880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6417980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6470880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6470980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6471880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6471980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6472880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6472980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6473880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6473980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6474880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6474980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6475880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6475980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6476880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6476980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6477880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6477980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6538880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6538980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6539880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6539980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x653a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x653a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x653b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x653b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x653c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x653c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x653f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x653f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6548880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6548980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6549880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6549980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x654a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x654a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x654b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x654b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x654c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x654c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x654f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x654f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6530880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6530980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6531880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6531980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6532880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6532980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6533880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6533980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6534880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6534980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6537880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6537980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6550880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6550980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6551880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6551980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6552880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6552980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6553880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6553980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6554880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6554980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6557880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6557980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6528880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6528980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6529880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6529980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x652f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6558880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6558980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6559880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6559980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x655a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x655a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x655b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x655b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x655c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x655c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x655f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x655f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6520880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6520980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6521880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6521980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6522880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6522980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6523880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6523980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6524880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6524980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6527880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6527980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6560880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6560980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6561880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6561980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6562880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6562980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6563880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6563980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6564880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6564980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6567880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6567980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6518880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6518980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6519880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6519980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x651f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6568880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6568980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6569880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6569980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x656a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x656a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x656b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x656b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x656c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x656c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x656f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x656f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6510880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6510980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6511880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6511980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6512880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6512980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6513880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6513980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6514880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6514980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6517880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6517980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6570880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6570980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6571880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6571980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6572880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6572980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6573880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6573980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6574880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6574980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6577880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6577980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x683d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x683d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x683dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x683dd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x683e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x683e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x683ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x683ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x684d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x684d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x684dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x684dd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x684e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x684e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x684ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x684ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6835880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6835980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6835c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6835d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6836880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6836980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6836c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6836d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6855880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6855980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6855c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6855d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6856880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6856980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6856c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6856d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x682d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x682e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x685d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x685e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x682dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x682dd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x682ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x682ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x685dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x685dd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x685ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x685ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x693d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x693d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x693e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x693e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x694d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x694d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x694e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x694e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6935880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6935980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6935c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6935d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6936880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6936980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6936c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6936d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6955880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6955980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6955c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6955d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6956880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6956980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6956c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6956d80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x692d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x692d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x692dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x692dd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x692e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x692e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x692ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x692ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x695d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x695d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x695dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x695dd80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x695e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x695e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x695ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x695ed80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6925880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6925c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6926880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6926c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6965880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6965c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6966880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6966c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a45880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a46880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a3d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a3e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a4d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a4e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a35880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a36880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a55880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a56880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a2d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a2dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a2e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a2ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a5d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a5dc80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a5e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a5ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a25880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a25c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a26880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a26c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a65880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a65c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a66880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6a66c80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x7a3e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x7a3ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x7a4e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x7a4ec80000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6406880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6486880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6108880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6108980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6109880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6109980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x610f980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6178880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6178980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6179880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x6179980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x617a880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x617a980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x617b880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x617b980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x617c880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x617c980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x617d880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x617d980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x617e880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x617e980000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x617f880000000000
-RpcIdHelper         DEBUG init_detectorElement_hashes Please check the dictionary for possible duplication for 0x617f980000000000
 RpcIdHelper          INFO The detector element hash max is 1154
 RpcIdHelper          INFO Initializing RPC hash indices for finding neighbors ... 
 RpcIdHelper       VERBOSE MuonIdHelper::init_neighbors 
 RpcIdHelper         DEBUG  Maximum number of RPC gas gaps is 3
 TgcIdHelper         DEBUG (Re)initialize
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find csc region index: group, region size 0 0
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID...  DEBUG initialize_from_dictionary - unable to find csc region index: group, region size 0 0
+AtlasDetectorID     DEBUG initLevelsFromDict -  Could not get value for label 'no_side' of field 'DetZside' in dictionary 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper         DEBUG  TGC decode index and bit fields for each level: 
 TgcIdHelper         DEBUG  muon        decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
 TgcIdHelper         DEBUG  station     decode 1 vals 0,1,2,3,4,5,6,7,8,9,10,13,14,15,17,18,20,21,41,42,43,44,45,46,48,52,53,54,55,56,57,58 mask/zero mask/shift/bits/offset 1f  e0ffffffffffffff 56 5  3  indexes 0 1 2 3 4 5 6 7 8 9 10 0 0 11 12 13 0 14 15 0 16 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 19 20 21 22 23 0 24 0 0 0 25 26 27 28 29 30 31 mode  enumerated  
@@ -5503,9 +2377,9 @@ TgcIdHelper          INFO The detector element hash max is 1530
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
 TgcIdHelper       VERBOSE MuonIdHelper::init_neighbors 
 TgcIdHelper         DEBUG (Re)initialize
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find csc region index: group, region size 0 0
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID...  DEBUG initialize_from_dictionary - unable to find csc region index: group, region size 0 0
+AtlasDetectorID     DEBUG initLevelsFromDict -  Could not get value for label 'no_side' of field 'DetZside' in dictionary 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 TgcIdHelper         DEBUG  TGC decode index and bit fields for each level: 
 TgcIdHelper         DEBUG  muon        decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
 TgcIdHelper         DEBUG  station     decode 1 vals 0,1,2,3,4,5,6,7,8,9,10,13,14,15,17,18,20,21,41,42,43,44,45,46,48,52,53,54,55,56,57,58 mask/zero mask/shift/bits/offset 1f  e0ffffffffffffff 56 5  3  indexes 0 1 2 3 4 5 6 7 8 9 10 0 0 11 12 13 0 14 15 0 16 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 19 20 21 22 23 0 24 0 0 0 25 26 27 28 29 30 31 mode  enumerated  
@@ -5596,9 +2470,9 @@ TgcIdHelper          INFO The detector element hash max is 1530
 TgcIdHelper          INFO Initializing TGC hash indices for finding neighbors ... 
 TgcIdHelper       VERBOSE MuonIdHelper::init_neighbors 
 MmIdHelper          DEBUG (Re)initialize 
-AtlasDetectorIDHelper::initialize_from_dictionary - Warning: unable to find csc region index: group, region size 0 0
-AtlasDetectorID      DEBUG Could not get value for label 'no_side' of field 'DetZside' in dictionary Calorimeter
- AtlasDetectorID::initialize_from_dictionary - OK 
+AtlasDetectorID...  DEBUG initialize_from_dictionary - unable to find csc region index: group, region size 0 0
+AtlasDetectorID     DEBUG initLevelsFromDict -  Could not get value for label 'no_side' of field 'DetZside' in dictionary 
+AtlasDetectorID      INFO initialize_from_dictionary - OK
 MmIdHelper          DEBUG  MicroMegas decode index and bit fields for each level: 
 MmIdHelper          DEBUG  muon        decode 1 vals 2,4,5,7,10,11,12,13 mask/zero mask/shift/bits/offset 7   1fffffffffffffff 61 3  0  indexes 0 0 1 2 0 3 0 0 4 5 6 7 mode  enumerated  
 MmIdHelper          DEBUG  station     decode 1 vals 0,1,2,3,4,5,6,7,8,9,10,13,14,15,17,18,20,21,41,42,43,44,45,46,48,52,53,54,55,56,57,58 mask/zero mask/shift/bits/offset 1f  e0ffffffffffffff 56 5  3  indexes 0 1 2 3 4 5 6 7 8 9 10 0 0 11 12 13 0 14 15 0 16 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 19 20 21 22 23 0 24 0 0 0 25 26 27 28 29 30 31 mode  enumerated  
diff --git a/MuonSpectrometer/MuonIdHelpers/src/CscIdHelper.cxx b/MuonSpectrometer/MuonIdHelpers/src/CscIdHelper.cxx
index 9607c7116c7c..234511e12503 100644
--- a/MuonSpectrometer/MuonIdHelpers/src/CscIdHelper.cxx
+++ b/MuonSpectrometer/MuonIdHelpers/src/CscIdHelper.cxx
@@ -1,37 +1,16 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
-/**
- * ==============================================================================
- * ATLAS Muon Identifier Helpers Package
- * ==============================================================================
- */
-
 #include "MuonIdHelpers/CscIdHelper.h"
+#include "AthenaKernel/getMessageSvc.h"
 
-#include "GaudiKernel/ISvcLocator.h"
-#include "GaudiKernel/Bootstrap.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
 #include <mutex>
 
-/// Constructor/Destructor
-
 CscIdHelper::CscIdHelper() : MuonIdHelper("CscIdHelper"), m_CHAMBERLAYER_INDEX(0),
   m_WIRELAYER_INDEX(0), m_MEASURESPHI_INDEX(0), m_stripMaxPhi(UINT_MAX), m_stripMaxEta(UINT_MAX), m_hasChamLay1(false) {}
 
-/// Destructor
-
-CscIdHelper::~CscIdHelper()
-{
-  // m_Log deleted in base class.
-}
-
-
-
 /// Initialize dictionary
-
 int CscIdHelper::initialize_from_dictionary(const IdDictMgr& dict_mgr)
 {
   int status = 0;
@@ -46,7 +25,7 @@ int CscIdHelper::initialize_from_dictionary(const IdDictMgr& dict_mgr)
   }
 
   /// init base object
-
+  AtlasDetectorID::setMessageSvc(Athena::getMessageSvc());
   if (AtlasDetectorID::initialize_from_dictionary(dict_mgr)) return (1);
 
   // Register version of the MuonSpectrometer dictionary
diff --git a/MuonSpectrometer/MuonIdHelpers/src/MdtIdHelper.cxx b/MuonSpectrometer/MuonIdHelpers/src/MdtIdHelper.cxx
index a433dbc3150b..c82c55b75d30 100644
--- a/MuonSpectrometer/MuonIdHelpers/src/MdtIdHelper.cxx
+++ b/MuonSpectrometer/MuonIdHelpers/src/MdtIdHelper.cxx
@@ -2,19 +2,8 @@
   Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
-/**
- * ==============================================================================
- * ATLAS Muon Identifier Helpers Package
- * -----------------------------------------
- * ==============================================================================
- */
-
 #include "MuonIdHelpers/MdtIdHelper.h"
-
-#include "GaudiKernel/ISvcLocator.h"
-#include "GaudiKernel/Bootstrap.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
+#include "AthenaKernel/getMessageSvc.h"
 
 MdtIdHelper::MdtIdHelper() :
   MuonIdHelper("MdtIdHelper"),
@@ -37,7 +26,7 @@ int MdtIdHelper::initialize_from_dictionary(const IdDictMgr& dict_mgr)
   }
 
   /// init base object
-
+  AtlasDetectorID::setMessageSvc(Athena::getMessageSvc());
   if (AtlasDetectorID::initialize_from_dictionary(dict_mgr)) return (1);
  
   // Register version of the MuonSpectrometer dictionary
diff --git a/MuonSpectrometer/MuonIdHelpers/src/MmIdHelper.cxx b/MuonSpectrometer/MuonIdHelpers/src/MmIdHelper.cxx
index fc754d33835e..49a8cd78d651 100644
--- a/MuonSpectrometer/MuonIdHelpers/src/MmIdHelper.cxx
+++ b/MuonSpectrometer/MuonIdHelpers/src/MmIdHelper.cxx
@@ -2,19 +2,8 @@
   Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
-/**
- * ==============================================================================
- * ATLAS Muon Identifier Helpers Package
- * -----------------------------------------
- * ==============================================================================
- */
-
-// Includes
 #include "MuonIdHelpers/MmIdHelper.h"
-#include "GaudiKernel/ISvcLocator.h"
-#include "GaudiKernel/Bootstrap.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
+#include "AthenaKernel/getMessageSvc.h"
 
 /*******************************************************************************/ 
 // Constructor/Destructor
@@ -36,6 +25,7 @@ int MmIdHelper::initialize_from_dictionary(const IdDictMgr& dict_mgr) {
   }
 
   // init base object
+  AtlasDetectorID::setMessageSvc(Athena::getMessageSvc());
   if(AtlasDetectorID::initialize_from_dictionary(dict_mgr)) return (1);
 
   // Register version of the MuonSpectrometer dictionary
diff --git a/MuonSpectrometer/MuonIdHelpers/src/MuonIdHelper.cxx b/MuonSpectrometer/MuonIdHelpers/src/MuonIdHelper.cxx
index 92a53fc19d2c..7f6366917af3 100644
--- a/MuonSpectrometer/MuonIdHelpers/src/MuonIdHelper.cxx
+++ b/MuonSpectrometer/MuonIdHelpers/src/MuonIdHelper.cxx
@@ -2,16 +2,6 @@
   Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
-// ******************************************************************************
-// ATLAS Muon Identifier Helpers Package
-// -----------------------------------------
-// ******************************************************************************
-
-//<doc><file> $Id: MuonIdHelper.cxx,v 1.48 2007-11-25 16:33:41 ketevi Exp $
-//<version>   $Name: not supported by cvs2svn $
-
-// Includes
- 
 #include "MuonIdHelpers/MuonIdHelper.h"
 
 #include "GaudiKernel/ISvcLocator.h"
@@ -19,11 +9,8 @@
 #include "GaudiKernel/MsgStream.h"
 #include "GaudiKernel/IMessageSvc.h"
 
-
 const std::string MuonIdHelper::BAD_NAME = "UNKNOWN";
 
-// Constructor
-
 MuonIdHelper::MuonIdHelper(std::string logName): m_station_region_index(0), m_module_hash_max(0),
   m_channel_hash_max(0), m_detectorElement_hash_max(0), m_init(false) {
 
@@ -45,12 +32,6 @@ MuonIdHelper::MuonIdHelper(std::string logName): m_station_region_index(0), m_mo
   m_Log = std::make_unique<MsgStream>(msgSvc, logName.empty() ? "MuonIdHelper" : logName);
 }
 
-// Destructor
-
-MuonIdHelper::~MuonIdHelper()
-{
-}
-
 int
 MuonIdHelper::initialize_from_dictionary(const IdDictMgr& dict_mgr)
 {
diff --git a/MuonSpectrometer/MuonIdHelpers/src/RpcIdHelper.cxx b/MuonSpectrometer/MuonIdHelpers/src/RpcIdHelper.cxx
index da77bfb09a81..d8ba7bf39de2 100644
--- a/MuonSpectrometer/MuonIdHelpers/src/RpcIdHelper.cxx
+++ b/MuonSpectrometer/MuonIdHelpers/src/RpcIdHelper.cxx
@@ -3,11 +3,7 @@
 */
 
 #include "MuonIdHelpers/RpcIdHelper.h"
-
-#include "GaudiKernel/ISvcLocator.h"
-#include "GaudiKernel/Bootstrap.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
+#include "AthenaKernel/getMessageSvc.h"
 
 RpcIdHelper::RpcIdHelper():
   MuonIdHelper("RpcIdHelper"),
@@ -33,6 +29,7 @@ int RpcIdHelper::initialize_from_dictionary(const IdDictMgr& dict_mgr)
   }
 
   // init base object
+  AtlasDetectorID::setMessageSvc(Athena::getMessageSvc());
   if(AtlasDetectorID::initialize_from_dictionary(dict_mgr)) return (1);
 
   // Register version of the MuonSpectrometer dictionary
diff --git a/MuonSpectrometer/MuonIdHelpers/src/TgcIdHelper.cxx b/MuonSpectrometer/MuonIdHelpers/src/TgcIdHelper.cxx
index 88bd80817a83..629f1236b8e7 100644
--- a/MuonSpectrometer/MuonIdHelpers/src/TgcIdHelper.cxx
+++ b/MuonSpectrometer/MuonIdHelpers/src/TgcIdHelper.cxx
@@ -1,41 +1,14 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
-/**
- * ==============================================================================
- * ATLAS Muon Identifier Helpers Package
- * -----------------------------------------
- * ==============================================================================
- */
-
-//<doc><file> $Id: TgcIdHelper.cxx,v 1.39 2009-01-20 22:44:13 kblack Exp $
-//<version>   $Name: not supported by cvs2svn $
-
-// Includes
-
 #include "MuonIdHelpers/TgcIdHelper.h"
-
-#include "GaudiKernel/ISvcLocator.h"
-#include "GaudiKernel/Bootstrap.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
-
-
-// Constructor/Destructor
+#include "AthenaKernel/getMessageSvc.h"
 
 TgcIdHelper::TgcIdHelper() : MuonIdHelper("TgcIdHelper"), m_GASGAP_INDEX(0),
   m_ISSTRIP_INDEX(0) {}
 
-// Destructor
-
-TgcIdHelper::~TgcIdHelper()
-{
-  // m_Log deleted in base class.
-}
-
 // Initialize dictionary
-
 int TgcIdHelper::initialize_from_dictionary(const IdDictMgr& dict_mgr)
 {
   int status = 0;
@@ -50,6 +23,7 @@ int TgcIdHelper::initialize_from_dictionary(const IdDictMgr& dict_mgr)
   }
 
   // init base object
+  AtlasDetectorID::setMessageSvc(Athena::getMessageSvc());
   if(AtlasDetectorID::initialize_from_dictionary(dict_mgr)) return (1);
 
   // Register version of the MuonSpectrometer dictionary
diff --git a/MuonSpectrometer/MuonIdHelpers/src/sTgcIdHelper.cxx b/MuonSpectrometer/MuonIdHelpers/src/sTgcIdHelper.cxx
index 294533ef5cd5..2d42c13ef4fc 100644
--- a/MuonSpectrometer/MuonIdHelpers/src/sTgcIdHelper.cxx
+++ b/MuonSpectrometer/MuonIdHelpers/src/sTgcIdHelper.cxx
@@ -2,20 +2,8 @@
   Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
-/**
- * ==============================================================================
- * ATLAS Muon Identifier Helpers Package
- * -----------------------------------------
- * ==============================================================================
- */
-
-
-// Includes
 #include "MuonIdHelpers/sTgcIdHelper.h"
-#include "GaudiKernel/ISvcLocator.h"
-#include "GaudiKernel/Bootstrap.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
+#include "AthenaKernel/getMessageSvc.h"
 
 /*******************************************************************************/
 // Constructor/Destructor
@@ -38,6 +26,7 @@ int sTgcIdHelper::initialize_from_dictionary(const IdDictMgr& dict_mgr) {
   }
 
   // init base object
+  AtlasDetectorID::setMessageSvc(Athena::getMessageSvc());
   if(AtlasDetectorID::initialize_from_dictionary(dict_mgr)) return (1);
 
   // Register version of the MuonSpectrometer dictionary
diff --git a/Trigger/TrigSteer/DecisionHandling/share/emu_step_menu_processing.ref b/Trigger/TrigSteer/DecisionHandling/share/emu_step_menu_processing.ref
index 5b79e11c73ac..ce9c480634a2 100644
--- a/Trigger/TrigSteer/DecisionHandling/share/emu_step_menu_processing.ref
+++ b/Trigger/TrigSteer/DecisionHandling/share/emu_step_menu_processing.ref
@@ -144,7 +144,7 @@ TrigSignatureMoniMT                                 INFO -- #2511524900 Events
 TrigSignatureMoniMT                                 INFO -- #2511524900 Features                             3          -          3          3          
 TrigSignatureMoniMT                                 INFO HLT_TestChain6_muv1_TestChain10_ev1_L1MU6_EM5 #64374772
 TrigSignatureMoniMT                                 INFO -- #64374772 Events           2          2          1          1          1          1          1          
-TrigSignatureMoniMT                                 INFO -- #64374772 Features                               3          3          3          3          
+TrigSignatureMoniMT                                 INFO -- #64374772 Features                               5          5          5          5          
 TrigSignatureMoniMT                                 INFO HLT_TestChain6_muv1_TestChain10_muv1_L12MU6 #3196402061
 TrigSignatureMoniMT                                 INFO -- #3196402061 Events         2          2          1          0          0          0          0          
 TrigSignatureMoniMT                                 INFO -- #3196402061 Features                             3          0          0          0          
@@ -153,7 +153,7 @@ TrigSignatureMoniMT                                 INFO -- #1237112870 Events
 TrigSignatureMoniMT                                 INFO -- #1237112870 Features                             0          0          0          0          
 TrigSignatureMoniMT                                 INFO HLT_TestChain6_muv2_TestChain8_ev2_L1MU6_EM5 #3476793373
 TrigSignatureMoniMT                                 INFO -- #3476793373 Events         2          2          2          2          2          -          2          
-TrigSignatureMoniMT                                 INFO -- #3476793373 Features                             4          4          4          -          
+TrigSignatureMoniMT                                 INFO -- #3476793373 Features                             7          7          7          -          
 TrigSignatureMoniMT                                 INFO HLT_TestChain8_ev1_L1EM5 #1677577445
 TrigSignatureMoniMT                                 INFO -- #1677577445 Events         4          4          3          3          3          -          3          
 TrigSignatureMoniMT                                 INFO -- #1677577445 Features                             4          4          4          -          
diff --git a/Trigger/TrigSteer/DecisionHandling/share/emu_step_processing.ref b/Trigger/TrigSteer/DecisionHandling/share/emu_step_processing.ref
index c561eca08f8b..0df617cc3d1b 100644
--- a/Trigger/TrigSteer/DecisionHandling/share/emu_step_processing.ref
+++ b/Trigger/TrigSteer/DecisionHandling/share/emu_step_processing.ref
@@ -131,7 +131,7 @@ TrigSignatureMoniMT                                 INFO -- #1756953305 Events
 TrigSignatureMoniMT                                 INFO -- #1756953305 Features                             4          4          4          -          
 TrigSignatureMoniMT                                 INFO HLT_TestChain5_ev1_TestChain8_ev1_2TestChain6_muv1_L1EM3_L1EM5_L12MU6 #1820214917
 TrigSignatureMoniMT                                 INFO -- #1820214917 Events         1          1          1          1          -          -          1          
-TrigSignatureMoniMT                                 INFO -- #1820214917 Features                             2          2          -          -          
+TrigSignatureMoniMT                                 INFO -- #1820214917 Features                             5          5          -          -          
 TrigSignatureMoniMT                                 INFO HLT_TestChain5_ev1_TestChain8_ev1_L12EM3 #2709794009
 TrigSignatureMoniMT                                 INFO -- #2709794009 Events         0          0          0          0          -          -          0          
 TrigSignatureMoniMT                                 INFO -- #2709794009 Features                             0          0          -          -          
@@ -149,7 +149,7 @@ TrigSignatureMoniMT                                 INFO -- #2511524900 Events
 TrigSignatureMoniMT                                 INFO -- #2511524900 Features                             3          -          3          3          
 TrigSignatureMoniMT                                 INFO HLT_TestChain6_muv1_TestChain10_ev1_L1MU6_EM5 #64374772
 TrigSignatureMoniMT                                 INFO -- #64374772 Events           2          2          2          1          -          1          1          
-TrigSignatureMoniMT                                 INFO -- #64374772 Features                               4          3          -          3          
+TrigSignatureMoniMT                                 INFO -- #64374772 Features                               7          5          -          5          
 TrigSignatureMoniMT                                 INFO HLT_TestChain6_muv1_TestChain10_muv1_L12MU6 #3196402061
 TrigSignatureMoniMT                                 INFO -- #3196402061 Events         2          2          1          0          -          -          0          
 TrigSignatureMoniMT                                 INFO -- #3196402061 Features                             3          0          -          -          
@@ -158,7 +158,7 @@ TrigSignatureMoniMT                                 INFO -- #3205587050 Events
 TrigSignatureMoniMT                                 INFO -- #3205587050 Features                             0          0          -          -          
 TrigSignatureMoniMT                                 INFO HLT_TestChain6_muv2_TestChain8_ev2_L1MU6_EM5 #3476793373
 TrigSignatureMoniMT                                 INFO -- #3476793373 Events         2          2          2          2          -          -          2          
-TrigSignatureMoniMT                                 INFO -- #3476793373 Features                             4          4          -          -          
+TrigSignatureMoniMT                                 INFO -- #3476793373 Features                             7          7          -          -          
 TrigSignatureMoniMT                                 INFO HLT_TestChain8_ev1_L1EM5 #1677577445
 TrigSignatureMoniMT                                 INFO -- #1677577445 Events         4          4          3          3          3          -          3          
 TrigSignatureMoniMT                                 INFO -- #1677577445 Features                             4          4          4          -          
-- 
GitLab


From 39cc376ec575d49c03db92bc2957ed9b8297c41e Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Wed, 16 Dec 2020 13:48:19 +0100
Subject: [PATCH 073/225] AthenaMonitoringKernel: Initialize HistogramDef
 members

Assign the same C++ default values to the `HistogramDef` members as in
Python.
---
 .../AthenaMonitoringKernel/HistogramDef.h     | 36 +++++++++----------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/Control/AthenaMonitoringKernel/AthenaMonitoringKernel/HistogramDef.h b/Control/AthenaMonitoringKernel/AthenaMonitoringKernel/HistogramDef.h
index ae260d3463fa..dbae08354663 100644
--- a/Control/AthenaMonitoringKernel/AthenaMonitoringKernel/HistogramDef.h
+++ b/Control/AthenaMonitoringKernel/AthenaMonitoringKernel/HistogramDef.h
@@ -19,7 +19,7 @@ namespace Monitored {
     std::string path; //!< booking path
     std::string title; //!< title of the histogram
     std::string opt; //!< options
-    std::string tld{""}; //!< top level directory (below THistSvc stream)
+    std::string tld; //!< top level directory (below THistSvc stream)
     std::string weight; //!< name of weight variable
     std::string cutMask; //!< variable that defines whether event is accepted
 
@@ -40,33 +40,33 @@ namespace Monitored {
     RunMode runmode = RunMode::Invalid; //!< online or offline
     RunPeriod runperiod = RunPeriod::Invalid; //!< rebook period in offline monitoring
 
-    bool Sumw2; //!< store sum of squares of weights
-    int kLBNHistoryDepth; //!< length of lb history
-    bool kAddBinsDynamically; //!< add new bins outside the existing range
-    bool kRebinAxes; //!< increase the axis range without adding new bins
-    bool kCanRebin; //!< allow all axes to be rebinned
-    bool kVec; //!< add content to each bin from each element of a vector
-    bool kVecUO; //!< add content to each bin from vector, including overflow/underflow
-    bool kCumulative; //!< fill bin of monitored object's value, and every bin below it
+    bool Sumw2{false}; //!< store sum of squares of weights
+    int kLBNHistoryDepth{0}; //!< length of lb history
+    bool kAddBinsDynamically{false}; //!< add new bins outside the existing range
+    bool kRebinAxes{false}; //!< increase the axis range without adding new bins
+    bool kCanRebin{false}; //!< allow all axes to be rebinned
+    bool kVec{false}; //!< add content to each bin from each element of a vector
+    bool kVecUO{false}; //!< add content to each bin from vector, including overflow/underflow
+    bool kCumulative{false}; //!< fill bin of monitored object's value, and every bin below it
 
     std::string xvar; //!< name of x variable
-    int xbins; //!< number of y bins
-    float xmin; //!< x axis minimum
-    float xmax; //!< x axis maximum
+    int xbins{0}; //!< number of y bins
+    float xmin{0}; //!< x axis minimum
+    float xmax{0}; //!< x axis maximum
     std::vector<std::string> xlabels; //!< labels for x axis
     std::vector<double> xarray; //!< array of x bin edges
 
     std::string yvar; //!< name of y variable
-    int ybins; //!< number of y bins
-    float ymin; //!< y axis minimum
-    float ymax; //!< y axis maximum
+    int ybins{0}; //!< number of y bins
+    float ymin{0}; //!< y axis minimum
+    float ymax{0}; //!< y axis maximum
     std::vector<std::string> ylabels; //!< labels for y axis
     std::vector<double> yarray; //!< array of y bin edges
 
     std::string zvar; //!< name of z variable
-    int zbins; //!< number of z bins
-    float zmin; //!< z axis minimum
-    float zmax; //!< z axis maximum
+    int zbins{0}; //!< number of z bins
+    float zmin{0}; //!< z axis minimum
+    float zmax{0}; //!< z axis maximum
     std::vector<std::string> zlabels; //!< labels for z axis
 
     std::string treeDef; //!< defines output TTree of monitored quantities
-- 
GitLab


From 081460f0429fae71825841339768328b8cdfc9b1 Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Wed, 16 Dec 2020 14:15:42 +0100
Subject: [PATCH 074/225] JetD3PDMaker: enable flake8, delete obsolete files

Enable `flake8` and make code compliant. Delete unused `JetTileD3PD.py`
and `ModJetD3PD.py`. Also remove a lot of commented code.
---
 .../D3PDMaker/JetD3PDMaker/CMakeLists.txt     |   2 +-
 .../D3PDMaker/JetD3PDMaker/python/JetD3PD.py  |   5 -
 .../JetD3PDMaker/python/JetD3PDObject.py      | 401 +-----------------
 .../JetD3PDMaker/python/JetTileD3PD.py        |  86 ----
 .../JetD3PDMaker/python/ModJetD3PD.py         |  94 ----
 5 files changed, 3 insertions(+), 585 deletions(-)
 delete mode 100644 PhysicsAnalysis/D3PDMaker/JetD3PDMaker/python/JetTileD3PD.py
 delete mode 100644 PhysicsAnalysis/D3PDMaker/JetD3PDMaker/python/ModJetD3PD.py

diff --git a/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/CMakeLists.txt b/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/CMakeLists.txt
index f5f6fd7a1255..987894859e3f 100644
--- a/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/CMakeLists.txt
+++ b/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/CMakeLists.txt
@@ -14,6 +14,6 @@ atlas_add_component( JetD3PDMaker
                      LINK_LIBRARIES ${Boost_LIBRARIES} TrigCaloEvent CaloEvent CaloGeoHelpers CaloIdentifier AthenaBaseComps AthenaKernel Navigation StoreGateLib Identifier EventKernel FourMomUtils GaudiKernel AnalysisTriggerEvent D3PDMakerInterfaces D3PDMakerUtils TriggerD3PDMakerLib JetTagEvent JetTagInfo JetEvent Particle TileConditionsLib TileEvent TileIdentifier VxVertex )
 
 # Install files from the package:
-atlas_install_python_modules( python/*.py )
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
 atlas_install_joboptions( share/*.py )
 
diff --git a/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/python/JetD3PD.py b/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/python/JetD3PD.py
index 641e4c2496ea..f7671f3431ab 100644
--- a/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/python/JetD3PD.py
+++ b/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/python/JetD3PD.py
@@ -12,12 +12,8 @@ from JetD3PDMaker.jetMETD3PDTrigger           import jetMETTriggerBitsD3PDObject
 from MuonD3PDMaker.MuonD3PDObject             import MuonD3PDObject
 from JetD3PDMaker.JetD3PDObject               import JetD3PDObject
 from TrackD3PDMaker.xAODVertexD3PDObject      import PrimaryxAODVertexD3PDObject
-from MissingETD3PDMaker.MissingETD3PDObject   import *
-from CaloD3PDMaker.MBTSD3PDObject             import MBTSD3PDObject
-from egammaD3PDAnalysis.egammaUserDataConfig  import egammaUserDataConfig
 from EventCommonD3PDMaker.LBMetadataConfig    import LBMetadataConfig
 from TruthD3PDMaker.GenEventD3PDObject        import GenEventD3PDObject
-from TruthD3PDAnalysis.truthParticleConfig    import truthParticleConfig
 from TruthD3PDMaker.TruthParticleD3PDObject   import TruthParticleD3PDObject
 from RecExConfig.RecFlags                     import rec
 
@@ -47,7 +43,6 @@ def JetD3PD (file,
                                       file = file,
                                       D3PDSvc = D3PDSvc,
                                       streamNameRoot = streamNameRoot)
-    JetIncludes = ['AssocTrackCont']
 
     alg += EventInfoD3PDObject        (**_args (level, 'EventInfo', kw ))
     alg += ElectronD3PDObject         (**_args (level, 'Electron', kw))
diff --git a/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/python/JetD3PDObject.py b/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/python/JetD3PDObject.py
index 3d5648f28e84..2f76ee43dabf 100644
--- a/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/python/JetD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/python/JetD3PDObject.py
@@ -1,31 +1,9 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# import JetD3PDMaker
 import D3PDMakerCoreComps
 import EventCommonD3PDMaker
-# import BackgroundD3PDMaker
-from D3PDMakerCoreComps.D3PDObject import D3PDObject, \
-                                          make_SGDataVector_D3PDObject
-# from D3PDMakerCoreComps.release_version import at_least_version
-# from D3PDMakerCoreComps.resolveSGKey import resolveSGKey
-# from D3PDMakerCoreComps.SimpleAssociation import SimpleAssociation
-# from D3PDMakerCoreComps.IndexMultiAssociation import IndexMultiAssociation
-# from D3PDMakerCoreComps.ContainedVectorMultiAssociation import ContainedVectorMultiAssociation
+from D3PDMakerCoreComps.D3PDObject import make_SGDataVector_D3PDObject
 from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
-# from EventCommonD3PDMaker.DRAssociation import DRAssociation
-
-# from JetD3PDAnalysis.JetVertexFractionConfig import JetVertexFractionConfig
-# from JetD3PDMaker import JetD3PDMakerConf
-# from JetRecTools.JetRecToolsConf import *
-# from JetMomentTools.JetMomentToolsConf import *
-# from RecExConfig.RecFlags import rec
-# from AthenaCommon.AlgSequence import AlgSequence
-# from JetRec import JetRecConf
-# from JetRecTools import JetRecToolsConf
-# from JetTagD3PDMaker.AddBTagD3PDInfo import addBTagInfoToJetObject
-# from AthenaCommon.Logging import logging
-
-
 
 # #
 # # Useful options:
@@ -40,166 +18,16 @@ from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
 # #
 
 
-
-# # Reconstruction versions prior to 15.6.8 didn't fill in the jet timing/quality.
-# # Fix up such jets here.
-# def _fixJetTiming (c, **kw):
-#     if at_least_version ('15.6.8'): return
-
-#     sgkey_in = c.Getter.SGKey
-#     try:
-#         sgkey_in = resolveSGKey ('JetCollection', sgkey_in)
-#     except:
-#         if not kw.get('allowMissing'): raise
-#         return
-#     sgkey_out = sgkey_in + '_timing'
-
-#     seq = AlgSequence (D3PDMakerFlags.PreD3PDAlgSeqName())
-#     if not hasattr (seq, sgkey_out):
-#         tools = []
-#         caloqual_kw = {'doCellBasedVariables' : True,
-#                        'doConstituentBasedVariables' : True,
-#                        'doSamplingBasedVariables' : True,
-#                        'cutOnTile' : 254,
-#                        'cutOnLAr' : 4000,
-#                        'doTileQuality' : True,
-#                        'doLArQuality' : True}
-
-#         if hasattr (JetRecToolsConf, 'JetTimeQualityTool'):
-#             # rel 15 setup
-#             tool1 = JetRecToolsConf.JetTimeQualityTool (sgkey_out + 'TimeTool',
-#                                                         DoTime = False,
-#                                                         DoQuality = False,
-#                                                         UseCells = False)
-#             if rec.readESD() or rec.readRDO():
-#                 tool1.DoTime    = True
-#                 tool1.DoQuality = True
-#                 tool1.UseCells  = True
-#             if rec.readAOD() and (sgkey_in.find ('H1Topo') >= 0 or
-#                                   sgkey_in.find ('LCTopo') >= 0):
-#                 tool1.DoTime    = True
-#             tools.append (tool1)
-#         else:
-#             # rel 16
-#             caloqual_kw['doTiming'] = True
-
-#         tool2 = JetCaloQualityTool (sgkey_out + 'QualTool',
-#                                     **caloqual_kw)
-#         tools.append (tool2)
-
-#         alg = JetD3PDMaker.JetFixupAlg (sgkey_out,
-#                                         InputKey = sgkey_in,
-#                                         OutputKey = sgkey_out,
-#                                         Tools = tools)
-#         for t in tools:
-#             alg += t
-
-#         seq += alg
-
-#     c.Getter.SGKey = sgkey_out
-#     return
-
-
-# def _getprop (c, n):
-#     return getattr (c, n, c.getDefaultProperty(n))
-
-# def _jetVertexAlgHook (c, prefix, sgkey, typeName,
-#                        seq = AlgSequence(D3PDMakerFlags.PreD3PDAlgSeqName()),
-#                        *args, **kw):
-#     jvf = getattr(c, c.getName() + '_JetVertexFraction', None)
-#     if jvf :setattr(jvf,'FillFullJVF',True) # impose FillFullJVF in this case
-#     if jvf and (_getprop (jvf, 'FromUD') or _getprop (jvf, 'FillFullJVF')):
-#         JetVertexFractionConfig (seq = seq,
-#                                  prefix = prefix,
-#                                  # nb. Use this rather than the sgkey
-#                                  # passed in; _fixJetTiming may
-#                                  # have changed it.
-#                                  sgkey = c.Getter.SGKey,
-#                                  typeName = typeName)
-
-
-#     return
-
-
-# # Don't make this unless target has been specified.
-# def _constitAssocLevel (reqlev, args):
-#     if reqlev < 1: return False
-#     if not args.has_key ('Target') or not args['Target']: return False
-#     return True
-
-
-# def _jetMomentsHook (c, prefix, sgkey, typeName,
-#                      seq = AlgSequence(D3PDMakerFlags.PreD3PDAlgSeqName()),
-#                      *args, **kw):
-
-#     from JetD3PDAnalysis.JetMomentCalcConfig import JetMomentCalcConfig
-
-#     # Always turn this on if we're making jets --- it changes jvf results.
-#     from JetRec.JetRecFlags import jetFlags
-#     if hasattr(jetFlags, 'jetPerformanceJob'):
-#                jetFlags.jetPerformanceJob = True
-
-#     if hasattr (c, c.name() + '_Special'):
-#         JetMomentCalcConfig (c.Getter.SGKey, 'all', seq=seq)
-#     else:
-#         key = resolveSGKey ('JetCollection', c.Getter.SGKey)
-#         if hasattr (c, c.name() + '_ActiveArea'):
-#             JetMomentCalcConfig (c.Getter.SGKey, None, seq=seq)
-#         if hasattr (c, c.name() + '_TruthMF') and 'Topo'  in key:
-#             JetMomentCalcConfig (c.Getter.SGKey, ['truthMF'], seq=seq)
-#         if hasattr (c, c.name() + '_TracksMoments') and 'Topo'  in key:
-#             JetMomentCalcConfig (c.Getter.SGKey, ['trackMoments'], seq=seq)
-#     if hasattr (c, c.name() + '_OriginCorrection'):
-#         JetMomentCalcConfig (c.Getter.SGKey, ['origin'], seq=seq)
-#     return
-
-# def _jetClusterMomentsHook (c, prefix, sgkey, typeName,
-#                      seq = AlgSequence(D3PDMakerFlags.PreD3PDAlgSeqName()),
-#                      *args, **kw):
-
-#     if hasattr (c, c.name() + '_JetClusterMoment'):
-#         from JetRec.JetMomentGetter import make_JetMomentGetter
-#         try:
-#             from JetMomentTools.JetMomentToolsConf import JetMomentsFromClusters
-#         except ImportError:
-#             # JetMomentsFromClusters available only in AtlasPhysics, not
-#             # in AtlasProduction or development.
-#             log = logging.getLogger ('JetD3PDObject')
-#             log.warn ('JetMomentsFromClusters not available; skipping.')
-#             return
-#         jt = JetMomentsFromClusters(ClusterMoments=["CENTER_LAMBDA","SECOND_R","SECOND_LAMBDA"],
-#                                     ClusterPt=True)
-#         make_JetMomentGetter(resolveSGKey ('JetCollection', c.Getter.SGKey),
-#                              [jt])
-
-#     return
-
 def getJetD3PDObject(objectname='JetD3PDObject', prefix='jet_', btagleveloffset=7):
 
-
     object = make_SGDataVector_D3PDObject ('DataVector<xAOD::Jet_v1>',
                                            D3PDMakerFlags.JetSGKey(),
                                            prefix, objectname)
 
-#     object.defineHook (_fixJetTiming)
-#     object.defineHook (_jetVertexAlgHook)
-#     object.defineHook (_jetMomentsHook)
-#     object.defineHook (_jetClusterMomentsHook)
-
     object.defineBlock(0, 'Kinematics',
                        EventCommonD3PDMaker.FourMomFillerTool,
                        WriteE  = True)
 
-#     object.defineBlock(1, 'OriginCorrection',
-#                               JetD3PDMaker.JetMomentFillerTool,
-#                               Moments=['EtaOrigin'  , 'PhiOrigin'  ,  'MOrigin'
-#                                        ])
-
-#     object.defineBlock(1, 'WIDTH',
-#                        JetD3PDMaker.JetMomentFillerTool,
-#                        Moments=['WIDTH'
-#                                 ])
-
     object.defineBlock (
         1, 'DQMoments',
         D3PDMakerCoreComps.AuxDataFillerTool,
@@ -221,10 +49,6 @@ def getJetD3PDObject(objectname='JetD3PDObject', prefix='jet_', btagleveloffset=
                 'ootFracClusters10 < float: 0',
         ])
   
-#     object.defineBlock(1, 'JetSamplingsFrac',
-#                               JetD3PDMaker.JetSamplingsFracFillerTool)
-#     object.defineBlock(1, 'JetQual',
-#                               JetD3PDMaker.JetCaloUtilsFillerTool)
     object.defineBlock (
         1, 'JetQual',
         D3PDMakerCoreComps.AuxDataFillerTool,
@@ -234,228 +58,7 @@ def getJetD3PDObject(objectname='JetD3PDObject', prefix='jet_', btagleveloffset=
                 'isUgly < int: 0',
                 'hecf = HECFrac < float: 0',
                 ])
-#     object.defineBlock(1, 'EMFraction',
-#                               JetD3PDMaker.JetEMFractionFillerTool)
-  
-#     object.defineBlock(1, 'JES',
-#                               JetD3PDMaker.JetMomentFillerTool,
-#                               Moments=[ 'Offset', 'EMJES', 'EMJES_EtaCorr','EMJESnooffset' ])
-  
-#     object.defineBlock(1, 'JESMoments',
-#                               JetD3PDMaker.JetMomentFillerTool,
-#                               Moments=['LCJES', 'LCJES_EtaCorr' ])
-  
-#     object.defineBlock(1, 'EMScale',
-#                               JetD3PDMaker.JetSignalStateFillerTool,
-#                               WriteE = True,
-#                               SignalStateNumber = 0,
-#                               SignalStatePrefix = 'emscale')
-  
-#     object.defineBlock(1, 'ActiveArea',
-#                        JetD3PDMaker.JetMomentFillerTool,
-#                        Moments=['ActiveArea', 'ActiveAreaPx', 'ActiveAreaPy', 'ActiveAreaPz', 'ActiveAreaE'])
-
-#     # Including JetVertexFraction should also include JVtx and TruthMF,
-#     # unless explicitly excluded.
-#     def _jvfLOD (reqlev, args, hookargs):
-#         if reqlev < 3: return False
-#         if not 'JVtx' in hookargs['exclude']:
-#             hookargs['include'].append ('JVtx')
-#         if not 'TruthMF' in hookargs['exclude']:
-#             hookargs['include'].append ('TruthMF')
-#         return True
-#     try:
-#         # tracksAvailableForJets not defined in every release. Temporarily put it in
-#         # a try / except block
-#         from JetRec.TrackSelectionForJets import tracksAvailableForJets
-#         dotrackVars = tracksAvailableForJets()
-#     except:
-#         dotrackVars = True
-#     if dotrackVars:
-#         object.defineBlock(_jvfLOD, 'JetVertexFraction',
-#                            JetD3PDMaker.JetVertexFractionFillerTool,
-#                            UDPrefix=D3PDMakerFlags.JetUserDataPrefix(),
-#                            )
-#         object.defineBlock(3, 'JVtx',
-#                            JetD3PDMaker.JetVtxFillerTool)
-    
-#     object.defineBlock(3, 'TruthMF',
-#                        JetD3PDMaker.JetMomentFillerTool,
-#                        Moments=['TruthMFindex','TruthMF'])
-  
-#     object.defineBlock(3, 'Layer',
-#                               JetD3PDMaker.JetMomentFillerTool,
-#                               Moments=['GSCFactorF','WidthFraction'])
-  
-#     object.defineBlock(4, 'Samplings',
-#                               JetD3PDMaker.JetSamplingsFillerTool)
-  
-#     object.defineBlock(4, 'JetShape',
-#                               JetD3PDMaker.JetShapeFillerTool)
-  
-  
-#     object.defineBlock(4, 'Constituents',
-#                               JetD3PDMaker.JetConstituentFillerTool,
-#                               SignalStateNumber = -1,
-#                               SignalStatePrefix = 'default')
-  
-#     object.defineBlock(4, 'ConstituentScale',
-#                               JetD3PDMaker.JetSignalStateFillerTool,
-#                               WriteE = True,
-#                               SignalStateNumber = 2,
-#                               SignalStatePrefix = 'constscale')
-  
-#     object.defineBlock(5, 'JetLArHVMoment',
-#                               JetD3PDMaker.JetMomentFillerTool,
-#                               Moments=['LArBadHVEnergy','LArBadHVRatio'])
-
-#     object.defineBlock(9, 'JetClusterMoment',
-#                               JetD3PDMaker.JetMomentFillerTool,
-#                               Moments=['CENTER_LAMBDA','SECOND_R','SECOND_LAMBDA',
-#                                        'CLUSTER_PT'])
-
-#     addBTagInfoToJetObject(object,btagleveloffset)
-
-#     # Track association cannot be done unless there are tracks.
-#     # As often this is not the case track association will be done only
-#     # if this is explicitly asked for. by defining it in the include list.
-#     #
-#     # You can also enable it by passing an argument to JetD3PDObject
-#     # like:
-#     #   AssocTrackCont_target='mytarget_'
-#     def _jetAssocLevel (reqlev, args):
-#         return args.has_key ('target') or (reqlev >= 999)
-#     IndexMultiAssociation (object,
-#                            JetD3PDMaker.FlavorAssociationTool,
-#                            'trk',
-#                            prefix = 'flavor_assoctrk_',
-#                            level = _jetAssocLevel,
-#                            blockname = 'AssocTrackCont')
-
-#     object.defineBlock(10, 'JetRoIword',
-#                               JetD3PDMaker.JetROIWordFillerTool
-#                               )
-
-
-#     #JetElAssoc = DRAssociation(object,"ElectronContainer",D3PDMakerFlags.ElectronSGKey(),0.2,prefix='el_',matched="matched",blockname="El02Match")
-
-#     #JetMuAssoc = DRAssociation(object,"Analysis::MuonContainer",D3PDMakerFlags.MuonSGKey(),0.2,prefix='mu_',matched="matched",blockname="Mu02Match")
-
-# #JetTrkAssoc = DRAssociation(object,"Rec::TrackParticleContainer",D3PDMakerFlags.TrackSGKey(),0.4,prefix='trk_',matched="matched",blockname="Trk04Match")
-
-# #---------------- Trigger Object ----------------------------
-
-#     #if D3PDMakerFlags.DoTrigger():
-#     if False:
-#         JetL1Assoc = SimpleAssociation(object,
-#                                        JetD3PDMaker.JetL1TriggerObjectAssociationTool,
-#                                        matched = 'matched',
-#                                        blockname = 'L1Info',
-#                                        prefix = 'L1_',
-#                                        MaxDR = 0.6,
-#                                        ChainPattern = 'L1_J.*')
-
-#         JetL1Assoc.defineBlock (99, 'L1Kinematics',
-#                                 EventCommonD3PDMaker.FourMomFillerTool,
-#                                 WriteE = True,
-#                                 WriteEt = False,
-#                                 WriteM = False)
-
-#         JetL2Assoc = SimpleAssociation(object,
-#                                        JetD3PDMaker.JetL2TriggerObjectAssociationTool,
-#                                        matched = 'matched',
-#                                        blockname = 'L2Info',
-#                                        prefix = 'L2_',
-#                                        MaxDR = 0.25,
-#                                        ChainPattern = 'L2_j.*')
-
-#         JetL2Assoc.defineBlock (99, 'L2Kinematics',
-#                                 EventCommonD3PDMaker.FourMomFillerTool,
-#                                 WriteE = True,
-#                                 WriteEt = False,
-#                                 WriteM = False)
-
-#         JetEFAssoc = SimpleAssociation(object,
-#                                        JetD3PDMaker.JetEFTriggerObjectAssociationTool,
-#                                        matched = 'matched',
-#                                        blockname = 'EFInfo',
-#                                        prefix = 'EF_',
-#                                        MaxDR = 0.25,
-#                                        ChainPattern = 'EF_j.*')
-
-#         JetEFAssoc.defineBlock (99, 'EFKinematics',
-#                                 EventCommonD3PDMaker.FourMomFillerTool,
-#                                 WriteE = True,
-#                                 WriteEt = False,
-#                                 WriteM = False)
-#         pass
-
-#     ConstitAssoc = ContainedVectorMultiAssociation \
-#         (object,
-#          #JetD3PDMaker.JetConstituentAssociationTool,
-#          EventCommonD3PDMaker.NavigableConstituentAssociationTool,
-#          'constit_',
-#          TypeName = 'CaloCluster',
-#          nrowName = '',
-#          level = 1)
-  
-
-#     ConstitAssoc.defineBlock (_constitAssocLevel, 'ConstitIndex',
-#                               D3PDMakerCoreComps.IndexFillerTool,
-#                               Target = '')
-
-
-#     # Beam Background Identification Method
-#     object.defineBlock( 999, 'BeamBackground',
-#                         BackgroundD3PDMaker.BeamBackgroundJetFillerTool)
-
-# #---------------- special jet moments ----------------------------
-
-#     object.defineBlock(999, 'TrackMF',
-#                        JetD3PDMaker.JetMomentFillerTool,
-#                        Moments=['TrackMFindex','TrackMF'])
-
-#     object.defineBlock(999, 'TracksMoments',
-#                        JetD3PDMaker.JetMomentFillerTool,
-#                        Moments=['nTrk_pv0_1GeV', 'sumPtTrk_pv0_1GeV', 'nTrk_allpv_1GeV', 'sumPtTrk_allpv_1GeV',
-#                                 'nTrk_pv0_500MeV', 'sumPtTrk_pv0_500MeV',
-#                                 'trackWIDTH_pv0_1GeV','trackWIDTH_allpv_1GeV'
-#                                 ])
-  
-#     object.defineBlock(999, 'JetLabel',
-#                        JetD3PDMaker.JetMomentFillerTool,
-#                        Moments=['JetLabel'])
-
-#     object.defineBlock(999, 'Special',
-#                        JetD3PDMaker.JetMomentFillerTool,
-#                        Moments=['LikeLihood_0',
-#                                 'LowEtConstituentsFrac','KtDr',
-#                                 ])
-
-#     object.defineBlock(999, 'VoronoiArea',
-#                        JetD3PDMaker.JetMomentFillerTool,
-#                        Moments=['VoronoiArea', 'VoronoiAreaPx', 'VoronoiAreaPy', 'VoronoiAreaPz', 'VoronoiAreaE',
-#                                 ])
-
-#     object.defineBlock(999, 'Isolation',
-#                        JetD3PDMaker.JetMomentFillerTool,
-#                        Moments=['IsoKR20Perp', 'IsoKR20Par', 'IsoKR20SumPt', 'IsoDelta2Perp', 'IsoDelta2Par',
-#                                 'IsoDelta2SumPt', 'IsoFixedCone8Perp', 'IsoFixedCone8Par', 'IsoFixedCone8SumPt',
-#                                 'IsoFixedArea13Perp', 'IsoFixedArea13Par', 'IsoFixedArea13SumPt',
-#                                 'Iso6To88Perp', 'Iso6To88Par', 'Iso6To88SumPt',
-#                                 ])
-
-#     object.defineBlock(999, 'SplitInfo',
-#                        JetD3PDMaker.JetMomentFillerTool,
-#                        Moments=['SPLIT12', 'SPLIT23', 'SPLIT34'])
-
-#     object.defineBlock(999, 'Uncertainties',
-#                        JetD3PDMaker.JetMomentFillerTool,
-#                        Moments=['SmearingFactor'])
 
     return object
 
-
-
-
 JetD3PDObject = getJetD3PDObject()
diff --git a/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/python/JetTileD3PD.py b/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/python/JetTileD3PD.py
deleted file mode 100644
index 23a189f63c15..000000000000
--- a/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/python/JetTileD3PD.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-
-
-import D3PDMakerCoreComps            
-from D3PDMakerConfig.D3PDMakerFlags           import D3PDMakerFlags
-from EventCommonD3PDMaker.EventInfoD3PDObject import EventInfoD3PDObject
-from JetD3PDMaker.jetMETD3PDTrigger           import jetMETTriggerBitsD3PDObject
-from JetD3PDMaker.JetTileD3PDObject           import JetTileD3PDObject
-#from MissingETD3PDMaker.MissingETD3PDObject   import *
-from EventCommonD3PDMaker.LBMetadataConfig    import LBMetadataConfig
-from TruthD3PDMaker.GenEventD3PDObject        import GenEventD3PDObject
-from TruthD3PDMaker.TruthParticleD3PDObject   import TruthParticleD3PDObject
-from RecExConfig.RecFlags                     import rec
-
-from AthenaCommon.AlgSequence import AlgSequence
-topSequence = AlgSequence()
-
-inputSGkey='AntiKt4TopoEMNewJets'
-
-def _args (level, name, kwin, **kw):
-    kw = kw.copy()
-    kw['level'] = level
-    for (k, v) in kwin.items():
-        if k.startswith (name + '_'):
-            kw[k[len(name)+1:]] = v
-    return kw
-
-
-# TD: changed the tuplename here:
-def JetTileD3PD (file,
-             level = 4,
-             tuplename = 'MyTuple',
-             seq = topSequence,
-             D3PDSvc = 'D3PD::RootD3PDSvc',
-             streamNameRoot = None,
-             **kw):
-
-
-    alg = D3PDMakerCoreComps.MakerAlg(tuplename,
-                    seq,
-                    file = file,
-                    D3PDSvc = D3PDSvc,
-                    streamNameRoot = streamNameRoot)
-    
-    JetIncludes = ['AssocTrackCont']
-
-    alg += EventInfoD3PDObject        (**_args (level, 'EventInfo', kw ))
-         
-    alg += JetTileD3PDObject (**_args(level,inputSGkey, kw,  sgkey=inputSGkey,   prefix='AntiKt4Topo_' ) )
-
-    from TriggerD3PDMaker.BGCodeD3PDObject import BGCodeD3PDObject
-    from TriggerD3PDMaker.BunchStructureMetadata import addBunchStructureMetadata
-    alg += BGCodeD3PDObject (**_args (2, 'BGCode', kw))
-    addBunchStructureMetadata( alg )
-
-    
-    from TriggerD3PDMaker.TrigDecisionD3PDObject import TrigDecisionD3PDObject
-    from TriggerD3PDMaker.TrigConfMetadata import addTrigConfMetadata
-
-    alg += TrigDecisionD3PDObject  (**_args(10, 'TrigDecision', kw))
-    addTrigConfMetadata( alg )
-
-    if D3PDMakerFlags.DoTrigger():
-        alg +=  jetMETTriggerBitsD3PDObject(level)
-        
- 
-    from TrackD3PDMaker.TrackD3PDMakerFlags import TrackD3PDFlags
-    TrackD3PDFlags.storeVertexTrackIndexAssociation.set_Value_and_Lock(False)
-    TrackD3PDFlags.storeVertexTrackAssociation.set_Value_and_Lock(False)
-    TrackD3PDFlags.storeVertexFitQuality.set_Value_and_Lock(False)
-
-    from TrackD3PDMaker.xAODVertexD3PDObject    import PrimaryxAODVertexD3PDObject
-    alg += PrimaryxAODVertexD3PDObject (**_args (0, 'PrimaryVertex', kw,
-                                                 allowMissing = True,
-                                                 sgkey = D3PDMakerFlags.VertexSGKey(),
-                                                 prefix = 'vxp_'))    
-
-
-    if rec.doTruth():
-        alg += GenEventD3PDObject     (**_args (1, 'GenEvent', kw))
-        alg += TruthParticleD3PDObject(**_args (1, 'TruthParticle', kw))
-        alg += JetTileD3PDObject      (**_args (1, 'AntiKt4TruthJets', kw, sgkey='AntiKt4TruthJets', prefix='AntiKt4Truth_' ) )
-        
-        
-    alg.MetadataTools += [LBMetadataConfig()]    
-    return alg
diff --git a/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/python/ModJetD3PD.py b/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/python/ModJetD3PD.py
deleted file mode 100644
index 825123394f0c..000000000000
--- a/PhysicsAnalysis/D3PDMaker/JetD3PDMaker/python/ModJetD3PD.py
+++ /dev/null
@@ -1,94 +0,0 @@
-# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-
-# Haifeng.Li@cern.ch
-
-# For May reprocess data
-
-
-import D3PDMakerCoreComps
-from D3PDMakerConfig.D3PDMakerFlags           import D3PDMakerFlags
-from EventCommonD3PDMaker.EventInfoD3PDObject import EventInfoD3PDObject
-from egammaD3PDMaker.ElectronD3PDObject       import ElectronD3PDObject
-from egammaD3PDMaker.PhotonD3PDObject         import PhotonD3PDObject
-from JetD3PDMaker.jetMETD3PDTrigger           import jetMETTriggerBitsD3PDObject
-from MuonD3PDMaker.MuonD3PDObject             import MuonD3PDObject
-from JetD3PDMaker.JetD3PDObject               import JetD3PDObject
-from TrackD3PDMaker.xAODVertexD3PDObject      import PrimaryxAODVertexD3PDObject
-from MissingETD3PDMaker.MissingETD3PDObject   import *
-from CaloD3PDMaker.MBTSD3PDObject             import MBTSD3PDObject
-from egammaD3PDAnalysis.egammaUserDataConfig  import egammaUserDataConfig
-from EventCommonD3PDMaker.LBMetadataConfig    import LBMetadataConfig
-from TruthD3PDMaker.GenEventD3PDObject        import GenEventD3PDObject
-from TruthD3PDAnalysis.truthParticleConfig    import truthParticleConfig
-from TruthD3PDMaker.TruthParticleD3PDObject   import TruthParticleD3PDObject
-from RecExConfig.RecFlags                     import rec
-
-from AthenaCommon.AlgSequence import AlgSequence
-topSequence = AlgSequence()
-
-def JetD3PD (file,
-             level = 4,
-             tuplename = 'jet',
-             seq = topSequence,
-             D3PDSvc = 'D3PD::RootD3PDSvc'):
-
-    egammaUserDataConfig (seq)
-    if rec.doTruth():
-        truthParticleConfig (seq)
-
-    JetIncludes = ['AssocTrackCont']
-
-    alg = D3PDMakerCoreComps.MakerAlg(tuplename, seq,
-                                      file = file, D3PDSvc = D3PDSvc)
-    #-- General
-    alg += EventInfoD3PDObject (level)
-    alg += ElectronD3PDObject (0)
-    alg += PhotonD3PDObject (0)
-    alg += MuonD3PDObject (0)
-    alg += PrimaryxAODVertexD3PDObject (4, allowMissing = True,
-                                        sgkey = D3PDMakerFlags.VertexSGKey(),
-                                        prefix = 'vxp_')
-    #-- JET
-    alg += JetD3PDObject (level, sgkey='AntiKt4H1TopoJets',  include = JetIncludes, prefix='AntiKt4H1Topo_' )
-    alg += JetD3PDObject (level, sgkey='AntiKt6H1TopoJets',  include = JetIncludes, prefix='AntiKt6H1Topo_'           )
-    
-    #alg += JetD3PDObject (level, sgkey='Cone4H1TopoJets',    include = JetIncludes, prefix='Cone4H1Topo_'   )
- 
-    #-- MET 
-    alg += RefFinalMETD3PDObject (level)
-    alg += MuonMETD3PDObject (level)
-    alg += MuonBoyMETD3PDObject (level)
-    alg += FinalMETD3PDObject (level)
-    alg += CryoMETD3PDObject (level)
-    alg += CryoConeMETD3PDObject (level)
-    alg += RefEleMETD3PDObject (level)
-    alg += RefJetMETD3PDObject (level)
-    alg += RefGammaMETD3PDObject (level)
-    alg += RefTauMETD3PDObject (level)
-    alg += CellOutMETD3PDObject (level)
-    alg += BaseMETD3PDObject (level)
-    alg += Base0METD3PDObject (level)
-    alg += CalibMETD3PDObject (level)
-    alg += MuonBoySpectroMETD3PDObject (level)
-    alg += MuonBoyTrackMETD3PDObject (level)
-    alg += TopoMETD3PDObject (level)
-    alg += CorrTopoMETD3PDObject (level)
-    alg += LocHadTopoMETD3PDObject (level)
-    alg += TopoObjMETD3PDObject (level)
-
-    #-- Trigger
-    if D3PDMakerFlags.DoTrigger():
-        alg +=  jetMETTriggerBitsD3PDObject(level)
-
-    #-- Truth     
-    if rec.doTruth() :
-        alg += GenEventD3PDObject (1)
-        #alg += TruthParticleD3PDObject (level)
-        #alg += JetD3PDObject (level, sgkey='Cone4TruthJets'  , prefix='Cone4Truth_'    )
-        alg += JetD3PDObject (3, sgkey='AntiKt4TruthJets', prefix='AntiKt4Truth_' )
-        #alg += JetD3PDObject (3, sgkey='AntiKt6TruthJets', prefix='AntiKt6Truth_'  )
-        
-
-    #-- Meta Data    
-    alg.MetadataTools += [LBMetadataConfig()]    
-    return alg
-- 
GitLab


From 34d539faa9f0944986b1ca9b7229c6326a0425ef Mon Sep 17 00:00:00 2001
From: Mark Hodgkinson <mhodgkin@aiatlas025.cern.ch>
Date: Wed, 16 Dec 2020 14:30:12 +0100
Subject: [PATCH 075/225] Update mcLatest tests to use recommended settings in
 RDOtoRDOTrigger. Remove large radius tracking (LRT) test because LRT is now
 on by default.

---
 .../test/test_mcLatest_13TeV.sh                   |  2 +-
 .../test_mcLatest_13TeV_largeRadiusTrackingOn.sh  | 15 ---------------
 .../test/test_mcLatest_nopileup_13TeV.sh          |  2 +-
 .../test_mcLatest_nopileup_stdcmalloc_13TeV.sh    |  2 +-
 4 files changed, 3 insertions(+), 18 deletions(-)
 delete mode 100755 Reconstruction/RecExample/RecJobTransformTests/test/test_mcLatest_13TeV_largeRadiusTrackingOn.sh

diff --git a/Reconstruction/RecExample/RecJobTransformTests/test/test_mcLatest_13TeV.sh b/Reconstruction/RecExample/RecJobTransformTests/test/test_mcLatest_13TeV.sh
index c8c0af161901..ce865d3746f5 100755
--- a/Reconstruction/RecExample/RecJobTransformTests/test/test_mcLatest_13TeV.sh
+++ b/Reconstruction/RecExample/RecJobTransformTests/test/test_mcLatest_13TeV.sh
@@ -7,7 +7,7 @@
 # art-include: master/Athena
 
 export TRF_ECHO=True;
-Reco_tf.py --AMI=r11976 --outputRDOFile=myRDO.pool.root --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --inputHITSFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/mc16_13TeV/valid1/valid1.410000.PowhegPythiaEvtGen_P2012_ttbar_hdamp172p5_nonallhad.simul.HITS.e4993_s3227/HITS.12560240._000287.pool.root.1 --inputHighPtMinbiasHitsFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/mc16_13TeV.361239.Pythia8EvtGen_A3NNPDF23LO_minbias_inelastic_high.merge.HITS.e4981_s3087_s3089/HITS.10501933._000008.pool.root.1 --inputLowPtMinbiasHitsFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/mc16_13TeV.361238.Pythia8EvtGen_A3NNPDF23LO_minbias_inelastic_low.merge.HITS.e4981_s3087_s3089/HITS.10501925._000027.pool.root.1 --maxEvents=500 --jobNumber=1 --imf False
+Reco_tf.py --AMI=r11976 --outputRDOFile=myRDO.pool.root --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --inputHITSFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/mc16_13TeV/valid1/valid1.410000.PowhegPythiaEvtGen_P2012_ttbar_hdamp172p5_nonallhad.simul.HITS.e4993_s3227/HITS.12560240._000287.pool.root.1 --inputHighPtMinbiasHitsFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/mc16_13TeV.361239.Pythia8EvtGen_A3NNPDF23LO_minbias_inelastic_high.merge.HITS.e4981_s3087_s3089/HITS.10501933._000008.pool.root.1 --inputLowPtMinbiasHitsFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/mc16_13TeV.361238.Pythia8EvtGen_A3NNPDF23LO_minbias_inelastic_low.merge.HITS.e4981_s3087_s3089/HITS.10501925._000027.pool.root.1 --maxEvents=500 --jobNumber=1 --imf False --athenaopts "RDOtoRDOTrigger:--imf --threads=1 --concurrent-events=1"
 RES=$?
 echo "art-result: $RES Reco"
 if [ $RES -ne 0 ];then
diff --git a/Reconstruction/RecExample/RecJobTransformTests/test/test_mcLatest_13TeV_largeRadiusTrackingOn.sh b/Reconstruction/RecExample/RecJobTransformTests/test/test_mcLatest_13TeV_largeRadiusTrackingOn.sh
deleted file mode 100755
index b6302ccef134..000000000000
--- a/Reconstruction/RecExample/RecJobTransformTests/test/test_mcLatest_13TeV_largeRadiusTrackingOn.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-#
-# art-description: Run reco with a latest (September 2020) MC setup with pileup. This test also enables Large Radius Tracking.
-# art-output: log.*
-# art-athena-mt: 4
-# art-type: grid
-# art-include: master/Athena
-
-export TRF_ECHO=True;
-Reco_tf.py --AMI=r11976 --outputRDOFile=myRDO.pool.root --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --inputHITSFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/mc16_13TeV/valid1/valid1.410000.PowhegPythiaEvtGen_P2012_ttbar_hdamp172p5_nonallhad.simul.HITS.e4993_s3227/HITS.12560240._000287.pool.root.1 --inputHighPtMinbiasHitsFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/mc16_13TeV.361239.Pythia8EvtGen_A3NNPDF23LO_minbias_inelastic_high.merge.HITS.e4981_s3087_s3089/HITS.10501933._000008.pool.root.1 --inputLowPtMinbiasHitsFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/mc16_13TeV.361238.Pythia8EvtGen_A3NNPDF23LO_minbias_inelastic_low.merge.HITS.e4981_s3087_s3089/HITS.10501925._000027.pool.root.1 --maxEvents=500 --jobNumber=1 --imf False --preExec r2e:'from InDetRecExample.InDetJobProperties import InDetFlags; InDetFlags.doR3LargeD0.set_Value_and_Lock(True);InDetFlags.storeSeparateLargeD0Container.set_Value_and_Lock(True);'
-RES=$?
-echo "art-result: $RES Reco"
-if [ $RES -ne 0 ];then
-return $RES
-fi
diff --git a/Reconstruction/RecExample/RecJobTransformTests/test/test_mcLatest_nopileup_13TeV.sh b/Reconstruction/RecExample/RecJobTransformTests/test/test_mcLatest_nopileup_13TeV.sh
index acaae2dd55c7..cda40e1f6ec7 100755
--- a/Reconstruction/RecExample/RecJobTransformTests/test/test_mcLatest_nopileup_13TeV.sh
+++ b/Reconstruction/RecExample/RecJobTransformTests/test/test_mcLatest_nopileup_13TeV.sh
@@ -6,7 +6,7 @@
 # art-include: master/Athena
 
 export TRF_ECHO=True;
-Reco_tf.py --AMI=r11976 --outputRDOFile=myRDO.pool.root --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --inputHITSFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/mc16_13TeV/valid1/valid1.410000.PowhegPythiaEvtGen_P2012_ttbar_hdamp172p5_nonallhad.simul.HITS.e4993_s3227/HITS.12560240._000287.pool.root.1  --maxEvents=500 --jobNumber=1 --imf False
+Reco_tf.py --AMI=r11976 --outputRDOFile=myRDO.pool.root --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --inputHITSFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/mc16_13TeV/valid1/valid1.410000.PowhegPythiaEvtGen_P2012_ttbar_hdamp172p5_nonallhad.simul.HITS.e4993_s3227/HITS.12560240._000287.pool.root.1  --maxEvents=500 --jobNumber=1 --imf False  --athenaopts "RDOtoRDOTrigger:--imf --threads=1 --concurrent-events=1"
 RES=$?
 echo "art-result: $RES Reco"
 if [ $RES -ne 0 ];then
diff --git a/Reconstruction/RecExample/RecJobTransformTests/test/test_mcLatest_nopileup_stdcmalloc_13TeV.sh b/Reconstruction/RecExample/RecJobTransformTests/test/test_mcLatest_nopileup_stdcmalloc_13TeV.sh
index 8f58826b79aa..185774a7f8c0 100755
--- a/Reconstruction/RecExample/RecJobTransformTests/test/test_mcLatest_nopileup_stdcmalloc_13TeV.sh
+++ b/Reconstruction/RecExample/RecJobTransformTests/test/test_mcLatest_nopileup_stdcmalloc_13TeV.sh
@@ -7,7 +7,7 @@
 # art-include: master/Athena
 
 export TRF_ECHO=True;
-Reco_tf.py --AMI=r11976 --outputRDOFile=myRDO.pool.root --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --inputHITSFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/mc16_13TeV/valid1/valid1.410000.PowhegPythiaEvtGen_P2012_ttbar_hdamp172p5_nonallhad.simul.HITS.e4993_s3227/HITS.12560240._000287.pool.root.1  --maxEvents=500 --jobNumber=1 --imf False --athenaopts="--stdcmalloc"
+Reco_tf.py --AMI=r11976 --outputRDOFile=myRDO.pool.root --outputAODFile=myAOD.pool.root --outputESDFile=myESD.pool.root --outputHISTFile=myHIST.root --inputHITSFile=/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/RecJobTransformTests/mc16_13TeV/valid1/valid1.410000.PowhegPythiaEvtGen_P2012_ttbar_hdamp172p5_nonallhad.simul.HITS.e4993_s3227/HITS.12560240._000287.pool.root.1  --maxEvents=500 --jobNumber=1 --imf False --athenaopts "all:--stdcmalloc" "RDOtoRDOTrigger:--imf --threads=1 --concurrent-events=1"
 RES=$?
 echo "art-result: $RES Reco"
 if [ $RES -ne 0 ];then
-- 
GitLab


From 68543a4ef9edc8729f679975756682e252e324bd Mon Sep 17 00:00:00 2001
From: christos <christos@cern.ch>
Date: Wed, 16 Dec 2020 14:31:05 +0100
Subject: [PATCH 076/225] EMTrackMatchBuilder pass EventContext to Element
 Links

---
 .../egamma/egammaTools/src/EMTrackMatchBuilder.cxx           | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/Reconstruction/egamma/egammaTools/src/EMTrackMatchBuilder.cxx b/Reconstruction/egamma/egammaTools/src/EMTrackMatchBuilder.cxx
index e57e4de29800..1b719045ede4 100644
--- a/Reconstruction/egamma/egammaTools/src/EMTrackMatchBuilder.cxx
+++ b/Reconstruction/egamma/egammaTools/src/EMTrackMatchBuilder.cxx
@@ -138,15 +138,14 @@ EMTrackMatchBuilder::trackExecute(
     std::vector<EL> trackParticleLinks;
     trackParticleLinks.reserve(trkMatches.size());
     const std::string key = EL(*trackPC, 0).dataID();
-    IProxyDict* sg = SG::CurrentEventStore::store();
     for (const TrackMatch& m : trkMatches) {
       ATH_MSG_DEBUG("Match  dR: " << m.dR << " second  dR: " << m.seconddR
                                   << " hasPix: " << m.hasPix
                                   << " hitsScore: " << m.hitsScore);
       if (key.empty()) {
-        trackParticleLinks.emplace_back(*trackPC, m.trackNumber, sg);
+        trackParticleLinks.emplace_back(*trackPC, m.trackNumber, ctx);
       } else {
-        trackParticleLinks.emplace_back(key, m.trackNumber, sg);
+        trackParticleLinks.emplace_back(key, m.trackNumber, ctx);
       }
     }
     eg->setTrackParticles(trackParticleLinks);
-- 
GitLab


From 89c2fd1008b8926a0721ac5f49a6223c7f6049b2 Mon Sep 17 00:00:00 2001
From: Mark Hodgkinson <mhodgkin@aiatlas025.cern.ch>
Date: Wed, 16 Dec 2020 14:31:35 +0100
Subject: [PATCH 077/225] Bug fix to AOD file name in comparison script. When
 running from ESD the AOD is called AOD.pool.root and not myAOD.pool.root.

---
 .../test/test_compare_SerialAndThreadedAthenas.sh         | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/Reconstruction/RecExample/RecExRecoTest/test/test_compare_SerialAndThreadedAthenas.sh b/Reconstruction/RecExample/RecExRecoTest/test/test_compare_SerialAndThreadedAthenas.sh
index a0e2e369f75b..6ceca97222e0 100755
--- a/Reconstruction/RecExample/RecExRecoTest/test/test_compare_SerialAndThreadedAthenas.sh
+++ b/Reconstruction/RecExample/RecExRecoTest/test/test_compare_SerialAndThreadedAthenas.sh
@@ -4,7 +4,7 @@ echo "Creating new serial directory"
 mkdir serial; cd serial
 athena $1 | tee athenaSerial.log
 rc=${PIPESTATUS[0]}
-xAODDigest.py myAOD.pool.root | tee digestSerial.log
+xAODDigest.py AOD.pool.root | tee digestSerial.log
 echo "art-result: $rc Serial"
 
 test_postProcessing_Errors.sh athenaSerial.log | tee errorsSerial.log
@@ -15,7 +15,7 @@ mkdir threadOne; cd threadOne
 
 athena --threads=1 $1 | tee athenaOneThread.log
 rc1=${PIPESTATUS[0]}
-xAODDigest.py myAOD.pool.root | tee digestOneThread.log
+xAODDigest.py AOD.pool.root | tee digestOneThread.log
 echo "art-result: $rc1 OneThread"
 
 test_postProcessing_Errors.sh athenaOneThread.log | tee errorsOneThread.log
@@ -39,7 +39,7 @@ mkdir threadTwo; cd threadTwo
 
 athena --threads=2 $1 | tee athenaTwoThreads.log
 rc2=${PIPESTATUS[0]}
-xAODDigest.py myAOD.pool.root | tee digestTwoThreads.log
+xAODDigest.py AOD.pool.root | tee digestTwoThreads.log
 echo "art-result: $rc2 TwoThreads"
 
 test_postProcessing_Errors.sh athenaTwoThreads.log | tee errorsTwoThreads.log
@@ -59,7 +59,7 @@ mkdir threadFive; cd threadFive
 
 athena --threads=5 $1 | tee athenaFiveThreads.log
 rc5=${PIPESTATUS[0]}
-xAODDigest.py myAOD.pool.root | tee digestFiveThreads.log
+xAODDigest.py AOD.pool.root | tee digestFiveThreads.log
 echo "art-result: $rc5 FiveThreads"
 
 test_postProcessing_Errors.sh athenaFiveThreads.log | tee errorsFiveThreads.log
-- 
GitLab


From 3fc792f5265a15740977b0517c832e59ce0d4acf Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Wed, 16 Dec 2020 14:38:32 +0100
Subject: [PATCH 078/225] JetTagD3PDMaker: enable flake8

---
 .../D3PDMaker/JetTagD3PDMaker/CMakeLists.txt  | 10 ++-
 .../JetTagD3PDMaker/python/AddBTagD3PDInfo.py | 62 +++++++------------
 .../JetTagD3PDMaker/python/BTaggingD3PD.py    | 24 +++----
 .../python/JetTagClustersD3PDObject.py        |  4 +-
 .../python/JetTagElectronInJetD3PDObject.py   |  6 +-
 .../python/JetTagEventInfoD3PDObject.py       |  4 +-
 .../python/JetTagJSD3PDObjects.py             | 31 ++++------
 .../python/JetTagJetD3PDObject.py             | 12 ++--
 .../python/JetTagMETD3PDObject.py             |  4 +-
 .../python/JetTagMSVVtxInJetD3PDObject.py     |  3 +-
 .../python/JetTagMuonInJetD3PDObject.py       |  3 +-
 .../python/JetTagPhotonInJetD3PDObject.py     |  5 +-
 .../python/JetTagPixModCondD3PDObject.py      |  8 +--
 .../python/JetTagPrimaryVertexD3PDObject.py   |  4 +-
 .../python/JetTagTrackD3PDObject.py           |  7 +--
 .../python/JetTagTriggerBitsD3PDObject.py     |  4 +-
 .../python/JetTagTwoTrackVertexD3PDObject.py  |  5 +-
 .../python/JetTagVxOnJetAxisD3PDObject.py     |  5 +-
 18 files changed, 70 insertions(+), 131 deletions(-)

diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/CMakeLists.txt b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/CMakeLists.txt
index 19dfe77fbc9e..0dec158a9738 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/CMakeLists.txt
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/CMakeLists.txt
@@ -1,12 +1,10 @@
-################################################################################
-# Package: JetTagD3PDMaker
-################################################################################
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # Declare the package name:
 atlas_subdir( JetTagD3PDMaker )
 
 # External dependencies:
-find_package( Boost COMPONENTS filesystem thread system )
+find_package( Boost )
 find_package( CLHEP )
 
 # Component(s) in the package:
@@ -14,9 +12,9 @@ atlas_add_component( JetTagD3PDMaker
                      src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${Boost_INCLUDE_DIRS}  ${CLHEP_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${Boost_LIBRARIES} AtlasHepMCLib AthenaBaseComps AthenaKernel AthContainers EventKernel EventPrimitives GaudiKernel GeneratorObjects InDetIdentifier InDetReadoutGeometry D3PDMakerUtils JetTagEvent JetTagInfo MuonIDEvent McParticleEvent JetEvent muonEvent Particle egammaEvent TrkParticleBase VxJetVertex VxSecVertex VxVertex TrkVertexFitterInterfaces InDetConditionsSummaryService )
+                     LINK_LIBRARIES ${Boost_LIBRARIES} ${CLHEP_LIBRARIES} AtlasHepMCLib AthenaBaseComps AthenaKernel AthContainers EventPrimitives GaudiKernel GeneratorObjects InDetIdentifier InDetReadoutGeometry D3PDMakerUtils JetTagEvent JetTagInfo MuonIDEvent McParticleEvent JetEvent muonEvent Particle egammaEvent StoreGateLib TrkParticleBase VxJetVertex VxSecVertex VxVertex InDetConditionsSummaryService )
 
 # Install files from the package:
-atlas_install_python_modules( python/*.py )
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
 atlas_install_joboptions( share/*.py )
 
diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/AddBTagD3PDInfo.py b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/AddBTagD3PDInfo.py
index 29111f043801..49f4a296b419 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/AddBTagD3PDInfo.py
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/AddBTagD3PDInfo.py
@@ -1,7 +1,5 @@
 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-from __future__ import print_function
-
 #
 ## @file JetTagD3PDMaker/python/AddBTagInfoToJetObject.py
 ## @brief Python function to add BTagging specific fillers and association tools to a JetD3PDObject
@@ -32,14 +30,10 @@ addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=X)
 alg+=JetD3PDObject(level, <additional options>)
 """
 import JetTagD3PDMaker
-import TrackD3PDMaker
-import TruthD3PDMaker
 import EventCommonD3PDMaker
 import MuonD3PDMaker
+import TruthD3PDMaker
 
-import D3PDMakerCoreComps
-from D3PDMakerCoreComps.D3PDObject import D3PDObject
-from D3PDMakerCoreComps.SimpleAssociation import SimpleAssociation
 from D3PDMakerCoreComps.IndexAssociation import IndexAssociation
 from D3PDMakerCoreComps.IndexMultiAssociation import IndexMultiAssociation
 from D3PDMakerCoreComps.ContainedVectorMultiAssociation import ContainedVectorMultiAssociation
@@ -51,7 +45,6 @@ from TrkExTools.AtlasExtrapolator import AtlasExtrapolator
 
 from JetTagD3PDMaker.JetTagD3PDMakerKeys import JetTagD3PDKeys
 from JetTagD3PDMaker.JetTagD3PDMakerFlags import JetTagD3PDFlags
-from TruthD3PDMaker.TruthD3PDMakerFlags import TruthD3PDFlags
 
 def _jetTagAssocLevel (reqlev, args):
     if not args.has_key ('target') : 
@@ -67,7 +60,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
     from AthenaCommon.Logging import logging
     addBTagInfoLogger = logging.getLogger( "addBTagInfoToJetObject" )
 
-    if JetD3PDObject.allBlocknames().has_key(JetTagD3PDKeys.BTagWeightsBlockName()) :
+    if JetTagD3PDKeys.BTagWeightsBlockName() in JetD3PDObject.allBlocknames():
         addBTagInfoLogger.warning("btag blocks already added to JetD3PDObject - ignore")
         return
 
@@ -153,7 +146,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
 
         
 
-        JetTrack = ContainedVectorMultiAssociation(JetD3PDObject,
+        JetTrack = ContainedVectorMultiAssociation(JetD3PDObject,  # noqa: F841
                                                    JetTagD3PDMaker.JetTagJetTrackAssociationTool,
                                                    level = btagLevelOffset+4,
                                                    prefix=JetTagD3PDKeys.JetTrackAssocPrefix(),
@@ -164,7 +157,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
 
 
     if LocalFlags.JetTrackGhostAssoc():
-        JetTrackAssoc = IndexMultiAssociation(JetD3PDObject,
+        JetTrackAssoc = IndexMultiAssociation(JetD3PDObject,  # noqa: F841
                                               JetTagD3PDMaker.JetTagJetTrackAssociationTool,
                                               '', ## set target when calling the JetD3PDObject
                                               level = _jetTagAssocLevel,
@@ -230,7 +223,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
 
     if LocalFlags.JetMuonAssoc():
 
-        JetMuonAssoc = IndexMultiAssociation(JetD3PDObject,
+        JetMuonAssoc = IndexMultiAssociation(JetD3PDObject,  # noqa: F841
                                              JetTagD3PDMaker.JetTagJetMuonAssociationTool,
                                              '', ## set target when calling the JetD3PDObject
                                              level =_jetTagAssocLevel,
@@ -239,7 +232,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
 
         if LocalFlags.AddSecondMuonCollection():
 
-            JetMuon2Assoc = IndexMultiAssociation(JetD3PDObject,
+            JetMuon2Assoc = IndexMultiAssociation(JetD3PDObject,  # noqa: F841
                                                   JetTagD3PDMaker.JetTagJetMuonAssociationTool,
                                                   '',
                                                   level = _jetTagAssocLevel,
@@ -249,7 +242,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
 
     if LocalFlags.JetElectronAssoc():
 
-        JetElectronAssoc = IndexMultiAssociation(JetD3PDObject,
+        JetElectronAssoc = IndexMultiAssociation(JetD3PDObject,  # noqa: F841
                                                  JetTagD3PDMaker.JetTagJetElectronAssociationTool,
                                                  '',
                                                  level = _jetTagAssocLevel,
@@ -258,7 +251,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
 
     if LocalFlags.JetPhotonAssoc():
 
-        JetPhotonAssoc = IndexMultiAssociation(JetD3PDObject,
+        JetPhotonAssoc = IndexMultiAssociation(JetD3PDObject,  # noqa: F841
                                                JetTagD3PDMaker.JetTagJetPhotonAssociationTool,
                                                '',
                                                level = _jetTagAssocLevel,
@@ -269,8 +262,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
  
     if rec.doTruth and LocalFlags.JetGenSoftLeptonAssoc():
 
-        JetGenSoftLeptonAssoc = IndexMultiAssociation(\
-            JetD3PDObject,
+        JetGenSoftLeptonAssoc = IndexMultiAssociation(JetD3PDObject,  # noqa: F841
             JetTagD3PDMaker.JetTagJetGenSoftLeptonAssociationTool,
             '',
             level = _jetTagAssocLevel,
@@ -281,8 +273,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
 
 
     
-        JetGenSoftLepton = ContainedVectorMultiAssociation(\
-            JetD3PDObject,
+        JetGenSoftLepton = ContainedVectorMultiAssociation(JetD3PDObject,  # noqa: F841
             JetTagD3PDMaker.JetTagJetGenSoftLeptonAssociationTool,
             level = btagLevelOffset+4,
             prefix=JetTagD3PDKeys.JetGenSoftLeptonAssocPrefix(),
@@ -475,7 +466,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
 
     if LocalFlags.IPInfoPlus():
 
-        IPInfoPlusTrackAssoc =  IndexMultiAssociation(JetD3PDObject,
+        IPInfoPlusTrackAssoc =  IndexMultiAssociation(JetD3PDObject,  # noqa: F841
                                                       JetTagD3PDMaker.JetTagIPInfoPlusTrackAssociationTool,
                                                       '',
                                                       level = _jetTagAssocLevel,
@@ -515,7 +506,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
                                   AddNormDist=True)
 
 
-        SVInfoPlusTrackAssoc =  IndexMultiAssociation(JetD3PDObject,
+        SVInfoPlusTrackAssoc =  IndexMultiAssociation(JetD3PDObject,  # noqa: F841
                                                       JetTagD3PDMaker.JetTagSVInfoPlusTrackAssociationTool,
                                                       '',
                                                       level = _jetTagAssocLevel,
@@ -552,7 +543,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
                                   InfoType="SV0InfoPlus",
                                   AllowMissing = True)
 
-        SV0InfoPlusTrackAssoc =  IndexMultiAssociation(JetD3PDObject,
+        SV0InfoPlusTrackAssoc =  IndexMultiAssociation(JetD3PDObject,  # noqa: F841
                                                        JetTagD3PDMaker.JetTagSVInfoPlusTrackAssociationTool,
                                                        '',
                                                        level = _jetTagAssocLevel,
@@ -583,7 +574,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
 
     if LocalFlags.SoftMuonInfo():
 
-        SoftMuonInfoMuonAssoc =  IndexMultiAssociation(JetD3PDObject,
+        SoftMuonInfoMuonAssoc =  IndexMultiAssociation(JetD3PDObject,  # noqa: F841
                                                        JetTagD3PDMaker.JetTagSoftMuonInfoMuonAssociationTool,
                                                        '',
                                                        level = _jetTagAssocLevel,
@@ -630,8 +621,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
             
         if LocalFlags.AddSecondMuonCollection():
 
-            SoftMuon2InfoMuon2Assoc =  IndexMultiAssociation(\
-                JetD3PDObject,
+            SoftMuon2InfoMuon2Assoc =  IndexMultiAssociation(JetD3PDObject,  # noqa: F841
                 JetTagD3PDMaker.JetTagSoftMuonInfoMuonAssociationTool,
                 '',
                 level = _jetTagAssocLevel,
@@ -663,7 +653,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
 
     if LocalFlags.SoftMuonChi2Info():
 
-        SoftMuonChi2InfoMuonAssoc =  IndexMultiAssociation(JetD3PDObject,
+        SoftMuonChi2InfoMuonAssoc =  IndexMultiAssociation(JetD3PDObject,  # noqa: F841
                                                        JetTagD3PDMaker.JetTagSoftMuonInfoMuonAssociationTool,
                                                        '',
                                                        level = _jetTagAssocLevel,
@@ -712,8 +702,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
             
         if LocalFlags.AddSecondMuonCollection():
 
-            SoftMuon2Chi2InfoMuon2Assoc =  IndexMultiAssociation(\
-                JetD3PDObject,
+            SoftMuon2Chi2InfoMuon2Assoc =  IndexMultiAssociation(JetD3PDObject,  # noqa: F841
                 JetTagD3PDMaker.JetTagSoftMuonInfoMuonAssociationTool,
                 '',
                 level = _jetTagAssocLevel,
@@ -747,8 +736,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
 
     if LocalFlags.SoftElectronInfo():
 
-        SoftElectronInfoElectronAssoc =  IndexMultiAssociation(\
-            JetD3PDObject,
+        SoftElectronInfoElectronAssoc =  IndexMultiAssociation(JetD3PDObject,  # noqa: F841
             JetTagD3PDMaker.JetTagSoftElecInfoegammaAssociationTool,
             '',
             level = _jetTagAssocLevel,
@@ -784,8 +772,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
                                   AllowMissing = True)
 
 
-        MultiSVInfoPlusTrackAssoc = IndexMultiAssociation(\
-            JetD3PDObject,
+        MultiSVInfoPlusTrackAssoc = IndexMultiAssociation(JetD3PDObject,  # noqa: F841
             JetTagD3PDMaker.JetTagMultiSVInfoMSVVtxInfoAssociationTool,
                 '',
             level = _jetTagAssocLevel,
@@ -853,7 +840,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
 
         if LocalFlags.JFVxOnJetAxisAssocLabel() != "":
 
-            JetVxOnJetAxisAssoc = IndexMultiAssociation(JetD3PDObject,
+            JetVxOnJetAxisAssoc = IndexMultiAssociation(JetD3PDObject,  # noqa: F841
                                                         JetTagD3PDMaker.JetTagJetVxOnJetAxisAssociationTool,
                                                         LocalFlags.JFVxOnJetAxisAssocLabel(),
                                                         level = btagLevelOffset+5,
@@ -864,8 +851,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
 
             if LocalFlags.JetFitterFlipVxOnJetAxisAssoc():
 
-                JFFlipJetVxOnJetAxisAssoc = IndexMultiAssociation(\
-                    JetD3PDObject,
+                JFFlipJetVxOnJetAxisAssoc = IndexMultiAssociation(JetD3PDObject,  # noqa: F841
                     JetTagD3PDMaker.JetTagJetVxOnJetAxisAssociationTool,
                     LocalFlags.JFVxOnJetAxisAssocLabel(),
                     level = btagLevelOffset+6,
@@ -877,8 +863,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
 
         if LocalFlags.JFTwoTrackVertexAssocLabel() != "":
 
-            JetJFTwoTrackVertexAssoc = IndexMultiAssociation(\
-                JetD3PDObject,
+            JetJFTwoTrackVertexAssoc = IndexMultiAssociation(JetD3PDObject,  # noqa: F841
                 JetTagD3PDMaker.JetTagJetJFTwoTrackVertexAssociationTool,
                 LocalFlags.JFTwoTrackVertexAssocLabel(),
                 level = btagLevelOffset+5,
@@ -889,8 +874,7 @@ def addBTagInfoToJetObject(JetD3PDObject, btagLevelOffset=0, LocalFlags=JetTagD3
 
             if LocalFlags.JetFitterFlipTwoTrackVertexAssoc():
 
-                JetJFFlipTwoTrackVertexAssoc = IndexMultiAssociation(\
-                JetD3PDObject,
+                JetJFFlipTwoTrackVertexAssoc = IndexMultiAssociation(JetD3PDObject,  # noqa: F841
                 JetTagD3PDMaker.JetTagJetJFTwoTrackVertexAssociationTool,
                 LocalFlags.JFTwoTrackVertexAssocLabel(),
                 level = btagLevelOffset+6,
diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/BTaggingD3PD.py b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/BTaggingD3PD.py
index 54ca8cb2eebc..69ef4530a672 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/BTaggingD3PD.py
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/BTaggingD3PD.py
@@ -6,30 +6,24 @@
 # @brief Construct a btagging d3pd.
 #
 
-from __future__ import print_function
-
-
 from AthenaCommon.AppMgr import ServiceMgr
-from AthenaCommon.AppMgr import ToolSvc
 from RecExConfig.RecFlags import rec
 
 from JetTagD3PDMaker.JetTagD3PDMakerKeys import JetTagD3PDKeys
 from JetTagD3PDMaker.JetTagD3PDMakerFlags import JetTagD3PDFlags
-from TrackD3PDMaker.TrackD3PDMakerFlags import TrackD3PDFlags
-from TruthD3PDMaker.TruthD3PDMakerFlags import TruthD3PDFlags
 
 def _modifyMuonObject(MuonD3PDObject):
-    if not MuonD3PDObject.allBlocknames().has_key("BtagMuonTrackMatchingBlock"):
+    if "BtagMuonTrackMatchingBlock" not in MuonD3PDObject.allBlocknames():
         if JetTagD3PDFlags.TrackAssocLabel() != "":
             from D3PDMakerCoreComps.IndexAssociation import IndexAssociation
             import MuonD3PDMaker
-            mtassoc = IndexAssociation(MuonD3PDObject,
-                                       MuonD3PDMaker.MuonTrackParticleAssociationTool,
-                                       JetTagD3PDFlags.TrackAssocLabel(),
-                                       level = 500,
-                                       prefix=JetTagD3PDKeys.MuonInDetTrackAssocPrefix(),
-                                       blockname="BtagMuonTrackMatchingBlock",
-                                       Type =  'InDet')
+            _ = IndexAssociation(MuonD3PDObject,
+                                 MuonD3PDMaker.MuonTrackParticleAssociationTool,
+                                 JetTagD3PDFlags.TrackAssocLabel(),
+                                 level = 500,
+                                 prefix=JetTagD3PDKeys.MuonInDetTrackAssocPrefix(),
+                                 blockname="BtagMuonTrackMatchingBlock",
+                                 Type =  'InDet')
 
 
 
@@ -312,7 +306,7 @@ def BTaggingD3PD(alg = None,
     if JetTagD3PDFlags.AddFatJets():
         from JetTagD3PDMaker.JetTagJSD3PDObjects import JSD3PD_Tool
         for xx in JetTagD3PDKeys.FatJetsList():	   
-            if xx[0] != None and xx[1] != None:
+            if xx[0] is not None and xx[1] is not None:
                 jsD3PD = JSD3PD_Tool(xx)
                 jsD3PD.addToAlg(alg)
 
diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagClustersD3PDObject.py b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagClustersD3PDObject.py
index 20451112a83d..4900c4ea4224 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagClustersD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagClustersD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 ## @file JetTagD3PDMaker/python/JetTagClustersD3PDObject.py
@@ -6,8 +6,6 @@
 ## @author Georges Aad
 ## @date Nov, 2010
 ##
-import D3PDMakerCoreComps
-from D3PDMakerConfig.D3PDMakerFlags  import D3PDMakerFlags
 
 def getJetTagClusterD3PDObject(level=0, **kw):
 
diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagElectronInJetD3PDObject.py b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagElectronInJetD3PDObject.py
index 9804b1080ce2..418e3f49a758 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagElectronInJetD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagElectronInJetD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 ## @file JetTagD3PDMaker/python/JetTagElectronInJetD3PDObject.py
@@ -7,8 +7,6 @@
 ## @date Nov, 2010
 ##
 
-import JetTagD3PDMaker
-import TrackD3PDMaker
 import egammaD3PDMaker
 import EventCommonD3PDMaker
 ##from egammaD3PDMaker.isem_version import isem_version ## use 16
@@ -19,8 +17,6 @@ from ROOT import egammaPID
 import D3PDMakerCoreComps
 from D3PDMakerCoreComps.D3PDObject import D3PDObject
 from D3PDMakerCoreComps.IndexAssociation import IndexAssociation
-from D3PDMakerConfig.D3PDMakerFlags  import D3PDMakerFlags
-
 
 from JetTagD3PDMaker.JetTagD3PDMakerKeys import JetTagD3PDKeys
 from JetTagD3PDMaker.JetTagD3PDMakerFlags import JetTagD3PDFlags
diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagEventInfoD3PDObject.py b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagEventInfoD3PDObject.py
index f4c1e662250a..7a836ed94007 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagEventInfoD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagEventInfoD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 ## @file JetTagD3PDMaker/python/JetTagEventInfoD3PDObject.py
@@ -7,8 +7,6 @@
 ## @date Nov, 2010
 ##
 
-import D3PDMakerCoreComps
-from D3PDMakerConfig.D3PDMakerFlags  import D3PDMakerFlags
 from EventCommonD3PDMaker.EventInfoD3PDObject import EventInfoD3PDObject
 
 def getJetTagEventInfoD3PDObject(level=1, **kw):
diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagJSD3PDObjects.py b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagJSD3PDObjects.py
index a745f144f130..411976b9bae8 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagJSD3PDObjects.py
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagJSD3PDObjects.py
@@ -1,15 +1,11 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 from JetD3PDMaker.JetD3PDObject             import getJetD3PDObject
-from D3PDMakerConfig.D3PDMakerFlags         import D3PDMakerFlags
-from RecExConfig.RecFlags                   import rec
 from D3PDMakerCoreComps.IndexMultiAssociation import IndexMultiAssociation
 from D3PDMakerCoreComps.IndexAssociation import IndexAssociation
 from D3PDMakerCoreComps.ContainedVectorMultiAssociation import ContainedVectorMultiAssociation
 import JetSubstructureD3PDMaker
 from D3PDMakerCoreComps.D3PDObject          import make_SG_D3PDObject
-import EventCommonD3PDMaker
-#from JetTagD3PDMaker.AddBTagD3PDInfo import addBTagInfoToJetObject
 from JetTagD3PDMaker.JetTagD3PDMakerKeys import JetTagD3PDKeys
 from JetTagD3PDMaker.JetTagD3PDMakerFlags import JetTagD3PDFlags
 import JetTagD3PDMaker
@@ -37,14 +33,14 @@ def AddHadronicInfo(obj, additionalMoments = [], theblockname = 'SubjetMomentsHa
 
 def AddAssocJetsIndex(obj, jetassocname, jettarget, intermediate_names = [], level=0):
    
-   JetAssocTrack = IndexMultiAssociation(obj, 
-                                         JetSubstructureD3PDMaker.JetSubstructureTagJetINavigable4MomentumAssociationTool,
-                                         jettarget,level = level,
-                                         prefix=jetassocname+'_',
-                                         blockname=jetassocname+'blockindex', 
-                                         AssociationName = jetassocname , 
-                                         IntermediateAssociationNames=intermediate_names, 
-                                         OutputLevel=3 )
+   _ = IndexMultiAssociation(obj,
+                             JetSubstructureD3PDMaker.JetSubstructureTagJetINavigable4MomentumAssociationTool,
+                             jettarget,level = level,
+                             prefix=jetassocname+'_',
+                             blockname=jetassocname+'blockindex',
+                             AssociationName = jetassocname ,
+                             IntermediateAssociationNames=intermediate_names,
+                             OutputLevel=3 )
 
 def AddConstitIndex(object, typename='CaloCluster', target='cl_', myprefix='', level=0):
  
@@ -64,7 +60,6 @@ def AddConstitIndex(object, typename='CaloCluster', target='cl_', myprefix='', l
 def AddConstitTruthIndex(object, typename='TruthParticle', level=0):
 
     import EventCommonD3PDMaker
-    import D3PDMakerCoreComps
     import TruthD3PDMaker
     ConstitAssoc = ContainedVectorMultiAssociation \
             (object,
@@ -74,10 +69,10 @@ def AddConstitTruthIndex(object, typename='TruthParticle', level=0):
              TypeName = typename, WriteWeight = False,
              level = level)
            
-    genpart = IndexAssociation (ConstitAssoc,
-                                TruthD3PDMaker.TruthParticleGenParticleAssociationTool,
-                                TruthD3PDFlags.GenParticleAssocLabel(),
-                                prefix='mcpart_')
+    _ = IndexAssociation (ConstitAssoc,
+                          TruthD3PDMaker.TruthParticleGenParticleAssociationTool,
+                          TruthD3PDFlags.GenParticleAssocLabel(),
+                          prefix='mcpart_')
 
 
 
diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagJetD3PDObject.py b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagJetD3PDObject.py
index 8404905fa9df..4bc767efa3a2 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagJetD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagJetD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 ## @file JetTagD3PDMaker/python/JetTagJetD3PDObject.py
@@ -10,8 +10,6 @@
 import JetTagD3PDMaker
 
 import D3PDMakerCoreComps
-from D3PDMakerCoreComps.D3PDObject import D3PDObject
-from D3PDMakerCoreComps.D3PDObject import make_SGDataVector_D3PDObject
 from AthenaCommon.AlgSequence             import AlgSequence
 from RecExConfig.ObjKeyStore                  import cfgKeyStore
 from D3PDMakerConfig.D3PDMakerFlags  import D3PDMakerFlags
@@ -53,11 +51,11 @@ def _jetFilterAlgHook (c, prefix, sgkey,
     del filterargs['name']
 
     ### if some argument do not exist set them to the flag values
-    if not 'PtMinCut' in filterargs:
+    if 'PtMinCut' not in filterargs:
         filterargs['PtMinCut']=JetTagD3PDFlags.JetFilterPtMinCut()
-    if not 'EtaCut' in filterargs:
+    if 'EtaCut' not in filterargs:
         filterargs['EtaCut']=JetTagD3PDFlags.JetFilterEtaCut()
-    if not 'UseEMScale' in filterargs:
+    if 'UseEMScale' not in filterargs:
         filterargs['UseEMScale']=JetTagD3PDFlags.JetFilterUseEMScale()
     
     preseq += JetTagD3PDMaker.JetTagJetFilterAlg(algname,
@@ -139,7 +137,7 @@ def getJetTagJetD3PDObject(filteredsgkey, origsgkey, level=4, prefix=None,
                            **kw):
               
              
-    if prefix == None:
+    if prefix is None:
         import re
         prefix = re.sub('Jets','',origsgkey)
         prefix = re.sub('AOD','',prefix)
diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagMETD3PDObject.py b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagMETD3PDObject.py
index 82f6ab61e5ea..3a7cec901a76 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagMETD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagMETD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 ## @file JetTagD3PDMaker/python/JetTagMETD3PDObject.py
@@ -6,8 +6,6 @@
 ## @author Georges Aad
 ## @date Nov, 2010
 ##
-import D3PDMakerCoreComps
-from D3PDMakerConfig.D3PDMakerFlags  import D3PDMakerFlags
 import re
 
 from MissingETD3PDMaker.MissingETD3PDObject import RefFinalMETD3PDObject
diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagMSVVtxInJetD3PDObject.py b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagMSVVtxInJetD3PDObject.py
index 705cec126a75..b9e6bf7406d6 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagMSVVtxInJetD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagMSVVtxInJetD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 ## @file JetTagD3PDMaker/python/JetTagMSVVtxInJetD3PDObject.py
@@ -13,7 +13,6 @@ import JetTagD3PDMaker
 import D3PDMakerCoreComps
 from D3PDMakerCoreComps.D3PDObject import D3PDObject
 from D3PDMakerCoreComps.IndexMultiAssociation import IndexMultiAssociation
-from D3PDMakerConfig.D3PDMakerFlags  import D3PDMakerFlags
 
 from JetTagD3PDMaker.JetTagD3PDMakerKeys import JetTagD3PDKeys
 from JetTagD3PDMaker.JetTagD3PDMakerFlags import JetTagD3PDFlags
diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagMuonInJetD3PDObject.py b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagMuonInJetD3PDObject.py
index 4ff1ed59f93a..526f53857a9e 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagMuonInJetD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagMuonInJetD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 ## @file JetTagD3PDMaker/python/JetTagMuonInJetD3PDObject.py
@@ -18,7 +18,6 @@ import D3PDMakerCoreComps
 from D3PDMakerCoreComps.D3PDObject import D3PDObject
 from D3PDMakerCoreComps.SimpleAssociation import SimpleAssociation
 from D3PDMakerCoreComps.IndexAssociation import IndexAssociation
-from D3PDMakerConfig.D3PDMakerFlags  import D3PDMakerFlags
 
 from JetTagD3PDMaker.JetTagD3PDMakerKeys import JetTagD3PDKeys
 from JetTagD3PDMaker.JetTagD3PDMakerFlags import JetTagD3PDFlags
diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagPhotonInJetD3PDObject.py b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagPhotonInJetD3PDObject.py
index 579358a1f5c4..7c78b5b69116 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagPhotonInJetD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagPhotonInJetD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 ## @file JetTagD3PDMaker/python/JetTagPhotonInJetD3PDObject.py
@@ -7,14 +7,11 @@
 ## @date Nov, 2010
 ##
 
-import JetTagD3PDMaker
-import TrackD3PDMaker
 import egammaD3PDMaker
 import EventCommonD3PDMaker
 
 import D3PDMakerCoreComps
 from D3PDMakerCoreComps.D3PDObject import D3PDObject
-from D3PDMakerConfig.D3PDMakerFlags  import D3PDMakerFlags
 
 from JetTagD3PDMaker.JetTagD3PDMakerKeys import JetTagD3PDKeys
 
diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagPixModCondD3PDObject.py b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagPixModCondD3PDObject.py
index 5e68ae3897e4..874c72c9bad5 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagPixModCondD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagPixModCondD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 ## @file JetTagD3PDMaker/python/JetTagPixModCondD3PDObject.py
@@ -11,15 +11,11 @@ import JetTagD3PDMaker
 import D3PDMakerCoreComps
 from D3PDMakerCoreComps.D3PDObject import D3PDObject
 
-from JetTagD3PDMaker.JetTagD3PDMakerKeys import JetTagD3PDKeys
-from JetTagD3PDMaker.JetTagD3PDMakerFlags import JetTagD3PDFlags
-
-
 def _jetTagPixModCondAssocLevel (reqlev, args):
 
     if not args.has_key ('PixelSummarySvc') : 
         return False
-    if args['PixelSummarySvc'] == None:
+    if args['PixelSummarySvc'] is None:
         return False
 
     return True
diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagPrimaryVertexD3PDObject.py b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagPrimaryVertexD3PDObject.py
index abee42be5c0c..2a98e4b2511a 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagPrimaryVertexD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagPrimaryVertexD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 ## @file JetTagD3PDMaker/python/JetTagPrimaryVertexD3PDObject.py
@@ -6,8 +6,6 @@
 ## @author Georges Aad
 ## @date Nov, 2010
 ##
-import D3PDMakerCoreComps
-from D3PDMakerConfig.D3PDMakerFlags  import D3PDMakerFlags
 from TrackD3PDMaker.xAODVertexD3PDObject import BuildxAODVertexD3PDObject
 from TrackD3PDMaker.TrackD3PDMakerFlags import TrackD3PDFlags
 
diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagTrackD3PDObject.py b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagTrackD3PDObject.py
index 7768e2414a55..490c5dd1dfa7 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagTrackD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagTrackD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 ## @file JetTagD3PDMaker/python/JetTagTrackD3PDObject.py
@@ -6,8 +6,6 @@
 ## @author Georges Aad
 ## @date Nov, 2010
 ##
-import D3PDMakerCoreComps
-from D3PDMakerConfig.D3PDMakerFlags  import D3PDMakerFlags
 from TrackD3PDMaker.TrackD3PDMakerFlags import TrackD3PDFlags
 from TrackD3PDMaker.xAODTrackD3PDObject import xAODTrackD3PDObject
 from RecExConfig.RecFlags import rec
@@ -15,7 +13,6 @@ from RecExConfig.RecFlags import rec
 from JetTagD3PDMaker.JetTagD3PDMakerKeys import JetTagD3PDKeys
 from JetTagD3PDMaker.JetTagD3PDMakerFlags import JetTagD3PDFlags
 from TruthD3PDMaker.TruthD3PDMakerFlags import TruthD3PDFlags
-from TruthD3PDMaker.TruthD3PDMakerKeys import TruthD3PDKeys
 
 ## configure TrackD3PDFlags before calling this function
 ##eg:
@@ -45,7 +42,7 @@ def getJetTagTrackD3PDObject(level=20, **kw):
     if not rec.doTruth:
         TrackD3PDFlags.doTruth = False
 
-    if TruthD3PDFlags.GenParticleAssocLabel() == None or TruthD3PDFlags.GenParticleAssocLabel() == "":
+    if TruthD3PDFlags.GenParticleAssocLabel() is None or TruthD3PDFlags.GenParticleAssocLabel() == "":
         TrackD3PDFlags.doTruth = False
         
  
diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagTriggerBitsD3PDObject.py b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagTriggerBitsD3PDObject.py
index d86015bb79bd..2d86428587c0 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagTriggerBitsD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagTriggerBitsD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 ## @file JetTagD3PDMaker/python/JetTagTriggerBitsD3PDObject.py
@@ -44,6 +44,6 @@ defineTriggerBits(JetTagTriggerBitsD3PDObject, 0, ["L1_MU4.*","L2_mu4T.*","EF_mu
 
 def getJetTagTriggerBitsD3PDObject(triggerList):
 
-    defineTriggerBits(JetTagTriggerBitsD3PDObject,0,triggerList);
+    defineTriggerBits(JetTagTriggerBitsD3PDObject,0,triggerList)
 
     return JetTagTriggerBitsD3PDObject(0)
diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagTwoTrackVertexD3PDObject.py b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagTwoTrackVertexD3PDObject.py
index bd064a3d3f5b..f9276c248844 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagTwoTrackVertexD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagTwoTrackVertexD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 ## @file JetTagD3PDMaker/python/JetTagTwoTrackVertexD3PDObject.py
@@ -8,12 +8,9 @@
 ##
 
 import JetTagD3PDMaker
-import EventCommonD3PDMaker
-import TrackD3PDMaker
 
 import D3PDMakerCoreComps
 from D3PDMakerCoreComps.D3PDObject import D3PDObject
-from D3PDMakerCoreComps.D3PDObject import make_SGDataVector_D3PDObject
 from D3PDMakerCoreComps.IndexMultiAssociation import IndexMultiAssociation
 from AthenaCommon.AlgSequence             import AlgSequence
 from RecExConfig.ObjKeyStore                  import cfgKeyStore
diff --git a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagVxOnJetAxisD3PDObject.py b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagVxOnJetAxisD3PDObject.py
index f29754886ceb..62a669632636 100644
--- a/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagVxOnJetAxisD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/JetTagD3PDMaker/python/JetTagVxOnJetAxisD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 #
 ## @file JetTagD3PDMaker/python/JetTagVxOnJetAxisD3PDObject.py
@@ -9,12 +9,9 @@
 
 
 import JetTagD3PDMaker
-import EventCommonD3PDMaker
-import TrackD3PDMaker
 
 import D3PDMakerCoreComps
 from D3PDMakerCoreComps.D3PDObject import D3PDObject
-from D3PDMakerCoreComps.D3PDObject import make_SGDataVector_D3PDObject
 from D3PDMakerCoreComps.IndexMultiAssociation import IndexMultiAssociation
 from AthenaCommon.AlgSequence             import AlgSequence
 from RecExConfig.ObjKeyStore              import cfgKeyStore
-- 
GitLab


From 4fb4ad835d7eaf21fba5b934d947c4e7ac8e2488 Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Wed, 16 Dec 2020 14:59:54 +0100
Subject: [PATCH 079/225] MuonD3PDMaker: cmake cleanup, enable flake8, cleanup

Cleanup cmake configuration and delete unused modules. Enable flake8 and
make code compliant.
---
 .../D3PDMaker/MuonD3PDMaker/CMakeLists.txt    | 11 +++----
 .../python/CscPrepDataD3PDObject.py           | 29 -----------------
 .../python/MDTSimHitD3PDObject.py             |  7 +----
 .../python/MdtPrepDataD3PDObject.py           | 29 -----------------
 .../MuonD3PDMaker/python/MuonD3PDObject.py    | 10 ------
 .../python/MuonSegmentD3PDObject.py           |  8 +----
 .../python/MuonSegmentTruthD3PDObject.py      | 19 ------------
 .../python/MuonSpShowerD3PDObject.py          |  2 --
 .../python/RpcPrepDataD3PDObject.py           | 29 -----------------
 .../python/TgcPrepDataD3PDObject.py           | 31 -------------------
 .../python/TrackRecordD3PDObject.py           |  8 +----
 .../python/TruthMuonD3PDObject.py             |  3 +-
 .../MuonD3PDMaker/python/muonD3PD.py          |  3 +-
 13 files changed, 9 insertions(+), 180 deletions(-)
 delete mode 100644 PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/CscPrepDataD3PDObject.py
 delete mode 100644 PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MdtPrepDataD3PDObject.py
 delete mode 100644 PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MuonSegmentTruthD3PDObject.py
 delete mode 100644 PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/RpcPrepDataD3PDObject.py
 delete mode 100644 PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/TgcPrepDataD3PDObject.py

diff --git a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/CMakeLists.txt b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/CMakeLists.txt
index 8be369473eb4..412ff095b2ab 100644
--- a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/CMakeLists.txt
+++ b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/CMakeLists.txt
@@ -1,22 +1,19 @@
-################################################################################
-# Package: MuonD3PDMaker
-################################################################################
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # Declare the package name:
 atlas_subdir( MuonD3PDMaker )
 
 # External dependencies:
-find_package( Boost COMPONENTS filesystem thread system )
 find_package( CLHEP )
 
 # Component(s) in the package:
 atlas_add_component( MuonD3PDMaker
                      src/*.cxx
                      src/components/*.cxx
-                     INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} 
-                     LINK_LIBRARIES ${Boost_LIBRARIES} ${CLHEP_LIBRARIES} AtlasHepMCLib AthenaBaseComps AthenaKernel AthContainers StoreGateLib SGtests AtlasDetDescr EventInfo EventKernel FourMomUtils xAODMuon xAODTracking xAODTruth GaudiKernel MuonCalibITools MuonIdHelpersLib MuonPattern MuonPrepRawData MuonSegment MuonRecHelperToolsLib MuonRecToolInterfaces MuonSimEvent AnalysisTriggerEvent D3PDMakerUtils TriggerD3PDMakerLib MCTruthClassifierLib McParticleEvent muonEvent TrkGeometry TrkEventPrimitives TrkPrepRawData TrkSegment TrkTrackSummary TrkTruthData TrkExInterfaces TrkToolInterfaces TrigObjectMatchingLib TrigInDetEvent TrigMuonEvent TrackRecordLib MuonTruthAlgsLib )
+                     INCLUDE_DIRS ${CLHEP_INCLUDE_DIRS}
+                     LINK_LIBRARIES ${CLHEP_LIBRARIES} AtlasHepMCLib AthenaBaseComps AthenaKernel AthContainers StoreGateLib AtlasDetDescr EventKernel FourMomUtils xAODMuon xAODTracking xAODTruth GaudiKernel MuonCalibITools MuonIdHelpersLib MuonPattern MuonPrepRawData MuonSegment MuonRecHelperToolsLib MuonRecToolInterfaces MuonSimEvent AnalysisTriggerEvent D3PDMakerUtils MCTruthClassifierLib McParticleEvent muonEvent TrkGeometry TrkEventPrimitives TrkPrepRawData TrkSegment TrkTrackSummary TrkTruthData TrkExInterfaces TrkToolInterfaces TrigMuonEvent TrackRecordLib MuonTruthAlgsLib )
 
 # Install files from the package:
-atlas_install_python_modules( python/*.py )
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
 atlas_install_joboptions( share/*.py )
 
diff --git a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/CscPrepDataD3PDObject.py b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/CscPrepDataD3PDObject.py
deleted file mode 100644
index 087859689e80..000000000000
--- a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/CscPrepDataD3PDObject.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-import MuonD3PDMaker
-import D3PDMakerCoreComps
-from D3PDMakerCoreComps.D3PDObject import D3PDObject
-from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
-
-
-def makeD3PDObject (name, prefix, object_name, getter = None,
-                    sgkey = 'CSC_Clusters',
-                    typename = 'Muon::CscPrepDataContainer',
-                    label = 'CscPrepData'):
-    if not getter:
-        from MuonD3PDMaker.MuonD3PDMakerConf import D3PD__CscPrepDataCollectionGetterTool
-        getter = D3PD__CscPrepDataCollectionGetterTool \
-                 (name + '_Getter',
-                  SGKey = sgkey,
-                  TypeName = typename,
-                  Label = label)
-    getter.OutputLevel=1    
-    return D3PDMakerCoreComps.VectorFillerTool (name,
-                                                Prefix = prefix,
-                                                Getter = getter,
-                                                ObjectName = object_name, OutputLevel=1)
-
-
-CscPrepDataD3PDObject =  D3PDObject (makeD3PDObject, 'csc_', 'CscPrepDataD3PDObject')
-
-CscPrepDataD3PDObject.defineBlock (0, 'PrepData', MuonD3PDMaker.CscPrepDataFillerTool)
diff --git a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MDTSimHitD3PDObject.py b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MDTSimHitD3PDObject.py
index b33c3dbbccd6..27479a70d738 100644
--- a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MDTSimHitD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MDTSimHitD3PDObject.py
@@ -1,13 +1,8 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-# $Id: MDTSimHitD3PDObject.py 508173 2012-06-29 11:47:55Z ssnyder $
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # Import all needed modules:
 import MuonD3PDMaker
-import D3PDMakerCoreComps
 from D3PDMakerCoreComps.D3PDObject  import make_SGDataVector_D3PDObject
-from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
-from D3PDMakerCoreComps.D3PDObject  import D3PDObject
 
 # Create the configurable:
 MDTSimHitD3PDObject = \
diff --git a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MdtPrepDataD3PDObject.py b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MdtPrepDataD3PDObject.py
deleted file mode 100644
index 4ddc187f4f44..000000000000
--- a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MdtPrepDataD3PDObject.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-import MuonD3PDMaker
-import D3PDMakerCoreComps
-from D3PDMakerCoreComps.D3PDObject import D3PDObject
-from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
-
-
-def makeD3PDObject (name, prefix, object_name, getter = None,
-                    sgkey = 'MDT_DriftCircles',
-                    typename = 'Muon::MdtPrepDataContainer',
-                    label = 'MdtPrepData'):
-    if not getter:
-        from MuonD3PDMaker.MuonD3PDMakerConf import D3PD__MdtPrepDataCollectionGetterTool
-        getter = D3PD__MdtPrepDataCollectionGetterTool \
-                 (name + '_Getter',
-                  SGKey = sgkey,
-                  TypeName = typename,
-                  Label = label)
-    getter.OutputLevel=1    
-    return D3PDMakerCoreComps.VectorFillerTool (name,
-                                                Prefix = prefix,
-                                                Getter = getter,
-                                                ObjectName = object_name, OutputLevel=1)
-
-
-MdtPrepDataD3PDObject =  D3PDObject (makeD3PDObject, 'mdt_', 'MdtPrepDataD3PDObject')
-
-MdtPrepDataD3PDObject.defineBlock (0, 'PrepData', MuonD3PDMaker.MdtPrepDataFillerTool)
diff --git a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MuonD3PDObject.py b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MuonD3PDObject.py
index 5dd4489e20c1..d8eb5967a39d 100644
--- a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MuonD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MuonD3PDObject.py
@@ -4,23 +4,13 @@
 import MuonD3PDMaker
 import D3PDMakerCoreComps
 import EventCommonD3PDMaker
-import TriggerD3PDMaker
 import TrackD3PDMaker
-from TriggerD3PDMaker.defineTriggerBits   import defineTriggerBits
 from D3PDMakerCoreComps.D3PDObject        import make_SGDataVector_D3PDObject
-from D3PDMakerCoreComps.D3PDObject         import DeferArg
 from D3PDMakerCoreComps.SimpleAssociation import SimpleAssociation
-from D3PDMakerCoreComps.IndexAssociation  import IndexAssociation
 from D3PDMakerConfig.D3PDMakerFlags       import D3PDMakerFlags
-from D3PDMakerCoreComps.ContainedVectorMultiAssociation import ContainedVectorMultiAssociation
 import TruthD3PDMaker
 
 from RecExConfig.RecFlags import rec
-from RecExConfig.ObjKeyStore import cfgKeyStore
-
-from AthenaCommon.AppMgr import ToolSvc
-from AthenaCommon.Include import include
-
 from MuonD3PDMaker.MuonD3PDMakerFlags    import MuonD3PDFlags
 
 
diff --git a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MuonSegmentD3PDObject.py b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MuonSegmentD3PDObject.py
index 54557190d10f..8e45f15497fa 100644
--- a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MuonSegmentD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MuonSegmentD3PDObject.py
@@ -1,18 +1,12 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 import MuonD3PDMaker
-import D3PDMakerCoreComps
-import EventCommonD3PDMaker
 from D3PDMakerCoreComps.D3PDObject import make_SGDataVector_D3PDObject
 from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
 
 from MuonD3PDMaker.MuonD3PDMakerFlags    import MuonD3PDFlags
 from RecExConfig.RecFlags import rec
 
-#from MuonD3PDMaker.MuonD3PDMakerConf import MuonWZTruthTool
-#TruthTool = MuonWZTruthTool()
-#ToolSvc += TruthTool
-
 MuonSegmentD3PDObject = \
            make_SGDataVector_D3PDObject ('Trk::SegmentCollection',
                                          D3PDMakerFlags.MuonSegmentSGKey(),
diff --git a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MuonSegmentTruthD3PDObject.py b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MuonSegmentTruthD3PDObject.py
deleted file mode 100644
index e8cfa5bc2b1e..000000000000
--- a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MuonSegmentTruthD3PDObject.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-import MuonD3PDMaker
-import D3PDMakerCoreComps
-import EventCommonD3PDMaker
-from D3PDMakerCoreComps.D3PDObject import make_SGDataVector_D3PDObject
-from D3PDMakerCoreComps.SimpleAssociation import SimpleAssociation
-from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
-
-from RecExConfig.RecFlags import rec
-
-MuonSegmentTruthD3PDObject = \
-                   make_SGDataVector_D3PDObject ('Trk::SegmentCollection',
-                                                 'MuonSegments',
-                                                 'mu_segmentTruth_', 'MuonSegmentTruthD3PDObject')
-
-MuonSegmentTruthD3PDObject.defineBlock (1, 'PatternTruthCombination',
-                                        MuonD3PDMaker.MuonSegmentTruthFillerTool)
-
diff --git a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MuonSpShowerD3PDObject.py b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MuonSpShowerD3PDObject.py
index bf3d1f64eb57..cdb5179c8cc5 100644
--- a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MuonSpShowerD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/MuonSpShowerD3PDObject.py
@@ -1,6 +1,5 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-# $Id$
 #
 # @file MuonD3PDMaker/python/MuonSpShowerD3PDObject.py
 # @author Michiru Kaneda <Michiru.Kaneda@cern.ch>
@@ -8,7 +7,6 @@
 # @brief MuonSpShower filler tool
 #
 
-import D3PDMakerCoreComps
 from D3PDMakerCoreComps.D3PDObject import make_SGDataVector_D3PDObject
 from MuonD3PDMaker.MuonD3PDMakerConf import D3PD__MuonSpShowerFillerTool as MuonSpShowerFillerTool
 
diff --git a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/RpcPrepDataD3PDObject.py b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/RpcPrepDataD3PDObject.py
deleted file mode 100644
index a8cb743c8763..000000000000
--- a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/RpcPrepDataD3PDObject.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-import MuonD3PDMaker
-import D3PDMakerCoreComps
-from D3PDMakerCoreComps.D3PDObject import D3PDObject
-from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
-
-
-def makeD3PDObject (name, prefix, object_name, getter = None,
-                    sgkey = 'RPC_Measurements',
-                    typename = 'Muon::RpcPrepDataContainer',
-                    label = 'RpcPrepData'):
-    if not getter:
-        from MuonD3PDMaker.MuonD3PDMakerConf import D3PD__RpcPrepDataCollectionGetterTool
-        getter = D3PD__RpcPrepDataCollectionGetterTool \
-                 (name + '_Getter',
-                  SGKey = sgkey,
-                  TypeName = typename,
-                  Label = label)
-    getter.OutputLevel=1    
-    return D3PDMakerCoreComps.VectorFillerTool (name,
-                                                Prefix = prefix,
-                                                Getter = getter,
-                                                ObjectName = object_name, OutputLevel=1)
-
-
-RpcPrepDataD3PDObject =  D3PDObject (makeD3PDObject, 'rpc_', 'RpcPrepDataD3PDObject')
-
-RpcPrepDataD3PDObject.defineBlock (0, 'PrepData', MuonD3PDMaker.RpcPrepDataFillerTool)
diff --git a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/TgcPrepDataD3PDObject.py b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/TgcPrepDataD3PDObject.py
deleted file mode 100644
index 74780db166d5..000000000000
--- a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/TgcPrepDataD3PDObject.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-import MuonD3PDMaker
-import D3PDMakerCoreComps
-from D3PDMakerCoreComps.D3PDObject import D3PDObject
-from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
-
-
-def makeD3PDObject (name, prefix, object_name, getter = None,
-                    sgkey = 'TGC_Measurements',
-                    #sgkey = 'TGC_MeasurementsPriorBC',
-                    #sgkey = 'TGC_MeasurementsNextBC',
-                    typename = 'Muon::TgcPrepDataContainer',
-                    label = 'TgcPrepData'):
-    if not getter:
-        from MuonD3PDMaker.MuonD3PDMakerConf import D3PD__TgcPrepDataCollectionGetterTool
-        getter = D3PD__TgcPrepDataCollectionGetterTool \
-                 (name + '_Getter',
-                  SGKey = sgkey,
-                  TypeName = typename,
-                  Label = label)
-    getter.OutputLevel=1    
-    return D3PDMakerCoreComps.VectorFillerTool (name,
-                                                Prefix = prefix,
-                                                Getter = getter,
-                                                ObjectName = object_name, OutputLevel=1)
-
-
-TgcPrepDataD3PDObject =  D3PDObject (makeD3PDObject, 'tgc_', 'TgcPrepDataD3PDObject')
-
-TgcPrepDataD3PDObject.defineBlock (0, 'PrepData', MuonD3PDMaker.TgcPrepDataFillerTool)
diff --git a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/TrackRecordD3PDObject.py b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/TrackRecordD3PDObject.py
index 9af4e3ea9084..af551535e625 100644
--- a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/TrackRecordD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/TrackRecordD3PDObject.py
@@ -1,13 +1,7 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-# $Id: TrackRecordD3PDObject.py
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # Import all needed modules:
 import MuonD3PDMaker
-import D3PDMakerCoreComps
-from D3PDMakerCoreComps.resolveSGKey import testSGKey
-from D3PDMakerConfig.D3PDMakerFlags  import D3PDMakerFlags
-from D3PDMakerCoreComps.D3PDObject   import D3PDObject
 from D3PDMakerCoreComps.D3PDObject   import make_SGDataVector_D3PDObject
 
 
diff --git a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/TruthMuonD3PDObject.py b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/TruthMuonD3PDObject.py
index 89bbea369762..28d646ea12c0 100644
--- a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/TruthMuonD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/TruthMuonD3PDObject.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # @file  MuonD3PDMaker/python/TruthMuonD3PDObject.py
 # $author  Srivas Prasad <srivas.prasad@cern.ch>
@@ -9,7 +9,6 @@
 import MuonD3PDMaker
 import EventCommonD3PDMaker
 from D3PDMakerCoreComps.D3PDObject         import make_SGDataVector_D3PDObject
-from D3PDMakerCoreComps.resolveSGKey       import testSGKey
 from D3PDMakerConfig.D3PDMakerFlags        import D3PDMakerFlags
 from AthenaCommon.AlgSequence              import AlgSequence
 from RecExConfig.ObjKeyStore               import cfgKeyStore
diff --git a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/muonD3PD.py b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/muonD3PD.py
index d3ddfb1b3f63..2d4e90c52671 100644
--- a/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/muonD3PD.py
+++ b/PhysicsAnalysis/D3PDMaker/MuonD3PDMaker/python/muonD3PD.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# $Id$
 #
 # @file MuonD3PDMaker/python/muonD3PD.py
 # @author srivas prasad <srivas.prasad@cern.ch>
-- 
GitLab


From 4237a180cbd964837d9695aed82ad2cd4c66e19e Mon Sep 17 00:00:00 2001
From: Edward Moyse <edward.moyse@cern.ch>
Date: Wed, 16 Dec 2020 15:01:41 +0100
Subject: [PATCH 080/225] Change loop to be a bit more conventional. I think
 this fixes a crash I saw, presumably because inputTSOS_ID->end()-1 was
 invalid because inputTSOS_ID was empty.

---
 .../src/TrkMaterialProviderTool.cxx           | 33 ++++---------------
 1 file changed, 7 insertions(+), 26 deletions(-)

diff --git a/Tracking/TrkTools/TrkMaterialProvider/src/TrkMaterialProviderTool.cxx b/Tracking/TrkTools/TrkMaterialProvider/src/TrkMaterialProviderTool.cxx
index 3607f5e1b0c5..a623f6875f2d 100644
--- a/Tracking/TrkTools/TrkMaterialProvider/src/TrkMaterialProviderTool.cxx
+++ b/Tracking/TrkTools/TrkMaterialProvider/src/TrkMaterialProviderTool.cxx
@@ -405,63 +405,44 @@ void Trk::TrkMaterialProviderTool::getCaloMEOT(const Trk::Track& idTrack, const
 #endif
   
   // find last ID TSOS
-  DataVector<const Trk::TrackStateOnSurface>::const_iterator lastIDwP  = inputTSOS_ID->end();
-  DataVector<const Trk::TrackStateOnSurface>::const_iterator it        = inputTSOS_ID->end()-1;
-  DataVector<const Trk::TrackStateOnSurface>::const_iterator itFront   = inputTSOS_ID->begin();
-  while(*it) {
+  DataVector<const Trk::TrackStateOnSurface>::const_reverse_iterator lastIDwP  = inputTSOS_ID->rbegin();
+  for (auto it = inputTSOS_ID->rbegin(); it != inputTSOS_ID->rend(); ++it) {
     if(this->getVolumeByGeo(*it)==1 && (*it)->trackParameters()) {
       lastIDwP = it;
       break;
     }
-    if(it==itFront) break;
-    --it;
   }
   
   // find first MS TSOS
   DataVector<const Trk::TrackStateOnSurface>::const_iterator firstMS   = inputTSOS_MS->end();
   DataVector<const Trk::TrackStateOnSurface>::const_iterator firstMSwP = inputTSOS_MS->end();
-  it = inputTSOS_MS->begin();
   DataVector<const Trk::TrackStateOnSurface>::const_iterator itEnd = inputTSOS_MS->end();
-  for(; it!=itEnd; ++it) {
+  for(auto it = inputTSOS_MS->begin(); it!=itEnd ; ++it) {
     if(this->getVolumeByGeo(*it)==3) {// && !(*it)->type(Trk::TrackStateOnSurface::Perigee)) {
       if(firstMS==itEnd) 
-	firstMS = it;
+	      firstMS = it;
       if((*it)->trackParameters() && (*it)->trackParameters()->covariance()) {
-	firstMSwP = it;
-	break;
+	      firstMSwP = it;
+      	break;
       }
     }
   }
 
-  if(lastIDwP == inputTSOS_ID->end()) {
+  if(lastIDwP == inputTSOS_ID->rbegin()) {
     ATH_MSG_WARNING("Unable to find last ID TSOS with Track Parameters");    
     ATH_MSG_WARNING("Unable to update Calorimeter TSOS");
-    /** deprecated outputLevel()
-    if(outputLevel() >= MSG::VERBOSE) {
-      for(auto m : *inputTSOS_ID)
-	      printTSOS(m, "DEBUG-ID-TSOS");
-    }    
-    **/
     return;
   }
   if(firstMS == inputTSOS_MS->end()) {
     ATH_MSG_WARNING("Unable to find first MS TSOS");    
     ATH_MSG_WARNING("Unable to update Calorimeter TSOS");
-    /** deprecated outputLevel()
-    if(outputLevel() >= MSG::VERBOSE) {
-      for(auto m : *inputTSOS_MS)
-	       printTSOS(m, "DEBUG-MS-TSOS");
-    }
-    **/
     return;
   }
 
   // check that first MS TSOS is not a PerigeeSurface
-  //bool removeOoC = false;
   DataVector<const Trk::TrackStateOnSurface>::const_iterator firstMSnotPerigee = firstMS;
   if( (*firstMS)->type(Trk::TrackStateOnSurface::Perigee) && (firstMS+1)!=inputTSOS_MS->end()) {
     firstMSnotPerigee=firstMS+1;
-    //removeOoC = true;
   }
 
 #ifdef DEBUGON
-- 
GitLab


From da3c3d259c04afb5c1927d761b4fa454d8a19ee1 Mon Sep 17 00:00:00 2001
From: yoyamagu <yohei.yamaguchi@cern.ch>
Date: Wed, 16 Dec 2020 23:58:43 +0900
Subject: [PATCH 081/225] delete obsolete function and object

---
 .../TrigL2MuonSA/src/MuFastSteering.cxx       | 140 ------------------
 .../TrigL2MuonSA/src/MuFastSteering.h         |   6 -
 2 files changed, 146 deletions(-)

diff --git a/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastSteering.cxx b/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastSteering.cxx
index b4feab6cdfc1..ebf02d6a7a8d 100644
--- a/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastSteering.cxx
+++ b/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastSteering.cxx
@@ -28,7 +28,6 @@
 MuFastSteering::MuFastSteering(const std::string& name, ISvcLocator* svc) 
   : HLT::FexAlgo(name, svc), 
     m_timerSvc("TrigTimerSvc", name),
-    m_regionSelector("RegSelSvc", name),
     m_recMuonRoIUtils(),
     m_rpcHits(), m_tgcHits(),
     m_mdtRegion(), m_muonRoad(),
@@ -62,13 +61,6 @@ HLT::ErrorCode MuFastSteering::hltInitialize()
     }
   }
 
-  // Locate RegionSelector
-  if (m_regionSelector.retrieve().isFailure()) {
-    ATH_MSG_ERROR("Could not retrieve the regionselector service");
-    return HLT::ERROR;
-  }
-  ATH_MSG_DEBUG("Retrieved the RegionSelector service ");
-
   // Locate DataPreparator
   if (m_dataPreparator.retrieve().isFailure()) {
     ATH_MSG_ERROR("Cannot retrieve Tool DataPreparator");
@@ -2277,135 +2269,3 @@ void MuFastSteering::handle(const Incident& incident) {
 }
 // --------------------------------------------------------------------------------
 // --------------------------------------------------------------------------------
-
-HLT::ErrorCode MuFastSteering::prepareRobRequests(const HLT::TriggerElement* inputTE){
-
-  ATH_MSG_DEBUG("prepareRobRequests called");
-  
-  HLT::RobRequestInfo* RRInfo = config()->robRequestInfo();
-
-  if (!RRInfo) {
-    ATH_MSG_ERROR("Null pointer to RobRequestInfo");
-    return HLT::ERROR;
-  }
-  
-  std::vector<uint32_t> MdtRobList;
-  std::vector<uint32_t> RpcRobList;
-  std::vector<uint32_t> TgcRobList;
-  std::vector<uint32_t> CscRobList;
-  
-  std::vector<const TrigRoiDescriptor*> roids;
-  HLT::ErrorCode hec = getFeatures(inputTE, roids);
-
-  if (hec != HLT::OK) {
-    ATH_MSG_ERROR("Could not find input TE");
-    return hec;
-  }
-  
-  // RoI base data access
-  for (unsigned int i=0; i < roids.size(); i++) {
-    
-    if ( m_use_RoIBasedDataAccess_MDT) {
-
-      float roi_eta = roids[i]->eta();
-      float roi_phi = roids[i]->phi();
-      if (roi_phi < 0) roi_phi += 2.0 * M_PI;
-   
-      double etaMin = roi_eta - 0.2;
-      double etaMax = roi_eta + 0.2;
-      double phiMin = roi_phi - 0.2;
-      double phiMax = roi_phi + 0.2;
-      if( phiMin < 0 ) phiMin += 2*M_PI;
-      if( phiMax < 0 ) phiMax += 2*M_PI;
-      if( phiMin > 2*M_PI ) phiMin -= 2*M_PI;
-      if( phiMax > 2*M_PI ) phiMax -= 2*M_PI;
-
-      TrigRoiDescriptor* roi = new TrigRoiDescriptor( roi_eta, etaMin, etaMax, roi_phi, phiMin, phiMax );
-      const IRoiDescriptor* iroi = (IRoiDescriptor*) roi;
-
-      MdtRobList.clear();
-      if ( iroi ) m_regionSelector->DetROBIDListUint(MDT, *iroi, MdtRobList);
-      RRInfo->addRequestScheduledRobIDs(MdtRobList);
-      ATH_MSG_DEBUG("prepareRobRequests, find " << MdtRobList.size() << " Mdt Rob's,");
-
-      if(roi) delete roi;
-    }
-
-    if ( m_use_RoIBasedDataAccess_RPC) {
-
-      const IRoiDescriptor* iroi = (IRoiDescriptor*) roids[i];
-
-      RpcRobList.clear();
-      if ( iroi ) m_regionSelector->DetROBIDListUint(RPC, *iroi, RpcRobList);
-      RRInfo->addRequestScheduledRobIDs(RpcRobList);
-      ATH_MSG_DEBUG("prepareRobRequests, find " << RpcRobList.size() << " Rpc Rob's,");
-    }
-
-    if ( m_use_RoIBasedDataAccess_TGC) {
-
-      float roi_eta = roids[i]->eta();
-      float roi_phi = roids[i]->phi();
-      if (roi_phi < 0) roi_phi += 2.0 * M_PI;
-   
-      double etaMin = roi_eta - 0.2;
-      double etaMax = roi_eta + 0.2;
-      double phiMin = roi_phi - 0.1;
-      double phiMax = roi_phi + 0.1;
-      if( phiMin < 0 ) phiMin += 2*M_PI;
-      if( phiMax < 0 ) phiMax += 2*M_PI;
-      if( phiMin > 2*M_PI ) phiMin -= 2*M_PI;
-      if( phiMax > 2*M_PI ) phiMax -= 2*M_PI;
-
-      TrigRoiDescriptor* roi = new TrigRoiDescriptor( roi_eta, etaMin, etaMax, roi_phi, phiMin, phiMax );
-      const IRoiDescriptor* iroi = (IRoiDescriptor*) roi;
-
-      TgcRobList.clear();
-      if ( iroi ) m_regionSelector->DetROBIDListUint(TGC, *iroi, TgcRobList);
-      RRInfo->addRequestScheduledRobIDs(TgcRobList);
-      ATH_MSG_DEBUG("prepareRobRequests, find " << TgcRobList.size() << " Tgc Rob's,");
-
-      if(roi) delete roi;
-    }
-
-    if ( m_use_RoIBasedDataAccess_CSC) {
-
-      const IRoiDescriptor* iroi = (IRoiDescriptor*) roids[i];
-
-      CscRobList.clear();
-      if ( iroi ) m_regionSelector->DetROBIDListUint(CSC, *iroi, CscRobList);
-      RRInfo->addRequestScheduledRobIDs(CscRobList);
-      ATH_MSG_DEBUG("prepareRobRequests, find " << CscRobList.size() << " Csc Rob's,");
-    }
-  }
-  
-  // Full data access
-  if ( !m_use_RoIBasedDataAccess_MDT ) {
-    MdtRobList.clear();
-    m_regionSelector->DetROBIDListUint(MDT, MdtRobList);
-    RRInfo->addRequestScheduledRobIDs(MdtRobList);
-    ATH_MSG_DEBUG("prepareRobRequests, find " << MdtRobList.size() << " Mdt Rob's,");
-  }
-
-  if ( !m_use_RoIBasedDataAccess_RPC ) {
-    RpcRobList.clear();
-    m_regionSelector->DetROBIDListUint(RPC, RpcRobList);
-    RRInfo->addRequestScheduledRobIDs(RpcRobList);
-    ATH_MSG_DEBUG("prepareRobRequests, find " << RpcRobList.size() << " Rpc Rob's,");
-  }
-
-  if ( !m_use_RoIBasedDataAccess_TGC ) {
-    TgcRobList.clear();
-    m_regionSelector->DetROBIDListUint(TGC, TgcRobList);
-    RRInfo->addRequestScheduledRobIDs(TgcRobList);
-    ATH_MSG_DEBUG("prepareRobRequests, find " << TgcRobList.size() << " Tgc Rob's,");
-  }
-
-  if ( !m_use_RoIBasedDataAccess_CSC ) {
-    CscRobList.clear();
-    m_regionSelector->DetROBIDListUint(CSC, CscRobList);
-    RRInfo->addRequestScheduledRobIDs(CscRobList);
-    ATH_MSG_DEBUG("prepareRobRequests, find " << CscRobList.size() << " Csc Rob's,");
-  }
-  
-  return HLT::OK;
-}
diff --git a/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastSteering.h b/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastSteering.h
index 9d1dcbf63272..dd91c6803769 100644
--- a/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastSteering.h
+++ b/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastSteering.h
@@ -38,7 +38,6 @@
 #include "xAODTracking/TrackParticleContainer.h"
 #include "AthenaMonitoringKernel/GenericMonitoringTool.h"
 
-class IRegSelSvc;
 class Incident;
 class MsgStream;
 
@@ -97,9 +96,6 @@ class MuFastSteering : public HLT::FexAlgo,
 
   // handler for "UpdateAfterFork" actions
   void handle(const Incident& incident);
-  
-  using HLT::FexAlgo::prepareRobRequests;
-  virtual HLT::ErrorCode prepareRobRequests(const HLT::TriggerElement* inputTE );
 
  protected:
   
@@ -164,8 +160,6 @@ class MuFastSteering : public HLT::FexAlgo,
   ServiceHandle<ITrigTimerSvc> m_timerSvc;
   std::vector<TrigTimer*> m_timingTimers;
 
-  ServiceHandle<IRegSelSvc> m_regionSelector;
-  
   // Tools
   ToolHandle<TrigL2MuonSA::MuFastDataPreparator>     m_dataPreparator {
 	this, "DataPreparator", "TrigL2MuonSA::MuFastDataPreparator", "data preparator" };
-- 
GitLab


From 1fe04858c2b3683f30d960916350b181a5f2aed0 Mon Sep 17 00:00:00 2001
From: Christos Anastopoulos <christos.anastopoulos@cern.ch>
Date: Wed, 16 Dec 2020 15:21:27 +0000
Subject: [PATCH 082/225] Make perigeeAtBeamline EventContext aware

---
 .../ITrackToVertex/ITrackToVertex.h           | 127 ++++++++++-----
 .../TrackToVertex/TrackToVertex.h             | 151 ++++++++++++------
 .../TrackToVertex/src/TrackToVertex.cxx       |  12 +-
 .../src/TrackParticleCreatorTool.cxx          |   4 +-
 4 files changed, 190 insertions(+), 104 deletions(-)

diff --git a/Reconstruction/RecoTools/ITrackToVertex/ITrackToVertex/ITrackToVertex.h b/Reconstruction/RecoTools/ITrackToVertex/ITrackToVertex/ITrackToVertex.h
index 15c890bc05ac..6fd4f65f9655 100755
--- a/Reconstruction/RecoTools/ITrackToVertex/ITrackToVertex/ITrackToVertex.h
+++ b/Reconstruction/RecoTools/ITrackToVertex/ITrackToVertex/ITrackToVertex.h
@@ -53,51 +53,90 @@ namespace Reco {
        /** AlgTool interface methods */
        static const InterfaceID& interfaceID() { return IID_ITrackToVertex; };
 
-      /** Use this for MT Coding */
-       virtual std::unique_ptr<Trk::StraightLineSurface> GetBeamLine(const InDet::BeamSpotData*) const = 0; //In C++17 make this [[nodiscard]]
-
-       virtual const InDet::BeamSpotData* GetBeamSpotData(const EventContext &ctx) const = 0; //In C++17 make this [[nodiscard]]
-      
-       /** Interface method for use with TrackParticle and given vertex position - AOD */
-       virtual const Trk::Perigee* perigeeAtVertex(const Rec::TrackParticle& tp, const Amg::Vector3D& gp) const = 0;
-
-       /** Interface method for use with xAOD::Trackparticle and given vertex position - xAOD */
-       virtual const Trk::Perigee* perigeeAtVertex(const xAOD::TrackParticle& tp, const Amg::Vector3D& gp) const = 0;
-       
-       /** Interface method for use with TrackParticle and default primary vertex from TrackParticle  - AOD */
-       virtual const Trk::Perigee* perigeeAtVertex(const Rec::TrackParticle& tp) const = 0;
-       
-       /** Interface method for use with TrackParticle and default primary vertex from TrackParticle  - xAOD */
-       virtual const Trk::Perigee* perigeeAtVertex(const xAOD::TrackParticle& tp) const = 0;
-       
-       /** Interface method for use with Track and given vertex position - ESD */
-       virtual const Trk::Perigee* perigeeAtVertex(const Trk::Track& trk, const Amg::Vector3D& gp) const = 0;
-
-       /** Interface method for use with TrackParticle and the beamspot from the BeamSpotSvc - AOD*/
-       virtual const Trk::Perigee* perigeeAtBeamspot(const Rec::TrackParticle& tp, const InDet::BeamSpotData*) const = 0;
-                                                          
-       /** Interface method for use with TrackParticle and the beamspot from the BeamSpotSvc - xAOD*/
-       virtual const Trk::Perigee* perigeeAtBeamspot(const xAOD::TrackParticle& tp, const InDet::BeamSpotData*) const = 0;
-          
-       /** Interface method for use with Track and the beamspot from the BeamSpotSvc - ESD */
-       virtual const Trk::Perigee* perigeeAtBeamspot(const Trk::Track& trk, const InDet::BeamSpotData*) const = 0;
-
-       /** Interface method for use with Track and the beamline from the BeamSpotSvc - ESD */
-       virtual const Trk::Perigee* perigeeAtBeamline(const Trk::Track& trk, const InDet::BeamSpotData*) const = 0;
-                                                   
-       /** Interface method for use with TrackParticle and the beamline from the BeamSpotSvc - AOD*/
-       virtual const Trk::TrackParameters* trackAtBeamline(const Rec::TrackParticle& tp) const = 0;
-          
-       /** Interface method for use with TrackParticle and the beamline from the BeamSpotSvc - xAOD*/
-       virtual const Trk::TrackParameters* trackAtBeamline(const xAOD::TrackParticle& tp, const InDet::BeamSpotData*) const = 0;
-                 
-       /** Interface method for use with Track and the beamline from the BeamSpotSvc - ESD */
-       virtual const Trk::TrackParameters* trackAtBeamline(const Trk::Track& trk, const Trk::StraightLineSurface*) const = 0;
-
-       /** Interface method for use with Track and the beamline from the BeamSpotSvc - TrackParameters  */
-       virtual const Trk::TrackParameters* trackAtBeamline(const Trk::TrackParameters& tpars, const Trk::StraightLineSurface* ) const = 0;
+       /** Use this for MT Coding */
+       virtual std::unique_ptr<Trk::StraightLineSurface> GetBeamLine(
+         const InDet::BeamSpotData*)
+         const = 0; // In C++17 make this [[nodiscard]]
+
+       virtual const InDet::BeamSpotData* GetBeamSpotData(
+         const EventContext& ctx) const = 0; // In C++17 make this [[nodiscard]]
+
+       /** Interface method for use with TrackParticle and given vertex position
+        * - AOD */
+       virtual const Trk::Perigee* perigeeAtVertex(
+         const Rec::TrackParticle& tp,
+         const Amg::Vector3D& gp) const = 0;
+
+       /** Interface method for use with xAOD::Trackparticle and given vertex
+        * position - xAOD */
+       virtual const Trk::Perigee* perigeeAtVertex(
+         const xAOD::TrackParticle& tp,
+         const Amg::Vector3D& gp) const = 0;
+
+       /** Interface method for use with TrackParticle and default primary
+        * vertex from TrackParticle  - AOD */
+       virtual const Trk::Perigee* perigeeAtVertex(
+         const Rec::TrackParticle& tp) const = 0;
+
+       /** Interface method for use with TrackParticle and default primary
+        * vertex from TrackParticle  - xAOD */
+       virtual const Trk::Perigee* perigeeAtVertex(
+         const xAOD::TrackParticle& tp) const = 0;
+
+       /** Interface method for use with Track and given vertex position - ESD
+        */
+       virtual const Trk::Perigee* perigeeAtVertex(
+         const Trk::Track& trk,
+         const Amg::Vector3D& gp) const = 0;
+
+       /** Interface method for use with TrackParticle and the beamspot from the
+        * BeamSpotSvc - AOD*/
+       virtual const Trk::Perigee* perigeeAtBeamspot(
+         const Rec::TrackParticle& tp,
+         const InDet::BeamSpotData*) const = 0;
+
+       /** Interface method for use with TrackParticle and the beamspot from the
+        * BeamSpotSvc - xAOD*/
+       virtual const Trk::Perigee* perigeeAtBeamspot(
+         const xAOD::TrackParticle& tp,
+         const InDet::BeamSpotData*) const = 0;
+
+       /** Interface method for use with Track and the beamspot from the
+        * BeamSpotSvc - ESD */
+       virtual const Trk::Perigee* perigeeAtBeamspot(
+         const Trk::Track& trk,
+         const InDet::BeamSpotData*) const = 0;
+
+       /** Interface method for use with Track and the beamline from the
+        * BeamSpotSvc - ESD */
+       virtual const Trk::Perigee* perigeeAtBeamline(
+         const EventContext& ctx,
+         const Trk::Track& trk,
+         const InDet::BeamSpotData* beamSpotData) const = 0;
+
+      /** Interface method for use with TrackParticle and the beamline from the
+        * BeamSpotSvc - AOD*/
+       virtual const Trk::TrackParameters* trackAtBeamline(
+         const Rec::TrackParticle& tp) const = 0;
+
+       /** Interface method for use with TrackParticle and the beamline from the
+        * BeamSpotSvc - xAOD*/
+       virtual const Trk::TrackParameters* trackAtBeamline(
+         const xAOD::TrackParticle& tp,
+         const InDet::BeamSpotData*) const = 0;
+
+       /** Interface method for use with Track and the beamline from the
+        * BeamSpotSvc - ESD */
+       virtual const Trk::TrackParameters* trackAtBeamline(
+         const Trk::Track& trk,
+         const Trk::StraightLineSurface*) const = 0;
+
+       /** Interface method for use with Track and the beamline from the
+        * BeamSpotSvc - TrackParameters  */
+       virtual const Trk::TrackParameters* trackAtBeamline(
+         const Trk::TrackParameters& tpars,
+         const Trk::StraightLineSurface*) const = 0;
   };
-
 } 
 
 #endif // TRACKTOVERTEX_ITRACKTOVERTEX_H
diff --git a/Reconstruction/RecoTools/TrackToVertex/TrackToVertex/TrackToVertex.h b/Reconstruction/RecoTools/TrackToVertex/TrackToVertex/TrackToVertex.h
index 53a2313c005c..ad83644f4e5f 100755
--- a/Reconstruction/RecoTools/TrackToVertex/TrackToVertex/TrackToVertex.h
+++ b/Reconstruction/RecoTools/TrackToVertex/TrackToVertex/TrackToVertex.h
@@ -50,63 +50,108 @@ namespace Reco {
 
       /**Virtual destructor*/
       virtual ~TrackToVertex();
-       
+
       /** AlgTool initailize method.*/
-      virtual StatusCode initialize() override;
+      virtual StatusCode initialize() override final;
       /** AlgTool finalize method */
-      virtual StatusCode finalize()   override;
-                  
+      virtual StatusCode finalize() override final;
+
       /** Use this for MT Coding */
-      virtual std::unique_ptr<Trk::StraightLineSurface> GetBeamLine(const InDet::BeamSpotData*) const override; //In C++17 make this [[nodiscard]]
-
-      virtual const InDet::BeamSpotData* GetBeamSpotData(const EventContext &ctx) const override; //In C++17 make this [[nodiscard]]
-
-      /** Interface method for use with TrackParticle and given vertex position - AOD */
-      virtual const Trk::Perigee* perigeeAtVertex(const Rec::TrackParticle& tp, const Amg::Vector3D& gp) const override;
-
-      /** Interface method for use with xAOD::Trackparticle and given vertex position - xAOD */
-      virtual const Trk::Perigee* perigeeAtVertex(const xAOD::TrackParticle& tp, const Amg::Vector3D& gp) const override;
-            
-      /** Interface method for use with TrackParticle and default primary vertex from TrackParticle  - AOD */
-      virtual const Trk::Perigee* perigeeAtVertex(const Rec::TrackParticle& tp) const override;
-          
-      /** Interface method for use with TrackParticle and default primary vertex from TrackParticle  - xAOD */
-      virtual const Trk::Perigee* perigeeAtVertex(const xAOD::TrackParticle& tp) const override;          
-          
+      virtual std::unique_ptr<Trk::StraightLineSurface> GetBeamLine(
+        const InDet::BeamSpotData*)
+        const override final; // In C++17 make this [[nodiscard]]
+
+      virtual const InDet::BeamSpotData* GetBeamSpotData(
+        const EventContext& ctx)
+        const override final; // In C++17 make this [[nodiscard]]
+
+      /** Interface method for use with TrackParticle and given vertex position
+       * - AOD */
+      virtual const Trk::Perigee* perigeeAtVertex(
+        const Rec::TrackParticle& tp,
+        const Amg::Vector3D& gp) const override final;
+
+      /** Interface method for use with xAOD::Trackparticle and given vertex
+       * position - xAOD */
+      virtual const Trk::Perigee* perigeeAtVertex(
+        const xAOD::TrackParticle& tp,
+        const Amg::Vector3D& gp) const override final;
+
+      /** Interface method for use with TrackParticle and default primary vertex
+       * from TrackParticle  - AOD */
+      virtual const Trk::Perigee* perigeeAtVertex(
+        const Rec::TrackParticle& tp) const override final;
+
+      /** Interface method for use with TrackParticle and default primary vertex
+       * from TrackParticle  - xAOD */
+      virtual const Trk::Perigee* perigeeAtVertex(
+        const xAOD::TrackParticle& tp) const override final;
+
       /** Interface method for use with Track and given vertex position - ESD */
-      virtual const Trk::Perigee* perigeeAtVertex(const Trk::Track& trk, const Amg::Vector3D& gp) const override;
-                                             
-      /** Interface method for use with TrackParticle and the beamspot from the BeamSpotSvc - AOD*/
-      virtual const Trk::Perigee* perigeeAtBeamspot(const Rec::TrackParticle& tp, const InDet::BeamSpotData*) const override;
-      
-      /** Interface method for use with TrackParticle and the beamspot from the BeamSpotSvc - xAOD*/
-      virtual const Trk::Perigee* perigeeAtBeamspot(const xAOD::TrackParticle& tp, const InDet::BeamSpotData*) const override;
-          
-      /** Interface method for use with Track and the beamspot from the BeamSpotSvc - ESD */
-      virtual const Trk::Perigee* perigeeAtBeamspot(const Trk::Track& trk, const InDet::BeamSpotData*) const override;   
-
-      /** Interface method for use with Track and the beamline from the BeamSpotSvc - ESD */
-      virtual const Trk::Perigee* perigeeAtBeamline(const Trk::Track& trk, const InDet::BeamSpotData*) const override;   
-      
-      /** Interface method for use with TrackParticle and the beamline from the BeamSpotSvc - AOD*/
-      virtual const Trk::TrackParameters* trackAtBeamline(const Rec::TrackParticle& tp) const override;
-      
-      /** Interface method for use with TrackParticle and the beamline from the BeamSpotSvc - xAOD*/
-      virtual const Trk::TrackParameters* trackAtBeamline(const xAOD::TrackParticle& tp, const InDet::BeamSpotData*) const override;
-          
-      /** Interface method for use with Track and the beamline from the BeamSpotSvc - ESD */
-      virtual const Trk::TrackParameters* trackAtBeamline(const Trk::Track& trk, const Trk::StraightLineSurface* beamline) const override;
-      
-      /** Interface method for use with Track and the beamline from the BeamSpotSvc - TrackParameters  */
-      virtual const Trk::TrackParameters* trackAtBeamline(const Trk::TrackParameters& tpars, const Trk::StraightLineSurface* beamline) const override;
-
-
-   private:
-     ToolHandle< Trk::IExtrapolator > m_extrapolator;            //!< ToolHandle for Extrapolator
-
-     SG::ReadCondHandleKey<InDet::BeamSpotData> m_beamSpotKey { this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot" };
-     bool m_ForceBeamSpotZero = false;
-     const static Amg::Vector3D       s_origin;                  //!< static origin
+      virtual const Trk::Perigee* perigeeAtVertex(
+        const Trk::Track& trk,
+        const Amg::Vector3D& gp) const override final;
+
+      /** Interface method for use with TrackParticle and the beamspot from the
+       * BeamSpotSvc - AOD*/
+      virtual const Trk::Perigee* perigeeAtBeamspot(
+        const Rec::TrackParticle& tp,
+        const InDet::BeamSpotData*) const override final;
+
+      /** Interface method for use with TrackParticle and the beamspot from the
+       * BeamSpotSvc - xAOD*/
+      virtual const Trk::Perigee* perigeeAtBeamspot(
+        const xAOD::TrackParticle& tp,
+        const InDet::BeamSpotData*) const override final;
+
+      /** Interface method for use with Track and the beamspot from the
+       * BeamSpotSvc - ESD */
+      virtual const Trk::Perigee* perigeeAtBeamspot(
+        const Trk::Track& trk,
+        const InDet::BeamSpotData*) const override final;
+
+      /** Interface method for use with Track and the beamline from the
+       * BeamSpotSvc - ESD */
+      virtual const Trk::Perigee* perigeeAtBeamline(
+        const EventContext& ctx,
+        const Trk::Track& trk,
+        const InDet::BeamSpotData*) const override final;
+
+      /** Interface method for use with TrackParticle and the beamline from the
+       * BeamSpotSvc - AOD*/
+      virtual const Trk::TrackParameters* trackAtBeamline(
+        const Rec::TrackParticle& tp) const override final;
+
+      /** Interface method for use with TrackParticle and the beamline from the
+       * BeamSpotSvc - xAOD*/
+      virtual const Trk::TrackParameters* trackAtBeamline(
+        const xAOD::TrackParticle& tp,
+        const InDet::BeamSpotData*) const override final;
+
+      /** Interface method for use with Track and the beamline from the
+       * BeamSpotSvc - ESD */
+      virtual const Trk::TrackParameters* trackAtBeamline(
+        const Trk::Track& trk,
+        const Trk::StraightLineSurface* beamline) const override final;
+
+      /** Interface method for use with Track and the beamline from the
+       * BeamSpotSvc - TrackParameters  */
+      virtual const Trk::TrackParameters* trackAtBeamline(
+        const Trk::TrackParameters& tpars,
+        const Trk::StraightLineSurface* beamline) const override final;
+
+    private:
+      ToolHandle<Trk::IExtrapolator>
+        m_extrapolator; //!< ToolHandle for Extrapolator
+
+      SG::ReadCondHandleKey<InDet::BeamSpotData> m_beamSpotKey{
+        this,
+        "BeamSpotKey",
+        "BeamSpotData",
+        "SG key for beam spot"
+      };
+      bool m_ForceBeamSpotZero = false;
+      const static Amg::Vector3D s_origin; //!< static origin
   };
 
 } // end of namespace
diff --git a/Reconstruction/RecoTools/TrackToVertex/src/TrackToVertex.cxx b/Reconstruction/RecoTools/TrackToVertex/src/TrackToVertex.cxx
index e67f1c6b775e..788ad1626c6d 100755
--- a/Reconstruction/RecoTools/TrackToVertex/src/TrackToVertex.cxx
+++ b/Reconstruction/RecoTools/TrackToVertex/src/TrackToVertex.cxx
@@ -196,8 +196,11 @@ const Trk::Perigee* Reco::TrackToVertex::perigeeAtBeamspot(const Trk::Track& tra
   return perigeeAtVertex(track, beamspot ? beamspot->beamVtx().position() : s_origin);
 }
 
-
-const Trk::Perigee* Reco::TrackToVertex::perigeeAtBeamline(const Trk::Track& track, const InDet::BeamSpotData* beamspotptr) const
+const Trk::Perigee*
+Reco::TrackToVertex::perigeeAtBeamline(
+  const EventContext& ctx,
+  const Trk::Track& track,
+  const InDet::BeamSpotData* beamspotptr) const
 {
 
   Amg::Vector3D beamspot(s_origin);
@@ -218,7 +221,7 @@ const Trk::Perigee* Reco::TrackToVertex::perigeeAtBeamline(const Trk::Track& tra
 
   const Trk::Perigee* vertexPerigee = nullptr;
   const Trk::TrackParameters* extrapResult =
-    m_extrapolator->extrapolate(track, persf);
+    m_extrapolator->extrapolate(ctx,track, persf);
   if (extrapResult && extrapResult->surfaceType() == Trk::Surface::Perigee) {
     vertexPerigee = static_cast<const Trk::Perigee*>(extrapResult);
   }
@@ -227,14 +230,13 @@ const Trk::Perigee* Reco::TrackToVertex::perigeeAtBeamline(const Trk::Track& tra
     // try again using the first track parameter set, since the current extrapolator will
     // use "the closest" track parameterset which is not necessarily the mostuseful one to
     // start the extrapolation with.
-    // @TODO should try to improve the extrapolator to pick the correct start parameters.
     const DataVector<const Trk::TrackParameters> *track_parameter_list= track.trackParameters();
     if (track_parameter_list) {
       for(const Trk::TrackParameters *trk_params: *track_parameter_list) {
         if (!trk_params) {
           continue;
         }
-        extrapResult = m_extrapolator->extrapolate(*trk_params, persf);
+        extrapResult = m_extrapolator->extrapolate(ctx,*trk_params, persf);
         if (extrapResult &&
             extrapResult->surfaceType() == Trk::Surface::Perigee) {
           vertexPerigee = static_cast<const Trk::Perigee*>(extrapResult);
diff --git a/Tracking/TrkTools/TrkParticleCreator/src/TrackParticleCreatorTool.cxx b/Tracking/TrkTools/TrkParticleCreator/src/TrackParticleCreatorTool.cxx
index 075e2dbbd6c0..1d0a57bf43b2 100644
--- a/Tracking/TrkTools/TrkParticleCreator/src/TrackParticleCreatorTool.cxx
+++ b/Tracking/TrkTools/TrkParticleCreator/src/TrackParticleCreatorTool.cxx
@@ -346,7 +346,7 @@ TrackParticleCreatorTool::TrackParticleCreatorTool(const std::string& t,
     }
     else if (m_perigeeExpression == "BeamLine"){
       const Trk::Perigee* result =
-        m_trackToVertex->perigeeAtBeamline(*track, CacheBeamSpotData(ctx));
+        m_trackToVertex->perigeeAtBeamline(ctx,*track, CacheBeamSpotData(ctx));
       if (!result){
 
         ATH_MSG_WARNING("Failed to extrapolate to Beamline");
@@ -532,7 +532,7 @@ TrackParticleCreatorTool::TrackParticleCreatorTool(const std::string& t,
     }
     else if (m_perigeeExpression == "BeamLine"){
       const Trk::Perigee* result =
-        m_trackToVertex->perigeeAtBeamline(track, CacheBeamSpotData(ctx));
+        m_trackToVertex->perigeeAtBeamline(ctx,track, CacheBeamSpotData(ctx));
       if (!result){
         ATH_MSG_WARNING("Failed to extrapolate to Beamline - No TrackParticle created.");
         return nullptr;
-- 
GitLab


From 0f6488fdec2040669ff38454d0bcb5a27bf30046 Mon Sep 17 00:00:00 2001
From: Shaun Roe <shaun.roe@cern.ch>
Date: Wed, 16 Dec 2020 15:24:12 +0000
Subject: [PATCH 083/225] 22.0-cleanup-InDetTestBLayer

---
 .../IInDetTestBLayerTool.h                    | 15 ++++++-----
 .../InDetTestBLayer/InDetTestBLayerTool.h     | 15 +++++------
 .../src/InDetTestBLayerTool.cxx               | 27 +++++++------------
 .../src/PerigeeBLPredictionFillerTool.cxx     |  2 +-
 4 files changed, 25 insertions(+), 34 deletions(-)

diff --git a/InnerDetector/InDetRecTools/InDetRecToolInterfaces/InDetRecToolInterfaces/IInDetTestBLayerTool.h b/InnerDetector/InDetRecTools/InDetRecToolInterfaces/InDetRecToolInterfaces/IInDetTestBLayerTool.h
index beef2f0ce1ed..4a2d1835a5b5 100755
--- a/InnerDetector/InDetRecTools/InDetRecToolInterfaces/InDetRecToolInterfaces/IInDetTestBLayerTool.h
+++ b/InnerDetector/InDetRecTools/InDetRecToolInterfaces/InDetRecToolInterfaces/IInDetTestBLayerTool.h
@@ -1,25 +1,26 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef IInDetTestBLayerTool_H
 #define IInDetTestBLayerTool_H
-#include "GaudiKernel/EventContext.h"
 #include "GaudiKernel/IAlgTool.h"
-#include "GaudiKernel/ThreadLocalContext.h"
+#include "GaudiKernel/ThreadLocalContext.h" //for Gaudi::Hive::currentContext()
 #include "TrkParameters/TrackParameters.h"
-#include "TrkEventPrimitives/ResidualPull.h"
 #include <vector>
-#include <string>
 
 namespace Trk {
-class Track;
-class IResidualPullCalculator;
+  class Track;
+  class IResidualPullCalculator;
+  class ResidualPull;
 }
+
 namespace InDet {
 class TrackStateOnBLayerInfo;
 }
 
+class EventContext;
+
 namespace InDet {
 
 
diff --git a/InnerDetector/InDetRecTools/InDetTestBLayer/InDetTestBLayer/InDetTestBLayerTool.h b/InnerDetector/InDetRecTools/InDetTestBLayer/InDetTestBLayer/InDetTestBLayerTool.h
index 2924eb9357dd..3cb1da4f566a 100644
--- a/InnerDetector/InDetRecTools/InDetTestBLayer/InDetTestBLayer/InDetTestBLayerTool.h
+++ b/InnerDetector/InDetRecTools/InDetTestBLayer/InDetTestBLayer/InDetTestBLayerTool.h
@@ -8,25 +8,24 @@
 #include "InDetRecToolInterfaces/IInDetTestBLayerTool.h"
 #include "AthenaBaseComps/AthAlgTool.h"
 #include "GaudiKernel/ToolHandle.h"
-#include "GaudiKernel/ServiceHandle.h"
+#include "GaudiKernel/ThreadLocalContext.h" //for Gaudi::Hive::currentContext()
 #include "TrkParameters/TrackParameters.h"
-#include "TrkEventPrimitives/ResidualPull.h"
 #include "TrkExInterfaces/IExtrapolator.h"
 #include "TrkToolInterfaces/IResidualPullCalculator.h"
-
-#include "InDetTestBLayer/TrackStateOnBLayerInfo.h"
 #include "InDetConditionsSummaryService/IInDetConditionsTool.h"
 #include <vector>
 #include <string>
+#include <memory>
 
 namespace Trk {
-class Track;
+  class Track;
+  class ResidualPull;
 }
-namespace Rec { class TrackParticle; }
+
 class AtlasDetectorID;
-class Identifier;
 class PixelID;
-
+class TrackStateOnBLayerInfo;
+class EventContext;
 
 namespace InDet {
 
diff --git a/InnerDetector/InDetRecTools/InDetTestBLayer/src/InDetTestBLayerTool.cxx b/InnerDetector/InDetRecTools/InDetTestBLayer/src/InDetTestBLayerTool.cxx
index 871f24d9eeb5..583477a96cf3 100644
--- a/InnerDetector/InDetRecTools/InDetTestBLayer/src/InDetTestBLayerTool.cxx
+++ b/InnerDetector/InDetRecTools/InDetTestBLayer/src/InDetTestBLayerTool.cxx
@@ -1,40 +1,31 @@
 /*
   Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
+#include "InDetTestBLayer/InDetTestBLayerTool.h"
 
-#include "AthenaBaseComps/AthAlgTool.h"
-#include "AthenaBaseComps/AthService.h"
-
+#include "TrkEventPrimitives/ResidualPull.h"
 #include "InDetReadoutGeometry/SiDetectorElement.h"
 #include "PixelReadoutGeometry/PixelModuleDesign.h"
-#include "InDetTestBLayer/InDetTestBLayerTool.h"
+#include "InDetTestBLayer/TrackStateOnBLayerInfo.h"
+#include "TrkEventPrimitives/ResidualPull.h"
 #include "TrkTrack/Track.h"
-#include "TrkParameters/TrackParameters.h"
 #include "Particle/TrackParticle.h"
 #include "TrkMeasurementBase/MeasurementBase.h"
-
 #include "TrkSurfaces/CylinderSurface.h"
-
 #include "TrkGeometry/Layer.h"
-
 #include "Identifier/Identifier.h"
 #include "InDetIdentifier/PixelID.h"
 #include "AtlasDetDescr/AtlasDetectorID.h"
 #include "IdDictDetDescr/IdDictManager.h"
-
-
-#include <iostream>
-#include <sstream>
+#include "GaudiKernel/EventContext.h"
 
 using Amg::Transform3D;
 // don't want to include TrackSummary in the header
 // therefore anonymous "static" definition in the implementation file
-//namespace {
-  static const Trk::SummaryType s_layerSummaryTypeExpectHit[2] {
-    Trk::expectInnermostPixelLayerHit,
-    Trk::expectNextToInnermostPixelLayerHit
-  };
-//}
+static const Trk::SummaryType s_layerSummaryTypeExpectHit[2] {
+  Trk::expectInnermostPixelLayerHit,
+  Trk::expectNextToInnermostPixelLayerHit
+};
 
 
 namespace InDet {
diff --git a/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/src/PerigeeBLPredictionFillerTool.cxx b/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/src/PerigeeBLPredictionFillerTool.cxx
index 1e7172b2637c..80a67a86219e 100644
--- a/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/src/PerigeeBLPredictionFillerTool.cxx
+++ b/PhysicsAnalysis/D3PDMaker/TrackD3PDMaker/src/PerigeeBLPredictionFillerTool.cxx
@@ -12,7 +12,7 @@
 
 #include "PerigeeBLPredictionFillerTool.h"
 #include "InDetTestBLayer/InDetTestBLayerTool.h"
-//#include "TrkParameters/Perigee.h"
+#include "InDetTestBLayer/TrackStateOnBLayerInfo.h"
 #include "AthenaKernel/errorcheck.h"
 #include "InDetReadoutGeometry/SiDetectorElement.h"
 #include "InDetIdentifier/PixelID.h"
-- 
GitLab


From 4d807e12f75fb1eca8563e33617f4328fbcb6038 Mon Sep 17 00:00:00 2001
From: Tim Martin <Tim.Martin@cern.ch>
Date: Wed, 16 Dec 2020 16:28:31 +0100
Subject: [PATCH 084/225] Fix existing typo in typelessfindLinks

---
 Trigger/TrigSteer/DecisionHandling/src/InputMakerBase.cxx     | 4 ++--
 .../TrigCompositeUtils/TrigCompositeUtils.h                   | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/Trigger/TrigSteer/DecisionHandling/src/InputMakerBase.cxx b/Trigger/TrigSteer/DecisionHandling/src/InputMakerBase.cxx
index afebd6200261..c726f8b63a77 100644
--- a/Trigger/TrigSteer/DecisionHandling/src/InputMakerBase.cxx
+++ b/Trigger/TrigSteer/DecisionHandling/src/InputMakerBase.cxx
@@ -107,7 +107,7 @@ size_t InputMakerBase::matchDecision(const DecisionContainer* outDecisions, cons
   std::vector<uint32_t> keysA;
   std::vector<uint32_t> clidsA;
   std::vector<uint16_t> indiciesA;
-  TrigCompositeUtils::typelessfindLinks(toMatch, linkNameToMatch, keysA, clidsA, indiciesA, TrigDefs::lastFeatureOfType, &cache);
+  TrigCompositeUtils::typelessFindLinks(toMatch, linkNameToMatch, keysA, clidsA, indiciesA, TrigDefs::lastFeatureOfType, &cache);
   
   if (keysA.size() != 1) {
     ATH_MSG_ERROR("InputMakerBase::matchDecision Did not locate exactly one object having searched for a link named '" << linkNameToMatch 
@@ -129,7 +129,7 @@ size_t InputMakerBase::matchDecision(const DecisionContainer* outDecisions, cons
     std::vector<uint32_t> keysB;
     std::vector<uint32_t> clidsB;
     std::vector<uint16_t> indiciesB;
-    TrigCompositeUtils::typelessfindLinks(checkDecision, linkNameToMatch, keysB, clidsB, indiciesB, TrigDefs::lastFeatureOfType, &cache);
+    TrigCompositeUtils::typelessFindLinks(checkDecision, linkNameToMatch, keysB, clidsB, indiciesB, TrigDefs::lastFeatureOfType, &cache);
     if (keysB.size() != 1) {
       ATH_MSG_ERROR("Logic error. Expect toMatch size == 1 (confirmed) and checkObject size == 1."
         << " But have checkObject size = " << keysB.size() << ". Unable to match this Decision object.");
diff --git a/Trigger/TrigSteer/TrigCompositeUtils/TrigCompositeUtils/TrigCompositeUtils.h b/Trigger/TrigSteer/TrigCompositeUtils/TrigCompositeUtils/TrigCompositeUtils.h
index 64ea8b34ea3e..84594aade1ff 100644
--- a/Trigger/TrigSteer/TrigCompositeUtils/TrigCompositeUtils/TrigCompositeUtils.h
+++ b/Trigger/TrigSteer/TrigCompositeUtils/TrigCompositeUtils/TrigCompositeUtils.h
@@ -457,7 +457,7 @@ namespace TrigCompositeUtils {
                           branch once a link has been located and collected. 
    * @param[inout] visitedCache Optional cache used by the recursive algorithm to avoid exploring each node multiple times. 
    */
-  bool typelessfindLinks(const Decision* start, 
+  bool typelessFindLinks(const Decision* start, 
     const std::string& linkName,
     std::vector<uint32_t>& key,
     std::vector<uint32_t>& clid,
-- 
GitLab


From 1e8877f998f35a5f001f5215a32e0c46e824f5f6 Mon Sep 17 00:00:00 2001
From: Rafal Bielski <rafal.bielski@cern.ch>
Date: Tue, 15 Dec 2020 19:54:55 +0100
Subject: [PATCH 085/225] ComponentAccumulator configuration of transient
 ByteStream

---
 .../python/ByteStreamConfig.py                |  55 ++++++++++
 .../python/LArByteStreamConfig.py             |   8 +-
 .../python/TriggerTransBSConfig.py            | 100 ++++++++++++++++++
 .../TriggerJobOpts/share/runHLT_standalone.py |  12 ++-
 4 files changed, 165 insertions(+), 10 deletions(-)
 create mode 100644 Trigger/TriggerCommon/TriggerJobOpts/python/TriggerTransBSConfig.py

diff --git a/Event/ByteStreamCnvSvc/python/ByteStreamConfig.py b/Event/ByteStreamCnvSvc/python/ByteStreamConfig.py
index beac64668773..ec40719560ee 100644
--- a/Event/ByteStreamCnvSvc/python/ByteStreamConfig.py
+++ b/Event/ByteStreamCnvSvc/python/ByteStreamConfig.py
@@ -157,6 +157,61 @@ def ByteStreamWriteCfg(flags, type_names=None):
 
     return result
 
+def TransientByteStreamCfg(flags, item_list=None, type_names=None, extra_inputs=None):
+    """Set up transient ByteStream output stream
+
+    Configure components responsible for writing bytestream format. Write the
+    specified objects to ByteStream into the cache of the ROBDataProviderSvc.
+    The data can then be read downstream as if they were coming from a BS file.
+
+    Args:
+        flags:        Job configuration, usually derived from ConfigFlags
+        item_list:    (optional) List of objects to be written to transient ByteStream
+        type_names:   (optional) List of types/names to register in BS conversion service
+                      as available to be read from (transient) ByteStream
+        extra_inputs: (optional) List of objects which need to be produced before transient
+                      ByteStream streaming is scheduled - ensures correct scheduling
+
+    Returns:
+        A component accumulator fragment containing the components required to
+        write transient bytestream. Should be merged into main job configuration.
+    """
+
+    result = ComponentAccumulator()
+    comp_factory = AthenaConfiguration.ComponentFactory.CompFactory
+
+    rdp = comp_factory.ROBDataProviderSvc()
+    result.addService(rdp)
+
+    rdp_output = comp_factory.ByteStreamRDP_OutputSvc()
+    result.addService(rdp_output)
+
+    bytestream_conversion = comp_factory.ByteStreamCnvSvc(
+        name="ByteStreamCnvSvc",
+        ByteStreamOutputSvcList=[rdp_output.getName()],
+    )
+    result.addService(bytestream_conversion)
+
+    output_stream = comp_factory.AthenaOutputStream(
+        name="TransBSStreamAlg",
+        EvtConversionSvc=bytestream_conversion.name,
+        OutputFile="ByteStreamRDP_OutputSvc",
+        ItemList=item_list if item_list else list(),
+        ExtraInputs=extra_inputs if extra_inputs else list(),
+    )
+    result.addEventAlgo(output_stream, primary=True)
+
+    address_provider = comp_factory.ByteStreamAddressProviderSvc(
+        TypeNames=type_names if type_names else list(),
+    )
+    result.addService(address_provider)
+
+    proxy = comp_factory.ProxyProviderSvc()
+    proxy.ProviderNames += [address_provider.name]
+    result.addService(proxy)
+
+    return result
+
 
 def main():
     """Run a functional test if module is executed"""
diff --git a/LArCalorimeter/LArCnv/LArByteStream/python/LArByteStreamConfig.py b/LArCalorimeter/LArCnv/LArByteStream/python/LArByteStreamConfig.py
index cad5f10f1769..6ffba323d0f1 100644
--- a/LArCalorimeter/LArCnv/LArByteStream/python/LArByteStreamConfig.py
+++ b/LArCalorimeter/LArCnv/LArByteStream/python/LArByteStreamConfig.py
@@ -1,19 +1,17 @@
 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 
-from LArByteStream.LArByteStreamConf import LArRawDataContByteStreamTool
-
+from AthenaConfiguration.ComponentFactory import CompFactory
 
 
 def LArRawDataContByteStreamToolConfig (name="LArRawDataContByteStreamTool",
                                         InitializeForWriting = False,
                                         stream=None,
                                         **kwargs):
-      tool = LArRawDataContByteStreamTool (name, **kwargs)
+      tool = CompFactory.LArRawDataContByteStreamTool (name, **kwargs)
       if InitializeForWriting:
-         from CaloTools.CaloNoiseCondAlg import CaloNoiseCondAlg
          from LArCabling.LArCablingAccess import LArOnOffIdMapping, LArFebRodMapping
-         noisealg = CaloNoiseCondAlg ('totalNoise')
+         noisealg = CompFactory.CaloNoiseCondAlg ('totalNoise')
          LArOnOffIdMapping()
          LArFebRodMapping()
          if stream:
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerTransBSConfig.py b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerTransBSConfig.py
new file mode 100644
index 000000000000..2e932fa4a03c
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/TriggerTransBSConfig.py
@@ -0,0 +1,100 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+'''
+ComponentAccumulator configuration for producing transient ByteStream,
+which is required when running HLT selection algorithms on MC RDO inputs
+'''
+
+
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from ByteStreamCnvSvc.ByteStreamConfig import TransientByteStreamCfg
+
+def triggerTransBSCfg(flags, seqName="AthAlgSeq"):
+    acc = ComponentAccumulator(seqName)
+
+    itemList = []  # Objects to be written to transient BS
+    typeNames = []  # Objects to be read from transient BS
+    extraInputs = []  # Objects to be produced before writing transient BS (scheduler dependency)
+
+    # --------------------------------------------------
+    # Level-1 Trigger
+    # --------------------------------------------------
+    from TrigT1ResultByteStream.TrigT1ResultByteStreamConfig import L1TriggerByteStreamEncoderCfg
+    acc.merge(L1TriggerByteStreamEncoderCfg(flags))
+
+    if flags.Trigger.enableL1CaloLegacy or not flags.Trigger.enableL1Phase1:
+        itemList += ["ROIB::RoIBResult#RoIBResult"]
+        typeNames += ["MuCTPI_RDO/MUCTPI_RDO"]
+        extraInputs += [('ROIB::RoIBResult', 'StoreGateSvc+RoIBResult')]
+
+    if flags.Trigger.enableL1Phase1:
+        itemList += ["xAOD::TrigCompositeContainer#L1TriggerResult",
+                     "xAOD::TrigCompositeAuxContainer#L1TriggerResultAux."]
+        extraInputs += [('xAOD::TrigCompositeContainer', 'StoreGateSvc+L1TriggerResult')]
+
+    # --------------------------------------------------
+    # ID
+    # --------------------------------------------------
+    if flags.Trigger.doID:
+        # Pixel
+        itemList += ["PixelRDO_Container#*"]
+        typeNames += ["InDet::PixelClusterContainer/PixelOnlineClusters"]
+        extraInputs += [('PixelHitDiscCnfgData','ConditionStore+PixelHitDiscCnfgData')]
+        extraInputs += [('PixelCablingCondData','ConditionStore+PixelCablingCondData')]
+        # SCT
+        itemList += ["SCT_RDO_Container#*"]
+        typeNames += ["InDet::SCT_ClusterContainer/SCT_OnlineClusters"]
+        extraInputs += [('SCT_CablingData','ConditionStore+SCT_CablingData')]
+        # TRT
+        itemList += ["TRT_RDO_Container#*"]
+        typeNames += ["InDet::TRT_DriftCircleContainer/TRT_DriftCircle"]
+
+    # --------------------------------------------------
+    # Calo
+    # --------------------------------------------------
+    if flags.Trigger.doCalo:
+        # LAr
+        from LArByteStream.LArByteStreamConfig import LArRawDataContByteStreamToolConfig
+        lar_tool = LArRawDataContByteStreamToolConfig(InitializeForWriting=True)
+        acc.addPublicTool(lar_tool)
+        itemList += ["LArRawChannelContainer#*"]
+        extraInputs += [('CaloNoise', 'ConditionStore+totalNoise'),
+                        ('LArOnOffIdMapping', 'ConditionStore+LArOnOffIdMap'),
+                        ('LArFebRodMapping', 'ConditionStore+LArFebRodMap')]
+        # Tile
+        itemList += ["TileRawChannelContainer#*"]
+        typeNames += ["TileCellIDC/TileCellIDC"]
+        extraInputs += [('TileBadChannels','ConditionStore+TileBadChannels')]
+
+    # --------------------------------------------------
+    # Muon
+    # --------------------------------------------------
+    if flags.Trigger.doMuon:
+        # MDT
+        itemList += ["MdtCsmContainer#*"]
+        typeNames += ["MdtDigitContainer/MDT_DIGITS",
+                      "MdtCsmContainer/MDTCSM"]
+        extraInputs += [('MuonMDT_CablingMap','ConditionStore+MuonMDT_CablingMap')]
+        # RPC
+        itemList += ["RpcPadContainer#*"]
+        typeNames += ["RpcDigitContainer/RPC_DIGITS",
+                      "RpcPadContainer/RPCPAD"]
+        # TGC
+        itemList += ["TgcRdoContainer#*"]
+        typeNames += ["TgcDigitContainer/TGC_DIGITS",
+                      "TgcRdoContainer/TGCRDO"]
+        # CSC
+        itemList += ["CscRawDataContainer#*"]
+        typeNames += ["CscDigitContainer/CSC_DIGITS",
+                      "CscRawDataContainer/CSCRDO"]
+
+    # --------------------------------------------------
+    # Final configuration
+    # --------------------------------------------------
+    transBSCfg = TransientByteStreamCfg(
+        flags,
+        item_list=itemList,
+        type_names=typeNames,
+        extra_inputs=extraInputs)
+    acc.merge(transBSCfg, sequenceName=seqName)
+
+    return acc
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/share/runHLT_standalone.py b/Trigger/TriggerCommon/TriggerJobOpts/share/runHLT_standalone.py
index 3ea6726e9574..a4c83476b215 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/share/runHLT_standalone.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/share/runHLT_standalone.py
@@ -390,11 +390,6 @@ if ConfigFlags.Input.Format == 'POOL':
     import AthenaPoolCnvSvc.ReadAthenaPool   # noqa
     svcMgr.AthenaPoolCnvSvc.PoolAttributes = [ "DEFAULT_BUFFERSIZE = '2048'" ]
     svcMgr.PoolSvc.AttemptCatalogPatch=True
-    # enable transient BS
-    if ConfigFlags.Trigger.doTransientByteStream:
-        log.info("setting up transient BS")
-        include( "TriggerJobOpts/jobOfragment_TransBS_standalone.py" )
-
 
 # ----------------------------------------------------------------
 # ByteStream input
@@ -469,6 +464,13 @@ if opt.doL1Sim:
     from TriggerJobOpts.Lvl1SimulationConfig import Lvl1SimulationSequence
     hltBeginSeq += Lvl1SimulationSequence(ConfigFlags)
 
+# ---------------------------------------------------------------
+# Transient ByteStream
+# ---------------------------------------------------------------
+if ConfigFlags.Trigger.doTransientByteStream:
+    log.info("Configuring transient ByteStream")
+    from TriggerJobOpts.TriggerTransBSConfig import triggerTransBSCfg
+    CAtoGlobalWrapper(triggerTransBSCfg, ConfigFlags, seqName="HLTBeginSeq")
 
 # ---------------------------------------------------------------
 # HLT generation
-- 
GitLab


From 73fa119723454d0ace6afbed9e7361013e0decb0 Mon Sep 17 00:00:00 2001
From: Rafal Bielski <rafal.bielski@cern.ch>
Date: Wed, 16 Dec 2020 17:56:33 +0100
Subject: [PATCH 086/225] TrigAnalysisTest: Fix input flag setting in
 corner-case legacy tests

---
 .../TrigAnalysisTest/share/testAthenaTrigAOD_TrigDecTool.py   | 4 ++--
 .../share/testAthenaTrigAOD_TrigEDMAuxCheck.py                | 4 ++--
 .../TrigAnalysisTest/share/testAthenaTrigAOD_TrigEDMCheck.py  | 4 ++--
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/Trigger/TrigValidation/TrigAnalysisTest/share/testAthenaTrigAOD_TrigDecTool.py b/Trigger/TrigValidation/TrigAnalysisTest/share/testAthenaTrigAOD_TrigDecTool.py
index 33271117c613..cd706e30fbdf 100644
--- a/Trigger/TrigValidation/TrigAnalysisTest/share/testAthenaTrigAOD_TrigDecTool.py
+++ b/Trigger/TrigValidation/TrigAnalysisTest/share/testAthenaTrigAOD_TrigDecTool.py
@@ -52,8 +52,8 @@ if not ('fileList' in dir()) and not ('RunningRTT' in dir()):
 #added for RTT-chainstore conmpatibility
 if not ('RunningRTT' in dir()):
     acf.FilesInput=fileList
-    ConfigFlags.Input.Files = acf.FilesInput()
-#acf.FilesInput=fileList
+
+ConfigFlags.Input.Files = acf.FilesInput() or acf.PoolAODInput()
 
 ###############################
 
diff --git a/Trigger/TrigValidation/TrigAnalysisTest/share/testAthenaTrigAOD_TrigEDMAuxCheck.py b/Trigger/TrigValidation/TrigAnalysisTest/share/testAthenaTrigAOD_TrigEDMAuxCheck.py
index 543a0f5d4964..6843a6bd7ce7 100644
--- a/Trigger/TrigValidation/TrigAnalysisTest/share/testAthenaTrigAOD_TrigEDMAuxCheck.py
+++ b/Trigger/TrigValidation/TrigAnalysisTest/share/testAthenaTrigAOD_TrigEDMAuxCheck.py
@@ -55,8 +55,8 @@ if not ('fileList' in dir()) and not ('RunningRTT' in dir()):
 #added for RTT-chainstore conmpatibility
 if not ('RunningRTT' in dir()):
     acf.FilesInput=fileList
-    ConfigFlags.Input.Files = acf.FilesInput()
-#acf.FilesInput=fileList
+
+ConfigFlags.Input.Files = acf.FilesInput() or acf.PoolAODInput()
 
 
 
diff --git a/Trigger/TrigValidation/TrigAnalysisTest/share/testAthenaTrigAOD_TrigEDMCheck.py b/Trigger/TrigValidation/TrigAnalysisTest/share/testAthenaTrigAOD_TrigEDMCheck.py
index 99ab925addcc..31f6dbf9cb14 100644
--- a/Trigger/TrigValidation/TrigAnalysisTest/share/testAthenaTrigAOD_TrigEDMCheck.py
+++ b/Trigger/TrigValidation/TrigAnalysisTest/share/testAthenaTrigAOD_TrigEDMCheck.py
@@ -55,8 +55,8 @@ if not ('fileList' in dir()) and not ('RunningRTT' in dir()):
 #added for RTT-chainstore conmpatibility
 if not ('RunningRTT' in dir()):
     acf.FilesInput=fileList
-    ConfigFlags.Input.Files = acf.FilesInput()
-#acf.FilesInput=fileList
+
+ConfigFlags.Input.Files = acf.FilesInput() or acf.PoolAODInput()
 
 
 
-- 
GitLab


From d6e6eb3a4ddb787928cb170f23149abf32edf821 Mon Sep 17 00:00:00 2001
From: David Shope <david.richard.shope@cern.ch>
Date: Wed, 16 Dec 2020 18:29:46 +0100
Subject: [PATCH 087/225] Also add off-diagonal elements for now to track smart
 slimming

---
 .../python/InDetTrackParticlesCPContent.py                      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetTrackParticlesCPContent.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetTrackParticlesCPContent.py
index 55b9bc2b90e4..88c71f05efcb 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetTrackParticlesCPContent.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetTrackParticlesCPContent.py
@@ -2,5 +2,5 @@
 
 InDetTrackParticlesCPContent = [
 "InDetTrackParticles",
-"InDetTrackParticlesAux.phi.theta.qOverP.chiSquared.numberDoF.numberOfInnermostPixelLayerHits.numberOfPixelHits.numberOfPixelHoles.numberOfPixelSharedHits.numberOfPixelDeadSensors.numberOfSCTHits.numberOfSCTHoles.numberOfSCTSharedHits.numberOfSCTDeadSensors.definingParametersCovMatrixDiag"
+"InDetTrackParticlesAux.phi.theta.qOverP.chiSquared.numberDoF.numberOfInnermostPixelLayerHits.numberOfPixelHits.numberOfPixelHoles.numberOfPixelSharedHits.numberOfPixelDeadSensors.numberOfSCTHits.numberOfSCTHoles.numberOfSCTSharedHits.numberOfSCTDeadSensors.definingParametersCovMatrixDiag.definingParametersCovMatrixOffDiag"
 ]
-- 
GitLab


From f952e7eeda780106d8928b8816e8850cd62fd749 Mon Sep 17 00:00:00 2001
From: Nicholas Styles <nicholas.styles@desy.de>
Date: Wed, 16 Dec 2020 18:36:39 +0100
Subject: [PATCH 088/225] use correct transform for initializating ITk
 parameters

---
 .../src/SolidStateDetectorElementBase.cxx        | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/DetectorDescription/ReadoutGeometryBase/src/SolidStateDetectorElementBase.cxx b/DetectorDescription/ReadoutGeometryBase/src/SolidStateDetectorElementBase.cxx
index 33e37600e2e2..144bf769ab86 100644
--- a/DetectorDescription/ReadoutGeometryBase/src/SolidStateDetectorElementBase.cxx
+++ b/DetectorDescription/ReadoutGeometryBase/src/SolidStateDetectorElementBase.cxx
@@ -368,31 +368,33 @@ using Trk::distDepth;
     
     // use aligned transform if available
     const GeoTrf::Transform3D* ptrXf;
-    
+    GeoTrf::Transform3D geotrf;
+
     if (m_geoAlignStore){ 
       ptrXf = m_geoAlignStore->getAbsPosition(getMaterialGeom());
       if (ptrXf) {
-	m_transformHit = (*ptrXf) * m_design->SiHitToGeoModel();
+	m_transformHit = (*ptrXf) * m_design->SiHitToGeoModel(); //need .linear()?
+	geotrf = (*ptrXf);
       }
     }
     else{
-      m_transformHit  = (getMaterialGeom()->getAbsoluteTransform() * m_design->SiHitToGeoModel());
+      m_transformHit  = (getMaterialGeom()->getAbsoluteTransform() * m_design->SiHitToGeoModel()); //need .linear()?
+      geotrf = getMaterialGeom()->getAbsoluteTransform();
     }
     
-    const GeoTrf::Transform3D& geoTransform = m_transformHit;
-
+    const GeoTrf::Transform3D& geoTransform = geotrf;
     m_baseCacheValid = true;
     
     bool firstTimeBaseTmp = m_firstTimeBase;
     m_firstTimeBase = false;
     
-    m_center = geoTransform * m_design->sensorCenter();
+    m_center = geoTransform.linear() * m_design->sensorCenter();
     
     //Is this needed outside e.g. ReadSiDetElements? Maybe candidate for future removal?
     m_centerCLHEP = HepGeom::Point3D<double>(m_center[0],m_center[1],m_center[2]);
 
     Amg::Vector3D centerGeoModel(0., 0., 0.);
-    m_origin = geoTransform * centerGeoModel;
+    m_origin = geoTransform.linear() * centerGeoModel;
    
     //
     // Determine directions depth, eta and phi axis in reconstruction local frame
-- 
GitLab


From b523824746dbb3e8050e28ab4ddfe1c90abbc5fe Mon Sep 17 00:00:00 2001
From: Julie Kirk <julie.kirk@stfc.ac.uk>
Date: Wed, 16 Dec 2020 18:38:11 +0000
Subject: [PATCH 089/225] Change name of "LRT" muon idperf chain (ATR-22501)

---
 .../TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref     | 2 +-
 .../TrigValidation/TriggerTest/share/ref_data_v1Dev_build.ref   | 2 +-
 .../TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py           | 2 +-
 .../TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py   | 2 +-
 .../TriggerMenuMT/python/HLTMenuConfig/Muon/MuonDef.py          | 2 +-
 5 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
index c8d782b99bf8..332f0ecdb287 100644
--- a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
+++ b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
@@ -2222,7 +2222,7 @@ HLT_mu6_L1MU6:
     1: 12
     2: 13
     3: 13
-HLT_mu6_idperfLRT_l2lrt_L1MU6:
+HLT_mu6_LRT_idperf_l2lrt_L1MU6:
   eventCount: 10
   stepCounts:
     0: 10
diff --git a/Trigger/TrigValidation/TriggerTest/share/ref_data_v1Dev_build.ref b/Trigger/TrigValidation/TriggerTest/share/ref_data_v1Dev_build.ref
index f55a38a8f6e3..c297c4f0862f 100644
--- a/Trigger/TrigValidation/TriggerTest/share/ref_data_v1Dev_build.ref
+++ b/Trigger/TrigValidation/TriggerTest/share/ref_data_v1Dev_build.ref
@@ -1188,7 +1188,7 @@ HLT_mu6_L1MU6:
   stepFeatures:
     0: 1
     1: 1
-HLT_mu6_idperfLRT_l2lrt_L1MU6:
+HLT_mu6_LRT_idperf_l2lrt_L1MU6:
   eventCount: 1
   stepCounts:
     0: 1
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
index 11510d8b227a..c33b57793af8 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
@@ -41,7 +41,7 @@ def setupMenu():
         #test chains
         ChainProp(name='HLT_mu6_L1MU6',     groups=SingleMuonGroup),
 
-        ChainProp(name='HLT_mu6_idperfLRT_l2lrt_L1MU6',     groups=SingleMuonGroup),
+        ChainProp(name='HLT_mu6_LRT_idperf_l2lrt_L1MU6',     groups=SingleMuonGroup),
 
         ChainProp(name='HLT_mu6_ivarmedium_L1MU6', groups=SingleMuonGroup),
 
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py
index 34bce8ae9544..7d176fb0b6ef 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py
@@ -226,7 +226,7 @@ MuonChainParts = {
     'IDinfo'         : [],
     'isoInfo'        : ['ivarmedium'],
     'invMassInfo'    : ['10invm70'],
-    'addInfo'        : ['1step','idperf','idperfLRT','3layersEC','cosmic',"muonqual"],
+    'addInfo'        : ['1step','idperf','LRT','3layersEC','cosmic',"muonqual"],
     'topo'           : AllowedTopos_mu,
     'flavour'        : [],
     'sigFolder'     : 'Muon',
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonDef.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonDef.py
index f68f6cdfa541..a63267ae0539 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonDef.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonDef.py
@@ -157,7 +157,7 @@ class MuonChainConfiguration(ChainConfigurationBase):
 
         if doOvlpRm:
            return self.getStep(2, 'muComb', [muCombOvlpRmSequenceCfg] )
-        elif "idperfLRT" in self.chainName:
+        elif "LRT" in self.chainName:
            return self.getStep(2, 'muCombLRT', [muCombLRTSequenceCfg] )
         else:
            return self.getStep(2, 'muComb', [muCombSequenceCfg] )
-- 
GitLab


From 93e4dbb0673de91c648a8279da51e6f9cd804a05 Mon Sep 17 00:00:00 2001
From: Jannik Geisen <jannik.geisen@cern.ch>
Date: Wed, 16 Dec 2020 18:38:45 +0000
Subject: [PATCH 090/225] Porting online monitoring tool to use JetRecAlg

---
 Reconstruction/Jet/JetRec/src/JetRecAlg.cxx   | 49 +++++++++++++++++++
 Reconstruction/Jet/JetRec/src/JetRecAlg.h     | 10 +++-
 .../Jet/JetRecConfig/python/JetRecConfig.py   |  5 +-
 3 files changed, 60 insertions(+), 4 deletions(-)

diff --git a/Reconstruction/Jet/JetRec/src/JetRecAlg.cxx b/Reconstruction/Jet/JetRec/src/JetRecAlg.cxx
index 5368dde708bc..fba500de2eb5 100644
--- a/Reconstruction/Jet/JetRec/src/JetRecAlg.cxx
+++ b/Reconstruction/Jet/JetRec/src/JetRecAlg.cxx
@@ -10,6 +10,9 @@
 #include "JetInterface/IJetExecuteTool.h"
 #include "xAODJet/JetAuxContainer.h"
 
+#if !defined (GENERATIONBASE) && !defined (XAOD_STANDALONE)
+  #include "AthenaMonitoringKernel/Monitored.h"
+#endif
 
 using std::string;
 
@@ -32,6 +35,12 @@ StatusCode JetRecAlg::initialize() {
     ATH_MSG_INFO("    --> : "<< t->name());
   }
 
+  ATH_CHECK(m_output.initialize());
+
+#if !defined (GENERATIONBASE) && !defined (XAOD_STANDALONE)
+  if (!m_monTool.empty()) ATH_CHECK(m_monTool.retrieve());
+#endif
+
   return StatusCode::SUCCESS;
 }
 
@@ -50,9 +59,47 @@ StatusCode JetRecAlg::execute(const EventContext& ctx) const {
   // needn't know the type of the jet aux container
   // We can subsequently access the jets from the handle and don't have to
   // worry about memory management.
+
+#if !defined (GENERATIONBASE) && !defined (XAOD_STANDALONE)
+  auto t_total = Monitored::Timer<std::chrono::milliseconds>( "TIME_total" );
+
   SG::WriteHandle<xAOD::JetContainer> jetContHandle(m_output,ctx);
+
+  auto t_jpv = Monitored::Timer<std::chrono::microseconds>( "TIME_jetprovider" );
   ATH_CHECK( m_jetprovider->getAndRecordJets(jetContHandle) );
+  auto mon_jpv = Monitored::Group(m_monTool, t_jpv);
+
+  ATH_MSG_DEBUG("Created jet container of size "<< jetContHandle->size() << "  | writing to "<< m_output.key() );
+
+  ATH_MSG_DEBUG("Applying jet modifiers to " << m_output.key());
+
+  // Calculate moments, calibrate, sort, filter...  -----------
+  auto t_mod = Monitored::Timer<std::chrono::milliseconds>( "TIME_modifiers_total" );
+  for(const ToolHandle<IJetModifier>& t : m_modifiers){
+    std::string modname = t.name();
+    auto t_mods = Monitored::Timer<std::chrono::microseconds>( Form("TIME_modifier_%s",modname.c_str()) );
+    ATH_MSG_DEBUG("Running " << modname);
+    ATH_CHECK(t->modify(*jetContHandle));
+    auto mon_mods = Monitored::Group(m_monTool, t_mods);
+  }
+  auto mon_mod_total = Monitored::Group(m_monTool, t_mod);
+
+  // monitor jet multiplicity and basic jet kinematics
+  auto njets = Monitored::Scalar<int>("nJets");
+  auto pt    = Monitored::Collection("pt",  *jetContHandle, [c=0.001]( const xAOD::Jet* jet ) { return jet->pt()*c; });
+  auto et    = Monitored::Collection("et",  *jetContHandle, [c=0.001]( const xAOD::Jet* jet ) { return jet->p4().Et()*c; });
+  auto eta   = Monitored::Collection("eta", *jetContHandle, []( const xAOD::Jet* jet ) { return jet->eta(); });
+  auto phi   = Monitored::Collection("phi", *jetContHandle, []( const xAOD::Jet* jet ) { return jet->phi(); });
+  auto mon   = Monitored::Group(m_monTool,njets,pt,et,eta,phi);
+  njets      = jetContHandle->size();
+
+  auto mon_total = Monitored::Group(m_monTool, t_total);
 
+#else
+
+  SG::WriteHandle<xAOD::JetContainer> jetContHandle(m_output,ctx);
+
+  ATH_CHECK( m_jetprovider->getAndRecordJets(jetContHandle) );
   ATH_MSG_DEBUG("Created jet container of size "<< jetContHandle->size() << "  | writing to "<< m_output.key() );
 
   ATH_MSG_DEBUG("Applying jet modifiers to " << m_output.key());
@@ -63,6 +110,8 @@ StatusCode JetRecAlg::execute(const EventContext& ctx) const {
     ATH_CHECK(t->modify(*jetContHandle));
   }
 
+#endif
+
   return StatusCode::SUCCESS;
 
 }
diff --git a/Reconstruction/Jet/JetRec/src/JetRecAlg.h b/Reconstruction/Jet/JetRec/src/JetRecAlg.h
index 1ccd79b6e5e4..80e5229ba37b 100644
--- a/Reconstruction/Jet/JetRec/src/JetRecAlg.h
+++ b/Reconstruction/Jet/JetRec/src/JetRecAlg.h
@@ -1,6 +1,6 @@
 // this is a -*- C++ -*- file
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 ////////////////////////////////////////////////////
@@ -23,6 +23,9 @@
 #include "JetInterface/IJetProvider.h"
 #include "JetInterface/IJetModifier.h"
 
+#if !defined(GENERATIONBASE) && !defined(XAOD_ANALYSIS)
+  #include "AthenaMonitoringKernel/GenericMonitoringTool.h"
+#endif
 
 class IJetExecuteTool;
 
@@ -43,7 +46,10 @@ private:
   ToolHandle<IJetProvider> m_jetprovider ={this , "Provider" , {} , "Tool providing the jets (fastjet, copy, grooming...)"};
   ToolHandleArray<IJetModifier> m_modifiers = {this , "Modifiers", {}, "moment calculators" };
   SG::WriteHandleKey<xAOD::JetContainer> m_output= {this, "OutputContainer", "AntiKt4LCtopoJets", "The output jet container name"};
-  
+#if !defined (GENERATIONBASE) && !defined (XAOD_STANDALONE)
+  ToolHandle<GenericMonitoringTool> m_monTool{this,"MonTool","","Monitoring tool"};
+#endif
+
 }; 
 
 #endif
diff --git a/Reconstruction/Jet/JetRecConfig/python/JetRecConfig.py b/Reconstruction/Jet/JetRecConfig/python/JetRecConfig.py
index beeaf5bfbcbf..d807163ac317 100644
--- a/Reconstruction/Jet/JetRecConfig/python/JetRecConfig.py
+++ b/Reconstruction/Jet/JetRecConfig/python/JetRecConfig.py
@@ -292,7 +292,7 @@ def getJetAlgorithm(jetname, jetdef, pjContNames, monTool = None):
 # New JetRecAlgorithm to replace JetRecTool
 # This call is for a JRA that runs jet-finding
 #
-def getJetRecAlg( jetdef):
+def getJetRecAlg( jetdef, monTool = None):
     """ """
     pjContNames = jetdef._internalAtt['finalPJContainer']
     jclust = CompFactory.JetClusterer(
@@ -312,7 +312,8 @@ def getJetRecAlg( jetdef):
         "jetrecalg_"+jetname,
         Provider = jclust,
         Modifiers = mods,
-        OutputContainer = jetname)
+        OutputContainer = jetname,
+        MonTool = monTool)
 
     autoconfigureModifiers(jra.Modifiers, jetname)
 
-- 
GitLab


From db59e6f1ef704cc263f5c833f326be44c4bc5a87 Mon Sep 17 00:00:00 2001
From: Kate Whalen <kate.whalen@cern.ch>
Date: Wed, 16 Dec 2020 18:41:41 +0000
Subject: [PATCH 091/225] ATLLONECAL-338 continuing L1Calo legacy PPM
 monitoring migration

---
 .../python/PprMonitorAlgorithm.py             |  63 +++++---
 .../src/PprMonitorAlgorithm.cxx               | 150 +++++++++++++++++-
 .../src/PprMonitorAlgorithm.h                 |   7 +-
 3 files changed, 190 insertions(+), 30 deletions(-)

diff --git a/Trigger/TrigT1/TrigT1CaloMonitoring/python/PprMonitorAlgorithm.py b/Trigger/TrigT1/TrigT1CaloMonitoring/python/PprMonitorAlgorithm.py
index b08a4acf744d..4aa674810cc2 100644
--- a/Trigger/TrigT1/TrigT1CaloMonitoring/python/PprMonitorAlgorithm.py
+++ b/Trigger/TrigT1/TrigT1CaloMonitoring/python/PprMonitorAlgorithm.py
@@ -30,6 +30,9 @@ def PprMonitoringConfig(inputFlags):
     threshADC = 50
     PprMonAlg.TT_ADC_HitMap_Thresh = threshADC  # ADC cut for hit maps
  
+    sliceNo = 15
+    PprMonAlg.SliceNo = sliceNo  # Max number of timeslices in the readout
+    
     # Histogram paths
     mainDir = 'L1Calo'
     trigPath = 'PPM/'
@@ -60,25 +63,25 @@ def PprMonitoringConfig(inputFlags):
     histPath = trigPath+'/LUT-CP/Distributions'
     
     # EM distributions
-    myGroup.defineHistogram('etaTT_EM;h_ppm_em_1d_tt_lutcp_Eta', title='EM LUT-CP: Distribution of peak in #eta; #eta', type='TH1F', path=histPath, xbins=etabins, cutmask='mask_EM_cpET_0_noPhi')
+    myGroup.defineHistogram('etaTT_EM;ppm_em_1d_tt_lutcp_Eta', title='EM LUT-CP: Distribution of peak in #eta; #eta', type='TH1F', path=histPath, xbins=etabins, cutmask='mask_EM_cpET_0_noPhi')
 
-    myGroup.defineHistogram('phiTT_1d_EM;h_ppm_em_1d_tt_lutcp_Phi', title='EM LUT-CP: Distribution of peak in #phi; #phi', type='TH1F', path=histPath, xbins=phibins, xmin=phimin, xmax=phimax_1d, cutmask='mask_EM_cpET_0_phiBins')
+    myGroup.defineHistogram('phiTT_1d_EM;ppm_em_1d_tt_lutcp_Phi', title='EM LUT-CP: Distribution of peak in #phi; #phi', type='TH1F', path=histPath, xbins=phibins, xmin=phimin, xmax=phimax_1d, cutmask='mask_EM_cpET_0_phiBins')
  
-    myGroup.defineHistogram('cpET_EM;h_ppm_em_1d_tt_lutcp_Et', title='EM LUT-CP: Distribution of peak; EM LUT peak [GeV/2]', type='TH1F', path=histPath, xbins=maxEnergyRange-1, xmin=1, xmax=maxEnergyRange, cutmask='mask_EM_cpET_0_noPhi')
+    myGroup.defineHistogram('cpET_EM;ppm_em_1d_tt_lutcp_Et', title='EM LUT-CP: Distribution of peak; EM LUT peak [GeV/2]', type='TH1F', path=histPath, xbins=maxEnergyRange-1, xmin=1, xmax=maxEnergyRange, cutmask='mask_EM_cpET_0_noPhi')
 
     # HAD distributions
-    myGroup.defineHistogram('etaTT_HAD;h_ppm_had_1d_tt_lutcp_Eta', title='HAD LUT-CP: Distribution of peak in #eta; #eta', type='TH1F', path=histPath, xbins=etabins, cutmask='mask_HAD_cpET_0_noPhi')
+    myGroup.defineHistogram('etaTT_HAD;ppm_had_1d_tt_lutcp_Eta', title='HAD LUT-CP: Distribution of peak in #eta; #eta', type='TH1F', path=histPath, xbins=etabins, cutmask='mask_HAD_cpET_0_noPhi')
 
-    myGroup.defineHistogram('phiTT_1d_HAD;h_ppm_had_1d_tt_lutcp_Phi', title='HAD LUT-CP: Distribution of peak in #phi; #phi', type='TH1F', path=histPath, xbins=phibins, xmin=phimin, xmax=phimax_1d, cutmask='mask_HAD_cpET_0_phiBins')
+    myGroup.defineHistogram('phiTT_1d_HAD;ppm_had_1d_tt_lutcp_Phi', title='HAD LUT-CP: Distribution of peak in #phi; #phi', type='TH1F', path=histPath, xbins=phibins, xmin=phimin, xmax=phimax_1d, cutmask='mask_HAD_cpET_0_phiBins')
  
-    myGroup.defineHistogram('cpET_HAD;h_ppm_had_1d_tt_lutcp_Et', title='HAD LUT-CP: Distribution of peak; HAD LUT peak [GeV/2]', type='TH1F', path=histPath, xbins=maxEnergyRange-1, xmin=1, xmax=maxEnergyRange, cutmask='mask_HAD_cpET_0_noPhi')
+    myGroup.defineHistogram('cpET_HAD;ppm_had_1d_tt_lutcp_Et', title='HAD LUT-CP: Distribution of peak; HAD LUT peak [GeV/2]', type='TH1F', path=histPath, xbins=maxEnergyRange-1, xmin=1, xmax=maxEnergyRange, cutmask='mask_HAD_cpET_0_noPhi')
 
     # Eta-phi maps
     histPath = trigPath+'/LUT-CP/EtaPhiMaps'
 
-    myGroup.defineHistogram('etaTT_EM,phiTT_2d_EM,cpET_EM;h_ppm_em_2d_etaPhi_tt_lutcp_AverageEt', title='EM Average LUT-CP Et for Et > 5 GeV/2', type='TProfile2D', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_EM_cpET_5_phiBins')
+    myGroup.defineHistogram('etaTT_EM,phiTT_2d_EM,cpET_EM;ppm_em_2d_etaPhi_tt_lutcp_AverageEt', title='EM Average LUT-CP Et for Et > 5 GeV/2', type='TProfile2D', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_EM_cpET_5_phiBins')
     
-    myGroup.defineHistogram('etaTT_HAD,phiTT_2d_HAD,cpET_HAD;h_ppm_had_2d_etaPhi_tt_lutcp_AverageEt', title='HAD Average LUT-CP Et for Et > 5 GeV/2', type='TProfile2D', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_HAD_cpET_5_phiBins')
+    myGroup.defineHistogram('etaTT_HAD,phiTT_2d_HAD,cpET_HAD;ppm_had_2d_etaPhi_tt_lutcp_AverageEt', title='HAD Average LUT-CP Et for Et > 5 GeV/2', type='TProfile2D', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_HAD_cpET_5_phiBins')
 
     
     ########################   
@@ -87,25 +90,25 @@ def PprMonitoringConfig(inputFlags):
     histPath = trigPath+'/LUT-JEP/Distributions'
     
     # EM distributions
-    myGroup.defineHistogram('etaTT_EM;h_ppm_em_1d_tt_lutjep_Eta', title='EM LUT-JEP: Distribution of peak in #eta', type='TH1F', path=histPath, xbins=etabins, cutmask='mask_EM_jepET_0_noPhi')
+    myGroup.defineHistogram('etaTT_EM;ppm_em_1d_tt_lutjep_Eta', title='EM LUT-JEP: Distribution of peak in #eta', type='TH1F', path=histPath, xbins=etabins, cutmask='mask_EM_jepET_0_noPhi')
 
-    myGroup.defineHistogram('phiTT_1d_EM;h_ppm_em_1d_tt_lutjep_Phi', title='EM LUT-JEP: Distribution of peak in #phi; #phi', type='TH1F', path=histPath, xbins=phibins, xmin=phimin, xmax=phimax_1d, cutmask='mask_EM_jepET_0_phiBins')
+    myGroup.defineHistogram('phiTT_1d_EM;ppm_em_1d_tt_lutjep_Phi', title='EM LUT-JEP: Distribution of peak in #phi; #phi', type='TH1F', path=histPath, xbins=phibins, xmin=phimin, xmax=phimax_1d, cutmask='mask_EM_jepET_0_phiBins')
 
-    myGroup.defineHistogram('jepET_EM;h_ppm_em_1d_tt_lutjep_Et', title='EM LUT-JEP: Distribution of peak; EM LUT peak [GeV]', type='TH1F', path=histPath, xbins=maxEnergyRange-1, xmin=1, xmax=maxEnergyRange, cutmask='mask_EM_jepET_0_noPhi')   
+    myGroup.defineHistogram('jepET_EM;ppm_em_1d_tt_lutjep_Et', title='EM LUT-JEP: Distribution of peak; EM LUT peak [GeV]', type='TH1F', path=histPath, xbins=maxEnergyRange-1, xmin=1, xmax=maxEnergyRange, cutmask='mask_EM_jepET_0_noPhi')   
 
     # HAD distributions
-    myGroup.defineHistogram('etaTT_HAD;h_ppm_had_1d_tt_lutjep_Eta', title='HAD LUT-JEP: Distribution of peak in #eta', type='TH1F', path=histPath, xbins=etabins, cutmask='mask_HAD_jepET_0_noPhi')
+    myGroup.defineHistogram('etaTT_HAD;ppm_had_1d_tt_lutjep_Eta', title='HAD LUT-JEP: Distribution of peak in #eta', type='TH1F', path=histPath, xbins=etabins, cutmask='mask_HAD_jepET_0_noPhi')
 
-    myGroup.defineHistogram('phiTT_1d_HAD;h_ppm_had_1d_tt_lutjep_Phi', title='HAD LUT-JEP: Distribution of peak in #phi; #phi', type='TH1F', path=histPath, xbins=phibins, xmin=phimin, xmax=phimax_1d, cutmask='mask_HAD_jepET_0_phiBins')
+    myGroup.defineHistogram('phiTT_1d_HAD;ppm_had_1d_tt_lutjep_Phi', title='HAD LUT-JEP: Distribution of peak in #phi; #phi', type='TH1F', path=histPath, xbins=phibins, xmin=phimin, xmax=phimax_1d, cutmask='mask_HAD_jepET_0_phiBins')
 
-    myGroup.defineHistogram('jepET_HAD;h_ppm_had_1d_tt_lutjep_Et', title='HAD LUT-JEP: Distribution of peak; HAD LUT peak [GeV]', type='TH1F', path=histPath, xbins=maxEnergyRange-1, xmin=1, xmax=maxEnergyRange, cutmask='mask_HAD_jepET_0_noPhi')   
+    myGroup.defineHistogram('jepET_HAD;ppm_had_1d_tt_lutjep_Et', title='HAD LUT-JEP: Distribution of peak; HAD LUT peak [GeV]', type='TH1F', path=histPath, xbins=maxEnergyRange-1, xmin=1, xmax=maxEnergyRange, cutmask='mask_HAD_jepET_0_noPhi')   
 
     # Eta-phi maps
     histPath = trigPath+'/LUT-JEP/EtaPhiMaps'
 
-    myGroup.defineHistogram('etaTT_EM,phiTT_2d_EM,jepET_EM;h_ppm_em_2d_etaPhi_tt_lutjep_AverageEt', title='EM Average LUT-JEP Et for Et > 5 GeV', type='TProfile2D', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_EM_jepET_5_phiBins')
+    myGroup.defineHistogram('etaTT_EM,phiTT_2d_EM,jepET_EM;ppm_em_2d_etaPhi_tt_lutjep_AverageEt', title='EM Average LUT-JEP Et for Et > 5 GeV', type='TProfile2D', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_EM_jepET_5_phiBins')
 
-    myGroup.defineHistogram('etaTT_HAD,phiTT_2d_HAD,jepET_HAD;h_ppm_had_2d_etaPhi_tt_lutjep_AverageEt', title='HAD Average LUT-JEP Et for Et > 5 GeV', type='TProfile2D', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_HAD_jepET_5_phiBins')
+    myGroup.defineHistogram('etaTT_HAD,phiTT_2d_HAD,jepET_HAD;ppm_had_2d_etaPhi_tt_lutjep_AverageEt', title='HAD Average LUT-JEP Et for Et > 5 GeV', type='TProfile2D', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_HAD_jepET_5_phiBins')
 
 
     ####################
@@ -114,18 +117,36 @@ def PprMonitoringConfig(inputFlags):
     histPath = trigPath+'/ADC/EtaPhiMaps'
     
     # EM tower maps 
-    myGroup.defineHistogram('etaTT_EM,phiTT_2d_EM;h_ppm_em_2d_etaPhi_tt_adc_HitMap', title='#eta - #phi map of EM FADC > ' +str(threshADC)+ ' for triggered timeslice; Tower #eta; Tower #phi', type='TH2F', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_EM_timeslice') 
+    myGroup.defineHistogram('etaTT_EM,phiTT_2d_EM;ppm_em_2d_etaPhi_tt_adc_HitMap', title='#eta - #phi map of EM FADC > ' +str(threshADC)+ ' for triggered timeslice; Tower #eta; Tower #phi', type='TH2F', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_EM_timeslice') 
    
-    myGroup.defineHistogram('etaTT_EM,phiTT_2d_EM,emTT_ADC;h_ppm_em_2d_etaPhi_tt_adc_ProfileHitMap', title='#eta - #phi profile map of EM FADC > ' +str(threshADC)+ ' for triggered timeslice; Tower #eta; Tower #phi', type='TProfile2D', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_EM_timeslice') 
+    myGroup.defineHistogram('etaTT_EM,phiTT_2d_EM,emTT_ADC;ppm_em_2d_etaPhi_tt_adc_ProfileHitMap', title='#eta - #phi profile map of EM FADC > ' +str(threshADC)+ ' for triggered timeslice; Tower #eta; Tower #phi', type='TProfile2D', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_EM_timeslice') 
 
  
     # HAD tower maps 
-    myGroup.defineHistogram('etaTT_HAD,phiTT_2d_HAD;h_ppm_had_2d_etaPhi_tt_adc_HitMap', title='#eta - #phi map of HAD FADC > ' +str(threshADC)+ ' for triggered timeslice; Tower #eta; Tower #phi', type='TH2F', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_HAD_timeslice')
+    myGroup.defineHistogram('etaTT_HAD,phiTT_2d_HAD;ppm_had_2d_etaPhi_tt_adc_HitMap', title='#eta - #phi map of HAD FADC > ' +str(threshADC)+ ' for triggered timeslice; Tower #eta; Tower #phi', type='TH2F', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_HAD_timeslice')
+ 
+    myGroup.defineHistogram('etaTT_HAD,phiTT_2d_HAD,hadTT_ADC;ppm_had_2d_etaPhi_tt_adc_ProfileHitMap', title='#eta - #phi profile map of HAD FADC > ' +str(threshADC)+ ' for triggered timeslice; Tower #eta; Tower #phi', type='TProfile2D', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_HAD_timeslice')
+ 
+ 
+    # Triggered time-slice
+    histPath = trigPath+'/ADC/Timeslices'
+
+    myGroup.defineHistogram('adcPeak_EM;ppm_em_1d_tt_adc_TriggeredSlice', title='Number of the EM triggered slice; # Slice', type='TH1F', path=histPath, xbins=sliceNo, xmin=0, xmax=sliceNo, cutmask='mask_EM_noDuplicates') 
  
-    myGroup.defineHistogram('etaTT_HAD,phiTT_2d_HAD,hadTT_ADC;h_ppm_had_2d_etaPhi_tt_adc_ProfileHitMap', title='#eta - #phi profile map of HAD FADC > ' +str(threshADC)+ ' for triggered timeslice; Tower #eta; Tower #phi', type='TProfile2D', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_HAD_timeslice')
+    myGroup.defineHistogram('adcPeak_HAD;ppm_had_1d_tt_adc_TriggeredSlice', title='Number of the HAD triggered slice; # Slice', type='TH1F', path=histPath, xbins=sliceNo, xmin=0, xmax=sliceNo, cutmask='mask_HAD_noDuplicates')   
  
-  
+    myGroup.defineHistogram('maxADC_EM;ppm_em_1d_tt_adc_MaxTimeslice', title='EM distribution of maximum timeslice; slice', type='TH1D', path=histPath, xbins=sliceNo, xmin=0, xmax=sliceNo, cutmask='mask_EM_maxSlice_noPhi') 
+
+    myGroup.defineHistogram('maxADC_HAD;ppm_had_1d_tt_adc_MaxTimeslice', title='HAD distribution of maximum timeslice; slice', type='TH1D', path=histPath, xbins=sliceNo, xmin=0, xmax=sliceNo, cutmask='mask_HAD_maxSlice_noPhi') 
     
+    myGroup.defineHistogram('etaTT_EM,phiTT_2d_EM,maxADCPlus1_EM;ppm_em_2d_etaPhi_tt_adc_MaxTimeslice', title='Average maximum timeslice for EM signal (TS:1-15); Tower #eta; Tower #phi', type='TProfile2D', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_EM_maxSlice')
+
+    myGroup.defineHistogram('etaTT_HAD,phiTT_2d_HAD,maxADCPlus1_HAD;ppm_had_2d_etaPhi_tt_adc_MaxTimeslice', title='Average maximum timeslice for HAD signal (TS:1-15); Tower #eta; Tower #phi', type='TProfile2D', path=histPath, xbins=etabins, ybins=phibins, ymin=phimin, ymax=phimax_2d, cutmask='mask_HAD_maxSlice')
+
+     
+
+    # Finish up
+
     acc = helper.result()
     result.merge(acc)
     return result
diff --git a/Trigger/TrigT1/TrigT1CaloMonitoring/src/PprMonitorAlgorithm.cxx b/Trigger/TrigT1/TrigT1CaloMonitoring/src/PprMonitorAlgorithm.cxx
index 831506ae8185..93028892344e 100644
--- a/Trigger/TrigT1/TrigT1CaloMonitoring/src/PprMonitorAlgorithm.cxx
+++ b/Trigger/TrigT1/TrigT1CaloMonitoring/src/PprMonitorAlgorithm.cxx
@@ -88,6 +88,12 @@ StatusCode PprMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const
   auto jepET_EM = Monitored::Collection("jepET_EM", vecMonTT_EM, []( const auto &emTower ){return emTower.jepET;});
   variables.push_back(jepET_EM);
 
+  auto maxADC_EM = Monitored::Collection("maxADC_EM", vecMonTT_EM, []( const auto &emTower ){return emTower.maxADC;});
+  variables.push_back(maxADC_EM);
+
+  auto adcPeak_EM = Monitored::Collection("adcPeak_EM", vecMonTT_EM, []( const auto &emTower ){return emTower.tower->adcPeak();});
+  variables.push_back(adcPeak_EM);
+
   // HAD towers
   auto etaTT_HAD = Monitored::Collection("etaTT_HAD", vecMonTT_HAD, []( const auto &hadTower ){return hadTower.tower->eta();});
   variables.push_back(etaTT_HAD);
@@ -103,9 +109,19 @@ StatusCode PprMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const
 
   auto jepET_HAD = Monitored::Collection("jepET_HAD", vecMonTT_HAD, []( const auto &hadTower ){return hadTower.jepET;});
   variables.push_back(jepET_HAD);
+ 
+  auto maxADC_HAD = Monitored::Collection("maxADC_HAD", vecMonTT_HAD, []( const auto &hadTower ){return hadTower.maxADC;});
+  variables.push_back(maxADC_HAD);
+
+  auto adcPeak_HAD = Monitored::Collection("adcPeak_HAD", vecMonTT_HAD, []( const auto &hadTower ){return hadTower.tower->adcPeak();});
+  variables.push_back(adcPeak_HAD);
+
 
   // Cutmasks (EM)
+  std::vector<int> vec_EM_noDuplicates = {};
   std::vector<int> vec_EM_timeslice = {};
+  std::vector<int> vec_EM_maxSlice = {};
+  std::vector<int> vec_EM_maxSlice_noDuplicates = {};
   std::vector<int> vec_EM_cpET_0 = {};             // includes "duplicate" towers for phi maps
   std::vector<int> vec_EM_cpET_0_noDuplicates = {}; // no duplicates: for plots not binned in phi
   std::vector<int> vec_EM_cpET_5 = {};
@@ -118,6 +134,9 @@ StatusCode PprMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const
   // Weights
   std::vector<int> vec_EM_ADC = {};
 
+  // For average ADC plots
+  std::vector<double> vec_EM_maxADCPlus1 = {};
+
 
   for (auto& emTower : vecMonTT_EM) {
   
@@ -129,6 +148,7 @@ StatusCode PprMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const
     ATH_MSG_DEBUG("cpET: " << cpET << " jepET: " << jepET);
 
     // Fill the cutmasks for EM LUT-CP and LUT-JEP energy distributions 
+    vec_EM_noDuplicates.push_back(!isDuplicate);
     vec_EM_cpET_0.push_back(cpET > 0);                                  // For phi distributions / maps
     vec_EM_cpET_0_noDuplicates.push_back((cpET > 0) && !isDuplicate);   // For plots not binned in phi
     vec_EM_cpET_5.push_back(cpET > 5);
@@ -155,12 +175,21 @@ StatusCode PprMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const
       vec_EM_timeslice.push_back(0);
       vec_EM_ADC.push_back(0);
     }
-    ATH_MSG_DEBUG(" mask: " << vec_EM_timeslice.back());
-   
+  
+    // -------- Timing of FADC signal --------
+    
+    double max = emTower.maxADC;
+    vec_EM_maxSlice.push_back(max >= 0.);
+    vec_EM_maxSlice_noDuplicates.push_back((max >= 0.) && !isDuplicate);
+    vec_EM_maxADCPlus1.push_back(max + 1.);
+ 
   } // End loop over vector of EM towers 
 
   // Cutmasks (HAD)
+  std::vector<int> vec_HAD_noDuplicates = {};
   std::vector<int> vec_HAD_timeslice = {};
+  std::vector<int> vec_HAD_maxSlice = {};
+  std::vector<int> vec_HAD_maxSlice_noDuplicates = {};
   std::vector<int> vec_HAD_cpET_0 = {};             // includes "duplicate" towers for phi maps
   std::vector<int> vec_HAD_cpET_0_noDuplicates = {}; // no duplicates: for plots not binned in phi
   std::vector<int> vec_HAD_cpET_5 = {};
@@ -174,6 +203,9 @@ StatusCode PprMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const
   // HAD weights 
   std::vector<int> vec_HAD_ADC = {};
 
+  // For average ADC plots 
+  std::vector<double> vec_HAD_maxADCPlus1 = {};
+
   for (auto& hadTower : vecMonTT_HAD) {
 
     // -------- LUT --------
@@ -184,6 +216,7 @@ StatusCode PprMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const
     if (cpET > 0) ATH_MSG_DEBUG("HAD tower cpET: " << cpET << " jepET: " << jepET);
 
     // Fill the cutmasks for HAD LUT-CP and LUT-JEP energy distributions 
+    vec_HAD_noDuplicates.push_back(!isDuplicate);
     vec_HAD_cpET_0.push_back(cpET > 0);                                  // For phi distributions / maps
     vec_HAD_cpET_0_noDuplicates.push_back((cpET > 0) && !isDuplicate);   // For plots not binned in phi
     vec_HAD_cpET_5.push_back(cpET > 5);
@@ -211,13 +244,37 @@ StatusCode PprMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const
     }
     ATH_MSG_DEBUG(" mask: " << vec_HAD_timeslice.back());
 
+    // -------- Timing of FADC signal --------
+
+    double max = hadTower.maxADC;
+    vec_HAD_maxSlice.push_back(max >= 0.);
+    vec_HAD_maxSlice_noDuplicates.push_back((max >= 0.) && !isDuplicate);
+    vec_HAD_maxADCPlus1.push_back(max + 1.);
+
   } // End loop over vector of HAD towers 
+ 
   
+  // Define additional monitored variables (EM) 
+  auto maxADCPlus1_EM = Monitored::Collection("maxADCPlus1_EM", vec_EM_maxADCPlus1);
+  variables.push_back(maxADCPlus1_EM);
+
+  // Define additional monitored variables (HAD)
+  auto maxADCPlus1_HAD = Monitored::Collection("maxADCPlus1_HAD", vec_HAD_maxADCPlus1);
+  variables.push_back(maxADCPlus1_HAD);
 
   // Define the cutmasks (EM)
+  auto mask_EM_noDuplicates = Monitored::Collection("mask_EM_noDuplicates", vec_EM_noDuplicates);
+  variables.push_back(mask_EM_noDuplicates);  
+
   auto mask_EM_timeslice = Monitored::Collection("mask_EM_timeslice", vec_EM_timeslice);
   variables.push_back(mask_EM_timeslice);
-  
+ 
+  auto mask_EM_maxSlice = Monitored::Collection("mask_EM_maxSlice", vec_EM_maxSlice);
+  variables.push_back(mask_EM_maxSlice);
+ 
+  auto mask_EM_maxSlice_noPhi = Monitored::Collection("mask_EM_maxSlice_noPhi", vec_EM_maxSlice_noDuplicates);
+  variables.push_back(mask_EM_maxSlice_noPhi); 
+
   auto emTT_ADC = Monitored::Collection("emTT_ADC", vec_EM_ADC);
   variables.push_back(emTT_ADC);
 
@@ -247,9 +304,18 @@ StatusCode PprMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const
 
 
   // Define the cutmasks (HAD)
+  auto mask_HAD_noDuplicates = Monitored::Collection("mask_HAD_noDuplicates", vec_HAD_noDuplicates);
+  variables.push_back(mask_HAD_noDuplicates);
+
   auto mask_HAD_timeslice = Monitored::Collection("mask_HAD_timeslice", vec_HAD_timeslice);
   variables.push_back(mask_HAD_timeslice);
 
+  auto mask_HAD_maxSlice = Monitored::Collection("mask_HAD_maxSlice", vec_HAD_maxSlice);
+  variables.push_back(mask_HAD_maxSlice);
+
+  auto mask_HAD_maxSlice_noPhi = Monitored::Collection("mask_HAD_maxSlice_noPhi", vec_HAD_maxSlice_noDuplicates);
+  variables.push_back(mask_HAD_maxSlice_noPhi);
+
   auto hadTT_ADC = Monitored::Collection("hadTT_ADC", vec_HAD_ADC);
   variables.push_back(hadTT_ADC);
 
@@ -288,17 +354,25 @@ StatusCode PprMonitorAlgorithm::fillPPMTowerEtaPhi( const xAOD::TriggerTower_v2*
                                                     std::vector<MonitorTT> &vecMonTT_HAD,  
                                                     std::vector<MonitorTT> &vecMonTT) const
 {
-
+  // Geometry
   const int layer = tt->layer(); // 0 = EM, 1 = HAD
   const double eta = tt->eta();
   const double absEta = std::fabs(eta);
   const double phi = tt->phi();
   double phiMod = phi * m_phiScaleTT;
+  
+  // LUT JEP
   int jepET = 0;
   const std::vector<uint_least8_t> jepETvec = tt->lut_jep();
   if (jepETvec.size() > 0) jepET = tt->jepET();
+  
+  // To remove duplicates when filling multiple bins in phi
   bool isDuplicate = false; 
  
+  // ADC timeslice
+  const std::vector<short unsigned int> &ADC( tt->adc() );
+  double max = recTime(ADC, m_EMFADCCut); 
+  
   // Offsets for filling multiple phi bins depending on TT granularity in eta
   std::vector<double> offset32 = {1.5, 0.5, -0.5, -1.5};
   std::vector<double> offset25 = {0.5, -0.5};  
@@ -318,12 +392,13 @@ StatusCode PprMonitorAlgorithm::fillPPMTowerEtaPhi( const xAOD::TriggerTower_v2*
       monTT.jepET = jepET;
       if(i != 0) isDuplicate = true;
       monTT.isDuplicate = isDuplicate;   
-      
+      monTT.maxADC = max;     
+ 
       vecMonTT.push_back(monTT);
       if (layer == 0) vecMonTT_EM.push_back(monTT);
       if (layer == 1) vecMonTT_HAD.push_back(monTT);
       
-      ATH_MSG_DEBUG("layer: " << layer << " eta: " << eta << " phi: " << phi << " scaled phi: " << monTT.phiScaled << " 1d phi: " << phi1d << " duplicate: " << monTT.isDuplicate);
+      ATH_MSG_DEBUG("layer: " << layer << " eta: " << eta << " phi: " << phi << " scaled phi: " << monTT.phiScaled << " 1d phi: " << phi1d << " max: " << max <<  " duplicate: " << monTT.isDuplicate);
     }
   }
   else if (absEta > 2.5) {
@@ -337,11 +412,12 @@ StatusCode PprMonitorAlgorithm::fillPPMTowerEtaPhi( const xAOD::TriggerTower_v2*
       monTT.jepET = jepET;
       if(i != 0) isDuplicate = true;
       monTT.isDuplicate = isDuplicate;
+      monTT.maxADC = max;
 
       vecMonTT.push_back(monTT);
       if (layer == 0) vecMonTT_EM.push_back(monTT);
       if (layer == 1) vecMonTT_HAD.push_back(monTT);
-      ATH_MSG_DEBUG("layer: " << layer << " eta: " << eta << " phi: " << phi << " scaled phi: " << monTT.phiScaled << " 1d phi: " << phi1d << " duplicate: " << monTT.isDuplicate);
+      ATH_MSG_DEBUG("layer: " << layer << " eta: " << eta << " phi: " << phi << " scaled phi: " << monTT.phiScaled << " 1d phi: " << phi1d << " max: " << max << " duplicate: " << monTT.isDuplicate);
     }
   }
   else {
@@ -352,11 +428,69 @@ StatusCode PprMonitorAlgorithm::fillPPMTowerEtaPhi( const xAOD::TriggerTower_v2*
     monTT.phi1d = phi;
     monTT.jepET = jepET;
     monTT.isDuplicate = false;
+    monTT.maxADC = max;
+
     vecMonTT.push_back(monTT);
     if (layer == 0) vecMonTT_EM.push_back(monTT);
     if (layer == 1) vecMonTT_HAD.push_back(monTT);
-    ATH_MSG_DEBUG("layer: " << layer << " eta: " << eta << " phi: " << phi << " scaled phi: " << monTT.phiScaled << " 1d phi: " << phi1d << " duplicate: " << monTT.isDuplicate);
+    ATH_MSG_DEBUG("layer: " << layer << " eta: " << eta << " phi: " << phi << " scaled phi: " << monTT.phiScaled << " 1d phi: " << phi1d << " max: " << max << " duplicate: " << monTT.isDuplicate);
   }   
     
   return StatusCode::SUCCESS; 
 }
+
+double PprMonitorAlgorithm::recTime(const std::vector<short unsigned int> &vFADC, int cut) const {
+
+  int max = -1;
+  const int slices = vFADC.size();
+  if (slices > 0) {
+    max = 0.;
+    int maxAdc = vFADC[0];
+    for (int sl = 1; sl < slices; ++sl) {
+      if (vFADC[sl] > maxAdc) {
+        maxAdc = vFADC[sl];
+        max = sl;
+      } else if (vFADC[sl] == maxAdc)
+        max = -1;
+    }
+    if (maxAdc == 0)
+      max = -1;
+  }
+  if (max >= 0) {
+    int slbeg = max - 2;
+    if (slbeg < 0)
+      slbeg = 0;
+    int slend = max + 3;
+    if (slend > slices)
+      slend = slices;
+    int sum = 0;
+    int min = 999999;
+    for (int sl = slbeg; sl < slend; ++sl) {
+      int val = vFADC[sl];
+      if (val < m_TT_ADC_Pedestal)
+        val = m_TT_ADC_Pedestal;
+      sum += val;
+      if (val < min)
+        min = val;
+    }
+    sum -= (slend - slbeg) * min;
+    if (sum <= cut)
+      max = -1;
+  }
+
+  return double(max);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Trigger/TrigT1/TrigT1CaloMonitoring/src/PprMonitorAlgorithm.h b/Trigger/TrigT1/TrigT1CaloMonitoring/src/PprMonitorAlgorithm.h
index 8e2d10fc6acc..1e387d67de80 100644
--- a/Trigger/TrigT1/TrigT1CaloMonitoring/src/PprMonitorAlgorithm.h
+++ b/Trigger/TrigT1/TrigT1CaloMonitoring/src/PprMonitorAlgorithm.h
@@ -21,6 +21,7 @@ public:PprMonitorAlgorithm( const std::string& name, ISvcLocator* pSvcLocator );
     double phi1d;     /// phi for 1d phi distributions (taking into account granularity in eta) 
     int jepET;
     bool isDuplicate; /// Bookkeeping of multiple bins in phi for a given eta bin in the forward region 
+    double maxADC;    /// max ADC timeslice
   };
 
 
@@ -35,7 +36,9 @@ private:
   /// Properties
   Gaudi::Property<double> m_phiScaleTT{this, "phiScaleTT", 32./M_PI, "Scale factor to convert trigger tower phi to integer binning"};
   Gaudi::Property<int> m_TT_ADC_HitMap_Thresh{this, "TT_ADC_HitMap_Thresh", 50, "ADC cut for hit maps"};
-
+  Gaudi::Property<int> m_SliceNo{this, "SliceNo", 15, "Number of possible time slices in the readout"};
+  Gaudi::Property<int> m_EMFADCCut{this, "EMFADCCut", 40, "EM FADC cut for signal"};
+  Gaudi::Property<int> m_TT_ADC_Pedestal{this, "ADCPedestal", 32, "Nominal pedestal value"};
 
   /// Helper functions
   StatusCode fillPPMTowerEtaPhi( const xAOD::TriggerTower_v2* tt, 
@@ -43,5 +46,7 @@ private:
                                std::vector<MonitorTT> &vecMonTT_HAD,  
                                std::vector<MonitorTT> &vecMonTT) const;
 
+  double recTime(const std::vector<short unsigned int> &vFADC, int cut) const;
+
 };
 #endif
-- 
GitLab


From 83fc290e518c06ef0863671bafb8c3dd038e7193 Mon Sep 17 00:00:00 2001
From: Marco Valente <marco.valente@cern.ch>
Date: Wed, 16 Dec 2020 18:42:09 +0000
Subject: [PATCH 092/225] Updating efficiency reference chains from
 HLT_j80_L1J15 to HLT_j85_L1J20 in jet trigger monitoring tool

---
 .../python/TrigJetMonitorAlgorithm.py         |  23 ++--
 .../share/ref_RDOtoRDOTrig_v1Dev_build.ref    |  66 +++++-----
 .../share/ref_data_v1Dev_build.ref            | 120 +++++++++---------
 .../python/HLTMenuConfig/Menu/LS2_v1.py       |  26 ++--
 4 files changed, 118 insertions(+), 117 deletions(-)

diff --git a/Trigger/TrigMonitoring/TrigJetMonitoring/python/TrigJetMonitorAlgorithm.py b/Trigger/TrigMonitoring/TrigJetMonitoring/python/TrigJetMonitorAlgorithm.py
index f118878e94cc..1519f1a4e54e 100644
--- a/Trigger/TrigMonitoring/TrigJetMonitoring/python/TrigJetMonitorAlgorithm.py
+++ b/Trigger/TrigMonitoring/TrigJetMonitoring/python/TrigJetMonitorAlgorithm.py
@@ -61,20 +61,21 @@ Chain2JetCollDict['MT'] = {
   'HLT_j460_a10_lcw_subjes_L1J100'         : 'HLT_AntiKt10LCTopoJets_subjes',
   'HLT_j460_a10t_lcw_jes_L1J100'           : 'HLT_AntiKt10LCTopoTrimmedPtFrac4SmallR20Jets_jes',
   'HLT_2j330_a10t_lcw_jes_35smcINF_L1J100' : 'HLT_AntiKt10LCTopoTrimmedPtFrac4SmallR20Jets_jes',
-  'HLT_j45_pf_ftf_L1J20'                   : 'HLT_AntiKt4EMPFlowJets_subjesIS_ftf',
-  'HLT_j45_pf_subjesgscIS_ftf_L1J20'       : 'HLT_AntiKt4EMPFlowJets_subjesgscIS_ftf',
+  'HLT_j45_pf_ftf_L1J15'                   : 'HLT_AntiKt4EMPFlowJets_subjesIS_ftf',
+  'HLT_j45_pf_subjesgscIS_ftf_L1J15'       : 'HLT_AntiKt4EMPFlowJets_subjesgscIS_ftf',
   'HLT_j85_pf_ftf_L1J20'                   : 'HLT_AntiKt4EMPFlowJets_subjesIS_ftf',
-  'HLT_j45_pf_nojcalib_ftf_L1J20'          : 'HLT_AntiKt4EMPFlowJets_nojcalib_ftf',
-  'HLT_j45_csskpf_nojcalib_ftf_L1J20'      : 'HLT_AntiKt4EMPFlowCSSKJets_nojcalib_ftf',
+  'HLT_j45_pf_nojcalib_ftf_L1J15'          : 'HLT_AntiKt4EMPFlowJets_nojcalib_ftf',
+  'HLT_j45_csskpf_nojcalib_ftf_L1J15'      : 'HLT_AntiKt4EMPFlowCSSKJets_nojcalib_ftf',
+  'HLT_10j40_pf_subresjesgscIS_ftf_L14J15' : 'HLT_AntiKt4EMPFlowJets_subresjesgscIS_ftf',
 }
 TurnOnCurves['MT'] = { # ref chain, offline jet coll
-  'HLT_j420_L1J100'                        : ['HLT_j80_L1J15','AntiKt4EMTopoJets'],
-  'HLT_3j200_L1J100'                       : ['HLT_j80_L1J15','AntiKt4EMTopoJets'],
-  'HLT_j460_a10r_L1J100'                   : ['HLT_j80_L1J15','AntiKt4EMTopoJets'],
-  'HLT_j460_a10_lcw_subjes_L1J100'         : ['HLT_j80_L1J15','AntiKt4EMTopoJets'],
-  'HLT_j460_a10t_lcw_jes_L1J100'           : ['HLT_j80_L1J15','AntiKt4EMTopoJets'],
-  'HLT_2j330_a10t_lcw_jes_35smcINF_L1J100' : ['HLT_j80_L1J15','AntiKt4EMTopoJets'],
-  'HLT_j85_pf_ftf_L1J20'                   : ['HLT_j45_pf_ftf_L1J20','AntiKt4EMPFlowJets'],
+  'HLT_j420_L1J100'                        : ['HLT_j85_L1J20','AntiKt4EMTopoJets'],
+  'HLT_3j200_L1J100'                       : ['HLT_j85_L1J20','AntiKt4EMTopoJets'],
+  'HLT_j460_a10r_L1J100'                   : ['HLT_j85_L1J20','AntiKt4EMTopoJets'],
+  'HLT_j460_a10_lcw_subjes_L1J100'         : ['HLT_j85_L1J20','AntiKt4EMTopoJets'],
+  'HLT_j460_a10t_lcw_jes_L1J100'           : ['HLT_j85_L1J20','AntiKt4EMTopoJets'],
+  'HLT_2j330_a10t_lcw_jes_35smcINF_L1J100' : ['HLT_j85_L1J20','AntiKt4EMTopoJets'],
+  'HLT_j85_pf_ftf_L1J20'                   : ['HLT_j45_pf_ftf_L1J15','AntiKt4EMPFlowJets'],
 }
 JetColls2Match['MT'] = {
   'HLT_AntiKt4EMTopoJets_subjesIS'            : 'AntiKt4EMPFlowJets',
diff --git a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
index c8d782b99bf8..a03ea076bb98 100644
--- a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
+++ b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
@@ -1570,15 +1570,15 @@ HLT_j420_subresjesgscIS_ftf_L1J100:
     0: 3
 HLT_j45_L1J15:
   eventCount: 0
-HLT_j45_csskpf_nojcalib_ftf_L1J20:
+HLT_j45_csskpf_nojcalib_ftf_L1J15:
   eventCount: 17
   stepCounts:
-    0: 19
+    0: 20
     1: 17
   stepFeatures:
-    0: 19
+    0: 20
     1: 37
-HLT_j45_cssktc_nojcalib_L1J20:
+HLT_j45_cssktc_nojcalib_L1J15:
   eventCount: 15
   stepCounts:
     0: 15
@@ -1592,75 +1592,75 @@ HLT_j45_ftf_L1J15:
   stepFeatures:
     0: 20
     1: 55
-HLT_j45_ftf_preselj20_L1J20:
+HLT_j45_ftf_preselj20_L1J15:
   eventCount: 19
   stepCounts:
-    0: 19
+    0: 20
     1: 19
   stepFeatures:
-    0: 19
+    0: 20
     1: 55
-HLT_j45_nojcalib_L1J20:
+HLT_j45_nojcalib_L1J15:
   eventCount: 17
   stepCounts:
     0: 17
   stepFeatures:
     0: 39
-HLT_j45_pf_ftf_010jvt_L1J20:
+HLT_j45_pf_ftf_010jvt_L1J15:
   eventCount: 19
   stepCounts:
-    0: 19
+    0: 20
     1: 19
   stepFeatures:
-    0: 19
+    0: 20
     1: 55
-HLT_j45_pf_ftf_020jvt_L1J20:
+HLT_j45_pf_ftf_020jvt_L1J15:
   eventCount: 19
   stepCounts:
-    0: 19
+    0: 20
     1: 19
   stepFeatures:
-    0: 19
+    0: 20
     1: 54
-HLT_j45_pf_ftf_050jvt_L1J20:
+HLT_j45_pf_ftf_050jvt_L1J15:
   eventCount: 19
   stepCounts:
-    0: 19
+    0: 20
     1: 19
   stepFeatures:
-    0: 19
+    0: 20
     1: 54
-HLT_j45_pf_ftf_L1J20:
+HLT_j45_pf_ftf_L1J15:
   eventCount: 19
   stepCounts:
-    0: 19
+    0: 20
     1: 19
   stepFeatures:
-    0: 19
+    0: 20
     1: 56
-HLT_j45_pf_ftf_preselj20_L1J20:
+HLT_j45_pf_ftf_preselj20_L1J15:
   eventCount: 19
   stepCounts:
-    0: 19
+    0: 20
     1: 19
   stepFeatures:
-    0: 19
+    0: 20
     1: 56
-HLT_j45_pf_nojcalib_ftf_L1J20:
+HLT_j45_pf_nojcalib_ftf_L1J15:
   eventCount: 18
   stepCounts:
-    0: 19
+    0: 20
     1: 18
   stepFeatures:
-    0: 19
+    0: 20
     1: 49
-HLT_j45_pf_subjesgscIS_ftf_L1J20:
+HLT_j45_pf_subjesgscIS_ftf_L1J15:
   eventCount: 19
   stepCounts:
-    0: 19
+    0: 20
     1: 19
   stepFeatures:
-    0: 19
+    0: 20
     1: 52
 HLT_j45_pf_subjesgscIS_ftf_bdl1r70_split_L1J20:
   eventCount: 13
@@ -1682,19 +1682,19 @@ HLT_j45_pf_subjesgscIS_ftf_boffperf_split_L1J20:
     0: 19
     1: 49
     2: 49
-HLT_j45_sktc_nojcalib_L1J20:
+HLT_j45_sktc_nojcalib_L1J15:
   eventCount: 15
   stepCounts:
     0: 15
   stepFeatures:
     0: 26
-HLT_j45_subjesIS_ftf_preselj20_L1J20:
+HLT_j45_subjesIS_ftf_preselj20_L1J15:
   eventCount: 19
   stepCounts:
-    0: 19
+    0: 20
     1: 19
   stepFeatures:
-    0: 19
+    0: 20
     1: 50
 HLT_j45_subjesgscIS_ftf_011jvt_L1J15:
   eventCount: 18
diff --git a/Trigger/TrigValidation/TriggerTest/share/ref_data_v1Dev_build.ref b/Trigger/TrigValidation/TriggerTest/share/ref_data_v1Dev_build.ref
index f55a38a8f6e3..c1eabba4e8bb 100644
--- a/Trigger/TrigValidation/TriggerTest/share/ref_data_v1Dev_build.ref
+++ b/Trigger/TrigValidation/TriggerTest/share/ref_data_v1Dev_build.ref
@@ -738,15 +738,15 @@ HLT_j45_L1J15:
     0: 6
   stepFeatures:
     0: 6
-HLT_j45_csskpf_nojcalib_ftf_L1J20:
+HLT_j45_csskpf_nojcalib_ftf_L1J15:
   eventCount: 3
   stepCounts:
-    0: 5
+    0: 7
     1: 3
   stepFeatures:
-    0: 5
+    0: 7
     1: 3
-HLT_j45_cssktc_nojcalib_L1J20:
+HLT_j45_cssktc_nojcalib_L1J15:
   eventCount: 3
   stepCounts:
     0: 3
@@ -760,76 +760,76 @@ HLT_j45_ftf_L1J15:
   stepFeatures:
     0: 7
     1: 7
-HLT_j45_ftf_preselj20_L1J20:
-  eventCount: 5
+HLT_j45_ftf_preselj20_L1J15:
+  eventCount: 7
   stepCounts:
-    0: 5
-    1: 5
+    0: 7
+    1: 7
   stepFeatures:
-    0: 5
-    1: 5
-HLT_j45_nojcalib_L1J20:
+    0: 7
+    1: 7
+HLT_j45_nojcalib_L1J15:
   eventCount: 3
   stepCounts:
     0: 3
   stepFeatures:
     0: 3
-HLT_j45_pf_ftf_010jvt_L1J20:
-  eventCount: 5
+HLT_j45_pf_ftf_010jvt_L1J15:
+  eventCount: 7
   stepCounts:
-    0: 5
-    1: 5
+    0: 7
+    1: 7
   stepFeatures:
-    0: 5
-    1: 5
-HLT_j45_pf_ftf_020jvt_L1J20:
-  eventCount: 5
+    0: 7
+    1: 7
+HLT_j45_pf_ftf_020jvt_L1J15:
+  eventCount: 7
   stepCounts:
-    0: 5
-    1: 5
+    0: 7
+    1: 7
   stepFeatures:
-    0: 5
-    1: 5
-HLT_j45_pf_ftf_050jvt_L1J20:
-  eventCount: 5
+    0: 7
+    1: 7
+HLT_j45_pf_ftf_050jvt_L1J15:
+  eventCount: 7
   stepCounts:
-    0: 5
-    1: 5
+    0: 7
+    1: 7
   stepFeatures:
-    0: 5
-    1: 5
-HLT_j45_pf_ftf_L1J20:
-  eventCount: 5
+    0: 7
+    1: 7
+HLT_j45_pf_ftf_L1J15:
+  eventCount: 7
   stepCounts:
-    0: 5
-    1: 5
+    0: 7
+    1: 7
   stepFeatures:
-    0: 5
-    1: 5
-HLT_j45_pf_ftf_preselj20_L1J20:
-  eventCount: 5
+    0: 7
+    1: 7
+HLT_j45_pf_ftf_preselj20_L1J15:
+  eventCount: 7
   stepCounts:
-    0: 5
-    1: 5
+    0: 7
+    1: 7
   stepFeatures:
-    0: 5
-    1: 5
-HLT_j45_pf_nojcalib_ftf_L1J20:
-  eventCount: 3
+    0: 7
+    1: 7
+HLT_j45_pf_nojcalib_ftf_L1J15:
+  eventCount: 4
   stepCounts:
-    0: 5
-    1: 3
+    0: 7
+    1: 4
   stepFeatures:
-    0: 5
-    1: 3
-HLT_j45_pf_subjesgscIS_ftf_L1J20:
-  eventCount: 5
+    0: 7
+    1: 4
+HLT_j45_pf_subjesgscIS_ftf_L1J15:
+  eventCount: 6
   stepCounts:
-    0: 5
-    1: 5
+    0: 7
+    1: 6
   stepFeatures:
-    0: 5
-    1: 5
+    0: 7
+    1: 6
 HLT_j45_pf_subjesgscIS_ftf_bdl1r70_split_L1J20:
   eventCount: 0
   stepCounts:
@@ -848,20 +848,20 @@ HLT_j45_pf_subjesgscIS_ftf_boffperf_split_L1J20:
     0: 5
     1: 5
     2: 5
-HLT_j45_sktc_nojcalib_L1J20:
+HLT_j45_sktc_nojcalib_L1J15:
   eventCount: 3
   stepCounts:
     0: 3
   stepFeatures:
     0: 3
-HLT_j45_subjesIS_ftf_preselj20_L1J20:
-  eventCount: 5
+HLT_j45_subjesIS_ftf_preselj20_L1J15:
+  eventCount: 6
   stepCounts:
-    0: 5
-    1: 5
+    0: 7
+    1: 6
   stepFeatures:
-    0: 5
-    1: 5
+    0: 7
+    1: 6
 HLT_j45_subjesgscIS_ftf_011jvt_L1J15:
   eventCount: 6
   stepCounts:
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
index 11510d8b227a..57e8bdd7ebff 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
@@ -236,21 +236,21 @@ def setupMenu():
         ChainProp(name='HLT_j45_ftf_L1J15', groups=SingleJetGroup),
         ChainProp(name='HLT_j85_ftf_L1J20', groups=SingleJetGroup),
 
-        ChainProp(name='HLT_j45_pf_ftf_L1J20', groups=SingleJetGroup),
-        ChainProp(name='HLT_j45_pf_ftf_010jvt_L1J20', groups=SingleJetGroup),
-        ChainProp(name='HLT_j45_pf_ftf_020jvt_L1J20', groups=SingleJetGroup),
-        ChainProp(name='HLT_j45_pf_ftf_050jvt_L1J20', groups=SingleJetGroup),
-        ChainProp(name='HLT_j45_pf_ftf_preselj20_L1J20', groups=SingleJetGroup),
-        ChainProp(name='HLT_j45_ftf_preselj20_L1J20', groups=SingleJetGroup),
-        ChainProp(name='HLT_j45_subjesIS_ftf_preselj20_L1J20', groups=SingleJetGroup),
-        ChainProp(name='HLT_j45_pf_subjesgscIS_ftf_L1J20', groups=SingleJetGroup),
+        ChainProp(name='HLT_j45_pf_ftf_L1J15', groups=SingleJetGroup),
+        ChainProp(name='HLT_j45_pf_ftf_010jvt_L1J15', groups=SingleJetGroup),
+        ChainProp(name='HLT_j45_pf_ftf_020jvt_L1J15', groups=SingleJetGroup),
+        ChainProp(name='HLT_j45_pf_ftf_050jvt_L1J15', groups=SingleJetGroup),
+        ChainProp(name='HLT_j45_pf_ftf_preselj20_L1J15', groups=SingleJetGroup),
+        ChainProp(name='HLT_j45_ftf_preselj20_L1J15', groups=SingleJetGroup),
+        ChainProp(name='HLT_j45_subjesIS_ftf_preselj20_L1J15', groups=SingleJetGroup),
+        ChainProp(name='HLT_j45_pf_subjesgscIS_ftf_L1J15', groups=SingleJetGroup),
         ChainProp(name='HLT_j85_pf_ftf_L1J20', groups=SingleJetGroup),
 
-        ChainProp(name='HLT_j45_nojcalib_L1J20', groups=SingleJetGroup),
-        ChainProp(name='HLT_j45_sktc_nojcalib_L1J20', groups=SingleJetGroup),
-        ChainProp(name='HLT_j45_cssktc_nojcalib_L1J20', groups=SingleJetGroup),
-        ChainProp(name='HLT_j45_pf_nojcalib_ftf_L1J20', groups=SingleJetGroup),
-        ChainProp(name='HLT_j45_csskpf_nojcalib_ftf_L1J20', groups=SingleJetGroup),
+        ChainProp(name='HLT_j45_nojcalib_L1J15', groups=SingleJetGroup),
+        ChainProp(name='HLT_j45_sktc_nojcalib_L1J15', groups=SingleJetGroup),
+        ChainProp(name='HLT_j45_cssktc_nojcalib_L1J15', groups=SingleJetGroup),
+        ChainProp(name='HLT_j45_pf_nojcalib_ftf_L1J15', groups=SingleJetGroup),
+        ChainProp(name='HLT_j45_csskpf_nojcalib_ftf_L1J15', groups=SingleJetGroup),
 
         ChainProp(name='HLT_j260_320eta490_L1J20', groups=['Online',SingleJetGroup]),
 
-- 
GitLab


From 3ffcacebf31dfef72ed848ac3bf4206a951a3749 Mon Sep 17 00:00:00 2001
From: Stewart Martin-Haugh <stewart.martin-haugh@cern.ch>
Date: Wed, 16 Dec 2020 18:47:35 +0000
Subject: [PATCH 093/225] Remove RegSelSvc import after migration to RegSelTool
 (ATR-21931)

---
 Trigger/TrigAlgorithms/TrigT2CaloCommon/python/CaloDef.py | 7 -------
 1 file changed, 7 deletions(-)

diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/CaloDef.py b/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/CaloDef.py
index a0cd4ffdc044..26ad25afc2df 100644
--- a/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/CaloDef.py
+++ b/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/CaloDef.py
@@ -11,13 +11,6 @@ def setMinimalCaloSetup() :
     from TrigT2CaloCommon.TrigT2CaloCommonConfig import TrigCaloDataAccessSvc
     svcMgr+=TrigCaloDataAccessSvc()
     svcMgr.TrigCaloDataAccessSvc.OutputLevel=ERROR
-  if not hasattr(svcMgr,'RegSelSvcDefault'):
-    from RegionSelector.RegSelSvcDefault import RegSelSvcDefault
-    regsel = RegSelSvcDefault()
-    regsel.enableCalo = True
-    svcMgr += regsel
-
-
 
 ########################
 ## ALGORITHMS
-- 
GitLab


From 434a5b6ea739059ccb26c2cf33922127c7f787f6 Mon Sep 17 00:00:00 2001
From: Peter van Gemmeren <gemmeren@anl.gov>
Date: Wed, 16 Dec 2020 15:42:31 -0600
Subject: [PATCH 094/225] Make SharedReader configurable in StandAlone mode,
 outside AthenaMP.

---
 Control/AthenaKernel/AthenaKernel/IDataShare.h    |  2 +-
 .../AthenaPoolCnvSvc/IAthenaPoolCnvSvc.h          |  2 +-
 .../AthenaPoolCnvSvc/src/AthenaPoolCnvSvc.cxx     | 15 +++++++++++++--
 .../AthenaPoolCnvSvc/src/AthenaPoolCnvSvc.h       |  4 ++--
 .../test/T_AthenaPoolAuxContainerCnv_test.cxx     |  2 +-
 .../test/T_AthenaPoolTPCnvCnv_test.cxx            |  2 +-
 .../test/T_AthenaPoolViewVectorCnv_test.cxx       |  2 +-
 .../test/T_AthenaPoolxAODCnv_test.cxx             |  2 +-
 .../AthenaPoolCnvSvc/test/TestCnvSvcBase.icc      |  2 +-
 .../src/EventSelectorAthenaPool.cxx               | 14 ++++++++++++++
 .../src/EventSelectorAthenaPool.h                 |  2 ++
 11 files changed, 38 insertions(+), 11 deletions(-)

diff --git a/Control/AthenaKernel/AthenaKernel/IDataShare.h b/Control/AthenaKernel/AthenaKernel/IDataShare.h
index d3921bccf338..81c244bdd7d4 100644
--- a/Control/AthenaKernel/AthenaKernel/IDataShare.h
+++ b/Control/AthenaKernel/AthenaKernel/IDataShare.h
@@ -49,7 +49,7 @@ public:
   /**
    * @brief Read the data
    */
-  virtual StatusCode readData() const = 0;
+  virtual StatusCode readData() = 0;
 };
 
 
diff --git a/Database/AthenaPOOL/AthenaPoolCnvSvc/AthenaPoolCnvSvc/IAthenaPoolCnvSvc.h b/Database/AthenaPOOL/AthenaPoolCnvSvc/AthenaPoolCnvSvc/IAthenaPoolCnvSvc.h
index 99284d0f0030..3ba23ed77023 100644
--- a/Database/AthenaPOOL/AthenaPoolCnvSvc/AthenaPoolCnvSvc/IAthenaPoolCnvSvc.h
+++ b/Database/AthenaPOOL/AthenaPoolCnvSvc/AthenaPoolCnvSvc/IAthenaPoolCnvSvc.h
@@ -54,7 +54,7 @@ public:
 
    /// @param obj [OUT] pointer to the Data Object.
    /// @param token [IN] string token of the Data Object for which a Pool Ref is filled.
-   virtual void setObjPtr(void*& obj, const Token* token) const = 0;
+   virtual void setObjPtr(void*& obj, const Token* token) = 0;
 
    /// @return a boolean for using detailed time and size statistics.
    virtual bool useDetailChronoStat() const = 0;
diff --git a/Database/AthenaPOOL/AthenaPoolCnvSvc/src/AthenaPoolCnvSvc.cxx b/Database/AthenaPOOL/AthenaPoolCnvSvc/src/AthenaPoolCnvSvc.cxx
index 6ee02a6d0517..51518beb0b8e 100644
--- a/Database/AthenaPOOL/AthenaPoolCnvSvc/src/AthenaPoolCnvSvc.cxx
+++ b/Database/AthenaPOOL/AthenaPoolCnvSvc/src/AthenaPoolCnvSvc.cxx
@@ -846,11 +846,16 @@ Token* AthenaPoolCnvSvc::registerForWrite(Placement* placement, const void* obj,
    return(token);
 }
 //______________________________________________________________________________
-void AthenaPoolCnvSvc::setObjPtr(void*& obj, const Token* token) const {
+void AthenaPoolCnvSvc::setObjPtr(void*& obj, const Token* token) {
    ATH_MSG_VERBOSE("Requesting object for: " << token->toString());
    if (m_doChronoStat) {
       m_chronoStatSvc->chronoStart("cObjR_ALL");
    }
+   if (m_makeStreamingToolClient.value() > 0 && !m_inputStreamingTool.empty() && !m_inputStreamingTool->isServer() && !m_inputStreamingTool->isClient()) {
+      if (!makeClient(-m_makeStreamingToolClient.value()).isSuccess()) {
+         ATH_MSG_ERROR("Could not make AthenaPoolCnvSvc a Share Client");
+      }
+   }
    if (!m_outputStreamingTool.empty() && m_streamServer < m_outputStreamingTool.size()
 		   && m_outputStreamingTool[m_streamServer]->isServer()) {
       if (token->dbID() == Guid::null()) {
@@ -940,6 +945,12 @@ StatusCode AthenaPoolCnvSvc::createAddress(long svcType,
       ATH_MSG_ERROR("createAddress: svcType != POOL_StorageType " << svcType << " " << POOL_StorageType);
       return(StatusCode::FAILURE);
    }
+   if (m_makeStreamingToolClient.value() > 0 && !m_inputStreamingTool.empty() && !m_inputStreamingTool->isServer() && !m_inputStreamingTool->isClient()) {
+      if (!makeClient(-m_makeStreamingToolClient.value()).isSuccess()) {
+         ATH_MSG_ERROR("Could not make AthenaPoolCnvSvc a Share Client");
+         return(StatusCode::FAILURE);
+      }
+   }
    Token* token = nullptr;
    if (par[0].substr(0, 3) == "SHM") {
       token = new Token();
@@ -1103,7 +1114,7 @@ StatusCode AthenaPoolCnvSvc::makeClient(int num) {
    return(m_inputStreamingTool->makeClient(num));
 }
 //________________________________________________________________________________
-StatusCode AthenaPoolCnvSvc::readData() const {
+StatusCode AthenaPoolCnvSvc::readData() {
    if (m_inputStreamingTool.empty()) {
       return(StatusCode::FAILURE);
    }
diff --git a/Database/AthenaPOOL/AthenaPoolCnvSvc/src/AthenaPoolCnvSvc.h b/Database/AthenaPOOL/AthenaPoolCnvSvc/src/AthenaPoolCnvSvc.h
index 630766b5b972..ff4e651dddae 100644
--- a/Database/AthenaPOOL/AthenaPoolCnvSvc/src/AthenaPoolCnvSvc.h
+++ b/Database/AthenaPOOL/AthenaPoolCnvSvc/src/AthenaPoolCnvSvc.h
@@ -99,7 +99,7 @@ public:
 
    /// @param obj [OUT] pointer to the Data Object.
    /// @param token [IN] string token of the Data Object for which a Pool Ref is filled.
-   void setObjPtr(void*& obj, const Token* token) const;
+   void setObjPtr(void*& obj, const Token* token);
 
    /// @return a boolean for using detailed time and size statistics.
    bool useDetailChronoStat() const;
@@ -152,7 +152,7 @@ public:
    virtual StatusCode makeClient(int num);
 
    /// Read the next data object
-   virtual StatusCode readData() const;
+   virtual StatusCode readData();
 
    /// Send abort to SharedWriter clients if the server quits on error
    /// @param client_n [IN] number of the current client, -1 if no current
diff --git a/Database/AthenaPOOL/AthenaPoolCnvSvc/test/T_AthenaPoolAuxContainerCnv_test.cxx b/Database/AthenaPOOL/AthenaPoolCnvSvc/test/T_AthenaPoolAuxContainerCnv_test.cxx
index ff8d44c2bd68..c82597113a1b 100644
--- a/Database/AthenaPOOL/AthenaPoolCnvSvc/test/T_AthenaPoolAuxContainerCnv_test.cxx
+++ b/Database/AthenaPOOL/AthenaPoolCnvSvc/test/T_AthenaPoolAuxContainerCnv_test.cxx
@@ -49,7 +49,7 @@ public:
       m_pers2 (nullptr)
   {}
 
-  virtual void setObjPtr(void*& obj, const Token* /*token*/) const override
+  virtual void setObjPtr(void*& obj, const Token* /*token*/) override
   {
     if (m_pers2) {
       obj = new YAuxCont_v2 (*m_pers2);
diff --git a/Database/AthenaPOOL/AthenaPoolCnvSvc/test/T_AthenaPoolTPCnvCnv_test.cxx b/Database/AthenaPOOL/AthenaPoolCnvSvc/test/T_AthenaPoolTPCnvCnv_test.cxx
index ac964f1fb8fe..a75b13c22154 100644
--- a/Database/AthenaPOOL/AthenaPoolCnvSvc/test/T_AthenaPoolTPCnvCnv_test.cxx
+++ b/Database/AthenaPOOL/AthenaPoolCnvSvc/test/T_AthenaPoolTPCnvCnv_test.cxx
@@ -44,7 +44,7 @@ public:
       m_pers2 (nullptr)
   {}
 
-  virtual void setObjPtr(void*& obj, const Token* /*token*/) const override
+  virtual void setObjPtr(void*& obj, const Token* /*token*/) override
   {
     if (m_pers2) {
       obj = new XCont_p2 (*m_pers2);
diff --git a/Database/AthenaPOOL/AthenaPoolCnvSvc/test/T_AthenaPoolViewVectorCnv_test.cxx b/Database/AthenaPOOL/AthenaPoolCnvSvc/test/T_AthenaPoolViewVectorCnv_test.cxx
index 03d9e4417129..ba57e7647d90 100644
--- a/Database/AthenaPOOL/AthenaPoolCnvSvc/test/T_AthenaPoolViewVectorCnv_test.cxx
+++ b/Database/AthenaPOOL/AthenaPoolCnvSvc/test/T_AthenaPoolViewVectorCnv_test.cxx
@@ -100,7 +100,7 @@ public:
       m_pers_old (nullptr)
   {}
 
-  virtual void setObjPtr(void*& obj, const Token* token) const override
+  virtual void setObjPtr(void*& obj, const Token* token) override
   {
     if (m_pers) {
       auto vvb = new ViewVector<DataVector<Y_v2> > (*m_pers);
diff --git a/Database/AthenaPOOL/AthenaPoolCnvSvc/test/T_AthenaPoolxAODCnv_test.cxx b/Database/AthenaPOOL/AthenaPoolCnvSvc/test/T_AthenaPoolxAODCnv_test.cxx
index 8c85da607c8a..ad32a48ed695 100644
--- a/Database/AthenaPOOL/AthenaPoolCnvSvc/test/T_AthenaPoolxAODCnv_test.cxx
+++ b/Database/AthenaPOOL/AthenaPoolCnvSvc/test/T_AthenaPoolxAODCnv_test.cxx
@@ -47,7 +47,7 @@ public:
       m_pers2 (nullptr)
   {}
 
-  virtual void setObjPtr(void*& obj, const Token* /*token*/) const override
+  virtual void setObjPtr(void*& obj, const Token* /*token*/) override
   {
     if (m_pers2) {
       DataVector<Y_v2>* v = new DataVector<Y_v2>;
diff --git a/Database/AthenaPOOL/AthenaPoolCnvSvc/test/TestCnvSvcBase.icc b/Database/AthenaPOOL/AthenaPoolCnvSvc/test/TestCnvSvcBase.icc
index 8b9cdf0739a9..6a820b1c01c7 100644
--- a/Database/AthenaPOOL/AthenaPoolCnvSvc/test/TestCnvSvcBase.icc
+++ b/Database/AthenaPOOL/AthenaPoolCnvSvc/test/TestCnvSvcBase.icc
@@ -105,7 +105,7 @@ public:
   { std::abort(); }
   virtual StatusCode connectOutput(const std::string& /*outputFile*/) override
   { std::abort(); }
-  virtual StatusCode readData() const override
+  virtual StatusCode readData() override
   { std::abort(); }
   virtual const std::string& name() const override
   { return m_name; }
diff --git a/Database/AthenaPOOL/EventSelectorAthenaPool/src/EventSelectorAthenaPool.cxx b/Database/AthenaPOOL/EventSelectorAthenaPool/src/EventSelectorAthenaPool.cxx
index 03ea3fae542c..1496c4d919f4 100644
--- a/Database/AthenaPOOL/EventSelectorAthenaPool/src/EventSelectorAthenaPool.cxx
+++ b/Database/AthenaPOOL/EventSelectorAthenaPool/src/EventSelectorAthenaPool.cxx
@@ -166,6 +166,11 @@ StatusCode EventSelectorAthenaPool::initialize() {
    if (!m_eventStreamingTool.empty() && !m_eventStreamingTool.retrieve().isSuccess()) {
       ATH_MSG_FATAL("Cannot get " << m_eventStreamingTool.typeAndName() << "");
       return(StatusCode::FAILURE);
+   } else if (m_makeStreamingToolClient.value() == -1) {
+      if (!m_eventStreamingTool->makeClient(m_makeStreamingToolClient.value()).isSuccess()) {
+         ATH_MSG_ERROR("Could not make AthenaPoolCnvSvc a Share Client");
+         return(StatusCode::FAILURE);
+      }
    }
 
    // Ensure the xAODCnvSvc is listed in the EventPersistencySvc
@@ -478,6 +483,15 @@ StatusCode EventSelectorAthenaPool::createContext(IEvtSelector::Context*& ctxt)
 StatusCode EventSelectorAthenaPool::next(IEvtSelector::Context& ctxt) const {
    std::lock_guard<CallMutex> lockGuard(m_callLock);
    if (!m_eventStreamingTool.empty() && m_eventStreamingTool->isClient()) {
+      if (m_makeStreamingToolClient.value() == -1) {
+         StatusCode sc = m_eventStreamingTool->lockEvent(m_evtCount);
+         while (sc.isRecoverable()) {
+            usleep(1000);
+            sc = m_eventStreamingTool->lockEvent(m_evtCount);
+         }
+      }
+      // Increase event count
+      ++m_evtCount;
       void* tokenStr = nullptr;
       unsigned int status = 0;
       if (!m_eventStreamingTool->getLockedEvent(&tokenStr, status).isSuccess()) {
diff --git a/Database/AthenaPOOL/EventSelectorAthenaPool/src/EventSelectorAthenaPool.h b/Database/AthenaPOOL/EventSelectorAthenaPool/src/EventSelectorAthenaPool.h
index b04379fd2cc3..6f340f063b12 100644
--- a/Database/AthenaPOOL/EventSelectorAthenaPool/src/EventSelectorAthenaPool.h
+++ b/Database/AthenaPOOL/EventSelectorAthenaPool/src/EventSelectorAthenaPool.h
@@ -209,6 +209,8 @@ private: // properties
    ToolHandleArray<IAthenaSelectorTool> m_helperTools{this};
    ToolHandle<IAthenaSelectorTool> m_counterTool{this, "CounterTool", "", ""};
    ToolHandle<IAthenaIPCTool> m_eventStreamingTool{this, "SharedMemoryTool", "", ""};
+   /// Make this instance a Streaming Client during first iteration automatically
+   IntegerProperty m_makeStreamingToolClient{this,"MakeStreamingToolClient",0};
 
    /// The following are included for compatibility with McEventSelector and are not really used.
    /// However runNo, oldRunNo and overrideRunNumberFromInput are used to reset run number for
-- 
GitLab


From ee321b6ba31e1a12665a8bf52665df2316356c37 Mon Sep 17 00:00:00 2001
From: sutt <sutt@cern.ch>
Date: Wed, 16 Dec 2020 23:03:17 +0100
Subject: [PATCH 095/225] Speed up the primary vertex analysis for the ID
 Trigger validation

We run two vertex analyses - one in the standard offline processing,
and another with a primary vertex selection. This second processing
would previously also re-run all the other ttbar based analyses.

In the ttbar jobs, these take some considreable time, and are not needed,
as they have already been run in the standard job.

This adds a preprocessor macros to skip the confguration of the non-vertex
analysis chain for the primary vertex analysis
---
 .../TrigInDetAnalysisUser/share/TIDAdata-chains-run3.dat    | 6 +++++-
 .../share/TIDAdata-run3-offline-vtx.dat                     | 2 ++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-chains-run3.dat b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-chains-run3.dat
index 920650f2d464..8e7fca7ed157 100644
--- a/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-chains-run3.dat
+++ b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-chains-run3.dat
@@ -5,6 +5,7 @@ testChains = {
     //  "Electrons",
     //  "Truth",
 
+#ifndef VTXANALYSIS
 
     "HLT_mu6_idperf_L1MU6:HLT_IDTrack_Muon_FTF:HLT_Roi_L2SAMuon",
     "HLT_mu6_idperf_L1MU6:HLT_IDTrack_Muon_IDTrig:HLT_Roi_L2SAMuonForEF",
@@ -34,11 +35,14 @@ testChains = {
 
     "HLT_j45_subjesgscIS_ftf_boffperf_split_L1J20:HLT_IDTrack_Bjet_FTF",
     "HLT_j45_subjesgscIS_ftf_boffperf_split_L1J20:HLT_IDTrack_Bjet_IDTrig",
+
+    "HLT_mb_sptrk_L1RD0_FILLED:HLT_IDTrack_MinBias_FTF",
+
+#endif
     
     "HLT_j45_subjesgscIS_ftf_boffperf_split_L1J20:HLT_IDTrack_FS_FTF:HLT_FSRoI:HLT_IDVertex_FS:post:rvtx=HLT_IDVertex_FS",
     "HLT_j45_ftf_subjesgscIS_boffperf_split_L1J20:HLT_IDTrack_FS_FTF:HLT_FSRoI:HLT_IDVertex_FS:post:rvtx=HLT_IDVertex_FS",
     "HLT_j45_ftf_L1J15:HLT_IDTrack_FS_FTF:HLT_FSRoI:HLT_IDVertex_FS:post:rvtx=HLT_IDVertex_FS",
 
-    "HLT_mb_sptrk_L1RD0_FILLED:HLT_IDTrack_MinBias_FTF",
 
 }; 
diff --git a/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-offline-vtx.dat b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-offline-vtx.dat
index d644001651d9..43364ed2fca9 100755
--- a/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-offline-vtx.dat
+++ b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-offline-vtx.dat
@@ -15,6 +15,8 @@ refChain = "Offline";
 //refChain = "Taus";
 
 
+#define VTXANALYSIS
+
 MinVertices = 0;
 
 
-- 
GitLab


From 2e5112344cec2cef02d738cb130892756b9c9b50 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Tue, 15 Dec 2020 23:02:17 +0100
Subject: [PATCH 096/225] MuonTrackSteeringTools: Fix dangling refs in
 MuPatCandidateTool.

In MuPatCandidateTool, if we wait until the destructor to free the final
set of garbage, then the garbage may contain pointers to Surface instances
that have already been deleted.  Fix by cleaning all garbage
during finalize().

See ATLASRECTS-5715.
---
 .../MuonTrackSteeringTools/src/MuPatCandidateTool.cxx      | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx
index 086c1b5be455..4bf8325d4afe 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx
@@ -58,6 +58,13 @@ namespace Muon {
   }
 
   StatusCode MuPatCandidateTool::finalize() {
+
+    // Clean up all garbage now.
+    // If we leave it for the dtor, we may end up with dangling references
+    // to Surface objects that have already been deleted.
+    for (CacheEntry& ent : m_cache) {
+      ent.cleanUp();
+    }
     return StatusCode::SUCCESS;
   }
 
-- 
GitLab


From dd3955a2f4896614c8cde2c316dce9070475a603 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Thu, 17 Dec 2020 00:29:09 +0100
Subject: [PATCH 097/225] IOVSvc: Fix memory leak.

Accidently write release() instead of reset() for a unique_ptr,
so the object was being leaked.

See ATEAM-601.
-- 
GitLab


From d48cd2c0e9efa974bfe85c361488702e66546c7f Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Mon, 7 Dec 2020 16:21:40 -0500
Subject: [PATCH 098/225] DCMathSegmentMaker: Fix compilation with gcc11.

Can't use a full template-id as a ctor name with c++20.
---
 .../DCMathSegmentMaker/src/DCMathSegmentMaker.cxx             | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/DCMathSegmentMaker/src/DCMathSegmentMaker.cxx b/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/DCMathSegmentMaker/src/DCMathSegmentMaker.cxx
index 37f2995317c4..f00a3da604d2 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/DCMathSegmentMaker/src/DCMathSegmentMaker.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/DCMathSegmentMaker/src/DCMathSegmentMaker.cxx
@@ -1821,8 +1821,8 @@ struct IdDataVec {
     typedef std::vector<Entry>          EntryVec;
     typedef typename EntryVec::iterator EntryIt;
 
-    IdDataVec<T>() {}
-    IdDataVec<T>(const Identifier& i) : id(i) {}
+    IdDataVec() {}
+    IdDataVec(const Identifier& i) : id(i) {}
 
     Identifier id;
     EntryVec   data;
-- 
GitLab


From 9ed0b35f16eaad10a7d90bdb51bdd87d48fe5cdf Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Mon, 7 Dec 2020 20:38:41 -0500
Subject: [PATCH 099/225] TrkV0Fitter: Fix gcc11 warnings.

Make sure Eigen objects are initialized.
Fixes uninitialized variable warnings from gcc.
---
 Tracking/TrkVertexFitter/TrkV0Fitter/src/TrkV0VertexFitter.cxx | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/Tracking/TrkVertexFitter/TrkV0Fitter/src/TrkV0VertexFitter.cxx b/Tracking/TrkVertexFitter/TrkV0Fitter/src/TrkV0VertexFitter.cxx
index b32151c3f1fa..57022185558d 100755
--- a/Tracking/TrkVertexFitter/TrkV0Fitter/src/TrkV0VertexFitter.cxx
+++ b/Tracking/TrkVertexFitter/TrkV0Fitter/src/TrkV0VertexFitter.cxx
@@ -111,6 +111,7 @@ namespace Trk
   xAOD::Vertex * TrkV0VertexFitter::fit(const std::vector<const xAOD::TrackParticle*>& vectorTrk) const
   {
     Amg::Vector3D tmpVtx;
+    tmpVtx.setZero();
     return fit(vectorTrk, tmpVtx);
   }
 
@@ -205,6 +206,7 @@ namespace Trk
   xAOD::Vertex * TrkV0VertexFitter::fit(const std::vector<const Trk::TrackParameters*>& originalPerigees) const
   {
     Amg::Vector3D tmpVtx;
+    tmpVtx.setZero();
     return fit(originalPerigees, tmpVtx);
   }
 
-- 
GitLab


From 1842c8d2af50a3d543c2d803573ccd09638a7d84 Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Mon, 7 Dec 2020 16:33:03 -0500
Subject: [PATCH 100/225] MuonTrackFinderTools: Fix gcc11 warning.

Fix potential null pointer dereference.
---
 .../MuonTrackFinderTools/src/MuonErrorOptimisationTool.cxx     | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonErrorOptimisationTool.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonErrorOptimisationTool.cxx
index 7679206d8f0a..23da18bc16c7 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonErrorOptimisationTool.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackFinderTools/src/MuonErrorOptimisationTool.cxx
@@ -152,7 +152,8 @@ namespace Muon {
           }else{
             Trk::TrackSummary tmpSum(*summary0);
             m_trackSummaryTool->addDetailedTrackSummary(*track,tmpSum);
-            if( tmpSum.muonTrackSummary() ) nhits0 = muonSummary0->netaHits()+ muonSummary0->nphiHits();
+            muonSummary0 = tmpSum.muonTrackSummary();
+            if( muonSummary0 ) nhits0 = muonSummary0->netaHits()+ muonSummary0->nphiHits();
           }
         }else{
           Trk::TrackSummary tmpSummary;
-- 
GitLab


From 235ecb785c88285e305f80244bbf9daa9f265b7c Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Mon, 7 Dec 2020 16:51:03 -0500
Subject: [PATCH 101/225] ReweightUtils: Fix gcc11 warnings.

Check result of dynamic_cast before dereferencing.
---
 .../test/ut_ParticleScaleFactorTool_test.cxx              | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/PhysicsAnalysis/AnalysisCommon/ReweightUtils/test/ut_ParticleScaleFactorTool_test.cxx b/PhysicsAnalysis/AnalysisCommon/ReweightUtils/test/ut_ParticleScaleFactorTool_test.cxx
index 8baaaa0a3909..afdc3a4debb0 100644
--- a/PhysicsAnalysis/AnalysisCommon/ReweightUtils/test/ut_ParticleScaleFactorTool_test.cxx
+++ b/PhysicsAnalysis/AnalysisCommon/ReweightUtils/test/ut_ParticleScaleFactorTool_test.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 
@@ -115,12 +115,14 @@ int main() {
 
    CP::SystematicSet s; s.insert(CP::SystematicVariation("mySyst",1));
 
-   dynamic_cast<CP::ISystematicsTool*>(&*myTool4)->applySystematicVariation(s).ignore();
+   auto isyst4 = dynamic_cast<CP::ISystematicsTool*>(&*myTool4);
+   if (!isyst4) std::abort();
+   isyst4->applySystematicVariation(s).ignore();
    std::cout << myTool4->evaluate(e) << std::endl; //should print 5.0
 
    s.clear(); s.insert(CP::SystematicVariation("mySyst",-1));
 
-   dynamic_cast<CP::ISystematicsTool*>(&*myTool4)->applySystematicVariation(s).ignore();
+   isyst4->applySystematicVariation(s).ignore();
    std::cout << myTool4->evaluate(e) << std::endl; //should print 1.0
 
    return 0; //zero = success
-- 
GitLab


From 94805f626778766242d460db802e85bb818d69da Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Mon, 7 Dec 2020 16:59:15 -0500
Subject: [PATCH 102/225] METUtilities: Fix gcc11 warning.

Check result of dynamic_cast before dereferencing.
---
 Reconstruction/MET/METUtilities/Root/METSignificance.cxx | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/Reconstruction/MET/METUtilities/Root/METSignificance.cxx b/Reconstruction/MET/METUtilities/Root/METSignificance.cxx
index e1a0fce43ebc..21e5558d7517 100644
--- a/Reconstruction/MET/METUtilities/Root/METSignificance.cxx
+++ b/Reconstruction/MET/METUtilities/Root/METSignificance.cxx
@@ -562,7 +562,9 @@ namespace met {
     }
     else{
       const xAOD::TauJet* tau(static_cast<const xAOD::TauJet*>(obj));
-      pt_reso = dynamic_cast<CombinedP4FromRecoTaus*>(m_tCombinedP4FromRecoTaus.get())->getCaloResolution(*tau);
+      if (auto combp4 = dynamic_cast<CombinedP4FromRecoTaus*>(m_tCombinedP4FromRecoTaus.get())) {
+        pt_reso = combp4->getCaloResolution(*tau);
+      }
       
       if(m_doPhiReso) phi_reso = tau->pt()*0.01;
       ATH_MSG_VERBOSE("tau: " << pt_reso << " " << tau->pt() << " " << tau->p4().Eta() << " " << tau->p4().Phi() << " phi reso: " << phi_reso);
-- 
GitLab


From d7e6d89f64c3bc6c5729ddde455aa1cdc1e045ac Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Mon, 7 Dec 2020 22:45:31 -0500
Subject: [PATCH 103/225] CxxUtils: Add ConcurrentHashMapImpl.

A int->int hash map, allowing for concurrent lockless reads.
This is not meant to be used directly, but more user-oriented
classes may be built on top of it.
---
 Control/CxxUtils/CMakeLists.txt               |   3 +-
 .../CxxUtils/CxxUtils/ConcurrentHashmapImpl.h | 573 ++++++++++++++
 .../CxxUtils/ConcurrentHashmapImpl.icc        | 725 ++++++++++++++++++
 .../share/ConcurrentHashmapImpl_test.ref      |   5 +
 .../test/ConcurrentHashmapImpl_test.cxx       | 571 ++++++++++++++
 5 files changed, 1876 insertions(+), 1 deletion(-)
 create mode 100644 Control/CxxUtils/CxxUtils/ConcurrentHashmapImpl.h
 create mode 100644 Control/CxxUtils/CxxUtils/ConcurrentHashmapImpl.icc
 create mode 100644 Control/CxxUtils/share/ConcurrentHashmapImpl_test.ref
 create mode 100644 Control/CxxUtils/test/ConcurrentHashmapImpl_test.cxx

diff --git a/Control/CxxUtils/CMakeLists.txt b/Control/CxxUtils/CMakeLists.txt
index bf26f6102a71..f4f725e30015 100644
--- a/Control/CxxUtils/CMakeLists.txt
+++ b/Control/CxxUtils/CMakeLists.txt
@@ -118,7 +118,8 @@ foreach( test sincos_test ArrayScanner_test Arrayrep_test
       atomic_fetch_minmax_test
       MurmurHash2_test bitmask_test crc64_test Ring_test
       restrict_test vectorize_test get_unaligned_test aligned_vector_test
-      vec_int_test vec_float_test vec_fb_int_test vec_fb_float_test)
+      vec_int_test vec_float_test vec_fb_int_test vec_fb_float_test
+      ConcurrentHashmapImpl_test )
    atlas_add_test( ${test}
       SOURCES test/${test}.cxx
       LOG_IGNORE_PATTERN "no version information available"
diff --git a/Control/CxxUtils/CxxUtils/ConcurrentHashmapImpl.h b/Control/CxxUtils/CxxUtils/ConcurrentHashmapImpl.h
new file mode 100644
index 000000000000..8f6daf8beb11
--- /dev/null
+++ b/Control/CxxUtils/CxxUtils/ConcurrentHashmapImpl.h
@@ -0,0 +1,573 @@
+// This file's extension implies that it's C, but it's really -*- C++ -*-.
+/*
+ * Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration.
+ */
+/**
+ * @file CxxUtils/ConcurrentHashmapImpl.h
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Dec, 2020
+ * @brief Hash table allowing concurrent, lockless reads.
+ */
+
+
+
+#ifndef CXXUTILS_CONCURRENTHASHMAPIMPL_H
+#define CXXUTILS_CONCURRENTHASHMAPIMPL_H
+
+
+#include "CxxUtils/bitscan.h"
+#include "CxxUtils/atomic_fetch_minmax.h"
+#include <functional>
+#include <cstdint>
+#include <cstdlib>
+#include <atomic>
+#include <mutex>
+#include <memory>
+#include <new>
+
+
+class ConcurrentHashmapImplTest;
+
+
+namespace CxxUtils {
+namespace detail {
+
+
+/// Type used for keys and values --- an unsigned big enough to hold a pointer.
+/// Need to have this defined outside of ConcurrentHashmapImpl itself
+/// in order to avoid instantiation circularities, as the HASHER and MATCHER
+/// classes will probably want to use it.
+using ConcurrentHashmapVal_t = uintptr_t;
+
+
+/**
+ * @brief Helper to generate hash probes.
+ *
+ * To search for an entry with hash code @c hash in the table pointed
+ * at by @c entries:
+ *@code
+ *  CHMTableInterator<ENTRIES_PER_CACHELINE> it (hash, mask, maskBits, probleLimit);
+ *  do {
+ *    entry_t* ent = entries + it.offset();
+ *    <<test if ent is the desired entry and handle if so>>
+ *  } while (it.next());
+ *  // Too many probes --- failed.
+ @endcode
+ *
+ * The template argument is the number of table entries per cache line.
+ * We try to be cache friendly by first searching all entries in a cache line,
+ * then moving to another line.
+ */
+template <unsigned ENTRIES_PER_CACHELINE>
+struct CHMTableIterator
+{
+  /// Mask for the within-cachline part of indices.
+  static  constexpr size_t ENTRIES_PER_CACHELINE_MASK = ENTRIES_PER_CACHELINE-1;
+
+  /**
+   * @brief Constructor.
+   * @param hash The hash of the entry we're looking for.
+   * @param mask Table mask; i.e., the table capacity - 1.
+   * @param maskBits Number of 1 bits in mask.
+   * @param probeLimit Maximum number of probes to try before failing.
+   */
+  CHMTableIterator (size_t hash, size_t mask, size_t maskBits, size_t probeLimit);
+
+
+  /**
+   * @brief Offset of the element currently being probed.
+   */
+  size_t offset() const;
+
+
+  /**
+   * @brief Return the number of probes performed so far.
+   */
+  size_t nprobes() const;
+
+
+  /**
+   * @brief Move to the next probe.
+   * Returns true if we should continue, or false if we've hit the maximum
+   * number of probes.
+   */
+  bool next();
+
+
+private:
+  /// Mask for the table; i.e., capacity-1, but with the low bits
+  /// corresponding to ENTRIES_PER_CACHELINE also masked off.
+  const size_t m_mask;
+  /// Offset of the first entry we probe within its cacheline.
+  const size_t m_boffs;
+  /// Base increment between probes.
+  const size_t m_stride;
+  /// Maximum number of probes to try.
+  const size_t m_probeLimit;
+  /// Index of the start of the cacheline currently being probed.
+  size_t m_bucket;
+  /// Number of probes tried so far.
+  size_t m_nprobes;
+};
+
+
+/**
+ * @brief Hash table allowing concurrent, lockless reads.
+ *
+ * This class implements a simple hash map from uintptr_t to uintptr_t.
+ * This class isn't meant to be used directly; rather, a more user-friendly
+ * interface can be built on top of this.  Although here we deal only
+ * with uintptr_t values, the hash and comparison operations are templated.
+ * This allows for handling more complex types, where the values
+ * stored in the map are pointers to the actual objects.  We support
+ * inserting new items and modifying existing ones, but not deletion.
+ * One value of the key must be reserved to indicate null; no keys with
+ * that value may be inserted.
+ *
+ * There can be only one writer at a time; this is enforced with internal locks.
+ * However, there can be any number of concurrent readers at any time.
+ * The reads are lockless.  So this is appropriate when reads
+ * are much more frequent than writes.
+ *
+ * Template arguments:
+ *  UPDATER - Object used for memory management; see below.
+ *            This has the same requirements as for ConcurrentRangeMap;
+ *            see there for further details.
+ *  HASHER  - Functional to compute a hash value from a key.
+ *            Defaults to std::hash.
+ *  MATCHER - Functional to compare two keys for equality.
+ *            Defaults to std::equal_to.
+ *  NULLVAL - Value of the key to be considered null.
+ *            A key with this value may not be inserted.
+ *
+ * Implementation notes:
+ *  We use open addressing (see, eg, knuth AOCP 6.4), in which the payloads
+ *  are kept in the hash table itself.  We try to be cache friendly
+ *  by probing all entries within a cache line before trying anything
+ *  in a different cache line.  If the table gets full, we make a new, larger,
+ *  instance copying the data from the old one.  The old table instances
+ *  are then given to the Updater object to handle.
+ *
+ *  The implementation here is inspired by the hash maps from ConcurrencyKit
+ *  (http://concurrencykit.org), though the code is all new.
+ */
+template <template <class> class UPDATER,
+          typename HASHER = std::hash<uintptr_t>,
+          typename MATCHER = std::equal_to<uintptr_t>,
+          uintptr_t NULLVAL = 0>
+class ConcurrentHashmapImpl
+{
+public:
+  /// Type used for keys and values --- an unsigned big enough to hold a pointer.
+  using val_t = ConcurrentHashmapVal_t;
+  /// Hash object.
+  using Hasher_t = HASHER;
+  /// Key match object.
+  using Matcher_t = MATCHER;
+  /// Null key value.
+  static constexpr uintptr_t nullval = NULLVAL;
+  /// Used to represent an invalid table index.
+  static constexpr size_t INVALID = static_cast<size_t>(-1);
+
+
+private:
+  /// One entry in the hash table.
+  struct entry_t {
+    std::atomic<val_t> m_key;
+    std::atomic<val_t> m_val;
+  };
+
+  /// Assumed length in bytes of one cache line.
+  static constexpr size_t CACHELINE = 64;
+
+  // Ensure that entries will evenly pack a cache line.
+  // If CACHELINE is a power of two, this implies that sizeof(entry_t)
+  // is as well.
+  static_assert (CACHELINE >= sizeof (entry_t) &&
+                 CACHELINE % sizeof(entry_t) == 0);
+
+  /// Number of entries in one cache line.
+  static constexpr size_t ENTRIES_PER_CACHELINE = CACHELINE / sizeof(entry_t);
+  /// Mask for the cache line part of an index.
+  static constexpr size_t ENTRIES_PER_CACHELINE_MASK = (ENTRIES_PER_CACHELINE-1);
+
+  /// For unit testing.
+  friend class ::ConcurrentHashmapImplTest;
+
+
+  /**
+   * @brief Table of hash entries.
+   *
+   * This is the actual table of hash entries.  It consists of a fixed-size
+   * header, followed by the actual array of entries.  We override new
+   * in order to be able to properly allocate the space for the array.
+   * The start of the array of entries need to be aligned on a cache line.
+   * We make a new instance of this if the table needs to be grown.
+   */
+  class alignas(CACHELINE) Table
+  {
+  public:
+    using TableIterator = CHMTableIterator<ENTRIES_PER_CACHELINE>;
+
+
+    /**
+     * @brief Constructor.
+     * @param capacity Number of entries in the table.  Must be a power of 2.
+     * @param hasher Hash object to use.
+     * @param matcher Key match object to use.
+     */
+    Table (size_t capacity,
+           const HASHER& hasher = HASHER(),
+           const MATCHER& matcher = MATCHER());
+
+
+    /**
+     * @brief Allocator for table objects.
+     * @param capacity Size of the table (must be a power of 2).
+     *
+     * Allocate with enough space for the table of entries.
+     * Also align on a cache line.
+     */
+    static void* operator new (size_t, size_t capacity);
+
+
+    /**
+     * @brief Deallocator for table objects.
+     */
+    void operator delete (void* p);
+
+    
+    /**
+     * @brief Find a table entry for reading.
+     * @param key The key for which to search.
+     * @param hash The hash of the key.
+     *
+     * Returns the matching entry, or nullptr.  xxx
+     */
+    size_t probeRead (val_t key, size_t hash) const;
+
+    
+    /**
+     * @brief Find a table entry for writing.
+     * @param key The key for which to search.
+     * @param hash The hash of the key.
+     * @param entry[out] The entry found.
+     *
+     * If we find the entry, return true with @c entry pointing at it.
+     * If we don't find it, and there's still room in the table, return false
+     * with @c entry pointing at the next empty entry.
+     * Otherwise, return false with @c entry set to nullptr.
+     */
+    size_t probeWrite (val_t key, size_t hash, bool& insert);
+
+
+    /**
+     * @brief The number of entries in the table.
+     */
+    size_t capacity() const;
+
+
+    /**
+     * @brief Return the entry for an offset.
+     * @param offset The index of the desired entry.
+     */
+    const entry_t& entry (size_t offset) const;
+
+
+    /**
+     * @brief Return the entry for an offset (non-const).
+     * @param offset The index of the desired entry.
+     */
+    entry_t& entry (size_t offset);
+
+
+  private:
+    /// Number of entries in the table.  Must be a power of 2.
+    const size_t m_capacity;
+    /// Maximum number of probes allowed before resizing the table.
+    const size_t m_maxProbe;
+    /// Mask for table indices (capacity-1).
+    const size_t m_mask;
+    /// Number of bits in the mask.
+    const size_t m_maskBits;
+    /// The hash object.
+    const HASHER& m_hasher;
+    /// The key match object.
+    const MATCHER& m_matcher;
+    /// Longest probe needed so far.
+    std::atomic<size_t> m_longestProbe;
+    /// The actual table entries.
+    alignas(CACHELINE) entry_t m_entries[1];
+  };
+
+
+public:
+  /// Updater object.
+  using Updater_t = UPDATER<Table>;
+  /// Context type for the updater.
+  using Context_t = typename Updater_t::Context_t;
+
+
+
+  /**
+   * @brief Constructor.
+   * @param updater Object used to manage memory
+   *                (see comments at the start of the class).
+   * @param capacity Minimum initial table size.
+   * @param hasher Hash object to use.
+   * @param matcher Key match object to use.
+   * @param ctx Execution context.
+   */
+  ConcurrentHashmapImpl (Updater_t&& updater,
+                         size_t capacity_in,
+                         const HASHER& hasher,
+                         const MATCHER& matcher,
+                         const typename Updater_t::Context_t& ctx);
+
+
+  // Don't implment copying.
+  // This should be done by derived classes, if desired.
+  ConcurrentHashmapImpl (const ConcurrentHashmapImpl&) = delete;
+  ConcurrentHashmapImpl& operator= (const ConcurrentHashmapImpl&) = delete;
+  
+
+  /**
+   * @brief Return the number of items currently stored.
+   *   (not necessarity synced)
+   */
+  size_t size() const;
+
+
+  /**
+   * @brief Return the current table size.
+   */
+  size_t capacity() const;
+
+
+  /** 
+   * @brief Return the hasher object.
+   */
+  const Hasher_t& hasher() const;
+
+
+  /** 
+   * @brief Return the matcher object.
+   */
+  const Matcher_t& matcher() const;
+
+
+  /**
+   * @brief Bidirectional iterator over occupied table entries.
+   *
+   * This is not itself a compliant STL iterator.
+   * Derived classes are meant to build a user-facing iterator on top of this.
+   */
+  class const_iterator
+  {
+  public:
+    /**
+     * @brief Constructor.
+     * @param table The table instance we're referencing.
+     * @param end If true, initialize this to an end iterator.
+     *            Otherwise, initialize it to a a begin iterator.
+     */
+    const_iterator (const Table& table, bool end);
+
+
+    /**
+     * @brief Constructor.
+     * @param table The table instance we're referencing.
+     * @param offset Offset of the iterator within the table.
+     *               (Must point at an occupied entry.)
+     */
+    const_iterator (const Table& table, size_t offset);
+
+
+    /**
+     * @brief Advance the iterator to the next occupied entry.
+     */
+    void next();
+
+
+    /**
+     * @brief Move the iterator back to the previous occupied entry.
+     */
+    void prev();
+
+
+    /**
+     * @brief Return the key for this iterator.
+     */
+    val_t key() const;
+    
+
+    /**
+     * @brief Return the value for this iterator.
+     */
+    val_t value() const;
+
+
+    /**
+     * @brief Compare two iterators.
+     */
+    bool operator!= (const const_iterator& other) const;
+
+
+    /**
+     * @brief Check that the iterator is valid (not pointing at the end).
+     */
+    bool valid() const;
+    
+    
+  private:
+    /// The table over which we're iterating.
+    const Table& m_table;
+    /// The current position in the table.
+    /// Set to -1 for an end iterator.
+    size_t m_offset;
+  };
+
+
+  /**
+   * @brief Add an entry to the table.
+   * @param key The key to insert.
+   * @param hash The hash of the key.
+   * @param val The value to insert.
+   * @param overwrite If true, then overwrite an existing entry.
+   *                  If false, an existing entry will not be changed.
+   * @param ctx Execution context.
+   *
+   * If the key already exists, then its value will be updated.
+   * Returns an iterator pointing at the entry and a flag which is
+   * true if a new element was added.
+   */
+  std::pair<const_iterator, bool>
+  put (val_t key, size_t hash, val_t val,
+       bool overwrite,
+       const typename Updater_t::Context_t& ctx);
+
+
+  /**
+   * @brief Look up an entry in the table.
+   * @param key The key to find.
+   * @param hash The hash of the key.
+   *
+   * Returns an iterator pointing at the found entry, or end().
+   */
+  const_iterator get (val_t key, size_t hash) const;
+
+
+  /// Two iterators defining a range.
+  using const_iterator_range = std::pair<const_iterator, const_iterator>;
+
+
+  /**
+   * @brief Return a range that can be used to iterate over the container.
+   */
+  const_iterator_range range() const;
+
+
+  /** 
+   * @brief A begin iterator for the container.
+   */
+  const_iterator begin() const;
+
+
+  /** 
+   * @brief An end iterator for the container.
+   */
+  const_iterator end() const;
+
+
+  /**
+   * @brief Erase the table and change the capacity.
+   * @param capacity The new table capacity.
+   * @param ctx Execution context.
+   *
+   * Returns an iterator pointing at the start of the old table.
+   */
+  const_iterator clear (size_t capacity,
+                        const typename Updater_t::Context_t& ctx);
+
+
+  /**
+   * @brief Erase the table (don't change the capacity).
+   * @param ctx Execution context.
+   *
+   * Returns an iterator pointing at the start of the old table.
+   */
+  const_iterator clear (const typename Updater_t::Context_t& ctx);
+
+
+  /**
+   * @brief Increase the table capacity.
+   * @param capacity The new table capacity.
+   * @param ctx Execution context.
+   *
+   * No action will be taken in @c capacity is smaller
+   * than the current capacity.
+   */
+  void reserve (size_t capacity,
+                const typename Updater_t::Context_t& ctx);
+
+
+  /**
+   * @brief Called when this thread is no longer referencing anything
+   *        from this container.
+   * @param ctx Execution context.
+   */
+  void quiescent (const typename Updater_t::Context_t& ctx);
+
+
+private:
+  using mutex_t = std::mutex;
+  using lock_t  = std::lock_guard<mutex_t>;
+
+
+  /**
+   * @brief Make the table larger.
+   * @param ctx Execution context.
+   *
+   * Must be holding a lock on the mutex to call this.
+   */
+  bool grow (lock_t& /*lock*/, const typename Updater_t::Context_t& ctx);
+
+
+  /**
+   * @brief Make the table larger.
+   * @param new_capacity The new table capacity (must be a power of 2).
+   * @param ctx Execution context.
+   *
+   * Must be holding a lock on the mutex to call this.
+   */
+  bool grow (lock_t& /*lock*/, size_t new_capacity, const typename Updater_t::Context_t& ctx);
+
+
+  static uint64_t round_up (uint64_t);
+
+
+  /// Updater object managing memory.  See above.
+  Updater_t m_updater;
+  /// The hash object.
+  const HASHER m_hasher;
+  /// The key match object.
+  const MATCHER m_matcher;
+  /// The current table instance.  Must be holding the mutex to access this.
+  Table* m_table;
+  /// Number of entries in the map.
+  std::atomic<size_t> m_size;
+  /// Mutex to serialize changes to the map.
+  std::mutex m_mutex;
+};
+
+
+} // namespace detail
+
+
+} // namespace CxxUtils
+
+
+#include "CxxUtils/ConcurrentHashmapImpl.icc"
+
+
+#endif // not CXXUTILS_CONCURRENTHASHMAPIMPL_H
diff --git a/Control/CxxUtils/CxxUtils/ConcurrentHashmapImpl.icc b/Control/CxxUtils/CxxUtils/ConcurrentHashmapImpl.icc
new file mode 100644
index 000000000000..63830114c683
--- /dev/null
+++ b/Control/CxxUtils/CxxUtils/ConcurrentHashmapImpl.icc
@@ -0,0 +1,725 @@
+/*
+ * Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration.
+ */
+/**
+ * @file CxxUtils/ConcurrentHashmapImpl.h
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Dec, 2020
+ * @brief Hash table allowing concurrent, lockless reads.
+ */
+
+
+#include <cassert>
+
+
+namespace CxxUtils {
+namespace detail {
+
+
+/**
+ * @brief Constructor.
+ * @param hash The hash of the entry we're looking for.
+ * @param mask Table mask; i.e., the table capacity - 1.
+ * @param maskBits Number of 1 bits in mask.
+ * @param probeLimit Maximum number of probes to try before failing.
+ */
+template <unsigned ENTRIES_PER_CACHELINE>
+inline
+CHMTableIterator<ENTRIES_PER_CACHELINE>::CHMTableIterator
+  (size_t hash, size_t mask, size_t maskBits, size_t probeLimit)
+    // Mask limited to the table.  Also mask off the part within a cache line.
+  : m_mask ((mask & ~ENTRIES_PER_CACHELINE_MASK)),
+    // Offset of hash within a cache line.
+    m_boffs (hash & ENTRIES_PER_CACHELINE_MASK),
+    // Starting increment between hash probes.
+    // Must be large enough to go to a new cache line, which is why
+    // we or in ENTRIES_PER_CACHELINE.
+    m_stride (((hash >> maskBits) | hash | ENTRIES_PER_CACHELINE) & ENTRIES_PER_CACHELINE_MASK),
+    m_probeLimit (probeLimit),
+    // Index at the start of the cache line containing hash.
+    m_bucket (hash & m_mask),
+    m_nprobes (0)
+{
+}
+
+
+/**
+ * @brief Offset of the element currently being probed.
+ */
+template <unsigned ENTRIES_PER_CACHELINE>
+inline
+size_t CHMTableIterator<ENTRIES_PER_CACHELINE>::offset() const
+{
+  // m_bucket the starting index of the current cache line.
+  // Count within the cache line in a circular manner starting
+  // at m_boffs.
+  return m_bucket + ((m_nprobes + m_boffs)&ENTRIES_PER_CACHELINE_MASK);
+}
+
+
+/**
+ * @brief Return the number of probes performed so far.
+ */
+template <unsigned ENTRIES_PER_CACHELINE>
+inline
+size_t CHMTableIterator<ENTRIES_PER_CACHELINE>::nprobes() const
+{
+  return m_nprobes;
+}
+
+
+/**
+ * @brief Move to the next probe.
+ * Returns true if we should continue, or false if we've hit the maximum
+ * number of probes.
+ */
+template <unsigned ENTRIES_PER_CACHELINE>
+inline
+bool CHMTableIterator<ENTRIES_PER_CACHELINE>::next()
+{
+  // Increment number of probes and stop if we've hit the maximum.
+  if (++m_nprobes >= m_probeLimit) {
+    return false;
+  }
+  // We've finished a cache line if the low bits are back to 0.
+  if ((m_nprobes & ENTRIES_PER_CACHELINE_MASK) == 0) {
+    // Move to a different cacheline.  
+    // cf knuth AOCP exercise 6.4.20.
+    // By contruction, the low bits (within the cacheline) of
+    // m_bucket, m_nprobes, and m_stride should all be 0.
+    m_bucket = (m_bucket + m_nprobes + m_stride) & m_mask;
+  }
+  return true;
+}
+
+
+//*****************************************************************************
+
+
+#define T_CHMIMPL \
+  template <template <class> class UPDATER,     \
+            typename HASHER,                    \
+            typename MATCHER,                   \
+            uintptr_t NULLVAL>
+
+#define CHMIMPL ConcurrentHashmapImpl<UPDATER, HASHER, MATCHER, NULLVAL>
+
+
+/**
+ * @brief Constructor.
+ * @param capacity Number of entries in the table.  Must be a power of 2.
+ * @param hasher Hash object to use.
+ * @param matcher Key match object to use.
+ */
+T_CHMIMPL
+CHMIMPL::Table::Table (size_t capacity,
+                       const HASHER& hasher /*= HASHER()*/,
+                       const MATCHER& matcher /*= MATCHER()*/)
+  : m_capacity (capacity),
+    m_maxProbe (capacity / 4),
+    m_mask (capacity-1),
+    m_maskBits (count_trailing_zeros (capacity)),
+    m_hasher (hasher),
+    m_matcher (matcher),
+    m_longestProbe (0)
+{
+  // Clear all the keys.
+  for (size_t i = 0; i < capacity; i++) {
+    m_entries[i].m_key = NULLVAL;
+  }
+}
+
+
+/**
+ * @brief Allocator for table objects.
+ * @param capacity Size of the table (must be a power of 2).
+ *
+ * Allocate with enough space for the table of entries.
+ * Also align on a cache line.
+ */
+T_CHMIMPL
+void* CHMIMPL::Table::operator new (size_t, size_t capacity)
+{
+  void* memptr = nullptr;
+  // Allocate aligned memory block.
+  // The Table structure includes one entry at the end,
+  // so subtract 1 from capacity.
+  posix_memalign (&memptr, CACHELINE, sizeof(Table) + (capacity-1)*sizeof(entry_t));
+  if (!memptr) std::abort();
+  return memptr;
+}
+
+
+/**
+ * @brief Deallocator for table objects.
+ */
+T_CHMIMPL
+void CHMIMPL::Table::operator delete (void* p)
+{
+  free (p);
+}
+
+
+/**
+ * @brief Find a table entry for reading.
+ * @param key The key for which to search.
+ * @param hash The hash of the key.
+ *
+ * Returns the matching entry, or nullptr.
+ */
+T_CHMIMPL
+size_t CHMIMPL::Table::probeRead (val_t key, size_t hash) const
+{
+  // Iterate over table probes.
+  // We don't need to check more than the longest probe sequence
+  // used so far.
+  TableIterator it (hash, m_mask, m_maskBits, m_longestProbe);
+  do {
+    size_t offset = it.offset();
+    const entry_t* ent = m_entries + offset;
+    if (ent->m_key == nullval) {
+      // If we hit an empty key, report failure.
+      return INVALID;
+    }
+    if (m_matcher (ent->m_key, key)) {
+      // Found a matching key.
+      return offset;
+    }
+  } while (it.next());
+  // Too many probes --- return failure.
+  return INVALID;
+}
+
+
+/**
+ * @brief Find a table entry for writing.
+ * @param key The key for which to search.
+ * @param hash The hash of the key.
+ * @param entry[out] The entry found.
+ *
+ * If we find the entry, return true with @c entry pointing at it.
+ * If we don't find it, and there's still room in the table, return false
+ * with @c entry pointing at the next empty entry.
+ * Otherwise, return false with @c entry set to nullptr.
+ */
+T_CHMIMPL
+size_t CHMIMPL::Table::probeWrite (val_t key, size_t hash, bool& insert)
+{
+  // Iterate over table probes.
+  TableIterator it (hash, m_mask, m_maskBits, m_maxProbe);
+  do {
+    size_t offset = it.offset();
+    entry_t* ent = m_entries + offset;
+    if (ent->m_key == nullval) {
+      // We hit an empty key; a new entry could be added here.
+      // Update the longest probe count.
+      CxxUtils::atomic_fetch_max (&m_longestProbe, it.nprobes()+1);
+      insert = true;
+      return offset;
+    }
+    if (m_matcher (ent->m_key, key)) {
+      // Found a matching key.
+      insert = false;
+      return offset;
+    }
+  } while (it.next());
+  // Too many probes --- return failure.
+  return INVALID;
+}
+
+
+/**
+ * @brief The number of entries in the table.
+ */
+T_CHMIMPL
+inline
+size_t CHMIMPL::Table::capacity() const
+{
+  return m_capacity;
+}
+
+
+/**
+ * @brief Return the entry for an offset.
+ * @param offset The index of the desired entry.
+ */
+T_CHMIMPL
+inline
+const typename CHMIMPL::entry_t& CHMIMPL::Table::entry (size_t offset) const
+{
+  return m_entries[offset];
+}
+
+
+/**
+ * @brief Return the entry for an offset (non-const).
+ * @param offset The index of the desired entry.
+ */
+T_CHMIMPL
+inline
+typename CHMIMPL::entry_t& CHMIMPL::Table::entry (size_t offset)
+{
+  return m_entries[offset];
+}
+
+
+//*****************************************************************************
+
+
+/**
+ * @brief Constructor.
+ * @param updater Object used to manage memory
+ *                (see comments at the start of the class).
+ * @param capacity Minimum initial table size.
+ * @param hasher Hash object to use.
+ * @param matcher Key match object to use.
+ * @param ctx Execution context.
+ */
+T_CHMIMPL
+CHMIMPL::ConcurrentHashmapImpl (Updater_t&& updater,
+                                size_t capacity_in,
+                                const HASHER& hasher,
+                                const MATCHER& matcher,
+                                const typename Updater_t::Context_t& ctx)
+  : m_updater (std::move (updater)),
+    m_hasher (hasher),
+    m_matcher (matcher),
+    m_size (0)
+{
+  // Round up capacity to a power of 2.
+  size_t capacity = round_up (capacity_in);
+
+  m_table = new (capacity) Table (capacity, hasher, matcher);
+  m_updater.update (std::unique_ptr<Table> (m_table), ctx);
+}
+
+
+/**
+ * @brief Add an entry to the table.
+ * @param key The key to insert.
+ * @param hash The hash of the key.
+ * @param val The value to insert.
+ * @param overwrite If true, then overwrite an existing entry.
+ *                  If false, an existing entry will not be changed.
+ * @param ctx Execution context.
+ *
+ * If the key already exists, then its value will be updated.
+ * Returns an iterator pointing at the entry and a flag which is
+ * true if a new element was added.
+ */
+T_CHMIMPL
+std::pair<typename CHMIMPL::const_iterator, bool>
+CHMIMPL::put (val_t key, size_t hash, val_t val, bool overwrite,
+              const typename Updater_t::Context_t& ctx)
+{
+  assert (key != nullval);
+  lock_t lock (m_mutex);
+
+  do {
+    bool insert;
+    size_t offset = m_table->probeWrite (key, hash, insert);
+    if (offset != INVALID) {
+      entry_t& ent = m_table->entry (offset);
+      if (insert) {
+        // Found a place to put it.
+        // Be sure not to set the key until the value is in place.
+        ent.m_val = val;
+        ent.m_key = key;
+        ++m_size;
+      }
+      else {
+        // Found --- update the entry if wanted.
+        if (overwrite) {
+          if (val != ent.m_val) {
+            ent.m_val = val;
+          }
+        }
+      }
+      return std::make_pair (const_iterator (*m_table, offset), insert);
+    }
+
+    // Need to grow the table.
+  } while (grow (lock, ctx));
+
+  // grow() failed.
+  return std::make_pair (end(), false);
+}
+
+
+/**
+ * @brief Look up an entry in the table.
+ * @param key The key to find.
+ * @param hash The hash of the key.
+ *
+ * Returns an iterator pointing at the found entry, or end().
+ */
+T_CHMIMPL
+typename CHMIMPL::const_iterator CHMIMPL::get (val_t key, size_t hash) const
+{
+  const Table& table = m_updater.get();
+  size_t offset = table.probeRead (key, hash);
+  // Offset will be -1 if not found --- invalid iterator.
+  return const_iterator (table, offset);
+}
+
+
+/**
+ * @brief Return the number of items currently stored.
+ */
+T_CHMIMPL
+size_t CHMIMPL::size() const
+{
+  return m_size;
+}
+
+
+/**
+ * @brief Return the current table size.
+ */
+T_CHMIMPL
+size_t CHMIMPL::capacity() const
+{
+  const Table& table = m_updater.get();
+  return table.capacity();
+}
+
+
+/** 
+ * @brief Return the hasher object.
+ */
+T_CHMIMPL
+inline
+const typename CHMIMPL::Hasher_t& CHMIMPL::hasher() const
+{
+  return m_hasher;
+}
+
+
+/** 
+ * @brief Return the matcher object.
+ */
+T_CHMIMPL
+inline
+const typename CHMIMPL::Matcher_t& CHMIMPL::matcher() const
+{
+  return m_matcher;
+}
+
+
+/**
+ * @brief Constructor.
+ * @param table The table instance we're referencing.
+ * @param end If true, initialize this to an end iterator.
+ *            Otherwise, initialize it to a a begin iterator.
+ */
+T_CHMIMPL
+inline
+CHMIMPL::const_iterator::const_iterator (const Table& table, bool end)
+  : m_table (table),
+    m_offset (INVALID)
+{
+  // For an end iterator, we want offset to be -1.
+  // For a begin iterator, we need to advance to the first non-null entry.
+  if (!end) {
+    next();
+  }
+}
+
+
+/**
+ * @brief Constructor.
+ * @param table The table instance we're referencing.
+ * @param offset Offset of the iterator within the table.
+ *               (Must point at an occupied entry.)
+ */
+T_CHMIMPL
+CHMIMPL::const_iterator::const_iterator (const Table& table, size_t offset)
+  : m_table (table),
+    m_offset (offset)
+{
+  assert (offset == INVALID || m_table.entry (offset).m_key != nullval);
+}
+
+
+/**
+ * @brief Advance the iterator to the next occupied entry.
+ */
+T_CHMIMPL
+inline
+void CHMIMPL::const_iterator::next()
+{
+  do {
+    ++m_offset;
+    if (m_offset >= m_table.capacity()) {
+      m_offset = INVALID;
+      break;
+    }
+  } while (m_table.entry (m_offset).m_key == nullval);
+}
+
+
+/**
+ * @brief Move the iterator back to the previous occupied entry.
+ */
+T_CHMIMPL
+inline
+void CHMIMPL::const_iterator::prev()
+{
+  if (m_offset == INVALID) {
+    m_offset = m_table.capacity();
+  }
+  do {
+    --m_offset;
+    if (m_offset >= m_table.capacity()) {
+      m_offset = INVALID;
+      break;
+    }
+  } while (m_table.entry (m_offset).m_key == nullval);
+}
+
+
+/**
+ * @brief Return the key for this iterator.
+ */
+T_CHMIMPL
+inline
+typename CHMIMPL::val_t CHMIMPL::const_iterator::key() const
+{
+  return m_table.entry (m_offset).m_key;
+}
+    
+
+/**
+ * @brief Return the value for this iterator.
+ */
+T_CHMIMPL
+inline
+typename CHMIMPL::val_t CHMIMPL::const_iterator::value() const
+{
+  return m_table.entry (m_offset).m_val;
+}
+
+
+/**
+ * @brief Compare two iterators.
+ */
+T_CHMIMPL
+inline
+bool CHMIMPL::const_iterator::operator!= (const const_iterator& other) const
+{
+  if (m_offset != other.m_offset) return true;
+  if (m_offset == INVALID) return false;
+  return &m_table != &other.m_table;
+}
+
+
+/**
+ * @brief Check that the iterator is valid (not pointing at the end).
+ */
+T_CHMIMPL
+inline
+bool CHMIMPL::const_iterator::valid() const
+{
+  return m_offset != INVALID;
+}
+
+
+/**
+ * @brief Return a range that can be used to iterate over the container.
+ */
+T_CHMIMPL
+inline
+typename CHMIMPL::const_iterator_range CHMIMPL::range() const
+{
+  const Table& table = m_updater.get();
+  return const_iterator_range (const_iterator (table, false),
+                               const_iterator (table, true));
+}
+
+
+/** 
+ * @brief A begin iterator for the container.
+ */
+T_CHMIMPL
+inline
+typename CHMIMPL::const_iterator CHMIMPL::begin() const
+{
+  const Table& table = m_updater.get();
+  return const_iterator (table, false);
+}
+
+
+/** 
+ * @brief An end iterator for the container.
+ */
+T_CHMIMPL
+inline
+typename CHMIMPL::const_iterator CHMIMPL::end() const
+{
+  const Table& table = m_updater.get();
+  return const_iterator (table, true);
+}
+
+
+/**
+ * @brief Erase the table and change the capacity.
+ * @param capacity The new table capacity.
+ * @param ctx Execution context.
+ *
+ * Returns an iterator pointing at the start of the old table.
+ */
+T_CHMIMPL
+typename CHMIMPL::const_iterator
+CHMIMPL::clear (size_t capacity,
+                const typename Updater_t::Context_t& ctx)
+{
+  capacity = round_up (capacity);
+  lock_t lock (m_mutex);
+  std::unique_ptr<Table> new_table (new (capacity) Table (capacity,
+                                                          m_hasher,
+                                                          m_matcher));
+
+  // Save an iterator to the old table.
+  const_iterator it = begin();
+
+  // Publish the new table.
+  m_size = 0;
+  m_table = new_table.get();
+  m_updater.update (std::move (new_table), ctx);
+  return it;
+}
+
+
+/**
+ * @brief Erase the table (don't change the capacity).
+ * @param ctx Execution context.
+ *
+ * Returns an iterator pointing at the start of the old table.
+ */
+T_CHMIMPL
+typename CHMIMPL::const_iterator
+CHMIMPL::clear (const typename Updater_t::Context_t& ctx)
+{
+  const Table& table = m_updater.get();
+  // Possible race here in that the container capacity could increase
+  // before we take out the lock in clear().  In practice, this should
+  // not actually be a problem.
+  return clear (table.capacity(), ctx);
+}
+
+
+/**
+ * @brief Increase the table capacity.
+ * @param capacity The new table capacity.
+ * @param ctx Execution context.
+ *
+ * No action will be taken in @c capacity is smaller
+ * than the current capacity.
+ */
+T_CHMIMPL
+void CHMIMPL::reserve (size_t capacity,
+                       const typename Updater_t::Context_t& ctx)
+{
+  lock_t lock (m_mutex);
+  if (capacity < m_table->capacity()) return;
+  grow (lock, round_up (capacity), ctx);
+}
+
+
+/**
+ * @brief Called when this thread is no longer referencing anything
+ *        from this container.
+ * @param ctx Execution context.
+ */
+T_CHMIMPL
+void CHMIMPL::quiescent (const typename Updater_t::Context_t& ctx)
+{
+  m_updater.quiescent (ctx);
+}
+
+
+/**
+ * @brief Make the table larger.
+ * @param ctx Execution context.
+ *
+ * Must be holding a lock on the mutex to call this.
+ */
+T_CHMIMPL
+bool CHMIMPL::grow (lock_t& lock, const typename Updater_t::Context_t& ctx)
+{
+  // Allocate a new table with twice the capacity.
+  return grow (lock, 2*m_table->capacity(), ctx);
+}
+
+
+/**
+ * @brief Make the table larger.
+ * @param new_capacity The new table capacity (must be a power of 2).
+ * @param ctx Execution context.
+ *
+ * Must be holding a lock on the mutex to call this.
+ */
+T_CHMIMPL
+bool CHMIMPL::grow (lock_t& /*lock*/,
+                    size_t new_capacity,
+                    const typename Updater_t::Context_t& ctx)
+{
+  // The current table.
+  const Table& table = *m_table;
+
+  std::unique_ptr<Table> new_table (new (new_capacity) Table (new_capacity,
+                                                              m_hasher,
+                                                              m_matcher));
+
+  // Copy data from the existing table to the new one.
+  size_t capacity = table.capacity();
+  for (size_t i = 0; i < capacity; i++) {
+    const entry_t& ent = table.entry(i);
+    if (ent.m_key != nullval) {
+      size_t hash = m_hasher (ent.m_key);
+      bool insert;
+      size_t offset = new_table->probeWrite (ent.m_key, hash, insert);
+      if (offset == INVALID) {
+        std::abort();
+      }
+      entry_t& new_entry = new_table->entry (offset);
+      new_entry.m_key = static_cast<val_t> (ent.m_key);
+      new_entry.m_val = static_cast<val_t> (ent.m_val);
+    }
+  }
+
+  // Publish the new table.
+  m_table = new_table.get();
+  m_updater.update (std::move (new_table), ctx);
+    
+  return true;
+}
+
+
+/**
+ * @brief Round up to a power of 2.
+ * https://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
+ */
+T_CHMIMPL
+uint64_t CHMIMPL::round_up (uint64_t x)
+{
+  if (x <= 64) return 64;
+  --x;
+  x |= (x>>1);
+  x |= (x>>2);
+  x |= (x>>4);
+  x |= (x>>8);
+  x |= (x>>16);
+  x |= (x>>32);
+  ++x;
+  return x;
+}
+
+
+#undef CHMIMPL
+#undef T_CHMIMPL
+
+
+
+} // namespace detail
+} // namespace CxxUtils
diff --git a/Control/CxxUtils/share/ConcurrentHashmapImpl_test.ref b/Control/CxxUtils/share/ConcurrentHashmapImpl_test.ref
new file mode 100644
index 000000000000..e5e8e0345742
--- /dev/null
+++ b/Control/CxxUtils/share/ConcurrentHashmapImpl_test.ref
@@ -0,0 +1,5 @@
+CxxUtils/ConcurrentHashmapImpl_test
+test1
+test2
+test3
+test4
diff --git a/Control/CxxUtils/test/ConcurrentHashmapImpl_test.cxx b/Control/CxxUtils/test/ConcurrentHashmapImpl_test.cxx
new file mode 100644
index 000000000000..a76085545fd8
--- /dev/null
+++ b/Control/CxxUtils/test/ConcurrentHashmapImpl_test.cxx
@@ -0,0 +1,571 @@
+/*
+ * Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration.
+ */
+/**
+ * @file CxxUtils/test/ConcurrentHashmapImpl_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Dec, 2020
+ * @brief Tests for ConcurrentHashmapImpl.
+ */
+
+
+#undef NDEBUG
+#include "CxxUtils/ConcurrentHashmapImpl.h"
+#include <mutex>
+#include <thread>
+#include <shared_mutex>
+#include <vector>
+#include <memory>
+#include <iostream>
+#include <cassert>
+#include <unistd.h>
+
+
+const int nslots = 4;
+
+
+// Needed to access internals of ConcurrentHashmapImpl.
+class ConcurrentHashmapImplTest
+{
+public:
+  static void test2();
+};
+
+
+struct Context_t
+{
+  Context_t (int the_slot = 0) : slot (the_slot) {}
+  int slot;
+};
+
+
+template <class T>
+class TestUpdater
+{
+public:
+  using Context_t = ::Context_t;
+
+  TestUpdater()
+    : m_p (nullptr),
+      m_inGrace (0)
+  {
+  }
+
+  TestUpdater (TestUpdater&& other)
+    : m_p (static_cast<T*> (other.m_p)),
+      m_inGrace (0)
+  {
+  }
+
+  TestUpdater& operator= (const TestUpdater&) = delete; // coverity
+
+  ~TestUpdater()
+  {
+    delete m_p;
+    for (T* p : m_garbage) delete p;
+  }
+
+  void update (std::unique_ptr<T> p, const Context_t& ctx)
+  {
+    std::lock_guard<std::mutex> g (m_mutex);
+    if (m_p) m_garbage.push_back (m_p);
+    m_p = p.release();
+    m_inGrace = (~(1<<ctx.slot)) & ((1<<nslots)-1);
+  }
+
+  void discard (std::unique_ptr<T> p)
+  {
+    std::lock_guard<std::mutex> g (m_mutex);
+    m_garbage.push_back (p.release());
+    m_inGrace = ((1<<nslots)-1);
+  }
+
+  const T& get() const { return *m_p; }
+
+  void quiescent (const Context_t& ctx)
+  {
+    unsigned int mask = (1<<ctx.slot);
+    std::lock_guard<std::mutex> g (m_mutex);
+    if ((m_inGrace & mask) == 0) return;
+    m_inGrace &= ~mask;
+    if (!m_inGrace) {
+      for (T* p : m_garbage) delete p;
+      m_garbage.clear();
+    }
+  }
+
+  static Context_t defaultContext() { return 0; }
+
+
+private:
+  std::mutex m_mutex;
+  std::atomic<T*> m_p;
+  std::vector<T*> m_garbage;
+  unsigned int m_inGrace;
+};
+
+
+struct TestHash
+{
+  size_t operator() (size_t x) const { return x; }
+};
+
+
+using CHMImpl = CxxUtils::detail::ConcurrentHashmapImpl<TestUpdater, TestHash>;
+
+
+// Test CHMTableIterator
+void test1()
+{
+  std::cout << "test1\n";
+  using TableIterator = CxxUtils::detail::CHMTableIterator<4>;
+  // table capacity = 64
+  TableIterator it (12345, 0x3f, 6, 16);
+  std::vector<size_t> offsets;
+  do {
+    offsets.push_back (it.offset());
+  } while (it.next());
+  assert ((std::vector<size_t> {57, 58, 59, 56, 61, 62, 63, 60, 5, 6, 7, 4, 17, 18, 19, 16 }) == offsets);
+}
+
+
+// Test ConcurrentHashmapImpl::Table.
+void ConcurrentHashmapImplTest::test2()
+{
+  std::cout << "test2\n";
+  using entry_t = CHMImpl::entry_t;
+  using Table = CHMImpl::Table;
+  std::unique_ptr<Table> table (new (16) Table (16));
+
+  assert (table->capacity() == 16);
+
+  size_t nstored = 0;
+  while (true) {
+    size_t key = 23*nstored + 100;
+    size_t hash = TestHash() (key);
+
+    bool insert;
+    size_t offset = table->probeWrite (key, hash, insert);
+    if (offset == CHMImpl::INVALID) {
+      break;
+    }
+    assert (insert);
+    entry_t& ent = table->entry (offset);
+    ent.m_val = key+1;
+    ent.m_key = key;
+    const Table* ctable = table.get();
+    const entry_t& cent = ctable->entry (offset);
+    assert (cent.m_val == key+1);
+    assert (cent.m_key == key);
+    ++nstored;
+  }
+  assert (nstored == 16);
+
+  for (size_t i = 0; i < nstored; ++i) {
+    size_t key = 23*i + 100;
+    size_t hash = TestHash() (key);
+    {
+      size_t offset = table->probeRead (key, hash);
+      assert (offset != CHMImpl::INVALID);
+      const entry_t& ent = table->entry (offset);
+      assert (ent.m_key == key && ent.m_val == key+1);
+    }
+    {
+      bool insert;
+      size_t offset = table->probeWrite (key, hash, insert);
+      assert (offset != CHMImpl::INVALID);
+      assert (!insert);
+      entry_t& ent = table->entry (offset);
+      assert (ent.m_key == key && ent.m_val == key+1);
+    }
+  }
+
+  size_t key = 23*nstored + 100;
+  size_t hash = TestHash() (key);
+  assert (table->probeRead (key, hash) == CHMImpl::INVALID);
+  bool insert;
+  assert (table->probeWrite (key, hash, insert) == CHMImpl::INVALID);
+}
+
+
+void test3()
+{
+  std::cout << "test3\n";
+  CHMImpl chm (CHMImpl::Updater_t(), 50,
+               CHMImpl::Hasher_t(),
+               CHMImpl::Matcher_t(),
+               CHMImpl::Context_t());
+
+  assert (chm.size() == 0);
+  assert (chm.capacity() == 64);
+
+  assert (chm.hasher()(12345) == CHMImpl::Hasher_t()(12345));
+  assert (chm.matcher() (4321, 4321));
+  assert (!chm.matcher() (4321, 4322));
+
+  {
+    auto [begin, end] = chm.range();
+    assert (!(begin != end));
+  }
+
+  for (size_t i = 0; i < 1000; i++) {
+    size_t key = 23*i + 100;
+    size_t hash = TestHash() (key);
+
+    auto [it, flag] = chm.put (key, hash, key+1, true, Context_t());
+    assert (flag);
+    assert (it.valid());
+    assert (it.key() == key);
+    assert (it.value() == key+1);
+  }
+  assert (chm.size() == 1000);
+  assert (chm.capacity() == 1024);
+
+  for (size_t i = 0; i < 1000; i++) {
+    size_t key = 23*i + 100;
+    size_t hash = TestHash() (key);
+
+    CHMImpl::const_iterator it = chm.get (key, hash);
+    assert (it.valid());
+    assert (it.value() == key+1);
+  }
+
+  for (size_t i = 0; i < 1000; i++) {
+    size_t key = 23*i + 100;
+    size_t hash = TestHash() (key);
+
+    auto [it, flag] = chm.put (key, hash, key+2, true, Context_t());
+    assert (!flag);
+    assert (it.valid());
+    assert (it.key() == key);
+    assert (it.value() == key+2);
+  }
+  assert (chm.size() == 1000);
+  assert (chm.capacity() == 1024);
+
+  std::vector<size_t> exp;
+  for (size_t i = 0; i < 1000; i++) {
+    size_t key = 23*i + 100;
+    size_t hash = TestHash() (key);
+
+    CHMImpl::const_iterator it = chm.get (key, hash);
+    assert (it.valid());
+    assert (it.value() == key+2);
+
+    exp.push_back (key);
+  }
+  std::sort (exp.begin(), exp.end());
+
+  std::vector<size_t> seen;
+  {
+    auto [begin, end] = chm.range();
+    for (auto it = begin; it != end; it.next()) {
+      assert (it.key()+2 == it.value());
+      seen.push_back (it.key());
+    }
+  }
+  std::sort (seen.begin(), seen.end());
+  assert (exp == seen);
+
+  seen.clear();
+  {
+    CHMImpl::const_iterator begin = chm.begin();
+    CHMImpl::const_iterator it = chm.end();
+    assert (it != begin);
+    do {
+      it.prev();
+      assert (it.key()+2 == it.value());
+      seen.push_back (it.key());
+    } while (it != begin);
+  }
+    
+  std::sort (seen.begin(), seen.end());
+  assert (exp == seen);
+
+  {
+    size_t key = 23*500 + 100;
+    size_t hash = TestHash() (key);
+    auto [it, flag] = chm.put (key, hash, 200, false, Context_t());
+    assert (!flag);
+    assert (it.valid());
+    assert (it.key() == key);
+    assert (it.value() == key+2);
+
+    CHMImpl::const_iterator it2 = chm.get (key, hash);
+    assert (it2.valid());
+    assert (it2.value() == key+2);
+  }
+
+  {
+    size_t key = 23*1500 + 100;
+    size_t hash = TestHash() (key);
+    auto [it, flag] = chm.put (key, hash, 200, false, Context_t());
+    assert (flag);
+    assert (it.valid());
+    assert (it.key() == key);
+    assert (it.value() == 200);
+
+    CHMImpl::const_iterator it2 = chm.get (key, hash);
+    assert (it2.valid());
+    assert (it2.value() == 200);
+  }
+
+  assert (chm.size() == 1001);
+  assert (chm.capacity() == 1024);
+
+  {
+    size_t iseen = 0;
+    CHMImpl::const_iterator it = chm.clear (Context_t());
+    while (it.valid()) {
+      ++iseen;
+      it.next();
+    }
+    assert (iseen == 1001);
+  }
+  assert (chm.size() == 0);
+  assert (chm.capacity() == 1024);
+
+  chm.clear (200, Context_t());
+  assert (chm.size() == 0);
+  assert (chm.capacity() == 256);
+
+  chm.reserve (100, Context_t());
+  assert (chm.size() == 0);
+  assert (chm.capacity() == 256);
+
+  chm.reserve (300, Context_t());
+  assert (chm.size() == 0);
+  assert (chm.capacity() == 512);
+}
+
+
+//***************************************************************************
+// Threaded test.
+//
+
+
+std::shared_timed_mutex start_mutex;
+
+
+class test4_Base
+{
+public:
+  static constexpr size_t nwrites = 10000;
+  
+  test4_Base (int slot);
+  int ctx() const { return m_slot; }
+  void setContext();
+
+  
+private:
+  int m_slot;
+};
+
+
+test4_Base::test4_Base (int slot)
+  : m_slot (slot)
+{
+}
+
+
+void test4_Base::setContext()
+{
+}
+
+
+
+class test4_Writer
+  : public test4_Base
+{
+public:
+  test4_Writer (int slot, CHMImpl& map);
+  void operator()();
+
+private:
+  CHMImpl& m_map;
+};
+
+
+test4_Writer::test4_Writer (int slot, CHMImpl& map)
+  : test4_Base (slot),
+    m_map (map)
+{
+}
+
+
+void test4_Writer::operator()()
+{
+  setContext();
+  std::shared_lock<std::shared_timed_mutex> lock (start_mutex);
+
+  for (size_t i=0; i < nwrites; i++) {
+    size_t key = 23*i + 100;
+    size_t hash = TestHash() (key);
+    assert (m_map.put (key, hash, key+2, true, Context_t()).second);
+    m_map.quiescent (ctx());
+    if (((i+1)%128) == 0) {
+      usleep (1000);
+    }
+  }
+
+  for (size_t i=0; i < nwrites; i++) {
+    size_t key = 23*i + 100;
+    size_t hash = TestHash() (key);
+    assert (!m_map.put (key, hash, key+3, true, Context_t()).second);
+    m_map.quiescent (ctx());
+    if (((i+1)%128) == 0) {
+      usleep (1000);
+    }
+  }
+
+  for (size_t i=0; i < nwrites; i++) {
+    size_t key = 23*i + 100;
+    size_t hash = TestHash() (key);
+    assert (!m_map.put (key, hash, key+4, true, Context_t()).second);
+    m_map.quiescent (ctx());
+    if (((i+1)%128) == 0) {
+      usleep (1000);
+    }
+  }
+
+  {
+    size_t key = 23*nwrites + 100;
+    size_t hash = TestHash() (key);
+    assert (m_map.put (key, hash, key+3, true, Context_t()).second);
+  }
+}
+
+
+
+class test4_Iterator
+  : public test4_Base
+{
+public:
+  test4_Iterator (int slot, CHMImpl& map);
+  void operator()();
+
+private:
+  CHMImpl& m_map;
+};
+
+
+test4_Iterator::test4_Iterator (int slot, CHMImpl& map)
+  : test4_Base (slot),
+    m_map (map)
+{
+}
+
+
+void test4_Iterator::operator()()
+{
+  setContext();
+  std::shared_lock<std::shared_timed_mutex> lock (start_mutex);
+
+  while (true) {
+    auto [begin, end] = m_map.range();
+    while (begin != end) {
+      size_t key = begin.key();
+      size_t val = begin.value();
+      assert (val == key+2 || val == key+3 || val == key+4);
+      begin.next();
+    }
+
+    auto [begin2, end2] = m_map.range();
+    if (begin2 != end2) {
+      do {
+        end2.prev();
+        size_t key = end2.key();
+        size_t val = end2.value();
+        assert (val == key+2 || val == key+3 || val == key+4);
+      } while (begin2 != end2);
+    }
+
+    m_map.quiescent (ctx());
+    if (m_map.size() > nwrites) break;
+  }
+}
+
+
+class test4_Reader
+  : public test4_Base
+{
+public:
+  test4_Reader (int slot, CHMImpl& map);
+  void operator()();
+
+private:
+  CHMImpl& m_map;
+};
+
+
+test4_Reader::test4_Reader (int slot, CHMImpl& map)
+  : test4_Base (slot),
+    m_map (map)
+{
+}
+
+
+void test4_Reader::operator()()
+{
+  setContext();
+  std::shared_lock<std::shared_timed_mutex> lock (start_mutex);
+
+  while (true) {
+    for (size_t i = 0; ; ++i) {
+      size_t key = 23*i + 100;
+      size_t hash = TestHash() (key);
+      CHMImpl::const_iterator it = m_map.get (key, hash);
+      if (!it.valid()) {
+        break;
+      }
+      assert(it.value() == key+2 || it.value() == key+3 || it.value() == key+4);
+    }
+
+    m_map.quiescent (ctx());
+    if (m_map.size() > nwrites) break;
+  }
+}
+
+
+void test4_iter()
+{
+  CHMImpl chm (CHMImpl::Updater_t(), 50,
+               CHMImpl::Hasher_t(),
+               CHMImpl::Matcher_t(),
+               CHMImpl::Context_t());
+
+  const int nthread = 4;
+  std::thread threads[nthread];
+  start_mutex.lock();
+
+  threads[0] = std::thread (test4_Writer (0, chm));
+  threads[1] = std::thread (test4_Iterator (1, chm));
+  threads[2] = std::thread (test4_Reader (2, chm));
+  threads[3] = std::thread (test4_Reader (3, chm));
+
+  // Try to get the threads starting as much at the same time as possible.
+  start_mutex.unlock();
+  for (int i=0; i < nthread; i++)
+    threads[i].join();
+}
+
+
+void test4()
+{
+  std::cout << "test4\n";
+
+  for (int i=0; i < 5; i++) {
+    test4_iter();
+  }
+}
+
+
+int main()
+{
+  std::cout << "CxxUtils/ConcurrentHashmapImpl_test\n";
+  test1();
+  ConcurrentHashmapImplTest::test2();
+  test3();
+  test4();
+  return 0;
+}
-- 
GitLab


From 7896d364b0efafd1153fe61bc6babf6e7d57c96d Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Mon, 14 Dec 2020 16:49:50 -0500
Subject: [PATCH 104/225] CxxUtils: Add ConcurrentStrMap.

Add ConcurrentStrMap, a hash map from strings to something that will fit
in a uintptr_t.  Allows for concurrent lockless reads.
---
 Control/CxxUtils/CMakeLists.txt               |   9 +
 Control/CxxUtils/CxxUtils/ConcurrentStrMap.h  | 527 ++++++++++
 .../CxxUtils/CxxUtils/ConcurrentStrMap.icc    | 619 ++++++++++++
 .../CxxUtils/share/ConcurrentStrMap_test.ref  |   5 +
 .../CxxUtils/test/ConcurrentStrMap_test.cxx   | 924 ++++++++++++++++++
 5 files changed, 2084 insertions(+)
 create mode 100644 Control/CxxUtils/CxxUtils/ConcurrentStrMap.h
 create mode 100644 Control/CxxUtils/CxxUtils/ConcurrentStrMap.icc
 create mode 100644 Control/CxxUtils/share/ConcurrentStrMap_test.ref
 create mode 100644 Control/CxxUtils/test/ConcurrentStrMap_test.cxx

diff --git a/Control/CxxUtils/CMakeLists.txt b/Control/CxxUtils/CMakeLists.txt
index f4f725e30015..1ca2f75bb18a 100644
--- a/Control/CxxUtils/CMakeLists.txt
+++ b/Control/CxxUtils/CMakeLists.txt
@@ -97,6 +97,15 @@ if ( IS_DIRECTORY /usr/include/ck )
     PRIVATE "-DHAVE_CK" )
 endif()
 
+atlas_add_test( ConcurrentStrMap_test
+  SOURCES test/ConcurrentStrMap_test.cxx
+  INCLUDE_DIRS ${TBB_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${CK_INCLUDE}
+  LINK_LIBRARIES CxxUtils TestTools ${TBB_LIBRARIES} ${Boost_LIBRARIES} ${CK_LIBRARIES} )
+if ( IS_DIRECTORY /usr/include/ck )
+  target_compile_definitions(CxxUtils_ConcurrentStrMap_test
+    PRIVATE "-DHAVE_CK" )
+endif()
+
 atlas_add_test( exctrace2_test
    SOURCES test/exctrace2_test.cxx
    LINK_LIBRARIES CxxUtils
diff --git a/Control/CxxUtils/CxxUtils/ConcurrentStrMap.h b/Control/CxxUtils/CxxUtils/ConcurrentStrMap.h
new file mode 100644
index 000000000000..df1286a5eea6
--- /dev/null
+++ b/Control/CxxUtils/CxxUtils/ConcurrentStrMap.h
@@ -0,0 +1,527 @@
+// This file's extension implies that it's C, but it's really -*- C++ -*-.
+/*
+ * Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration.
+ */
+/**
+ * @file CxxUtils/ConcurrentStrMap.h
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Dec, 2020
+ * @brief Hash map from strings allowing concurrent, lockless reads.
+ */
+
+
+#ifndef CXXUTILS_CONCURRENTSTRMAP_H
+#define CXXUTILS_CONCURRENTSTRMAP_H
+
+
+#include "CxxUtils/ConcurrentHashmapImpl.h"
+#include "CxxUtils/concepts.h"
+#include "boost/iterator/iterator_facade.hpp"
+#include "boost/range/iterator_range.hpp"
+#include <type_traits>
+#include <stdexcept>
+
+
+namespace CxxUtils {
+
+
+/**
+ * @brief Hash map from strings allowing concurrent, lockless reads.
+ *
+ * This class implements a hash map from strings.
+ * The mapped type may be a pointer or any numeric type that can
+ * fit in a uintptr_t.
+ * It allows for concurrent access from many threads.
+ * Reads can proceed without taking out a lock, while writes are serialized
+ * with each other.  Thus, this is appropriate for maps which are read-mostly.
+ *
+ * This is based on ConcurrentHashmapImpl.
+ *
+ * Besides the mapped value type,
+ * this class is templated on an UPDATER class, which is used to manage
+ * the underlying memory.  The requirements are the same as for the 
+ * UPDATER template argument of ConcurrentTangeMap; see there for
+ * further details.  (AthenaKernel/RCUUpdater is a concrete version
+ * that should work in the context of Athena.)
+ *
+ * This mostly supports the interface of std::unordered_map, with a few
+ * differences / omissions:
+ *
+ *  - Dereferencing the iterator returns a structure by value, not a reference.
+ *  - No try_emplace.
+ *  - No insert methods with hints.
+ *  - No swap().  Could probably be implemented if really needed, but would
+ *    require support in ConcurrentHashmapImpl and in the Updater classes.
+ *  - No clear().  Could be implemented if really needed; we would need
+ *    to be able to attach the key strings to be deleted to the old
+ *    table instance.
+ *  - No erase() methods.  In addition to what's needed for clear(),
+ *    the underlying hash table would need to support tombstones.
+ *  - No operator==.
+ *  - Nothing dealing with the bucket/node interface or merge().
+ *
+ * Possible improvements:
+ *
+ *  - We could speed up lookups further by storing the hash along with
+ *    the string.  That way, we should almost always not have to do
+ *    the full string comparison more than once.
+ *
+ *  - We could use a more efficient allocator for the string keys
+ *    that we need to save.  That could in particular help for updates,
+ *    where currently we always need to allocate a string, and then
+ *    need to delete it if it turns out we're doing an update rather
+ *    than in insertion.
+ */
+template <class VALUE, template <class> class UPDATER>
+// FIXME: Check UPDATER too.
+ATH_REQUIRES (std::is_pod_v<VALUE> &&
+              (sizeof (VALUE) <= sizeof (uintptr_t)))
+class ConcurrentStrMap
+{
+private:
+  /// The underlying uint->uint hash table.
+  struct Hasher;
+  struct Matcher;
+  using Impl_t = typename detail::ConcurrentHashmapImpl<UPDATER, Hasher, Matcher>;
+  /// Representation type in the underlying map.
+  using val_t = CxxUtils::detail::ConcurrentHashmapVal_t;
+
+
+public:
+  /// Standard STL types.
+  using key_type = std::string;
+  using mapped_type = VALUE;
+  using size_type = size_t;
+  /// Updater object.
+  using Updater_t = typename Impl_t::Updater_t;
+  /// Context type.
+  using Context_t = typename Updater_t::Context_t;
+
+  /// Ensure that the underlying map can store our mapped_type.
+  static_assert( sizeof(typename Impl_t::val_t) >= sizeof(mapped_type) );
+
+
+  /**
+   * @brief Constructor.
+   * @param updater Object used to manage memory
+   *                (see comments at the start of the class).
+   * @param capacity The initial table capacity.
+   *                 (Will be rounded up to a power of two.)
+   * @param ctx Execution context.
+   */
+  ConcurrentStrMap (Updater_t&& updater,
+                    size_type capacity = 64,
+                    const Context_t& ctx = Updater_t::defaultContext());
+
+  /** 
+   * @brief Constructor from another map.
+   * @param updater Object used to manage memory
+   *                (see comments at the start of the class).
+   * @param capacity The initial table capacity of the new table.
+   *                 (Will be rounded up to a power of two.)
+   * @param ctx Execution context.
+   *
+   * (Not really a copy constructor since we need to pass @c updater.)
+   */
+  ConcurrentStrMap (const ConcurrentStrMap& other,
+                    Updater_t&& updater,
+                    size_t capacity = 64,
+                    const Context_t& ctx = Updater_t::defaultContext());
+
+
+  /** 
+   * @brief Constructor from a range.
+   * @param f Start iterator for the range.
+   * @param l End iterator for the range.
+   * @param updater Object used to manage memory
+   *                (see comments at the start of the class).
+   * @param capacity The initial table capacity of the new table.
+   *                 (Will be rounded up to a power of two.)
+   * @param ctx Execution context.
+   *
+   * Constructor from a range of pairs.
+   */
+  template <class InputIterator>
+  ConcurrentStrMap (InputIterator f,
+                    InputIterator l,
+                    Updater_t&& updater,
+                    size_type capacity = 64,
+                    const Context_t& ctx = Updater_t::defaultContext());
+
+
+  /// Copy / move / assign not supported.
+  ConcurrentStrMap (const ConcurrentStrMap& other) = delete;
+  ConcurrentStrMap (ConcurrentStrMap&& other) = delete;
+  ConcurrentStrMap& operator= (const ConcurrentStrMap& other) = delete;
+  ConcurrentStrMap& operator= (ConcurrentStrMap&& other) = delete;
+
+
+  /**
+   * @brief Destructor.
+   */
+  ~ConcurrentStrMap();
+
+
+  /**
+   * @brief Return the number of items currently in the map.
+   */
+  size_type size() const;
+
+
+  /**
+   * @brief Test if the map is currently empty.
+   */
+  bool empty() const;
+
+
+  /**
+   * @brief Return the current size (capacity) of the hash table.
+   */
+  size_t capacity() const;
+
+
+  /**
+   * @brief Value structure for iterators.
+   *
+   * For a map from K to V, a STL-style iterator should dereference
+   * to a std::pair<const K, V>.  However, we don't actually store an object
+   * like that anywhere.  In order to be able to have STL-like iterators,
+   * we instead use a pair where the first element is a const reference
+   * to the std::string key.  We will
+   * return this _by value_ when we deference an iterator.
+   * (The compiler should be able to optimize out the redundant
+   * packing and unpacking of fields.)
+   */
+  using const_iterator_value = std::pair<const key_type&, mapped_type>;
+
+
+  /**
+   * @brief Iterator class.
+   *
+   * This uses boost::iterator_facade to define the methods required
+   * by an STL iterator in terms of the private methods below.
+   *
+   * Since dereference() will be returning a const_iterator_value by value,
+   * we also need to override the reference type.
+   */
+  class const_iterator
+    : public boost::iterator_facade<const_iterator,
+                                    const const_iterator_value,
+                                    std::bidirectional_iterator_tag,
+                                    const const_iterator_value>
+  {
+  public:
+   /**
+     * @brief Constructor.
+     * @param it Iterator of the underlying table.
+     */
+    const_iterator (typename Impl_t::const_iterator it);
+
+
+    /**
+     * @brief Test if this iterator is value.
+     *
+     * This should be the same as testing for != end().
+     */
+    bool valid() const;
+
+
+  private:
+    /// Required by iterator_facade.
+    friend class boost::iterator_core_access;
+
+
+    /**
+     * @brief iterator_facade requirement: Increment the iterator.
+     */
+    void increment();
+
+
+    /**
+     * @brief iterator_facade requirement: Decrement the iterator.
+     */
+    void decrement();
+
+
+    /**
+     * @brief iterator_facade requirement: Equality test.
+     */
+    bool equal (const const_iterator& other) const;
+
+
+    /**
+     * @brief iterator_facade requirement: Dereference the iterator.
+     */
+    const const_iterator_value dereference() const;
+
+
+    /// The iterator on the underlying table.
+    typename Impl_t::const_iterator m_impl;
+  };
+
+
+  /// A range defined by two iterators.
+  typedef boost::iterator_range<const_iterator> const_iterator_range;
+
+
+  /**
+   * @brief Return an interator range covering the entire map.
+   */
+  const_iterator_range range() const;
+
+
+  /**
+   * @brief Iterator at the start of the map.
+   */
+  const_iterator begin() const;
+
+
+  /**
+   * @brief Iterator at the end of the map.
+   */
+  const_iterator end() const;
+
+
+  /**
+   * @brief Iterator at the start of the map.
+   */
+  const_iterator cbegin() const;
+
+
+  /**
+   * @brief Iterator at the end of the map.
+   */
+  const_iterator cend() const;
+
+
+  /**
+   * @brief Test if a key is in the container.
+   * @param key The key to test.
+   */
+  bool contains (const key_type& key) const;
+
+
+  /**
+   * @brief Return the number of times a given key is in the container.
+   * @param key The key to test.
+   *
+   * Returns either 0 or 1, depending on whether or not the key is in the map.
+   */
+  size_type count (const key_type& key) const;
+
+
+  /**
+   * @brief Look up an element in the map.
+   * @param key The element to find.
+   *
+   * Returns either an iterator referencing the found element or end().
+   */
+  const_iterator find (const key_type& key) const;
+
+
+  /**
+   * @brief Look up an element in the map.
+   * @param key The element to find.
+   *
+   * Returns the value associated with the key.
+   * Throws @c std::out_of_range if the key does not exist in the map.
+   */
+  mapped_type at (const std::string& key) const;
+
+
+  /**
+   * @brief Return a range of iterators with entries matching @c key.
+   * @param key The element to find.
+   *
+   * As keys are unique in this container, this is either a single-element
+   * range, or both iterators are equal to end().
+   */
+  std::pair<const_iterator, const_iterator>
+  equal_range (const key_type& key) const;
+
+
+  /**
+   * @brief Add an element to the map.
+   * @param key The key of the new item to add.
+   * @param val The value of the new item to add.
+   * @param ctx Execution context.
+   *
+   * This will not overwrite an existing entry.
+   * The first element in the returned pair is an iterator referencing
+   * the added item.  The second is a flag that is true if a new element
+   * was added.
+   */
+  std::pair<const_iterator, bool>
+  emplace (const key_type& key, mapped_type val,
+           const Context_t& ctx = Updater_t::defaultContext());
+
+
+  /**
+   * @brief Add an element to the map, or overwrite an existing one.
+   * @param key The key of the new item to add.
+   * @param val The value of the new item to add.
+   * @param ctx Execution context.
+   *
+   * This will overwrite an existing entry.
+   * The first element in the returned pair is an iterator referencing
+   * the added item.  The second is a flag that is true if a new element
+   * was added.
+   */
+  std::pair<const_iterator, bool>
+  insert_or_assign (const key_type& key, mapped_type val,
+                    const Context_t& ctx = Updater_t::defaultContext());
+
+
+  /**
+   * @break Add an element to the map.
+   * @param p The item to add.
+   *          Should be a pair where first is the string key
+   *          and second is the integer value.
+   *
+   * This will not overwrite an existing entry.
+   * The first element in the returned pair is an iterator referencing
+   * the added item.  The second is a flag that is true if a new element
+   * was added.
+   */
+  template <class PAIR>
+  std::pair<const_iterator, bool> insert (const PAIR& p);
+
+
+  /**
+   * @brief Insert a range of elements to the map.
+   * @param first Start of the range.
+   * @param last End of the range.
+   *
+   * The range should be a sequence of pairs where first is the string key
+   *  and second is the integer value.
+   */
+  template <class InputIterator>
+  void insert (InputIterator first, InputIterator last);
+
+
+  /**
+   * @brief Increase the table capacity.
+   * @param capacity The new table capacity.
+   * @param ctx Execution context.
+   *
+   * No action will be taken in @c capacity is smaller
+   * than the current capacity.
+   */
+  void reserve (size_type capacity,
+                const Context_t& ctx = Updater_t::defaultContext());
+
+
+  /**
+   * @brief Increase the table capacity.
+   * @param capacity The new table capacity.
+   *
+   * No action will be taken in @c capacity is smaller
+   * than the current capacity.
+   */
+  void rehash (size_type capacity);
+
+
+  /**
+   * @brief Called when this thread is no longer referencing anything
+   *        from this container.
+   * @param ctx Execution context.
+   */
+  void quiescent (const Context_t& ctx);
+
+
+private:
+  /**
+   * @brief Convert an underlying key value to a string pointer.
+   * @param val The underlying key value.
+   */
+  static const std::string* keyAsString (val_t val);
+
+
+  /**
+   * @brief Convert a string pointer to an underlying key value.
+   * @param val The string pointer.
+   */
+  static val_t keyAsVal (const std::string* s);
+
+
+  /**
+   * @brief Convert an underlying mapped value to this type's mapped value.
+   * @param val The underlying mapped value.
+   */
+  static mapped_type mappedAsMapped (val_t val);
+
+
+  /**
+   * @brief Convert this type's mapped value to an underlying mapped value.
+   * @param val THe mapped value.
+   */
+  static val_t mappedAsVal (mapped_type val);
+
+
+  /**
+   * @brief Do a lookup in the table.
+   * @param key The key to look up.
+   *
+   * Returns an iterator of the underlying map pointing at the found
+   * entry or end();
+   */
+  typename Impl_t::const_iterator get (const key_type& key) const;
+
+
+  /**
+   * @brief Insert / overwrite an entry in the table.
+   * @param key The key of the new item to add.
+   * @param val The value of the new item to add.
+   * @param overwrite If true, allow overwriting an existing entry.
+   * @param ctx Execution context.
+   *
+   * The first element in the returned pair is an iterator referencing
+   * the added item.  The second is a flag that is true if a new element
+   * was added.
+   */
+  std::pair<const_iterator, bool>
+  put (const key_type& key,
+       mapped_type val,
+       bool overwrite = true,
+       const Context_t& ctx = Updater_t::defaultContext());
+
+
+  /**
+   * @brief Hash functional for keys.
+   *
+   * The key can be either a std::string or the representation type
+   * used by the underlying map.
+   */
+  struct Hasher
+  {
+    /// Hash function from the underlying representation type.
+    size_t operator() (const val_t p) const;
+    /// Hash function from a std::string.
+    size_t operator() (const std::string& s) const;
+    /// Hash functional.
+    std::hash<std::string> m_hash;
+  };
+
+
+  /**
+   * @brief Matching functional for keys.
+   */
+  struct Matcher
+  {
+    /// Compare two keys (as the underlying representation type) for equality.
+    bool operator() (const val_t a, const val_t b) const;
+  };
+
+
+  /// The underlying hash table.
+  Impl_t m_impl;
+};
+
+
+} // namespace CxxUtils
+
+
+#include "CxxUtils/ConcurrentStrMap.icc"
+
+
+#endif // not CXXUTILS_CONCURRENTSTRMAP_H
diff --git a/Control/CxxUtils/CxxUtils/ConcurrentStrMap.icc b/Control/CxxUtils/CxxUtils/ConcurrentStrMap.icc
new file mode 100644
index 000000000000..0dcb244ebbec
--- /dev/null
+++ b/Control/CxxUtils/CxxUtils/ConcurrentStrMap.icc
@@ -0,0 +1,619 @@
+/*
+ * Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration.
+ */
+/**
+ * @file CxxUtils/ConcurrentStrMap.icc
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Dec, 2020
+ * @brief Hash map from strings to integers allowing concurrent, lockless reads.
+ */
+
+
+namespace CxxUtils {
+
+
+#define T_CONCURRENTSTRMAP template <class VALUE, template <class> class UPDATER>
+#define CONCURRENTSTRMAP ConcurrentStrMap<VALUE, UPDATER>
+
+
+/**
+ * @brief Constructor.
+ * @param updater Object used to manage memory
+ *                (see comments at the start of the class).
+ * @param capacity The initial table capacity.
+ *                 (Will be rounded up to a power of two.)
+ * @param ctx Execution context.
+ */
+T_CONCURRENTSTRMAP
+CONCURRENTSTRMAP::ConcurrentStrMap (Updater_t&& updater,
+                                    size_type capacity /*= 64*/,
+                                    const Context_t& ctx
+                                      /* = Updater_t::defaultContext()*/) 
+  : m_impl (std::move (updater),
+            capacity,
+            Hasher(),
+            Matcher(),
+            ctx)
+{
+}
+
+
+/** 
+ * @brief Constructor from another map.
+ * @param updater Object used to manage memory
+ *                (see comments at the start of the class).
+ * @param capacity The initial table capacity of the new table.
+ *                 (Will be rounded up to a power of two.)
+ * @param ctx Execution context.
+ *
+ * (Not really a copy constructor since we need to pass @c updater.)
+ */
+T_CONCURRENTSTRMAP
+CONCURRENTSTRMAP::ConcurrentStrMap (const ConcurrentStrMap& other,
+                                    Updater_t&& updater,
+                                    size_type capacity /*= 64*/,
+                                    const Context_t& ctx
+                                      /*= Updater_t::defaultContext()*/)
+  : m_impl (std::move (updater),
+            capacity,
+            Hasher(),
+            Matcher(),
+            ctx)
+{
+  for (const auto& p : other) {
+    this->put (p.first, p.second, true, ctx);
+  }
+}
+
+
+/** 
+ * @brief Constructor from a range.
+ * @param f Start iterator for the range.
+ * @param l End iterator for the range.
+ * @param updater Object used to manage memory
+ *                (see comments at the start of the class).
+ * @param capacity The initial table capacity of the new table.
+ *                 (Will be rounded up to a power of two.)
+ * @param ctx Execution context.
+ *
+ * Constructor from a range of pairs.
+ */
+T_CONCURRENTSTRMAP
+template <class InputIterator>
+CONCURRENTSTRMAP::ConcurrentStrMap (InputIterator f,
+                                    InputIterator l,
+                                    Updater_t&& updater,
+                                    size_t capacity /*= 64*/,
+                                    const Context_t& ctx
+                                      /*= Updater_t::defaultContext()*/)
+  : m_impl (std::move (updater),
+            capacity,
+            Hasher(),
+            Matcher(),
+            ctx)
+{
+  for (; f != l; ++f) {
+    this->put (f->first, f->second, true, ctx);
+  }
+}
+
+
+/**
+ * @brief Destructor.
+ */
+T_CONCURRENTSTRMAP
+CONCURRENTSTRMAP::~ConcurrentStrMap()
+{
+  // Need to delete the strings that we've stored.
+  auto [begin, end] = m_impl.range();
+  while (begin != end) {
+    if (begin.key() != Impl_t::nullval) {
+      delete keyAsString (begin.key());
+    }
+    begin.next();
+  }
+}
+
+
+/**
+ * @brief Return the number of items currently in the map.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::size() const -> size_type
+{
+  return m_impl.size();
+}
+
+
+/**
+ * @brief Test if the map is currently empty.
+ */
+T_CONCURRENTSTRMAP
+inline
+bool CONCURRENTSTRMAP::empty() const
+{
+  return !m_impl.size();
+}
+
+
+/**
+ * @brief Return the current size (capacity) of the hash table.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::capacity() const -> size_t
+{
+  return m_impl.capacity();
+}
+
+
+/**
+ * @brief Constructor.
+ * @param it Iterator of the underlying table.
+ */
+T_CONCURRENTSTRMAP
+inline
+CONCURRENTSTRMAP::const_iterator::const_iterator (typename Impl_t::const_iterator it)
+  : m_impl (it)
+{
+}
+
+
+/**
+ * @brief Test if this iterator is value.
+ *
+ * This should be the same as testing for != end().
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::const_iterator::valid() const -> bool
+{
+  return m_impl.valid();
+}
+
+
+/**
+ * @brief iterator_facade requirement: Increment the iterator.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::const_iterator::increment() -> void
+{
+  m_impl.next();
+}
+
+
+/**
+ * @brief iterator_facade requirement: Decrement the iterator.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::const_iterator::decrement() -> void
+{
+  m_impl.prev();
+}
+
+
+/**
+ * @brief iterator_facade requirement: Dereference the iterator.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::const_iterator::dereference() const
+  -> const const_iterator_value
+{
+  return const_iterator_value (*keyAsString (m_impl.key()),
+                               mappedAsMapped (m_impl.value()));
+}
+
+
+/**
+ * @brief iterator_facade requirement: Equality test.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::const_iterator::equal (const const_iterator& other) const
+  -> bool
+{
+  return !(m_impl != other.m_impl);
+}
+
+
+/**
+ * @brief Return an interator range covering the entire map.
+ */
+T_CONCURRENTSTRMAP
+auto CONCURRENTSTRMAP::range() const -> const_iterator_range
+{
+  auto [begin, end] = m_impl.range();
+  return const_iterator_range (begin, end);
+}
+
+
+/**
+ * @brief Iterator at the start of the map.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::begin() const -> const_iterator
+{
+  return const_iterator (m_impl.begin());
+}
+
+
+/**
+ * @brief Iterator at the end of the map.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::end() const -> const_iterator
+{
+  return const_iterator (m_impl.end());
+}
+
+
+/**
+ * @brief Iterator at the start of the map.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::cbegin() const -> const_iterator
+{
+  return begin();
+}
+
+
+/**
+ * @brief Iterator at the end of the map.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::cend() const -> const_iterator
+{
+  return end();
+}
+
+
+/**
+ * @brief Test if a key is in the container.
+ * @param key The key to test.
+ */
+T_CONCURRENTSTRMAP
+inline
+bool CONCURRENTSTRMAP::contains (const key_type& key) const
+{
+  return get(key).valid();
+}
+
+
+/**
+ * @brief Return the number of times a given key is in the container.
+ * @param key The key to test.
+ *
+ * Returns either 0 or 1, depending on whether or not the key is in the map.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::count (const key_type& key) const -> size_type
+{
+  return contains (key) ? 1 : 0;
+}
+
+
+/**
+ * @brief Look up an element in the map.
+ * @param key The element to find.
+ *
+ * Returns either an iterator referencing the found element or end().
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::find (const key_type& key) const -> const_iterator
+{
+  return const_iterator (this->get (key));
+}
+
+
+/**
+ * @brief Look up an element in the map.
+ * @param key The element to find.
+ *
+ * Returns the value associated with the key.
+ * Throws @c std::out_of_range if the key does not exist in the map.
+ */
+T_CONCURRENTSTRMAP
+auto CONCURRENTSTRMAP::at (const key_type& key) const -> mapped_type
+{
+  typename Impl_t::const_iterator it = this->get (key);
+  if (!it.valid()) {
+    throw std::out_of_range ("ConcurrentStrMap::at");
+  }
+  return mappedAsMapped (it.value());
+}
+
+
+/**
+ * @brief Return a range of iterators with entries matching @c key.
+ * @param key The element to find.
+ *
+ * As keys are unique in this container, this is either a single-element
+ * range, or both iterators are equal to end().
+ */
+T_CONCURRENTSTRMAP
+auto CONCURRENTSTRMAP::equal_range (const key_type& key) const
+  -> std::pair<const_iterator, const_iterator>
+{
+  const_iterator i1 = find (key);
+  const_iterator i2 = i1;
+  if (i2.valid()) {
+    ++i2;
+  }
+  return std::make_pair (i1, i2);
+}
+
+
+/**
+ * @brief Add an element to the map.
+ * @param key The key of the new item to add.
+ * @param val The value of the new item to add.
+ * @param ctx Execution context.
+ *
+ * This will not overwrite an existing entry.
+ * The first element in the returned pair is an iterator referencing
+ * the added item.  The second is a flag that is true if a new element
+ * was added.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::emplace (const key_type& key,
+                                mapped_type val,
+                                const Context_t& ctx
+                                  /*= Updater_t::defaultContext()*/)
+  -> std::pair<const_iterator, bool>
+{
+  return put (key, val, false, ctx);
+}
+
+
+/**
+ * @brief Add an element to the map, or overwrite an existing one.
+ * @param key The key of the new item to add.
+ * @param val The value of the new item to add.
+ * @param ctx Execution context.
+ *
+ * This will overwrite an existing entry.
+ * The first element in the returned pair is an iterator referencing
+ * the added item.  The second is a flag that is true if a new element
+ * was added.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::insert_or_assign (const key_type& key,
+                                         mapped_type val,
+                                         const Context_t& ctx
+                                           /*= Updater_t::defaultContext()*/)
+  -> std::pair<const_iterator, bool>
+{
+  return put (key, val, true, ctx);
+}
+
+
+/**
+ * @break Add an element to the map.
+ * @param p The item to add.
+ *          Should be a pair where first is the string key
+ *          and second is the integer value.
+ *
+ * This will not overwrite an existing entry.
+ * The first element in the returned pair is an iterator referencing
+ * the added item.  The second is a flag that is true if a new element
+ * was added.
+ */
+T_CONCURRENTSTRMAP
+template <class PAIR>
+inline
+auto CONCURRENTSTRMAP::insert (const PAIR& p)
+  -> std::pair<const_iterator, bool>
+{
+  return emplace (p.first, p.second);
+}
+
+
+/**
+ * @brief Insert a range of elements to the map.
+ * @param first Start of the range.
+ * @param last End of the range.
+ *
+ * The range should be a sequence of pairs where first is the string key
+ *  and second is the integer value.
+ */
+T_CONCURRENTSTRMAP
+template <class InputIterator>
+void CONCURRENTSTRMAP::insert (InputIterator first, InputIterator last)
+{
+  for (; first != last; ++first) {
+    emplace (first->first, first->second);
+  }
+}
+
+
+/**
+ * @brief Increase the table capacity.
+ * @param capacity The new table capacity.
+ * @param ctx Execution context.
+ *
+ * No action will be taken in @c capacity is smaller
+ * than the current capacity.
+ */
+T_CONCURRENTSTRMAP
+inline
+void CONCURRENTSTRMAP::reserve (size_type capacity,
+                                const Context_t& ctx
+                                  /*= Updater_t::defaultContext()*/)
+{
+  return m_impl.reserve (capacity, ctx);
+}
+
+
+/**
+ * @brief Increase the table capacity.
+ * @param capacity The new table capacity.
+ *
+ * No action will be taken in @c capacity is smaller
+ * than the current capacity.
+ */
+T_CONCURRENTSTRMAP
+inline
+void CONCURRENTSTRMAP::rehash (size_type capacity)
+{
+  return reserve (capacity);
+}
+
+
+/**
+ * @brief Called when this thread is no longer referencing anything
+ *        from this container.
+ * @param ctx Execution context.
+ */
+T_CONCURRENTSTRMAP
+inline
+void CONCURRENTSTRMAP::quiescent (const Context_t& ctx)
+{
+  return m_impl.quiescent (ctx);
+}
+
+
+/**
+ * @brief Convert an underlying key value to a string pointer.
+ * @param val The underlying key value.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::keyAsString (val_t val) -> const std::string*
+{
+  return reinterpret_cast<std::string*> (val);
+}
+
+
+/**
+ * @brief Convert a string pointer to an underlying key value.
+ * @param val The string pointer.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::keyAsVal (const std::string* s) -> val_t
+{
+  return reinterpret_cast<val_t> (s);
+}
+
+
+/**
+ * @brief Convert an underlying mapped value to this type's mapped value.
+ * @param val The underlying mapped value.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::mappedAsMapped (val_t val) -> mapped_type
+{
+  return reinterpret_cast<mapped_type> (val);
+}
+
+
+/**
+ * @brief Convert this type's mapped value to an underlying mapped value.
+ * @param val THe mapped value.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::mappedAsVal (mapped_type val) -> val_t
+{
+  return reinterpret_cast<val_t> (val);
+}
+
+
+/**
+ * @brief Do a lookup in the table.
+ * @param key The key to look up.
+ *
+ * Returns an iterator of the underlying map pointing at the found
+ * entry or end();
+ */
+T_CONCURRENTSTRMAP
+auto CONCURRENTSTRMAP::get (const key_type& key) const
+  -> typename Impl_t::const_iterator
+{
+  size_t hash = m_impl.hasher() (key);
+  return m_impl.get (keyAsVal(&key), hash);
+}
+
+
+/**
+ * @brief Insert / overwrite an entry in the table.
+ * @param key The key of the new item to add.
+ * @param val The value of the new item to add.
+ * @param overwrite If true, allow overwriting an existing entry.
+ * @param ctx Execution context.
+ *
+ * The first element in the returned pair is an iterator referencing
+ * the added item.  The second is a flag that is true if a new element
+ * was added.
+ */
+T_CONCURRENTSTRMAP
+auto CONCURRENTSTRMAP::put (const key_type& key,
+                            mapped_type val,
+                            bool overwrite /*= true*/,
+                            const Context_t& ctx /*= Updater_t::defaultContext()*/)
+  -> std::pair<const_iterator, bool>
+{
+  size_t hash = m_impl.hasher() (key);
+  std::string* newkey = new std::string (key);
+  auto [it, flag] = m_impl.put (keyAsVal(newkey), hash,
+                                mappedAsVal (val),
+                                overwrite, ctx);
+  if (!flag) delete newkey;
+  return std::make_pair (const_iterator (it), flag);
+}
+
+
+/**
+ * @brief Hash function from the underlying representation type.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::Hasher::operator() (const val_t p) const -> size_t
+{
+  return m_hash (*keyAsString(p));
+}
+
+
+/**
+ * @brief Hash function from a std::string.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::Hasher::operator() (const std::string& s) const -> size_t
+{
+  return m_hash (s);
+}
+
+
+/**
+ * @brief Compare two keys (as the underlying representation type) for equality.
+ */
+T_CONCURRENTSTRMAP
+inline
+auto CONCURRENTSTRMAP::Matcher::operator() (const val_t a, const val_t b) const -> bool
+{
+  // First test if the keys (pointers) themselves are equal.
+  if (a == b) return true;
+  // Otherwise, need to test the strings to which they point.
+  return *keyAsString(a) == *keyAsString(b);
+}
+
+
+#undef T_CONCURRENTSTRMAP
+#undef CONCURRENTSTRMAP
+
+
+} // namespace CxxUtils
diff --git a/Control/CxxUtils/share/ConcurrentStrMap_test.ref b/Control/CxxUtils/share/ConcurrentStrMap_test.ref
new file mode 100644
index 000000000000..446c7706dc0f
--- /dev/null
+++ b/Control/CxxUtils/share/ConcurrentStrMap_test.ref
@@ -0,0 +1,5 @@
+CxxUtils/ConcurrentStrMap_test
+test1
+test2
+test3
+test4
diff --git a/Control/CxxUtils/test/ConcurrentStrMap_test.cxx b/Control/CxxUtils/test/ConcurrentStrMap_test.cxx
new file mode 100644
index 000000000000..1499b8d08abb
--- /dev/null
+++ b/Control/CxxUtils/test/ConcurrentStrMap_test.cxx
@@ -0,0 +1,924 @@
+/*
+ * Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration.
+ */
+/**
+ * @file CxxUtils/test/ConcurrentStrMap_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Dec, 2020
+ * @brief Tests for ConcurrenStrMap.
+ */
+
+
+#undef NDEBUG
+#include "CxxUtils/ConcurrentStrMap.h"
+#include "CxxUtils/StrFormat.h"
+#include "CxxUtils/MurmurHash2.h"
+#include "TestTools/expect_exception.h"
+#include "TestTools/random.h"
+#include "tbb/concurrent_unordered_map.h"
+#include "boost/timer/timer.hpp"
+#ifdef HAVE_CK
+extern "C" {
+#include "ck_ht.h"
+}
+#endif
+#include <unordered_map>
+#include <mutex>
+#include <thread>
+#include <shared_mutex>
+#include <vector>
+#include <memory>
+#include <iostream>
+#include <sstream>
+#include <cassert>
+
+
+const int nslots = 4;
+
+struct Context_t
+{
+  Context_t (int the_slot = 0) : slot (the_slot) {}
+  int slot;
+};
+
+
+template <class T>
+class TestUpdater
+{
+public:
+  using Context_t = ::Context_t;
+
+  TestUpdater()
+    : m_p (nullptr),
+      m_inGrace (0)
+  {
+  }
+
+  TestUpdater (TestUpdater&& other)
+    : m_p (static_cast<T*> (other.m_p)),
+      m_inGrace (0)
+  {
+  }
+
+  TestUpdater& operator= (const TestUpdater&) = delete; // coverity
+
+  ~TestUpdater()
+  {
+    delete m_p;
+    for (T* p : m_garbage) delete p;
+  }
+
+  void update (std::unique_ptr<T> p, const Context_t& ctx)
+  {
+    std::lock_guard<std::mutex> g (m_mutex);
+    if (m_p) m_garbage.push_back (m_p);
+    m_p = p.release();
+    m_inGrace = (~(1<<ctx.slot)) & ((1<<nslots)-1);
+  }
+
+  void discard (std::unique_ptr<T> p)
+  {
+    std::lock_guard<std::mutex> g (m_mutex);
+    m_garbage.push_back (p.release());
+    m_inGrace = ((1<<nslots)-1);
+  }
+
+  const T& get() const { return *m_p; }
+
+  void quiescent (const Context_t& ctx)
+  {
+    unsigned int mask = (1<<ctx.slot);
+    std::lock_guard<std::mutex> g (m_mutex);
+    if ((m_inGrace & mask) == 0) return;
+    m_inGrace &= ~mask;
+    if (!m_inGrace) {
+      for (T* p : m_garbage) delete p;
+      m_garbage.clear();
+    }
+  }
+
+  static Context_t defaultContext() { return 0; }
+
+
+private:
+  std::mutex m_mutex;
+  std::atomic<T*> m_p;
+  std::vector<T*> m_garbage;
+  unsigned int m_inGrace;
+};
+
+
+using TestMap = CxxUtils::ConcurrentStrMap<size_t, TestUpdater>;
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  TestMap map {TestMap::Updater_t()};
+
+  const size_t MAXKEYS = 1000;
+  std::vector<std::string> keys;
+
+  for (size_t i = 0; i < MAXKEYS; i++) {
+    std::ostringstream ss;
+    ss << i;
+    keys.push_back (ss.str());
+  }
+
+  assert (map.size() == 0);
+  assert (map.capacity() == 64);
+  assert (map.empty());
+
+  for (size_t i = 0; i < MAXKEYS; i++) {
+    auto [it, flag] = map.emplace (keys[i], i);
+    assert (flag);
+    assert (it.valid());
+    assert (it->first == keys[i]);
+    assert (it->second == i);
+  }
+
+  assert (map.size() == MAXKEYS);
+  assert (map.capacity() == 1024);
+  assert (!map.empty());
+
+  for (size_t i = 0; i < MAXKEYS; i++) {
+    TestMap::const_iterator it = map.find (keys[i]);
+    assert (it.valid());
+    assert (it != map.end());
+    assert (it->first == keys[i]);
+    assert (it->second == i);
+  }
+  assert (map.count (keys[10]) == 1);
+  assert (map.count ("foobar") == 0);
+  assert (map.contains (keys[10]));
+  assert (!map.contains ("foobar"));
+  assert (map.find ("foobar") == map.end());
+  assert (!map.find ("foobar").valid());
+
+  {
+    auto [i1, i2] = map.equal_range (keys[10]);
+    assert (i1.valid());
+    assert (i1 != i2);
+    assert (i1->first == keys[10]);
+    assert (i1->second == 10);
+    ++i1;
+    assert (i1 == i2);
+  }
+
+  {
+    auto [i1, i2] = map.equal_range ("foobar");
+    assert (!i1.valid());
+    assert (i1 == map.end());
+    assert (i1 == i2);
+  }
+
+  assert (map.at (keys[10]) == 10);
+  EXPECT_EXCEPTION (std::out_of_range, map.at ("fooabr"));
+
+  for (size_t i = 0; i < MAXKEYS; i++) {
+    auto [it, flag] = map.insert_or_assign (keys[i], i+10000);
+    assert (!flag);
+    assert (it.valid());
+    assert (it->first == keys[i]);
+    assert (it->second == i+10000);
+  }
+
+  assert (map.size() == MAXKEYS);
+  assert (map.capacity() == 1024);
+
+  for (size_t i = 0; i < MAXKEYS; i++) {
+    TestMap::const_iterator it = map.find (keys[i]);
+    assert (it.valid());
+    assert (it != map.end());
+    assert (it->first == keys[i]);
+    assert (it->second == i+10000);
+  }
+
+  std::vector<size_t> exp;
+  for (size_t i = 0; i < MAXKEYS; i++) {
+    exp.push_back (i);
+  }
+
+  std::vector<size_t> seen;
+  for (const auto& p : map.range()) {
+    size_t i = p.second - 10000;
+    assert (i < MAXKEYS);
+    assert (p.first == keys[i]);
+    seen.push_back (i);
+  }
+
+  std::sort (seen.begin(), seen.end());
+  assert (seen == exp);
+
+  seen.clear();
+  for (const auto& p : map) {
+    size_t i = p.second - 10000;
+    assert (i < MAXKEYS);
+    assert (p.first == keys[i]);
+    seen.push_back (i);
+  }
+
+  std::sort (seen.begin(), seen.end());
+  assert (seen == exp);
+
+  {
+    auto [it, flag] = map.insert (std::make_pair ("baz", 99999));
+    assert (flag);
+    assert (it.valid());
+    assert (it->first == "baz");
+    assert (it->second == 99999);
+  }    
+  {
+    auto [it, flag] = map.insert (std::make_pair ("baz", 99998));
+    assert (!flag);
+    assert (it.valid());
+    assert (it->first == "baz");
+    assert (it->second == 99999);
+  }    
+}
+
+
+// Bulk copy / insert.
+void test2()
+{
+  std::cout << "test2\n";
+  std::vector<std::pair<std::string, size_t> > data
+    { {"zero",  0},
+      {"one",   1},
+      {"two",   2},
+      {"three", 3},
+      {"four",  4},
+      {"five",  5},
+      {"six",   6},
+      {"seven", 7},
+      {"eight", 8},
+      {"nine",  9},
+    };
+  
+  TestMap map1 (data.begin(), data.end(), TestMap::Updater_t());
+  assert (map1.size() == 10);
+  {
+    TestMap::const_iterator it = map1.find ("four");
+    assert (it.valid());
+    assert (it != map1.end());
+    assert (it->first == "four");
+    assert (it->second == 4);
+  }
+
+  TestMap map2 (map1, TestMap::Updater_t());
+  assert (map2.size() == 10);
+  {
+    TestMap::const_iterator it = map2.find ("six");
+    assert (it.valid());
+    assert (it != map2.end());
+    assert (it->first == "six");
+    assert (it->second == 6);
+  }
+
+  TestMap map3 {TestMap::Updater_t()};
+  assert (map3.capacity() == 64);
+  assert (map3.size() == 0);
+
+  map3.reserve (200);
+  assert (map3.capacity() == 256);
+  map3.reserve (100);
+  assert (map3.capacity() == 256);
+  map3.quiescent (Context_t());
+  assert (map3.size() == 0);
+
+  map3.insert (std::begin(data), std::end(data));
+  assert (map3.size() == 10);
+  assert (map3.at ("five") == 5);
+}
+
+
+// With a pointer value.
+void test3()
+{
+  std::cout << "test3\n";
+
+  using PtrMap = CxxUtils::ConcurrentStrMap<const int*, TestUpdater>;
+  PtrMap map {PtrMap::Updater_t()};
+
+  int v[10] = {0};
+
+  map.emplace ("one", &v[1]);
+  map.emplace ("three", &v[3]);
+  map.emplace ("five", &v[5]);
+
+  assert (map.at("three") == &v[3]);
+  assert (map.find("three")->first == "three");
+  assert (map.find("three")->second == &v[3]);
+}
+
+
+//***************************************************************************
+// Threaded test.
+//
+
+
+std::shared_timed_mutex start_mutex;
+
+
+class test4_Base
+{
+public:
+  static constexpr size_t nwrites = 10000;
+  
+  test4_Base (int slot);
+  int ctx() const { return m_slot; }
+  const std::string& key (size_t i) const { return m_keys[i]; }
+  void setContext();
+
+
+private:
+  int m_slot;
+  std::vector<std::string> m_keys;
+};
+
+
+test4_Base::test4_Base (int slot)
+  : m_slot (slot)
+{
+  for (size_t i = 0; i < nwrites; i++) {
+    std::ostringstream ss;
+    ss << i;
+    m_keys.push_back (ss.str());
+  }
+}
+
+
+void test4_Base::setContext()
+{
+}
+
+
+
+class test4_Writer
+  : public test4_Base
+{
+public:
+  test4_Writer (int slot, TestMap& map);
+  void operator()();
+
+private:
+  TestMap& m_map;
+};
+
+
+test4_Writer::test4_Writer (int slot, TestMap& map)
+  : test4_Base (slot),
+    m_map (map)
+{
+}
+
+
+void test4_Writer::operator()()
+{
+  setContext();
+  std::shared_lock<std::shared_timed_mutex> lock (start_mutex);
+
+  for (size_t i=0; i < nwrites; i++) {
+    assert (m_map.emplace (key(i), i).second);
+    m_map.quiescent (ctx());
+    if (((i+1)%128) == 0) {
+      usleep (1000);
+    }
+  }
+
+  for (size_t i=0; i < nwrites; i++) {
+    assert (!m_map.insert_or_assign (key(i), i + 10*nwrites).second);
+    m_map.quiescent (ctx());
+    if (((i+1)%128) == 0) {
+      usleep (1000);
+    }
+  }
+
+  for (size_t i=0; i < nwrites; i++) {
+    assert (!m_map.insert_or_assign (key(i), i + 20*nwrites).second);
+    m_map.quiescent (ctx());
+    if (((i+1)%128) == 0) {
+      usleep (1000);
+    }
+  }
+
+  assert (m_map.emplace ("fin", nwrites).second);
+}
+
+
+class test4_Iterator
+  : public test4_Base
+{
+public:
+  test4_Iterator (int slot, TestMap& map);
+  void operator()();
+
+private:
+  TestMap& m_map;
+};
+
+
+test4_Iterator::test4_Iterator (int slot, TestMap& map)
+  : test4_Base (slot),
+    m_map (map)
+{
+}
+
+
+void test4_Iterator::operator()()
+{
+  setContext();
+  std::shared_lock<std::shared_timed_mutex> lock (start_mutex);
+
+  while (true) {
+    for (const auto& p : m_map) {
+      if (p.second == nwrites) continue;
+      size_t i = p.second % nwrites;
+      assert (key(i) == p.first);
+      assert (p.second == i || p.second == i+10*nwrites || p.second == i +20*nwrites);
+    }
+
+    TestMap::const_iterator_range range = m_map.range();
+    TestMap::const_iterator begin2 = range.begin();
+    TestMap::const_iterator end2 = range.end();
+    while (begin2 != end2) {
+      --end2;
+      if (end2->second == nwrites) continue;
+      size_t i = end2->second % nwrites;
+      assert (key(i) == end2->first);
+      assert (end2->second == i || end2->second == i+10*nwrites || end2->second == i +20*nwrites);
+    }
+
+    m_map.quiescent (ctx());
+    if (m_map.size() > nwrites) break;
+  }
+}
+
+
+class test4_Reader
+  : public test4_Base
+{
+public:
+  test4_Reader (int slot, TestMap& map);
+  void operator()();
+
+private:
+  TestMap& m_map;
+};
+
+
+test4_Reader::test4_Reader (int slot, TestMap& map)
+  : test4_Base (slot),
+    m_map (map)
+{
+}
+
+
+void test4_Reader::operator()()
+{
+  setContext();
+  std::shared_lock<std::shared_timed_mutex> lock (start_mutex);
+
+  while (true) {
+    for (size_t i = 0; ; ++i) {
+      TestMap::const_iterator it = m_map.find (key(i));
+      if (it == m_map.end()) break;
+      assert(it->second == i || it->second == i+10*nwrites || it->second == i+20*nwrites);
+    }
+
+    m_map.quiescent (ctx());
+    if (m_map.size() > nwrites) break;
+  }
+}
+
+
+void test4_iter()
+{
+  TestMap map {TestMap::Updater_t()};
+
+  const int nthread = 4;
+  std::thread threads[nthread];
+  start_mutex.lock();
+
+  threads[0] = std::thread (test4_Writer (0, map));
+  threads[1] = std::thread (test4_Iterator (1, map));
+  threads[2] = std::thread (test4_Reader (2, map));
+  threads[3] = std::thread (test4_Reader (3, map));
+
+  // Try to get the threads starting as much at the same time as possible.
+  start_mutex.unlock();
+  for (int i=0; i < nthread; i++)
+    threads[i].join();
+}
+
+
+void test4()
+{
+  std::cout << "test4\n";
+
+  for (int i=0; i < 5; i++) {
+    test4_iter();
+  }
+}
+
+
+//***************************************************************************
+// Optional performance test test.
+//
+
+
+class ConcurrentStrMapAdapter
+  : public TestMap
+{
+public:
+  ConcurrentStrMapAdapter()
+    : TestMap (TestMap::Updater_t(), 512)
+  {
+  }
+  static std::string name() { return "ConcurrentStrMap"; }
+
+  uintptr_t get (const std::string& s) const
+  {
+    auto it = find (s);
+    if (it.valid()) return it->second;
+    return 0;
+  }
+
+  static const std::string& key (const const_iterator& i)
+  { return i->first; }
+  static uintptr_t value (const const_iterator& i)
+  { return i->second; }
+};
+
+
+class UnorderedMapAdapter
+{
+public:
+  typedef std::unordered_map<std::string, uintptr_t> map_t;
+  typedef map_t::const_iterator const_iterator;
+  
+  static std::string name() { return "UnorderedMap"; }
+
+  void emplace (const std::string& s, uintptr_t p)
+  {
+    lock_t lock (m_mutex);
+    m_map.emplace (s, p);
+  }
+
+
+  uintptr_t get (const std::string& s) const
+  {
+    lock_t lock (m_mutex);
+    auto it = m_map.find (s);
+    if (it != m_map.end()) return it->second;
+    return 0;
+  }
+
+  const_iterator begin() const { return m_map.begin(); }
+  const_iterator end() const { return m_map.end(); }
+  static const std::string& key (const const_iterator& i)
+  { return i->first; }
+  static uintptr_t value (const const_iterator& i)
+  { return i->second; }
+
+  
+private:
+  map_t m_map;
+
+  typedef std::mutex mutex_t;
+  typedef std::lock_guard<mutex_t> lock_t;
+  mutable mutex_t m_mutex;
+};
+
+
+class ConcurrentUnorderedMapAdapter
+{
+public:
+  typedef tbb::concurrent_unordered_map<std::string, uintptr_t> map_t;
+  typedef map_t::const_iterator const_iterator;
+
+  static std::string name() { return "concurrent_unordered_map"; }
+
+  void emplace (const std::string& s, uintptr_t p)
+  {
+    m_map.emplace (s, p);
+  }
+
+
+  uintptr_t get (const std::string& s) const
+  {
+    auto it = m_map.find (s);
+    if (it != m_map.end()) return it->second;
+    return 0;
+  }
+
+  const_iterator begin() const { return m_map.begin(); }
+  const_iterator end() const { return m_map.end(); }
+  static const std::string& key (const const_iterator& i)
+  { return i->first; }
+  static uintptr_t value (const const_iterator& i)
+  { return i->second; }
+
+private:
+  map_t m_map;
+};
+
+
+#ifdef HAVE_CK
+class CKHTAdapter
+{
+public:
+  CKHTAdapter();
+  static std::string name() { return "ck_ht"; }
+
+  struct const_iterator
+  {
+    const_iterator (ck_ht_t* ht)
+      : m_ht (ht)
+    {
+      if (m_ht) {
+        ck_ht_iterator_init (&m_it);
+        if (!ck_ht_next (m_ht, &m_it, &m_entry)) {
+          m_entry = nullptr;
+        }
+      }
+      else {
+        m_entry = nullptr;
+      }
+    }
+
+    const_iterator& operator++()
+    {
+      if (!ck_ht_next (m_ht, &m_it, &m_entry)) {
+        m_entry = nullptr;
+      }
+      return *this;
+    }
+
+    bool operator!= (const const_iterator& other) const
+    {
+      return m_entry != other.m_entry;
+    }
+
+    ck_ht_t* m_ht;
+    ck_ht_iterator_t m_it;
+    ck_ht_entry_t* m_entry;
+  };
+
+  void emplace (const std::string& s, uintptr_t p)
+  {
+    ck_ht_entry_t entry;
+    ck_ht_hash_t h;
+    ck_ht_hash (&h, &m_ht, s.c_str(), s.size());
+    ck_ht_entry_set (&entry, h, s.c_str(), s.size(),
+                     reinterpret_cast<const void*>(p));
+    ck_ht_put_spmc (&m_ht, h, &entry);
+  }
+
+
+  uintptr_t get (const std::string& s) const
+  {
+    ck_ht_entry_t entry;
+    ck_ht_hash_t h;
+    ck_ht_hash (&h, &m_ht, s.c_str(), s.size());
+    ck_ht_entry_key_set (&entry, s.c_str(), s.size());
+    if (ck_ht_get_spmc (&m_ht, h, &entry)) {
+      return reinterpret_cast<uintptr_t>(ck_ht_entry_value (&entry));
+    }
+    return 0;
+  }
+
+  static const std::string key (const const_iterator& i)
+  {
+    void* key = ck_ht_entry_key (i.m_entry);
+    uint16_t len = ck_ht_entry_key_length (i.m_entry);
+    return std::string (reinterpret_cast<const char*>(key), len);
+  }
+  static uintptr_t value (const const_iterator& i)
+  { return reinterpret_cast<uintptr_t>(ck_ht_entry_value(i.m_entry)); }
+
+  const_iterator begin() const
+  {
+    return const_iterator (&m_ht);
+  }
+
+  const_iterator end() const
+  {
+    return const_iterator (nullptr);
+  }
+
+
+private:
+  static void hash (ck_ht_hash_t* h,
+                    const void* key,
+                    size_t key_length,
+                    uint64_t seed)
+  {
+    // Same as used by libstdc++.
+    h->value = CxxUtils::MurmurHash64A (key, key_length, seed);
+  }
+
+  static void ht_free (void *p, size_t /*b*/, bool /*r*/) { free(p); }
+
+  ck_malloc m_alloc;
+  mutable ck_ht_t m_ht;
+};
+
+
+CKHTAdapter::CKHTAdapter()
+{
+  m_alloc.malloc = malloc;
+  m_alloc.free = ht_free;
+  if (!ck_ht_init (&m_ht,
+                   CK_HT_MODE_BYTESTRING,
+                   hash, // ck_ht_hash_cb_t
+                   &m_alloc, // ck_malloc*
+                   128, // initial size
+                   6602834))
+  {
+    std::cout << "ck_hs_init error\n";
+  }
+}
+#endif // HAVE_CK
+
+
+class Timer
+{
+public:
+  Timer();
+
+  class RunTimer
+  {
+  public:
+    RunTimer (boost::timer::cpu_timer& timer) : m_timer (&timer)
+    { timer.resume(); }
+    RunTimer (RunTimer&& other) : m_timer (other.m_timer) { other.m_timer = nullptr; }
+    ~RunTimer() { if (m_timer) m_timer->stop(); }
+  private:
+    boost::timer::cpu_timer* m_timer;
+  };
+  RunTimer run() { return RunTimer (m_timer); }
+
+  std::string format() const { return m_timer.format(3); }
+
+private:
+  boost::timer::cpu_timer m_timer;
+};
+
+
+Timer::Timer()
+{
+  m_timer.stop();
+}
+
+
+class TesterBase
+{
+public:
+  TesterBase();
+
+  Timer::RunTimer run_lookup_timer() { return m_lookup_timer.run(); }
+  Timer::RunTimer run_iterate_timer() { return m_iterate_timer.run(); }
+
+  void report();
+
+private:
+  Timer m_lookup_timer;
+  Timer m_iterate_timer;
+};
+
+
+TesterBase::TesterBase()
+{
+}
+
+
+void TesterBase::report()
+{
+  std::cout << "lookup:  " << m_lookup_timer.format();
+  std::cout << "iterate: " << m_iterate_timer.format();
+}
+
+
+template <class CONT>
+class Tester
+  : public TesterBase
+{
+public:
+  static constexpr size_t NCONT = 1000;
+  static constexpr size_t NEACH = 10000;
+  static constexpr size_t LOG_NENT = 11;
+  static constexpr size_t NENT = 1<<LOG_NENT;
+  static constexpr size_t ENT_MASK = NENT-1;
+  
+  Tester();
+  void lookup_test();
+  void iterate_test();
+
+  void test();
+  std::string name() { return CONT::name(); }
+
+private:
+  std::vector<std::string> m_keys[NCONT];
+  CONT m_cont[NCONT];
+  uint32_t m_seed;
+};
+
+
+template <class CONT>
+Tester<CONT>::Tester()
+  : m_seed (1235)
+{
+  for (size_t j=0; j < NCONT; j++) {
+    for (size_t i = 0; i < NENT; i++) {
+      m_keys[j].push_back (CxxUtils::strformat ("key%03lu%08lu", j, i));
+    }
+    for (size_t i = 0; i < NENT; i++) {
+      m_cont[j].emplace (m_keys[j][i],
+                         reinterpret_cast<uintptr_t>(&m_keys[j][i]));
+    }
+  }
+}
+
+
+template <class CONT>
+void Tester<CONT>::lookup_test()
+{
+  auto timer = run_lookup_timer();
+  for (size_t irep = 0; irep < NEACH; irep++) {
+    for (size_t icont = 0; icont < NCONT; icont++) {
+      uint32_t ient = Athena_test::rng_seed (m_seed) & ENT_MASK;
+      const std::string& key = m_keys[icont][ient];
+      uintptr_t val = m_cont[icont].get (key);
+      assert (val == reinterpret_cast<uintptr_t>(&key));
+    }
+  }
+}
+
+
+template <class CONT>
+void Tester<CONT>::iterate_test()
+{
+  auto timer = run_iterate_timer();
+  int icount = 0;
+  for (size_t irep = 0; irep < 100; irep++) {
+    for (size_t icont = 0; icont < NCONT; icont++) {
+      const CONT& cont = m_cont[icont];
+      typename CONT::const_iterator it = cont.begin();
+      typename CONT::const_iterator end = cont.end();
+      while (it != end) {
+        const std::string& key = CONT::key (it);
+        const uintptr_t  val= CONT::value (it);
+        if (((++icount) % 128) == 0) {
+          assert (key == *reinterpret_cast<const std::string*>(val));
+        }
+        ++it;
+      }
+    }
+  }
+}
+
+
+template <class CONT>
+void Tester<CONT>::test()
+{
+  lookup_test();
+  iterate_test();
+}
+
+
+template <class CONT>
+void perftest_one()
+{
+  Tester<CONT> tester;
+  std::cout << tester.name() << "\n";
+  tester.test();
+  tester.report();
+}
+
+
+void perftest()
+{
+  perftest_one<ConcurrentStrMapAdapter>();
+  perftest_one<UnorderedMapAdapter>();
+  perftest_one<ConcurrentUnorderedMapAdapter>();
+#ifdef HAVE_CK
+  perftest_one<CKHTAdapter>();
+#endif
+}
+
+
+int main (int argc, char** argv)
+{
+  if (argc >= 2 && strcmp (argv[1], "--perf") == 0) {
+    perftest();
+    return 0;
+  }
+
+  std::cout << "CxxUtils/ConcurrentStrMap_test\n";
+  test1();
+  test2();
+  test3();
+  test4();
+  return 0;
+}
-- 
GitLab


From 88287e1429c91123f11dffcd2e7f17efce123d68 Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Wed, 16 Dec 2020 12:18:53 -0500
Subject: [PATCH 105/225] CxxUtils: Add SimpleUpdater.

Add a simple implementation of the Updater interface.
It doesn't keep track of slots, and does not attempt to delete any garbage
until the SimpleUpdater object itself is deleted.

This can be appropriate for something like a ConcurrentStrMap if one
has a good guess in advance of the size of the table.
---
 Control/CxxUtils/CMakeLists.txt               |   2 +-
 Control/CxxUtils/CxxUtils/SimpleUpdater.h     | 109 ++++++++++++++++++
 Control/CxxUtils/CxxUtils/SimpleUpdater.icc   |  90 +++++++++++++++
 Control/CxxUtils/share/SimpleUpdater_test.ref |   2 +
 .../CxxUtils/test/ConcurrentStrMap_test.cxx   |   3 +-
 Control/CxxUtils/test/SimpleUpdater_test.cxx  |  62 ++++++++++
 6 files changed, 266 insertions(+), 2 deletions(-)
 create mode 100644 Control/CxxUtils/CxxUtils/SimpleUpdater.h
 create mode 100644 Control/CxxUtils/CxxUtils/SimpleUpdater.icc
 create mode 100644 Control/CxxUtils/share/SimpleUpdater_test.ref
 create mode 100644 Control/CxxUtils/test/SimpleUpdater_test.cxx

diff --git a/Control/CxxUtils/CMakeLists.txt b/Control/CxxUtils/CMakeLists.txt
index 1ca2f75bb18a..ab2cbba9e410 100644
--- a/Control/CxxUtils/CMakeLists.txt
+++ b/Control/CxxUtils/CMakeLists.txt
@@ -128,7 +128,7 @@ foreach( test sincos_test ArrayScanner_test Arrayrep_test
       MurmurHash2_test bitmask_test crc64_test Ring_test
       restrict_test vectorize_test get_unaligned_test aligned_vector_test
       vec_int_test vec_float_test vec_fb_int_test vec_fb_float_test
-      ConcurrentHashmapImpl_test )
+      ConcurrentHashmapImpl_test SimpleUpdater_test )
    atlas_add_test( ${test}
       SOURCES test/${test}.cxx
       LOG_IGNORE_PATTERN "no version information available"
diff --git a/Control/CxxUtils/CxxUtils/SimpleUpdater.h b/Control/CxxUtils/CxxUtils/SimpleUpdater.h
new file mode 100644
index 000000000000..393b62b0cbda
--- /dev/null
+++ b/Control/CxxUtils/CxxUtils/SimpleUpdater.h
@@ -0,0 +1,109 @@
+// This file's extension implies that it's C, but it's really -*- C++ -*-.
+/*
+ * Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration.
+ */
+/**
+ * @file CxxUtils/SimpleUpdater.h
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Dec, 2020
+ * @brief Simple (non-deleting) Updater implementation.
+ */
+
+
+#ifndef CXXUTILS_SIMPLEUPDATER_H
+#define CXXUTILS_SIMPLEUPDATER_H
+
+
+#include <atomic>
+#include <vector>
+#include <memory>
+
+
+namespace CxxUtils {
+
+
+/**
+ * @brief Simple (non-deleting) Updater implementation.
+ *
+ * This is a simple implementation of the Updater interface as described
+ * in @c ConcurrentRangeMap that does not delete any memory until
+ * the @c SimpleUpdater itself is deleted.  This can be useful for,
+ * say, a @c ConcurrentStrMap if you have a good initial guess
+ * for the size of the table.
+ */
+template <class T>
+class SimpleUpdater
+{
+public:
+  /// Context object.  Required by the interface, though we don't
+  /// really use it.
+  struct Context_t {};
+
+  /// We need a default constructor.
+  SimpleUpdater() = default;
+
+
+  /**
+   * @brief Move constructor.
+   */
+  SimpleUpdater (SimpleUpdater&& other);
+
+
+  /**
+   * @brief Return a reference to the current object.
+   */
+  const T& get() const;
+
+
+  /**
+   * @brief Install a new object.
+   * @param p The new object to install.
+   * @param ctx Current execution context.
+   *
+   * The existing object should not be deleted until it can no longer
+   * be referenced by any thread.
+   */
+  void update (std::unique_ptr<T> p, const Context_t&);
+
+
+  /**
+   * @brief Queue an object for later deletion.
+   * @param p The object to delete.
+   *
+   * The object @c p will be queued for deletion once a grace period
+   * has passed for all slots.  In contrast to using @c update,
+   * this does not change the current object.
+   */
+  void discard (std::unique_ptr<T> p);
+
+
+  /**
+   * @brief Mark that an event slot is not referencing this object.
+   *
+   * A no-op for @c SimpleUpdater.
+   */
+  void quiescent (const Context_t&);
+
+
+  /**
+   * @brief Return the current event context.
+   */
+  static const Context_t defaultContext();
+
+
+private:
+  /// Pointer to the current object.
+  std::atomic<const T*> m_obj = 0;
+
+  /// List of all allocated objects.
+  std::vector<std::unique_ptr<T> > m_objs;
+};
+
+
+} // namespace CxxUtils
+
+
+#include "CxxUtils/SimpleUpdater.icc"
+
+
+#endif // not CXXUTILS_SIMPLEUPDATER_H
diff --git a/Control/CxxUtils/CxxUtils/SimpleUpdater.icc b/Control/CxxUtils/CxxUtils/SimpleUpdater.icc
new file mode 100644
index 000000000000..3332fab5958a
--- /dev/null
+++ b/Control/CxxUtils/CxxUtils/SimpleUpdater.icc
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration.
+ */
+/**
+ * @file CxxUtils/SimpleUpdater.icc
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Dec, 2020
+ * @brief Simple (non-deleting) Updater implementation.
+ */
+
+
+namespace CxxUtils {
+
+
+/**
+ * @brief Move constructor.
+ */
+template <class T>
+SimpleUpdater<T>::SimpleUpdater (SimpleUpdater&& other)
+  : m_obj (static_cast<const T*> (other.m_obj)),
+    m_objs (std::move (other.m_objs))
+{
+}
+
+
+/**
+ * @brief Return a reference to the current object.
+ */
+template <class T>
+inline
+const T& SimpleUpdater<T>::get() const
+{
+  return *m_obj;
+}
+
+
+/**
+ * @brief Install a new object.
+ * @param p The new object to install.
+ * @param ctx Current execution context.
+ *
+ * The existing object should not be deleted until it can no longer
+ * be referenced by any thread.
+ */
+template <class T>
+void SimpleUpdater<T>::update (std::unique_ptr<T> p, const Context_t&)
+{
+  m_objs.push_back (std::move (p));
+  m_obj = m_objs.back().get();
+}
+
+
+/**
+ * @brief Queue an object for later deletion.
+ * @param p The object to delete.
+ *
+ * The object @c p will be queued for deletion once a grace period
+ * has passed for all slots.  In contrast to using @c update,
+ * this does not change the current object.
+ */
+template <class T>
+void SimpleUpdater<T>::discard (std::unique_ptr<T> p)
+{
+  m_objs.push_back (std::move (p));
+}
+
+
+/**
+ * @brief Mark that an event slot is not referencing this object.
+ *
+ * A no-op for @c SimpleUpdater.
+ */
+template <class T>
+void SimpleUpdater<T>::quiescent (const Context_t&)
+{
+}
+
+
+/**
+ * @brief Return the current event context.
+ */
+template <class T>
+const typename SimpleUpdater<T>::Context_t SimpleUpdater<T>::defaultContext()
+{
+  return Context_t();
+}
+
+
+} // namespace CxxUtils
+
diff --git a/Control/CxxUtils/share/SimpleUpdater_test.ref b/Control/CxxUtils/share/SimpleUpdater_test.ref
new file mode 100644
index 000000000000..01c775296286
--- /dev/null
+++ b/Control/CxxUtils/share/SimpleUpdater_test.ref
@@ -0,0 +1,2 @@
+CxxUtils/SimpleUpdater_test
+test1
diff --git a/Control/CxxUtils/test/ConcurrentStrMap_test.cxx b/Control/CxxUtils/test/ConcurrentStrMap_test.cxx
index 1499b8d08abb..4ab25b1eedf8 100644
--- a/Control/CxxUtils/test/ConcurrentStrMap_test.cxx
+++ b/Control/CxxUtils/test/ConcurrentStrMap_test.cxx
@@ -13,6 +13,7 @@
 #include "CxxUtils/ConcurrentStrMap.h"
 #include "CxxUtils/StrFormat.h"
 #include "CxxUtils/MurmurHash2.h"
+#include "CxxUtils/checker_macros.h"
 #include "TestTools/expect_exception.h"
 #include "TestTools/random.h"
 #include "tbb/concurrent_unordered_map.h"
@@ -721,7 +722,7 @@ private:
   static void ht_free (void *p, size_t /*b*/, bool /*r*/) { free(p); }
 
   ck_malloc m_alloc;
-  mutable ck_ht_t m_ht;
+  mutable ck_ht_t m_ht ATLAS_THREAD_SAFE;
 };
 
 
diff --git a/Control/CxxUtils/test/SimpleUpdater_test.cxx b/Control/CxxUtils/test/SimpleUpdater_test.cxx
new file mode 100644
index 000000000000..5b4780ef7b26
--- /dev/null
+++ b/Control/CxxUtils/test/SimpleUpdater_test.cxx
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration.
+ */
+/**
+ * @file CxxUtils/test/SimpleUpdater_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Dec, 2020
+ * @brief Tests for SimpleUpdater.
+ */
+
+
+#undef NDEBUG
+#include "CxxUtils/SimpleUpdater.h"
+#include <algorithm>
+#include <vector>
+#include <memory>
+#include <iostream>
+#include <cassert>
+
+
+class Payload
+{
+public:
+  typedef std::vector<int> vec_t;
+  Payload (vec_t& vec, int x) : m_vec(vec), m_x (x)
+  { vec.push_back (x); }
+  ~Payload()
+  {
+    vec_t::iterator i = std::find (m_vec.begin(), m_vec.end(), m_x);
+    if (i != m_vec.end()) m_vec.erase (i);
+  }
+  vec_t& m_vec;
+  int m_x;
+};
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  std::vector<int> log;
+
+  {
+    using SU = CxxUtils::SimpleUpdater<Payload>;
+    SU su;
+    su.update (std::make_unique<Payload> (log, 1), SU::defaultContext());
+    assert (su.get().m_x == 1);
+    su.discard (std::make_unique<Payload> (log, 2));
+    su.update (std::make_unique<Payload> (log, 3), SU::defaultContext());
+    assert (su.get().m_x == 3);
+    su.quiescent (SU::defaultContext());
+    assert (log == (std::vector<int> {1, 2, 3}));
+  }
+  assert (log.empty());
+}
+
+
+int main()
+{
+  std::cout << "CxxUtils/SimpleUpdater_test\n";
+  test1();
+  return 0;
+}
-- 
GitLab


From b2be19fdf55419f9365ca7ef704eaf8b93417730 Mon Sep 17 00:00:00 2001
From: Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
Date: Thu, 17 Dec 2020 10:03:48 +0100
Subject: [PATCH 106/225] Fixed the build of JetRecAlg in AthAnalysis.

---
 Reconstruction/Jet/JetRec/src/JetRecAlg.cxx | 11 +++++------
 Reconstruction/Jet/JetRec/src/JetRecAlg.h   | 11 +++++------
 2 files changed, 10 insertions(+), 12 deletions(-)

diff --git a/Reconstruction/Jet/JetRec/src/JetRecAlg.cxx b/Reconstruction/Jet/JetRec/src/JetRecAlg.cxx
index fba500de2eb5..cf721e0d7db7 100644
--- a/Reconstruction/Jet/JetRec/src/JetRecAlg.cxx
+++ b/Reconstruction/Jet/JetRec/src/JetRecAlg.cxx
@@ -3,14 +3,14 @@
   Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
-// JetRecAlg.cxx 
+// JetRecAlg.cxx
 
 #include <memory>
 #include "JetRecAlg.h"
 #include "JetInterface/IJetExecuteTool.h"
 #include "xAODJet/JetAuxContainer.h"
 
-#if !defined (GENERATIONBASE) && !defined (XAOD_STANDALONE)
+#if !defined (GENERATIONBASE) && !defined (XAOD_ANALYSIS)
   #include "AthenaMonitoringKernel/Monitored.h"
 #endif
 
@@ -28,7 +28,7 @@ StatusCode JetRecAlg::initialize() {
   ATH_CHECK(m_jetprovider->initWithOutput(m_output));
 
   ATH_MSG_INFO(" Initialized  IJetProvider : "<< m_jetprovider->name());
-  
+
   ATH_MSG_INFO(" Initialize .... List of modifiers: ");
   ATH_CHECK(m_modifiers.retrieve());
   for(ToolHandle<IJetModifier> t : m_modifiers){
@@ -37,7 +37,7 @@ StatusCode JetRecAlg::initialize() {
 
   ATH_CHECK(m_output.initialize());
 
-#if !defined (GENERATIONBASE) && !defined (XAOD_STANDALONE)
+#if !defined (GENERATIONBASE) && !defined (XAOD_ANALYSIS)
   if (!m_monTool.empty()) ATH_CHECK(m_monTool.retrieve());
 #endif
 
@@ -60,7 +60,7 @@ StatusCode JetRecAlg::execute(const EventContext& ctx) const {
   // We can subsequently access the jets from the handle and don't have to
   // worry about memory management.
 
-#if !defined (GENERATIONBASE) && !defined (XAOD_STANDALONE)
+#if !defined (GENERATIONBASE) && !defined (XAOD_ANALYSIS)
   auto t_total = Monitored::Timer<std::chrono::milliseconds>( "TIME_total" );
 
   SG::WriteHandle<xAOD::JetContainer> jetContHandle(m_output,ctx);
@@ -117,4 +117,3 @@ StatusCode JetRecAlg::execute(const EventContext& ctx) const {
 }
 
 //**********************************************************************
-
diff --git a/Reconstruction/Jet/JetRec/src/JetRecAlg.h b/Reconstruction/Jet/JetRec/src/JetRecAlg.h
index 80e5229ba37b..acfb4ed1a26c 100644
--- a/Reconstruction/Jet/JetRec/src/JetRecAlg.h
+++ b/Reconstruction/Jet/JetRec/src/JetRecAlg.h
@@ -4,7 +4,7 @@
 */
 
 ////////////////////////////////////////////////////
-/// \class JetRecAlg 
+/// \class JetRecAlg
 ///
 /// Algorithm tasked to create a single JetContainer
 /// This algorithm makes use of 2 types of tools :
@@ -29,9 +29,9 @@
 
 class IJetExecuteTool;
 
-class JetRecAlg : public AthReentrantAlgorithm { 
+class JetRecAlg : public AthReentrantAlgorithm {
 
-public: 
+public:
 
   using AthReentrantAlgorithm::AthReentrantAlgorithm;
 
@@ -46,11 +46,10 @@ private:
   ToolHandle<IJetProvider> m_jetprovider ={this , "Provider" , {} , "Tool providing the jets (fastjet, copy, grooming...)"};
   ToolHandleArray<IJetModifier> m_modifiers = {this , "Modifiers", {}, "moment calculators" };
   SG::WriteHandleKey<xAOD::JetContainer> m_output= {this, "OutputContainer", "AntiKt4LCtopoJets", "The output jet container name"};
-#if !defined (GENERATIONBASE) && !defined (XAOD_STANDALONE)
+#if !defined (GENERATIONBASE) && !defined (XAOD_ANALYSIS)
   ToolHandle<GenericMonitoringTool> m_monTool{this,"MonTool","","Monitoring tool"};
 #endif
 
-}; 
+};
 
 #endif
-
-- 
GitLab


From 033ced6d190c01f0f7ba6b3ec82f980d0f1ca6de Mon Sep 17 00:00:00 2001
From: Ewelina Maria Lobodzinska <ewelina.maria.lobodzinska@cern.ch>
Date: Thu, 17 Dec 2020 09:24:38 +0000
Subject: [PATCH 107/225] removig Charybdis interface

---
 Generators/Charybdis_i/CMakeLists.txt         |   22 -
 .../Charybdis_i/CharybdisInterface.h          |   24 -
 .../Charybdis_i/Charybdis_i/charybdis1001.inc |   17 -
 .../Charybdis_i/Charybdis_i/charybdis1003.inc |   22 -
 Generators/Charybdis_i/doc/Charybdis.pdf      |  Bin 48116 -> 0 bytes
 Generators/Charybdis_i/doc/Charybdis.tex      |  152 --
 Generators/Charybdis_i/doc/packagedoc.h       |   20 -
 .../share/jobOptions.CharybdisHerwig.py       |   99 -
 .../Charybdis_i/src/CharybdisInterface.cxx    |  315 ---
 Generators/Charybdis_i/src/initcharybdis.F    |  401 ----
 Generators/Charybdis_i/src/usecharybdis.F     | 2083 -----------------
 Projects/AthGeneration/package_filters.txt    |    1 -
 12 files changed, 3156 deletions(-)
 delete mode 100644 Generators/Charybdis_i/CMakeLists.txt
 delete mode 100644 Generators/Charybdis_i/Charybdis_i/CharybdisInterface.h
 delete mode 100644 Generators/Charybdis_i/Charybdis_i/charybdis1001.inc
 delete mode 100644 Generators/Charybdis_i/Charybdis_i/charybdis1003.inc
 delete mode 100644 Generators/Charybdis_i/doc/Charybdis.pdf
 delete mode 100644 Generators/Charybdis_i/doc/Charybdis.tex
 delete mode 100644 Generators/Charybdis_i/doc/packagedoc.h
 delete mode 100644 Generators/Charybdis_i/share/jobOptions.CharybdisHerwig.py
 delete mode 100644 Generators/Charybdis_i/src/CharybdisInterface.cxx
 delete mode 100644 Generators/Charybdis_i/src/initcharybdis.F
 delete mode 100644 Generators/Charybdis_i/src/usecharybdis.F

diff --git a/Generators/Charybdis_i/CMakeLists.txt b/Generators/Charybdis_i/CMakeLists.txt
deleted file mode 100644
index 37ff118e17c9..000000000000
--- a/Generators/Charybdis_i/CMakeLists.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-
-# Declare the package name:
-atlas_subdir( Charybdis_i )
-
-# External dependencies:
-find_package( Herwig )
-find_package( Lhapdf )
-
-# Remove the --as-needed linker flags:
-atlas_disable_as_needed()
-
-# Component(s) in the package:
-atlas_add_library( Charybdis_i
-   Charybdis_i/*.h Charybdis_i/*.inc src/*.cxx src/*.F
-   PUBLIC_HEADERS Charybdis_i
-   PRIVATE_INCLUDE_DIRS ${HERWIG_INCLUDE_DIRS} ${LHAPDF_INCLUDE_DIRS}
-   LINK_LIBRARIES GeneratorFortranCommonLib
-   PRIVATE_LINK_LIBRARIES ${HERWIG_LIBRARIES} ${LHAPDF_LIBRARIES} )
-
-# Install files from the package:
-atlas_install_joboptions( share/*.py )
diff --git a/Generators/Charybdis_i/Charybdis_i/CharybdisInterface.h b/Generators/Charybdis_i/Charybdis_i/CharybdisInterface.h
deleted file mode 100644
index 9cc61f657ec0..000000000000
--- a/Generators/Charybdis_i/Charybdis_i/CharybdisInterface.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-
-/**
-@class CharybdisInterface
-
-@author Nick Brett [ n.brett1@physics.ox.ac.uk ] - 03-02-05
-
- a set of c++ functions that act as an interface between
- Athenas C++ herwig command sting handeler and charybdis
- (a FORTRAN program for simulation of Micro Black Holes)
-*/
-#ifndef CHARYBDISINTERFACE_H
-#define CHARYBDISINTERFACE_H
-
-extern void WriteCharybdisParam(int,int,double);
-extern "C" void readcharybdisparamint_(int*,int*);
-extern "C" void readcharybdisparamdbl_(int*,double*);
-
-#endif
-
-
diff --git a/Generators/Charybdis_i/Charybdis_i/charybdis1001.inc b/Generators/Charybdis_i/Charybdis_i/charybdis1001.inc
deleted file mode 100644
index ee1ca352316f..000000000000
--- a/Generators/Charybdis_i/Charybdis_i/charybdis1001.inc
+++ /dev/null
@@ -1,17 +0,0 @@
-C--include file for Black Hole generator
-      IMPLICIT NONE
-C--common block for the probabilities of SM particles
-      DOUBLE PRECISION PQUARK,PLEPT,PNEUT,PGLUON,PGAMMA,PWBOSN,
-     & PZBOSN,PHIGGS,PFERM(3),PBOSON(5)
-      COMMON /BHPROB/PQUARK,PLEPT,PNEUT,PGLUON,PGAMMA,PWBOSN,
-     & PZBOSN,PHIGGS,PFERM,PBOSON
-C--common block for the main parameters
-      INTEGER MSSDEF,NBODY,IPRINT,MSSDEC
-      DOUBLE PRECISION MPLNCK,MINMSS,MAXMSS,INTMPL
-      LOGICAL TIMVAR,GTSCA,GRYBDY,KINCUT
-      COMMON /BHPARM/MPLNCK,MINMSS,MAXMSS,INTMPL,MSSDEF,NBODY,IPRINT,
-     &     MSSDEC,TIMVAR,GTSCA,GRYBDY,KINCUT
-C--common block for decay of the black hole
-      DOUBLE PRECISION RHFACT,BHMASS
-      INTEGER TOTDIM
-      COMMON /BLACKH/ RHFACT,BHMASS,TOTDIM
diff --git a/Generators/Charybdis_i/Charybdis_i/charybdis1003.inc b/Generators/Charybdis_i/Charybdis_i/charybdis1003.inc
deleted file mode 100644
index 751fd43e65b1..000000000000
--- a/Generators/Charybdis_i/Charybdis_i/charybdis1003.inc
+++ /dev/null
@@ -1,22 +0,0 @@
-C--include file for Black Hole generator
-C--common block for the probabilities of SM particles
-      DOUBLE PRECISION PQUARK,PLEPT,PNEUT,PGLUON,PGAMMA,PWBOSN,
-     & PZBOSN,PHIGGS,PFERM(3),PBOSON(5)
-      COMMON /BHPROB/PQUARK,PLEPT,PNEUT,PGLUON,PGAMMA,PWBOSN,
-     & PZBOSN,PHIGGS,PFERM,PBOSON
-C--common block for the main parameters
-      INTEGER MSSDEF,NBODY,IBHPRN,MSSDEC
-      DOUBLE PRECISION MPLNCK,MINMSS,MAXMSS,INTMPL
-      LOGICAL TIMVAR,GTSCA,GRYBDY,KINCUT
-C--BW mod 16/08/06: changed IPRINT to IBHPRN (conflict with HERWIG)
-      COMMON /BHPARM/MPLNCK,MINMSS,MAXMSS,INTMPL,MSSDEF,NBODY,IBHPRN,
-     &     MSSDEC,TIMVAR,GTSCA,GRYBDY,KINCUT
-C--common block for decay of the black hole
-      DOUBLE PRECISION RHFACT,BHMASS
-      INTEGER TOTDIM
-      COMMON /BLACKH/RHFACT,BHMASS,TOTDIM
-C--BW mod 16/08/06: new common for version 1.003
-      DOUBLE PRECISION THWMAX,RMMINM
-      LOGICAL YRCSEC,RMBOIL
-      COMMON /BH1003/THWMAX,RMMINM,RMBOIL,YRCSEC
-      
diff --git a/Generators/Charybdis_i/doc/Charybdis.pdf b/Generators/Charybdis_i/doc/Charybdis.pdf
deleted file mode 100644
index 99fe972509863df77ba12ea88d1d03f479dc9f4b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 48116
zcmce-WmsL!)+HK(Z`|FT02_CAg1b8#3-0a~2oAyB-66QU1a}B7!6CRc$$8H?@9FRB
z+kN|a?)}B8+H1|4RkLJ_Q4<OUQE_@E1{MIt;Bj;=fSs6;*w)Arz{?Ai0oj;2nG<uo
z)hGeQEv%eC4#YrlD?=xcD9G5>1jNq|aCCA28CnC}(hIa?<5vbyuHB^th$RN7nzw@Y
z(1^IiYIWxeNeAs4<02R|kXwTw-=o8vdR!gN1Rkc?#1J>gji@R@@+7C6`aC~42WF|0
z#(vm*>Gdr;ncFYp=uDpLeffFyQO+0es<JZIs(nZHq@P0ZQLC<{z4P*HI5B~=#xk*l
zl<DxNi|6%2tL**wNtHUSG&2c{hEr>Y$20G$ERu5^P3(5BbDb-a?>F6Na5=X7`rQVp
z%fzw7kJGEx+T^sZx1O$!*L!=tmiUO*b7{U+J9BBbr@rgYPXtenSI<Ao%7|<Vy?qu=
zu2_e^Y%bWo9G{X~8_m$IzF2eUu2TjxqGqwpu#_0+=3FdkAl-sgTLm;y!svLjte`~_
z*Z@Rx#%_G_^!%QwgxwL`a7DAup%ZlV2uB05kw{`Ba9%JrM44yj2g1}muC>gc)tJ-u
zTt3|@M35t#b@ul<$C^3GarC3E7LiO#8IsIybbLw_BA&5wM&LPc(t1)>mgVsiaU^iL
zW956Fuq#%5u%-|le}W6&(6g}}UDdiX@htTMYO?p0s}o&@N!<5VK8g47knfIV{&v%p
zUmn+66#e6yfG*Z@utrs7w@z2Q_W6RyetRMnX(CNW;aJnmoWuDi6huW~baR`QxDCem
z+~xsFF433e{EdE#lSrgasq%!)XZvJ^;;zpvFd-F4bBn(SPPN}LkZ^AxG*yLI(?j&@
zVy(HgcDreYiQ<;8CaT^a8rJp-VkaQFz=tvfapdj7ARjtVDO0`kH-@v0dbd^E+t*K&
zI)VqTIPwKypzYHr&B#Y`O6hUM1Toyarw-dstYmZco6u*_b}>UNA5#yV!*pT?Tfd5|
zkO_kbqhD)If9Bvnl63J#cXSdxoYcFf`nmS3%a4D%_*~lEt6A^<o(EY)FDxODFGaz`
z3ChYqeZh_fuV-sq5%C6iTdZP#0p8g<++B8Yn&uF_X_O}aSZEh59AqWT?B`4)R{FD5
z9Vs*?6Lq;XKihkdkS}fdV5yg1P-I&3>}a#ZJsEyDPDNbg^x3)_S;(Z3W<lf!+aq%q
zH>9zXk0?E|u{87@w#?Ci%SM!CI^6=zDy7jf<oF=iwCq^V<QJHR^y<sS1h?T;lR=yq
zDz3FBTj%q-f^ThSNEoIu#FDmlH0R*-^kt<)^TVWK-?*tAz`vNk7i;tGo5{8eLjEeN
zy?#GiO*(86^h36ZM`i#gKA#l#mSq{P53ig$)ImG&>LwzAlw`Y>Za3kQBDoOXB}j~H
z$d0HzpkNeTfperULBJ{&#Zh<#H7r!&u9mlL`NuX(#Wu^kpMEsz$aNJ*>KUOeqf?~I
z(-5~buH%x}ttoYMcHo?}T~^y4Fp1}o#jL$bCLmI@5=l-jz4WHrL7Q{So>DA8f0QFg
z4@CE2>?$jXdaST4cyq4+KYWyXRJOjl_JaUtzXiJq;~AtObA>Kub#v;(mnB=i0*ole
zUVhgDvF?(xBZ(f-Aj6fd&#7tyg0&mMw5P_9YWpI_Ch!OzUOo{NbnemGFlq*g*1q9A
z&R2lmjrVxAj5Z-J=hfZ0r6t8*g({~SJ8xWle{l7{H6?1coqWjpE+~kzc2jNJ0$tCo
zdOQZH$E_a8=%nyz(|aOd)CxDB%A}cTDw(2M*C2=-{eZ6L+GXbPUBG4Bs`qYK>N;xU
zC<%5kwi>S{494)*lt8Q~(HESCJi&1B)z|{TmE%EdWg*^bh`4!aSV7tygKy7h)8CX>
z49g&Y5tP1raDtpxw$pZr@0mihuwOyi^-1yXt^MQ&#CO%3C3$}TjLxemH+uD)qb*V?
zqZk?o^BEt*V<}UKQ`fC<t<lZU9Irm#?F5Ao2W0iUa$0}9AfoJ=c-yQ98$`OzpOqM3
zmL<qVt^fn?P%J|(1*xNkt+m%6Kxcf&WAU1OLY>%l=T}^~)6sZJ*yc7lkqZ;yt=ia;
z8<@TGy-CnG)3u=&3p75U?`9--k}ps|)GrwWzryia5?cqrYxfL6lGm^D#S29}>`{uU
zz=L^QpPGPJKxZIwykmqXL^UWKlWA+-hw2_G`?=DnDZvsMmGdc$UJd&^f`W9hVTi(x
zzyfnIq9ivdJN}S9N{(3E^UFlSV^td&r)Z5`luY*d2#g_78#;EGB$J!4obO1m;A>s_
zea(w{z_6l%!|H0@lhONBQb_3}Qa0TI;XY%37<ee)<mcEV$dmT7mBB9Od@(F1NXQ=K
z5OxIWpE<&Xrq@=E3_=*vlWUXU&o)f$Dfq4hFl=8MsOU{6Krcx-23!uD=*i453Vy5L
zvJ7U;w>#1W6v_`Gc;sJAR$D4b>auE5cT^C+m%*I=7^2@wNX^MqCJ69(2U?-CHD1R9
zRQ}>mk||$(7)3Wh=sC}47?z=!5GiL^d-znw3KWL-bgFYuuHa3-j91^Y>!p)7%g<;I
z$2JTf!S|?C!N++&3^FeD5eR&+fF^x6!_24r3Slv>@v0%EVUirX)DJQA`Xj*4t0iA&
z#o?R<YyUf3iQd6MZ(-STFK$7WKc-l$uy&jek^Yf@ltA01*Ik@Q^5w{Nz@<?@+p7P>
z0P`m94rhunD8Pd{%bDF3Wm8jKvBIBWVSt$_6R=PR>4mc}K;vMC((9bg<o~5WZx78T
z?I+zg>apZ5`}w|`yK)9;5_>U9E{6Mr2$acS8g(Y{xYlk$F=}N>p3V}P<}hs{1>SB=
zT3svQjat!G<ffVuJKwxb9j>x{6g*-DKq;Gi<k{%PY3d?wYp-Uh;v6{?CrEhyAyidl
zi7#k=D!(WlItB@6rx@QkX~tsK{G2^=d^b6P7xi<SiXkPKk}9)5bd2TL@LKJtm(HC3
zPJ>bJQ1Iu4=@pqO6LRd;FK0R3$^K0d8t;;Butkgu9M-Rt-M-HT^t9afC9u%G{-D;|
z!=iaHBf93LcY3!5AC-NOpNw>?<4Li-5Uc;wdLN@6Y^6TR?sjUd0buK^udaCa-pGAc
zUP+@_o^hJ4h>`cB{@0#31Xt?djAofY0}3u1b;_c!lnAWZzI3z?Fa<L|?8Vb&iorn}
z<(O-?IUsr+aMvgIFt%|OWsRn_>)!bV>61cQrsfb4#yJM_L>%KsA<u|%a;c9mN=>_q
zyboOEWOS+Q0$D%P7~wFZ+_$?LL^nT_O!Is9#JO8%3k{#}7A(l7v*8uJ+luu!U+W5#
zZJ+1F8FGKbi`cWugh8|lQO>G9{(AY%5L!~Pyzv>CB0y%zP>7|jnaF{LNPTTV9@~5#
z-sYK`!D_i?DHxG`yN6pGI0N@FF=vZnnYZAc(&9=}k86<pj+1P}BO+i8cY)UaP$4rn
zKwbAf*H-$<o$j%*Z+3_KJZ!_?4RJdX=*_rMtTI>}6v1r636)<!gCF@RWj{%}pYIoy
zCj@!mA<3AO278n&UU~Mrxo8-17sGP%%EY21q#BgC%3v6)^9wditWlcz>w5GO0lFH-
z)$#B!85+AZuS6~a(rw%_bzF$ZuExg?opRD0i0SI+HR#1o7rc<iVCpS<ttX#|=h$*5
z#wpC|tT(8SM@$iViP|SKky_8=r&)s|rimxAl;z4uq!-&tpqn@MX>GbZ?BS(^f6D0E
z5f`L@f!pB6Dlr7Xc<VO!RTk2&RM{h8yv+VE1R3%jS2?p$9wY|{4nj@VFl0E)VYhG&
zOIb@4hPXabdf}UGKVGP4pY~FPSsb9QaLa$5T!o><4Lyy&?L0z*NbH-eHCKqm2TR%y
z3z4_MTyzm26*?IGVN8^I&X<M|X(VR$(RR93GVR7GlbuOX!_yzSNLw6dtN^Y|R~oDR
z&UxrFZSLiHf%fIp^jQm9OR}u-dZ;EAm3lPSr$x3TYU?}pA>|$=bBEO=J4?S?vLo-I
z;Uv$j`##1%EeTG<yEgVoU(KR#um)y@hZox%X(%Uh;L{=#>m(nvUp%8q@k92NFM61R
z3-plgaHwgDeGhJ~&%@H{avJwj?p2Piz?yC1#88sQ!*sv!#Ey?XH#u+^=1ezt7h9A9
zq>ojb1o;DB_kM<)`~oxdFv(ttKC@ljp%8+j%a9l79nyd5{rZ^zz!I^(OO#vv+3JZT
zoR-rt;M@!QqX6Ap+b37!!3~bD2b)v~j>A1LiQfK%KdqOXih0Z9B`>8D2(5B#U5NCd
z`Fh0{W)lvLHsk$G+{XqD>-53UW3<X&h4k#MxZTT_?)I|~&I77CMiBb<OxW0-?7#2N
z(5fe1IF`D6<Z4;LvOR#iB6kinGI#UxD>6L#)hm4a!xt<#wx$?lWAYa{d3*XzXnxa}
z-+x({nYaLd)v>Vs7q-Lln*jaq>5le~_?1SK)4HDm!rL9>%0#j;?<7qMk!sRrZK!5g
zn=J@a`OnE$KeJJ+$0mG#Icp{MITj9b+Be}=c6CDsJN9`zX=**_<^I0N&GBmgYI9Q-
zI@g;z{{2ZH?fGH+`scO0On1D@Zg@qNt@;hLm2O#i+)*hl%fQ0I<D9zk>-F`kTKQOh
zF`V13N9%)STUOStrs~`n-x1Ok%hwv_HV!uEHKM`Ox_h)L7S+1tXNxk9NO!F+iR7Kr
z!>8O4boFMt=;ixXXSKw;?b%G+#~D-~t!9ZqMWicS(7*@HkVJj_U-P`cvU1E-AZry_
zZTJV@{B0k-kX~)W6uc`*Q=Khl7Zf!Ufc*N87BeMCxM%piMfTn{)+%Naz-zE~r;d49
z>pjVFth&$H?KopYnp|{BojJY3?u$$Nr@{MrQe)Ee#?CCQqtrMv$V`{nnWr0!eOk2L
z2S7PZe#5EU_Yb`bSJjtiO;N-e7xOfu=T^(t+if<AW~5lW?pq5282z}6g<Wn?4e9{i
z%(N3MT4R^Tg%iEjt9ja6p2wzOXk*n~*LisB?MQI(VvOh}s#+x&+bRy-I{W!ImNWt#
z>fTNJy6x(1mK0jlb`I3jM#idDdx`MyJ>yS~sIDhWJ>)d^oaYp-0%#0z?f{ISNC(<p
zDzx=6yXg({n!)&r@EWE_hQ#R&RMgPBH_mXew95fD-cOT+r>i;S9o+Y1cJCYo@wwhZ
zXmm>-lHJeS^aMd5QB!qmsDWj2z<uMgG-w{_g{BVz3;3w!Q}t+CUlhlBKysO`I8+AX
zG|?*p!F@Rd%D+<1Pl6?+#ujIP_lxoU`JOl69XeDEsFhQT(6!>4dbBIqry(O!4>m}9
z>cE<6a6Aa_y2vHn3IYdHFv*LDJAZ+WQYp+EwO2ogCN%6L2`N9f78UyXD$fCG+KnGR
zoK#neFyoVD1%WTIKXkio(J)D35^}r00eHlnz{Pn+wDq=|8tDo}?1hR+R|xnggs)Q+
zF-mvO;?dhx`mM>KN&Q!b$DN)lP8mffxNdocnYY+xPBX@&st=Hm-WOcmIvChvq2t+U
zQx~=G465I4xq9~~?4gkJ!J9__-qE^CBUPoZadML-s<4mS|DwyP^GhIFj%?ulmRBCg
z!?2~Eu_@}``GZZ``fBP@RPzI-Tu|(`tdPoZ0TE&r!Kw*CRQsnhmkAQ&>Rm@cw|;32
zLY<Fw_eu8{u~mS+5b2V0g#I0hPMLX#xH*}O+qOnJX!Zd%udoU2fX-^<HspEZY-vBf
z-i?NEDwi)WtOy=e6$h+cbUjDgl|+=%fgy(AR$)#fv4%WrRwvs4{s7JId1+*3lodC2
zv&NHH;sKaGMC>1Q>=nVKhL^O{c`6sqE4X6qh8mpDr3JEov=bmb?;J~N3`{kZ#$s8h
z?DSvd26!Y^bKAdG;;j7?%McFlJLb6_9S8TcY8%%`pUZ|IDYrSUu{C8HyMiYrnSAc8
zIayB2X}H&X7f4lWPHI>Np|y)z(f_`3C)?*Xy%3@HQMv!L2kjfqv3$==;K~ejFZ}K3
z1cOy|_^{KZ258nMb}UIUj6{$YK4vO2E#;fU;5{liRWV`Id<sa-Si`McV(QUl0Y1wN
zE$RKVlZNjR`#Y4N#=u#Z)m9yN3{<L}85!vjX$Cj2wiu-m-Wb_;z%YC*2+C3UtS}1P
zZX=5*)pG>rwcZ+>l`{JPQls^eC#bkpSZ)$s=#%)5v&jj;PvcTco~^{r_O}NeWz{wo
zR)`}tRxlD&GRt%&8#iu?5ON=6DldGcRNJI-rcQ4?;1U<we8J{LxjAyF97R<}1y#tA
zvAIV9x^`cfsUpa$Il#M_sf(sq;stX;`sk1L4L%f7(qesl5pzb7une`Dt7mBSxBA{o
z#2#~1xVMoPPHr)(z0u)UV!`oiuvOPL{gpDm#Cxs>L5vX5JqHYYE5jt(X;b(88f|qY
zO&dv73f3$8!TmnPB;@wXqHP=MS5<;k0liadMUTR}byVA70Lpn&%7bD3Xx3~`;utO1
z>&k48sf4z=ku=%9a9VebP_W{?5jI~h<Ib$l;&Qq+?t4TZtFN7%qCChh4pKbR$+vMP
z4qMFO^0Q&d<z9XcU#cpvKO`|fsR6kd?PDJM<U+LDQ*`d^gB#qEMrJ>=P{}Q<1WsBm
zbNwJr_*oRQouf9em@LiBx9EZ;Dyx}IEd{d~({`bNRSGXMTr~b}Bc60rH6iaTWMHX-
zl)<v7+0(?;n%Nb@>sr`#g<@o2`yG?VB6kg9qNjULeTeo?GvX5**vbn#68vO^E#1&D
zyTc;c+}6h>ZA`_6nqS>aRelWLW*F+j!dx6~Od?y27vQ6y9e29DI~Vj;7|YYB(lmuK
zkO{VziM|w`x4Zs0+}po_HB(gU)HyQb)B<4k89M?;gOLsmC?T5F4UoZMx>S@|Q3{?-
ztiiq!58GMdtzf_V6w|{7vuUD4dGNYuvmDq!fXuxQ5<4+L3lQ)yMe37Gcs7qsoEb@S
z(vj&XGv|Y5vQF~>&>=s0H6BW6%M5?<_Rm!zzjx)=0N~OM<ACoRq2uv4#sfz|VxsmD
zCr)ANp~dOm&3NteAgYxJX!w<zXpc!fyq#+b>*_C$bq`hf<!y6~QtBzcP={EMlQpqU
zw)O-9Tm-t+Pc~|ad&4+;QLED3hK3Wi)-wqd#wQ6qmQ5x;Lvl}DGlSHMl_9m!!?J{;
z2W>9D^xgFjNLWrna!v0A<}%lX+W8Q5r2o=IIaGMu)zlSLL35>$jiJZG17OL?eO|`$
zI6_d*<1mN_y=Wx5;a`H`ChH0>^-+WO2YbicNk58an_gGAd*O!bYIw{cogFjdHLRgb
zr*L)8A%Ne8T2V86bC6ES7|I5lvkR#bWi(i(tC9R=1yvWyD4moUQ4+zh&<`DTU)F>I
zIWOm>4)NslTP`u*`%;G*3A=#AynWGN+wTPPQ|;q5dFLtxNFM5$E*Kxf14`~U;LGJi
zKUp(|t6rLdTUzK1eUWzy*kI@<G+4#(QYa?Ag=i8gIM->)FyPMprmdZyA3=`Ho1z&c
zL-jgEn7!&q01nHpQ1GKqTf3FslHe6H<uNz}G@Am(Z*k*MTkwUkouAnzbWjj#KCeeI
z$4+V4am<2elSUnmg&1)Lfm-eQ+&(3yK3Ysz`yo4&N1sk@F|417K%~H%^i{ah=`vce
z$E6!@e51VlbCHDo^^y96)id_@0Iyp^o60g;BRi{tsZEr|amgR2<pEJt$gTsdk<z&K
z0_UGIRi%DrU!nDCR2|9Vog^d+u?b*kDvn-(2UiYRY!`mImE%n%1~7P7S$iA04++Rd
z%2~@S?4bBrO}Zke?9HQ#pJikRDLx@Q5TYi_HwHJeqpVqSeqgX5l{UW)^r_E-i1CN;
zj?MZ;vzF=DKtYmEvbwwcEm~R{7dgfBySm@av<tgc$)|vTGV{{+-;4vY@+A_b@^}c`
z_>4bK#u6?MW0^Fg+J}Ir>|)({`d)qKG90@r^?z5YfbR9f#jKKgXKYN>uhigb{`5x+
zsv}_mgLVsqzJCXugb<fMnb<}Z6y{nBIdx5{xy{#K)4-jRX21kuOgkh;<ibwAcE-;o
zI>YzBZnsW3Ijg_2+US0ouq8-gQoJ5igPvS455&q)FV45)iIM|LMh~=Pwb*d=aI<>O
zu4XlUk4tR(_`ELmm0IRkkfk%OLF8Bs#8T&Duq#%td#e;w#Yuf4^XP>(iE{iS!VMep
zV7K;YKtWSsZd2>D*h)rVbjl!ERz}L;ku|Y^(r`KmpeUhC1N=G+@5sSwNGJQ%x4DL>
zcsSc)q5`PjTrS;05LwlC(6_GccWtz1j;F@_QM$={!JU~H3xSYNMKIA=YcebK*}JH-
z226JVY&^KV-W7DpXCII|_97zKYZ`Fb`go<!D`eR67#%T-iZ(eaJBeMb65QKvbYJOp
z$S+lh_v$=A`CKhP@9VxM-&o0RYvj6PxB3HOO~eL;Ge+Dq8hAn%R>hk1F(LhAC*7|7
z>I!PwnF@xfKoOOMR(R;iMz&~<US$K%S2;wTY3`e)<fP>g2}NN80<3EcY*?rL0+ID2
z^ZFJS;g``|mWqT&A>&Gu<PS{qm&MyAAsi7NZ2VnlKhd*C$5{n%;R`sRao1aeh>>es
zmHRIU(5f%G#iks0bXQ%@o;l!pAE)RgpfMe6M>ebT`-vUyTo;afD+uR9h8FftPcgp#
zbk^LN9y12qeM6B+d;U58ICpd_P##IE+x`L?SF8Gw^6GK5t$nxutiRx^;eG4#GM%J@
z#t``}SQP2V#Hxd8)l@DtZlDawzgPrMoRK1NeY0FComt250HvTe*b0S%+-hNqnNg&L
zan^&fhaAIIUT+|tihxilHZi0Ki-0g!TR1S#??7j<fB4+Wc8G>=+T-?Tb9OWGbpW~R
zAnT6(cZmEC`*kJRai_+u&UKRqFE*FGa*<5aF~<k0ftMD>X>d`~EEG9(j%mzdnpCCH
zE)Z$<R%fg9D%tkI%#?R|8h+D-Yb`P!JdQ>pV(l4cI=<sN;e74PsLnGs1k93WNW0>i
z>1bmikTp{$CZhTBI__xKtiP<cA9KVBARk&c@&ee4fOkWwT%u7xD91d023b*S-VdY^
zXWbHrqm-O65uQa6=o2!THVP<GUc62o<N=BUU*jMsu|$r;9UW1UW?FTy=q0(WOO60j
z?dC7=)~STCF>p_NukePgdyXs1JeFK+wl*z&l*%(DJF}t04pT_RYzCcS3<$_zG|f^@
zInC}t0*jupB~gn{rn4y0`KdJN1%<cs%E?y&n#mCO4_Jh{<{1;K`8OY8NwUfuDBAPt
z(`(6zr(AsEF9@Q=*yw6dty<O_yva<F@@R0z6NE8AkcVHLT$mB{CgA*^n+n2HzJ9rH
zJsZjz^Y#|ry0;Jxca<Fi&}xvCj~0R3JPr5|Y^}?9kYuzjL}cfV`Mw~zh~&@x7c%^Z
z<^EyA9PCX0WW%h?|Ah^+vizU0;W>?^s1<R{3^PN1VFf*Wa@rcTIGnqj75iiHEedNA
zA4xp$a9UTEJyK<p(fh~M<%q)CrNDRK;Ft=uYc03wj!izDGRS(AKeL|c()u6!A1UU|
zPV=n3Cav`E;qKc7T#^rto~#7lgXtN`#0-747(xF2b;a~zqu;Q&<!1B*2>1S0YGQNU
zrPJ-)%jy@2m{gpS=Qm}E_e`-=C46!1+<E9APO_V0?fXXTBO&h#x7H^VulxklFbk@A
zc+f^F@<6O;Ho0<+jvhU``uDFQ0weu<*Qh{t`8nStAW`?=T+^s8J)ypZb{1-tWDGL*
zdXn>0#|(q9D9c3o==bn##f+_VGVx%({)b$_66R0QapY57cA}1(e$DRZqAyNY1rJ8D
zweY*-x|K{~ItNuvP)+IXENcq0P)-R@EUC~@({|sh{lHjGH=lJei8V4!Up_b8d<o7v
zEfa5)AYO$S<(%9*MYF~PS9rM|gNAtO2jeSS{^%)=mH>rb(UgK3SZA+^RS?B0M2B%&
zSV*kiMTvM^q)Sg<3yZ;G^sa=?+4V3T`z0xC7*#?hpyC;c9W{Wt=YBADXEyLQH1_=1
ziagm<-HRN1Yv7cj?hwraoCOb{8gR2ACp^rw)fEf~p5lECN>ELS{oemxw6#uT3Q1K{
z`h*R9%un@Eb#D1casIZ}0?u2GB$U%p;U{-YfXsVAPfbirDZw7dyD~L_%oy$k@(Uf*
zs3IL3p|xeJ5I06o+c*HUUqlD3&YW?$Oq>tANCJy*$_<YMkC3~<260*-KPa5(Cl_@{
z&B6ktpPbh)$}$cARG>RRq|!tWu2jxLHxSzaWq&_j&yrOtJZ@INW9jffklDYXy(82e
z|6(N<zhym)O_tb9XY#O!E6EU(=hk~}1PW%d*x|jGr*7i5!IhjziK9egf8|%tZ7LHE
z`%{y70^v3uZd>9{WLh@FnGfdAOFC%pb-{Mi(dMY<S^eh=f<$N29-yNI(8s$KV87e<
z5cov5-27-VK5MwLU(jql`ZO6{Tg8~<ytY(t(zB2hUjh*ZU7-$Tcc9`A8!xZ$GNTY;
zVi)bNfCeN0u9NRL8=m_`ZOwEZ&whut=ti3@d!5pqdTpu0NmtJ5_B=}U%jW$6f`FQ)
z$;>8qdr`S5`Z@pgkj`vNCShVYuN=gM9YR7xb4!RJQMMSA1q<6cXag!kEu9ID1jQWb
zDT<YiSK^Gu61$i8iu~X@VbKSkm9^Uk6`$@zoR#37T1ion<akuCv&~zheq7(bvBxEI
zPjK+92Svi1#fDNM(EIX6i9I)D*j%zEZ15~i;3*YJ2v|cEvT(ZMV-zwPIv?Eg3qCRr
zDX`a^gnuMo5kON4mlRxuMx`+VMuYTEtZX5=_yoVoG9YKDv>BPP(7yl1!b+aQyQn9a
z!@D!F#X*^P$eNfF_9=J4FU5Py=$p;$INDN2%R&KMh&khqj6nUFghZ8zuYTg?p1-vf
zzNcZ8k@1HL^GRvJ6;=7%0%U01SLAkw<u2F+;9mX3`TpF@;6hbZ=0WHTClRBHV_dh2
zi1pd$>><H$)?wzFX<XEi{Huk<*5>=OxvLL+6Q(hzIgtjjhG5FJsZez<!{{u?>QVPU
z$9=7sg<FsjHwxvlutLF?T|y%sTx_1oLgm=}wZjzDljrcPndAv{k?HS?-!p;6BPLNW
z67}2~j!1g(MCQ;jZeu87_cBGLQ89T_Kjbw{Mc8wG=|#HKn>Uk8eYC%RYQ-8LXGJc@
z9UjZScbjF4tgw2ZB}2;#x8HyH?x<TyOYOajpQ2PmPkv|_)q|IIPe(q3wT~{a2unTc
z74S-k(&*q<XSjDf=wj3L2<nR$jL3GAyUsG)1_g<*@P*19mSHJ#9gdQw{J<z{W+qT#
zy(i0Wv;kM)=!Ke#8lPbGr%`KclK0ADaQp<2X6QHKMtx-&nq(R3Laa+2yfrQS&a%i`
zHW4Nmxp}q+^;}tC=HuF2(>kB(fZa;-`1tu(b4)c$%=ve}{JV2sq|eDeWcm4gdn&1V
z^x=HM)mtsLuW-=$Fc_uGv_}L2r5-x_`fR<?WL(zxxt$%tTzEB%`%uM|M}pQqhxwI&
z)0TTosVtt2O=gIRtS^eJ%ol{0DFy46w0!OFu(XW?B|lQZp(aZzci}V|TJGZ*a}f?V
z3h1;=gTW<0gW2k<pV4}!i(p+^3ZOSli!-Hcn4_MpxYm94!bTjlWl!toM{l@BYYY6i
z)Ku&=)jW7Q=3U;XkQMUt#Z<i^?eSwKJC=(NiNAji!xx8HwId&AuO-(&x|10EXUKP$
zIkMQ<hLfO0GH^Zx7XK^GhSry!k0Fqc`$T-BfSHus0j8~4B76gE6yCIrD>sZb>`<OE
z3XKj@=PdXpl%Ec+<snyICHR+T>AP?T+!=Dk++F40h&)vi%)Oc{xLe5s>7INLhA_R?
ztS#N!j>K6iMJh!DVg@7i@uKk@$<#r!tsBUGeNqAI@BAZE#^-e846qGzpnnRumicyq
zB@QNw{g=c1&msN$FlXXoWc}x1{x@Y?#oZ1BR4_CH0cAlZ7KXyMZp7M*Z|6EY6EiUf
z7qcz^sATK(meoVd`1Y0q$i|8I&#C`b4RW+~b}$Axz9j=GIM^C1gPgR1Z|OqBKq>1t
zbHc<x6_A_L+xKE_P7=z0OtAdM5J~``xb1H<|FH9xCj=CEE5BKGB>p3>1Kz6My732q
zu>Ko#{D1H0AGcV4cV6kY5C3-S&rQIey1)ElW%~c$uRobq|LNBsO!jxbeh=yIapUEE
z8~wMy690*;BQa3g!o-nS8}K{sN&uGMqpAe>(+MSjF7aDOoqq@9Zv+27_3!N!LnlKk
zTeE)}{8#M$IUxUP_)ok4jyX`y&>93(Vg;%w0i{gdf^6aB4wP4rC1wID%Mvp(Ff#uw
z+JA$XO00lCUjFUZe|HY3#KHt%`R$_;P>Gonz|8sABO8GEPZ!^6nE}jyW*boH?M8=*
z>mM&Lu>+X?afPGA!~$UY(~Gwk7y(RwqW<s3{>*}ZjO1HmTmY884E%4*{>{KYZ<O9v
zhY~A0fc39t|8H!)t;BzZ^&g}Ad!mYh9E}|;?3`>J{w$|I!z?1Mq%NlZK}1%GiTO{h
z@Y{0Me(M`OGaC~z2O|eD2OFdA?<_qtM`Bh0P{`5v_kw<_e4Ffsc9I|qGxNWSzs>*t
z?e~`epwwINEsTY1%&gw_0RT|h31qEC%*4nJ0Lof8I$GG6sau%5B?GcBztxDC8#=u0
z1=K*h-`j;1$kgc{PY%D01C4F1tqp;8AO{Ou6QBpk!4_z10|Gj^+5%1Ab`zkD#aqeH
z2`CKw2$TaF0*!#iKoHOzXaW2Lv;o=z?SKwIN1zkX8R!Odr}@WD@|JuEVj*VwGaddN
zfIsEGBB<<a<n()+`@JNXME=TF{Cl$EKeHKG|4bx){(ogIR;anFsO)3-M*F+VLm0DG
zQIvQirOk(jhf~s88bcff2%<wK5=U^;L4|;Y5cDuJj*Vp)4pxu%R3jJ&LSSHE86jg?
zjvJZFvJNcIVx!5X?s@Ly$#x3KE;~-YdhCs*v#|VlUT?o`T9sCgLPVFHsq8okbb0a_
z^!njPTt#t1wA!yfxkU$kkraok!`@-sHd*31U%!YW`N#_J0??<*Ntt^*?<xEc6*G0v
zktv_{uB-}eO=`MzxNU%~-TBt8=y2;t4JxN2`6$)V*J>-hibthv%HX7rM|4JL5-n+u
z6jv}5H)HZhN%S)<Ia^Y7ByJ5H^>#RJ7hUX`S-E3@ib;V)TJE#zKtabIR$|TmF625K
zmM4A6V*s>Ruu_%6QSp8W{Vb{Fhlb2$aqA*>#qI<m4B>m_D;gq8tX=8xLY<QR;-ccB
z5}a8XOF+Nk1iHLsA$DnIrkL3z5`i$jjg%1u7Csi&%Mwjb$=q8W66bc`vFT~Gw=!=b
z@jlxG*@SD+fGpqErFN2664OG#kC~%e>O$|c4L5#NiPT7AqmIaVUt$!#N$bj!5!iNE
z4Lq`iy`E3m5cF0o)ed_xjaslN3dO2P=uc2dt%k6cG?jsXNr9DR1k?2aatjd>6ccjd
zAwouY)t}35J4~A!m`r%}6s6@5!F2eGckpB|le+V3>56G7iE6}21mXOimA>anWr9km
z15JLi>7c?v@u_vi&)+Z-?d-6Y6Ll|p4KeH)kxV|Q9G0JcqRC7=BR6}|P(`QRFs0-r
zdUE5MvBVB=sqRLux0FIiyD|_I^dI9;|E}An(Zmun=>EFB!ypNz3(a%l+4B9$N(ilX
z4cju;5I*=vLbmT`B?chwO+KqBo3^ZT<A+XxW>k62JKjwHtov1PE|Mn19VJ~|h*aSW
zN_n#UN;o+fD0aJD&H8s0ZF9b*w-xE$YM#y#CZ`4>>f;AtksTZ%{P!vjPF@I994u#v
zn4)lKCo=VgT}kpu5e!Ow&(}BmME71{Me~5$FY3Tv=wmA2YM;RVg~t;^DEyd^$SxD%
zcntr6JCoZ?6ov-rSikEx80%dju%*clWBWy4JL{S4DxlpNo;4G5v!!&58r5f+C{f5J
zeGu&l^^GxG>5{Fhw!6K^#U^e$1zFtMh(aBwkk^TcRNxOLdQlF7;WEHaB%;}zdJQ?_
zmKv)ZIqpPQ`-BCRG`7lGSxf}E_w8mbFc$|hBrV2s)$1S%B0b+ON4ULds~43S_yF{i
zYJGC}raQ=u2B-mb5CJZnk1zp{c0H6~YK0#mmw)p1Z7Td?xqRV5tQej<qRqjD2YG;h
z&;wc7ZLO1U3d3xol0d{A2em>QIv5(EU4@Bp_Jv@kh<&HziN_rvmyBp{mhd_^{4)If
z$N(OZ9D0iqYU<(Re^_AnLV>#p2!!ORSTCUtN2a`aCD)t}W5Z7t^v%vOHkh1+JBB8U
zs3FU2*$htF+HELw60#U)5_yc)QA&<EGdWVlqIe^4y=*vLzZmaWj>8M2eItvEo2vFm
zU{ksMsHKBj$~6j9%Nm5IFC#~&4f6Kt^BMv^Po;gM-MPjx=JA5VaBJkB@bR4(su;9v
z{&nIEs}=0f{OFzaQZn+cg;`HEP8S}aW;1TfnD%Lf8~r49bSHv2+?^m!^1@LdC)1@@
zdlJn0oIwMY`0z{gjbL;JfAEJ9xUnr}G6ZmHN5KGoRCRlCYM=rr9~1N9g8l-d3MEX}
znBDq&=;FFY&WDTf-0fi7-33dn=}4}Il9(ZJ%FY(2nX+~yrF&Ge17{CwO;~fkacJj4
zKQpG3>`I!2Bl<`$cM9yEcpkkW*(i&)6Y%;(%Rf{#==+>#Y1!Lj6*iTj$*hWY@AOf0
zYZ%wNj#LvB0LNg|94|%Q+21-|cZq>LdY!9oYM~u*{5>AEuxMXj^Ma8z!d5fuaxhFE
z=BZQX$c4)Kx$sl1d+TC-OI7x9SbS?jWIKa-aOj!~c|8v|`fu-=l$%&OE{nbKHf+e`
zZQLzM<7Rtqa#C(#J5YDX<m@Ue=KJzzS;d4M#T|=k8a@y5BJS*r?fx`+Z!#J!m`UzV
z;AiMIlbNC~b#Ex-<W&y;eixYO1l>;mU?=ZZ?XQX1aSF1%{#?iVklbB&GL8d2jtchO
znE0I$_YDWt^?n9rms58dds;&d)|<o~qp)pa%w9|j4N1-%Jpho>Sq@fuphOc0`+|QE
zQ7VX3kQ7o{S{a2uqy3A#%E=m)ToCmbqCmGRvV{Xck|rzvefA>xTUmVaz!SOX%_aBH
z5qbUVyD5R>(fxHjP+Z#X_xU2#JrRbqlrlN8P;L0YplONjcM>O|7|2MUpO0BlrpK^4
zFt4mwy*}^hCxy-Q+cx)tcGbgb$Uk`tAwF(GD#WyLr|=ZGGxdl<)R9|B+bw@B-Gt~6
zSu+eGY~*UCkV{FxYqw$DxEXYnhyj0Hv>K-#opmq{Dt^(eH*+eNB7K2R;p$1~2<xrU
z-E>Cj@_2-P9F}dK-y0a%d%+$;DVLDLee~n=(c7aq2A$iCr|zDkwm#SnW4$m=x=!~c
z1v?MmL(Vhn+~(LZIOCxu<c=hEFL|un#$25*5#h8H?UOr*0NbaGH+%&R0VVQuwZ<{u
zmpr23Q|O)t<yBmkpuO_d;2tUWuNgdVKQ$oqo2;5)>|vF$S2;bdEu_|NSr&U?(vCzD
zxYWlr@CXUD<OT~q-p?3JYoVJ1Zk$-mN5em-vUOfjyYZ27k_sqEyqvMcM8!`T`YGRZ
z6eWC}6(L|%QJb5c*G9bIaBUoH?62=<EsTSU5Goi^Tg=mf)jF|@5sh5T6DFRCneKlP
zTosE>@P@_toL7Z=yZsVRbeo!7TY94mN}NB)t9@;B9lojFDdy}(9`i?mhsI6yj9P;7
zKe?ksvi+ffoQO)6KX?}T1F{==C1dWU1#%>N>SgxgQZisyrS8DyH9rS-DzDfEeF|dg
zwtr10Uao3qJHILlQibaM<CBs6*4~W3_0!|fg$Uocu=7xf6El&`g3o7al`jjqDT`>f
zU5+(ah`riVbZxjN$1UcJx>)Pw!g6a0-_<Zg*!AhgN%)2p-Nh!xZzu*@P#n!+m;D-Z
zmdp{gqB6yRt;TC{TfunSbD`W2o!j^(ehlg~(J=DM;K$1quE>!Gn>-7M8Io&rG_wW%
zh|G%;Q2~MU2fL5I^v6)^^MYEFUEH#G$=IX}Kb{l|C}`?+Cw=|-Sw<6lr<8-L9koWA
zdg`EFp{I0oZg<Xj0r@I<)55x)<21FOYn*jekb;9e7o2-w^GQFrBMwz*Ib%#+@<Rh3
zhFzHT2onVb$czFqJ-j6{Q@oP=5n?uopo*>^@e0$B<Je{4sJmf3XU3FJpzg~RbpN5S
zvI}tP=3RPVe8uxXBl`++8$zQl+eb%gx<GuFW~-NJDn$3JkVn)VfuRN(`r*sBe}NH}
z4r!<uo_--$yt;FY?`;Y{=3AM1#9vkMMQ3T;FSJ#rwhDH>Jiz$;0tx0vldOI?Q+Ilv
zT1I2G!Jf`-jCXq9bq)z%$BC-Htp_e(43&E&VF17Gk7rl0>9w6Wli?DA^g$Ll57lkC
z_zurd*2e(K<@|eCLzU<aL>SDY)!-Pb$6hJKb+ltT#;-%Ka3l3!RsP89fTE2GHJ6^D
zKJ&}3mlqBeX`B2gT|#&G%V7{(DFvw<9)v*qKG}{(_*euuevwDpkD|WysnUs-wJIxc
zwGn{8u#{R(!DZ8SyXJ<J<IL0jiLNA3sEAilOg@+1RV-J+Kqcu<-s+wqG&Krv+z7T0
z+mjcH2DTZRP3D>h%h}`a5eF^gXh_F-Q;olkU9P!Icap$9uuulpqr+=Pc6xt9a0d^E
zKz9hBBcOArBpJm?sKu}p89rL?Ak2B1;QHv=CEp##&3paj(f!z=_v~FYXg4IBs$db>
z7L80&pUyWX+cyd>9d^V~6?aJa!p)p?Kq?9slVxi8Jy9)^bVbNfeA!lLGzXf#>^RBh
zOlTw580A!Anq5D|YX(qD8ue5h3UL51`O7+NEkLJD;>w?1@lym_w)Ge);TTtFJD9|K
zMA+Uk$-s0tz~^IDEBofg@|yuqefZ0w&RSAH3>**rICIB9fcBB1Q6#zqfq~UTp0c~y
z;I3&B&7LJz(i9YydiVoJhQ|A_-=fBUW*z>a8-H{TrZ)=q7nT0aH2>l)e<Y9p71@)K
z7Sd2q`9t<N{wK1>$U@A{&h?w{{WoNfk>fwe-tXeS$sQxi|B~#z@xK2gdyH?y@Ly!l
z*w)I{1}Fp+`HQrfywNt(Kg7-EFUscnKM}USsMbHb{k!=8ny&p}<$tGZs-6mObggqC
zxP1Z3GSxaK)pKE<9M=-oT8mVQEi9TzGB<1h`2*c3?a-&J>JNxWu4{vQkAAv@k9JGC
z8?;6$TX4k~>c~d*QIS#J$;pR(`4;6CvvLpg&&kWJY?L@@hx!?h3%BEEUi(iI_s<g)
zpMz*1q~cf>_DrnxlCn}W(vmV!I%5X*;%eNLjpW0Y?KVXp`aXRQ-Jg0gmSlpa&kCM4
zMI(*VNmP!}tza!4ZA`K(fUCojnn|J?jxklGodr2)CbFs*(yOYB)c52Fx8!K)6;9&%
z(2bWC$L#f!u}<>_i|14-COlDDxHuOm6{!{%G|y20oH2xu9c$rLFXOEG*&7N~wADU*
zm>>@$LWb-s>jM~3)c9$Ll~b}K-}m7fkzFv?q-e;QpgDdXgy4q|d&iaZD<(@eR<@Z^
zi!_{^obneXgCw2&mvFXOm5(Cr?pZosjxN*BG*t5_U3m`tH(p_)w^VA<V|r<Iu&G_9
zYzy1d!z;rNk(UEX*{Uj&_VC;}&{0B7k$WZdh%-V5erghRc@*K86l9%u)@}98U{(fF
zikSYHii+(~ER)c@=|0G{u<!~$<c)o;6awPTPeiRSsMe?i9<B*=u*24Nqy}w8YtHht
z<1()TU5H>%Jmkg?bD&%VD@3R_>C4)2zf792q~S4sZjHNeVl_W~$FZnPsvBh!QpDOw
zst|}eB7_yq2}f^g%caFi^Km`As6?$ISX_Yzp_@S>4e4gu6Yr^^Wk46|{-U(IhAgj0
z<cq@h&h@1CMDb8Vqlzl182vus6H*~*{9QA8bUtDo5u2xB7xe?87;Nh;`v{n~ihu|%
z3F4I#Y~<og#ydZ&sD9@JvHMx7yiV`iRI_nBc=i`yeoRxlf(3l;P~s;cR0h%|Rg{*9
zQ>kBb3R-KRUoD;)p;hJltxi4<q)(i3_rI1}&0UCcmvz%;Ot!vxz?F@RmC?WFHaq0h
z3iENYHhDTo<`?MUH!y+k^FbAyd%h?F?<HmBtdY5l5#|F~Fmxot{)&go>K}f~8j*TD
zmIqH-9Y1yejQ=9PoNZa7FIrp_D3Og<Cs(jgu>3SiJ38i(UFLHjfj4O?>Uu8nTzaBg
z-UL-{kPQif<kl<Qrc!c8^&y%G5=GnTgNq|J`(eEK4GK*;S@C?LOya9BKrdv*j+SA7
zf*L^}P)|6*Hm5nv5`4jiOvBZ&97Q_o1&1<d%Wgn*M~pw={?t0b%^1a$M>CYTNiBP&
z8|A4bkXt|tCG3h7wl^&hmz)8MGdr@Q^@5BpGwT99Gq}_9!!=w2<GI*kJG2$$#Jqu_
zQ`yz1ULYy;Pc=jp_+HMZ@Ww|9oB9nT=;&?`_DIb(gg@4O#*}jacbr@OrGuxRm+f8r
zC}}-sqe4I*Z{d{81vJ$}`mYE2LiPdkGA932wcs!O`a`{)4eipIw-NMLIK0o0bDnp5
z3zpcZ^^<VD)xgS-V<_w|jx=9yd`o%^MPa!zg(BlR319DAZ8*%FS+ZG5STkf_qQX31
zyDt@%Y6&z8Wa&aBnF>2q(|)8HdkSex_FwU%Mr99>k^YjSyW0HX!p5jJdP-SV@HDCR
zD3@I$+2P~;u$H>ccO3i>Mqzc%F6vaB@zsL8kWbzIu+YEeq00thdC0zjPEQc$SVy{U
z?bO0lOY3=!-kN0BaE^M?HzM<SyV^nD8(Mow{pVNrOCGg{4c_rb@zbZg-9raxV-5~S
zxoqw3=A`Ekob74v*=XsVPcE#C_`*iK&mX4aUj;+}WQ<V8@X=p`hLG~YV8azGy{452
zr4=iMth5zUUmWptZ%Oz?55cI2J)R~P+4j;6!5co_OKT?b{xUPnLPq1Og9OYxPN8uG
z8HOupSt+41IaxY;1gc@px{7fJ>cVG+FTjQ1U-L3I#rF)Hgltb@0If1Ac46?)l#z}>
z@Pm7o<hZzK{grUiEUZ3bn@w=VT5@-SKy!C9FUXsv8{D8o^V*Zf6wK|+9jYmsw3VM=
z>HuGu_dO%C%O=?<$h4CK7i8}m&zD*8<@CbjlG_8E(~)9v!AhVA5`<*&x!#@3-w>E%
zX3DtC@dQ(?Z8)$#p5?^ubZ*D)=`y6@De-PNwY1sq>%g$%f)_I&w|MAQ@4Ktud+Q$@
zkpGP7qTr<CX*n6sZDh{Y9~;%JJMpXNU)f#yk!SnEg2^#G5ka35j~D*eVQde4qk?%K
zU^`@_p&(>INC^0>fkl9G%7bNyAN;rrE*P5Eadccv673;oQ4S1Y0Us;08Fp+AzOPF9
zg+y>JK8VO%bQAdvk^4ZxCC{LtORU=x4Jh4FQv5wo<t%ZXo@#WEc=w8jV~Y2e+e4B3
zF6Jq9i3vd(1u{et(CgR9)Sg^6(rQ`nk-h(U=%k9(3HApwJf2`gs6(K$9k}y4@n#4N
zXh4aaufaccIhDJCTLlX-7@QBjBmP|9Rm$1_GYAa-P;icriNUhq&SL6ttR6z-`b&v_
zBMwXMIt~l$)(_cy;PQV1V*UwOm^itZ|9P4-{p~pae?&1tk}?YFGJjAE<G)c1{hR*&
zraUvgY0QjoIOhLCw0=V?|GjAaTh9JZ9K-U4dH#iCOih8N7C?}jv6Z1U(B9eB31nhq
z^$+R#ztywttehSH61C0U?aV<o|J1e}tqdK_|5M?1GIs#Ip`zb9x2c5-2<T|x26P0u
zynXXWcz-kV4-6&zhN47)VnA`A1W*zv^(KW&17(1+Z-TfyPywg}R0gU5)qv{%fwav2
zU@glxncNC!{g+g3|1YuJ1?c))Fb8`4r)2);O6hNs`QPp={*NW|w;;V;!~7kCX~JqK
zFEsKa4|8crY|&)jh-zz_eW1;)Q0sOV?bl3jk8w}H=|PsPjbr>Sf@=EyJt?QczGZ`!
z&D^JoMa#1O%|@-V3Rj|*<|<nv!IeiF+aHhXo;#0s9psNY$In&1&qw-4$qIooG-zn?
zhAw6E)~g*h%hT6s6=twRU-k!6&$ngnIYdu29wXYQmdY(w)1>y=mZ;G=-na9_p{694
zYqWl{P_T14;J3{>zlcwg!?A5Q@IP^DefNFR`?S)3d!aSt(GBWbNIb{OHbLO(t$T>X
zcYNFZGXbAEJF&&P@l3<aoJT&s2b&gFYGO{(RTihG2V$h}lY-%K^x9@v1P2}K{FFn+
zz0(Hrp&$}HyrfW%DwwOKHfFD^?NXQ@^kuh?6`y~(t~IjLc3HQMr(G2yG-U7_zI;hJ
zYv&pDxJe&&ENU}dHet?B0c02B%%;sUjQDGbkLR!Fx+vq7?9R5%idv#I1f+_!%UTzz
zDb3IFB#<?Pr;1wVs3|)Z56`MuBCsW;3R~yRE3wb2Sn@PPrHY?q&nw>~(6ePMOIc@s
zRk|u!D3Kfq!2M`rB88AAL-WCslPv&OIx=5eaW5eVR~DgA!!m3b*^;X}Ew_YkRyST!
zIku$LqKaC`$#Jqr2y2`@Ipa<KBgz(YdiNZ(G~mU$Xll2Myc?sh$AXx__Un-Gq#79V
zo$zHXtRCf7qLRSfBjKJp_};{^pieK3bJ>Ws`mFBN?YX>POS%S>Hm6fIV;mCA#r+kp
z)zxbE8_xFE=qubJJlCs8dfNnhk!J1^jh_sBeEj$7@z>fMh-XaTWDW}#=~FxI91n#b
z`+f-DTNP{ExbPANCxO)o9_NqQBwSwq0;7J2`otREj#1Zzz-xeVXO8pw@u5(BkN%`0
zzdf-Q=^LYOhYW8URm#&(IkHYIv-f;1q%Y%{&Q@AE%siMzLL~ALgQx93G{w*CqE||d
zo(=)mhO#W!n+df-{n&>YIjVD7&Y4<dd?9pW$YJu^I6s{t@uw@^<C7#`6{R((ZxZ8&
z7?-+G7=I}wAm-PeA2I;X8YE>|1%;6H_4=|A*c+0&uqAkpOJK`xd_oa`cCMRCk}H+=
zTcyy!DF%d^+f9oW4-<YVjl+fsCQoFhzaS{D?ISgj{H|;&7^3P7m*6PQE!v=k1Kzz+
zi8vVp#~<WCeJP~uDN8qly5+qKi=rK%Rvyd>6I#q{EFJ~+G5Ke4-1$&gkYD@BIu%1h
z29Nr1tgh_L#CtN^c|t?RvzGc(z-5~eiG^t40aL{FFFl-cQfMostl3#XHlZCqzad&2
z{KQ=6U-Aq5EnYOfN2Z8_uW5-Z!#FC}@DBN#4A{?U+tS|7X<dZrIsx-6aYq6(ZUJLs
zSskhIEz;ai>haqoMIhDU3q$Ed*j1qwqHyFreX}+6%Xg9n!Xu=g%A5<Xv*>M}-$i?1
zDZ7yqKKGjRWiug|o9pSJQpY78I#6J7I?Co^F|O?4i?a{ixI7-NO4FWEUOwjP<Pm=1
zqYTn+@Y+=;B|l5)p~ORnAcF#4R-xZ2O9(*+&h&Nk;xDiYli{ng!-l575U?qAXv&h^
z3&^mbF~?tZ(Gt~j;oM8kv5YCLdCKy3aoI=Qu$WU+bqYoVFojGJQD3DMcu}mC4|fi$
z;$D#2!}!s%;X+^QRg(*GHaU|SniqjJ;Ereg5ZWhN5om}xr%vDi#fIC=nz-7T=ik}S
zv{`?0T{4ROCB*#r?P&ybm)?APYW>8$@ae(wHnDzZKWUbTN?h%>_0`3;8-b2CrgE@J
zgSS+`SAlI=@^zBmajy0RjuKH2N%hG*5cWJ!><RnDnw^7)HKrTAP>?mWDgv}PQ2sIf
zy1WfC<$YkE(dr}*ohH;r$-40GlnJ7)eFa0^bSmjzLXTYs;Jcl|+&HUZR4?k_g?W$8
z!rTOQMsug)^)?LMW>u_&9a5hyaB;tcJl{b`apDJLXkgjRLleRAy~oN)5p*lOlpL=?
zd?w+1A4*oLTdHe-<`%$V6=@f>c!d8AE!hWk6dvWIEfLJUAuZlB(N#-w>n_%8X^u5D
z!PYcCsmO#V=~7_IZR<mip|6%h8`ork$B_o_&NxkSe;ieO?A_%QID)EDK2eaaMO@5B
zO_{FKb`*wcthTaV#E^QL2_d|CbB0-hIXooxOn*xAXqMCQXc9?L7H=h%uIm3m+&czI
zqGoH`U0tr~vTfV8ZFgB+wr$(CZQC}wY}>B4X3y-IJ?G4e6W@>TU#=%2BQrAYd@|O$
z*L@{$13uysLz)z|Y)Kv%I?mHlNElxcxv~=JJbAF5>)2<!NrAml>KB3Hu;`Jyaa>BV
ztk#Fj_so{eE4|Vu@=y@SU9l~`a|^PKk=xgl6SPRj<Wesc*Vf{L1#U1CP0%Fsw&y-K
z6OAiuS$;UNph!RuqG@ij%w;IVL?-~N8Y<IIvzj9{sA2}h;1x&=E)MiJIDIrpNj}+A
z#WiF#I4#CiB;XMtdq5*jbFgHq@wSt_yc8#Cs5covh1LoVaQj4XA%=6=!!-GAB}MUG
zWWXLpJ>t6YsWf&K2l)7Xm|Zm*cH`RO<hsHVGG)Y)AG-Z`B40|)xkeXmyX$!oNw83C
z3C|W^*v||C{DRn_3_!lNL@KAmhnM#FRKOF3RMTRgxcB7yuvz|>gm9pv7!RDwSPt+U
zIZCr>-;bb*DDcB%Cz9Ateb3C$UyN_0@Ck<nzh+|-ZV(IRjdPg@d!((aV64EOVA*q0
z<W7H6GVY(20(Nsw_33i~5uv&38VEW}y^#ZG9UkUl%iKi^Q9Gma*+6N97;m*KL$&3m
zI3uh3EM}Yhf?gThwz_IMW8^&0Q1pkG=Ez!a3EEH(w6j6;?0e7z;C-tw_vUhP8Bvf^
zn9_TIfk-Vur4qzU4QI}saHgys3@dQH;~A`b54hIp`pJpp^<4#Dnwq1XZYeNcm@?G%
zY6A(a-DQr$1Ds$!_d`~yB6J=cO@ZJ3lfrXP2)XKw!T;F~uKtjcVPtm&s7c~7YG6D~
z;ri5he%A@suHoD|gRfNRgEEuXPupHrP?f)3yBdM^0izXswo0?(_BrX?t_j>$e_h)l
z{MW@28%Uf+2Fzv1G=wL9SidkQD&3A1&)ZdSBdUB@OaI*w5SU@F1islxs6zskR>W%J
z)GD)2-yQ#_#?!%AM`I}mV}msq`xdO++IxLQcJp4gLvO@%kEy*FFH(jxHGj+zL>O|&
zjI5x?{oTl()is9v+m6%AvwVMAeO6qpC#)s!oE3g0ZvkcL(NMES_(8Y7rZlhVO!}s!
zV^1(T4A_IAN<y)*dzJ_I07KvTH9Y=zWx$uRHW{AD$25`(e#0C+jFeBsN%Vry*Mv-@
zJT%$50w9SLavRuC+S86JQ@0lt#;0^=h&cP4TqwoMNfak4LXnwRYUByRm5q0yMi51G
z>6}nWe^_Es9AnZl@?XEMs_beWwf5ns#4Pa@&?UU)1m3g!MkuN^fLGi<P9cDh4y?&<
zKx(^Y>__=;oDf43tL?T;gd$pVn#EHUWaZqzlHF*@I92yiP{^gke!$p*8redxqR$tS
zf*#ByP_Ss|Y4B6zPk^Q}jEUxq09A-5W)k}e5*O0e5LR)v<ucav5X`Dw9E`Rwx0(`o
zr?lt|fKGx;mA=pVH~-SU(k0~D(mpZ?w-3Iy18_1rhS8X|X51@^)0Da<ahkVXHD&1m
z+2Q?(t8|`Jvk3+j4S-a@4kC6{b;dy<oyqN3y&tUnQu9QO4#cdHbe@hcDCeO|7@`*h
zhjkjZlSqD-xFz6*T-!19!36D3teG#_&;$63Sm$|mE~i>7RMF}9@>XkbiFw2c-Po@d
zWQRjBypTUZAN)YnT?|%9u<FNKyRBU@*eC2jtQT^u<(^MtP2k;XO?CY5?cL7d#n&|!
zx%6Dwgcu;n@A<+KHAGl|CC@3Q4lZm(Gv0;eZ^5T>37N&D9%nROTv)PMs<`(SSHm_F
zx`ZrPw<<`PICF~YjwmTc>aS+34z|=i8D#$Bw#QNRvKX`R(aGIpvvIL=NSO_mup&?F
zYjz2FGGek){`GkI${$P42MLB}WevodzWRvQZnDI$Zehldlh8FA;SlenADRQ_RPUd*
z@dhZH;gFHE(YzVV*$Vwk>q6uPjZe>y3&^pkh>=>=#omDsq_n?o86C0#54h3eBR93+
z9<VbhJyN^5E6-ZNG{+xR-<UG{x4YhazA>6r-M2KGdBkABev229kj7R2`Tcyl{xX~8
zsgGP0@WLX~V#9d<zS}-wqjJL6U7jaSK}r6ZKI=$!8JLV@7l+8*1kJ-mWjE2b)?;Qk
zFQ1p>RJJ(AYxS4(=y1Db7f4V2T30`^FsAJkC^3p{Xu)u%<;3t?Jfa)T0<z(^=046V
z;s|L#4{eIu*vbMTEN9q6LePqyw$vAhyU9UFFE5=4lH=yhCF6L(&(4omCUY)^l=)96
zXY9-fO|gp9u*2+$rLOXiCvV*8lFd<3sEm98K4C^}<C_U2#zJxbGoTR9vEWVqQ~rTc
zV1V7Cd<MA9Eq3%M=lEs!iiZ`$i=Rixsf-(1Wm|k?$25|vcxl1>Il46CtJ;(#oo8_B
zlU6#{&OXRl2cscZs9GRxd>+CIVwg$_Uezi^#*N}cJVsZbzXN4GqP+yIMXT}pRW%B%
zP=9F#52YxXK`-DX%@`*&#Vl)!OgT#+M=@8@Jg@>DR#axTEC+0`Y(2Zxu{L1tJp+b|
zxV>zNDwV)1uw_jEI9OWLfn(yYvLPH~HC{p_9u#FswxjonVlU(`7A?9S3)}?H=p~;2
zG{tCUy?tV~oI@KhRH`GV0Y;>`ohhNgsar^WGl!m6x7an=?Ht=!C&U5udIn12*7R6a
zCONkf=Ap|4^q{&Zv4q>~<Ix9Y2ds(eja=4{QN4M!L?+o%Aocl}WBSzG<{vmhr2e>N
z>av?PIzP~SpU^?%c|bOk$_uG7XC$K!9*py(z@#{8X;WEQEp$rXnPvgpwD-|#M3gB&
z>7itN&m(Banzwm($hzw$+Pu;A@b?ZX^3)O_y@tGjC#BPDzA~!JM%+E_7-2S>>&>C{
zr<j~Z;)7Das(^$Djr{TZLvFeSBkQMUx0tJ&5p*eJ*^eJTAR&L0|0pXfD@VM*PuA{j
z0d_T5()+GNT7<D5EzenJ46qv3FURW3NG~*8*bFD-M~_eCBJROHjGK;!dg1rP!sg^<
zllFjyNl<k-EqrBDwCSG<$PX$KpI=N#kR>Y57Cjc`5mqhL6?%z*vSzgbyFkSc$1mCN
z+|+D}rv)ii&#9xU-ClaEvEt)QW&qg&i-+7KN~pfAtWC*(6cGBM3L8f}cdH*9bhs<@
z_R~ITqJorbt;Caw8qAL?6}9K7srW`L3nu?lDybvFj`A9J9+!sjrn08gGJqZ*8-QHI
z@X2b|S0WmZ=1v5Gu68_hDIbX+&tT7J4@y<wJGN#Je{ic)=ro>UZz-dRT6RFV8On_<
zb%y!UQ2-YZIXrH#z1}I)buad)k_)}4_wZAHydoz6Ow(T9G0*&m@DBA!Ha2t#G?}*P
zr`^lV?=*xJEW8zRa$>H~@=_(Q@)-fF`H~ZVB`sKh%%Xtz6nBa++H?`Wr*|M!Mlh)s
z3V!1mgNOBu$kjcH?RFNY((KMwHc=GB8k&vY7pVe|b*Cy;dlCz5Kv94{x?(ITd?kS3
zjSGrK!GG#PJI7Wt&dK2Rh^$Oy0xSop%~TbqQE})}n!`t8^65l*^DdW#z(=l?(+kEq
z*~%6YjrX=B#>ok|`h+H<m8B|A$7leRI+FI`e*69^XXOKLsKsB%$%D%=3R0vdEz(;5
zJ!j0brISbexLWF*s+<P^IP^P@LFA`p3R;yETyFlzDCG+rlLmJm6&n3EK^gz_gGi;e
zshi|WUt_y5)T`ANPeq9@`K(!EJ9!6xnq@E@K99%5I}Fr;wcVqDf!n@oLI9z1;Du+8
zQS(x><F~vn)w_hdJXsM}h2ozFX`YO60@92neia*3*cBWSj(~MK0dptcG$kD@QYu?<
zD{P|F)#vOvy8x1R4>^q_Iz*4-&t)l9${|&2Y3w;z87{e?JLX-^WJTDLLJ#WVj*cZB
z&)4@C?RU&yvFdTd2=vf$E>m#*^_q%@{JSQQ8|LRdi2ZxDk1HYYrY&dv!E#s&W`lTH
z^GWx_*|b*MHsLvL&|T!TA?7pu$iG)M=>d!Nt#9RCBUe5tCMUb(Hg9NC*5%P71;|3A
zj*sIPcC}#~^#!xb>{+PQL;T*~OXq%0SQ!-!B7GCZcj+@)7I7B9kv9wwpzkLpg4=M~
zQAj*m`IIY3nhoYF{Kd3rOms-ho2%pvDhQ!mY&E$I1p0aqey6;g1!uk26wid<&rd~Y
zj<4Z$wRJses&A)Z6ZB0vm_8e(+#(fd`^eQ$`g?yY6-oZc5>4&TJAK=)FTof@XqcUY
z$Ei|TLQOSJ`h3rKm?~fOh3zXqBdQEc-s5_g$HIuwcizt8Mbw1_Lb26^gzriC^(6ta
zKLT3^!@MePhhrKp#$%8MW8XxjBO#H6%kEF27(r&`8cR=JWne47s}NwD5I}T383WGB
zxTHR{{f0kJhvl#8=rXS#&u$(&(X}_8Xm-awR><bA5nc;rH8YCezM2D8^<EhLnFX)e
zUJ<2w^$Z2YxgOD--mq0CPwt2PE&Wj#)%M{5GIr(C0U}D<JaCDHXQB$6jENHeylG7N
zW3}_b^&gg71@>TTZJV2OPGz*Ir9aF<mJmXy34TGtYofA6Gk5uic&6~q7M`tbw=3&T
zVrJi|z;XFDyqnyjBupkDLbu=t<WJ0Nu}E+x$;cX#)&&PHWCfjc)~o#<(nX2*^4Hm>
z1$>%xTZj@LR&+763TI1e`ChG*H@(B_ztil^uj-dbEfOPr9~nLi=dbsksu#SxH@f%w
zweU$MU_hFSoWjj_`eS$}lI^W}H8{6b%x}a>$W8Tb#kVMV<sANWcOvJ!UV0;0+#fii
z`6ZiHA||C&-WOjAJ*Az(7Kv`etv2J1Or40-N6a@~m5f_jL_l1wQ8+E3XFsVv{TV`<
zZy_`N2%aVa^vr;;%NvH(za`McIp7QrZ^NDaK%a^Y{W>h7Kq(=CPO0;nyTr}BQj&-$
z$mM}67A$u};{MkNWE=@deLpTg!&BQ?Ky@B9_e>8SUO~@9Yi>K`4m*=+13D^Hf6;3J
zwPur6YO<(ffsQ=G9K-FUyHB9?uhrAfw6T}zoz3#*+b!7ywlxuKn5DI*=sSFgJ0uOU
zJW9seX9L4F_bi_<yP%Gb1e?Ivm$gO6Nu0@{yld6*9oUjRlyZUbS`pE^_03_2*x#G_
zGvZZPZ3Jw0=$$>4e%_EbJ4et@u~(&K+sE&*`qdl52`)X*v$JP`8FU)}&~CwE7_bx1
zuJ(7Z?1c<`89{<?KM?zJL2TsMj_l=NX$GK*<$eO~$Hc%QO>GOWi4KYI84$+klHp(W
zU&9v6@wv=gVoRVZ*au%&GAD1I2%cg?C|?7$3ZzEs{|2{||9Nf96oE3c%*m!K^wBLY
zwhRXoz6Xu%JKoQ;#&sv=VJF`lX{Rvihnsj^Ax&CUOj`2kEYY?u`L+UW-m81fGm-Rh
z1bswI)z3TS<yz;R?s6mmhcn)#V;2xxX>8q!3Il4W>&k{e{xD$KZ*MALOM`@LVC)dX
zKZ)y9L+Oae9CFn#sP9pOxIrwr?skTXIk77}Ypv|Yd?+a_G_y{S^<&<#y&=kc6Rxm=
zQg^{r>1`z&YEoLhB|V+CBMKF`$rA6yRyFNaf;s`wV1KW}yid!$;BeQT_=?}Z@oroP
z!*7hA-#5>rWpQKugw;VDKy}}TSwVBOen;)B>&4W^l8XRrLE0aOZ$YG2Mpe`jU&9lo
zt%&>mTRc4qk42Z``^`f^8kZx-lXW2LLlxDK3?Ip@^+StV+(um*TE*|xi~fC*Mt|j)
z&Qdpp?1<exI)u!M7qk=)r^CyM+Puv3pYhzxR_Ay|u@o8@b8uHVUKWZX-^_K+63w-B
z>h9t=4l$^`=I}6$-xni>w>hu94Dl6%Fqdze%@N*jlHW-<-$6xCRlR*d7O(m~9pElr
z{4#x2bSgejM80EN;q5HlvDT#YJNX2T$V?^-6p;{-vA#8ZR?A4>u4m7RC#I!q$HycU
zodZrx>;Gm6nrtE1(VTWb?v#9;J-p@Gq#?Bd2Cas%Njq-Bw}5Mhk)SVMMaJ>GbltOI
z1=K!@a$mA0s)MwoTgK2f=F-tux_hjJyn^Kp9GgzDE5z(@Bxr&_&tYhFx6LG=40P!K
zRUTgvk=DtkLjz_iE?+$0>~B4{V+VI~gf^k<OPsFJ<p})*zONzTd7{WPC$YjWl*@ET
zf*R{)9o&9#j|R`Pq8_t}4~DfS$n*I|Kt{?#a0rTzKlET;%u0p3z(z*RWXN=V@I#Bp
z^BQx4e=UIFY91n_qN~5JCS|>?4ok+nvA!g`g1vQxL<pQ5SmpXSCGobKll5)G_tA-Z
ztyU|vNk=>7ij-_Tv}nLXuuYh9x*vjZZ%77gdpg@?YWfuhg{LW62Lel&r>@CtQk!Ua
zE%SD!-U*q5@_|Wk0nH(>6+s$y2rbG9nHg}-k-3*$u7#{$4ZYee3turI7eb+sKa^Yv
zSS&nWg?KDb{v!Cvacq>#c`cOJIEknL=T$UqHXMX?m=W~!d*9nmhB23Vgyi%UC`{(M
z*3x}q=4n=V`(CdL+zWb9?RPjm@oQ3piy&rzRDj_R+*%QW>0*99h<ZuKR^?2C4tNP>
zTaIcId}KJD8d4k>j<5;pEjXv8J%G4`oQVs-mEb{C7nKY)@~)P%)PTJq^?GlieY*gW
zFvm5|96Bx`Oec=?3o}Vjqq@h;*;tW5u{TTj+45zB0NULi6xYX;oYJKl{&2)MojR`-
z_F57*D-m_%R)b&5$OZ@A!prWdK;fKRn$n~{v8g=hpD{B5ml3Y?Xxe{7^&f!0BZ+3l
zWF|O$G7vr|bA(7jMuT-COCF7SLK+LE^z!1kIB>U;>@<M^60C?SCc!y*E!*6|7{5$#
zgJQC<yA>AM_)tZr^mI!OjXO$;eTu+`w|}Gseak;<*NH)Ue{y^+8ZyiC4pS0@h$#Ds
zr5-1#zHA_BKr019;?lb8Z6+?K(}~)KG(Cu?qO}|Nqjmub%X}D%{Vvq<h&J>^Cemc@
z?7thLe>h@)TV-NqWn=lLA^Kk<cmKP!E)ij6c{!OcLzG|j-$FdBUxp|x-B--zD~iNI
z`=3%gwEv#s`CIvy#jgKtiihRDEq1Xm{lyUF`?4YbZbJUueEh5J_;=IsUxwqK*_<!C
z@!yTc{}Sb*`&<1#UH1A)F#WsHn4xT@sGx$}i5Kn0XHY(=R2~adrWdB{UY={=;R7Nh
z*A1!~N(lCS-^3X#*Bcdogjn=@=nV)QoE|`c=m36#c+twWTv?gf{EVT)QQzVs@}nVi
zT{?ofMbe}?gV~~(=iWv}-Q&mPqsMD7ss@HIAw1hNDKijAxy|FlEkq{M>Px>;GA=yv
z3K;c{I6V6dv&;16MSp(`hDhE8(cLG)B=$hC5dJ_Z>}7xc4+lv_`%w4P$Fdu>+e5d}
zq<)c7edaRwJ<rnkqhV(yh<7*=?X+e#VtS%ohv(R4R+sF1oRORE;XP3Yb%Xx7`i+ol
zu@bTv(-v(#!F+Zf-Q*AncxDn|LZQlQ6%n%7JU|7##G*>k+jZokP#74!WU+B{BeLBo
zO8xJsz`H%;dW-a9Xe>rpb-pQm<;LzQDk)IoW|FYGlRylf;V5;f*G30))b+-Li6cfA
zVeUdA=IIvp%w53*{WvS^s~Zh&V;7AEE%{j)J%x3fHeoHAYnrbv4_<cGwxp=r%(=rh
zrL?`rA*{S4ppdSrK%1s9)h5>5RVDLCL|=1ibtw=sRM)fe5g<*yPIfPt{O?IQ@tDl+
z-y^2KY4c`8)>W6lf``09N_6Wiulng{)Ck*VIxkPiil;)sWJ9HHlN1;E%&FO`4DZDd
zoI4s6^_xsXQ~LU;*`o<HgA3_xgFRet24)d6Z+Omx>F2xF$3z3SoyVUQ5eG-dP(ToA
z7&k+R9J!{d`_NI+v$#^%FA~zk#s;DQs*>RGR0*Lj;eWRm#Ic8kocT4CbkJQX*}<(r
zv5-$fl?9Gz1Dw9`Tg7|VI=w`uXyNppy@Qg6#|*TXZK3A;p2-4KdL6&qhD(l;08@9Q
z-^w@_W73p=lF-3bkAWj7$3=@7=8#NCq-NSXgi|{C88AhN^RSbDFxKXs!5Z0h;~hXm
zBE$#i%78Nay+YwiS1GLgLD0AWm^&~rKeYdZ6wDXa5_?*(J$@(NxR7J_<zjmx0+HOE
z^=RNTaEzF_fxKLfFD;qT0Xim5#nTyZD2q$UkeeD(PfoYKuG$lwl^OvkF*xwzwsfIK
zO^(qOaVxoN_N>98ws3=6AFICa3%G+Sf)ERZoUYf{Ys7^~U;(;Ga?$>MN$f;Hrj!Q&
zS`+&dt0?#G-p#<*>#A{iqLzVD?dGgHFf@w?GGKbL$?-lO2lS$j+iOR%&>6H!k=#sX
zV1(2?cY(`=s<{ykg<FWWNt+UASGjW%>|TUvNkC>q5z7n)Xu6bZBbi?q;h6x&UgUAo
zC$ttTI;mu8YBbK`UNZ)npP=x_hQF$OW^r1}y1lTV^!Z&Kk~0u~N3}X8&s}>#JAR#+
zb#xR=r3XcGz|Y}{DQZSAR3Rjl5CLUJI9C*LG=ze9hDbyuJT?~3Hs&!vNh$^>$UWyh
zkoi8TclA6;TB}8U6O?5e!Em>5(OaI!+RudTmYIB>?lc~<J2h(NXW<LESs!-TuWv(J
zWU25N*O*a|L{E!LPS|)1@6ahU7^#(*sIFV3@r>x$0+5<fIWh9f2?I$1pq!Kb&)gK<
zapUoDXb+<4nZeX&k}pcUJUsl;;c&^LX;Q49=LH;gjH`HlkStbJRV*s?PM}!eE*!!+
zD`HGUiP0`oW+&`i`NAvxc&S#@ukjOv^=QVA+E#<*`uNQOBY=Y%dYECI?n{eWq+e{Q
z%=a5{Cw_?sZZ-YqoDQTwcPge}O6qf+m+d~#GE-<n#<KWr6Eu_AD*-s7p1Ys<r^wV{
zt0)_A1gn{ua8PpD<*V{>Dd~qv-+j_QjmK<|I$d7#PPKs<OC<{Mf|PqPP5E`Rsbo`Y
zSF<5PAx9r@wygbQvLKUqp1x6Uc0h(s%gT-?+{eOxgi)yR&CCGAt4+#vSfES_q$H?z
z%-NB?MBL2@%{UFRVeRk*^#H$3bA>v7(yoyDC?EN_S*JG24C?QyJ+$r6(x`!AD~Yu`
z2DL~m&D^>Q`PyY~oZ_O5IH=BCp6C`+?u!UngEP>C1jO{>cS1;V+}KCA3AB>%h~!Pk
zP;Tnwi-(a^0ibb!ixe=M7(%JrZD_H^xbZ`gTjqe~16PrIMUzgHEuxr%QbXM+82B5`
z@hKS5^SU(LSt}XeiO7QQPVGn(uy&f2xo8wnzNv=WymuzNE}aEYU(~tD`swY`H}I)P
zEBz?wUf|WuIAif@co_^s=D5!&xK?I&r+LmZoqE?seib|;u$W*jQmbAFr%IerPHf6K
zZKmV!?^8CB`bDQ55Y-$MXNkab9KFtv`pGGItDQNEsqvdGgO%U*dup9o6Lv&Soe`Vn
z_Bx$$uGO)b&uhuuM^ET_fZDOERH9blI%-lP7zLl5jgyyF)B(Eg_<Vnvi(V9!J<1(r
z`em0iPg1*(814xwv+<&DSg8;T86p8kKPr*rwoPq-<X{7Nh^P8+y~*>M8;cmisVl|)
zNkd%6Qa)EHuA`7U{~CI;stA=9BTZ0_B7Cb?|A?Zko+LKn?fE5>kpIwtpfK}5Jq`;?
zgT#n@tuMRXCeFM=O5`YkwXUkBr*9ilRsYI>eVH_*vU;GJ3t+~8--zGt6F?ZD&*Uy?
z>t3|ZRy<&S>{|CI0OaeM9Yx@oow84cv!8wEQ@RJcK=WpZH(>9HF(6^GX1&S1?||FM
zl=wAABB^InkY@Snfd5cXWsg)?{gxCs^|MFv@+`NYgMF~7KPWQX$}IF1*!edLs#wwt
zjN&6(KT>t_6=*KpM)AghD_Hg;S1>B&95t3|@FU%Nrtem8;BCMp8;XrhPn^>fLh;g|
z+tEPmVEGu;Pz~x4*mo<M^m;N6aM)45Ga5wY?Z<wJeh2DSMz_x#C=ke#n1xzlN7aTN
z2#hs7>0}-=538LBk|Q^-RfWR&LQtxzN}smt#uPim;Uz|@%Qz3I7uu61Wx$~$<bwyi
zfSE{$2@zoKON-183JH}7pm?E$|M+P6Tq6(%zP?M>9>WfY6}~A9<)33S`wiYo>B_qu
z&9ug%VT)e->$jWZ2yqOc{{VAa6jiK222TZha${r6;9X5XTUhPG0rJ7Q1PIm94b#h;
z5Mg%;t*T*!^vv`0kt&$a)Ap})y1Q61{i;Ib!OJ3Xno8_$@k0Q4tyt4{woYV-h(hrT
zmRbmy)}R!0o};lY(%UIA8jP)5WAern`yh4nK$fkar?ANS%?ot#&ViSYFY(QlM9}Io
zN_N71GlQv(<Wl<&@A7sdcqe0P1rNi|wG)&nQV0HUHK4Yu)Lt&Fy9N#BkfdJmjuNJ!
zIgP|9j-$#*ylnF}g7afjSL4ARBx`RyJkcgEox`EWGuxqF9Wa4h@1dZVvVA8}tODjm
zou>$CWE1VX3XSk<c*8VQ{;xPR!MSP1lTC|-)K5_t_u7EVJR4oqpW&|+NjbrX-`;Ed
zDvC>s$*V3lteFq}9ay2)2FZ@-ce!n@y;!)Ie<~yPc5ONo*7|i~02_>lO2H<#3n8Q2
zTvV!F`A}(cm>rk=KEdL&H3Jb*75p@Z&%7!W_q%RPP{Am{{7yF4f%|*3Y_>|L2;1Jx
z)^P7Uhj)jd|F?%(O#g{i5y~~IvjyuB^QtuJ4t+l?u*ZAEg0fb@T6n;5HnwL(%jZt`
zDrALZZaE#=*o=fMTi#>zXfoSdJw)h3YAI{c*(_g`ydHT^wJA6_Qw=gGVnj6iva2%3
z3J!&hy`Wsi?(laJlE7z{7mSd*|IlpwNot^HrDgiF*`WXP@C!chf84&5lUI@#5dTNB
z;Yr8zuMNzv1<wC}`i-yc%YWa0l=x%w@n3t7e}@A6Jzrw{2N>YLHz5BN4nY53@D6{}
z|KkSa51zzdHXSomTz(>|G*&j|l<~^uDahqI`h@DyUVx{DV31al`i6!|u=vi_jw}X`
zb~<KRCU^uH!SStrBd_QI3L!Rv&+BP!mz?iEys?KTF|xlxY}rd{0j6d+pt^PIT7BbN
zsIZ&jI^@`Vjts9k85%aIT~dB2f4ElNIoaOtbR3=UC$o}($>`svw-MyA$#3^H$J9ky
zKezBO?>BP-)$cQFcERoB3XT~w$Q*m)!guT!F=+%IVr_K}cS@(XD@@yMug)f&Kz3-(
zOJXNxC6&Yy_yl*ji&)MD4-LsWVx?i6pAmV%Uzs5xWhWKKKwNgJ6%kyHTu#m=6{!mD
z&MvkN6vIZq=^Pm2!nbZ2ip+l2=s*#)xD9_$L(RL^L~J7`RO~Q1o~-`Hp@x7kNPC)s
zH12MM&+yf0Ak)Sr(~XM{#@QGl(<>y`gwxaoqYaho71B|Un;L;LWS~uz>uwk&(rJZr
z><&umEYgjk!I%!G1p3$L)uv<_bk@GUE8j7UiHvGg7^yO;fA+BVzt|0s3i<9}GzJp=
zOqeiFJ8hJ1%y|cWoI3if$Ov0k<EW2n=wik-z-6d5k6y@Dtoiibe5p9o83w6)Di8u8
zjSDl`;pHwe(B5#_qAV9q0tToCwBOR-Q!LMcg0HJ%xcmLR2JdwQr+VfkTnMg00}Kup
zdIMIBCBt~8Y>17443Cpxgs+XP-wwcl51#N46)Hk#x;G_HN;hXleIgLyWXjUh{a!G^
zmbZyXRZyd@9Ko<z>}DG`bJq*(Df;gA3L>*i?xZHmcU-(qxhCt7Kbx1@rF0p6*N|0o
z38{F-23cmldiduh>!x{VW**^v*Jd{~Y#l>te~#2$qGL0x#l9Zx%9YSabgf2}%&21F
z<yy@zc<X*}>)sJN5X?{kyQyRPd)E$W8UtgJ3m;Nx4+E8ql7i-QVqH6BgehQu0!p;&
zK0?eO1!%maGR&*AgtEDxu4zHYYAR_@g6xHGL05#D?mP?e5bD;r=t?S6Lcske_c3bM
zt*joL)^y}T5!X{47oMx9mOm&4I9;utxH|w!*{;KV23j+VUgPZKM|*NGZ6O{|^z@y&
zbOSSkq{)RkuE8;LPQmBrqB8n}G?8<48=@gf)GfQMY_|~*RIdma7G;~PaX&~RqjAn1
z4@*ey>};sQ7_8RbuY=Gs`nk2c>Fz<T_%WO|&)HKd3Cl)+vCXXMUY8lo)_r+l^a!G_
z_c*Y5_`Q%VM#1Y$QVukGArQqC;?U4{S;jl)sQEcsRHNWHp|kD~Qux;jqll~GavnE(
z$&MUfNifR^g==F;ssLBk%>AOs)BI2LNhm0<z!}d;ql#BRJh!GMzM&gv^@;|js1Gij
zcMRH*N?yg-2N)+W_YW#tT3+RYV=_6S+Ysh?xq@O%)+?n(L3mQS9;j-lR@t+X2jfc^
za6LNT-!z1*9$oNx3s6tbm1+137*FlbciXVSS#3}XQRTiE5;Lsq{W|sxk|CSN*f}ze
z`HUh=Rimpo<kOAi)BXY75UoHE%%WP%j0$~LMyrfQ?p;<xs%KyKi%zK94OSqmB(MUM
zVBUzu0PPNT?7qEEzKfWUK@9n>te1%RM|A0;7-Ritn?h^REmJj%GTTz$<9zOl3!<rs
z0lp2fhS;}Al3lr=%;BAH^;A=|XJTSL1|8Aj#IPGy5R^V9NS)e1P5$WsioMzrRrMKM
zUgvT>WX&MIsw@d_BTAlS1+jqiD|qer7FDNzQ!2$N*0C|pJ#pLYbJ-;1Qa=dJ8+UIH
z7j15<DoVFY1iDp4K>o&0HyUY2VOooOG!1bL9eO@cz%mr^dA&(zK@(2rTBKGgDP83!
zG8jp8GGNTH0-U@6R5|fzX+|b^PQ@%Xlk94&k&<nCL9WVANqLK8K$FD8kr7t0=lZRr
z)e1`Qcv^?R;6F?h*6?8;REHgug@j%nJ_IEqC6y4gS=HFBFiheY=petsGU1i!h>0JW
zoiKY-D{oZW459f8*g}LV#TziBiMQPgYcvezTIzxM=PctZ6OdvhXfI&R?_HF3Jm=lq
za|Q3zgl7lZdJwM~oq9FL`w`8(Jyc@$+v4izk0>M=>i87M2v^NWTN&{a>S<dI=pme9
zOL8t7ca77x5kYK0)`DBk1*IDatF_9RVy14W;sV+<YF%Hk%lt(Njq1E5D{}!7Hs-A&
z&PnAh9Go@R@Ns_)gTiTsoJ-<RkX?mexu;}|qVYXD7&`*kBt7E+VLcI&@WI|#5a>^<
zIV1DdWx!+7a(#W)#6m0R<=YDoRA^le$Tms*kriJEIb@)5IQ1I2isZChM<rK%G->56
z4IM3capy`UxJa@^F0Z1ZO(%H=4TZVdTX2rd>yNl0dDicAi7baZjP-KFghiLW&eYxQ
zWtEdZJ=@nWvp?O?WgNa+0NVnmT$@rjGhxER#Y6<zoV=R_(On1su++0xnUrGdjFfm%
zh%wHI|E}nAkS1}yEhPrbFQ9hbX{+yO<cLgYyAqoL3LUSQYPt(krUbC!TtT1BOzTC}
zQE0nx2Al&7P=T(yH2I{n3{sj}QMf*XrbV~a=i=1@mbBfr>E(VtIT~1uU*L5vp9~^b
zjYbbux|WYz?9VA+qDvR_ZufLN{oDgO?efa(Y`F%OITujZpVehcHbcYeOeFMCZDFi2
z=><>#e>Ei?y|c;d<#C-Qylb_}6?WOOiXxsWs>sV=->vx+t(C>9(}(sj)IM?HF=8#V
zdRF>VD2G<vXD)lP!+&|sVEQQQM29qwoq2SNV(mTQXFbZ{RYG(di2!JcTfExuk>ix#
zaE2Ooq+)?FEI#er5TFCtqlhOA6KJnnswXw1vUYVOevaq0wLx&B;p82<DAwx3k#JyR
z7yfs%KMCTM$Y2yRe|(^lcW?jbRQ881!k@4~;_rr&nmq9>2%v!2Mtt1Yq|M<p=8Kmz
z5gm{FH3;NpcC^0_nJ^({Q~{hev21`wx!nq!5eWU80J|HszJf7@rf+C1Pi_-|#xUw0
zQital_+j(aJ7VH2I&N9p<_9#1k_fXYE;8~A(sU&omb-#B)Y@j~MM8Yhxzt*TjLbY_
z$|-*XTs7h>P2u{~k!Y7VDnkO05@$^hu_^HS!{nV-L6-CfX$uNNRUCXxmk{RKP_Kdw
zYJu+Bz^59#P$ca4F<m;!BF;$ZNlJ?kIE~yLcmaj^EkJ4_EtT&w!k;0rXq?nt_O-iS
z2O2+&Kb^F`GNmR%Hrt}ZBr|S46u!RnC+X!4O(=E9=?X+`d}1q|N|CFCy=eM)`qL^E
z(``>}%?5U>R?!0Ga}&v9Dl+LErDw9QHDP_d0xI1D=%q#m46#Iu@T*>fboG+^sOwaR
zQC2*NsIaBr5bXJEp7ZWU&9UPoVI~CJk1|NV!SCydryiB_la5AbGh+;njiN@ju(eu9
zhJM<hUCL*8poup--nIn6SXto;NR4)=PpfcC@VM5&W6ssxla+`sypYbd=2^{_MP)Js
z3?nmHkcz=dzhaF$!{3rNimFslNt*|IH>8WdV%MY!`wL^H70#=4Z!{l9-(C3S_e5)F
zQ&Nu8RF=Kk?@kDo$VqihFWjS4xd|$ha9X`M&-x-IZn(Bl?=!Z#k!~8w`Ol?W=8eJi
znn<^a0=GmWX(B%)9K!$jt@4B<v*TcU^EmaJTeq*F3$|;Sh}tX1bg|ZsnJSBkrR*Xc
z-pe55P+~_ycS!Sxm%1C0rD}Yj6B6rXL2pegdat*|MEuXo^hDh{d%y0Bl((u~L>t0^
zR;8Gz+I9_AkY)@nr{FSioAsyU&>@~4uWpABzMlgeOKLCdQ&d@Zr$mq@!bfIWALkvk
z%>hQ(pq~}R*|c2<n3U%E)X<ImgijBp$c@F!98?qp5=98Z@bru7itiGqpLf9gCpot%
z?p}UW6y#KumAr2BE~=L33sSDsM9}c@<c*8YK9=S|@V^Q)ey_uVjs*I5sJX>SG#`Q?
z;XFJeEq3^SzRPJpV&C82@@+MF=2^;J^m)6cQ<s3VfrttOLCD-buJe#cclI;SNqMk#
zcGmRF%cp47l*yV*RuuqEdN^?YDy$A5QW&Y95adQ{X`Zy=Hs_KfG6!Cm8g&dHgDEW;
zm4Qt}%l=`?iqA3DwU3Nb%iaCf<ArB;RP|~iHKKBYsUWrfPE~ucWf?d{wxME;)NC7u
zuXqSxqWCg#38}|qc<(oo0^S$gN|Nj!O120?848<00VJnq<3rkdh#dyi^)MARwv^-}
zfQHE1DJD<L!R_Q;sS`LN6!AnIRnlD2Ov`gw8DEaXj%Dsko4jD=m#I+36Wx3K8(YKn
zH+t763qVJPhdZd>u&(|?r{u7$s1{5Oqgqe|Og1q3Hcdy*Mo(p6`8%0>rWUVg;3KT_
z-gHhiE6*jz2%h#ybRcvzd2lplDWhTG>5&YHB+jMp!(v4&xt3_rG_C4-+pZZh2?7qg
zWVnR5s7w|BH2DKV-q*i{LQO+}5=EcQUraH1<FUv%`!AA`^i?d73sqd>?|+Rx$qTq3
z^T|!lfT!wa?CdtP+Fy~ecrHORiIw$PD1ZE}So1K`J(jly=Ao(Jd9<3$t;Hzn`c)a3
zalbj4`*{fRkTsMsNuo*$e%7s0{ccC0p{1s!ro7O3AbCS4Hf`?_HOYEY;bxHk7?^<v
z(Cg{-@vcxrp?=)P#~Vnw0mMC{5g_{sMTS=m+n6a{eBf$q^|pV9RL>yRiU??e#09T%
zt!6MzkT^KmxTUI#(9c9Jpa7qT7rUyC<I(S4UARA9C^G~PoRW?AFj_+saNHG-{^1L`
z+=}T@&0G2YQNbF66|Fdbt|e%DYh#z-Yd&sB)ku0;Ro`G+R$IpwYh@f%i_YQZxBe~g
z8T9&T*XTcV`+t%E8JJoBnYE<<OKk7|-0jQAs`5#Eb^8ixtpDot|JE9_d?CN-Ss4DL
zMSS^x|3CwN9sZRT@kjZmsrcm^{^yA07f+Ff&+#8jK-MolBaM`<^WO=9f3N<^4E*Ed
zpYclz6H5oXfAbFM{{SccE2Q{G{XcHq{~$g7rFGXg(9zY?F)-MJx`PR}zFTyBfQqdD
z22T1BZS;oMcPEh8()MaR@>o#L#TjnbWenlb1pj6^`MJ*P?UNESGr=*+)|FjL%D|N;
z$k(T)&@(+d`?H6RrGb=zjZUVArG}7ziKPZ;ctj3tQf5+;s$^cldi<;SeoU$iCQc<y
zMJ^!)uzHf7r6H>xtDe7=mKCcWKh!<lJ>1<Kt&0W-OGigfZ*u+qwbU!|q}3T$^IF7s
zJLP@3pUZ&aNTaT}qDk?2NUvdG;v_cGdy#VEJ`m=$LZkCa#hBtjvV?GvQRnQ8iuz43
zKt}IBXy{LlCOyNy21b7|WdDy6;un=yQ5E|`LUe!0>;9pkuc;FQ^FN6r|I*Oc;a@fM
zNBMu%5bc+0{;44r*1vhwe`@IO)n7IA$H_l6WM^VwVy<iZ?<)F-0RA~4`}0Hinvng!
zM_vD6WB-#5`A-$u-GD(vUCsYZMU0H!LjGMwCoo2f*w}+an@M0EPH=A*!=LNo-aY|e
zG9qCg`TwjVpXJkk*O5wkN?J;sYX6s<NPC*oYQg}5lTp!9a-TmK?66Uus9l~oHgyLt
zvRcP^6uNleHK&;?N^0_2Ya}YA2G~}rR*N`HI(F4A39fJTTG`?~kQ_oum}F8HS-NCA
zdz~UzF<|VoPBvma7jEsRA3`<PF|%YmJ&2}MTCa-U`5QOCBP_Gnacw2;>d|FQ^|iPl
z!@vLnehY&)Px%i@{8M!dU)Y&{&~F(2UxVYqLUIa1e;ZvYD*jc8RE%G9OL{h3rY{gI
zGaKWdH`>2or(cJERpTG!pKAQuGygZ28q42qvA=5W>jnO@CGlrcoW|0@LeJ3F&cygD
z2>ze=r+>+d|0f9Q|1Bc^2OrhW(8A>JS#d)f2VL_o>dxOLrvJ)||Cts4S5jQhR#)H5
z(Ebk?tKQeczlYQRar*akyMv{{*ZbDDvi;(({()WnbHe&}`09V3vHl}d{%>D1hX0Z%
z|D*mNU)FyheE)J;N2vZiQI2PAtC$`v((O7`GpSHvw@|8-4iT!%R|Abp3O^`{3h3_=
zZEk>UAejstzoQD89x5QaI#|=NAU%81u$a@}G+_DC*(CFw*yDcP?YS59^(>>~QT_Du
zvtbcVZc#a2l<=g<e#Eqih#CR8rL|2ag_0A^$XUPu)zt7Qh!v0mN{L3(96bnn-4JvN
z)Hjz$5{)-RD7S!unL74Tmi+DAV7qUS8lA;_^z8TL4-M3_va8J#Ec)>Uj-Lk@XIRo8
ze0^(s8t)!`32}i`KOoQ>g`b3%tC>1=J3~b`EeaJ-M*N%v{a?ugTSl9n$@xh`U9ATA
z4TqIgNS+%L!W^F}S2_i^n;0b<jntaER$t*RCS!c$_%=>+{X960%+uL)=Qt2prqH?F
zX2GhQNMur299EW(cS%pEOj#Rz)P<-DiRB22VTy_7SLa1dnHu6#C8_d+6)fjp=TS#9
zYzqtJ^h+AzA(=AJMJn=)WOvD6Oo1CRZ41(ior+;f622I($V|zp62BE1=Q&4xP9!FZ
zFv;kc{7+=m6d;Rp=6OdWcSy;Yf=`5M6s=4FuBlRNi>N~ugQ+#Hl@I&v`pK^m%xF%_
zn5CHwnLh=r3c8Xg^@VAHI|lD(@3dB4#j|QWX3a@{V_&=)X)A4py$j!)opfb;-F#aG
zzythXs_vE6TcX4wxR2pRXVjOy%6{PUs;ygo_bcg1@xwUhI*&W6VzY+EgT`TlwlTMT
zTY{a!d;OvG{zFOBSoT;@`vgylCa@q7!JI==J_<dJUk)?Mc(z8Dl(ZQ+;if{f^!y;E
zCvhW5dwJYRoKf_YMnEoRO+KBN?&2{G`p!vc7#0_#W1Bk7oi_o=pI??z{9(YOtsa^j
zF>;n3VQw~7mJ{J;&}hq{y%5wF0^|95q3d_IWUH%xgf=2uDTvb5)bS1bd^3rM6F+rU
zB9_k%tRD(m@3PFbG4rwyvB=J^4Baki#Sg#bEraae!mag*XUKtiE^A?t3fWuP=!%0Z
z(_z(KZx4)yrqOw+(p8d+h04;tia{$~lwO9q2vB|3W9fwPA@h->3UnM=a61=CXhp(m
zEx^BE6w1nF&w}LwT`xCR9_~<C5%;ZyPjdtgE9+jRVJ=+Vj+1DIXoD?;3pChB*p>Mj
zD+P$&=+?Fkv3nR>{ZW_maZ#>(iR$l`=QKd2v#4UKcC6=_Lu@oVsxPR<9Bl6D?nMqe
zFOPAssM6C4{b(HU^Mk6TYjin+mjhwrk<;SQ5=ILKM6A?<lT*Sf-|cGw2(JPkaK#Vm
z3=&Gw`{#d+J#Jw7a9;Z=IUg~azfQ^NfWCcbkGjOs5!_7|BV<?vtvJ$QGA&nwdye3l
z;Dx73v(rI^GTg?RB8mo}vczRI6sKIui+v|(%W$6BTNOnd#^A3b6iTboc}#!uz2fR@
zDRChiC>i(#Lrz9YIx_hReG@uGucn!EXVz67%V;L2kmu_?8}Y!0R=OuUXx}G_<$Q9+
zy(EzCNpRf^P>ArOkN2gGeCb;j@8R{EDEi{)Zwe)xEIzF9iG;`M<i41C^7x-kiQT!K
z5<(K%XVt+$sUT?*8BTW?Rg)!q88&ob1+d_l@0xjWhk+J2l8039nq?>$Z@9tftjFMu
zgNt#4J3gu}zwlLk7V@%sBKtO+LE5J8ANsN?wK_a^L&x^SDj|_m8?Bdm4%w?`e#dy+
z46pBQMJbfy$YbqT&KfrKugT``a6!4)E38<4c76XvPGzx*v8B+s4@H?u3ny{yjWhJQ
z;hFDg1qkD_7)E57S$9CA<<N0^Xr@x7`SnwFs73c~${`r5T1mI2gYYn5c*#3X&mdyj
zrU-F+<ix;$2;zbaMbYYb5tC4I8m+Hy^8m0BtwQ0_up`CbVA{54>XQ`0F5ojGmZc4k
zkqhOtOs|MhE-51}bx6-3Yt)XPty^crmBS#x$pX~2wa@#}tE1C-`DUYyDlQ2vf|ufc
z(#)pI9h}0s>x2rk>-p4iJ4=#w7=QJfu1yaEZqBzJy(dF8$FB)ED0P|S>6Uuj$M#_-
zpf1Tu(>j$~H)Jf<rS_GCjdSIt`f+B@sNehOnjo70v!tuNWkvyQZ%P8^a)R>uJ*=z^
z{e!1+mKgI#2asQI0!#Ky>oP6MnyLknDX{A^jWg{9gYJ)us8=owC`#7!ry6CQ0(wJZ
zdvcr_Pm5YiDqcwG0naG|O+5)qt+zdNd{`yKNCQd_6`60uevp)yA?Dqc%S^VQ+@Vpw
zoV+Q@i%WwDFduq=&lvNkiPObdBRqMtvZ3!>X0EwV(n2qDR*Q*R<~y7b*i49Qg~AY)
zh+6}MrG+G;lzVtHzyeQkK5+v%b2Fx=_@Q1ivM=2O(ObfMEvQmYY6B%MbC;bCtuiMo
zF!W=I@Rp~nhkmh3>nLEM@j+>-FJ*8E&lL*b+iw-rwN-+;z0<uD!zb}zpDu4<7sdYU
zecX!`R}``pGe8_6LJz5j#P8PH@zc|I$SW1U(0#NohY33GfuvuWnIYBdg7vy6>=%ux
z)H+CGoJF?%;c;Jm2kLfAC)+LlkcHwE*!fdg)kTp?@2mH}PxU9LTclB`v_33&c`vM}
zPDlZDvKhj>1rr}9)~liWB&F%;z0LaRJCSrY9q^0q1x8ENqfhIlN>H{(&#~e$r0$UC
z<7vEwAZ@YY`sQY<Xn6T-9B|tr*v0x**jWE&BN;?X<7ZqQ35Au2!--{oyb8)?MWm&A
zS~K5ySIXB?gp#H3xJDSt_?kSnEc%25T>@$vCLAZwh&W;ZI3(8$ef;paa}7L5Pc{nH
zW&^oQMb+WXZAV!lt`T^K?~dGPC2M>jyg0nXJbFFk{u%km?+IQU_Y|zUt)n5NfQbq8
z&c<@sbwNpz<!m%9$j0#FNdSOe5qk+30kOCKD{RJU+IUZkpMm_}47!M^0VifQmI@$f
zqjX}?tg!8)s#jtZ5bXKb-HsVpp@7Yur4<|TSqP2Q=-7wnnOL}93JF;m)5b!7BhAfM
zd~*%KrPf6&otK=HI1R`RDR0N%UcEd=p@UIuzthziUAjIEG~dLgb&1oM!2(XwijhMM
zMFp^Ua~7kNXGBgkY(TcN@HA$?2&R{`_&C_JN?rgtaCGY_p2yeMLc!SZ+bw7N>=hr`
zL~NC~w~~MJirJESdDd-uJg+?IQM;^If_>=kHHh7|oQC24(Afo<T8MiVVr&Mj&1zIW
znbtjceZ1J-z|_(!85Eq;j>wJ*C>Hoe#pMuGDHu_#riB!OAI)OR*OTD0-vd?i3TM}H
zFb6mx7!=nlSDh*|vW86{GBl+n3_P;%vv<R~qI8&0iB<{}2V<c$lGT{%sg`MB@J<MI
zc4$1E!2WyVMzsl+-a$JkVz^IJ=f}PD*uJ%7!fl)04g5)~K6pD_a?EkahfR99jadl`
zc;UI|8;Ii|g=b&n^x<2~peYoNPp%{^<Mx5wdKEg{kJ&y&U-<xBqdLld^F^+gg!b`F
z%f+f!XA-V$yRNjR3+(f9UUfBZcKSetwn{u^hTEAG^-dAt3+@KM*CGiqAZ-31T`;rQ
zkZt4@V?PdSZAkMhM#uqc^_THzlXX}*q9hT);e91IC@3W*sGm`@t2t$|jth^a)h-zG
zbx<aof;q?GLy0g4qbz&#R{QOz43WhY^ZO^E-InuuUu5gD8}U@g7J;7DWeT9i@rc(9
zmA6R3vuzLP^WiL&9?`6ck}K*53qBG|nWl_(=njcZh|%3zg3wt;t_??8IT9{n)__|R
zHH|Z|b}B7er-Rp_j4tq9yZNX-2}gBg4gBxIXd!hBJ~@Wh=5WXAXCa1L&r82QA!1^1
z`(luphP923GiytBl>)G!ycp}$eAE?vP{&HaFFFcMZ%792<JrJ{>}EQ@!mgi_>OVzg
zri0cw-JP8T%32KYn;qx<0QnZkavJTOBf2~IK=bo~uB2mC7>s*rB=+&>Flw(pNi$5W
zP?zec3}cj`RkK4+<aI~&+`IL#h|J?{KrG`V&>i1`9zescEGT_fnW3sKozYFAw}J*f
z^78~D6N=H1&KZ)xJ?wL(<(aYZO@F-e>CNfcgoz<*;zt<ogfL(A?xCREK3iy(LLuum
zOus`p9amY!DBd-e95U$THo3gw=0&Kh7K7I4809WktI;YPf%Znn4#BIV2{%><C%9w0
z<8fQ$6*8RcM3G=BYi+0z3WyP+5DK43u7|dSlg>6fcblX!EA*j7=4yLrhM_-8G&7KJ
za$LaLa{AXoQrI^<)`{1aB~!95<sm(eijhT@@D3Cs87A#3(jCA~vIJh$Sqdea=Dhle
zovDUhb3snQcm^DhwHEQiR2Lxp1kWXaQl2nZnijhU=x0<+NyWa*Upqs@_9a|e@(dHP
zL<>mwZKz=?fC{Kk!z3Rbo&CC+R{S8~ZU<7b2ios|v}zF^KdpPC3z9T5n;iF8GPdBw
z)^8*I?Kfgp<2~szNrCAqxnE%#JvJfoY=I&qW+1p2>HFaTNUYyPSE;u0B&X+ckv+LP
zQM;&LI_9bPKi6XAGS}EQwvMK6ni6o}q>jlq&ou%c@P}L#Lm)J?0YcKZXu3svzC-C-
zK&!QzAAy)5l^&u*dS0eTX*OLCrc7TDx&#MqI8$PK8!wwP@dRjbb?Cu<a@}3_zgz6V
zajBjda_g5F$~kvpy@285$ibos*Q7+qiH0Qe)}b{E?4bPi==VUtCy2p;86%u+oa`fk
zR!Qn_wpJwyxe(iK`m8<Tp%zQ}1v{<a=dsf?($f5X6Z#D?*jGsxE*u<P{hPkmlctOp
z>(ExW@0eL>1SdO$P^>|5$$q}YMv$1(?cioA##_$4)W~Klp8nCcH+CXqja(R%E&O{f
zcF;tFti=kXS5__kf&dlCwM<(rICJrBY+0WieU2)kI6mU4KTAOyd}z*32g4IKm_FLE
zBnmsJZByO=cVv$|i8zWfJOf)wLG*f!xC}4o9Xn{a(tYR5zR~h=cOk4%l3OOyrh>NN
zU$Z?wdgCS?TxAigI0J?K2q*-!O1R;El=~>!(S(*AdC%|hVylS9leV|ulQ=m6sBF47
z?|j$Gr@6qgvvqO0E_K=)gXE66ZD|317VSHOq6rI!l-^)IT_w_i0?c{?+cCcN!Ye>z
zb4$F~2g8F5hAPu~Fq|l2O_P4MYat}1G2sE7L_W)Wvh^?V_gjQcma2S5DrV;jry&LD
zmN5r!f1YxCobgmlOiq*boQ;kJFAFX$TZm_Ae9pl5U+q14IMiSFBtlv!B$`I4>}Fq>
z?9rlZ*|%hgvXrGzNM&oXZ)K}UQT8mAC`(EUk&rEtz9m`8+Ejk`GmK`2zVGvWpWh$v
z`#kT=bD#UU=iYO-bI(2Zp1Wzc_ln+;n|Oas?kJzJ!gkh1xwmIzUcQnqhzr)d5V37p
z^@w!~yYmrplii1`Z%<sq)eNu7E8Q09S2%7iKmMre_OM)X?|u8I1639>&&xQz?eZ=9
zzMfYq)7qL~(Rs$y)K)y;akceQiwmZ<D6u^~Bb+4jXyspV#a9l(g8FzpmP8jvK6<3#
z>R=UggmeGa^VTn)mA)D4lIZ6R2|Z8Nz5ZUz?#AfIm&?!GVz>|9j7+~?bUzJlGg(hk
zIlxyOWLQc5D|91;??P{&SD;dNKt6xEDyvL?|BjP)%^d<uAMQG#t6y+LP||v-mD`lC
ze2$icc)Zg2kPqc$?oJs6K2`Sxe5#cjzeyc*sI%`g$3NO?EB0mo^>p#AxtQzsr>BYe
zP0k7*i?Jla%M*DAtt|aoa!<MM4|IbmdQaPzdMTJ)%MA4of4D}bw*ETq_1f1K@@>)~
zC1tRi<3k#RcvZpA?|rg=YEkO)hLYcYEU10`EObUP<mbI##=`Oqok`xyCM!#ZpQqgZ
zFcoYS=+<N<s4hEmpfYlF)s0H!{F6s#Mx7JL%ZoeBJD=CPxwL+kHUIUga++T%LB8w-
z-%57AYSOzY%}H3OXwA{U7mB@BtF@!eb{;Hgg$?#c@+WL~bNaBZ%MQc4${{i{et~u2
zZ#KM?Z0l|08a)xh9~7nYcxx}~x7vO1nu%xUrJvQkc%jy>6{ff5X2^N2mD$Ex_q3Mj
zE#*14Vrgn*(4+66#v~tsN-1A|N#hivzTeckV9gKt?k&E@KL>yQf)B@?(~KMSWPS8`
z*Q&&<di77@+qVg9K@S~ieU54|5j*qVi06cSTT9P9Wvd-JFDGhWeqbx!ySLU`hUWoC
zdS2yGR&U`N4k@qTpH(~u4&7U#(UFW%8p+tB9Nn?LL}4Y7<LZUgo~j~4pAlb+wf}mR
z_wbicPEEQq?&3y~Yc|LHV*{Em6pCqd#Fm$O2^w+ybn^3k;ZC}^nqt(qax?po_I-^Z
zc@w9L+oQ1PFZaA%(LR-z+VYU?uKB;p*c3k&+V{17*La+9?aTg*G~><rxBL{BwOr=F
zQ@#g2{n_7NSYlLuPA3m0Cbpcndwq@w`$QYJSp>4;fZ4Q2$60=3r9e^Trf43){BPz@
zR@7EG{ERWf=Y>_<j2H`co=na9j2wHleOvVCD%B{duDs#2SA2X;#J87Vp^cXc2A*h%
z9a_u(DI+fU+saeVJzrdsMz)R<?TN|KQ*5N%t~KWGWN~+@^h>-pj@BL5yVbX?=&-_Q
zouZ1fWlyNnE~!ggtM895OIfXKZ@McSZQ-!3Aa~8~@plcf`E?SGpLRatbUjA&I<V=G
z#pJUP2V!u{C-M#d3g5Ap{S$pgFI#!q!Yjfkz1{AI8alfpjdOEkUB&mkjY)2ZgDEwR
zaUC4;z3bf`z2a6%*U5E$ySxf6$QyZ9t^8>i(941R@vy|d`6w*K#)aq`w59EMU2O(y
zv1C}j$*%UHlsD%3uRO1=r2L4zeCTMhljhQm>ux?7duATP8?3{*`KLi7-w@&F`!UKb
zqkB0Q?|b?+hU!G0{rYX^%A27r;#Hg9ExDm+x%Z>pOxM}qR=kCW%i1LhW)zf`jh0IN
z5tIFiiRsd{Y!zKR;hfoxuh<?|M_zt<{;Ru=gnnc$*NRHBd^Xt{-*9cm=}3jo9vwLx
zNYA^8XNFwjn}mF#9>R_YZakgh<VJcb<|d?bvAsq`_PV)D;_b;7Djw_u;og{4mM<xK
z%YP7w8-ki%kLvRHm6EMhSR0&2-0N;BoL#2Uu>8)GO&@PhYre_y#0wS$i)us(#PJ!$
zCYHqnn;7pue+Vv!u~+yoDjd@nt=FV05)&<GP$pQiI!ogH_bmcKS2)Y~n~X2XHIBDT
z_WGDf^_P@;l$7{%RID9;Ff70B<02|_+Oa|`nlOLX5DhKI%xPW!b~Q&=eV_3@6QD!a
zqgxNeKpJ!;97Di?OXRVOD9~|`;(PwJFc60RoZ+928RAh)`g1fE(!<l<3WFX11J|K4
zD3gH}pL*brwlqL>|6^tH-16c4nhk3&E9@65%hDw*tgNg&bTt6EVN=4aQzA>IHn5c*
zpYoZOVb7h?;hV(pPRgyClv>Tg#>%R(+eFRvs5ez-4i{IGfFp@SJY2;YJZNTP?E>Fx
z?creOZ0!LYPH=r!8%H}2Z&|pClM`GIdj8BE4qi>Pb31Nl3)Q)rtMgG$@Mr{luPe~K
zyRfjZEWx2zSOi(tu&{ybu`FXrVda})Jt%o)<;;>b$}GpTri5;E{&hQpl{`2Z@ri8`
zHu;vH+#TJV_av*lqUb64GWl*unuBF%up{|2r*oQ5dP-(|!DGw&NXkZvC}kbRiIP6a
zw{x)U!Nrn0u-k<>#pHLKlY-)ZQP|WDSeSaiCiy8X{D$Pi`KNAp+zD+U7jO<$zHTee
zI_8iHyJAnaBpZXj)rmvLEF8S8$egpeB6m#=kA2BzC67&d46se+P9ES-N-WM!x>Q$F
zTSflBIk|jW8-<s`LqecT3(sA;ax<~ufeG0kmf2i??LL|FV;Kp*SyhR`O<4itG)2Jw
zG&z*)CN#B?BXd%d-H9XQ#90%6ufVfP<dbAh3V5vH_?2m;E0m1HN!K_Iigo<5Z0^?O
zFz%)J%RF2+B6)aPlXzCJunhFo=Pkl5P-B2v5a#zy#TXg~{j0t5M!E)uTF~Qq;9xG@
z(kEb*xsCET3|Mg@EW$8Euy#bpFp%^2iWBsT!s5&5c)%bGOHOD4{Y}NtTMJs$yMSkp
z<U;E;vj=jIFg%pU{O$taZw9uay8kg-%`NoIvz4de$^C1L)?Z#1Bb1f4MMK${Lt0Np
z&&ngmIfwg<K&7BI@(QconI~$ToS7l2m^yqfud=!&s|s&GCTCU1su6=?&tjkK)Dr)x
zk0!+>g%({3V}+l)59D}G4qkG%ukW1x&`tU2_h6V}!HYe$ZVO-NV6|b;IgWGQQ%ik<
z8<MSskMVB}ITu=e?nI4%2=N#JpRd)VIGPi@(&1Id6Msx1Hi(a`?#FuMRJ4AfUSA)^
zG(kd9-@?8=Md7iXb(%a@Q6ug>UuM(c=1@r)?>9Ysu_9~oTI_v$3XfKEBp8$^HJKY`
zy=u-98fZ&+_FZh-^=n67XUPWC6$~_solmP}mwvuGe0-PgjoJ*yqEVGkm0U^t8?D#&
z@7kNTDU&}|u3sbP+K){5VJ?0x-+h5PzhVXXcl+*S*XfPL_pAA;6Qg+~5>0oHhu+^|
zP~9zLC^fM<fgITDA7{JAFTOs0;L}|X?9bR<4X+Cy3n}ETFu^ouQK>;Io+GX$EOMlt
z9U-bQFLzjydO{|i#Wj&0IFXjian$bhI=ywIsn|#Q45#t(p)0ZnVnf!SIxUfLG^NB}
z)bNJR!_6lwNAmb9ANmzUVtTeTICpZqiR3B!`t>#fKShplAuGBnB7}B-;vG7dB@|v|
zLdZVk)!xH?^3EAlxQ%w2E}w0bWzA5uqgZwi(nD3DGZ@D=p%}K2i_1;y(F?w0i7jRk
z16BcXhP@=YCF<nBCDzwE&B1B<CARe#wKOEZp6JuqO62bLX7-K?WhKI4($@=kpXroe
zOGwDYKgX=E6G+!;6#K{>7QgD=;nr(;yNvI1CYPQGcqSz-lbv@OcYTYq)hRbUdndw1
z-_eQbJ%3F|4F(F|JFa5C<w(R1dyJv9$c|lZ7(XAS)U!&7NFjwj<m6km%U86A$I~0R
z&CjsCH|7Yr*UEn5rs<o+>J9O*kEg?5c&^_=T3Wrnb~z%@jyu|<{-=2gHcGI@u&A)1
zvP6})E=e^uUD|BwQo^zi)w+gW8a8i9q0tq#LB;~XjfJV{x2n&#YCjx`v9~cA94mEn
zc$%<n0*krLi!n8ouH4h;PL#dkUYK^4i?<E-GV}AcE2X329nF;q*lMDKcIKXgoavX3
zeRlKi#S0gvo~h6z9e`bw$O~x7-oT;em-_A-f55hc{c;?KoT^g2Bn_?kH)-3dK8so!
zrs3hNn2>UttuV|<5f-5-;~wmdIAqn9@YKD-r844Z35#yRgI@!mPnKz~QSTZ3AulcU
z<UP;$LyX&XjfpKw39*{FhAPd1uZE7U&=vESsI<;b9~9WFqV(iyP@kk^dqj$CF58EJ
zH+F5TW#5CQT@6%S*Cv%MBV=0V_DZ>RuaZeuz&<YB$i`7VGr5tMoP3B><+5BAZ|i9C
zrZ2S>ar2Ezz4oq+J+g`6t9>mIA_zWAP#7#J?T99;%*Vb2kH5AHEN?vb<sPc-ZFbq+
z?_!idY*BlJ@<4xo(A(O+%M}rd>bK=D8yOs`s&}fce<6>vd2w^8KVR=*_4*ra@x9m6
z&4V*C3d+mxbG_t5SZnT6YvJq4lHOEYw5(jX^U$8}#KIG?T^i+mUUKi%tX!2RwD~n`
zTI_coOk3rA_^`aKqtcqDwI76U%PZfC^c3X^Q}W9R-6M7hm;0=Fg=P=8@i>pJOn6b6
zqmr-9j&_@sBTocF8#jpsQ7TSsu$y_lV~a!FDV+J2fit%zhpVGA#f?!(k0v_$yBu%u
ztXQgCTA|Q7-5f6yH(0rw?1(?q=Gew6zqMHMRzbl{dn@1LX72?uEN>e|8RQm9i-F^b
z4d23Y!xXRC#bED^N3xo6Z*E_+?hQ*^`eZ%lx{ckXED}+}Da%_|eXy`>y2&Y@FG4!7
zS-onXOAc|8bHAENZ}&UC4}2@5(s`Tg#R4AQX<JQN8FAs`P=%L}WQe8uUs7ZbL+dKh
zWgm5X&z3|bttchbJbQqk40EL39b0|aWy3CRS-qoXcTxlnOsME?r)+T6AD3mbt(C+L
zHLiWk5)-1tGPq7ZNiXR|$&v7nF0OXAtFrHz5v6M7F0TBPE9`pQMSn26jms=x7h6jF
zqfPQ_j_*&}o8Ow&bH&9qAWNYa)4b%>1x1$k-FLJ0x}Oen-YuS58tg6M>}AlA=TW|L
z*9N<WrKIr8;$%Mox3TRJBXI*BfxO#e!OMkq+8o-yN|oz29$p_hG-2*iZ2R1(=lhI7
z{>QQ8BkGlMUYG}lV{9h%;ezSvl?M9~amO`Pc4v*2he+s;X?3phQu^X1_cO`0tiEf1
zvTo2T@|vb-qpCQcrg-&l_*BvM!Qqpq?FpE4p|<*#NZ6*F)sm09OSW51sd>IIkH}(M
zStW5cZV(X}Kc2v4)c?58)ZjBF(eraVCS^lQOW%V@`KH6ax<0XVMQOh*-geoO_|%1a
zs7jic+9{&HzM0!f{sipK*jU*wFH(V}?nRCuqxV-c)CT*7!aCgfb&nVwrzGTxZg)(K
zcq}#(zjKd#$C}2(2zAE`gS|hWOZr;WcFU|#H-4TN<~Lmb_|@UYW>R3m`twazyq}cR
zZL{iZWpzDH_-`21Il+_M*tutCQ$)>1f2H&w-`B}~^{YiVPpUmHAAD|FITLgW7Iuof
zg|xl-s-4A>9eo*jpOGP{!mxp#mnyCr1;ENj?WDeZ_5CgvhVR)|TIJWXuJLiow@piq
zD<b<z2cNbF5Wo8SiobX$&m||bBf4-nN*GbPZ1{k7Mp5bM{UhvdQJQiEy9XsYr{gt-
zRo`s0Gk!YqAZg2`AtP8|l=IBML^KimH6H&uVQs5n(M?kWnVU_{aY@PzgHO(g1V$@5
z+<VL)z;7Cs!x7YQy)~c$af7cx?btpCbN@#}dfyC=e)zQ3S5l&N?Fin{+0bki`}b(l
zeLihZzD+ZOI%l_qa{q{JsupoAtg<E`#a1YN&*&N~<g^Lt;xVpa`&9FUJh3+3JYVQ;
z{5tRTmn<B2m%gxUw|V~hv!}*(1+IjH5{ILb`!l#|5o((<mF?QK4$8iae|>;u^I+j4
z-}7fvwqETj$#+mILaxU>G}Zs1v+k=%5&Dpziz~}t9OBYwqwSjg`x=f-3)_^ONs%Qw
z-L@(E0smUWrvMuj@)7oaBZ*VXFOzx85;dcf9N7|IUGZJyiFLxU{AB||vC2xuWBjT2
zxI2au%S&Y3{lAIsd90GA7V}PdR5VxQqM7r}X(y6QpWvqg?`5f^Znm(xdlMV{v(xuQ
zh1oy7(Fl9xu2*f-9v)NuCi{F0dtL*FKyM2E`{PJC`}FZDTjGEp+xRw;g^9j_g-P`j
z`ER>@RAE}m`u-bGDh--mg_8r<_BuKthhoxIef&E@uPZk7ePNCGYM?q&YmAeSN8wpd
ziI$w8ST1=q5>&SQt2CQlRdY?R>8NY@l6XO*W7j{NF^yrDbUv4{4jUw{qXw^ua^KX&
zvh9k5pxinhx2g)&*!SBkZ?>GQk`D>gR#DqD)b!YVRQ<=`jPH)=89sj3UuUD<?S3zF
zPF{4l@+DqFh|<}`)?Ie&n8f+QoyV?S`tT)kOeU~vgjl>;vnWY3T)l~Hv*xkQUnB;U
zibtE?EHbjE?SVz%@JQN(k^1KLVk28QRcm)U=mH)&#zFo3WSRDAIgYwb78<P2KD7;}
z&KC5*3({`x9?;|!j>F1nS<ihVQAj!JHdl8uH~~k1gYi0?0N##=?7uTOB8uLhn?5WK
zY@s3`e)}Vl1U!A<#lEQ#U~vdIgbYOn*;uem82ZNIk+X1c!k6lYz%axC{JCj(7(5D;
z7(q2O7_C4!1jd5y!FcKe>3?6>j63$2>l#gDu50R6K>E5yV-~M#sA#hWOWpSe?fsiI
z^l;{HEcb6bn%|#nC_c!K-iGjLZW<o5n;yQvZw{XsPVa`kX@(Zpd_ERQpFRxzH+`J*
z@VW9Y>Ni(jYFGv`)1545*f;x|rRY>DzYm|!F%%lPfXLL7*>ntrMf@f*7BkOJSg`LK
zsEp<faMR}tMYnDAPx+$X{m$I_P_qg!I!*`l2GeA^jM3!_iJND1Zm@qH1pJ#n_uu$I
zc>nW<gF0j&CY?&=55#2LhrWQCvlkiAQ<JLnpra;=zAqu*=i3?BO3p~k|B;8WKA2s9
zs2@;|3?!u;Tw&gCPuFiS-$k*2swn2p1L)ouc@*53_gfm{vGY{Lp@0O%14%q<xaq!W
zuzzCzN8l4ML@+V{BMc-kI5ZrOL4k__QE&n@>Hr1<1U#02q<%x?MIt~TswW1+jR%q)
z0unG_bO0&`PndIK(cp?f97Am_Rx{KZz=9MZWGuLskZL2r2@nhtjs^HQAh*zv8zh2-
z#y8-bh@MRh_;b@Jg292M27m(@Y8*tUL?BLpL&ck=7;_%}BPj6iwjxkYdfq_N9?<(U
zZ!o-)$IKVV1tTZw>wEOF3yEBuFR*~@&_EFlC^Kic>Aq>Oe_~VdQFsg-Lj=<Lcf7y9
z3DAIZ)(`4!p|EJMwljwVbn~;ge`iDSQt=kXPfZ_>!2@0ZJONrE9!r4Z03YDMYs*l2
zkRKYfP%IKhb>qOuf(Tk16$czNg2F=aLucZkx`E=Lx&a;%0d*t`6QzeyGXP~CLdJk`
zG0jFJ@YG6y+|<kiH#Dq-zM)YyH5@pd0@)B8O#}%;22>Ue24#jeY=z=pBrpFj1Y9KE
z#nM^~_HU;@*BBXCgSKGvXVzf6FLeQLESSL|si#ZmMgo798KCNa_dfsCJq{=bHU9+A
zz2k{MZh-bq06c&Pb1Xa(0mK4mf_TEL%)o;gC*TvP>_BD!2Oc0mG6Os*4gm>(F`({!
zUS<G6^bcePBm+Rhr^*aqgVfPL2tf@Tf}_EEpHL!LAP1mtA~i7(4hJ|B@&|qxh_L_;
z1`Sr+ptz_q1IQg<Q}I9;C>)dducjcVa0bTs)A_~U<0&-_J)<4adZiv{;S2Zz%{-O@
zErM|@g`uDD&}lZ%Q2z)SXhsGM3MdrlY|wuLX+CElIP^^mOS2b)&G~_52D(^)N7ahV
zr9s1^x1kn9@5ZC4c--``f8(2q59JRU-C)qOY0zvaJ_t@LGZq@*%;k|9o`~dzY$}Xa
zPr#msLHGa%7zS!WbB@1Po@nh+G1l2nr6ztMHD}kO>E=7strK*e9F{;g0H7l#^u{h4
zsz^q|4Y_f|Sw9@a_l*Ak%1y=phdA_cQt=@+$09(d1T<7M8wENkC|=0DSl%Hx@c*4Y
z7IXtpgM#e2GSJF{A>iqWKsQ6tadWlxw6Sv&*W70S*K}}o_n1`x!tt^Qyo93S+*wsG
zH#>VU{lOBr5%WKw5X1smZV#V>5%JJnbI=d&G6%zev-?1~zyL!KabS4C48sE@A~OsL
zIyNR40s#p%=r^AR0*wZ>#s~v9heJDq7{VdJMFOBJVSr(97)bTT07D`$py@KhkVxh{
zW3WU#b2t<lw;(<g8Vy<%V|*AaazS2@I5dvAY)CLKV9p;92Lxsq3KWew4HO^`a~)vN
z&_shVFK8qN3>TSUC@^AUgn^C$NJ2&!8bQD@*8v)VTbO4Q4s01=!UekC1?l3UDIQ}u
z3<?W%*wF7c&4~o)ye%^fNN{EtBygEvXf%pBF9<vm%Z!Ugp`qytLmFr#VL><y3bCMG
z5MZYibG;yl7%;+Rj1Qy>xSR<_L;~d>BMeY{L3=@iQ4Mn%7$go%G8u8fyW(KN$pk~=
zKu^I0!x9(J9JJj9Z3DC`XnPv;o2Lh$`2t)p4F>vqrf{IyFM#3k3)>_ChghU+;HmWa
z_&nUK9i8mlxJe|qoW7%v9q60ja(b?=9&oCr1TMGB#oiST^>liW?%v(Q+RcO7i-A4~
OkLTX9Wrwx~_x}OK$XxUQ

diff --git a/Generators/Charybdis_i/doc/Charybdis.tex b/Generators/Charybdis_i/doc/Charybdis.tex
deleted file mode 100644
index 9e594d9bc403..000000000000
--- a/Generators/Charybdis_i/doc/Charybdis.tex
+++ /dev/null
@@ -1,152 +0,0 @@
-\documentclass[11pt]{article}
-\newdimen\SaveHeight \SaveHeight=\textheight
-\textwidth=6.5in
-\textheight=8.9in
-\textwidth=6.5in
-\textheight=9.0in
-\hoffset=-.5in
-\voffset=-1in
-\def\topfraction{1.}
-\def\textfraction{0.}   
-\def\topfraction{1.}
-\def\textfraction{0.}  
-         
-\title{Chayrbdis\_i: An interface between the Charybdis and Athena }
-\author{ Nick Brett (n.brett1@physics.ox.ac.uk) }
-
-\begin{document}
-
-\thispagestyle{empty}
-
-\maketitle           
-
-\section*{Introduction}
-
-This pacakge runs the Charybdis Micro Black Hole Monte Carlo Generator
-from within Athena. The Charybdis generator has been configured to use Herwig for
-hadronisation and interacts with it via the Les Houches accord.
-
-\section*{Available Input Parameters}
-
-Charybdis has a number of user defined input parameters which can be used to alter its behavior. Some but not all of these parameters can be modified through a jobOptions file using the Athena interface to Charybdis. Those that are available are listed bellow.
-
-\subsection*{Plank Mass}
-
-This is the fundamental Plank mass as experienced by any physics on length scales smaller than the size of the extra dimensions. Current collider limits place the fundamental Plank mass above ~800 GeV. If extra dimensions are to solve the hierarchy problem then the fundamental Plank mass would ideally be on the order of 1 TeV.
-
-\subsection*{Total Number of Dimensions}
-
-This is the total number of large dimensions including the (3+1) dimensions that are apparent in current physics.
-
-\subsection*{Black Hole Mass}
-
-Micro Black Holes produced through particles collisions will have a range of masses defined by the range of center of mass energies of those collisions.
-
-\subsection*{Number of Particles in Remnant Decay}
-
-Micro Black Holes may be considered to follow the normal rules of
-General Relativity and Hawking radiation provided that their mass is
-more than a few multiples of the fundamental Plank mass. As a Micro
-Black Hole decays via Hawking radiation its mass falls until
-eventually ( $\sim 10^{-26}$ seconds later !) it can no longer be considered
-as a "classical" object. At this point some new unknown physics must
-begin to define the Black Holes behavior. The Black Hole However, will
-still have some mass and possibly carry some other conserved
-quantities such as electric charge. The Charybdis Monte Carlo program
-deals with this remaining object (a Remnant of a black hole) by
-causing it to spontaneously decay into a user defined number of
-Standard model particles. This option sets the number of those particles.
-
-\subsection*{Time Variation of Black Hole Temperature}
-
-A Black Holes Hawking temperature if defined by its mass and the
-number of dimensions in which it exists. As a Black Hole evaporates
-(by emitting particles via the Hawking process) its mass falls and so
-its temperature increases. However, because Micro Black Holes have a
-very high Hawking temperature the time between particle emissions is
-extremely short. This leads to the question of whether or not a Micro
-Black Hole has time to reach thermal equilibrium in between each
-particle emission. When this option is set to true the Charybdis
-assumes that the Black Hole decays in quasi-static equilibrium and
-its temperature is always a function of its immediate mass. When it is
-false the Black Holes temperature remains constant throughout its decay.
-
-\subsection*{Grey Body Factors}
-
-To first order a Black Hole behaves like a perfect black body thermal
-emitter. However, the gravitational field surrounding a Black Hole as
-well as any charge or angular momentum it may have define a set of
-potentials in its vicinity. Particles emitted by the black hole
-interact with this potential in different ways depending on their
-charge, spin etc. As a result the spectra of emitted particles is
-modified, transforming the black body spectrum into what is know as a
-Grey body spectrum. Setting this option true causes Charybdis to take
-account of these Grey body factors.
-
-\subsection*{Kinematic Cut}
-
-This parameter determines whether Charybdis conserves energy and
-momentum as it decays. When set true any generated decays which exceed
-the kinematic limit will be disregarded and replaced by a newly
-generated decay.
-
-\section*{How to Write a JobOptions File}
-
-All the parameters detailed above can be configured through a
-JobOptions file using the Herwig Command string. Commands consist of
-two integers proceeded by the phrase "charyb", as in the following example:
-
-\begin{verbatim}
-Herwig.HerwigCommand += [ "charyb 2 6" ]     # Total number of dimensions
-\end{verbatim}
-
-The phrase "charyb" indicates that the command should be interpreted by the Charybdis interface rather than any other part of Herwig\_i. The first of the two integers indicates which parameter is to be modified and the second provides the value which should be assigned to the parameter.
-
-Each of the parameters has a default value which will be passed to Charybdis unless a modified value is defined by the user.
-Table of Parameters
-
-\subsection*{Command Summary}
-
-The table bellow lists all available parameters along with the relevant number and the default values:
-
-\begin{tabular}{ l c c }
-Option &	Number &	Default\\
-\hline 
-Plank Mass &	1 &	1000 (GeV)\\
-Total number of dimensions &	2 &	8\\
-Minimum Black Hole Mass &	3 &	5000 (GeV)\\
-Maximum Black Hole Mass &	4 &	14000 (GeV)\\
-Number of particles in remnant decay &	5 &	2\\
-Time variation of Black hole temperature &	6 & 	1 (true)\\
-Grey Body factors &	7 &	1 (true)\\
-Kinematic cut enabled &	8 &	0 (false)\\
-\end{tabular}
-
-\subsection*{Example Configuration}
-
-Bellow is an example of a complete Charybdis configuration. Herwig is selected as a generator and provided with random number seeds as usual, then options are passed to Charybdis as described above:
-
-\begin{verbatim}
-AtRndmGenSvc = Service( "AtRndmGenSvc" )
-AtRndmGenSvc.Seeds =["HERWIG 1804289383 846930886", "HERWIG\_INIT 1681692777 1714636915"];
-
-theApp.TopAlg += ["Herwig"]
-
-Herwig = Algorithm( "Herwig" )
-Herwig.OutputLevel = INFO
-Herwig.HerwigCommand =  [ "iproc charybdis" ]     # Set Herwig to run charybdis
-
-Herwig.HerwigCommand += [ "charyb 2 6" ]     # Total number of dimensions
-Herwig.HerwigCommand += [ "charyb 3 6000" ]  # Min Black Hole mass
-Herwig.HerwigCommand += [ "charyb 4 6500" ]  # Max Black Hole mass
-Herwig.HerwigCommand += [ "charyb 6 0" ]     # Time Variation of mass
-Herwig.HerwigCommand += [ "charyb 7 0" ]     # Grey body factors
-\end{verbatim}
-
-\section*{Further Reading}
-\begin{description}
-\item[ATLAS TWiki page] https://twiki.cern.ch/twiki/bin/view/AtlasProtected/CharybdisForAtlas
-\item[Charybdis Authors website] http://www.ippp.dur.ac.uk/montecarlo/leshouches/generators/charybdis/
-\end{description}
-
-\end{document}
diff --git a/Generators/Charybdis_i/doc/packagedoc.h b/Generators/Charybdis_i/doc/packagedoc.h
deleted file mode 100644
index 37833d98f164..000000000000
--- a/Generators/Charybdis_i/doc/packagedoc.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-/**
-
- <i>This pacakge runs the Charybdis Micro Black Hole Monte Carlo Generator
-from within Athena. The Charybdis generator has been configured to use Herwig for
-hadronisation and interacts with it via the Les Houches accord.
-More information about the generator can be found here:
-https://svnweb.cern.ch/trac/atlasoff/browser/Generators/Charybdis_i/trunk/doc/Charybdis.pdf
-
-@author Nick Brett (n.brett1@physics.ox.ac.uk)
-</i>
-
-@page Charybdis_i_page 
-
-
-
-*/
diff --git a/Generators/Charybdis_i/share/jobOptions.CharybdisHerwig.py b/Generators/Charybdis_i/share/jobOptions.CharybdisHerwig.py
deleted file mode 100644
index aa3286d6516b..000000000000
--- a/Generators/Charybdis_i/share/jobOptions.CharybdisHerwig.py
+++ /dev/null
@@ -1,99 +0,0 @@
-###################################################
-# Job options to run Charybdis/Herwig/Jimmy with
-# release 13.0.X and after
-#
-# Modified: K.Loureiro, August 29, 2008
-#           Added additional parameters for Charybdis_i
-#
-# It also runs well wiht 14.0.0.Y (April 3, 2008)
-###################################################
-###############################################################
-#
-# Job options file
-#
-#==============================================================
-#
-# last modified - 11/05/08 - Cano Ay [aycano@cern.ch]
-# last modified - 9/09/2008 - Karina Loureiro [karina.Loureiro@cern.ch]
-
-#--------------------------------------------------------------
-# General Application Configuration options
-#--------------------------------------------------------------
-import AthenaCommon.AtlasUnixGeneratorJob
-
-from AthenaCommon.AppMgr import theApp
-from AthenaCommon.AppMgr import ServiceMgr
-
-# make sure we are loading the ParticleProperty service
-from PartPropSvc.PartPropSvcConf import PartPropSvc
-ServiceMgr += PartPropSvc()
-
-
-#--------------------------------------------------------------
-# Private Application Configuration options
-#--------------------------------------------------------------
-# Set output level threshold (2=DEBUG, 3=INFO, 4=WARNING, 5=ERROR, 6=FATAL )
-ServiceMgr.MessageSvc.OutputLevel = INFO
-#--------------------------------------------------------------
-# Event related parameters
-#--------------------------------------------------------------
-# Number of events to be processed (default is 10)
-theApp.EvtMax = 50
-#--------------------------------------------------------------
-# Algorithms Private Options
-#--------------------------------------------------------------
-from AthenaServices.AthenaServicesConf import AtRndmGenSvc
-ServiceMgr += AtRndmGenSvc()
-ServiceMgr.AtRndmGenSvc.Seeds = ["HERWIG 468703135 2145174067", "HERWIG_INIT 468703135 2145174067"]
-# AtRndmGenSvc.ReadFromFile = true;
-
-from AthenaCommon.AlgSequence import AlgSequence
-job=AlgSequence()
-from Herwig_i.Herwig_iConf import Herwig
-job += Herwig()
-job.Herwig.HerwigCommand = ["modpdf 10042",
-                            "maxpr 5",
-                            "autpdf HWLHAPDF",
-                            "msflag 1",  #calls jimmy
-                            "jmbug 0",
-                            "iproc charybdis",  # select user process
-                            "charyb 2 6",       # total number of dimensions 
-                            "charyb 3 5000",    # minimum mass
-                            "charyb 4 14000",    # maximum mass
-                            "charyb 5 2",       # number of partiles in remant decay
-                            "charyb 6 1",       # time variation of temperature
-                            "charyb 7 1",       # grey body factors
-                            "charyb 8 1",       # kinematic limit
-                            #Options below have their default values assigned to them
-                            "charyb 13 2",      # MSSDEF=1 -> M_GT, MSSDEF=2 ->M_DL and MSSDEF=3 -> M_D
-                            "charyb 14 0",      # Momentum scale for calling PDFs
-                            "charyb 15 3",      # =1 no heavy particles, =2 t,W,Z, =3 t,W,Z,Higgs
-                            "charyb 16 1",      # 0=no printout, 1=errors only, 2=errors+info
-                            "charyb 17 5000"    # setting the beam energy
-                            ]
-
-from TruthExamples.TruthExamplesConf import DumpMC
-job += DumpMC()
-
-
-#---------------------------------------------------------------
-# Pool Persistency
-#---------------------------------------------------------------
-from PoolSvc.PoolSvcConf import PoolSvc
-ServiceMgr += PoolSvc()
-
-from AthenaPoolCnvSvc.WriteAthenaPool import AthenaPoolOutputStream
-Stream1 = AthenaPoolOutputStream( "StreamEVGEN" )
-Stream1.OutputFile = "charybdisHerwig.evgen.pool.root"
-Stream1.ItemList += [ "EventInfo#*", "McEventCollection#*" ]
-
-#---------------------------------------------------------------
-    
-#---------------------------------------------------------------
-# Ntuple service output
-#---------------------------------------------------------------
-#==============================================================
-#
-# End of job options file
-#
-###############################################################
diff --git a/Generators/Charybdis_i/src/CharybdisInterface.cxx b/Generators/Charybdis_i/src/CharybdisInterface.cxx
deleted file mode 100644
index 9ca578cce5d5..000000000000
--- a/Generators/Charybdis_i/src/CharybdisInterface.cxx
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-// CharybdisInterface.cxx
-//
-// Nick Brett [ n.brett1@physics.ox.ac.uk ] - 03-02-05
-//
-// a set of c++ functions that act as an interface between 
-// Athenas C++ herwig command sting handeler and charybdis 
-// (a FORTRAN program for simulation of Micro Black Holes)
-
-#ifndef CHARYBDIS_INTERFACE
-#define CHARYBDIS_INTERFACE
-
-#include <cstdlib>
-#include <cstdio>
-
-#include "Charybdis_i/CharybdisInterface.h"
-
-int WriteCharybdisParamInit=0;
-
-struct CharybdisParams
-{
-  double Mplank;
-  int TotDim;
-  double MinMbh;
-  double MaxMbh;
-  int RemnantDecay;
-  int TimeVariation;
-  int GreyBodyFactor;
-  int KinCut;
-  int Yrcsec;
-  double Thwmax;
-  int Rmboil;
-  double Rmminm;
-  int MssDef;
-  int Gtsca;
-  int MssDec;
-  int IbhPrn;
-  double Ebmup;
-
-};
-
-struct CharybdisParams param;
-
-
-
-
-// This function should be called from c++ and used to write parameters
-// to a temporary store
-extern void WriteCharybdisParam( int index, int iparameter, double dparameter )
-{
-  // Write default values into CharybdisParam when function is run for the first time
-  if(WriteCharybdisParamInit < 1)
-  {
-    WriteCharybdisParamInit = 10;
-
-    param.Mplank=1000;          // 1
-    param.TotDim=8;             // 2
-    param.MinMbh=5000;          // 3
-    param.MaxMbh=14000;         // 4
-    param.RemnantDecay=2;       // 5
-    param.TimeVariation=1;      // 6
-    param.GreyBodyFactor=1;     // 7
-    param.KinCut=0;             // 8
-    param.Yrcsec=0;             // 9
-    param.Thwmax=1000;          //10
-    param.Rmboil=0;             //11
-    param.Rmminm=1000;          //12
-    param.MssDef=2;             //13
-    param.Gtsca=1;              //14  Boolean
-    param.MssDec=3;             //15
-    param.IbhPrn=1;             //16
-    param.Ebmup=7000;           //17
-
-
-
-  }
-
-  if(index == 1)
-  {
-      param.Mplank = dparameter;
-  }
-
-  else if(index == 2)
-  {
-      param.TotDim = iparameter;
-  }
-
-  else if(index == 3)
-  {
-      param.MinMbh = dparameter;
-  }
-
-  else if(index == 4)
-  {
-      param.MaxMbh = dparameter;
-  }
-
-  else if(index == 5)
-  {
-      param.RemnantDecay = iparameter;
-  }
-
-  else if(index == 6)
-  {
-    param.TimeVariation = iparameter;
-  }
-
-  else if(index == 7)
-  {
-      param.GreyBodyFactor = iparameter;
-  }
- 
-  else if(index == 8)
-  {
-      param.KinCut = iparameter;
-  }
-  else if(index == 9)
-  {
-      param.Yrcsec = iparameter;
-  }
-  else if(index == 10)
-  {
-      param.Thwmax = dparameter;
-  }
-  else if(index == 11)
-  {
-      param.Rmboil = iparameter;
-  }
-  else if(index == 12)
-  {
-      param.Rmminm = dparameter;
-  }
-  else if(index == 13)
-  {
-      param.MssDef = iparameter;
-  }
-  else if(index == 14)
-  {
-      param.Gtsca = iparameter;
-  }
-  else if(index == 15)
-  {
-      param.MssDec = iparameter;
-  }
-  else if(index == 16)
-  {
-      param.IbhPrn = iparameter;
-  }
-  else if(index == 17)
-  {
-      param.Ebmup = dparameter;
-  }
-
-}
-
-// This function should be called from FORTRAN and used to read parameters
-// stored by the write function
-extern "C" void readcharybdisparamint_(int* index, int* parameter)
-{
-  // Write default values into CharybdisParam if WriteCharybdisParam has never been run
-  if(WriteCharybdisParamInit < 1)
-  {
-    WriteCharybdisParamInit = 10;
-
-    param.Mplank=1;            //1
-    param.TotDim=2;            //2
-    param.MinMbh=5000;         //3
-    param.MaxMbh=14000;        //4
-    param.RemnantDecay=2;      //5
-    param.TimeVariation=1;     //6
-    param.GreyBodyFactor=1;    //7
-    param.KinCut=0;            //8
-    param.Yrcsec=0;            //9
-    param.Thwmax=1000;         //10
-    param.Rmboil=0;            //11
-    param.Rmminm=1000;         //12
-    param.MssDef=2;            //13
-    param.Gtsca=1;             //14
-    param.MssDec=3;            //15
-    param.IbhPrn=1;            //16
-    param.Ebmup=7000;          //17
-  }
-
-
-  if(*index == 2)
-  {
-      *parameter = param.TotDim;
-  }
-
-  else if(*index == 5)
-  {
-     *parameter = param.RemnantDecay;
-  }
-
-  else if(*index == 6)
-  {
-    *parameter = param.TimeVariation;
-  }
-
-  else if(*index == 7)
-  {
-     *parameter = param.GreyBodyFactor;
-  }
-
-  else if(*index == 8)
-  {
-    *parameter =  param.KinCut;
-  }
-
-  else if(*index == 9)
-  {
-    *parameter =  param.Yrcsec;
-  }
-
-  else if(*index == 11)
-  {
-    *parameter =  param.Rmboil;
-  }
-
-  else if(*index == 13)
-  {
-    *parameter = param.MssDef;
-  }
-  else if(*index == 14)
-  {
-    *parameter = param.Gtsca;
-  }
-  else if(*index == 15)
-  {
-    *parameter = param.MssDec;
-  }
-  else if(*index == 16)
-  {
-    *parameter = param.IbhPrn;
-  }
-
-
-
-  else
-  {
-    //log << MSG:: INFO << " Charybdis Interface -> Incorrect type cast for charybdis variable OR Incorrect index\n"  << endmsg;
-  }
-    
-}
-
-extern "C" void readcharybdisparamdbl_(int* index, double* parameter)
-{
-  // Write default values into CharybdisParam if WriteCharybdisParam has never been run
-  if(WriteCharybdisParamInit < 1)
-  {
-    WriteCharybdisParamInit = 10;
-
-    param.Mplank=1;            //1
-    param.TotDim=2;            //2
-    param.MinMbh=5000;         //3
-    param.MaxMbh=14000;        //4
-    param.RemnantDecay=2;      //5
-    param.TimeVariation=1;     //6
-    param.GreyBodyFactor=1;    //7
-    param.KinCut=0;            //8
-    param.Yrcsec=0;            //9
-    param.Thwmax=1000;         //10
-    param.Rmboil=0;            //11
-    param.Rmminm=1000;         //12
-    param.MssDef=2;            //13
-    param.Gtsca=1;             //14
-    param.MssDec=3;            //15
-    param.IbhPrn=1;            //16
-    param.Ebmup=7000;          //17
-  }
-
-  if(*index == 1)
-  {
-      *parameter = param.Mplank;
-  }
-
-  else if(*index == 3)
-  {
-     *parameter = param.MinMbh;
-  }
-
-  else if(*index == 4)
-  {
-     *parameter = param.MaxMbh;
-  }
-
-  else if(*index == 10)
-  {
-    *parameter =  param.Thwmax;
-  }
-
-  else if(*index == 12)
-  {
-    *parameter =  (double)(param.Rmminm);
-  }
-  else if(*index == 17)
-  {
-    *parameter =  (double)(param.Ebmup);
-  }
-
-
-
-  else
-  {
-    //log << MSG:: INFO << " Charybdis Interface -> Incorrect type cast for charybdis variable OR Incorrect index\n"  << endmsg;
-  }
-
-    
-}
-
-
-#endif
diff --git a/Generators/Charybdis_i/src/initcharybdis.F b/Generators/Charybdis_i/src/initcharybdis.F
deleted file mode 100644
index 7b6588297de5..000000000000
--- a/Generators/Charybdis_i/src/initcharybdis.F
+++ /dev/null
@@ -1,401 +0,0 @@
-CDECK  ID>, INITUSER.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Chris Harris and Peter Richardson
-C----------------------------------------------------------------------
-      SUBROUTINE INITCHARYBDIS
-C----------------------------------------------------------------------
-C     Les Houches initialisation routine
-C----------------------------------------------------------------------
-#include "Charybdis_i/charybdis1003.inc"
-      external chdata
-
-C--Les Houches run common block
-      INTEGER MAXPUP
-      PARAMETER(MAXPUP=100)
-      INTEGER IDBMUP,PDFGUP,PDFSUP,IDWTUP,NPRUP,LPRUP
-      DOUBLE PRECISION EBMUP,XSECUP,XERRUP,XMAXUP
-      COMMON /HEPRUP/ IDBMUP(2),EBMUP(2),PDFGUP(2),PDFSUP(2),
-     &                IDWTUP,NPRUP,XSECUP(MAXPUP),XERRUP(MAXPUP),
-     &                XMAXUP(MAXPUP),LPRUP(MAXPUP)
-C--event common block
-      INTEGER MAXNUP
-      PARAMETER (MAXNUP=500)
-      INTEGER NUP,IDPRUP,IDUP,ISTUP,MOTHUP,ICOLUP
-      DOUBLE PRECISION XWGTUP,SCALUP,AQEDUP,AQCDUP,PUP,VTIMUP,SPINUP
-      COMMON/HEPEUP/NUP,IDPRUP,XWGTUP,SCALUP,AQEDUP,AQCDUP,
-     &              IDUP(MAXNUP),ISTUP(MAXNUP),MOTHUP(2,MAXNUP),
-     &              ICOLUP(2,MAXNUP),PUP(5,MAXNUP),VTIMUP(MAXNUP),
-     &              SPINUP(MAXNUP)
-C--local variables
-      INTEGER NCHSRCH,I
-      DOUBLE PRECISION CHWSUM,CHWSQ,SPNZRO,SPNHLF,SPNONE,PTOTAL
-      DOUBLE PRECISION PPROBS(6,3)
-      DATA PPROBS /1.0d0, 1.0d0, 1.0d0, 1.0d0, 1.0d0, 1.0d0,
-     &     0.773d0, 0.776d0, 0.761d0, 0.743d0, 0.726d0, 0.711d0,
-     &     0.688d0, 0.827d0, 0.909d0, 0.959d0, 0.990d0, 1.011d0/
-
-C--DEV added by nick brett
-      INTEGER arg
-      INTEGER index
-C--DEV end
-
-C--parameters for the initial maximum weight search
-      DATA NCHSRCH /10000/
-C--BW mod 16/08/06: set default values in BLOCK DATA CHDATA,
-C  so that they can be reset in main program.
-C--You can still change them here instead if you want.
-C--Beam particles and energies (only proton=2212 and antiproton=-2212)
-C--N.B.for HERWIG these are overidden by the values in the main program
-      IDBMUP(1) = 2212
-      IDBMUP(2) = 2212
-C--      EBMUP(1)  = 7000.0D0
-C--      EBMUP(2)  = 7000.0D0
-C--      EBMUP(1)  = 5000.0D0
-C--      EBMUP(2)  = 5000.0D0
-      index=17
-      CALL readcharybdisparamdbl(index,EBMUP(1))
-      CALL readcharybdisparamdbl(index,EBMUP(2))
-
-
-
-C--Set MPLNCK and define what is meant by it:
-C--MSSDEF=1 means M_GT, MSSDEF=2 means M_DL and MSSDEF=3 means M_D
-C      MPLNCK=1000.0D0
-C      MSSDEF=2
-      index=1
-      CALL readcharybdisparamdbl(index,MPLNCK)      
-      index=13
-      CALL readcharybdisparamint(index,MSSDEF)
-C--Set number of dimensions (number of EXTRA dimensions is n=TOTDIM-4)
-C--TOTDIM can be in the range 6-11
-C      TOTDIM=6
-      index=2
-      CALL readcharybdisparamint(index,TOTDIM)
-C--Use Giddings+Thomas momentum scale for calling pdfs?
-C--(See page 12 of hep-ph/0106219)
-C      GTSCA=.FALSE.
-      index=14
-      CALL readcharybdisparamint(index,arg)
-      if(arg.EQ.0)then
-         GTSCA=.FALSE.
-      else
-         GTSCA=.TRUE.
-      endif
-C--Set mass window for black holes produced
-C      MINMSS=5000.0D0
-C      MAXMSS=EBMUP(1)+EBMUP(2)
-      index=3
-      CALL readcharybdisparamdbl(index,MINMSS)
-      index=4
-      CALL readcharybdisparamdbl(index,MAXMSS)
-C--Set NBODY decay of BH remnant - NBODY can be in range 2-5.
-C      NBODY=2
-      index=5
-      CALL readcharybdisparamint(index,NBODY)
-C--Turn time variation of BH Hawking temperature in decay on or off
-C      TIMVAR=.TRUE.
-      index=6
-      CALL readcharybdisparamint(index,arg)
-      if(arg.EQ.0)then
-         TIMVAR=.FALSE.
-      else
-         TIMVAR=.TRUE.
-      endif
-C--Set which decay products are to be used:
-C--MSSDEC=1 gives no heavy particles
-C--MSSDEC=2 gives t, W and Z as well
-C--MSSDEC=3 gives t, W, Z and Higgs as well  
-C      MSSDEC=3
-      index=15
-      CALL readcharybdisparamint(index,MSSDEC)
-
-C--Turn grey-body factors on/off
-C      GRYBDY=.TRUE.
-      index=7
-      CALL readcharybdisparamint(index,arg)
-      if(arg.EQ.0)then
-         GRYBDY=.FALSE.
-      else
-         GRYBDY=.TRUE.
-      endif
-C--Turn kinematic cut-off of decay on (rather than M=MPLANCK cut-off)
-C      KINCUT=.FALSE.
-      index=8
-      CALL readcharybdisparamint(index,arg)
-      if(arg.EQ.0)then
-         KINCUT=.FALSE.
-      else
-         KINCUT=.TRUE.
-      endif
-C--BW mod 16/08/06: new parameters for version 1.003
-C--Use Yoshino-Rychkov factors in cross-section
-C      YRCSEC= .FALSE.
-      index=9
-      CALL readcharybdisparamint(index,arg)
-      if(arg.EQ.0)then
-         YRCSEC=.FALSE.
-      else
-         YRCSEC=.TRUE.
-      endif
-C--Max Hawking temperature
-C      THWMAX =1000.0D0
-      index=10
-      CALL readcharybdisparamdbl(index,THWMAX)
-C--Remnant decay model: boiling at THWMAX
-C      RMBOIL = .FALSE.
-      index=11
-      CALL readcharybdisparamint(index,arg)
-      if(arg.EQ.0)then
-         RMBOIL=.FALSE.
-      else
-         RMBOIL=.TRUE.
-      endif
-C--Min BH mass, ends boiling
-C      RMMINM = 1000.D0
-      index=12
-      CALL readcharybdisparamdbl(index,RMMINM)
-C--print out option (0=no printout, 1 =errors only, 2=errors+info)
-C      IBHPRN = 1
-      index=16
-      CALL readcharybdisparamint(index,IBHPRN)
-C--pdf's for the beams (use the generator default)
-C--MUST BE THE SAME FOR BOTH BEAMS
-      PDFGUP(1) = -1
-      PDFGUP(2) = -1
-      PDFSUP(1) = -1
-      PDFSUP(2) = -1
-C--------------------------------------------------------------------
-C     END OF USER VARIABLES DON'T TOUCH ANYTHING BELOW HERE
-C--------------------------------------------------------------------
-c#if !defined(PYTHIA)
-C--HERWIG beams now passed from main program
-c      CALL HWUIDT(3,IDBMUP(1),I,PART1)
-c      CALL HWUIDT(3,IDBMUP(2),I,PART2)
-c      EBMUP(1)=PBEAM1
-c      EBMUP(2)=PBEAM2
-c#endif
-C--end mod
-C--probabilities for particles of different spin
-C--(arbitrary normalisation)
-      IF (GRYBDY) THEN
-         SPNZRO = PPROBS(TOTDIM-5,1)
-         SPNHLF = PPROBS(TOTDIM-5,2)
-         SPNONE = PPROBS(TOTDIM-5,3)
-      ELSE
-         SPNZRO = 1d0
-         SPNHLF = 0.750d0
-         SPNONE = 1d0
-      ENDIF
-C--calculation of probability of emission for different particle types
-C--only light SM particles
-      IF (MSSDEC.EQ.1) THEN
-         PTOTAL = (78.0d0*SPNHLF)+(18.0d0*SPNONE)
-         PQUARK = (60.0d0*SPNHLF)/PTOTAL
-         PLEPT  = (12.0d0*SPNHLF)/PTOTAL
-         PNEUT  = (6.0d0*SPNHLF)/PTOTAL
-         PGLUON = (16.0d0*SPNONE)/PTOTAL
-         PGAMMA = (2.0d0*SPNONE)/PTOTAL
-         PWBOSN = 0.0D0
-         PZBOSN = 0.0D0
-         PHIGGS = 0.0D0   
-C--light SM partcles + top W/Z      
-      ELSEIF (MSSDEC.EQ.2) THEN
-         PTOTAL = (3.0d0*SPNZRO)+(90.0d0*SPNHLF)+(24.0d0*SPNONE)
-         PQUARK = (72.0d0*SPNHLF)/PTOTAL
-         PLEPT  = (12.0d0*SPNHLF)/PTOTAL
-         PNEUT  = (6.0d0*SPNHLF)/PTOTAL
-         PGLUON = (16.0d0*SPNONE)/PTOTAL
-         PGAMMA = (2.0d0*SPNONE)/PTOTAL
-         PZBOSN = (SPNZRO+(2.0d0*SPNONE))/PTOTAL
-         PWBOSN = 2.0d0*PZBOSN
-         PHIGGS = 0.0D0 
-C--light SM particles +top W/Z and Higgs
-      ELSE
-         PTOTAL = (4.0d0*SPNZRO)+(90.0d0*SPNHLF)+(24.0d0*SPNONE)
-         PQUARK = (72.0d0*SPNHLF)/PTOTAL
-         PLEPT  = (12.0d0*SPNHLF)/PTOTAL
-         PNEUT  = (6.0d0*SPNHLF)/PTOTAL
-         PGLUON = (16.0d0*SPNONE)/PTOTAL
-         PGAMMA = (2.0d0*SPNONE)/PTOTAL
-         PZBOSN = (SPNZRO+(2.0d0*SPNONE))/PTOTAL
-         PWBOSN = 2.0d0*PZBOSN
-         PHIGGS = SPNZRO/PTOTAL
-      ENDIF
-C--what do do with the weights(here are generating weighted events)
-      IDWTUP = 1
-C--only one process
-      NPRUP  = 1
-C--communication code
-      LPRUP(1) = 1
-C--calculate the maximum weight
-      CHWSUM = 0.0D0
-      CHWSQ = 0.0D0
-      XMAXUP(1) = 0.0D0
-      DO I=1,NCHSRCH
-         CALL CHEVNT(.FALSE.)
-         CHWSUM = CHWSUM+XWGTUP
-         CHWSQ  = CHWSQ+XWGTUP**2
-         XMAXUP(1) = MAX(XMAXUP(1),XWGTUP)
-      ENDDO
-      CHWSUM = CHWSUM/DBLE(NCHSRCH)
-      CHWSQ  = MAX(CHWSQ/DBLE(NCHSRCH)-CHWSUM**2,0.0D0)
-      CHWSQ  = SQRT(CHWSQ/ DBLE(NCHSRCH))
-C--cross section
-      XSECUP(1) = CHWSUM
-C--error on the cross section
-      XERRUP(1) = CHWSQ
-C--output initialisation information
-C--header
-      WRITE(*,10)
-C--beam parameters
-      WRITE(*,11) IDBMUP(1),EBMUP(1),IDBMUP(2),EBMUP(2)
-C--basic parameters
-      WRITE(*,12) MINMSS,MAXMSS,MPLNCK,THWMAX,RMMINM,MSSDEF,TOTDIM,
-     &     YRCSEC,TIMVAR,GRYBDY,KINCUT,RMBOIL
-      IF (RMBOIL) THEN
-         IF (KINCUT) THEN
-            WRITE (*,8)
- 8          FORMAT(/10X,'KINEMATIC CUT INCONSISTENT'/
-     &              10X,'WITH BOILING REMNANT MODEL:'/
-     &              10X,'RESETTING KINCUT = .FALSE.'/)
-            KINCUT=.FALSE.
-         ENDIF
-      ELSE
-         IF (RMMINM.LT.MPLNCK) THEN
-            WRITE (*,9)
- 9          FORMAT(/10X,'BOILING REMNANT MODEL NOT USED:'/ 
-     &              10X,'RESETTING MIN REMNANT MASS = MPLNCK'/)
-            RMMINM=MPLNCK
-         ENDIF
-      ENDIF
-C--choice of outgoing particles
-      IF(MSSDEC.EQ.1) THEN
-         WRITE(*,13)
-      ELSEIF(MSSDEC.EQ.2) THEN
-         WRITE(*,14)
-      ELSEIF(MSSDEC.EQ.3) THEN
-         WRITE(*,15)
-      ENDIF
-C--choice of scale
-      IF(GTSCA) THEN
-         WRITE(*,17)
-      ELSE
-         WRITE(*,18)
-      ENDIF
-C--information on the cross section
-      WRITE(*,19) XSECUP(1),XERRUP(1),XMAXUP(1)
-C--particle production probabilites
-      WRITE(*,20) PQUARK,PLEPT,PNEUT,PGLUON,PGAMMA,PZBOSN,PWBOSN,PHIGGS
-      RETURN
-C--format statements for the output
- 10   FORMAT(//10X,'       CHARYBDIS 1.003   August 2006          ',//,
-     &         10X,'Please reference: C.M.Harris, P.Richardson &',/,
-     &         10X,'B.R.Webber,JHEP0308(2003)033 [hep-ph/0307305]'/)
- 11   FORMAT(/10X,'INPUT CONDITIONS FOR THIS RUN'//
-     &        10X,'BEAM 1 (',I8,') ENG. =',F10.2/
-     &        10X,'BEAM 2 (',I8,') ENG. =',F10.2/)
- 12   FORMAT(
-     &     10X,'MINIMUM BH MASS    =',F11.2/
-     &     10X,'MAXIMUM BH MASS    =',F11.2/
-     &     10X,'PLANCK MASS        =',F11.2/
-     &     10X,'MAX HAWKING TEMP   =',F11.2/
-     &     10X,'MIN REMNANT MASS   =',F11.2/
-     &     10X,'DEFN OF PLANCK MASS=',I5/
-     &     10X,'NO. OF DIMENSIONS  =',I5/
-     &     10X,'YOSHINO-RYCHKOV C-S=',L5/
-     &     10X,'TIME VARIATION     =',L5/
-     &     10X,'GREY BODY EFFECTS  =',L5/
-     &     10X,'KINEMATIC CUT      =',L5/
-     &     10X,'BOILING REMN. MODEL=',L5)
- 13   FORMAT(
-     &     10X,'ONLY LIGHT SM PARTICLES PRODUCED')
- 14   FORMAT(
-     &     10X,'ALL SM PARTICLES BUT HIGGS PRODUCED')
- 15   FORMAT(
-     &     10X,'ALL SM PARTICLES PRODUCED')
-      WRITE(*,16) NBODY
- 16   FORMAT(
-     &     10X,'PRODUCING ',I1,' PARTICLES IN REMNANT DECAY')
- 17   FORMAT(
-     &     10X,'USING BLACK HOLE RADIUS AS SCALE')
- 18   FORMAT(
-     &     10X,'USING BLACK HOLE MASS AS SCALE')
- 19   FORMAT(
-     &     10X,'CROSS SECTION (PB) =',G12.4/
-     &     10X,'ERROR IN C-S  (PB) =',G12.4/
-     &     10X,'MAXIMUM WEIGHT     =',E12.4)
- 20   FORMAT(/10X,'PARTICLE PRODUCTION PROBABILITIES'//
-     &        10X,'QUARK                  =',F10.4/
-     &        10X,'CHARGED LEPTON         =',F10.4/
-     &        10X,'NEUTRINO               =',F10.4/
-     &        10X,'GLUON                  =',F10.4/
-     &        10X,'PHOTON                 =',F10.4/
-     &        10X,'Z BOSON                =',F10.4/
-     &        10X,'W BOSON                =',F10.4/
-     &        10X,'HIGGS BOSON            =',F10.4)
-      END
-
-*DECK  ID>, CHDATA.
-*CMZ :-        -21/08/06  10.33.53  by  Peter Richardson
-*-- Author :    
-C-----------------------------------------------------------------------
-      BLOCK DATA CHDATA
-C-----------------------------------------------------------------------
-C    BLOCK DATA TO SET INITIAL VALUES OF PARAMETERS
-C-----------------------------------------------------------------------
-      IMPLICIT NONE
-#include "Charybdis_i/charybdis1003.inc"
-C--Les Houches run common block
-      INTEGER MAXPUP
-      PARAMETER(MAXPUP=100)
-      INTEGER IDBMUP,PDFGUP,PDFSUP,IDWTUP,NPRUP,LPRUP
-      DOUBLE PRECISION EBMUP,XSECUP,XERRUP,XMAXUP
-      COMMON /HEPRUP/ IDBMUP(2),EBMUP(2),PDFGUP(2),PDFSUP(2),
-     &                IDWTUP,NPRUP,XSECUP(MAXPUP),XERRUP(MAXPUP),
-     &                XMAXUP(MAXPUP),LPRUP(MAXPUP)
-C--event common block
-C--Set MPLNCK and define what is meant by it:
-C--MSSDEF=1 means M_GT, MSSDEF=2 means M_DL and MSSDEF=3 means M_D
-      DATA MPLNCK /1000.0D0/
-      DATA MSSDEF /2/
-C--Set number of dimensions (number of EXTRA dimensions is n=TOTDIM-4)
-C--TOTDIM can be in the range 6-11
-      DATA TOTDIM/6/
-C--Use Giddings+Thomas momentum scale for calling pdfs?
-C--(See page 12 of hep-ph/0106219)
-      DATA GTSCA /.FALSE./
-C--Set mass window for black holes produced
-      DATA  MINMSS /5000.0D0/
-      DATA  MAXMSS /14000.0D0/
-C--Set NBODY decay of BH remnant - NBODY can be in range 2-5.
-      DATA NBODY /2/
-C--Turn time variation of BH Hawking temperature in decay on or off
-      DATA TIMVAR /.TRUE./
-C--Set which decay products are to be used:
-C--MSSDEC=1 gives no heavy particles
-C--MSSDEC=2 gives t, W and Z as well
-C--MSSDEC=3 gives t, W, Z and Higgs as well  
-      DATA MSSDEC /3/
-C--Turn grey-body factors on/off
-      DATA GRYBDY /.TRUE./
-C--Turn kinematic cut-off of decay on (rather than M=MPLANCK cut-off)
-      DATA KINCUT /.FALSE./
-C--BW mod 16/08/06: new parameters for version 1.003
-C--Use Yoshino-Rychkov factors in cross-section
-      DATA YRCSEC /.FALSE./
-C--Max Hawking temperature
-      DATA THWMAX /1000.0D0/
-C--Remnant decay model: boiling at THWMAX
-      DATA RMBOIL /.FALSE./
-C--Min BH mass, ends boiling
-      DATA RMMINM /1000.D0/
-C--print out option (0=no printout, 1 =errors only, 2=errors+info)
-      DATA IBHPRN /1/
-C--pdf's for the beams (use the generator default)
-C--MUST BE THE SAME FOR BOTH BEAMS
-      DATA PDFGUP /-1,-1/
-      DATA PDFSUP /-1,-1/
-C--Beam particles and energies (only proton and/or antiproton)
-      DATA IDBMUP /2212,2212/
-      DATA EBMUP /7000.0D0,7000.0D0/
-      END
diff --git a/Generators/Charybdis_i/src/usecharybdis.F b/Generators/Charybdis_i/src/usecharybdis.F
deleted file mode 100644
index 53ae3e7bd5e5..000000000000
--- a/Generators/Charybdis_i/src/usecharybdis.F
+++ /dev/null
@@ -1,2083 +0,0 @@
-CDECK  ID>, USEUSER.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Chris Harris and Peter Richardson
-C----------------------------------------------------------------------
-      SUBROUTINE USECHARYBDIS
-C----------------------------------------------------------------------
-C     Les Houches event routine
-C----------------------------------------------------------------------
-      IMPLICIT NONE
-      CALL CHEVNT(.TRUE.)
-      END
-
-CDECK  ID>, CHDFIV.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Ian Knowles
-C-----------------------------------------------------------------------
-      SUBROUTINE CHDFIV(P0,P1,P2,P3,P4,P5,OKDEC)
-C-----------------------------------------------------------------------
-C     Generates 5-body decay 0->1+2+3+4+5 using pure phase space
-C     (extracted from HERWIG)
-C-----------------------------------------------------------------------
-      IMPLICIT NONE
-      DOUBLE PRECISION CHRGEN,P0(5),P1(5),P2(5),P3(5),P4(5),P5(5),B,C,
-     & AA,BB,CC,DD,EE,FF,TT,S1,RS1,GG,S2,RS2,HH,S3,PP,QQ,RR,SS,P1CM,
-     & P2345(5),P2CM,P345(5),P3CM,P45(5),P4CM
-      DOUBLE PRECISION TWO
-      INTEGER MTRY,NTRY
-      PARAMETER (MTRY=1000000)
-      PARAMETER (TWO=2.D0)
-      EXTERNAL CHRGEN
-      LOGICAL OKDEC
-      OKDEC=.FALSE.
-      B=P0(5)-P1(5)
-      C=P2(5)+P3(5)+P4(5)+P5(5)
-      IF (B.LT.C) RETURN
-      AA=(P0(5)+P1(5))**2
-      BB=B**2
-      CC=C**2
-      DD=(P3(5)+P4(5)+P5(5))**2
-      EE=(P4(5)+P5(5))**2
-      FF=(P4(5)-P5(5))**2
-      TT=(B-C)*P0(5)**11/729
-      NTRY=0
-C Select squared masses S1, S2 and S3 of 2345, 345 and 45 subsystems
-  10  S1=BB+CHRGEN(1)*(CC-BB)
-      NTRY=NTRY+1
-      IF (NTRY.GT.MTRY) RETURN
-      RS1=SQRT(S1)
-      GG=(RS1-P2(5))**2
-      S2=DD+CHRGEN(2)*(GG-DD)
-      RS2=SQRT(S2)
-      HH=(RS2-P3(5))**2
-      S3=EE+CHRGEN(3)*(HH-EE)
-      PP=(AA-S1)*(BB-S1)
-      QQ=((RS1+P2(5))**2-S2)*(GG-S2)/S1
-      RR=((RS2+P3(5))**2-S3)*(HH-S3)/S2
-      SS=(S3-EE)*(S3-FF)/S3
-      IF (PP*QQ*RR*SS*((GG-DD)*(HH-EE))**2.LT.TT*S1*S2*S3*CHRGEN(4)**2)
-     & GOTO 10
-C Do two body decays: 0-->1+2345, 2345-->2+345, 345-->3+45 and 45-->4+5
-      P1CM=SQRT(PP/4)/P0(5)
-      P2345(5)=RS1
-      P2CM=SQRT(QQ/4)
-      P345(5)=RS2
-      P3CM=SQRT(RR/4)
-      P45(5)=SQRT(S3)
-      P4CM=SQRT(SS/4)
-      CALL CHDTWO(P0   ,P1,P2345,P1CM,TWO,.TRUE.)
-      CALL CHDTWO(P2345,P2,P345 ,P2CM,TWO,.TRUE.)
-      CALL CHDTWO(P345 ,P3,P45  ,P3CM,TWO,.TRUE.)
-      CALL CHDTWO(P45  ,P4,P5   ,P4CM,TWO,.TRUE.)
-      OKDEC=.TRUE.
-      END
-CDECK  ID>, CHDFOR.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Ian Knowles
-C-----------------------------------------------------------------------
-      SUBROUTINE CHDFOR(P0,P1,P2,P3,P4,OKDEC)
-C-----------------------------------------------------------------------
-C     Generates 4-body decay 0->1+2+3+4 using pure phase space
-C     (extracted from HERWIG)
-C-----------------------------------------------------------------------
-      IMPLICIT NONE
-      DOUBLE PRECISION CHRGEN,P0(5),P1(5),P2(5),P3(5),P4(5),B,C,AA,BB,
-     & CC,DD,EE,TT,S1,RS1,FF,S2,PP,QQ,RR,P1CM,P234(5),P2CM,P34(5),P3CM
-      DOUBLE PRECISION TWO
-      INTEGER MTRY,NTRY
-      PARAMETER (MTRY=1000000)
-      PARAMETER (TWO=2.D0)
-      EXTERNAL CHRGEN
-      LOGICAL OKDEC
-      OKDEC=.FALSE.
-      B=P0(5)-P1(5)
-      C=P2(5)+P3(5)+P4(5)
-      IF (B.LT.C) RETURN
-      AA=(P0(5)+P1(5))**2
-      BB=B**2
-      CC=C**2
-      DD=(P3(5)+P4(5))**2
-      EE=(P3(5)-P4(5))**2
-      TT=(B-C)*P0(5)**7/16
-      NTRY=0
-C Select squared masses S1 and S2 of 234 and 34 subsystems
-  10  S1=BB+CHRGEN(1)*(CC-BB)
-      NTRY=NTRY+1
-      IF (NTRY.GT.MTRY) RETURN
-      RS1=SQRT(S1)
-      FF=(RS1-P2(5))**2
-      S2=DD+CHRGEN(2)*(FF-DD)
-      PP=(AA-S1)*(BB-S1)
-      QQ=((RS1+P2(5))**2-S2)*(FF-S2)/S1
-      RR=(S2-DD)*(S2-EE)/S2
-      IF (PP*QQ*RR*(FF-DD)**2.LT.TT*S1*S2*CHRGEN(3)**2) GOTO 10
-C Do two body decays: 0-->1+234, 234-->2+34 and 34-->3+4
-      P1CM=SQRT(PP/4)/P0(5)
-      P234(5)=RS1
-      P2CM=SQRT(QQ/4)
-      P34(5)=SQRT(S2)
-      P3CM=SQRT(RR/4)
-      CALL CHDTWO(P0  ,P1,P234,P1CM,TWO,.TRUE.)
-      CALL CHDTWO(P234,P2,P34 ,P2CM,TWO,.TRUE.)
-      CALL CHDTWO(P34 ,P3,P4  ,P3CM,TWO,.TRUE.)
-      OKDEC=.TRUE.
-      END
-CDECK  ID>, CHDTHR.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Bryan Webber
-C-----------------------------------------------------------------------
-      SUBROUTINE CHDTHR(P0,P1,P2,P3,OKDEC)
-C-----------------------------------------------------------------------
-C     GENERATES THREE-BODY DECAY 0->1+2+3 DISTRIBUTED
-C     ACCORDING TO PHASE SPACE * WEIGHT
-C     (extracted from HERWIG)
-C-----------------------------------------------------------------------
-      IMPLICIT NONE
-      DOUBLE PRECISION CHRGEN,CHRUNI,A,B,C,D,AA,BB,CC,DD,EE,FF,PP,QQ,WW,
-     & RR,PCM1,PC23,P0(5),P1(5),P2(5),P3(5),P23(5),TWO,ONE
-      EXTERNAL CHRGEN,CHRUNI
-      PARAMETER (ONE=1.0D0,TWO=2.D0)
-      INTEGER MTRY,NTRY
-      PARAMETER (MTRY=1000000)
-      LOGICAL OKDEC
-      OKDEC=.FALSE.
-      A=P0(5)+P1(5)
-      B=P0(5)-P1(5)
-      C=P2(5)+P3(5)
-      IF (B.LT.C) RETURN
-      D=ABS(P2(5)-P3(5))
-      AA=A*A
-      BB=B*B
-      CC=C*C
-      DD=D*D
-      EE=(B-C)*(A-D)
-      A=0.5D0*(AA+BB)
-      B=0.5D0*(CC+DD)
-      C=4.0D0/(A-B)**2
-      NTRY=0
-C
-C  CHOOSE MASS OF SUBSYSTEM 23 WITH PRESCRIBED DISTRIBUTION
-C
-   10 FF=CHRUNI(0,BB,CC)
-      NTRY=NTRY+1
-      IF (NTRY.GT.MTRY) RETURN
-      PP=(AA-FF)*(BB-FF)
-      QQ=(CC-FF)*(DD-FF)
-      WW=ONE
-      RR=EE*FF*CHRGEN(0)
-      IF (PP*QQ*WW.LT.RR*RR) GOTO 10
-C
-C  FF IS MASS SQUARED OF SUBSYSTEM 23.
-C
-C  DO 2-BODY DECAYS 0->1+23, 23->2+3
-C
-      P23(5)=SQRT(FF)
-      PCM1=SQRT(PP)*0.5D0/P0(5)
-      PC23=SQRT(QQ)*0.5D0/P23(5)
-      CALL CHDTWO(P0,P1,P23,PCM1,TWO,.TRUE.)
-      CALL CHDTWO(P23,P2,P3,PC23,TWO,.TRUE.)
-      OKDEC=.TRUE.
-      END
-CDECK  ID>, CHDTWO.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Bryan Webber & Mike Seymour
-C-----------------------------------------------------------------------
-      SUBROUTINE CHDTWO(P0,P1,P2,PCM,COSTH,ZAXIS)
-C-----------------------------------------------------------------------
-C     GENERATES DECAY 0 -> 1+2
-C
-C     PCM IS CM MOMENTUM
-C
-C     COSTH = COS THETA IN P0 REST FRAME (>1 FOR ISOTROPIC)
-C     IF ZAXIS=.TRUE., COS THETA IS MEASURED FROM THE ZAXIS
-C     IF .FALSE., IT IS MEASURED FROM P0'S DIRECTION 
-C     (extracted from HERWIG)
-C-----------------------------------------------------------------------
-      IMPLICIT NONE
-      DOUBLE PRECISION CHRUNI,ONE,ZERO,PCM,COSTH,C,S,P0(5),P1(5),P2(5),
-     & PP(5),R(9)
-      LOGICAL ZAXIS
-      EXTERNAL CHRUNI
-      PARAMETER (ZERO=0.D0, ONE=1.D0)
-C--CHOOSE C.M. ANGLES
-      C=COSTH
-      IF (C.GT.ONE) C=CHRUNI(0,-ONE,ONE)
-      S=SQRT(ONE-C*C)
-      CALL CHRAZM(PCM*S,PP(1),PP(2))
-C--PP IS MOMENTUM OF 2 IN C.M.
-      PP(3)=-PCM*C
-      PP(4)=SQRT(P2(5)**2+PCM**2)
-      PP(5)=P2(5)
-C--ROTATE IF NECESSARY
-      IF (COSTH.LE.ONE.AND..NOT.ZAXIS) THEN
-        CALL CHUROT(P0,ONE,ZERO,R)
-        CALL CHUROB(R,PP,PP)
-      ENDIF
-C--BOOST FROM C.M. TO LAB FRAME
-      CALL CHULOB(P0,PP,P2)
-      CALL CHVDIF(4,P0,P2,P1)
-      END
-CDECK  ID>, CHEVNT.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Chris Harris
-C----------------------------------------------------------------------
-      SUBROUTINE CHEVNT(GENEVT)
-C----------------------------------------------------------------------
-C     Black Hole Production and Decay
-C----------------------------------------------------------------------
-      IMPLICIT NONE
-c      INCLUDE 'charybdis1003.inc'
-#include "Charybdis_i/charybdis1003.inc"
-C--Les Houches run common block
-#include "GeneratorFortranCommon/heprup.inc"
-#include "GeneratorFortranCommon/hepeup.inc"
-C--Local Variables
-      DOUBLE PRECISION ECMS,ONE,TWO,PIFAC,THREE,ZERO,
-     &     CHRGEN,RPOW,A0,A1,EMJ,FACT,QSQ,HCS,PROB,
-     &     FACTR,RCS,BHPOW,DISF1,DISF2,OMEGAD,DL2GT,PSTEST,
-     &     RHORSQ,PLPOW,MPFACT,PA(5),PB(5),PC(5),PCM,CHUPCM,PCMF(5),
-     &     XXMIN,XLMIN,EMSCA,XX(2),DISF(13,2),GEV2PB,CHFMAS,YRF(7)
-      INTEGER STAT,IBARYN,IQRK(MAXPUP),IGLU(MAXPUP),IQBR(MAXPUP),MTRY,
-     &     NQRK,NGLU,NQBR,JQRK,JGLU,JQBR,J,ISTART,CHST,iline,FSTAT(5),
-     &     IP,IQ,PT,I,BHCHRG,IDN(2),NTRY,NHTRY,SAVCHR,SAVBRN,ID(5),
-     &     MHTRY,LTRY,LHTRY,CHFCHG,SPIN,FSPIN(5)
-      LOGICAL GENEVT,CHRLOG,FIRST,OKDEC
-      EXTERNAL CHFMAS,CHRGEN,CHUPCM,CHRLOG,CHFCHG
-      PARAMETER(ONE=1.0D0,TWO=2.0D0,THREE=3.0D0,ZERO=0.0D0,NHTRY=200)
-      PARAMETER(MHTRY=20,LHTRY=200,GEV2PB=389379.D3)
-      SAVE HCS,BHPOW,PLPOW,RPOW,A0,A1,FACT,MPFACT
-      DATA FIRST/.TRUE./
-C--BW mod 16/08/06: Yoshino-Rychkov factors for cross section,
-C  from Phys.Rev.D71:104028,2005 [hep-th/0503171]
-      DATA YRF/1.54,2.15,2.52,2.77,2.95,3.09,3.20/
-C--end mod
-      PIFAC = ACOS(-ONE)
-      IF(FIRST) THEN
-C--Convert MPLNCK to M_GT if above value is M_DL
-         IF (MSSDEF.EQ.2) THEN
-            DL2GT=(TWO**(TOTDIM-6)*PIFAC**(TOTDIM-5))**(1/(TOTDIM-TWO))
-            INTMPL=DL2GT*MPLNCK
-C--Convert MPLNCK to M_GT if above value is M_D
-         ELSEIF (MSSDEF.EQ.3) THEN
-            INTMPL=MPLNCK*TWO**(1/(TOTDIM-TWO))
-         ELSE
-            INTMPL=MPLNCK
-         ENDIF
-C--Calculate other parameters
-         PLPOW=TWO/(TOTDIM-THREE)
-         BHPOW=PLPOW-7.0D0
-         RPOW=1/BHPOW
-         A0=MINMSS**BHPOW
-         A1=(MAXMSS**BHPOW-A0)
-         IF (TOTDIM.EQ.11) THEN
-            OMEGAD=(PIFAC**5)/12
-         ELSEIF (TOTDIM.EQ.10) THEN
-            OMEGAD=(32*PIFAC**4)/105
-         ELSEIF (TOTDIM.EQ.9) THEN
-            OMEGAD=(PIFAC**4)/3
-         ELSEIF (TOTDIM.EQ.8) THEN
-            OMEGAD=(16*PIFAC**3)/15
-         ELSEIF (TOTDIM.EQ.7) THEN
-            OMEGAD=PIFAC**3
-         ELSEIF(TOTDIM.EQ.6) THEN
-            OMEGAD=(8*PIFAC**2)/3
-         ENDIF
-         MPFACT=INTMPL**(TOTDIM-2)
-         RHFACT=(4*(2*PIFAC)**(TOTDIM-4))/((TOTDIM-2)*OMEGAD*MPFACT)
-         FIRST = .FALSE.
-      ENDIF      
-C--Select a mass for the produced black hole
-      ECMS = 2.0D0*SQRT(EBMUP(1)*EBMUP(2))
-      EMSCA=(A0+A1*CHRGEN(1))**RPOW
-      BHMASS=EMSCA
-      QSQ=EMSCA**2
-      EMJ=EMSCA**(1-BHPOW)/BHPOW*A1
-C--Calculate (r_h)**2 and initial T_H
-      RHORSQ=(RHFACT*EMSCA)**PLPOW
-C--Select initial momentum fractions
-      XXMIN=QSQ/ECMS**2
-      XLMIN=LOG(XXMIN)
-      FACT=-GEV2PB*PIFAC*RHORSQ*EMJ*XLMIN*TWO/EMSCA
-C--BW mod 16/08/06: include Yoshino-Rychkov factor
-      IF (YRCSEC) FACT=FACT*YRF(TOTDIM-4)
-C--end mod
-C--Change momentum scale for calling pdfs (see comment above)
-      IF (GTSCA) EMSCA=1/SQRT(RHORSQ)
-      SCALUP = EMSCA
-      CALL CHPDF(XXMIN,XLMIN,EMSCA,XX,DISF)
-      HCS=ZERO
-      DISF1=ZERO
-      DISF2=ZERO
-      DO 30 IP=1,13
-      DISF1=DISF1+DISF(IP,1)
- 30   DISF2=DISF2+DISF(IP,2)
-      FACTR=FACT*DISF1*DISF2
-      HCS=FACTR
-      XWGTUP = HCS
-      IF(.NOT.GENEVT) RETURN
-      RCS=HCS*CHRGEN(0)
-      HCS = 0.0D0
-      DO 20 IP=1,13
-      DO 10 IQ=1,13
-      FACTR=FACT*DISF(IP,1)*DISF(IQ,2)
-      HCS=HCS+FACTR
-      IF (HCS.GT.RCS) GOTO 99
- 10   CONTINUE
- 20   CONTINUE
-C--Generate event
- 99   IDN(1)=IP
-      IDN(2)=IQ
-C--put the incoming particles in the Les Houches common block
-      NUP = 2
-      DO I=1,2
-         IF(IDN(I).GT.6.AND.IDN(I).LE.12) THEN
-            IDN(I) = -MOD(IDN(I)-1,6)-1
-         ELSEIF(IDN(I).EQ.13) THEN
-            IDN(I) = 21
-         ENDIF
-         IDUP(I) = IDN(I)
-         PUP(1,I) = 0.0D0
-         PUP(2,I) = 0.0D0
-         PUP(3,I) = XX(I)*EBMUP(I)
-         PUP(4,I) = XX(I)*EBMUP(I)
-         ISTUP(I) = -1
-      ENDDO
-      PUP(3,2) = -PUP(3,2)
-      CALL CHVSUM(4,PUP(1,1),PUP(1,2),PCMF)
-      CALL CHUMAS(PCMF)
-C--Calculate BH charge (actually 3*charge)
-      BHCHRG=CHFCHG(IDN(1))+CHFCHG(IDN(2))
-C--Black Hole decay
-      MTRY = 0
-      CHST = BHCHRG
- 35   MTRY = MTRY+1
-      BHCHRG = CHST
-      NUP = 2
-      CALL CHVEQU(5,PCMF,PA)
- 40   NUP = NUP+1
-C--BW mod 16/08/06: allow BH mass down to RMMINM
-C--Check that BH mass > RMMINM if not using KINCUT      
-      IF ((.NOT.KINCUT).AND.(PA(5).LT.RMMINM)) GOTO 55
-C--end mod
-C--Set BHMASS to correct value (necessary in time varying case)
-      IF (TIMVAR) BHMASS=PA(5)
-C--Select the decay product
-      LTRY=0
- 45   IF (MSSDEC.EQ.1) THEN
-         CALL CHHBH1(PT,STAT,SPIN,BHCHRG)
-      ELSEIF (MSSDEC.EQ.2) THEN
-         CALL CHHBH2(PT,STAT,SPIN,BHCHRG)
-      ELSE
-         CALL CHHBH3(PT,STAT,SPIN,BHCHRG)
-      ENDIF
-C--Obtain energy of emitted parton
-      CALL CHUBHS(PC(4),STAT,SPIN)
-      PC(5)=CHFMAS(PT)
-C--Check energy > mass for selected parton
-      IF (PC(4).LT.PC(5)) THEN
-         BHCHRG=BHCHRG+CHFCHG(PT)
-         IF(IBHPRN.EQ.2) WRITE (*,*) 'Not enough energy'
-         GOTO 45
-      ENDIF
-C--Check that emission is kinematically allowed
-      IF (PC(4).GT.(PA(5)**2+PC(5)**2)/(TWO*PA(5))) THEN
-         IF (KINCUT.OR.LTRY.GT.LHTRY) THEN 
-            GOTO 50
-         ELSE
-            LTRY=LTRY+1
-            BHCHRG=BHCHRG+CHFCHG(PT)
-            GOTO 45
-         ENDIF
-      ENDIF
-C--Use 2-body phase space decay 
-      PB(5)=SQRT(PA(5)**2+PC(5)**2-TWO*PA(5)*PC(4))
-C--Calculate centre of mass momentum for decay
-      PCM=SQRT(PC(4)**2-PC(5)**2)
-C--PA is BH 5-momentum before, PB after decay
-      CALL CHDTWO(PA,PB,PC,PCM,TWO,.TRUE.)
-C--Add emitted particle to event record
-      CALL CHVEQU(5,PC,PUP(1,NUP))
-      IDUP(NUP)=PT
-      ISTUP(NUP) = 1
-      MOTHUP(1,NUP) = 1
-      MOTHUP(2,NUP) = 2
-C--Change BH 5-momentum back to PA
-      CALL CHVEQU(5,PB,PA)
-      GOTO 40
- 50   BHCHRG=BHCHRG+CHFCHG(PT)
- 55   NUP = NUP-1
-C--Calculate the baryon number violation
-C--Find the baryon number of the inital state
-      IBARYN = 0
-      DO I=1,2
-        IF(ABS(IDUP(I)).LE.6) IBARYN = IBARYN-SIGN(1,IDUP(I))
-      ENDDO
-C--and the final state
-      DO I=3,NUP
-        IF(ABS(IDUP(I)).LE.6) IBARYN = IBARYN+SIGN(1,IDUP(I))
-      ENDDO
-C--Try to balance this out
-      NTRY = 0
-      SAVCHR = BHCHRG
-      SAVBRN = IBARYN
- 60   NTRY = NTRY+1
-      PCM = PA(5)
-      DO I=1,NBODY
-         IF (MSSDEC.EQ.1) THEN
-            CALL CHHBH1(ID(I),FSTAT(I),FSPIN(I),BHCHRG)
-         ELSEIF (MSSDEC.EQ.2) THEN
-            CALL CHHBH2(ID(I),FSTAT(I),FSPIN(I),BHCHRG)
-         ELSE
-            CALL CHHBH3(ID(I),FSTAT(I),FSPIN(I),BHCHRG)
-         ENDIF
-         IF(ABS(ID(I)).LE.6) THEN
-            IBARYN = IBARYN+SIGN(1,ID(I))
-         ENDIF
-         PCM = PCM-CHFMAS(ID(I))
-      ENDDO
-      IF(((IBARYN.NE.0.OR.BHCHRG.NE.0).OR.
-     &    PCM.LT.0.0D0).AND.NTRY.LE.NHTRY) THEN
-         BHCHRG = SAVCHR
-         IBARYN = SAVBRN
-         GOTO 60
-      ENDIF
-C--Go back if needed
-      IF(NTRY.GT.NHTRY) THEN
-         IF(MTRY.LE.MHTRY) THEN
-            IF(IBHPRN.EQ.2) THEN
-               WRITE (*,*) 'Attempt',MTRY,' failed.'
-               WRITE (*,*) 'Starting whole decay again'
-            ENDIF
-            GOTO 35
-         ELSE
-            IF(IBHPRN.GT.1) 
-     &           PRINT *,'WARNING TOO MANY TRIES NEEDED'
-            XWGTUP = 0.0D0
-            RETURN
-         ENDIF
-      ENDIF
-C--Perform the NBODY decay of the remnant
-C--BW mod 18/08/06: check if there is phase space
-      PSTEST=PA(5)
-      DO I=1,NBODY
-         PUP(5,NUP+I) = CHFMAS(ID(I))
-         PSTEST=PSTEST-PUP(5,NUP+I)
-         ISTUP(NUP+I) = 1
-         IDUP(NUP+I) = ID(I)
-         MOTHUP(1,NUP+I) = 1
-         MOTHUP(2,NUP+I) = 2
-      ENDDO
-C--check if decay is allowed
-      IF (PSTEST.LE.0D0) GOTO 100
-      OKDEC=.TRUE.
-C--end mod
-      IF (NBODY.EQ.2) THEN
-         PCM = CHUPCM(PA(5),PUP(5,NUP+1),PUP(5,NUP+2))
-         CALL CHDTWO(PA,PUP(1,NUP+1),PUP(1,NUP+2),PCM,TWO,.TRUE.)
-      ELSEIF (NBODY.EQ.3) THEN
-         CALL CHDTHR(PA,PUP(1,NUP+1),PUP(1,NUP+2),PUP(1,NUP+3),OKDEC)
-      ELSEIF (NBODY.EQ.4) THEN
-         CALL CHDFOR(PA,PUP(1,NUP+1),PUP(1,NUP+2),PUP(1,NUP+3),
-     &                  PUP(1,NUP+4),OKDEC)
-      ELSEIF (NBODY.EQ.5) THEN
-         CALL CHDFIV(PA,PUP(1,NUP+1),PUP(1,NUP+2),PUP(1,NUP+3),
-     &                  PUP(1,NUP+4),PUP(1,NUP+5),OKDEC)
-      ENDIF
-      IF (OKDEC) GOTO 110
- 100  IF(IBHPRN.GE.1) 
-     &     PRINT *,'FAILED',NBODY,'-BODY REMNANT DECAY: M,Q=',
-     &     PA(5),PSTEST
-      GOTO 35
- 110  NUP = NUP+NBODY
-C--Now sort out the colour connections
-C--First the initial state
-      NQRK = 0
-      NGLU = 0
-      NQBR = 0
-      DO I=1,2
-        IF(IDUP(I).GT.0.AND.IDUP(I).LE.6) THEN
-           NQBR = NQBR+1
-           IQBR(NQBR) = I
-        ELSEIF(IDUP(I).LT.0.AND.IDUP(I).GE.-6) THEN
-           NQRK = NQRK+1
-           IQRK(NQRK) = I
-        ELSEIF(IDUP(I).EQ.21) THEN
-           NGLU = NGLU+1
-           IGLU(NGLU) = I
-        ENDIF
-      ENDDO
-C--Then the final state
-      DO I=3,NUP
-        IF(IDUP(I).GT.0.AND.IDUP(I).LE.6) THEN
-           NQRK = NQRK+1
-           IQRK(NQRK) = I
-        ELSEIF(IDUP(I).LT.0.AND.IDUP(I).GE.-6) THEN
-           NQBR = NQBR+1
-           IQBR(NQBR) = I
-        ELSEIF(IDUP(I).EQ.21) THEN
-           NGLU = NGLU+1
-           IGLU(NGLU) = I
-        ENDIF
-      ENDDO
-C--zero the colour connections
-      DO I=1,NUP
-         DO J=1,2
-            ICOLUP(J,I) = 0
-         ENDDO
-      ENDDO
-C--Now make the colour connections
-      JGLU = 0
-      JQBR = 0
-      JQRK = 0
-      IF(NQRK.GT.0) THEN 
-         I = IQRK(1)
-         JQRK = 1
-         J = 1
-      ELSEIF(NGLU.GT.0) THEN
-         I = IGLU(1)
-         JGLU = 1
-         J = 2
-      ELSE
-         GOTO 200
-      ENDIF
-      ISTART = I
-      ILINE  = 500
-C--Find an antiquark or gluon to pair this with
- 150   IF(J.EQ.1.OR.J.EQ.2) THEN
-         IF(JQBR.EQ.NQBR.and.JGLU.EQ.NGLU) THEN
-            GOTO 250
-         ELSE
-            PROB = DBLE(NQBR-JQBR)/DBLE(NQBR+NGLU-JQBR-JGLU)
-C--Pair with an antiquark
-            IF(CHRLOG(PROB)) THEN
-               IF(JQBR.NE.NQBR) THEN
-                 IF(NGLU.NE.JGLU.and.NQBR-JQBR.EQ.1) GOTO 150
-                  JQBR = JQBR+1
-                  IF(I.LE.2) THEN
-                     ICOLUP(2,I         ) = ILINE
-                  ELSE
-                     ICOLUP(1,I         ) = ILINE
-                  ENDIF
-                  IF(IQBR(JQBR).LE.2) THEN
-                     ICOLUP(1,IQBR(JQBR)) = ILINE
-                  ELSE
-                     ICOLUP(2,IQBR(JQBR)) = ILINE
-                  ENDIF
-                  ILINE = ILINE+1
-                  I = IQBR(JQBR)
-                  J = 3
-                  GOTO 150
-               ELSE
-                  GOTO 250
-               ENDIF
-C--Pair with a gluon
-            ELSE
-               IF(JGLU.NE.NGLU) THEN
-                  JGLU = JGLU+1
-                  IF(I.LE.2) THEN
-                     ICOLUP(2,I         ) = ILINE 
-                  ELSE
-                     ICOLUP(1,I         ) = ILINE 
-                  ENDIF
-                  IF(IGLU(JGLU).LE.2) THEN
-                     ICOLUP(1,IGLU(JGLU)) = ILINE
-                  ELSE
-                     ICOLUP(2,IGLU(JGLU)) = ILINE
-                  ENDIF
-                  ILINE = ILINE+1
-                  I = IGLU(JGLU)
-                  J = 2
-                  GOTO 150
-               ELSE
-                  GOTO 250
-               ENDIF
-            ENDIF
-         ENDIF
-C--Find a quark to pair this with
-      ELSEIF(J.EQ.3) THEN
-         IF(JQRK.NE.NQRK) THEN
-            JQRK = JQRK+1
-            IF(I.LE.2) THEN
-               ICOLUP(2,I         ) = ILINE
-            ELSE
-               ICOLUP(1,I         ) = ILINE
-            ENDIF
-            IF(IQRK(JQRK).LE.2) THEN
-               ICOLUP(1,IQRK(JQRK)) = ILINE
-            ELSE
-               ICOLUP(2,IQRK(JQRK)) = ILINE
-            ENDIF
-            ILINE = ILINE+1
-            I = IQRK(JQRK)
-            J = 1
-            GOTO 150
-         ELSE
-            GOTO 250
-         ENDIF
-      ENDIF
- 250  IF(I.LE.2) THEN
-         ICOLUP(2,I)      = ILINE
-      ELSE
-         ICOLUP(1,I)      = ILINE
-      ENDIF
-      IF(ISTART.LE.2) THEN
-         ICOLUP(1,ISTART) = ILINE
-      ELSE
-         ICOLUP(2,ISTART) = ILINE
-      ENDIF
-C--zero the flavours
- 200  DO I=1,NUP
-         IF(IDUP(I).GT.0.AND.IDUP(I).LE.6) THEN
-            ICOLUP(2,I) = 0
-         ELSEIF(IDUP(I).GE.-6.AND.IDUP(I).lt.0) THEN
-            ICOLUP(1,I) = 0
-         ELSEIF(IDUP(I).NE.21) THEN
-            ICOLUP(1,I) = 0
-            ICOLUP(2,I) = 0
-         ENDIF
-      ENDDO
-      END
-CDECK  ID>, CHFCHG.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Peter Richardson
-C----------------------------------------------------------------------
-      FUNCTION CHFCHG(ID)
-C----------------------------------------------------------------------
-C     Function to return the charge of a SM particle input is PDG code
-C----------------------------------------------------------------------
-      IMPLICIT NONE
-      INTEGER CHFCHG,ID
-      IF(ABS(ID).LE.6) THEN
-         IF(MOD(ID,2).EQ.0) THEN
-            CHFCHG = 2
-         ELSE
-            CHFCHG = -1
-         ENDIF
-      ELSEIF(ABS(ID).GE.11.AND.ABS(ID).LE.16) THEN
-         IF(MOD(ID,2).EQ.0) THEN
-            CHFCHG = 0
-         ELSE
-            CHFCHG = -3
-         ENDIF
-      ELSEIF((ID.GE.21.AND.ID.LE.23).OR.ID.EQ.25) THEN
-         CHFCHG = 0
-      ELSEIF(ABS(ID).EQ.24) THEN
-         CHFCHG = 3
-      ELSE
-         print *,'CHFCHG WARNING UNKNOWN PARTICLE',ID
-         STOP
-      ENDIF
-      IF(ID.LT.0) CHFCHG = -CHFCHG
-      END
-CDECK  ID>, CHFMAS.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Peter Richardson
-C----------------------------------------------------------------------
-      FUNCTION CHFMAS(ID)
-C----------------------------------------------------------------------
-C     Function to return the mass of a SM particle input is PDG code
-C     This is generator dependent
-C----------------------------------------------------------------------
-C--get the masses from the HERWIG common block
-#include "HERWIG65.INC"
-      INTEGER ID
-      DOUBLE PRECISION CHFMAS
-      IF(ABS(ID).LE.6) THEN
-         CHFMAS = RMASS(ABS(ID))
-      ELSEIF(ABS(ID).GE.11.AND.ABS(ID).LE.16) THEN
-         CHFMAS = RMASS(110+ABS(ID))
-      ELSEIF(ID.EQ.21) THEN
-         CHFMAS = RMASS(13)
-      ELSEIF(ID.EQ.22) THEN
-         CHFMAS = 0.0D0
-      ELSEIF(ID.EQ.23) THEN
-         CHFMAS = RMASS(200)
-      ELSEIF(ABS(ID).EQ.24) THEN
-         CHFMAS = RMASS(198)
-      ELSEIF(ID.EQ.25) THEN
-         CHFMAS = RMASS(201)
-      ELSE
-         PRINT *,'CHFMAS WARNING UNKNOWN PARTICLE',ID
-         STOP
-      ENDIF
-      END
-CDECK  ID>, CHHBH1.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :   Chris Harris
-C---------------------------------------------------------------------
-      SUBROUTINE CHHBH1(PT,STAT,SPIN,BHCHRG)
-C---------------------------------------------------------------------
-C     Subroutine to select the type of the next particle
-C---------------------------------------------------------------------
-      IMPLICIT NONE
-#include "Charybdis_i/charybdis1003.inc"
-      INTEGER PT,STAT,SPIN,BHCHRG,CHFCHG,I
-      DOUBLE PRECISION PTYPE,CHRGEN,EPS
-      LOGICAL FIRST
-      DATA FIRST/.TRUE./
-      EXTERNAL CHRGEN,CHFCHG
-      PARAMETER(EPS=1.0D-6)
-C--initialisation on first call
-      IF(FIRST) THEN
-         PFERM (1) = PQUARK
-         PFERM (2) = PFERM(1)+PLEPT
-         PFERM (3) = PFERM(2)+PNEUT
-         PBOSON(1) = PFERM(3)+PGLUON
-         PBOSON(2) = PBOSON(1)+PGAMMA
-C--check the sum
-         IF(ABS(PBOSON(2)-1.0D0).GT.EPS) THEN
-            IF(IBHPRN.GE.1) THEN
-               print *,'WARNING PROBABILITIES DO NOT SUM TO ONE'
-               print *,'RENORMALISING'
-            ENDIF
-            DO I=1,3
-               PFERM(I) = PFERM(I)/PBOSON(2)
-            ENDDO
-            PBOSON(1) = PBOSON(1)/PBOSON(2)
-            PQUARK = PQUARK/PBOSON(2)
-            PLEPT  = PLEPT /PBOSON(2)
-            PNEUT  = PNEUT /PBOSON(2)
-            PGLUON = PGLUON/PBOSON(2)
-            PGAMMA = PGAMMA/PBOSON(2)
-            PBOSON(2) = 1.0D0
-         ENDIF
-         FIRST = .FALSE.
-      ENDIF
-C--Assume decay product is a fermion
-      STAT=-1
-      SPIN=1
-C--Choose decay product
-      PTYPE=CHRGEN(2)
-C--Change STAT to 1 and SPIN to 2 if we have a boson instead
-      IF (PTYPE.GE.PFERM(3)) THEN 
-         STAT=1
-         SPIN=2
-      ENDIF
-C--Choose particle type
-      IF (PTYPE.LT.PFERM(1)) THEN
-C--Quarks
-         PT=1+INT(5*PTYPE/PFERM(1))
-C--Ensure BH charge remains close to 0, and antiparticles half time
-         IF (((CHFCHG(PT)*BHCHRG).LT.0).OR.
-     &       ((BHCHRG.EQ.0).AND.(CHRGEN(4).LT.0.5D0))) THEN 
-            PT=-PT
-         ENDIF
-      ELSEIF (PTYPE.LT.PFERM(2)) THEN
-C--Leptons
-         PT=11+2*INT(3*(PTYPE-PFERM(1))/PLEPT)
-C--Ensure BH charge remains close to 0, and antiparticles half time
-         IF (((CHFCHG(PT)*BHCHRG).LT.0).OR.
-     &       ((BHCHRG.EQ.0).AND.(CHRGEN(4).LT.0.5D0))) THEN 
-            PT=-PT
-         ENDIF
-      ELSEIF (PTYPE.LT.PFERM(3)) THEN
-C--Neutrinos
-         PT=12+2*INT(3*(PTYPE-PFERM(2))/PNEUT)
-         IF(CHRGEN(4).LT.0.5D0) PT = -PT
-      ELSEIF (PTYPE.LT.PBOSON(1)) THEN
-C--Gluons
-         PT=21
-      ELSE
-C--Photons
-         PT=22
-      ENDIF
-C--Calculate new charge of BH
-      BHCHRG=BHCHRG-CHFCHG(PT)
-      END
-CDECK  ID>, CHHBH2.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :   Chris Harris
-C---------------------------------------------------------------------
-      SUBROUTINE CHHBH2(PT,STAT,SPIN,BHCHRG)
-C---------------------------------------------------------------------
-C     Subroutine to select the type of the next particle
-C---------------------------------------------------------------------
-      IMPLICIT NONE
-#include "Charybdis_i/charybdis1003.inc"
-      INTEGER PT,STAT,SPIN,BHCHRG,CHFCHG,I
-      DOUBLE PRECISION PTYPE,CHRGEN,EPS
-      LOGICAL FIRST
-      DATA FIRST/.TRUE./
-      EXTERNAL CHRGEN,CHFCHG
-      PARAMETER(EPS=1.0D-6)
-C--initialisation on first call
-      IF(FIRST) THEN
-         PFERM (1) = PQUARK
-         PFERM (2) = PFERM(1)+PLEPT
-         PFERM (3) = PFERM(2)+PNEUT
-         PBOSON(1) = PFERM(3)+PGLUON
-         PBOSON(2) = PBOSON(1)+PWBOSN
-         PBOSON(3) = PBOSON(2)+PZBOSN
-         PBOSON(4) = PBOSON(3)+PGAMMA
-C--check the sum
-         IF(ABS(PBOSON(4)-1.0D0).GT.EPS) THEN
-            IF(IBHPRN.GE.1) THEN
-               print *,'WARNING PROBABILITIES DO NOT SUM TO ONE'
-               print *,'RENORMALISING'
-            ENDIF
-            DO I=1,3
-               PFERM(I) = PFERM(I)/PBOSON(4)
-               PBOSON(I) = PBOSON(I)/PBOSON(4)
-            ENDDO
-            PQUARK = PQUARK/PBOSON(4)
-            PLEPT  = PLEPT /PBOSON(4)
-            PNEUT  = PNEUT /PBOSON(4)
-            PGLUON = PGLUON/PBOSON(4)
-            PGAMMA = PGAMMA/PBOSON(4)
-            PZBOSN = PZBOSN/PBOSON(4)
-            PWBOSN = PWBOSN/PBOSON(4)
-            PBOSON(4) = 1.0D0
-         ENDIF
-         FIRST = .FALSE.
-      ENDIF
-C--Assume decay product is a fermion
-      STAT=-1
-      SPIN=1
-C--Choose decay product
-      PTYPE=CHRGEN(2)
-C--Change STAT to 1 and SPIN to 2 if we have a boson instead
-C--except for one degree of freedom of massive gauge bosons
-      IF (PTYPE.GE.PFERM(3)) THEN 
-         STAT=1
-         SPIN=2
-         IF ((PTYPE.GE.PBOSON(1)).AND.(PTYPE.LT.PBOSON(3))) THEN
-            IF (3*CHRGEN(3).LT.1.0d0) SPIN=0
-         ENDIF
-      ENDIF
-C--Choose particle type
-      IF (PTYPE.LT.PFERM(1)) THEN
-C--Quarks
-         PT=1+INT(6*PTYPE/PFERM(1))
-C--Ensure BH charge remains close to 0, and antiparticles half time
-         IF (((CHFCHG(PT)*BHCHRG).LT.0).OR.
-     &       ((BHCHRG.EQ.0).AND.(CHRGEN(4).LT.0.5D0))) THEN 
-            PT=-PT
-         ENDIF
-      ELSEIF (PTYPE.LT.PFERM(2)) THEN
-C--Leptons
-         PT=11+2*INT(3*(PTYPE-PFERM(1))/PLEPT)
-C--Ensure BH charge remains close to 0, and antiparticles half time
-         IF (((CHFCHG(PT)*BHCHRG).LT.0).OR.
-     &       ((BHCHRG.EQ.0).AND.(CHRGEN(4).LT.0.5D0))) THEN 
-            PT=-PT
-         ENDIF
-      ELSEIF (PTYPE.LT.PFERM(3)) THEN
-C--Neutrinos
-         PT=12+2*INT(3*(PTYPE-PFERM(2))/PNEUT)
-         IF(CHRGEN(4).LT.0.5D0) PT = -PT
-      ELSEIF (PTYPE.LT.PBOSON(1)) THEN
-C--Gluons
-         PT=21
-      ELSEIF (PTYPE.LT.PBOSON(2)) THEN
-C--W+/W-
-         PT=24
-C--Ensure BH charge remains close to 0, and antiparticles half time
-         IF (((CHFCHG(PT)*BHCHRG).LT.0).OR.
-     &       ((BHCHRG.EQ.0).AND.(CHRGEN(4).LT.0.5D0))) THEN 
-            PT=-PT
-         ENDIF
-      ELSEIF (PTYPE.LT.PBOSON(3)) THEN
-C--Z0
-         PT=23
-      ELSE
-C--Photons
-         PT=22
-      ENDIF
-C--Calculate new charge of BH
-      BHCHRG=BHCHRG-CHFCHG(PT)
-      END
-CDECK  ID>, CHHBH3.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :   Chris Harris
-C---------------------------------------------------------------------
-      SUBROUTINE CHHBH3(PT,STAT,SPIN,BHCHRG)
-C---------------------------------------------------------------------
-C     Subroutine to select the type of the next particle
-C---------------------------------------------------------------------
-      IMPLICIT NONE
-#include "Charybdis_i/charybdis1003.inc"
-      INTEGER PT,STAT,SPIN,BHCHRG,CHFCHG,I
-      DOUBLE PRECISION PTYPE,CHRGEN,EPS
-      LOGICAL FIRST
-      DATA FIRST/.TRUE./
-      EXTERNAL CHRGEN,CHFCHG
-      PARAMETER(EPS=1.0D-6)
-C--initialisation on first call
-      IF(FIRST) THEN
-         PFERM (1) = PQUARK
-         PFERM (2) = PFERM(1)+PLEPT
-         PFERM (3) = PFERM(2)+PNEUT
-         PBOSON(1) = PFERM(3)+PGLUON
-         PBOSON(2) = PBOSON(1)+PWBOSN
-         PBOSON(3) = PBOSON(2)+PZBOSN
-         PBOSON(4) = PBOSON(3)+PHIGGS
-         PBOSON(5) = PBOSON(4)+PGAMMA
-C--check the sum
-         IF(ABS(PBOSON(5)-1.0D0).GT.EPS) THEN
-            IF(IBHPRN.GE.1) THEN
-               print *,'WARNING PROBABILITIES DO NOT SUM TO ONE'
-               print *,'RENORMALISING'
-            ENDIF
-            DO I=1,3
-               PFERM(I) = PFERM(I)/PBOSON(5)
-               PBOSON(I) = PBOSON(I)/PBOSON(5)
-            ENDDO
-            PBOSON(4) = PBOSON(4)/PBOSON(5)
-            PQUARK = PQUARK/PBOSON(5)
-            PLEPT  = PLEPT /PBOSON(5)
-            PNEUT  = PNEUT /PBOSON(5)
-            PGLUON = PGLUON/PBOSON(5)
-            PGAMMA = PGAMMA/PBOSON(5)
-            PZBOSN = PZBOSN/PBOSON(5)
-            PWBOSN = PWBOSN/PBOSON(5)
-            PHIGGS = PHIGGS/PBOSON(5)
-            PBOSON(5) = 1.0D0
-         ENDIF
-         FIRST = .FALSE.
-      ENDIF
-C--Assume decay product is a fermion
-      STAT=-1
-      SPIN=1
-C--Choose decay product
-      PTYPE=CHRGEN(2)
-C--Change STAT to 1 and SPIN to 2 if we have a boson instead
-C--except for one degree of freedom of massive gauge bosons
-      IF (PTYPE.GE.PFERM(3)) THEN
-         STAT=1
-         SPIN=2
-         IF ((PTYPE.GE.PBOSON(1)).AND.(PTYPE.LT.PBOSON(3))) THEN
-            IF (3*CHRGEN(3).LT.1.0d0) SPIN=0
-         ENDIF
-      ENDIF
-C--Choose particle type
-      IF (PTYPE.LT.PFERM(1)) THEN
-C--Quarks
-         PT=1+INT(6*PTYPE/PFERM(1))
-C--Ensure BH charge remains close to 0, and antiparticles half time
-         IF (((CHFCHG(PT)*BHCHRG).LT.0).OR.
-     &       ((BHCHRG.EQ.0).AND.(CHRGEN(4).LT.0.5D0))) THEN 
-            PT=-PT
-         ENDIF
-      ELSEIF (PTYPE.LT.PFERM(2)) THEN
-C--Leptons
-         PT=11+2*INT(3*(PTYPE-PFERM(1))/PLEPT)
-C--Ensure BH charge remains close to 0, and antiparticles half time
-         IF (((CHFCHG(PT)*BHCHRG).LT.0).OR.
-     &       ((BHCHRG.EQ.0).AND.(CHRGEN(4).LT.0.5D0))) THEN 
-            PT=-PT
-         ENDIF
-      ELSEIF (PTYPE.LT.PFERM(3)) THEN
-C--Neutrinos
-         PT=12+2*INT(3*(PTYPE-PFERM(2))/PNEUT)
-         IF(CHRGEN(4).LT.0.5D0) PT = -PT
-      ELSEIF (PTYPE.LT.PBOSON(1)) THEN
-C--Gluons
-         PT=21
-      ELSEIF (PTYPE.LT.PBOSON(2)) THEN
-C--W+/W-
-         PT=24
-C--Ensure BH charge remains close to 0, and antiparticles half time
-         IF (((CHFCHG(PT)*BHCHRG).LT.0).OR.
-     &       ((BHCHRG.EQ.0).AND.(CHRGEN(4).LT.0.5D0))) THEN 
-            PT=-PT
-         ENDIF
-      ELSEIF (PTYPE.LT.PBOSON(3)) THEN
-C--Z0
-         PT=23
-      ELSEIF (PTYPE.LT.PBOSON(4)) THEN
-C--Higgs
-         PT=25
-         SPIN=0
-      ELSE
-C--Photons
-         PT=22
-      ENDIF
-C--Calculate new charge of BH
-      BHCHRG=BHCHRG-CHFCHG(PT)
-      END
-CDECK  ID>, CHPDF.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Peter Richardson
-C----------------------------------------------------------------------
-      SUBROUTINE CHPDF(XXMINB,XLMINB,EMSCAB,XXB,DISFB)
-C----------------------------------------------------------------------
-C     Subroutine to calculate the pdfs
-C     generator dependent
-C----------------------------------------------------------------------
-#include "HERWIG65.INC"
-      DOUBLE PRECISION EMSCAB,XXB(2),DISFB(13,2),XXMINB,XLMINB,
-     &     CHRUNI,UPV,DNV,USEA,DSEA,STR,CHM,BTM,TOP,GLU
-      INTEGER IDB(2),I,J
-      CHARACTER *8 DUMMY
-      DOUBLE PRECISION VALUE(20)
-      CHARACTER*20 PARM(20)
-      LOGICAL FIRST
-      EXTERNAL CHRUNI
-      DATA VALUE/20*0D0/,PARM/20*' '/
-      DATA FIRST/.TRUE./
-C--Les Houches run common block
-#include "GeneratorFortranCommon/heprup.inc"
-C--use generator internal pdfs
-      IF(PDFGUP(1).LT.0) THEN
-C---SET UP INITIAL STATE
-         CALL HWUIDT(1,IDBMUP(1),IDB(1),DUMMY)
-         PART1=DUMMY
-         CALL HWUIDT(1,IDBMUP(2),IDB(2),DUMMY)
-         PART2=DUMMY
-         IPART1 = IDB(1)
-         IPART2 = IDB(2)
-         NHEP=1
-         ISTHEP(NHEP)=101
-         PHEP(1,NHEP)=0.0D0
-         PHEP(2,NHEP)=0.0D0
-         PHEP(3,NHEP)=EBMUP(1)
-         PHEP(4,NHEP)=EBMUP(1)
-         PHEP(5,NHEP)=RMASS(IDB(1))
-         JMOHEP(1,NHEP)=0
-         JMOHEP(2,NHEP)=0
-         JDAHEP(1,NHEP)=0
-         JDAHEP(2,NHEP)=0
-         IDHW(NHEP)=IPART1
-         IDHEP(NHEP)=IDPDG(IDB(1))
-         NHEP=NHEP+1
-         ISTHEP(NHEP)=102
-         PHEP(1,NHEP)=0.0D0
-         PHEP(2,NHEP)=0.0D0
-         PHEP(3,NHEP)=-EBMUP(2)
-         PHEP(4,NHEP)=EBMUP(2)
-         PHEP(5,NHEP)=RMASS(IDB(2))
-         JMOHEP(1,NHEP)=0
-         JMOHEP(2,NHEP)=0
-         JDAHEP(1,NHEP)=0
-         JDAHEP(2,NHEP)=0
-         IDHW(NHEP)=IPART2
-         IDHEP(NHEP)=IDPDG(IPART2)
-C---NEXT ENTRY IS OVERALL CM FRAME
-         NHEP=NHEP+1
-         IDHW(NHEP)=14
-         IDHEP(NHEP)=0
-         ISTHEP(NHEP)=103
-         JMOHEP(1,NHEP)=NHEP-2
-         JMOHEP(2,NHEP)=NHEP-1
-         JDAHEP(1,NHEP)=0
-         JDAHEP(2,NHEP)=0
-         CALL CHVSUM(4,PHEP(1,NHEP-1),PHEP(1,NHEP-2),PHEP(1,NHEP))
-         CALL CHUMAS(PHEP(1,NHEP))
-         XLMIN = XLMINB
-         EMSCA = EMSCAB
-         XXMIN = XXMINB
-         CALL HWSGEN(.TRUE.)
-         DO I=1,2
-            XXB(I) = XX(I)
-            DO J=1,13
-               DISFB(J,I) = DISF(J,I)
-            ENDDO
-         ENDDO
-      ELSE
-C--initialisation
-         IF(FIRST) THEN
-            IF(PDFGUP(1).NE.PDFGUP(2).OR.PDFSUP(1).NE.PDFSUP(2)) THEN
-               print *,'MUST HAVE SAME PDF FOR BOTH BEAMS'
-               STOP
-            ENDIF
-            PARM(1)='NPTYPE'
-            VALUE(1)=1
-            PARM(2)='NGROUP'
-            VALUE(2)=PDFGUP(1)
-            PARM(3)='NSET'
-            VALUE(3)=PDFSUP(1)
-            CALL PDFSET(PARM,VALUE)
-            FIRST = .FALSE.
-         ENDIF
-         XXB(1)=EXP(CHRUNI(0,0.0D0,XLMINB))
-         XXB(2)=XXMINB/XXB(1)
-         DO I=1,2
-            CALL STRUCTM(XXB(I),EMSCAB,
-     &           UPV,DNV,USEA,DSEA,STR,CHM,BTM,TOP,GLU)
-            DISFB( 3,I) = STR
-            DISFB( 4,I) = CHM
-            DISFB( 5,I) = BTM
-            DISFB( 6,I) = TOP
-            DISFB( 9,I) = STR
-            DISFB(10,I) = CHM
-            DISFB(11,I) = BTM
-            DISFB(12,I) = TOP
-            DISFB(13,I) = GLU
-            IF(IDBMUP(I).GT.0) THEN
-               DISFB(1,I) = DNV+DSEA
-               DISFB(2,I) = UPV+USEA
-               DISFB(7,I) = DSEA
-               DISFB(8,I) = USEA
-            ELSE
-               DISFB(1,I) = DSEA
-               DISFB(2,I) = USEA
-               DISFB(7,I) = DNV+DSEA
-               DISFB(8,I) = UPV+USEA
-            ENDIF
-         ENDDO
-      ENDIF
-      END
-CDECK  ID>, CHRAZM.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Bryan Webber
-C-----------------------------------------------------------------------
-      SUBROUTINE CHRAZM(PT,PX,PY)
-C-----------------------------------------------------------------------
-C     RANDOMLY ROTATED 2-VECTOR (PX,PY) OF LENGTH PT
-C     (taken from HERWIG)
-C-----------------------------------------------------------------------
-      IMPLICIT NONE
-      DOUBLE PRECISION CHRGEN,PT,PX,PY,C,S,CS,QT,ONE,ZERO
-      PARAMETER(ONE=1.0D0, ZERO=0.0D0)
-      EXTERNAL CHRGEN
-   10 C=2.0D0*CHRGEN(1)-1.0D0
-      S=2.0D0*CHRGEN(2)-1.0D0
-      CS=C*C+S*S
-      IF (CS.GT.ONE .OR. CS.EQ.ZERO) GOTO 10
-      QT=PT/CS
-      PX=(C*C-S*S)*QT
-      PY=2.0D0*C*S*QT
-      END
-CDECK  ID>, CHRGEN.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Peter Richardson
-C-----------------------------------------------------------------------
-      FUNCTION CHRGEN(I)
-C-----------------------------------------------------------------------
-C     random number generator (just calls HERWIG or PYTHIA one)
-C-----------------------------------------------------------------------
-      IMPLICIT NONE
-      DOUBLE PRECISION CHRGEN
-      INTEGER I
-C--use HERWIG random number generator
-      DOUBLE PRECISION HWRGEN
-      EXTERNAL HWRGEN
-      CHRGEN = HWRGEN(I)
-      END
-CDECK  ID>, CHRLOG.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Bryan Webber
-C-----------------------------------------------------------------------
-      FUNCTION CHRLOG(A)
-C-----------------------------------------------------------------------
-C     Returns .TRUE. with probability A
-C     (taken from HERWIG)
-C-----------------------------------------------------------------------
-      IMPLICIT NONE
-      DOUBLE PRECISION CHRGEN,A,R
-      LOGICAL CHRLOG
-      EXTERNAL CHRGEN
-      CHRLOG=.TRUE.
-      R=CHRGEN(0)
-      IF(R.GT.A) CHRLOG=.FALSE.
-      END
-CDECK  ID>, CHRUNI.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Bryan Webber
-C-----------------------------------------------------------------------
-      FUNCTION CHRUNI(I,A,B)
-C-----------------------------------------------------------------------
-C     Uniform random random number in range [A,B]
-C     (taken from HERWIG)
-C-----------------------------------------------------------------------
-      DOUBLE PRECISION CHRUNI,CHRGEN,A,B,RN
-      INTEGER I
-      EXTERNAL CHRGEN
-      RN=CHRGEN(I)
-      CHRUNI=A+RN*(B-A)
-      END
-CDECK  ID>, CHUBHS.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :   Chris Harris
-C---------------------------------------------------------------------
-      SUBROUTINE CHUBHS(ENERGY,STAT,SPIN)
-C---------------------------------------------------------------------
-C     Calculates energy spectrum for a black hole of given radius
-C---------------------------------------------------------------------
-      IMPLICIT NONE
-#include "Charybdis_i/charybdis1003.inc"
-      DOUBLE PRECISION ENERGY,SPCMAX,SPCVAL,RADHOR,HWKTMP,ETRAT
-      DOUBLE PRECISION MXARRY(6,3),CHRGEN,CHRUNI,CHUTAB
-      DOUBLE PRECISION FLUX(200,6,3),ETVALS(200,6)
-      INTEGER NARRAY(6),STAT,SPIN,POINTS,I
-      EXTERNAL CHRGEN,CHRUNI,CHUTAB
-      DOUBLE PRECISION ONE,TWO,THREE,ZERO,PIFAC,HALF
-      PARAMETER(ONE=1.0D0,TWO=2.0D0,THREE=3.0D0,ZERO=0.0D0,HALF=0.5D0)
-      DATA NARRAY /151,121,131,141,119,151/
-      DATA MXARRY /0.021d0,0.032d0,0.045d0,0.061d0,0.081d0,0.11d0,
-     &     0.017d0,0.026d0,0.036d0,0.045d0,0.056d0,0.068d0,
-     &     0.017d0,0.033d0,0.053d0,0.076d0,0.11d0,0.13d0/
-      DATA (ETVALS(I,1),I=1,151) /0.00837758, 0.0837758, 0.167552, 
-     &0.251327, 0.335103, 0.418879, 0.502655, 0.586431, 0.670206, 
-     &0.753982, 0.837758, 0.921534,  1.00531,  1.08909,  1.17286,  
-     &1.25664,  1.34041,  1.42419,  1.50796,  1.59174,  1.67552,  
-     &1.75929,  1.84307,  1.92684,  2.01062,   2.0944,  2.17817,  
-     &2.26195,  2.34572,   2.4295,  2.51327,  2.59705,  2.68083,   
-     &2.7646,  2.84838,  2.93215,  3.01593,   3.0997,  3.18348,  
-     &3.26726,  3.35103,  3.43481,  3.51858,  3.60236,  3.68614,  
-     &3.76991,  3.85369,  3.93746,  4.02124,  4.10501,  4.18879,  
-     &4.27257,  4.35634,  4.44012,  4.52389,  4.60767,  4.69145,  
-     &4.77522,    4.859,  4.94277,  5.02655,  5.11032,   5.1941,  
-     &5.27788,  5.36165,  5.44543,   5.5292,  5.61298,  5.69675,  
-     &5.78053,  5.86431,  5.94808,  6.03186,  6.11563,  6.19941,  
-     &6.28319,  6.36696,  6.45074,  6.53451,  6.61829,  6.70206,  
-     &6.78584,  6.86962,  6.95339,  7.03717,  7.12094,  7.20472,  
-     &7.28849,  7.37227,  7.45605,  7.53982,   7.6236,  7.70737,  
-     &7.79115,  7.87493,   7.9587,  8.04248,  8.12625,  8.21003,   
-     &8.2938,  8.37758,  8.46136,  8.54513,  8.62891,  8.71268,  
-     &8.79646,  8.88024,  8.96401,  9.04779,  9.13156,  9.21534,  
-     &9.29911,  9.38289,  9.46667,  9.55044,  9.63422,  9.71799,  
-     &9.80177,  9.88554,  9.96932,  10.0531,  10.1369,  10.2206,  
-     &10.3044,  10.3882,   10.472,  10.5558,  10.6395,  10.7233,  
-     &10.8071,  10.8909,  10.9746,  11.0584,  11.1422,   11.226,  
-     &11.3097,  11.3935,  11.4773,  11.5611,  11.6448,  11.7286,  
-     &11.8124,  11.8962,  11.9799,  12.0637,  12.1475,  12.2313,   
-     &12.315,  12.3988,  12.4826,  12.5664/
-      DATA (FLUX(I,1,1),I=1,151) /0.000302416, 0.00291566, 0.00558027, 
-     &0.00800197, 0.0101859, 0.0121371, 0.0138614, 0.015365, 0.0166554, 
-     &0.0177408, 0.0186311, 0.0193371, 0.0198712, 0.0202464, 0.0204769, 
-     &0.0205776, 0.0205633, 0.0204495, 0.0202512, 0.0199826, 0.0196575, 
-     &0.0192887, 0.0188876, 0.0184644, 0.018028, 0.017586, 0.0171441, 
-     &0.0167072, 0.0162784, 0.0158598, 0.0154524, 0.0150562, 0.0146703, 
-     &0.0142933, 0.0139233, 0.0135581, 0.0131954, 0.0128329, 0.0124687, 
-     &0.012101, 0.0117287, 0.0113511, 0.0109679, 0.0105796, 0.010187, 
-     &0.0097913, 0.00939432, 0.00899787, 0.00860399, 0.00821478, 
-     &0.00783223, 0.00745829, 0.00709462, 0.00674274, 0.00640377, 
-     &0.00607866, 0.005768, 0.00547213, 0.00519109, 0.00492474, 
-     &0.00467268, 0.00443436, 0.0042091, 0.0039961, 0.00379453, 
-     &0.0036035, 0.00342213, 0.00324959, 0.00308509, 0.00292792, 
-     &0.00277747, 0.00263322, 0.00249476, 0.00236175, 0.00223397, 
-     &0.00211127, 0.00199352, 0.0018807, 0.00177276, 0.00166969, 
-     &0.0015715, 0.00147816, 0.00138963, 0.00130586, 0.00122677, 
-     &0.00115224, 0.00108214, 0.00101631, 0.000954559, 0.000896698, 
-     &0.000842512, 0.000791779, 0.000744269, 0.000699762, 0.000658029, 
-     &0.000618861, 0.000582052, 0.000547413, 0.000514771, 0.000483972, 
-     &0.000454876, 0.000427365, 0.000401333, 0.000376696, 0.000353375, 
-     &0.000332, 0.000310443, 0.00029073, 0.000272125, 0.000254591, 
-     &0.000238088, 0.000222578, 0.000208022, 0.000194382, 0.000181617, 
-     &0.000169684, 0.0001588, 0.000148148, 0.000138454, 0.0001295,
-     &0.000121, 0.000113152, 0.000105834, 9.90067e-05, 9.26315e-05, 
-     &8.66729e-05, 8.10985e-05, 7.5878e-05, 7.0984e-05, 6.63922e-05, 
-     &6.20809e-05, 5.80306e-05, 5.42246e-05, 5.06479e-05, 4.72874e-05, 
-     &4.41314e-05, 4.11692e-05, 3.83912e-05, 3.57884e-05, 3.33521e-05, 
-     &3.10742e-05, 2.89466e-05, 2.69615e-05, 2.51111e-05, 2.33879e-05, 
-     &2.17842e-05, 2.02926e-05, 1.8906e-05, 1.76171e-05, 1.64192e-05,
-     &1.52e-05/
-      DATA (FLUX(I,1,2),I=1,151) /9.9924e-07, 9.62357e-05, 0.000370872, 
-     &0.000803897, 0.00137345, 0.0020564, 0.00283305, 0.00368963, 
-     &0.00461454, 0.00559229, 0.00660209, 0.00762302, 0.00864035, 
-     &0.00964574, 0.0106307, 0.0115808, 0.0124765, 0.0133006, 0.014044, 
-     &0.0147037, 0.0152769, 0.0157563, 0.0161325, 0.0164003, 0.0165624, 
-     &0.0166267, 0.0166009, 0.0164899, 0.0162981, 0.0160326, 0.0157045, 
-     &0.0153266, 0.0149102, 0.0144638, 0.0139948, 0.0135109, 0.0130204, 
-     &0.0125304, 0.0120465, 0.0115724, 0.0111114, 0.0106658, 0.0102376, 
-     &0.00982739, 0.00943497, 0.00905983, 0.00870158, 0.00835955, 
-     &0.0080324, 0.00771795, 0.00741412, 0.00711948, 0.00683327, 
-     &0.00655479, 0.00628292, 0.0060163, 0.00575402, 0.00549595, 
-     &0.00524262, 0.00499461, 0.00475223, 0.00451558, 0.00428494, 
-     &0.00406101, 0.00384461, 0.00363646, 0.00343697, 0.00324628, 
-     &0.00306453, 0.00289183, 0.00272826, 0.00257377, 0.00242813, 
-     &0.00229105, 0.00216213, 0.00204095, 0.00192704, 0.00181987, 
-     &0.00171899, 0.00162396, 0.00153434, 0.00144968, 0.0013695, 
-     &0.00129338, 0.00122102, 0.0011522, 0.00108673, 0.0010244, 
-     &0.000964981, 0.000908321, 0.00085433, 0.000802968, 0.000754197, 
-     &0.000707961, 0.000664175, 0.000622759, 0.000583662, 0.000546835, 
-     &0.000512222, 0.00047975, 0.000449325, 0.000420846, 0.00039421, 
-     &0.000369318, 0.000346067, 0.000324354, 0.000304076, 0.000285131, 
-     &0.000267413, 0.000250822, 0.000235264, 0.000220659, 0.000206942, 
-     &0.000194046, 0.000181911, 0.000170475, 0.00015969, 0.000149516, 
-     &0.000139925, 0.00013089, 0.000122383, 0.000114375, 0.000106842, 
-     &9.97618e-05, 9.31189e-05, 8.68953e-05, 8.10729e-05, 7.56304e-05, 
-     &7.05476e-05, 6.5805e-05, 6.13842e-05, 5.72669e-05, 5.3435e-05, 
-     &4.98696e-05, 4.65523e-05, 4.34649e-05, 4.05893e-05, 3.79096e-05, 
-     &3.54108e-05, 3.30793e-05, 3.09023e-05, 2.88673e-05, 2.69624e-05, 
-     &2.51775e-05, 2.35042e-05, 2.19355e-05, 2.04652e-05, 1.90868e-05, 
-     &1.77945e-05, 1.6583e-05, 1.54479e-05/
-      DATA (FLUX(I,1,3),I=1,151) /2.36467e-09, 2.27485e-06, 1.74831e-05,
-     &5.67478e-05, 0.000129498, 0.00024372, 0.000406154, 0.000622444, 
-     &0.000897231, 0.00123422, 0.00163621, 0.00210503, 0.00264154, 
-     &0.00324549, 0.00391542, 0.00464852, 0.00544043, 0.00628508, 
-     &0.00717462, 0.00809913, 0.00904674, 0.0100036, 0.010954, 
-     &0.0118809, 0.0127664, 0.0135921, 0.0143404, 0.014995, 0.015542, 
-     &0.0159706, 0.0162738, 0.0164486, 0.0164966, 0.0164228, 0.016236, 
-     &0.0159478, 0.0155716, 0.015122, 0.0146141, 0.0140622, 0.0134802, 
-     &0.0128807, 0.0122745, 0.011671, 0.011078, 0.0105017, 0.00994673, 
-     &0.00941661, 0.00891352, 0.00843877, 0.00799277, 0.00757527, 
-     &0.00718537, 0.00682182, 0.00648292, 0.00616677, 0.00587134, 
-     &0.00559445, 0.00533398, 0.00508784, 0.0048541, 0.00463095, 
-     &0.00441687, 0.00421054, 0.00401094, 0.00381727, 0.00362905, 
-     &0.00344597, 0.00326794, 0.003095, 0.00292736, 0.00276523, 
-     &0.0026089, 0.00245866, 0.00231475, 0.0021774, 0.00204674, 
-     &0.00192284, 0.00180574, 0.00169536, 0.00159159, 0.00149424, 
-     &0.0014031, 0.00131786, 0.00123824, 0.00116391, 0.00109451, 
-     &0.00102969, 0.000969093, 0.000912375, 0.000859198, 0.000809247, 
-     &0.000762232, 0.00071789, 0.000675986, 0.000636318, 0.000598712, 
-     &0.000563024, 0.000529139, 0.000496956, 0.000466402, 0.000437415, 
-     &0.000409939, 0.000383934, 0.000359358, 0.000336172, 0.000314336, 
-     &0.00029381, 0.000274549, 0.000256505, 0.000239628, 0.000223864, 
-     &0.000209157, 0.000195449, 0.00018268, 0.000170793, 0.000159724, 
-     &0.000149417, 0.000139815, 0.000130862, 0.000122505, 0.000114698, 
-     &0.000107393, 0.000100551, 9.41333e-05, 8.81074e-05, 8.24435e-05, 
-     &7.7117e-05, 7.21049e-05, 6.73879e-05, 6.29497e-05, 5.87753e-05, 
-     &5.48516e-05, 5.11669e-05, 4.77097e-05, 4.44701e-05, 4.14379e-05, 
-     &3.86033e-05, 3.59566e-05, 3.34882e-05, 3.11885e-05, 2.9048e-05, 
-     &2.70572e-05, 2.52068e-05, 2.34873e-05, 2.189e-05, 2.0406e-05, 
-     &1.90271e-05, 1.7745e-05, 1.65523e-05, 1.54419e-05/      
-      DATA (ETVALS(I,2),I=1,121) /0.00628319, 0.0628319, 0.125664, 
-     &0.188496, 0.251327, 0.314159, 0.376991, 0.439823, 0.502655, 
-     &0.565487, 0.628319,  0.69115, 0.753982, 0.816814, 0.879646, 
-     &0.942478,  1.00531,  1.06814,  1.13097,  1.19381,  1.25664,  
-     &1.31947,   1.3823,  1.44513,  1.50796,   1.5708,  1.63363,  
-     &1.69646,  1.75929,  1.82212,  1.88496,  1.94779,  2.01062,  
-     &2.07345,  2.13628,  2.19911,  2.26195,  2.32478,  2.38761,  
-     &2.45044,  2.51327,  2.57611,  2.63894,  2.70177,   2.7646,  
-     &2.82743,  2.89027,   2.9531,  3.01593,  3.07876,  3.14159,  
-     &3.20442,  3.26726,  3.33009,  3.39292,  3.45575,  3.51858,  
-     &3.58142,  3.64425,  3.70708,  3.76991,  3.83274,  3.89557,  
-     &3.95841,  4.02124,  4.08407,   4.1469,  4.20973,  4.27257,   
-     &4.3354,  4.39823,  4.46106,  4.52389,  4.58673,  4.64956,  
-     &4.71239,  4.77522,  4.83805,  4.90088,  4.96372,  5.02655,  
-     &5.08938,  5.15221,  5.21504,  5.27788,  5.34071,  5.40354,  
-     &5.46637,   5.5292,  5.59203,  5.65487,   5.7177,  5.78053,  
-     &5.84336,  5.90619,  5.96903,  6.03186,  6.09469,  6.15752,  
-     &6.22035,  6.28319,  6.59734,   6.9115,  7.22566,  7.53982,  
-     &7.85398,  8.16814,   8.4823,  8.79646,  9.11062,  9.42478,  
-     &9.73894,  10.0531,  10.3673,  10.6814,  10.9956,  11.3097,  
-     &11.6239,  11.9381,  12.2522,  12.5664/
-      DATA (FLUX(I,2,1),I=1,121) /0.000404009, 0.00392351, 0.00758112, 
-     &0.0109642, 0.0140671, 0.0168871, 0.019425, 0.0216845, 0.0236723, 
-     &0.0253982, 0.0268742, 0.0281145, 0.0291353, 0.0299539, 0.0305884, 
-     &0.0310576, 0.0313803, 0.0315749, 0.0316592, 0.0316499, 0.0315629, 
-     &0.0314126, 0.0312118, 0.0309721, 0.0307032, 0.0304133, 0.0301092, 
-     &0.0297962, 0.0294781, 0.0291573, 0.0288354, 0.0285125, 0.0281883, 
-     &0.0278615, 0.0275302, 0.0271924, 0.0268457, 0.0264877, 0.0261159, 
-     &0.0257285, 0.0253236,   0.0249, 0.0244569, 0.0239942, 0.0235121, 
-     &0.0230115, 0.0224938, 0.0219609, 0.0214148, 0.0208582, 0.0202936, 
-     &0.0197239, 0.019152, 0.0185805, 0.0180121, 0.0174493, 0.0168942, 
-     &0.0163489, 0.0158149, 0.0152936, 0.0147861, 0.014293, 0.0138149, 
-     &0.0133518, 0.0129037, 0.0124703, 0.0120513, 0.0116459, 0.0112534, 
-     &0.0108733, 0.0105045, 0.0101465, 0.00979838, 0.00945948, 
-     &0.0091292, 0.00880703, 0.0084925, 0.00818535, 0.0078853, 
-     &0.00759225, 0.00730615, 0.00702705, 0.006755, 0.00649014, 
-     &0.00623262, 0.00598259, 0.00574022, 0.00550565, 0.00527895, 
-     &0.00506023, 0.00484951, 0.00464678, 0.00445198, 0.00426498, 
-     &0.00408567, 0.00391383, 0.00374925, 0.00359166, 0.00344078, 
-     &0.00329631, 0.00315796, 0.0025469, 0.00204557, 0.00163075, 
-     &0.0012906, 0.00101732, 0.000801626, 0.000632102, 0.00049774, 
-     &0.000390215, 0.000304261, 0.000236379, 0.000183518, 0.000142612, 
-     &0.000110818, 8.5892e-05, 6.62998e-05, 5.10081e-05, 3.92052e-05, 
-     &3.01586e-05, 2.32131e-05/
-      DATA (FLUX(I,2,2),I=1,121) /1.26e-06, 0.000122431, 0.000476022,  
-     &0.00104, 0.00178939, 0.00269598, 0.003735, 0.00488878, 0.00614213,
-     &0.00747465, 0.0088588, 0.0102671, 0.0116812, 0.0130912, 0.0144878,
-     &0.0158537, 0.0171651, 0.018402, 0.0195553, 0.0206245, 0.0216077, 
-     &0.0224957, 0.0232756, 0.0239401, 0.0244915, 0.0249384, 0.0252869, 
-     &0.0255375, 0.0256892, 0.0257458, 0.0257172, 0.0256153, 0.0254495, 
-     &0.0252251, 0.0249472, 0.0246228, 0.0242616, 0.0238724, 0.0234616, 
-     &0.0230335, 0.0225927, 0.0221441, 0.0216922, 0.0212403, 0.0207899, 
-     &0.0203422, 0.0198992, 0.0194625, 0.0190324, 0.0186078, 0.0181871, 
-     &0.0177698, 0.0173567, 0.016948, 0.0165423, 0.0161373, 0.0157316, 
-     &0.0153252, 0.0149193, 0.0145143, 0.0141098, 0.0137047, 0.0132989, 
-     &0.0128937, 0.0124907, 0.0120913, 0.011696, 0.0113049, 0.0109185, 
-     &0.0105384, 0.0101659, 0.00980213, 0.00944741, 0.00910205, 
-     &0.00876643, 0.00844109, 0.00812641, 0.00782259, 0.00752948, 
-     &0.007247, 0.00697494, 0.00671296, 0.0064607, 0.0062176, 
-     &0.00598332, 0.00575754, 0.00553982, 0.00532963, 0.00512633, 
-     &0.00492941, 0.00473864, 0.00455387, 0.00437493, 0.00420146, 
-     &0.00403308, 0.00386959, 0.00371103, 0.00355747, 0.00340894, 
-     &0.00326531, 0.00312645, 0.0025038, 0.00199701, 0.00159259, 
-     &0.00127038, 0.0010106, 0.000799155, 0.000627867, 0.000491358, 
-     &0.000384293, 0.000300776, 0.000235218, 0.000183312, 0.000142194, 
-     &0.000109933, 8.49344e-05, 6.56842e-05, 5.08066e-05, 3.92136e-05, 
-     &3.01523e-05, 2.31118e-05/
-      DATA (FLUX(I,2,3),I=1,121) /3.71013e-09, 3.60137e-06, 2.79421e-05,
-     &9.15076e-05, 0.000210575, 0.000399441, 0.000670605, 0.0010349, 
-     &0.00150158, 0.00207833, 0.00277124, 0.00358477, 0.00452156, 
-     &0.00558228, 0.00676548, 0.00806727, 0.00948115, 0.0109977, 
-     &0.0126046, 0.0142862, 0.0160239, 0.017796, 0.0195783, 0.0213443, 
-     &0.0230663, 0.024716, 0.0262659,  0.02769, 0.0289652, 0.0300722, 
-     &0.0309962, 0.0317278, 0.0322628, 0.0326024, 0.0327526, 0.0327237, 
-     &0.0325297, 0.0321871, 0.0317142,  0.03113, 0.0304537, 0.0297042, 
-     &0.028899, 0.0280543, 0.027185, 0.0263039, 0.0254221, 0.0245488, 
-     &0.0236917, 0.0228568, 0.0220487, 0.0212707, 0.0205247, 0.0198119, 
-     &0.0191324, 0.0184857, 0.0178703, 0.0172848, 0.016727, 0.0161945, 
-     &0.0156848, 0.0151952, 0.0147233, 0.0142665, 0.0138225, 0.0133894, 
-     &0.0129653, 0.0125488, 0.0121387, 0.0117343, 0.0113352, 0.010941, 
-     &0.010552, 0.0101684, 0.00979058, 0.00941927, 0.0090551, 
-     &0.00869877, 0.00835099, 0.00801245, 0.0076837, 0.00736531, 
-     &0.00705769, 0.00676116, 0.00647592, 0.00620205, 0.00593957, 
-     &0.00568833, 0.00544816, 0.00521873, 0.00499969, 0.00479062, 
-     &0.00459105, 0.0044005, 0.00421842, 0.00404429, 0.00387761, 
-     &0.00371786, 0.00356457, 0.00341728, 0.00327558, 0.00263989, 
-     &0.00210751, 0.00166763, 0.00131391, 0.00103573, 0.000818073, 
-     &0.000645765, 0.000507411, 0.000396169, 0.000307892, 0.000239034, 
-     &0.000185837, 0.000144605, 0.000112303, 8.68411e-05, 6.68717e-05, 
-     &5.14003e-05, 3.95356e-05, 3.04482e-05, 2.3439e-05/
-      DATA (ETVALS(I,3),I=1,131) /0.00502655, 0.0502655, 0.100531, 
-     &0.150796, 0.201062, 0.251327, 0.301593, 0.351858, 0.402124, 
-     &0.452389, 0.502655,  0.55292, 0.603186, 0.653451, 0.703717, 
-     &0.753982, 0.804248, 0.854513, 0.904779, 0.955044,  1.00531,  
-     &1.05558,  1.10584,  1.15611,  1.20637,  1.25664,   1.3069,  
-     &1.35717,  1.40743,   1.4577,  1.50796,  1.55823,   1.6085,  
-     &1.65876,  1.70903,  1.75929,  1.80956,  1.85982,  1.91009,  
-     &1.96035,  2.01062,  2.06088,  2.11115,  2.16142,  2.21168,  
-     &2.26195,  2.31221,  2.36248,  2.41274,  2.46301,  2.51327,  
-     &2.56354,  2.61381,  2.66407,  2.71434,   2.7646,  2.81487,  
-     &2.86513,   2.9154,  2.96566,  3.01593,  3.06619,  3.11646,  
-     &3.16673,  3.21699,  3.26726,  3.31752,  3.36779,  3.41805,  
-     &3.46832,  3.51858,  3.56885,  3.61911,  3.66938,  3.71965,  
-     &3.76991,  3.82018,  3.87044,  3.92071,  3.97097,  4.02124,   
-     &4.0715,  4.12177,  4.17204,   4.2223,  4.27257,  4.32283,   
-     &4.3731,  4.42336,  4.47363,  4.52389,  4.57416,  4.62442,  
-     &4.67469,  4.72496,  4.77522,  4.82549,  4.87575,  4.92602,  
-     &4.97628,  5.02655,  5.27788,   5.5292,  5.78053,  6.03186,  
-     &6.28319,  6.53451,  6.78584,  7.03717,  7.28849,  7.53982,  
-     &7.79115,  8.04248,   8.2938,  8.54513,  8.79646,  9.04779,  
-     &9.29911,  9.55044,  9.80177,  10.0531,  10.3044,  10.5558,  
-     &10.8071,  11.0584,  11.3097,  11.5611,  11.8124,  12.0637,   
-     &12.315,  12.5664/
-      DATA (FLUX(I,3,1),I=1,131) /0.000505327, 0.0049346, 0.00959093, 
-     &0.0139491, 0.0179937, 0.0217143, 0.0251057, 0.0281676, 0.0309046, 
-     &0.0333259, 0.0354444, 0.0372764, 0.038841, 0.0401591, 0.0412527, 
-     &0.0421447, 0.0428579, 0.0434145, 0.0438363, 0.0441431, 0.044354, 
-     &0.0444859, 0.0445537, 0.0445708, 0.0445487, 0.0444965, 0.0444215,
-     &0.04433, 0.0442256, 0.0441111, 0.0439875, 0.0438552, 0.0437129, 
-     &0.043559, 0.043391, 0.0432061, 0.0430015, 0.042774, 0.0425203, 
-     &0.0422381, 0.0419248, 0.0415786, 0.0411982, 0.0407828, 0.0403324, 
-     &0.0398476, 0.0393294, 0.0387796, 0.0382003, 0.0375943, 0.0369644, 
-     &0.0363139, 0.0356461, 0.0349645, 0.0342726, 0.0335736, 0.0328707, 
-     &0.0321668, 0.0314647, 0.0307669, 0.0300755, 0.0293922, 0.0287185, 
-     &0.0280556, 0.0274042, 0.0267649, 0.026138, 0.0255234, 0.024921, 
-     &0.0243305, 0.0237512, 0.0231829, 0.0226246, 0.0220758, 0.0215358, 
-     &0.021004, 0.0204799, 0.019963, 0.0194529, 0.0189494, 0.0184521, 
-     &0.0179612, 0.0174766, 0.0169985, 0.0165271, 0.0160627, 0.0156055, 
-     &0.0151559, 0.0147145, 0.0142814, 0.013857, 0.0134419, 0.0130361, 
-     &0.0126401, 0.012254, 0.0118779, 0.011512, 0.0111562, 0.0108106, 
-     &0.010475, 0.0101493, 0.00866104, 0.00737802, 0.00626206, 
-     &0.00528708, 0.00444089, 0.00371704, 0.00310645, 0.00259473, 
-     &0.00216484, 0.00180149, 0.00149375, 0.00123447, 0.00101818, 
-     &0.000839256, 0.00069163, 0.000569436, 0.000467843, 0.000383349, 
-     &0.000313423, 0.000255983, 0.000209043, 0.00017069, 0.000139245, 
-     &0.000113386, 9.21391e-05, 7.47678e-05, 6.06441e-05, 4.91935e-05, 
-     &3.98982e-05, 3.23278e-05/
-      DATA (FLUX(I,3,2),I=1,131) /1.44805e-06, 0.000141467, 0.00055311, 
-     &0.00121462, 0.00209962, 0.00317696, 0.00441866, 0.00580455, 
-     &0.00731715, 0.00893248, 0.0106181, 0.0123416, 0.0140814, 0.015827,
-     &0.0175681, 0.0192849, 0.0209504, 0.0225421, 0.024051, 0.0254782, 
-     &0.0268224, 0.0280734, 0.0292158, 0.0302412, 0.0311526,  0.03196, 
-     &0.032669, 0.0332779, 0.0337827, 0.0341856, 0.0344962, 0.0347265, 
-     &0.0348843, 0.0349723, 0.0349925, 0.0349516, 0.0348587, 0.0347233, 
-     &0.0345502, 0.0343425, 0.0341041, 0.0338403, 0.033557, 0.0332574, 
-     &0.0329433, 0.0326158, 0.0322779, 0.0319328, 0.0315816, 0.0312234, 
-     &0.0308568, 0.0304819, 0.0301012, 0.0297154, 0.0293238, 0.0289232, 
-     &0.0285119, 0.0280904, 0.027661, 0.0272247, 0.0267802, 0.0263253, 
-     &0.0258593, 0.0253843, 0.0249027, 0.0244162, 0.0239244, 0.0234269, 
-     &0.0229242, 0.0224188, 0.0219133, 0.0214091, 0.0209067, 0.0204063, 
-     &0.0199091, 0.0194168, 0.0189307, 0.0184522, 0.0179811, 0.017518, 
-     &0.0170634, 0.0166178, 0.0161817, 0.0157549, 0.0153376, 0.0149296, 
-     &0.0145312, 0.0141418, 0.0137611, 0.0133886, 0.013024, 0.0126676, 
-     &0.012319, 0.0119777, 0.011643, 0.0113145, 0.0109922, 0.0106765, 
-     &0.0103672, 0.010064, 0.00976629, 0.00836625, 0.00711991, 
-     &0.00603413, 0.00510372, 0.00431049, 0.00363159, 0.00304777, 
-     &0.00254654, 0.00212009, 0.0017616, 0.00146279, 0.00121399, 
-     &0.0010058, 0.000830862, 0.00068412, 0.000561979, 0.000461173, 
-     &0.000378353, 0.000310252, 0.000254053, 0.000207585, 0.000169256, 
-     &0.000137826, 0.000112199, 9.13435e-05, 7.43267e-05, 6.03912e-05, 
-     &4.89718e-05, 3.96479e-05, 3.20759e-05/
-      DATA (FLUX(I,3,3),I=1,131) /5.0498e-09, 4.92905e-06, 3.84715e-05, 
-     &0.000126715, 0.00029321, 0.000559154, 0.000943548, 0.00146328, 
-     &0.00213315, 0.00296582, 0.00397172, 0.00515891, 0.00653277, 
-     &0.00809581, 0.00984729, 0.0117829, 0.0138944, 0.0161692, 
-     &0.0185905, 0.0211371, 0.0237826, 0.0264973, 0.0292472, 0.0319957, 
-     &0.0347041, 0.0373332, 0.0398443, 0.0422007, 0.0443696, 0.0463222, 
-     &0.0480361, 0.0494951, 0.0506894, 0.0516166,  0.05228, 0.0526887, 
-     &0.0528572, 0.0528034, 0.0525478, 0.0521132, 0.0515233, 0.0508015, 
-     &0.0499707, 0.0490532, 0.0480688, 0.0470364, 0.0459726, 0.0448917, 
-     &0.0438063, 0.0427271, 0.0416623, 0.0406194, 0.0396032, 0.0386175, 
-     &0.0376649, 0.0367467, 0.035863, 0.0350132, 0.0341959, 0.0334092, 
-     &0.0326506, 0.0319176, 0.0312069, 0.0305158, 0.0298411, 0.0291798, 
-     &0.0285297, 0.0278879, 0.0272524, 0.0266217, 0.0259942, 0.0253692, 
-     &0.024746, 0.0241244, 0.0235045, 0.022887, 0.0222723, 0.0216615, 
-     &0.0210554, 0.0204554, 0.0198626, 0.019278, 0.018703, 0.0181386, 
-     &0.0175858, 0.0170454, 0.0165183, 0.0160049, 0.0155058, 0.0150213, 
-     &0.0145514, 0.0140963, 0.0136557, 0.0132296, 0.0128175, 0.012419, 
-     &0.0120336, 0.0116609, 0.0113001, 0.0109506, 0.010612, 0.00905965,
-     &0.0077, 0.00650119, 0.00545587, 0.00456275, 0.00381295, 
-     &0.00318752, 0.00266297, 0.00221879, 0.00184112, 0.00152188, 
-     &0.00125524, 0.00103485, 0.000853342, 0.000703293, 0.000578464, 
-     &0.000474399, 0.000388042, 0.000316975, 0.000258894, 0.000211499,
-     &0.000172685, 0.000140756, 0.000114472, 9.29277e-05, 7.53814e-05, 
-     &6.11556e-05, 4.96218e-05, 4.02384e-05, 3.258e-05/
-      DATA (ETVALS(I,4),I=1,141) /0.00418879, 0.0418879, 0.0837758, 
-     &0.125664, 0.167552,  0.20944, 0.251327, 0.293215, 0.335103, 
-     &0.376991, 0.418879, 0.460767, 0.502655, 0.544543, 0.586431, 
-     &0.628319, 0.670206, 0.712094, 0.753982,  0.79587, 0.837758, 
-     &0.879646, 0.921534, 0.963422,  1.00531,   1.0472,  1.08909,  
-     &1.13097,  1.17286,  1.21475,  1.25664,  1.29852,  1.34041,   
-     &1.3823,  1.42419,  1.46608,  1.50796,  1.54985,  1.59174,  
-     &1.63363,  1.67552,   1.7174,  1.75929,  1.80118,  1.84307,  
-     &1.88496,  1.92684,  1.96873,  2.01062,  2.05251,   2.0944,  
-     &2.13628,  2.17817,  2.22006,  2.26195,  2.30383,  2.34572,  
-     &2.38761,   2.4295,  2.47139,  2.51327,  2.55516,  2.59705,  
-     &2.63894,  2.68083,  2.72271,   2.7646,  2.80649,  2.84838,  
-     &2.89027,  2.93215,  2.97404,  3.01593,  3.05782,   3.0997,  
-     &3.14159,  3.18348,  3.22537,  3.26726,  3.30914,  3.35103,  
-     &3.39292,  3.43481,   3.4767,  3.51858,  3.56047,  3.60236,  
-     &3.64425,  3.68614,  3.72802,  3.76991,   3.8118,  3.85369,  
-     &3.89557,  3.93746,  3.97935,  4.02124,  4.06313,  4.10501,   
-     &4.1469,  4.18879,  4.39823,  4.60767,  4.81711,  5.02655,  
-     &5.23599,  5.44543,  5.65487,  5.86431,  6.07375,  6.28319,  
-     &6.49262,  6.70206,   6.9115,  7.12094,  7.33038,  7.53982,  
-     &7.74926,   7.9587,  8.16814,  8.37758,  8.58702,  8.79646,   
-     &9.0059,  9.21534,  9.42478,  9.63422,  9.84366,  10.0531,  
-     &10.2625,   10.472,  10.6814,  10.8909,  11.1003,  11.3097,  
-     &11.5192,  11.7286,  11.9381,  12.1475,  12.3569,  12.5664/
-      DATA (FLUX(I,4,1),I=1,141) /0.000606647, 0.00594603, 0.0116033, 
-     &0.016942, 0.0219381, 0.0265737, 0.0308375, 0.0347254, 0.0382389, 
-     &0.0413862, 0.0441804, 0.0466395, 0.0487846, 0.0506398, 0.0522308, 
-     &0.0535844, 0.0547275, 0.0556864, 0.0564866, 0.057152, 0.0577045, 
-     &0.0581642, 0.0585486, 0.0588735, 0.0591516, 0.0593938, 0.0596084, 
-     &0.0598017, 0.0599782, 0.0601405, 0.0602892, 0.0604241, 0.0605434, 
-     &0.0606449, 0.0607249, 0.0607799, 0.0608058, 0.0607984, 0.0607539, 
-     &0.0606688, 0.0605397, 0.060364, 0.0601398, 0.0598657, 0.0595413, 
-     &0.0591669, 0.0587431, 0.0582717, 0.057755, 0.0571957, 0.0565971, 
-     &0.0559623, 0.0552955, 0.0546007, 0.0538817, 0.0531424, 0.052387, 
-     &0.0516188, 0.0508418, 0.0500589, 0.049273, 0.0484868, 0.0477025, 
-     &0.0469218, 0.0461463, 0.0453773, 0.0446153, 0.0438612, 0.0431151, 
-     &0.0423769, 0.0416466, 0.040924, 0.0402085, 0.0394994, 0.0387965, 
-     &0.0380988, 0.0374063, 0.0367179, 0.0360334, 0.0353527, 0.0346753, 
-     &0.0340011, 0.0333301, 0.0326625, 0.0319982, 0.031338, 0.030682, 
-     &0.0300307, 0.0293846, 0.0287446, 0.0281108, 0.0274843, 0.0268655, 
-     &0.0262549, 0.0256533, 0.0250609, 0.0244783, 0.023906, 0.0233442, 
-     &0.0227931, 0.0222527, 0.0197156, 0.0174381, 0.0153863, 0.0135276, 
-     &0.0118437, 0.0103304, 0.00898649, 0.00780568, 0.00677302, 
-     &0.00586881, 0.00507424, 0.00437536, 0.00376301, 0.00323036, 
-     &0.0027702, 0.00237405, 0.00203276, 0.00173797, 0.00148308, 
-     &0.00126318, 0.00107444, 0.000913232, 0.000775886, 0.000658809, 
-     &0.0005588, 0.000473283, 0.000400276, 0.000338187, 0.000285581, 
-     &0.000241095, 0.000203455, 0.000171549, 0.00014448, 0.000121544, 
-     &0.000102169, 8.58513e-05, 7.21281e-05, 6.058e-05, 5.0847e-05, 
-     &4.2637e-05/
-      DATA (FLUX(I,4,2),I=1,141) /1.58875e-06, 0.000155777, 0.000611358,
-     &0.00134723, 0.0023364, 0.00354585, 0.00494547, 0.00651345, 
-     &0.00823075, 0.0100709, 0.0119976, 0.013975, 0.0159792, 0.0179987, 
-     &0.0200228,  0.02203, 0.0239905, 0.0258797, 0.027689, 0.0294203, 
-     &0.0310734, 0.0326368, 0.0340936, 0.0354346, 0.0366637, 0.0377918, 
-     &0.0388251, 0.0397602, 0.0405913, 0.0413194, 0.0419549,  0.04251, 
-     &0.0429916, 0.0434002, 0.0437363, 0.0440055, 0.0442177, 0.0443814, 
-     &0.0445006, 0.0445768, 0.0446126, 0.0446138, 0.0445866, 0.0445339, 
-     &0.0444561, 0.0443542, 0.0442311, 0.0440908, 0.043935, 0.0437623, 
-     &0.0435705, 0.0433601, 0.043134, 0.0428947, 0.0426409, 0.0423686, 
-     &0.0420758, 0.0417632, 0.0414342, 0.0410905, 0.0407298, 0.0403491, 
-     &0.0399471, 0.0395261, 0.0390897, 0.0386397, 0.0381749, 0.0376934, 
-     &0.0371956, 0.0366852, 0.0361651, 0.0356373, 0.0351016, 0.0345574, 
-     &0.0340063, 0.033451, 0.0328941, 0.0323369, 0.0317793, 0.0312216, 
-     &0.0306655, 0.0301121, 0.0295629, 0.029018, 0.0284776, 0.0279423, 
-     &0.0274126, 0.026889, 0.0263711, 0.025859, 0.0253526, 0.0248524, 
-     &0.0243586, 0.0238707, 0.0233881, 0.0229102, 0.0224376, 0.0219708, 
-     &0.0215097, 0.0210537, 0.0206023,  0.01842, 0.0163737, 0.014485, 
-     &0.0127713, 0.0112347, 0.00986244, 0.00863503, 0.00753484, 
-     &0.00655095, 0.0056776, 0.00491003, 0.00424072, 0.00365878, 
-     &0.00315218, 0.00271025, 0.00232498, 0.00199046, 0.00170169, 
-     &0.00145362, 0.00124088, 0.00105822, 0.00090105, 0.000765812, 
-     &0.000649816, 0.000550817, 0.000466651, 0.000395186, 0.00033444, 
-     &0.000282732, 0.00023872, 0.000201334, 0.000169683, 0.000142962, 
-     &0.000120422, 0.000101383, 8.52738e-05, 7.16414e-05, 6.01294e-05, 
-     &5.04382e-05, 4.22984e-05/
-      DATA (FLUX(I,4,3),I=1,141) /6.3726e-09, 6.24338e-06, 4.89273e-05, 
-     &0.000161789, 0.000375805, 0.000719346, 0.00121828, 0.001896, 
-     &0.00277341, 0.00386878, 0.00519756, 0.00677209, 0.00860124,  
-     &0.01069, 0.0130391, 0.0156443, 0.0184961, 0.0215794, 0.024873, 
-     &0.0283496, 0.0319762, 0.0357137, 0.0395186, 0.0433433, 0.0471377, 
-     &0.0508503, 0.0544308, 0.0578313, 0.0610079, 0.0639223, 0.0665436, 
-     &0.0688485, 0.0708218, 0.0724567, 0.0737543, 0.0747229, 0.0753767, 
-     &0.0757352, 0.0758217, 0.0756625, 0.075285, 0.0747175, 0.0739879, 
-     &0.0731235, 0.0721494, 0.0710899, 0.069966, 0.0687977, 0.0676016, 
-     &0.0663924, 0.0651828, 0.0639829, 0.0628008, 0.0616432, 0.0605145, 
-     &0.0594179, 0.0583553, 0.0573268, 0.0563321, 0.0553697, 0.0544376, 
-     &0.0535328, 0.0526524, 0.0517929, 0.0509508, 0.0501227, 0.0493051, 
-     &0.0484947, 0.0476888, 0.0468848, 0.0460805, 0.0452743, 0.0444649, 
-     &0.0436515, 0.042834, 0.042012, 0.0411865, 0.0403581, 0.0395277, 
-     &0.0386968, 0.0378669, 0.0370395, 0.0362164, 0.035399, 0.0345891, 
-     &0.0337884, 0.0329982, 0.0322198, 0.0314545, 0.0307031, 0.0299666, 
-     &0.0292456, 0.0285406, 0.0278519, 0.0271795, 0.0265236, 0.0258838, 
-     &0.0252599, 0.0246516, 0.0240583, 0.0234793, 0.0207791, 0.0183468, 
-     &0.0161285, 0.0141068, 0.0122877, 0.0106782, 0.00927219, 
-     &0.00804831, 0.00697838, 0.00603684, 0.00520644, 0.00447737, 
-     &0.00384297, 0.0032956, 0.00282521, 0.00242045, 0.00207078, 
-     &0.00176801, 0.00150635, 0.00128146, 0.00108933, 0.000925749, 
-     &0.000786426, 0.00066745, 0.000565638, 0.000478595, 0.000404457, 
-     &0.000341594, 0.000288443, 0.000243503, 0.000205427, 0.000173112, 
-     &0.000145696, 0.000122502, 0.000102951, 8.65082e-05, 7.26804e-05, 
-     &6.10319e-05, 5.12045e-05, 4.29157e-05/
-      DATA (ETVALS(I,5),I=1,119) /0.00359039, 0.0359039, 0.0718078, 
-     &0.107712, 0.143616,  0.17952, 0.215423, 0.251327, 0.287231, 
-     &0.323135, 0.359039, 0.394943, 0.430847, 0.466751, 0.502655, 
-     &0.538559, 0.574463, 0.610367,  0.64627, 0.682174, 0.718078, 
-     &0.753982, 0.789886,  0.82579, 0.861694, 0.897598, 0.933502, 
-     &0.969406,  1.00531,  1.04121,  1.07712,  1.11302,  1.14893,  
-     &1.18483,  1.22073,  1.25664,  1.29254,  1.32844,  1.36435,  
-     &1.40025,  1.43616,  1.47206,  1.50796,  1.54387,  1.57977,  
-     &1.61568,  1.65158,  1.68748,  1.72339,  1.75929,   1.7952,   
-     &1.8311,    1.867,  1.90291,  1.93881,  1.97472,  2.01062,  
-     &2.04652,  2.08243,  2.11833,  2.15423,  2.33375,  2.51327,  
-     &2.69279,  2.87231,  3.05183,  3.23135,  3.41087,  3.59039,  
-     &3.76991,  3.94943,  4.12895,  4.30847,  4.48799,  4.66751,  
-     &4.84703,  5.02655,  5.20607,  5.38559,  5.56511,  5.74463,  
-     &5.92415,  6.10367,  6.28319,   6.4627,  6.64222,  6.82174,  
-     &7.00126,  7.18078,   7.3603,  7.53982,  7.71934,  7.89886,  
-     &8.07838,   8.2579,  8.43742,  8.61694,  8.79646,  8.97598,   
-     &9.1555,  9.33502,  9.51454,  9.69406,  9.87358,  10.0531,  
-     &10.2326,  10.4121,  10.5917,  10.7712,  10.9507,  11.1302,  
-     &11.3097,  11.4893,  11.6688,  11.8483,  12.0278,  12.2073,  
-     &12.3869,  12.5664/
-      DATA (FLUX(I,5,1),I=1,119) /0.000707742, 0.00696306, 0.013622, 
-     &0.0199438, 0.0258963, 0.0314543, 0.0366008, 0.0413272, 0.0456326, 
-     &0.0495235, 0.0530132, 0.0561204, 0.0588688, 0.061285, 0.0633984, 
-     &0.0652395, 0.0668391, 0.0682279, 0.0694351, 0.0704883, 0.0714134, 
-     &0.0722334, 0.0729684, 0.0736363, 0.0742525, 0.0748286, 0.0753746, 
-     &0.0758971, 0.0764006, 0.0768889, 0.0773613, 0.0778171, 0.0782538, 
-     &0.0786693, 0.0790574, 0.0794139, 0.0797338, 0.0800119, 0.0802432, 
-     &0.0804228, 0.0805463, 0.0806106, 0.0806132, 0.0805515, 0.0804249, 
-     &0.080233, 0.0799768, 0.0796578, 0.0792777, 0.0788402, 0.0783479, 
-     &0.0778052, 0.0772162, 0.0765849, 0.0759168, 0.0752153, 0.074486, 
-     &0.0737326, 0.0729594,  0.07217, 0.0713688, 0.0672747, 0.0631895, 
-     &0.0591664, 0.0551559, 0.0511155, 0.0470694, 0.0431013, 0.0393084, 
-     &0.0357573, 0.0324669, 0.0294194, 0.0266, 0.0239432, 0.0215, 
-     &0.0192369, 0.0171849, 0.0153311, 0.0136605, 0.012153, 0.0107899, 
-     &0.00955817, 0.00844947, 0.00745744, 0.00657441, 0.0057905, 
-     &0.00509428, 0.00447488, 0.00392336, 0.00345015, 0.00301986, 
-     &0.00264098, 0.00230825, 0.00201616, 0.00175951, 0.00153379, 
-     &0.00133545, 0.00116159, 0.00100965, 0.000877169, 0.000761744, 
-     &0.000661112, 0.000573298, 0.000496682, 0.000429944, 0.000371949, 
-     &0.000321654, 0.000278075, 0.000240297, 0.000207523, 0.000179083, 
-     &0.000154432, 0.000133102, 0.000114682, 9.87872e-05, 8.5069e-05, 
-     &7.3221e-05, 6.29832e-05, 5.41427e-05/
-      DATA (FLUX(I,5,2),I=1,119) /1.69752e-06, 0.000166876, 0.000656692,
-     &0.00145079, 0.0025219, 0.00383575, 0.00536073, 0.0070739, 
-     &0.00895512, 0.010976, 0.0130975, 0.0152809, 0.0175005, 0.0197445, 
-     &0.0220015, 0.0242486, 0.0264539, 0.0285917, 0.030653, 0.0326409, 
-     &0.0345556, 0.036385, 0.038111, 0.0397236, 0.0412279, 0.0426358, 
-     &0.0439534, 0.0451766, 0.0462981, 0.0473188, 0.0482497, 0.0491032, 
-     &0.0498854, 0.0505955, 0.0512329, 0.0518027, 0.0523152, 0.0527787, 
-     &0.053196, 0.053567, 0.053894, 0.0541827, 0.0544391, 0.0546662, 
-     &0.0548626, 0.0550287, 0.0551678, 0.0552839, 0.0553792, 0.0554513, 
-     &0.0554971, 0.0555166, 0.0555143, 0.0554926, 0.0554502, 0.0553821, 
-     &0.0552856, 0.055162, 0.0550154, 0.0548479, 0.0546569, 0.0532957, 
-     &0.051347, 0.0489391, 0.0462389, 0.0434023, 0.0405365, 0.0376939, 
-     &0.0348892, 0.0321298, 0.0294357, 0.026842, 0.0243855, 0.022091, 
-     &0.0199665, 0.0180056, 0.0161949, 0.0145232, 0.0129848, 0.0115789, 
-     &0.0103044, 0.00915607, 0.00812422, 0.00719702, 0.00636366, 
-     &0.00561573, 0.00494694, 0.0043518, 0.00382449, 0.00335844, 
-     &0.0029466, 0.00258226, 0.00225987, 0.00197508, 0.0017243, 
-     &0.00150417, 0.00131132, 0.00114241, 0.000994366, 0.000864575, 
-     &0.000750893, 0.000651563, 0.00056502, 0.000489769, 0.000424368, 
-     &0.00036749, 0.000318001, 0.000274961, 0.000237584, 0.000205188, 
-     &0.000177153, 0.000152904, 0.000131918, 0.000113742, 9.79971e-05, 
-     &8.43751e-05, 7.26128e-05, 6.24714e-05, 5.3733e-05/
-      DATA (FLUX(I,5,3),I=1,119) /7.67881e-09, 7.54357e-06, 5.92886e-05,
-     &0.000196611, 0.00045797, 0.000879024, 0.0014927, 0.00232918, 
-     &0.00341578, 0.00477676, 0.00643302, 0.00840168, 0.0106956, 
-     &0.0133228, 0.0162858, 0.0195811, 0.0231985, 0.0271202, 0.0313215, 
-     &0.0357694, 0.0404231, 0.0452356, 0.0501528, 0.0551159, 0.0600627,
-     &0.06493, 0.0696545, 0.0741767, 0.0784408, 0.082399, 0.086011, 
-     &0.0892462, 0.0920832, 0.0945115, 0.0965297, 0.0981441, 0.0993701, 
-     &0.100229, 0.100746,  0.10095, 0.100875, 0.100552, 0.100014, 
-     &0.0992936, 0.0984218, 0.097427, 0.0963357, 0.0951719, 0.093957, 
-     &0.0927098, 0.0914464, 0.0901803, 0.0889224, 0.0876818, 0.0864652, 
-     &0.0852772, 0.0841213, 0.0829988,  0.08191, 0.0808538, 0.0798285, 
-     &0.0750509, 0.0705011, 0.0657913, 0.0608118, 0.0557087, 0.0507283, 
-     &0.0460694, 0.0418151, 0.0379423, 0.0343766, 0.0310499, 0.0279327, 
-     &0.025033, 0.0223728, 0.0199657, 0.0178044, 0.0158648, 0.0141164, 
-     &0.0125338, 0.0111013, 0.00981121, 0.00865793, 0.00763366, 
-     &0.00672658, 0.00592251, 0.00520797, 0.00457206, 0.00400705, 
-     &0.00350824, 0.0030683, 0.00268218, 0.00234346, 0.00204591, 
-     &0.00178415, 0.00155392, 0.0013519, 0.00117523, 0.00102119, 
-     &0.000887018, 0.000770095, 0.000668061, 0.000578992, 0.000501331, 
-     &0.000433784, 0.000375185, 0.000324413, 0.000280419, 0.000242259, 
-     &0.000209136, 0.000180402, 0.00015552, 0.000134018, 0.000115463, 
-     &9.9454e-05, 8.56321e-05, 7.36885e-05, 6.33696e-05, 5.44653e-05/
-      DATA (ETVALS(I,6),I=1,151) /0.00314159, 0.0314159, 0.0628319, 
-     &0.0942478, 0.125664,  0.15708, 0.188496, 0.219911, 0.251327, 
-     &0.282743, 0.314159, 0.345575, 0.376991, 0.408407, 0.439823, 
-     &0.471239, 0.502655, 0.534071, 0.565487, 0.596903, 0.628319, 
-     &0.659734,  0.69115, 0.722566, 0.753982, 0.785398, 0.816814,  
-     &0.84823, 0.879646, 0.911062, 0.942478, 0.973894,  1.00531,  
-     &1.03673,  1.06814,  1.09956,  1.13097,  1.16239,  1.19381,  
-     &1.22522,  1.25664,  1.28805,  1.31947,  1.35088,   1.3823,  
-     &1.41372,  1.44513,  1.47655,  1.50796,  1.53938,   1.5708,  
-     &1.60221,  1.63363,  1.66504,  1.69646,  1.72788,  1.75929,  
-     &1.79071,  1.82212,  1.85354,  1.88496,  1.91637,  1.94779,   
-     &1.9792,  2.01062,  2.04204,  2.07345,  2.10487,  2.13628,   
-     &2.1677,  2.19911,  2.23053,  2.26195,  2.29336,  2.32478,  
-     &2.35619,  2.38761,  2.41903,  2.45044,  2.48186,  2.51327,  
-     &2.54469,  2.57611,  2.60752,  2.63894,  2.67035,  2.70177,  
-     &2.73319,   2.7646,  2.79602,  2.82743,  2.85885,  2.89027,  
-     &2.92168,   2.9531,  2.98451,  3.01593,  3.04734,  3.07876,  
-     &3.11018,  3.14159,  3.29867,  3.45575,  3.61283,  3.76991,  
-     &3.92699,  4.08407,  4.24115,  4.39823,  4.55531,  4.71239,  
-     &4.86947,  5.02655,  5.18363,  5.34071,  5.49779,  5.65487,  
-     &5.81195,  5.96903,  6.12611,  6.28319,  6.44026,  6.59734,  
-     &6.75442,   6.9115,  7.06858,  7.22566,  7.38274,  7.53982,   
-     &7.6969,  7.85398,  8.01106,  8.16814,  8.32522,   8.4823,  
-     &8.63938,  8.79646,  8.95354,  9.11062,   9.2677,  9.42478,  
-     &9.73894,  10.0531,  10.3673,  10.6814,  10.9956,  11.3097,  
-     &11.6239,  11.9381,  12.2522,  12.5664/
-      DATA (FLUX(I,6,1),I=1,151) /0.000809285, 0.0079693, 0.0156311, 
-     &0.022938, 0.0298497, 0.0363344, 0.0423699, 0.0479426, 0.0530494, 
-     &0.0576952, 0.0618929, 0.0656626, 0.0690295, 0.0720232, 0.0746762, 
-     &0.0770231, 0.0790985, 0.0809368, 0.0825719, 0.0840346, 0.0853549, 
-     &0.0865583, 0.0876687, 0.088706, 0.0896874, 0.0906267, 0.0915347, 
-     &0.0924189, 0.0932841, 0.0941337, 0.0949672, 0.0957836, 0.0965798, 
-     &0.0973506, 0.0980911, 0.0987955, 0.099457, 0.100069, 0.100626,  
-     &0.10112, 0.101549, 0.101906, 0.102188, 0.102393, 0.102519, 
-     &0.102566, 0.102533, 0.102423, 0.102238, 0.101979, 0.101652, 
-     &0.101261, 0.100809, 0.100302, 0.0997452, 0.0991436, 0.0985024, 
-     &0.0978265, 0.0971203, 0.0963888, 0.0956363, 0.094866, 0.0940814, 
-     &0.0932857, 0.092481, 0.0916692, 0.090853, 0.0900324, 0.0892086, 
-     &0.0883826, 0.087554, 0.0867231, 0.0858899, 0.0850532, 0.0842132, 
-     &0.0833692, 0.0825207, 0.0816667, 0.080807, 0.0799407, 0.079068, 
-     &0.0781883, 0.0773019, 0.0764082, 0.0755076, 0.0746006, 0.0736877, 
-     &0.0727694, 0.0718463, 0.0709193, 0.0699895, 0.0690574, 0.068124, 
-     &0.0671912, 0.0662592, 0.065329, 0.0644021, 0.0634791, 0.0625611, 
-     &0.061649, 0.060743, 0.0563301, 0.0521382, 0.0481676, 0.0443965, 
-     &0.0408061, 0.037396,  0.03418, 0.0311759, 0.0283927, 0.0258257, 
-     &0.0234595, 0.0212756, 0.0192593, 0.0174016, 0.0156973, 0.014142, 
-     &0.0127284, 0.0114458, 0.0102822, 0.00922554, 0.00826637, 
-     &0.00739746, 0.00661279, 0.00590658, 0.00527226, 0.00470284, 
-     &0.0041915, 0.00373215, 0.00331982, 0.00295038, 0.0026202, 
-     &0.00232572, 0.00206331, 0.00182949, 0.00162103, 0.0014352, 
-     &0.00126972, 0.00112262, 0.000992099, 0.000876413, 0.000683056, 
-     &0.000531116, 0.000412083, 0.000319294, 0.000247034, 0.000190749, 
-     &0.000147057, 0.00011326, 8.71096e-05, 6.6887e-05/
-      DATA (FLUX(I,6,2),I=1,151) /1.78396e-06, 0.000175716, 0.000692887,
-     &0.00153366, 0.0026707, 0.00406879, 0.00569523, 0.00752629, 
-     &0.00954095, 0.0117094, 0.0139905, 0.0163431, 0.0187403, 0.0211698,
-     &0.02362, 0.0260668, 0.0284768, 0.030823, 0.0330963, 0.035301, 
-     &0.0374375, 0.0394932, 0.0414492, 0.043295, 0.0450364, 0.0466863, 
-     &0.0482513, 0.0497262, 0.051103, 0.0523826, 0.053576, 0.0546968, 
-     &0.0557502, 0.0567343, 0.0576477, 0.0584957, 0.0592887, 0.0600346, 
-     &0.0607356, 0.0613902, 0.0620003, 0.0625719, 0.0631111, 0.0636198, 
-     &0.0640962, 0.0645394, 0.0649529, 0.0653413, 0.0657063, 0.0660451, 
-     &0.0663531, 0.0666306, 0.0668822, 0.0671113, 0.0673159, 0.0674904, 
-     &0.0676309, 0.0677389, 0.0678196, 0.0678756, 0.0679033, 0.0678972, 
-     &0.0678551, 0.0677799, 0.0676778, 0.0675501, 0.0673939, 0.0672048, 
-     &0.066983, 0.066733, 0.0664597, 0.0661647, 0.0658456,   0.0655, 
-     &0.0651299, 0.0647396, 0.064333, 0.0639106, 0.0634715, 0.0630148, 
-     &0.062543, 0.0620595, 0.0615657, 0.0610623, 0.0605486, 0.0600253, 
-     &0.0594937, 0.0589563, 0.0584128, 0.057863, 0.0573069, 0.0567457, 
-     &0.0561806, 0.0556118, 0.0550388, 0.0544604, 0.053878, 0.0532926, 
-     &0.0527051, 0.0521146, 0.0515202, 0.0485068, 0.0454498, 0.0423943, 
-     &0.0393923, 0.036488, 0.0337105, 0.0310715, 0.0285714, 0.0262057, 
-     &0.0239722, 0.0218738, 0.0199158, 0.018101, 0.0164264, 0.0148842, 
-     &0.0134648, 0.0121592, 0.0109605, 0.00986385, 0.00886488, 
-     &0.00795832, 0.00713765, 0.00639526, 0.0057237, 0.00511655, 
-     &0.00456864, 0.00407545, 0.00363267, 0.00323588, 0.0028806, 
-     &0.00256244, 0.00227744, 0.00202224, 0.00179408, 0.00159053, 
-     &0.00140929, 0.00124804, 0.00110459, 0.000976957, 0.000863437, 
-     &0.000673092, 0.000523742, 0.000406926, 0.000315524, 0.000244201, 
-     &0.000188768, 0.000145714, 0.000112263, 8.63566e-05, 6.6358e-05/
-      DATA (FLUX(I,6,3),I=1,151) /8.97104e-09, 8.83026e-06, 6.95537e-05,
-     &0.000231151, 0.000539569, 0.00103781, 0.00176596, 0.00276113, 
-     &0.00405724, 0.0056848, 0.00767043, 0.0100363, 0.0127997, 0.015972,
-     &0.019558, 0.0235552, 0.0279528, 0.0327314, 0.0378621, 0.0433069, 
-     &0.049018, 0.0549392, 0.0610064, 0.0671499, 0.0732951, 0.0793657, 
-     &0.0852866, 0.0909847, 0.0963937, 0.101454, 0.106117, 0.110344, 
-     &0.114107, 0.117392, 0.120194, 0.122518, 0.124381, 0.125804, 
-     &0.126815, 0.127449, 0.127742, 0.127729,  0.12745, 0.126942,  
-     &0.12624, 0.125378, 0.124389, 0.123299, 0.122136, 0.120921, 
-     &0.119676, 0.118415, 0.117153, 0.115902, 0.114669, 0.113462, 
-     &0.112286, 0.111142, 0.110031, 0.108953, 0.107906, 0.106888, 
-     &0.105894, 0.104921, 0.103964, 0.103018, 0.102079, 0.101142, 
-     &0.100203, 0.0992566, 0.0983002, 0.0973301, 0.0963441, 0.0953403, 
-     &0.094317, 0.0932737, 0.0922101, 0.0911269, 0.0900243, 0.0889043, 
-     &0.0877678, 0.0866176, 0.0854555, 0.0842843, 0.0831059, 0.0819233, 
-     &0.0807391, 0.0795555, 0.0783748, 0.0771996, 0.0760317, 0.0748732, 
-     &0.0737254, 0.0725897, 0.0714675, 0.0703598, 0.0692667, 0.0681891, 
-     &0.0671271, 0.0660808, 0.0650502, 0.0601166, 0.0554934, 0.0511039, 
-     &0.0469081, 0.0429128, 0.0391519, 0.0356579, 0.0324431, 0.0294951, 
-     &0.026786, 0.0242869, 0.0219771, 0.0198474, 0.0178946, 0.0161153, 
-     &0.0145015, 0.0130401, 0.0117155, 0.0105126, 0.00942002, 
-     &0.00842961, 0.00753512, 0.00673031, 0.00600798, 0.00536004, 
-     &0.00477832, 0.00425563, 0.00378616, 0.00336528, 0.00298896, 
-     &0.00265334, 0.00235437, 0.00208804, 0.00185062, 0.0016389, 
-     &0.00145026, 0.00128246, 0.00113351, 0.00100149, 0.000884528, 
-     &0.000688981, 0.000535337, 0.00041517, 0.000321595, 0.000248695, 
-     &0.000191937, 0.000147936, 0.000113911, 8.75761e-05, 6.72234e-05/
-      PIFAC = ACOS(-ONE)
-C     Spectrum
-      RADHOR = (RHFACT*BHMASS)**(ONE/(TOTDIM-THREE))
-      HWKTMP = (TOTDIM-THREE)/(4.0D0*PIFAC*RADHOR)
-      IF (HWKTMP.GT.THWMAX) HWKTMP=THWMAX
-      IF(GRYBDY) THEN 
-         SPCMAX=MXARRY(TOTDIM-5,SPIN+1)
-      ELSE
-         IF (STAT.EQ.-1) THEN
-            SPCMAX=HALF*HWKTMP**2
-         ELSE
-            SPCMAX=(TWO/THREE)*HWKTMP**2
-         ENDIF
-      ENDIF
-      POINTS=NARRAY(TOTDIM-5)
-C     MC for energy
- 10   ETRAT=CHRUNI(0,ZERO,ETVALS(POINTS,TOTDIM-5))
-      ENERGY=HWKTMP*ETRAT
-      IF (GRYBDY) THEN 
-          SPCVAL=CHUTAB(FLUX(1,TOTDIM-5,SPIN+1),ETVALS(1,TOTDIM-5),
-     &        POINTS,ETRAT,4)
-      ELSE
-         SPCVAL=(ENERGY**2)/(EXP(ETRAT)-STAT)
-      ENDIF
-      IF (SPCVAL.LT.SPCMAX*CHRGEN(1)) GOTO 10
-      END
-CDECK  ID>, CHULB4.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Adapted by Bryan Webber
-C-----------------------------------------------------------------------
-      SUBROUTINE CHULB4(PS,PI,PF)
-C-----------------------------------------------------------------------
-C     TRANSFORMS PI (GIVEN IN REST FRAME OF PS) INTO PF (IN LAB)
-C     N.B. P(1,2,3,4) = (PX,PY,PZ,E); PS(5)=M
-C     (taken from HERWIG)
-C-----------------------------------------------------------------------
-      IMPLICIT NONE
-      DOUBLE PRECISION PF4,FN,PS(5),PI(4),PF(4)
-      IF (PS(4).EQ.PS(5)) THEN
-        PF(1)= PI(1)
-        PF(2)= PI(2)
-        PF(3)= PI(3)
-        PF(4)= PI(4)
-      ELSE
-        PF4  = (PI(1)*PS(1)+PI(2)*PS(2)
-     &         +PI(3)*PS(3)+PI(4)*PS(4))/PS(5)
-        FN   = (PF4+PI(4)) / (PS(4)+PS(5))
-        PF(1)= PI(1) + FN*PS(1)
-        PF(2)= PI(2) + FN*PS(2)
-        PF(3)= PI(3) + FN*PS(3)
-        PF(4)= PF4
-      END IF
-      END
-CDECK  ID>, CHULOB.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Adapted by Bryan Webber
-C-----------------------------------------------------------------------
-      SUBROUTINE CHULOB(PS,PI,PF)
-C-----------------------------------------------------------------------
-C     TRANSFORMS PI (GIVEN IN REST FRAME OF PS) INTO PF (IN LAB)
-C     N.B. P(1,2,3,4,5) = (PX,PY,PZ,E,M)
-C     (taken from HERWIG)
-C-----------------------------------------------------------------------
-      IMPLICIT NONE
-      DOUBLE PRECISION PS(5),PI(5),PF(5)
-      CALL CHULB4(PS,PI,PF)
-      PF(5)= PI(5)
-      END
-CDECK  ID>, CHUMAS.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Bryan Webber
-C-----------------------------------------------------------------------
-      SUBROUTINE CHUMAS(P)
-C-----------------------------------------------------------------------
-C     PUTS INVARIANT MASS IN 5TH COMPONENT OF VECTOR
-C     (NEGATIVE SIGN IF SPACELIKE) (extracted from HERWIG)
-C-----------------------------------------------------------------------
-      IMPLICIT NONE
-      DOUBLE PRECISION CHUSQR,P(5)
-      EXTERNAL CHUSQR
-      P(5)=CHUSQR((P(4)+P(3))*(P(4)-P(3))-P(1)**2-P(2)**2)
-      END
-CDECK  ID>, CHUPCM.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Bryan Webber
-C-----------------------------------------------------------------------
-      FUNCTION CHUPCM(EM0,EM1,EM2)
-C-----------------------------------------------------------------------
-C     C.M. MOMENTUM FOR DECAY MASSES EM0 -> EM1 + EM2
-C     SET TO -1 BELOW THRESHOLD (extracted from HERWIG)
-C-----------------------------------------------------------------------
-      IMPLICIT NONE
-      DOUBLE PRECISION CHUPCM,EM0,EM1,EM2,EMS,EMD
-      EMS=ABS(EM1+EM2)
-      EMD=ABS(EM1-EM2)
-      IF (EM0.LT.EMS.OR.EM0.LT.EMD) THEN
-        CHUPCM=-1.0D0
-      ELSEIF (EM0.EQ.EMS.OR.EM0.EQ.EMD) THEN
-        CHUPCM=0.0D0
-      ELSE
-        CHUPCM=SQRT((EM0+EMD)*(EM0-EMD)*
-     &              (EM0+EMS)*(EM0-EMS))*0.5D0/EM0
-      ENDIF
-      END
-CDECK  ID>, CHUROB.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Bryan Webber
-C-----------------------------------------------------------------------
-      SUBROUTINE CHUROB(R,P,Q)
-C-----------------------------------------------------------------------
-C     ROTATES VECTORS BY INVERSE OF ROTATION MATRIX R 
-C     (taken from HERWIG)
-C-----------------------------------------------------------------------
-      IMPLICIT NONE
-      DOUBLE PRECISION S1,S2,S3,R(3,3),P(3),Q(3)
-      S1=P(1)*R(1,1)+P(2)*R(2,1)+P(3)*R(3,1)
-      S2=P(1)*R(1,2)+P(2)*R(2,2)+P(3)*R(3,2)
-      S3=P(1)*R(1,3)+P(2)*R(2,3)+P(3)*R(3,3)
-      Q(1)=S1
-      Q(2)=S2
-      Q(3)=S3
-      END
-CDECK  ID>, CHUROT.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Bryan Webber
-C-----------------------------------------------------------------------
-      SUBROUTINE CHUROT(P,CP,SP,R)
-C-----------------------------------------------------------------------
-C     R IS ROTATION MATRIX TO GET FROM VECTOR P TO Z AXIS, FOLLOWED BY
-C     A ROTATION BY PSI ABOUT Z AXIS, WHERE CP = COS-PSI, SP = SIN-PSI
-C     (extracted from HERWIG)
-C-----------------------------------------------------------------------
-      IMPLICIT NONE
-      DOUBLE PRECISION WN,CP,SP,PTCUT,PP,PT,CT,ST,CF,SF,P(3),R(3,3)
-      DATA WN,PTCUT/1.D0,1.D-20/
-      PT=P(1)**2+P(2)**2
-      PP=P(3)**2+PT
-      IF (PT.LE.PP*PTCUT) THEN
-         CT=SIGN(WN,P(3))
-         ST=0.0D0
-         CF=1.0D0
-         SF=0.0D0
-      ELSE
-         PP=SQRT(PP)
-         PT=SQRT(PT)
-         CT=P(3)/PP
-         ST=PT/PP
-         CF=P(1)/PT
-         SF=P(2)/PT
-      END IF
-      R(1,1)= CP*CF*CT+SP*SF
-      R(1,2)= CP*SF*CT-SP*CF
-      R(1,3)=-CP*ST
-      R(2,1)=-CP*SF+SP*CF*CT
-      R(2,2)= CP*CF+SP*SF*CT
-      R(2,3)=-SP*ST
-      R(3,1)= CF*ST
-      R(3,2)= SF*ST
-      R(3,3)= CT
-      END
-CDECK  ID>, CHUSQR.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Bryan Webber
-C-----------------------------------------------------------------------
-      FUNCTION CHUSQR(X)
-C-----------------------------------------------------------------------
-C     SQUARE ROOT WITH SIGN RETENTION (extracted from HERWIG)
-C-----------------------------------------------------------------------
-      IMPLICIT NONE
-      DOUBLE PRECISION CHUSQR,X
-      CHUSQR=SIGN(SQRT(ABS(X)),X)
-      END
-CDECK  ID>, CHUTAB.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Adapted by Bryan Webber
-C-----------------------------------------------------------------------
-      FUNCTION CHUTAB(F,A,NN,X,MM)
-C-----------------------------------------------------------------------
-C     MODIFIED CERN INTERPOLATION ROUTINE DIVDIF
-C-----------------------------------------------------------------------
-      IMPLICIT NONE
-      INTEGER NN,MM,MMAX,N,M,MPLUS,IX,IY,MID,NPTS,IP,I,J,L,ISUB
-      DOUBLE PRECISION CHUTAB,SUM,X,F(NN),A(NN),T(20),D(20)
-      LOGICAL EXTRA
-      DATA MMAX/10/
-      N=NN
-      M=MIN(MM,MMAX,N-1)
-      MPLUS=M+1
-      IX=0
-      IY=N+1
-      IF (A(1).GT.A(N)) GOTO 4
-    1 MID=(IX+IY)/2
-      IF (X.GE.A(MID)) GOTO 2
-      IY=MID
-      GOTO 3
-    2 IX=MID
-    3 IF (IY-IX.GT.1) GOTO 1
-      GOTO 7
-    4 MID=(IX+IY)/2
-      IF (X.LE.A(MID)) GOTO 5
-      IY=MID
-      GOTO 6
-    5 IX=MID
-    6 IF (IY-IX.GT.1) GOTO 4
-    7 NPTS=M+2-MOD(M,2)
-      IP=0
-      L=0
-      GOTO 9
-    8 L=-L
-      IF (L.GE.0) L=L+1
-    9 ISUB=IX+L
-      IF ((1.LE.ISUB).AND.(ISUB.LE.N)) GOTO 10
-      NPTS=MPLUS
-      GOTO 11
-   10 IP=IP+1
-      T(IP)=A(ISUB)
-      D(IP)=F(ISUB)
-   11 IF (IP.LT.NPTS) GOTO 8
-      EXTRA=NPTS.NE.MPLUS
-      DO 14 L=1,M
-      IF (.NOT.EXTRA) GOTO 12
-      ISUB=MPLUS-L
-      D(M+2)=(D(M+2)-D(M))/(T(M+2)-T(ISUB))
-   12 I=MPLUS
-      DO 13 J=L,M
-      ISUB=I-L
-      D(I)=(D(I)-D(I-1))/(T(I)-T(ISUB))
-      I=I-1
-   13 CONTINUE
-   14 CONTINUE
-      SUM=D(MPLUS)
-      IF (EXTRA) SUM=0.5D0*(SUM+D(M+2))
-      J=M
-      DO 15 L=1,M
-      SUM=D(J)+(X-T(J))*SUM
-      J=J-1
-   15 CONTINUE
-      CHUTAB=SUM
-      END
-CDECK  ID>, CHVDIF.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Bryan Webber
-C-----------------------------------------------------------------------
-      SUBROUTINE CHVDIF(N,P,Q,R)
-C-----------------------------------------------------------------------
-C     VECTOR DIFFERENCE (extracted from HERWIG)
-C-----------------------------------------------------------------------
-      DOUBLE PRECISION P(N),Q(N),R(N)
-      INTEGER N,I
-      DO 10 I=1,N
-   10 R(I)=P(I)-Q(I)
-      END
-CDECK  ID>, CHVEQU.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Bryan Webber
-C-----------------------------------------------------------------------
-      SUBROUTINE CHVEQU(N,P,Q)
-C-----------------------------------------------------------------------
-C     VECTOR EQUALITY (extracted from HERWIG)
-C-----------------------------------------------------------------------
-      DOUBLE PRECISION P(N),Q(N)
-      INTEGER N,I
-      DO 10 I=1,N
-   10 Q(I)=P(I)
-      END
-CDECK  ID>, CHVSUM.
-*CMZ :-        -17/07/03  18.11.30  by  Peter Richardson
-*-- Author :    Bryan Webber
-C-----------------------------------------------------------------------
-      SUBROUTINE CHVSUM(N,P,Q,R)
-C-----------------------------------------------------------------------
-C    VECTOR SUM (extracted from HERWIG)
-C-----------------------------------------------------------------------
-      DOUBLE PRECISION P(N),Q(N),R(N)
-      DO 10 I=1,N
-   10 R(I)=P(I)+Q(I)
-      END
diff --git a/Projects/AthGeneration/package_filters.txt b/Projects/AthGeneration/package_filters.txt
index bf3abe287df1..aebd621cc191 100644
--- a/Projects/AthGeneration/package_filters.txt
+++ b/Projects/AthGeneration/package_filters.txt
@@ -152,7 +152,6 @@
 + Event/xAOD/xAODTruthCnv
 + External/AtlasDataArea
 + External/Pythia8
-+ Generators/Charybdis_i
 - Generators/TrackRecordGenerator
 + Generators/.*
 + InnerDetector/InDetExample/InDetRecExample
-- 
GitLab


From 4289993f1430459516a5f24e8152f08f0dfbc9e9 Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <frank.winklmeier@cern.ch>
Date: Thu, 17 Dec 2020 09:25:24 +0000
Subject: [PATCH 108/225] PileUpEventLoopMgr: remove setProperties call

Calling `setProperties` is deprecated and properties are being set
already in the base class `sysInitialize` method. So there is no need
for this call.
---
 .../AthExHive/src/loopTest/HiveAlgL1.cxx      |  6 +-----
 .../AthenaServices/src/LoggedMessageSvc.cxx   |  7 +------
 .../PileUpComps/src/PileUpEventLoopMgr.cxx    | 16 +--------------
 .../src/McAsciiCnvSvc.cxx                     |  3 +--
 .../src/McAsciiEventSelector.cxx              |  5 +----
 .../McEventSelector/McEventSelector.h         | 12 ++---------
 .../McEventSelector/src/McEventSelector.cxx   | 20 ++-----------------
 .../src/PixelConditionsSummaryTool.cxx        |  2 --
 .../src/SCT_RadDamageSummaryTool.cxx          |  4 +---
 .../InDetOverlay/test/BCMOverlay_test.cxx     |  1 -
 .../InDetOverlay/test/PixelOverlay_test.cxx   |  1 -
 .../InDetOverlay/test/SCTOverlay_test.cxx     |  1 -
 .../InDetOverlay/test/TRTOverlay_test.cxx     |  3 ---
 .../MdtOverlay/test/MdtOverlay_test.cxx       |  3 +--
 .../RpcOverlay/test/RpcOverlay_test.cxx       |  3 +--
 .../TgcOverlay/test/TgcOverlay_test.cxx       |  3 +--
 .../AnalysisTools/src/AANTupleStream.cxx      | 16 ++++-----------
 .../BeamEffects/test/BeamEffectsAlg_test.cxx  |  1 -
 .../test/CollectionMerger_test.cxx            |  1 -
 .../ISF_Algorithms/test/SimKernelMT_test.cxx  |  2 --
 .../ISF_Services/test/InputConverter_test.cxx |  1 -
 .../ISF_Services/test/TruthSvc_test.cxx       |  1 -
 .../src/TrigMonitorToolBase.cxx               |  3 +--
 .../TrigSteer/TrigSteering/src/TrigSteer.cxx  |  2 --
 .../TrigTimeAlgs/src/TrigTimerSvc.cxx         |  5 +----
 25 files changed, 19 insertions(+), 103 deletions(-)

diff --git a/Control/AthenaExamples/AthExHive/src/loopTest/HiveAlgL1.cxx b/Control/AthenaExamples/AthExHive/src/loopTest/HiveAlgL1.cxx
index 922f6d8f5d32..0599d3965aca 100644
--- a/Control/AthenaExamples/AthExHive/src/loopTest/HiveAlgL1.cxx
+++ b/Control/AthenaExamples/AthExHive/src/loopTest/HiveAlgL1.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "HiveAlgL1.h"
@@ -18,10 +18,6 @@ HiveAlgL1::~HiveAlgL1() {}
 StatusCode HiveAlgL1::initialize() {
   ATH_MSG_DEBUG("initialize " << name());
 
-  // setProperties();
-
-  // ATH_MSG_INFO("time: " << sleep() );
-
   ATH_CHECK( m_rdh1.initialize() );
   ATH_CHECK( m_wrh1.initialize() );
 
diff --git a/Control/AthenaServices/src/LoggedMessageSvc.cxx b/Control/AthenaServices/src/LoggedMessageSvc.cxx
index 3e2c884f5026..c594411e119b 100644
--- a/Control/AthenaServices/src/LoggedMessageSvc.cxx
+++ b/Control/AthenaServices/src/LoggedMessageSvc.cxx
@@ -1,8 +1,7 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
-// $Id: AthMessageSvc.cpp,v 1.27 2008/10/21 16:25:55 marcocle Exp $
 
 #include "GaudiKernel/Kernel.h"
 #include "GaudiKernel/StatusCode.h"
@@ -124,10 +123,6 @@ StatusCode LoggedMessageSvc::initialize() {
   SmartIF<IMessageSvc> &si = const_cast<SmartIF<IMessageSvc>&> (msgSvc());
   si.reset();
 
-  // Set my own properties
-  sc = setProperties();
-  if (sc.isFailure()) return sc;
-
 #ifdef _WIN32
   m_color = false;
 #endif
diff --git a/Control/PileUpComps/src/PileUpEventLoopMgr.cxx b/Control/PileUpComps/src/PileUpEventLoopMgr.cxx
index 73c04aa2a0a5..d8104ae892a4 100644
--- a/Control/PileUpComps/src/PileUpEventLoopMgr.cxx
+++ b/Control/PileUpComps/src/PileUpEventLoopMgr.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 
@@ -122,20 +122,6 @@ PileUpEventLoopMgr::~PileUpEventLoopMgr() {}
 //=========================================================================
 StatusCode PileUpEventLoopMgr::initialize()
 {
-  //-------------------------------------------------------------------------
-  // Process Properties
-  //-------------------------------------------------------------------------
-  try
-    {
-      CHECK(setProperties());
-      // configure our MsgStream
-      m_msg.get().setLevel( m_outputLevel.value() );
-    }
-  catch (...)
-    {
-      ATH_MSG_WARNING ( "Caught exception thrown reading in properties" );
-    }
-
   ATH_MSG_INFO ( "Initializing " << this->name() << " - package version " << PACKAGE_VERSION ) ;
   if(!m_allowSerialAndMPToDiffer)
     {
diff --git a/Generators/McAsciiEventSelector/src/McAsciiCnvSvc.cxx b/Generators/McAsciiEventSelector/src/McAsciiCnvSvc.cxx
index 4d3245aedbb3..1f320b618620 100644
--- a/Generators/McAsciiEventSelector/src/McAsciiCnvSvc.cxx
+++ b/Generators/McAsciiEventSelector/src/McAsciiCnvSvc.cxx
@@ -1,7 +1,7 @@
 ///////////////////////// -*- C++ -*- /////////////////////////////
 
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 // McAsciiCnvSvc.cxx 
@@ -60,7 +60,6 @@ StatusCode McAsciiCnvSvc::initialize()
 	  << endmsg;
     return StatusCode::FAILURE;
   }
-  setProperties().ignore();
 
   // retrieve tool
   setupCnvTool();
diff --git a/Generators/McAsciiEventSelector/src/McAsciiEventSelector.cxx b/Generators/McAsciiEventSelector/src/McAsciiEventSelector.cxx
index 58c7a5f46c8b..40882516b535 100644
--- a/Generators/McAsciiEventSelector/src/McAsciiEventSelector.cxx
+++ b/Generators/McAsciiEventSelector/src/McAsciiEventSelector.cxx
@@ -1,7 +1,7 @@
 ///////////////////////// -*- C++ -*- /////////////////////////////
 
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 // McAsciiEventSelector.cxx 
@@ -84,9 +84,6 @@ StatusCode McAsciiEventSelector::initialize()
 {
   ATH_MSG_INFO( "Enter McAsciiEventSelector initialization..." );
 
-  ATH_CHECK( AthService::initialize() );
-  setProperties().ignore();
-
   const std::size_t nbrAsciiFiles = m_asciiFileNames.value().size();
   if ( nbrAsciiFiles <= 0 ) {
     ATH_MSG_ERROR( "You need to give at least 1 input file !!"
diff --git a/Generators/McEventSelector/McEventSelector/McEventSelector.h b/Generators/McEventSelector/McEventSelector/McEventSelector.h
index 3bd969807e33..542d4397aed9 100644
--- a/Generators/McEventSelector/McEventSelector/McEventSelector.h
+++ b/Generators/McEventSelector/McEventSelector/McEventSelector.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 //====================================================================
@@ -26,7 +26,6 @@
 #include "GaudiKernel/IEvtSelector.h"
 #include "AthenaBaseComps/AthService.h"
 #include "Gaudi/Property.h"  /*no forward decl: typedef*/
-#include "GaudiKernel/MsgStream.h"
 
 #include "AthenaKernel/IEvtSelectorSeek.h"
 
@@ -35,12 +34,6 @@ class EventSource;
 class ISvcLocator;
 class McContext;
 
-#ifdef WIN32
-// Disable warning C4786: identifier was truncated to '255' characters in the debug information
-#pragma warning ( disable : 4786 )
-#endif
-
-
 //--------------------------------------------------------------------
 // Event Selector 
 //--------------------------------------------------------------------
@@ -52,8 +45,7 @@ public:
 
   virtual StatusCode initialize() override;
   virtual StatusCode stop() override;
-  virtual StatusCode finalize() override;
-  virtual StatusCode queryInterface(const InterfaceID& riid, 
+  virtual StatusCode queryInterface(const InterfaceID& riid,
 				    void** ppvInterface) override;
   virtual StatusCode createContext(Context*& refpCtxt) const override;
 
diff --git a/Generators/McEventSelector/src/McEventSelector.cxx b/Generators/McEventSelector/src/McEventSelector.cxx
index 7c27696c5140..d158fea79c20 100644
--- a/Generators/McEventSelector/src/McEventSelector.cxx
+++ b/Generators/McEventSelector/src/McEventSelector.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 //====================================================================
@@ -272,18 +272,7 @@ McEventSelector::createContext(Context*& refpCtxt) const
 
 StatusCode McEventSelector::initialize()     {
   ATH_MSG_INFO (" Enter McEventSelector Initialization ");
-  StatusCode sc = AthService::initialize();
-  msg().setLevel( m_outputLevel.value() );
-  if( sc.isSuccess() ) {
-    setProperties().ignore();
-  } else {
-    ATH_MSG_ERROR ("Unable to initialize service ");
-    return sc;
-  }
-
-  ATH_MSG_DEBUG (" McEventSelector Initialized Properly ... ");
-
-  return sc;
+  return StatusCode::SUCCESS;
 }
 
 StatusCode McEventSelector::stop()     {
@@ -301,11 +290,6 @@ StatusCode McEventSelector::stop()     {
   return StatusCode::SUCCESS;
 }
 
-StatusCode McEventSelector::finalize()     {
-  ATH_MSG_INFO ("finalize");
-
-  return StatusCode::SUCCESS;
-}
 
 // IEvtSelector::next
 StatusCode
diff --git a/InnerDetector/InDetConditions/PixelConditionsTools/src/PixelConditionsSummaryTool.cxx b/InnerDetector/InDetConditions/PixelConditionsTools/src/PixelConditionsSummaryTool.cxx
index 5a31f5d9d9b4..d11364eb6e9e 100644
--- a/InnerDetector/InDetConditions/PixelConditionsTools/src/PixelConditionsSummaryTool.cxx
+++ b/InnerDetector/InDetConditions/PixelConditionsTools/src/PixelConditionsSummaryTool.cxx
@@ -22,8 +22,6 @@ PixelConditionsSummaryTool::~PixelConditionsSummaryTool(){}
 StatusCode PixelConditionsSummaryTool::initialize(){
   ATH_MSG_DEBUG("PixelConditionsSummaryTool::initialize()");
 
-  ATH_CHECK(setProperties());
-
   ATH_CHECK(m_condDCSStateKey.initialize());
   ATH_CHECK(m_condDCSStatusKey.initialize());
   ATH_CHECK(m_BSErrContReadKey.initialize(SG::AllowEmpty));
diff --git a/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_RadDamageSummaryTool.cxx b/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_RadDamageSummaryTool.cxx
index 146f84f61b6d..d83aff93106f 100644
--- a/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_RadDamageSummaryTool.cxx
+++ b/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_RadDamageSummaryTool.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "SCT_RadDamageSummaryTool.h"
@@ -16,8 +16,6 @@ SCT_RadDamageSummaryTool::SCT_RadDamageSummaryTool(const std::string& type, cons
 StatusCode SCT_RadDamageSummaryTool::initialize() {
   ATH_MSG_INFO("Initializing SCT_RadDamageSummaryTool");
 
-  ATH_CHECK(setProperties());
-  
   ATH_CHECK(m_chargeTrappingTool.retrieve());
   ATH_MSG_INFO("SCT_ChargeTrappingTool retrieved");
   
diff --git a/InnerDetector/InDetRawAlgs/InDetOverlay/test/BCMOverlay_test.cxx b/InnerDetector/InDetRawAlgs/InDetOverlay/test/BCMOverlay_test.cxx
index f511586c108e..220fcd0ddced 100644
--- a/InnerDetector/InDetRawAlgs/InDetOverlay/test/BCMOverlay_test.cxx
+++ b/InnerDetector/InDetRawAlgs/InDetOverlay/test/BCMOverlay_test.cxx
@@ -41,7 +41,6 @@ namespace OverlayTesting {
   protected:
     virtual void SetUp() override {
       m_alg = new BCMOverlay{"BCMOverlay", g_svcLoc};
-      ASSERT_TRUE( m_alg->setProperties().isSuccess() );
       ASSERT_TRUE( g_svcLoc->service("StoreGateSvc", m_sg) );
     }
 
diff --git a/InnerDetector/InDetRawAlgs/InDetOverlay/test/PixelOverlay_test.cxx b/InnerDetector/InDetRawAlgs/InDetOverlay/test/PixelOverlay_test.cxx
index c21fc8ccf6d2..bd3798b27b2e 100644
--- a/InnerDetector/InDetRawAlgs/InDetOverlay/test/PixelOverlay_test.cxx
+++ b/InnerDetector/InDetRawAlgs/InDetOverlay/test/PixelOverlay_test.cxx
@@ -39,7 +39,6 @@ namespace OverlayTesting {
   protected:
     virtual void SetUp() override {
       m_alg = new PixelOverlay{"PixelOverlay", g_svcLoc};
-      ASSERT_TRUE( m_alg->setProperties().isSuccess() );
       ASSERT_TRUE( g_svcLoc->service("StoreGateSvc", m_sg) );
     }
 
diff --git a/InnerDetector/InDetRawAlgs/InDetOverlay/test/SCTOverlay_test.cxx b/InnerDetector/InDetRawAlgs/InDetOverlay/test/SCTOverlay_test.cxx
index 94afde167989..e29cc852e1bc 100644
--- a/InnerDetector/InDetRawAlgs/InDetOverlay/test/SCTOverlay_test.cxx
+++ b/InnerDetector/InDetRawAlgs/InDetOverlay/test/SCTOverlay_test.cxx
@@ -44,7 +44,6 @@ namespace OverlayTesting {
   protected:
     virtual void SetUp() override {
       m_alg = new SCTOverlay{"SCTOverlay", g_svcLoc};
-      ASSERT_TRUE( m_alg->setProperties().isSuccess() );
       ASSERT_TRUE( g_svcLoc->service("StoreGateSvc", m_sg) );
 
       StoreGateSvc *detStore(nullptr);
diff --git a/InnerDetector/InDetRawAlgs/InDetOverlay/test/TRTOverlay_test.cxx b/InnerDetector/InDetRawAlgs/InDetOverlay/test/TRTOverlay_test.cxx
index f7cce7f0dd11..a21c8c8b41db 100644
--- a/InnerDetector/InDetRawAlgs/InDetOverlay/test/TRTOverlay_test.cxx
+++ b/InnerDetector/InDetRawAlgs/InDetOverlay/test/TRTOverlay_test.cxx
@@ -204,7 +204,6 @@ namespace OverlayTesting {
       // the tested Algorithm
       m_alg = new TRTOverlay{"TRTOverlay", m_svcLoc};
       m_alg->addRef();
-      ASSERT_TRUE( m_alg->setProperties().isSuccess() );
       // ordering B, A, C, D is on purpose to test for unintended alphabetic ordering
       std::string        inputSigPropertyValue = "'StoreGateSvc+TRT_RDOs_SIG'";
       std::string        inputBkgPropertyValue = "'StoreGateSvc+TRT_RDOs_BKG'";
@@ -234,7 +233,6 @@ namespace OverlayTesting {
       if(!service) {
         return nullptr;
       }
-      EXPECT_TRUE( service->setProperties().isSuccess() );
       EXPECT_TRUE( service->configure().isSuccess() );
       EXPECT_TRUE( m_svcMgr->addService(service).isSuccess() );
       // assert that finalize() gets called once per test case
@@ -257,7 +255,6 @@ namespace OverlayTesting {
         return nullptr;
       }
 
-      EXPECT_TRUE( tool->setProperties().isSuccess() );
       EXPECT_TRUE( tool->configure().isSuccess() );
 
       // assert that finalize() gets called once per test case
diff --git a/MuonSpectrometer/MuonOverlay/MdtOverlay/test/MdtOverlay_test.cxx b/MuonSpectrometer/MuonOverlay/MdtOverlay/test/MdtOverlay_test.cxx
index fac3c4f6df54..86fa1eea11a5 100644
--- a/MuonSpectrometer/MuonOverlay/MdtOverlay/test/MdtOverlay_test.cxx
+++ b/MuonSpectrometer/MuonOverlay/MdtOverlay/test/MdtOverlay_test.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 /**
@@ -36,7 +36,6 @@ namespace OverlayTesting {
   protected:
     virtual void SetUp() override {
       m_alg = new MdtOverlay{"MdtOverlay", g_svcLoc};
-      ASSERT_TRUE( m_alg->setProperties().isSuccess() );
       ASSERT_TRUE( g_svcLoc->service("StoreGateSvc", m_sg) );
     }
 
diff --git a/MuonSpectrometer/MuonOverlay/RpcOverlay/test/RpcOverlay_test.cxx b/MuonSpectrometer/MuonOverlay/RpcOverlay/test/RpcOverlay_test.cxx
index cb19ccfa6a24..0f465f840240 100644
--- a/MuonSpectrometer/MuonOverlay/RpcOverlay/test/RpcOverlay_test.cxx
+++ b/MuonSpectrometer/MuonOverlay/RpcOverlay/test/RpcOverlay_test.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 /**
@@ -36,7 +36,6 @@ namespace OverlayTesting {
   protected:
     virtual void SetUp() override {
       m_alg = new RpcOverlay{"RpcOverlay", g_svcLoc};
-      ASSERT_TRUE( m_alg->setProperties().isSuccess() );
       ASSERT_TRUE( g_svcLoc->service("StoreGateSvc", m_sg) );
     }
 
diff --git a/MuonSpectrometer/MuonOverlay/TgcOverlay/test/TgcOverlay_test.cxx b/MuonSpectrometer/MuonOverlay/TgcOverlay/test/TgcOverlay_test.cxx
index e168fe74fa14..592d7ee07676 100644
--- a/MuonSpectrometer/MuonOverlay/TgcOverlay/test/TgcOverlay_test.cxx
+++ b/MuonSpectrometer/MuonOverlay/TgcOverlay/test/TgcOverlay_test.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 /**
@@ -36,7 +36,6 @@ namespace OverlayTesting {
   protected:
     virtual void SetUp() override {
       m_alg = new TgcOverlay{"TgcOverlay", g_svcLoc};
-      ASSERT_TRUE( m_alg->setProperties().isSuccess() );
       ASSERT_TRUE( g_svcLoc->service("StoreGateSvc", m_sg) );
     }
 
diff --git a/PhysicsAnalysis/AnalysisCommon/AnalysisTools/src/AANTupleStream.cxx b/PhysicsAnalysis/AnalysisCommon/AnalysisTools/src/AANTupleStream.cxx
index 585b8271c772..bfef73785373 100644
--- a/PhysicsAnalysis/AnalysisCommon/AnalysisTools/src/AANTupleStream.cxx
+++ b/PhysicsAnalysis/AnalysisCommon/AnalysisTools/src/AANTupleStream.cxx
@@ -590,18 +590,10 @@ StatusCode AANTupleStream::initialize_subAlgos()
       ATH_MSG_INFO (" -> creating sub-algorithm " << (*it));
       sc =  createSubAlgorithm( theType,theName, algo );
       if (sc.isFailure())
-	{
-	  ATH_MSG_FATAL (" ERROR creating sub-alg." << (*it));
-	  return StatusCode::FAILURE;
-	}
-
-      // force subAlgorithm to set his properties now (reading the jobOptions
-      sc = algo->setProperties();
-      if (sc.isFailure())
-	{
-	  ATH_MSG_FATAL (" ERROR setting properties for this sub-algorithm.");
-	  return StatusCode::FAILURE;
-	}
+        {
+          ATH_MSG_FATAL (" ERROR creating sub-alg." << (*it));
+          return StatusCode::FAILURE;
+        }
     }
 
   return sc;
diff --git a/Simulation/BeamEffects/test/BeamEffectsAlg_test.cxx b/Simulation/BeamEffects/test/BeamEffectsAlg_test.cxx
index 4a7ac7cb8306..bdb8d282cd04 100644
--- a/Simulation/BeamEffects/test/BeamEffectsAlg_test.cxx
+++ b/Simulation/BeamEffects/test/BeamEffectsAlg_test.cxx
@@ -51,7 +51,6 @@ namespace SimTesting {
   protected:
     virtual void SetUp() override {
       m_alg = new Simulation::BeamEffectsAlg{"BeamEffectsAlg", g_svcLoc};
-      ASSERT_TRUE( m_alg->setProperties().isSuccess() );
       ASSERT_TRUE( g_svcLoc->service("StoreGateSvc", m_sg) );
     }
 
diff --git a/Simulation/ISF/ISF_Core/ISF_Algorithms/test/CollectionMerger_test.cxx b/Simulation/ISF/ISF_Core/ISF_Algorithms/test/CollectionMerger_test.cxx
index 7fac942845dd..fd4559f57b4c 100644
--- a/Simulation/ISF/ISF_Core/ISF_Algorithms/test/CollectionMerger_test.cxx
+++ b/Simulation/ISF/ISF_Core/ISF_Algorithms/test/CollectionMerger_test.cxx
@@ -56,7 +56,6 @@ class CollectionMerger_test : public ::testing::Test {
   protected:
     virtual void SetUp() override {
       m_alg = new ISF::CollectionMerger{"CollectionMerger", g_svcLoc};
-      ASSERT_TRUE( m_alg->setProperties().isSuccess() );
       ASSERT_TRUE( g_svcLoc->service("StoreGateSvc", m_sg) );
     }
 
diff --git a/Simulation/ISF/ISF_Core/ISF_Algorithms/test/SimKernelMT_test.cxx b/Simulation/ISF/ISF_Core/ISF_Algorithms/test/SimKernelMT_test.cxx
index bb5bf49a7643..32cf0185a8ca 100644
--- a/Simulation/ISF/ISF_Core/ISF_Algorithms/test/SimKernelMT_test.cxx
+++ b/Simulation/ISF/ISF_Core/ISF_Algorithms/test/SimKernelMT_test.cxx
@@ -310,7 +310,6 @@ protected:
       if(!service) {
         return nullptr;
       }
-      EXPECT_TRUE( service->setProperties().isSuccess() );
       EXPECT_TRUE( service->configure().isSuccess() );
       EXPECT_TRUE( m_svcMgr->addService(service).isSuccess() );
       // assert that finalize() gets called once per test case
@@ -333,7 +332,6 @@ protected:
         return nullptr;
       }
 
-      EXPECT_TRUE( tool->setProperties().isSuccess() );
       EXPECT_TRUE( tool->configure().isSuccess() );
 
       // assert that finalize() gets called once per test case
diff --git a/Simulation/ISF/ISF_Core/ISF_Services/test/InputConverter_test.cxx b/Simulation/ISF/ISF_Core/ISF_Services/test/InputConverter_test.cxx
index a5323da69977..b108828792f9 100644
--- a/Simulation/ISF/ISF_Core/ISF_Services/test/InputConverter_test.cxx
+++ b/Simulation/ISF/ISF_Core/ISF_Services/test/InputConverter_test.cxx
@@ -102,7 +102,6 @@ class InputConverter_test: public ::testing::Test {
     SmartIF<IService>& serviceSmartPointer = m_svcLoc->service("ISF::InputConverter/InputConverter");
     m_svc = dynamic_cast<ISF::InputConverter*>(serviceSmartPointer.get());
     EXPECT_NE(nullptr, m_svc);
-    ASSERT_TRUE( m_svc->setProperties().isSuccess() );
     ASSERT_TRUE( m_svc->configure().isSuccess() );
   }
 
diff --git a/Simulation/ISF/ISF_Core/ISF_Services/test/TruthSvc_test.cxx b/Simulation/ISF/ISF_Core/ISF_Services/test/TruthSvc_test.cxx
index f3d593c8f8df..dad163f26f65 100644
--- a/Simulation/ISF/ISF_Core/ISF_Services/test/TruthSvc_test.cxx
+++ b/Simulation/ISF/ISF_Core/ISF_Services/test/TruthSvc_test.cxx
@@ -189,7 +189,6 @@ namespace ISFTesting {
       m_svc = dynamic_cast<ISF::TruthSvc*>(svc.get());
       ASSERT_NE(nullptr, m_svc);
 
-      ASSERT_TRUE( m_svc->setProperties().isSuccess() );
       ASSERT_TRUE( m_svc->configure().isSuccess() );
     }
 
diff --git a/Trigger/TrigMonitoring/TrigMonitorBase/src/TrigMonitorToolBase.cxx b/Trigger/TrigMonitoring/TrigMonitorBase/src/TrigMonitorToolBase.cxx
index 3f754311f874..3dc11664e00a 100755
--- a/Trigger/TrigMonitoring/TrigMonitorBase/src/TrigMonitorToolBase.cxx
+++ b/Trigger/TrigMonitoring/TrigMonitorBase/src/TrigMonitorToolBase.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 // ********************************************************************
@@ -37,7 +37,6 @@ TrigMonitorToolBase::~TrigMonitorToolBase()
 
 
 StatusCode TrigMonitorToolBase::initialize() {
-  ATH_CHECK( setProperties() );
   ATH_CHECK( m_histSvc.retrieve() );
   return StatusCode::SUCCESS;
 }
diff --git a/Trigger/TrigSteer/TrigSteering/src/TrigSteer.cxx b/Trigger/TrigSteer/TrigSteering/src/TrigSteer.cxx
index c4712cfe0bc6..3d71d1503098 100644
--- a/Trigger/TrigSteer/TrigSteering/src/TrigSteer.cxx
+++ b/Trigger/TrigSteer/TrigSteering/src/TrigSteer.cxx
@@ -995,13 +995,11 @@ HLT::Algo* TrigSteer::getAlgo(const std::string& name)
   if ( dynamic_cast<HLT::HypoAlgo*>(algo) ) {
     BooleanProperty enabled("Enable", m_doHypo);
     algo->setProperty(enabled).ignore();
-    algo->setProperties().ignore();
     ATH_MSG_DEBUG(( m_doHypo ? "enabling " : "disabling ") << subAlg_name << " because it is Hypo");
   }
   if ( dynamic_cast<HLT::TECreateAlgo*>(algo) ) {
     BooleanProperty enabled("Enable", m_doFex);
     algo->setProperty(enabled).ignore();
-    algo->setProperties().ignore();
     ATH_MSG_DEBUG((m_doFex ? "enabling " : "disabling ") << subAlg_name << " because it is Fex");
   }
 
diff --git a/Trigger/TrigTools/TrigTimeAlgs/src/TrigTimerSvc.cxx b/Trigger/TrigTools/TrigTimeAlgs/src/TrigTimerSvc.cxx
index 7dde3d2c52ce..8c637d224744 100755
--- a/Trigger/TrigTools/TrigTimeAlgs/src/TrigTimerSvc.cxx
+++ b/Trigger/TrigTools/TrigTimeAlgs/src/TrigTimerSvc.cxx
@@ -1,10 +1,9 @@
 // this is -*- c++ -*-
 
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
-// $Id: TrigTimerSvc.cxx,v 1.12 2009-04-15 14:00:22 tbold Exp $
 #include "TrigTimeAlgs/TrigTimerSvc.h"
 
 #include "GaudiKernel/ServiceHandle.h"
@@ -48,8 +47,6 @@ StatusCode TrigTimerSvc::queryInterface (const InterfaceID& riid, void** ppvInte
 
 StatusCode TrigTimerSvc::initialize ( ) {
   
-  ATH_CHECK( setProperties() );
-  
   // compile regexes
   m_includeRegex = boost::regex(m_includeName);
   m_excludeRegex = boost::regex(m_excludeName);
-- 
GitLab


From 591d8f237f8a58e3a6684899887eb2dea40ba434 Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Thu, 17 Dec 2020 11:29:29 +0100
Subject: [PATCH 109/225] AthenaCommon: Throw exception on Property parsing
 errors

Set `GAUDI_PROPERTY_PARSING_ERROR_DEFAULT_POLICY=Exception` environment
variable to always throw an exception on property parsing errors.

Relates to https://gitlab.cern.ch/gaudi/Gaudi/-/issues/163.
---
 .../AthenaCommon/AthenaCommonEnvironmentConfig.cmake  | 11 +++++++++++
 Control/AthenaCommon/CMakeLists.txt                   | 10 +++++++---
 2 files changed, 18 insertions(+), 3 deletions(-)
 create mode 100644 Control/AthenaCommon/AthenaCommonEnvironmentConfig.cmake

diff --git a/Control/AthenaCommon/AthenaCommonEnvironmentConfig.cmake b/Control/AthenaCommon/AthenaCommonEnvironmentConfig.cmake
new file mode 100644
index 000000000000..2609c001f685
--- /dev/null
+++ b/Control/AthenaCommon/AthenaCommonEnvironmentConfig.cmake
@@ -0,0 +1,11 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+#
+# This module is used to set up the environment for AthenaCommon.
+#
+
+# Set the environment variable(s):
+set( ATHENACOMMONENVIRONMENT_ENVIRONMENT
+   SET GAUDI_PROPERTY_PARSING_ERROR_DEFAULT_POLICY "Exception" )
+
+# Silently declare the module found:
+set( ATHENACOMMONENVIRONMENT_FOUND TRUE )
diff --git a/Control/AthenaCommon/CMakeLists.txt b/Control/AthenaCommon/CMakeLists.txt
index b85eb17e3ec4..f087ae817778 100644
--- a/Control/AthenaCommon/CMakeLists.txt
+++ b/Control/AthenaCommon/CMakeLists.txt
@@ -1,10 +1,13 @@
-################################################################################
-# Package: AthenaCommon
-################################################################################
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # Declare the package name:
 atlas_subdir( AthenaCommon )
 
+# Set up specific Athena runtime environment:
+set( AthenaCommonEnvironment_DIR ${CMAKE_CURRENT_SOURCE_DIR}
+   CACHE PATH "Location of AthenaCommonEnvironmentConfig.cmake" )
+find_package( AthenaCommonEnvironment )
+
 # Install files from the package:
 atlas_install_python_modules( python/*.py python/Utils
                               POST_BUILD_CMD ${ATLAS_FLAKE8} )
@@ -16,6 +19,7 @@ atlas_install_runtime(share/*.pkl)
 # Aliases:
 atlas_add_alias( athena "athena.py" )
 
+# Tests:
 atlas_add_test( AthAppMgrUnitTests SCRIPT test/test_AthAppMgrUnitTests.sh
                 PROPERTIES TIMEOUT 300
                 LOG_IGNORE_PATTERN "Warning in <TFile::Init>: no StreamerInfo found|^Ran .* tests in|built on" )
-- 
GitLab


From f7633b1ee9994ffd8e1b16fe4c2f8da937959be4 Mon Sep 17 00:00:00 2001
From: Tim Martin <Tim.Martin@cern.ch>
Date: Thu, 17 Dec 2020 12:51:28 +0100
Subject: [PATCH 110/225] Add deduplication checking to typelessFindLinks

---
 .../Root/TrigCompositeUtilsRoot.cxx           | 50 +++++++++++++++----
 1 file changed, 40 insertions(+), 10 deletions(-)

diff --git a/Trigger/TrigSteer/TrigCompositeUtils/Root/TrigCompositeUtilsRoot.cxx b/Trigger/TrigSteer/TrigCompositeUtils/Root/TrigCompositeUtilsRoot.cxx
index c22b1dc36611..51a8be09f3b3 100644
--- a/Trigger/TrigSteer/TrigCompositeUtils/Root/TrigCompositeUtilsRoot.cxx
+++ b/Trigger/TrigSteer/TrigCompositeUtils/Root/TrigCompositeUtilsRoot.cxx
@@ -351,24 +351,54 @@ namespace TrigCompositeUtils {
   {
     using namespace msgFindLink;
     if (visitedCache != nullptr) {
-      // We only need to recursivly explore back from each node in the graph once.
+      // We only need to recursively explore back from each node in the graph once.
       // We can keep a record of nodes which we have already explored, these we can safely skip over.
       if (visitedCache->count(start) == 1) {
         return false; // Early exit
       }
     }
-
+    // As the append vectors are user-supplied, perform some input validation. 
+    if (keyVec.size() != clidVec.size() or clidVec.size() != indexVec.size()) {
+      ANA_MSG_WARNING("In typelessFindLinks, keyVec, clidVec, indexVec must all be the same size. Instead have:"
+        << keyVec.size() << ", " << clidVec.size()  << ", " << indexVec.size());
+      return false;
+    }
+    // Locate named links. Both collections of links and individual links are supported.
     bool found = false;
+    std::vector<uint32_t> tmpKeyVec;
+    std::vector<uint32_t> tmpClidVec;
+    std::vector<uint16_t> tmpIndexVec;
     if (start->hasObjectCollectionLinks(linkName)) {
-      found = start->typelessGetObjectCollectionLinks(linkName, keyVec, clidVec, indexVec);
+      found = start->typelessGetObjectCollectionLinks(linkName, tmpKeyVec, tmpClidVec, tmpIndexVec);
     }
     if (start->hasObjectLink(linkName)) {
-      uint32_t key, clid;
-      uint16_t index;
-      found |= start->typelessGetObjectLink(linkName, key, clid, index);
-      keyVec.push_back(key);
-      clidVec.push_back(clid);
-      indexVec.push_back(index);
+      uint32_t tmpKey, tmpClid;
+      uint16_t tmpIndex;
+      found |= start->typelessGetObjectLink(linkName, tmpKey, tmpClid, tmpIndex);
+      tmpKeyVec.push_back(tmpKey);
+      tmpClidVec.push_back(tmpClid);
+      tmpIndexVec.push_back(tmpIndex);
+    }
+    // De-duplicate
+    for (size_t tmpi = 0; tmpi < tmpKeyVec.size(); ++tmpi) {
+      bool alreadyAdded = false;
+      const uint32_t tmpKey = tmpKeyVec.at(tmpi);
+      const uint32_t tmpClid = tmpClidVec.at(tmpi);
+      const uint16_t tmpIndex = tmpIndexVec.at(tmpi);
+      for (size_t veci = 0; veci < keyVec.size(); ++veci) {
+        if (keyVec.at(veci) == tmpKey 
+          and clidVec.at(veci) == tmpClid
+          and indexVec.at(veci) == tmpIndex)
+        {
+          alreadyAdded = true;
+          break;
+        }
+      }
+      if (!alreadyAdded) {
+        keyVec.push_back( tmpKey );
+        clidVec.push_back( tmpClid );
+        indexVec.push_back( tmpIndex );
+      }
     }
     // Early exit
     if (found && behaviour == TrigDefs::lastFeatureOfType) {
@@ -395,7 +425,7 @@ namespace TrigCompositeUtils {
     // only want the most recent.
     // Hence we can supply TrigDefs::lastFeatureOfType.                                                         /--> parent3(link)
     // We can still have more then one link found if there is a branch in the navigation. E.g. start --> parent1 --> parent2(link)
-    // If both parent2 and parent3 posessed an admisable ElementLink, then the warning below will trigger, and only one of the
+    // If both parent2 and parent3 possessed an admissible ElementLink, then the warning below will trigger, and only one of the
     // links will be returned (whichever of parent2 or parent3 happened to be the first seed of parent1).
     std::vector<uint32_t> keyVec;
     std::vector<uint32_t> clidVec;
-- 
GitLab


From cff3e068cd42a1250b1ebabcf112551d9fd2a52e Mon Sep 17 00:00:00 2001
From: Andrii Verbytskyi <andrii.verbytskyi@cern.ch>
Date: Thu, 17 Dec 2020 12:23:49 +0000
Subject: [PATCH 111/225] Hepmc3 nightly fixes 15122020 part 2

---
 .../TruthD3PDAnalysis/IGenObjectsFilterTool.h                 | 4 ++--
 .../TruthD3PDAnalysis/src/SimpleTruthParticleFilterTool.cxx   | 2 +-
 .../TruthD3PDAnalysis/src/SimpleTruthParticleFilterTool.h     | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDAnalysis/TruthD3PDAnalysis/IGenObjectsFilterTool.h b/PhysicsAnalysis/D3PDMaker/TruthD3PDAnalysis/TruthD3PDAnalysis/IGenObjectsFilterTool.h
index ba5cfa518deb..9223bbfebb4c 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDAnalysis/TruthD3PDAnalysis/IGenObjectsFilterTool.h
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDAnalysis/TruthD3PDAnalysis/IGenObjectsFilterTool.h
@@ -72,7 +72,7 @@ public:
     * @returns <code>true</code> if the object should be selected,
     *          <code>false</code> otherwise
     */
-   virtual bool pass( const HepMC::GenParticle* part,
+   virtual bool pass( HepMC::ConstGenParticlePtr part,
                       const McEventCollection* coll = 0 ) const = 0;
 
    /// Function selecting GenVertex objects
@@ -85,7 +85,7 @@ public:
     * @returns <code>true</code> if the object should be selected,
     *          <code>false</code> otherwise
     */
-   virtual bool pass( const HepMC::GenVertex* vtx,
+   virtual bool pass( HepMC::ConstGenVertexPtr vtx,
                       const McEventCollection* coll = 0 ) const = 0;
 
 }; // class IGenObjectsFilterTool
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDAnalysis/src/SimpleTruthParticleFilterTool.cxx b/PhysicsAnalysis/D3PDMaker/TruthD3PDAnalysis/src/SimpleTruthParticleFilterTool.cxx
index 997025e37b1f..45098962fbd6 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDAnalysis/src/SimpleTruthParticleFilterTool.cxx
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDAnalysis/src/SimpleTruthParticleFilterTool.cxx
@@ -35,7 +35,7 @@ SimpleTruthParticleFilterTool::SimpleTruthParticleFilterTool
  * @brief Test to see if we want to keep a particle.
  */
 bool
-SimpleTruthParticleFilterTool::isAccepted (const HepMC::GenParticle* p)
+SimpleTruthParticleFilterTool::isAccepted (HepMC::ConstGenParticlePtr p)
 {
   bool ok = false;
 
diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDAnalysis/src/SimpleTruthParticleFilterTool.h b/PhysicsAnalysis/D3PDMaker/TruthD3PDAnalysis/src/SimpleTruthParticleFilterTool.h
index 9b3c1d414118..546c44d0d2d5 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDAnalysis/src/SimpleTruthParticleFilterTool.h
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDAnalysis/src/SimpleTruthParticleFilterTool.h
@@ -36,7 +36,7 @@ public:
                            const IInterface* parent);
 
   /// Test to see if we want to keep a particle.
-  virtual bool isAccepted (const HepMC::GenParticle* p);
+  virtual bool isAccepted (HepMC::ConstGenParticlePtr p);
 
 private:
   /// Parameter: PDG ID to filter on
-- 
GitLab


From 192402e176dc025ea659f64f1ea856e69553d5bf Mon Sep 17 00:00:00 2001
From: Junpei Maeda <junpei.maeda@cern.ch>
Date: Thu, 17 Dec 2020 12:28:05 +0000
Subject: [PATCH 112/225] Optimization of Run-2 TGC-BW Coincidence Window

---
 .../MuonCondSvc/MuonCondSvc/TGCTriggerData.h  |  85 +++++--
 .../MuonCondSvc/MuonCondSvc/TGCTriggerDbAlg.h |   5 -
 .../MuonCondSvc/src/TGCTriggerData.cxx        |  21 +-
 .../MuonCondSvc/src/TGCTriggerDbAlg.cxx       |  77 +++---
 .../TrigT1TGC/TGCRPhiCoincidenceMap.h         |  57 +++--
 .../TrigT1TGC/src/TGCRPhiCoincidenceMap.cxx   | 222 ++++++++----------
 .../src/TGCRPhiCoincidenceMatrix.cxx          |  31 ++-
 7 files changed, 258 insertions(+), 240 deletions(-)

diff --git a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondSvc/MuonCondSvc/TGCTriggerData.h b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondSvc/MuonCondSvc/TGCTriggerData.h
index 2f926924555d..e423319aacce 100644
--- a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondSvc/MuonCondSvc/TGCTriggerData.h
+++ b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondSvc/MuonCondSvc/TGCTriggerData.h
@@ -11,11 +11,72 @@
 #include <map>
 #include <vector>
 
+
+/** Contents of Run-2 BW-CW LUT
+ *  ===========================
+ *   std::unordered_map<GLOBALADDR, PTVALUE>
+ *  where
+ *   GLOBALADDR | 27 bits | unsigned int  | side, octant, type, phimod2, module, roi,
+ *                                        | DR(0...0x1f for -15...15)<<4 & DPhi(0...0xf for -7...7)
+ *   PTVALUE    |  3 bits | unsigned char | pT value (0x0 and 0x7 is no cand.)
+ *
+ *  for GLOBALADDR
+ *  | 29 |28|27|26|25|24|23|   22  |21|20|19|18|17|16|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
+ *  |side| octant | 0|type |phimod2|  module   |          RoI          | 0|   delta R    | delta Phi |
+ *  where side   = 0x0 (A-side), 0x1 (C-side).
+ *        octant = 0x(0...7)
+ *        type   = 0x0 (HH), 0x1 (HL), 0x2 (LH), 0x3 (LL): HL means 3-station-wire and 2-station-strip.
+ */
+
 class TGCTriggerData
 {
  friend class TGCTriggerDbAlg;
 
  public:
+  /// Mask for extracting the side from the GLOBALADDR
+  static constexpr uint8_t SIDE_MASK = 0x1;
+  /// Bit position of the side bit in the GLOBALADDR
+  static constexpr uint8_t SIDE_SHIFT = 29;
+  /// Mask for extracting the octant from the GLOBALADDR
+  static constexpr uint8_t OCTANT_MASK = 0x7;
+  /// Bit position of the octant bits in the GLOBALADDR
+  static constexpr uint8_t OCTANT_SHIFT = 26;
+  /// Mask for extracting the octant from the GLOBALADDR
+  static constexpr uint8_t TYPE_MASK = 0x7;
+  /// Bit position of the octant bits in the GLOBALADDR
+  static constexpr uint8_t TYPE_SHIFT = 26;
+  /// Mask for extracting the phi(F or B) from the GLOBALADDR
+  static constexpr uint8_t PHIMOD2_MASK = 0x1;
+  /// Bit position of the module number bits in the GLOBALADDR
+  static constexpr uint8_t PHIMOD2_SHIFT = 22;
+  /// Mask for extracting the module number from the GLOBALADDR
+  static constexpr uint8_t MODULE_MASK = 0xf;
+  /// Bit position of the module number bits in the GLOBALADDR
+  static constexpr uint8_t MODULE_SHIFT = 18;
+  /// Mask for extracting the module number from the GLOBALADDR
+  static constexpr uint8_t ROI_MASK = 0xff;
+  /// Bit position of the module number bits in the GLOBALADDR
+  static constexpr uint8_t ROI_SHIFT = 10;
+  /// Mask for extracting the deltaR from the GLOBALADDR
+  static constexpr uint8_t DR_MASK = 0x1f;
+  /// Bit position of the deltaR bits in the GLOBALADDR
+  static constexpr uint8_t DR_SHIFT = 4;
+  /// Mask for extracting the deltaPhi from the GLOBALADDR
+  static constexpr uint8_t DPHI_MASK = 0xf;
+  /// Bit position of the deltaPhi bits in the GLOBALADDR
+  static constexpr uint8_t DPHI_SHIFT = 0;
+  /// Mask for pT value for Run-2
+  static constexpr uint8_t PT_MASK = 0x7;
+
+  /// Range of DR in the BW coincidence window for 3-station
+  static constexpr uint8_t DR_HIGH_RANGE = 15;
+  /// Range of DR in the BW coincidence window for 2-station
+  static constexpr uint8_t DR_LOW_RANGE = 7;
+  /// Range of DPhi in the BW coincidence window for 3-station
+  static constexpr uint8_t DPHI_HIGH_RANGE = 7;
+  /// Range of DPhi in the BW coincidence window for 2-station
+  static constexpr uint8_t DPHI_LOW_RANGE = 3;
+
   enum {CW_BW=0, CW_EIFI=1, CW_TILE=2, CW_NUM=3};
   enum {N_PT_THRESH=6,
         N_SIDE=2,
@@ -40,7 +101,9 @@ class TGCTriggerData
   std::string getType(int cwtype, int channel = 0) const;
   bool isActive(int cwtype, int channel = 0) const;
 
-  const std::map<unsigned short, std::map<unsigned short, unsigned char>>& getPtMapBw(const unsigned char side, const unsigned char octant) const;
+  int8_t getTYPE(const int16_t lDR, const int16_t hDR, const int16_t lDPhi, const int16_t hDPhi) const;
+
+  uint8_t getBigWheelPt(const uint32_t addr) const;
 
   unsigned short getTrigBitEifi(int side, int slot, int ssc, int sectorId) const;
   unsigned char getFlagPtEifi(int side, int ssc, int sectorId) const;
@@ -58,24 +121,8 @@ class TGCTriggerData
   std::vector<std::string> m_type[CW_NUM];
   std::vector<bool>        m_active[CW_NUM];
 
-  /** Contents of Run-2 BW-CW LUT
-   *  ===========================
-   *     map<OCTANT, map<SUBSECADDR, map<DELTAADDR, PTVALUE> > >
-   *  where
-   *   OCTANT     |  4 bits | unsigned char  | side(A=0, C=1)<<3 & octant(0...7)
-   *   SUBSECADDR | 16 bits | unsigned short | consists of type, phimod2, module, and roi
-   *   DELTAADDR  |  9 bits | unsigned short | DR(0...0x1f for -15...15)<<4 & DPhi(0...0xf for -7...7)
-   *   PTVALUE    |  3 bits | unsigned char  | pT value (0x0 and 0x7 is no cand.)
-   *
-   *  for SUBSECADDR
-   *  | 15 | 14 | 13 |    12   | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
-   *  |  0 |  type   | phimod2 |      module     |              RoI              |
-   *  where type = 0x0 (HH), 0x1 (HL), 0x2 (LH), 0x3 (LL): HL means 3-station-wire and 2-station-strip.
-   *  This may reduce the malloc size when the fullCW option is not used.
-   */
-  std::map<unsigned char, std::map<unsigned short, std::map<unsigned short, unsigned char>>> m_ptmap_bw;
-
-//  std::map<int, std::map<int,int> > m_readmap_bw[N_SIDE][N_OCTANT][N_PT_THRESH];
+  /// Run-2 BW-CW LUT map
+  std::unordered_map<uint32_t, uint8_t> m_ptmap_bw;
 
   /** Bit information of Run-2 EIFI-LUT
    *  =================================
diff --git a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondSvc/MuonCondSvc/TGCTriggerDbAlg.h b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondSvc/MuonCondSvc/TGCTriggerDbAlg.h
index 9b0625987b5a..dc273c4a0255 100644
--- a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondSvc/MuonCondSvc/TGCTriggerDbAlg.h
+++ b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondSvc/MuonCondSvc/TGCTriggerDbAlg.h
@@ -21,11 +21,6 @@ class TGCTriggerDbAlg: public AthAlgorithm
     virtual StatusCode execute() override;
     virtual StatusCode finalize() override;
  
-  protected:
-    char getTYPE(const short lDR, const short hDR, const short lDPhi, const short hDPhi) const;
-    unsigned short getRoIAddr(const char type, const unsigned char phimod2, 
-                              const unsigned short module, const unsigned short roi) const;
- 
   private:
     void loadParameters(TGCTriggerData* writeCdo,
                         const CondAttrListCollection* readKey,
diff --git a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondSvc/src/TGCTriggerData.cxx b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondSvc/src/TGCTriggerData.cxx
index 6a015fcbe01b..a2780baf183c 100644
--- a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondSvc/src/TGCTriggerData.cxx
+++ b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondSvc/src/TGCTriggerData.cxx
@@ -43,12 +43,23 @@ bool TGCTriggerData::isActive(int cwtype, int channel) const {
   return m_active[cwtype][channel];
 }
 
-const std::map<unsigned short, std::map<unsigned short, unsigned char>>& TGCTriggerData::getPtMapBw(const unsigned char side, const unsigned char octant) const
+int8_t TGCTriggerData::getTYPE(const int16_t lDR, const int16_t hDR, const int16_t lDPhi, const int16_t hDPhi) const
 {
-  unsigned char octantbit = (side<<3) + octant;
-  std::map<unsigned char, std::map<unsigned short, std::map<unsigned short, unsigned char>>>::const_iterator it = m_ptmap_bw.find(octantbit);
-  if(it == m_ptmap_bw.end()) return m_ptmap_bw.find(0)->second;  // also for non-full-CW
-  return it->second;
+  if((lDR == -DR_HIGH_RANGE) && (hDR == DR_HIGH_RANGE)) {
+    if     ((lDPhi == -DPHI_HIGH_RANGE) && (hDPhi == DPHI_HIGH_RANGE)) return COIN_HH;
+    else if((lDPhi == -DPHI_LOW_RANGE) && (hDPhi == DPHI_LOW_RANGE))   return COIN_HL;
+  } else if((lDR == -DR_LOW_RANGE) && (hDR == DR_LOW_RANGE)) {
+    if     ((lDPhi == -DPHI_HIGH_RANGE) && (hDPhi == DPHI_HIGH_RANGE)) return COIN_LH;
+    else if((lDPhi == -DPHI_LOW_RANGE) && (hDPhi == DPHI_LOW_RANGE))   return COIN_LL;
+  }
+  return -1;
+}
+
+uint8_t TGCTriggerData::getBigWheelPt(const uint32_t addr) const
+{
+  std::unordered_map<uint32_t, uint8_t>::const_iterator it = m_ptmap_bw.find(addr);
+  if(it == m_ptmap_bw.end()) return 0x0;        // outside from defined window, i.e. pT=0
+  else                       return it->second;
 }
 
 unsigned short TGCTriggerData::getTrigBitEifi(int side, int slot, int ssc, int sectorId) const
diff --git a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondSvc/src/TGCTriggerDbAlg.cxx b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondSvc/src/TGCTriggerDbAlg.cxx
index 90ce64629775..a40a3adb2c7e 100644
--- a/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondSvc/src/TGCTriggerDbAlg.cxx
+++ b/MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondSvc/src/TGCTriggerDbAlg.cxx
@@ -182,10 +182,6 @@ void TGCTriggerDbAlg::loadParameters(TGCTriggerData* writeCdo,
 
 void TGCTriggerDbAlg::fillReadMapBw(TGCTriggerData* writeCdo)
 {
-  for(auto peroctant : writeCdo->m_ptmap_bw) {
-    for(auto persubsec : peroctant.second) persubsec.second.clear();
-  }
-
   if (!writeCdo->isActive(TGCTriggerData::CW_BW)) {
     return;
   }
@@ -193,18 +189,18 @@ void TGCTriggerDbAlg::fillReadMapBw(TGCTriggerData* writeCdo)
   bool fullCW = (writeCdo->getType(TGCTriggerData::CW_BW) == "full");
   std::string vername = writeCdo->getVersion(TGCTriggerData::CW_BW);
 
-  const int kNMODULETYPE = 12;
-  const unsigned short modulenumber[kNMODULETYPE]    = {0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8};
+  const uint8_t kNMODULETYPE = 12;
+  const uint8_t modulenumber[kNMODULETYPE]    = {0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8};
   const std::string modulename[kNMODULETYPE]         = {"0","1","2a","2b","3","4","5a","5b","6","7","8a","8b"};
   const std::string sidename[TGCTriggerData::N_SIDE] = {"A","C"};
 
   for(size_t iSide = 0; iSide < TGCTriggerData::N_SIDE; iSide++) {
     for(size_t iOctant = 0; iOctant < TGCTriggerData::N_OCTANT; iOctant++) {
 
-      std::map<unsigned short, std::map<unsigned short, unsigned char>> per_octant;
-      //   SUBSECADDR | 16 bits | unsigned int  |
+      uint32_t octaddr = (iSide<<TGCTriggerData::SIDE_SHIFT) +
+                         ((iOctant & TGCTriggerData::OCTANT_MASK)<<TGCTriggerData::OCTANT_SHIFT);
 
-      for(int iModule = 0; iModule < kNMODULETYPE; iModule++) {
+      for(size_t iModule = 0; iModule < kNMODULETYPE; iModule++) {
 
         std::ostringstream dbname;
         dbname << "RPhiCoincidenceMap.";
@@ -216,79 +212,62 @@ void TGCTriggerDbAlg::fillReadMapBw(TGCTriggerData* writeCdo)
 
         char delimiter = '\n';
         std::string field, tag;
-        unsigned char phimod2 = modulename[iModule].find("b") != std::string::npos ? 1 : 0;
+        uint32_t phimod2 = modulename[iModule].find("b") != std::string::npos ? 1 : 0;
 
-        std::map<unsigned short, unsigned char> pt_by_delta;
+        uint32_t modaddr = ((modulenumber[iModule] & TGCTriggerData::MODULE_MASK)<<TGCTriggerData::MODULE_SHIFT) +
+                           ((phimod2 & TGCTriggerData::PHIMOD2_MASK)<<TGCTriggerData::PHIMOD2_SHIFT);
 
         while (std::getline(stream, field, delimiter)) {
 
           std::istringstream header(field);
-          header>>tag;
+          header >> tag;
 
           if (tag == "#") { // read header part.
-            unsigned short ssId, mod;
-            short lDR, hDR, lDPhi, hDPhi;
-            unsigned short ptLevel;
-            header>>ptLevel>>ssId>>mod>>lDR>>hDR>>lDPhi>>hDPhi;
+            uint16_t ptLevel, roi, mod;
+            int16_t lDR, hDR, lDPhi, hDPhi;
+            header >> ptLevel >> roi >> mod >> lDR >> hDR >> lDPhi >> hDPhi;
 
-            char type = getTYPE( lDR, hDR, lDPhi, hDPhi );
+            int16_t type = writeCdo->getTYPE( lDR, hDR, lDPhi, hDPhi );
 
             // check moduleNumber and ptLevel
-            if (mod != modulenumber[iModule] || ptLevel > TGCTriggerData::N_PT_THRESH || type < 0 ) {
-              ATH_MSG_WARNING("Invalid configuration of DB file.");
+            if( mod != modulenumber[iModule] ||
+                ptLevel > TGCTriggerData::N_PT_THRESH || type < 0 ) {
+              ATH_MSG_WARNING("Invalid configuration of DB file! - Nothing to load this DB file");
               break;
             }
 
-            unsigned short roiaddr = getRoIAddr(type, phimod2, mod, ssId);
+            uint32_t cwaddr = ((uint8_t(type) & TGCTriggerData::TYPE_MASK)<<TGCTriggerData::TYPE_SHIFT) + 
+                              ((roi & TGCTriggerData::ROI_MASK)<<TGCTriggerData::ROI_SHIFT);
 
             // get window data
             std::getline(stream, field, delimiter);
             std::istringstream cont(field);
 
-            for (unsigned short ir = 0; ir < 31; ir++) {
-              unsigned int bit;
-              cont>>bit;
+            for (uint8_t ir = 0; ir < 31; ir++) {  // ir=0, 15 and 30 point to -15, 0 and +15 of dR, respectively.
+              uint32_t draddr = (ir & TGCTriggerData::DR_MASK)<<TGCTriggerData::DR_SHIFT;
+
+              uint32_t bit;
+              cont >> bit;
               if (bit == 0) continue; // none of window is opened in this dR
 
-              for(unsigned short iphi=0; iphi<15; iphi++) {
-                unsigned short delta = (ir<<4) + iphi;
-                if(bit>>iphi & 0x1) pt_by_delta[delta] = (unsigned char)(ptLevel & 0x7);
+              for(uint8_t iphi=0; iphi<15; iphi++) {  // iphi=0, 7 and 14 point to -7, 0 and +7 of dPhi, respectively.
+                if(bit>>iphi & 0x1) {
+                  uint32_t theaddr = octaddr + modaddr + cwaddr + draddr + iphi;
+                  writeCdo->m_ptmap_bw[theaddr] = (uint8_t)(ptLevel & TGCTriggerData::PT_MASK);
+                }
               }
             }
-            if((ptLevel&0x7) == 0x6) {
-              per_octant[roiaddr] = pt_by_delta;
-              pt_by_delta.clear();
-            }
 
           }   // end of if(tag)...
         }   // end of while(getline...)
       }   // end of for(iModule)
 
-      unsigned char octantbit = iSide<<3 & iOctant;
-      writeCdo->m_ptmap_bw[octantbit] = per_octant;
-
       if(!fullCW) break;
     }   // end of for(iOctant)
     if(!fullCW) break;
   }   // end of for(iSide)
 }
 
-char TGCTriggerDbAlg::getTYPE(const short lDR, const short hDR, const short lDPhi, const short hDPhi) const
-{
-  char type = -1;
-  if ( (lDR==-15) && (hDR==15) && (lDPhi==-7) && (hDPhi==7))      type = TGCTriggerData::COIN_HH;
-  else if ( (lDR==-15) && (hDR==15) && (lDPhi==-3) && (hDPhi==3)) type = TGCTriggerData::COIN_HL;
-  else if ( (lDR==-7) && (hDR==7) && (lDPhi==-7) && (hDPhi==7))   type = TGCTriggerData::COIN_LH;
-  else if ( (lDR==-7) && (hDR==7) && (lDPhi==-3) && (hDPhi==3))   type = TGCTriggerData::COIN_LL;
-  return type;
-}
-
-unsigned short TGCTriggerDbAlg::getRoIAddr(const char type, const unsigned char phimod2,
-                                           const unsigned short module, const unsigned short roi) const
-{
-  return (type<<13) + ((phimod2&0x1)<<12) + ((module&0xf)<<8) + roi;
-}
-
 void TGCTriggerDbAlg::fillTrigBitEifi(TGCTriggerData* writeCdo)
 {
   // remove all entries
diff --git a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCRPhiCoincidenceMap.h b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCRPhiCoincidenceMap.h
index e36fc2f90f06..ac26c9bc229a 100644
--- a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCRPhiCoincidenceMap.h
+++ b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCRPhiCoincidenceMap.h
@@ -17,11 +17,27 @@
 
 namespace LVL1TGCTrigger {
 
-class TGCRPhiCoincidenceMap {
-public:
-  bool test(int octantId, int moduleId, int subsector, 
-            int type, int pt, 
-            int dr, int dphi) const;// for Run2
+/** Contents of Run-2 BW-CW LUT
+ *  ===========================
+ *   std::unordered_map<GLOBALADDR, PTVALUE>
+ *  where
+ *   GLOBALADDR | 27 bits | unsigned int  | side, octant, type, phimod2, module, roi,
+ *                                        | DR(0...0x1f for -15...15)<<4 & DPhi(0...0xf for -7...7)
+ *   PTVALUE    |  3 bits | unsigned char | pT value (0x0 and 0x7 is no cand.)
+ *
+ *  for GLOBALADDR
+ *  | 29 |28|27|26|25|24|23|   22  |21|20|19|18|17|16|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
+ *  |side| octant | 0|type |phimod2|  module   |          RoI          | 0|   delta R    | delta Phi |
+ *  where side   = 0x0 (A-side), 0x1 (C-side).
+ *        octant = 0x(0...7)
+ *        type   = 0x0 (HH), 0x1 (HL), 0x2 (LH), 0x3 (LL): HL means 3-station-wire and 2-station-strip.
+ */
+
+class TGCRPhiCoincidenceMap
+{
+ public:
+  uint8_t test(int octantId, int moduleId, int subsector, 
+               int type, int dr, int dphi) const;// for Run2
 
   int test_Run3(int octantId, int moduleId, int subsector, 
                 int type, int dr, int dphi) const; //for Run3
@@ -58,8 +74,6 @@ public:
   bool checkVersion();
   int PHIPOS(int iphi, int type) const;
   int SUBSECTORADD(int ssid, int modid, int phimod2, int type) const;
-  unsigned short getRoIAddr(const char type, const unsigned char phimod2,
-                            const unsigned short module, const unsigned short roi) const;
 
   int getMODID(int addr) const;
   int getSSID(int addr) const;
@@ -78,8 +92,8 @@ public:
               {'a',-1},{'b',-2},{'c',-3},{'d',-4},{'e',-5},{'f',-6},{'g',-7},{'h',-8},{'i',-9},{'j',-10},{'k',-11},{'l',-12},{'m',-13},{'n',-14},{'o',-15} };
 
 
-private:
-  std::map<int, std::map<int,int> > m_mapDB[N_PT_THRESH];//for Run2 [ptLevel]< RoI(&type),<RNumber,RWindow> >
+ private:
+  std::unordered_map<uint32_t, uint8_t> m_ptmap;
   std::map<int, std::map<int, std::map<int, char> > > m_mapDB_Run3;//for Run3 <RoI(&type),<R,<Phi,pT(char)> > >
 
 
@@ -133,15 +147,16 @@ inline
   m_fullCW = val;
 }
 
-inline
- int TGCRPhiCoincidenceMap::getTYPE(int lDR, int hDR, int lDPhi, int hDPhi ) const
- {
-   int type = -1;
-   if ( (lDR==-15) && (hDR==15) && (lDPhi==-7) && (hDPhi==7))      type = TMap_HH;
-   else if ( (lDR==-15) && (hDR==15) && (lDPhi==-3) && (hDPhi==3)) type = TMap_HL;
-   else if ( (lDR==-7) && (hDR==7) && (lDPhi==-7) && (hDPhi==7))   type = TMap_LH;
-   else if ( (lDR==-7) && (hDR==7) && (lDPhi==-3) && (hDPhi==3))   type = TMap_LL; 
-   return type; 
+inline int TGCRPhiCoincidenceMap::getTYPE(int lDR, int hDR, int lDPhi, int hDPhi) const
+{
+  if((lDR == -TGCTriggerData::DR_HIGH_RANGE) && (hDR == TGCTriggerData::DR_HIGH_RANGE)) {
+    if     ((lDPhi == -TGCTriggerData::DPHI_HIGH_RANGE) && (hDPhi == TGCTriggerData::DPHI_HIGH_RANGE)) return TGCTriggerData::COIN_HH;
+    else if((lDPhi == -TGCTriggerData::DPHI_LOW_RANGE) && (hDPhi == TGCTriggerData::DPHI_LOW_RANGE))   return TGCTriggerData::COIN_HL;
+  } else if((lDR == -TGCTriggerData::DR_LOW_RANGE) && (hDR == TGCTriggerData::DR_LOW_RANGE)) {
+    if     ((lDPhi == -TGCTriggerData::DPHI_HIGH_RANGE) && (hDPhi == TGCTriggerData::DPHI_HIGH_RANGE)) return TGCTriggerData::COIN_LH;
+    else if((lDPhi == -TGCTriggerData::DPHI_LOW_RANGE) && (hDPhi == TGCTriggerData::DPHI_LOW_RANGE))   return TGCTriggerData::COIN_LL;
+  }
+  return -1;
 }
 
 inline
@@ -171,12 +186,6 @@ inline
  int TGCRPhiCoincidenceMap::getTYPE(int addr) const
  { return ((addr>>16)&0x0003); }
 
-inline
- unsigned short TGCRPhiCoincidenceMap::getRoIAddr(const char type, const unsigned char phimod2,
-                                                  const unsigned short module, const unsigned short roi) const
-{
-  return ((type & 0x3)<<13) + ((phimod2&0x1)<<12) + (module<<8) + roi;
-}
 
 } //end of namespace bracket
 
diff --git a/Trigger/TrigT1/TrigT1TGC/src/TGCRPhiCoincidenceMap.cxx b/Trigger/TrigT1/TrigT1TGC/src/TGCRPhiCoincidenceMap.cxx
index 628fda4087eb..71a19563d221 100644
--- a/Trigger/TrigT1/TrigT1TGC/src/TGCRPhiCoincidenceMap.cxx
+++ b/Trigger/TrigT1/TrigT1TGC/src/TGCRPhiCoincidenceMap.cxx
@@ -24,54 +24,44 @@
 
 namespace LVL1TGCTrigger {
 
-bool TGCRPhiCoincidenceMap::test(int octantId, int moduleId, int subsector, 
-				 int type, int pt, 
-				 int dr, int dphi) const
-{  
-  // check pt range
-  if (pt<0 || pt>=N_PT_THRESH) return false;
-  if (type<0 || type>=N_TMap ) return false; 
+uint8_t TGCRPhiCoincidenceMap::test(int octantId, int moduleId, int subsector, 
+                                    int type, int dr, int dphi) const
+{
+  if (type<0 || type>=N_TMap) return 0;  // check the range of coincidence type
 
-  int sector=(moduleId-2)/3+octantId*3;
-  int phimod2 = (moduleId==2||moduleId==5||moduleId==8)&&(sector%2==1) ? 1 : 0;
+  uint16_t sector = (moduleId-2)/3 + octantId*3;  // sector number in the forward region (0...23)
+  // calculate whether the front or back side of the forward chamber
+  uint8_t phimod2 = (moduleId==2||moduleId==5||moduleId==8)&&(sector%2==1) ? 1 : 0;
+
+  uint32_t addr = ((type & TGCTriggerData::TYPE_MASK)<<TGCTriggerData::TYPE_SHIFT) +
+                  ((phimod2 & TGCTriggerData::PHIMOD2_MASK)<<TGCTriggerData::PHIMOD2_SHIFT) +
+                  ((moduleId & TGCTriggerData::MODULE_MASK)<<TGCTriggerData::MODULE_SHIFT) +
+                  ((subsector & TGCTriggerData::ROI_MASK)<<TGCTriggerData::ROI_SHIFT) +
+                  (((dr-DR_offset) & TGCTriggerData::DR_MASK)<<TGCTriggerData::DR_SHIFT) +
+                  (((dphi-DPhi_offset) & TGCTriggerData::DPHI_MASK)<<TGCTriggerData::DPHI_SHIFT);
+
+  uint8_t content = 0x0;   // outside from defined window, i.e. pT=0
 
   if(tgcArgs()->USE_CONDDB()) {
     SG::ReadCondHandle<TGCTriggerData> readHandle{m_readCondKey};
     const TGCTriggerData* readCdo{*readHandle};
 
-    std::map<unsigned short, std::map<unsigned short, unsigned char>> roiMap = readCdo->getPtMapBw(m_side, m_octant);
-
-    unsigned short addr = getRoIAddr((char)type, (unsigned char)phimod2, (unsigned short)moduleId, (unsigned short)subsector);
-    std::map<unsigned short, std::map<unsigned short, unsigned char> >::const_iterator it = roiMap.find(addr);
-    if(it == roiMap.end()) return false;
-
-    std::map<unsigned short, unsigned char> ptMap = it->second;
-    std::map<unsigned short, unsigned char>::const_iterator itWindow = ptMap.find( (((dr+15)&0x1f)<<4) + ((dphi+7)&0xf) );
-
-    if (itWindow == ptMap.end()) return false;
-
-    if ( (itWindow->second) == (pt+1) ) return true;
-    else return false;
-
+    bool fullCW = (readCdo->getType(TGCTriggerData::CW_BW) == "full");
+    if(fullCW) addr += (m_side<<TGCTriggerData::SIDE_SHIFT) +
+                       ((m_octant & TGCTriggerData::OCTANT_MASK)<<TGCTriggerData::OCTANT_SHIFT);
+    content = readCdo->getBigWheelPt(addr);
   } else {
-    int addr=SUBSECTORADD(subsector, moduleId, phimod2,type);
-    std::map<int, std::map<int, int> > readMap = m_mapDB[pt];
-
-    std::map<int, std::map<int, int> >::const_iterator it = readMap.find(addr);
-    if (it==(readMap.end())) return false;
+    if(m_fullCW) addr += (m_side<<TGCTriggerData::SIDE_SHIFT) +
+                         ((m_octant & TGCTriggerData::OCTANT_MASK)<<TGCTriggerData::OCTANT_SHIFT);
 
-    std::map<int, int> aMap = it->second;
-    std::map<int, int>::const_iterator itWindow= aMap.find( dr );
-    if (itWindow==aMap.end()) return false;
-
-    if ( (itWindow->second) & ( 1<<(PHIPOS(dphi,type)) ) ) return true;
-    else return false;
+    std::unordered_map<uint32_t, uint8_t>::const_iterator it = m_ptmap.find(addr);
+    if(it != m_ptmap.end()) content = it->second;
   }
 
+  return content;
 }
 
 
-
 int TGCRPhiCoincidenceMap::test_Run3(int octantId, int moduleId, int subsector, 
                                      int type, int dr, int dphi) const
 {  
@@ -112,15 +102,12 @@ int TGCRPhiCoincidenceMap::test_Run3(int octantId, int moduleId, int subsector,
 
 
 
-
-
 TGCRPhiCoincidenceMap::TGCRPhiCoincidenceMap(TGCArguments* tgcargs,
 					     const SG::ReadCondHandleKey<TGCTriggerData>& readCondKey,
 					     const SG::ReadCondHandleKey<TGCTriggerLUTs>& readLUTsCondKey,
-
                                              const std::string& version,
 					     int   sideId, int octantId)
-  :m_numberOfDR(0), m_numberOfDPhi(0),
+ : m_numberOfDR(0), m_numberOfDPhi(0),
    m_verName(version),
    m_side(sideId),
    m_octant(octantId),
@@ -132,13 +119,12 @@ TGCRPhiCoincidenceMap::TGCRPhiCoincidenceMap(TGCArguments* tgcargs,
   if (!tgcArgs()->USE_CONDDB()) {
     if(!tgcArgs()->useRun3Config()){
       if (!checkVersion()){
-      m_verName = "NA";
-      return;
+        m_verName = "NA";
+        return;
       }
       this->readMap();  // read Coincidence Map for Run2 (6 thresholds)
-    }
-    else{
-      this -> readMap_Run3();// read Coincidence Map for Run3 (15 thresholds)
+    } else {
+      this->readMap_Run3();// read Coincidence Map for Run3 (15 thresholds)
     }
   } 
 }
@@ -248,16 +234,11 @@ TGCRPhiCoincidenceMap& TGCRPhiCoincidenceMap::operator=(const TGCRPhiCoincidence
 
 bool TGCRPhiCoincidenceMap::readMap() 
 {
-  const int NumberOfModuleType=12;
-  const int ModuleNumber[NumberOfModuleType]  =
-    {  0,  1,   2,   2,  3,  4,   5,   5,  6,  7,   8,  8 };
-  const std::string ModuleName[NumberOfModuleType]=
-    {"0","1","2a","2b","3","4","5a","5b","6","7","8a","8b"};
-  const std::string SideName[NumberOfSide] = {"A","C"};
-  const std::string OctantName[NumberOfOctant] = 
-    {  "0", "1", "2", "3", "4", "5", "6", "7"};
+  const uint8_t kNMODULETYPE = 12;
+  const uint8_t modulenumber[kNMODULETYPE] = {0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8};
+  const std::string modulename[kNMODULETYPE] = {"0","1","2a","2b","3","4","5a","5b","6","7","8a","8b"};
+  const std::string sidename[NumberOfSide] = {"A","C"};
 
-  
   IMessageSvc* msgSvc = 0;
   ISvcLocator* svcLocator = Gaudi::svcLocator();
   if (svcLocator->service("MessageSvc", msgSvc) == StatusCode::FAILURE) {
@@ -265,83 +246,82 @@ bool TGCRPhiCoincidenceMap::readMap()
   }
   MsgStream log(msgSvc, "TGCRPhiCoincidenceMap::TGCRPhiCoincidenceMap");
 
-  // initialize
-  enum{BufferSize=1024};
-  char buf[BufferSize];
-  std::string fn, fullName, tag;
-  int ssId,ptLevel,bit,mod;
+  uint32_t octaddr = (m_side<<TGCTriggerData::SIDE_SHIFT) +
+                     ((m_octant & TGCTriggerData::OCTANT_MASK)<<TGCTriggerData::OCTANT_SHIFT);
 
   // loop over all files...
-  for(int iModule=0; iModule<NumberOfModuleType; iModule+=1) {
-    int phimod2=ModuleName[iModule].find("b")!=std::string::npos ? 1 : 0;
-    std::ostringstream modName;
-    std::string fn = "RPhiCoincidenceMap.mod" 
-                      + ModuleName[iModule] + "." + m_verName +"._12.db";
-    if (m_fullCW) {
-      if ( (m_side>=0) && (m_side<NumberOfSide) && 
-	   (m_octant>=0) && (m_octant<NumberOfOctant)) {
-	fn = "RPhiCoincidenceMap." 
-	              + SideName[m_side] + OctantName[m_octant]  
-                      + ".mod" + ModuleName[iModule] 
-                      + "." + m_verName +"._12.db";
-      } 
+  for(int iModule=0; iModule<kNMODULETYPE; iModule+=1) {
+
+    std::ostringstream fn;
+    fn << "RPhiCoincidenceMap.";
+    if(m_fullCW) {
+      if( (m_side>=0) && (m_side<NumberOfSide) &&
+          (m_octant>=0) && (m_octant<NumberOfOctant)) {
+        fn << sidename[m_side] << m_octant << ".";
+      }
+    }
+    fn << "mod" << modulename[iModule] << "." << m_verName  << "._12.db";
+
+    std::string fullname = PathResolver::find_file(fn.str().c_str(), "DATAPATH");
+    if( fullname.length() == 0 ) {
+      log << MSG::ERROR
+          << " Could not found "
+          << fn.str().c_str() << endmsg;
+      return false ;
     }
 
-    int type = -1;
-    int lDR, hDR, lDPhi, hDPhi;
+    uint32_t phimod2 = (modulename[iModule].find("b") != std::string::npos) ? 1 : 0;
+    uint32_t modaddr = ((modulenumber[iModule] & TGCTriggerData::MODULE_MASK)<<TGCTriggerData::MODULE_SHIFT) +
+                       ((phimod2 & TGCTriggerData::PHIMOD2_MASK)<<TGCTriggerData::PHIMOD2_SHIFT);
 
-    fullName = PathResolver::find_file( fn.c_str(), "DATAPATH" );
-    if( fullName.length() == 0 ) { 
-      log << MSG::ERROR 
-	  << " Could not found " 
-	  << fn.c_str() << endmsg;
-      return false ;  
-    } 
+    std::ifstream file(fullname.c_str(),std::ios::in);
+    enum{BufferSize=1024};
+    char buf[BufferSize];
+
+    while(file.getline(buf,BufferSize)) {
 
-    std::ifstream file(fullName.c_str(),std::ios::in);    
-    while(file.getline(buf,BufferSize)){
       std::istringstream header(buf);
+      std::string tag;
+
       header>>tag;
-      if(tag=="#"){ // read header part.     
-	header>>ptLevel>>ssId>>mod>>lDR>>hDR>>lDPhi>>hDPhi;
-	type = getTYPE( lDR, hDR, lDPhi, hDPhi );
-	// check moduleNumber and ptLevel
-	if(mod!=ModuleNumber[iModule] || ptLevel>N_PT_THRESH || type<0 ) {
-	  log << MSG::WARNING 
-	      << " illegal parameter in database header : "
-	      << header.str()
-	      << " in file " << fn 
-	      << endmsg;
-	  break;
-	}
+      if(tag=="#") { // read header part.
+
+        uint16_t ptLevel, roi, mod;
+        int16_t lDR, hDR, lDPhi, hDPhi;
+        header >> ptLevel >> roi >> mod >> lDR >> hDR >> lDPhi >> hDPhi;
+
+        int16_t type = getTYPE( lDR, hDR, lDPhi, hDPhi );
+
+        // check moduleNumber and ptLevel
+        if(mod != modulenumber[iModule] || ptLevel > N_PT_THRESH || type<0 ) {
+          log << MSG::WARNING
+              << " illegal parameter in database header : "
+              << header.str()
+              << " in file " << fn.str()
+              << endmsg;
+          break;
+        }
 
-	// get window data
-	file.getline(buf,BufferSize);
-	std::istringstream cont(buf);
-	std::map<int, int> aWindow;
-	for(int ir=0; ir<=hDR-DR_offset; ir++) {
-	  cont>>bit;
-	  if (bit==0) continue; // none of window is opened in this dR
-	  aWindow[ir+DR_offset] = bit;
-	}
-	// Warning : no window 
-	if (aWindow.size()==0) {
-	  if (tgcArgs()->MSGLEVEL() <= MSG::DEBUG) {
-	    log << MSG::DEBUG
-		<< " No window is opened for (ptLevel,ssId,mod) = (" 
-		<< ptLevel << ", " << ssId << ", " << mod << ")" 
-		<<endmsg;
-	  }
-	}
-	int addr = SUBSECTORADD(ssId,mod,phimod2,type);
-	if (m_mapDB[ptLevel-1].find(addr)!=m_mapDB[ptLevel-1].end()) {
-	  if (tgcArgs()->MSGLEVEL() <= MSG::DEBUG) {
-	    log << MSG::DEBUG
-		<< "This subsector was already reserved." 
-		<< endmsg;
-	  }
-	} else {
-	  m_mapDB[ptLevel-1][addr]=aWindow;
+        uint32_t cwaddr = ((uint8_t(type) & TGCTriggerData::TYPE_MASK)<<TGCTriggerData::TYPE_SHIFT) + 
+                          ((roi & TGCTriggerData::ROI_MASK)<<TGCTriggerData::ROI_SHIFT);
+
+        // get window data
+        file.getline(buf,BufferSize);
+        std::istringstream cont(buf);
+
+        for(uint8_t ir=0; ir<=hDR-DR_offset; ir++) {
+          uint32_t draddr = (ir & TGCTriggerData::DR_MASK)<<TGCTriggerData::DR_SHIFT;
+
+          uint32_t bit;
+	  cont >> bit;
+	  if (bit == 0) continue;   // none of window is opened in this dR
+
+          for(uint8_t iphi=0; iphi<hDPhi-DPhi_offset; iphi++) {
+            if(bit>>iphi & 0x1) {
+              uint32_t theaddr = octaddr + modaddr + cwaddr + draddr + iphi;
+              m_ptmap[theaddr] = (uint8_t)(ptLevel & TGCTriggerData::PT_MASK);
+            }
+          }
 	}
       }
     }
diff --git a/Trigger/TrigT1/TrigT1TGC/src/TGCRPhiCoincidenceMatrix.cxx b/Trigger/TrigT1/TrigT1TGC/src/TGCRPhiCoincidenceMatrix.cxx
index b52714bd86b9..419b91ffbf60 100644
--- a/Trigger/TrigT1/TrigT1TGC/src/TGCRPhiCoincidenceMatrix.cxx
+++ b/Trigger/TrigT1/TrigT1TGC/src/TGCRPhiCoincidenceMatrix.cxx
@@ -67,10 +67,9 @@ TGCRPhiCoincidenceOut* TGCRPhiCoincidenceMatrix::doCoincidence()
   out->setIdSSC(m_SSCId);
 
   int j0 = -1;
-  int ptMax=-1;
+  int ptMax = 1;
   for( int j=m_nPhiHit-1; j>=0; j-=1){     // left half-SSC has priority when both output same pT
     int subsector;
-    int ptOut = -99;
     int chargeOut = 2;
     int CoincidenceTypeOut=-1;
 
@@ -80,9 +79,10 @@ TGCRPhiCoincidenceOut* TGCRPhiCoincidenceMatrix::doCoincidence()
       subsector = 4*(2*m_SSCId+m_r)+m_phi[j];
     }
     
-
     int type = m_map->getMapType(m_ptR, m_ptPhi[j]);
+
     // calculate pT of muon candidate
+    uint8_t ptOut = 0;   // 0 is no candidate.
     if(tgcArgs()->useRun3Config()){
       //Algorithm for Run3
       int pt=m_map->test_Run3(m_sectorLogic->getOctantID(),m_sectorLogic->getModuleID(),
@@ -91,25 +91,22 @@ TGCRPhiCoincidenceOut* TGCRPhiCoincidenceMatrix::doCoincidence()
       chargeOut = pt<0 ? 0:1;
       
       CoincidenceTypeOut=(type==0);
-    }
-    else{
-      for( int pt=NumberOfPtLevel-1; pt>=0; pt-=1){
-	if(m_map->test(m_sectorLogic->getOctantID(),m_sectorLogic->getModuleID(),subsector,
-		       type, pt,
-		       m_dR,m_dPhi[j])) {
-	  ptOut = pt;
-	  break;
-	}
-      } // loop pt
+
+    } else {    // for Run-2
+      ptOut = m_map->test(m_sectorLogic->getOctantID(),
+                          m_sectorLogic->getModuleID(), subsector,
+                          type, m_dR, m_dPhi[j]);
     }
 
-    // Trigger Out
-    if( ptOut >= ptMax ){
+    // Trigger Out (only pT>0 candidate
+    if(ptOut >= ptMax) {
       ptMax = ptOut;
       out->clear();    
       out->setIdSSC(m_SSCId);
-      if(!tgcArgs()->useRun3Config()){out->setHit(ptMax+1);}// for Run2 Algo
-      else{out->setpT(ptMax);}// for Run3 Algo
+
+      if(!tgcArgs()->useRun3Config()) out->setHit(ptMax);  // for Run2 Algo
+      else                            out->setpT(ptMax);   // for Run3 Algo
+
       out->setR(m_r);
       out->setPhi(m_phi[j]);
       out->setDR(m_dR);
-- 
GitLab


From f5b7a8fdd011ebc3fab54864dc76f9cc3fc1c1e8 Mon Sep 17 00:00:00 2001
From: Jonathan Bossio <jonathan.bossio@cern.ch>
Date: Thu, 17 Dec 2020 12:29:53 +0000
Subject: [PATCH 113/225] Create truth jets (if requested) in offline jetmon

Added only to main function but could be added to TrigJetMonConfig if
needed
---
 .../python/TrigJetMonitorAlgorithm.py         | 54 ++++++++++++++-----
 1 file changed, 42 insertions(+), 12 deletions(-)

diff --git a/Trigger/TrigMonitoring/TrigJetMonitoring/python/TrigJetMonitorAlgorithm.py b/Trigger/TrigMonitoring/TrigJetMonitoring/python/TrigJetMonitorAlgorithm.py
index f118878e94cc..c23d9c7b92e9 100644
--- a/Trigger/TrigMonitoring/TrigJetMonitoring/python/TrigJetMonitorAlgorithm.py
+++ b/Trigger/TrigMonitoring/TrigJetMonitoring/python/TrigJetMonitorAlgorithm.py
@@ -132,6 +132,7 @@ def getEtaRange(chain):
 # Schedule more histograms for dedicated jet collections
 #########################################################
 from JetMonitoring.JetMonitoringConfig import JetMonAlgSpec, HistoSpec, EventHistoSpec, SelectSpec, ToolSpec #VarSpec can be added to define specific/custom variables
+from AthenaConfiguration.ComponentFactory import CompFactory
 
 # All offline jet collections
 ExtraOfflineHists = [
@@ -187,7 +188,6 @@ def TrigJetMonConfig(inputFlags):
 
   # Match HLT to offline jets
   for j1,j2 in JetColls2Match[InputType].items():
-    from AthenaConfiguration.ComponentFactory import CompFactory
     name = 'Matching_{}_{}'.format(j1,j2)
     alg = CompFactory.JetMatcherAlg(name, JetContainerName1=j1,JetContainerName2=j2)
     cfg.addEventAlgo(alg)
@@ -471,7 +471,7 @@ def jetEfficiencyMonitoringConfig(inputFlags,onlinejetcoll,offlinejetcoll,chain,
        # create a monitoring group with the histo path starting from the parentAlg
        group = monhelper.addGroup(parentAlg, conf.Group, conf.topLevelDir+jetcollFolder+'/')
        # define the histogram
-       group.defineHistogram('trigPassed,jetVar',title='titletrig', type="TEfficiency", path=chainFolder, xbins=100 , xmin=0, xmax=500000. ,)
+       group.defineHistogram('trigPassed,jetVar',title='titletrig', type="TEfficiency", path=chainFolder, xbins=1000 , xmin=0, xmax=1000000. ,)
 
    # Get jet index and eta selection for offline jets
    parts        = chain.split('j')
@@ -527,12 +527,16 @@ if __name__=='__main__':
 
   # Read arguments
   parser = argparse.ArgumentParser()
-  parser.add_argument('--athenaMT', action='store_true', dest='athenaMT', default=False)
-  parser.add_argument('--legacy',   action='store_true', dest='legacy',   default=False)
-  parser.add_argument('--input',    action='store',      dest='inputFile')
-  args     = parser.parse_args()
-  AthenaMT = args.athenaMT
-  Legacy   = args.legacy
+  parser.add_argument('--athenaMT',            action='store_true', dest='athenaMT',            default=False)
+  parser.add_argument('--legacy',              action='store_true', dest='legacy',              default=False)
+  parser.add_argument('--runTruthReco',        action='store_true', dest='runTruthReco',        default=False)
+  parser.add_argument('--printDetailedConfig', action='store_true', dest='printDetailedConfig', default=False)
+  parser.add_argument('--input',               action='store',      dest='inputFile')
+  args                = parser.parse_args()
+  AthenaMT            = args.athenaMT
+  Legacy              = args.legacy
+  RunTruth            = args.runTruthReco
+  PrintDetailedConfig = args.printDetailedConfig
   # Protections
   if AthenaMT and Legacy:
     print('ERROR: Choose AthenaMT or Legacy, exiting')
@@ -566,15 +570,38 @@ if __name__=='__main__':
   from AthenaConfiguration.MainServicesConfig import MainServicesCfg 
   from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
   cfg = MainServicesCfg(ConfigFlags)
+
+  # AthenaMT or Legacy
+  InputType = 'MT' if AthenaMT else 'Legacy'
+
+  # Reconstruct small-R truth jets
+  if RunTruth:
+    from JetRecConfig.StandardSmallRJets import AntiKt4Truth # import the standard definitions
+    # Add the components from our jet reconstruction job
+    from JetRecConfig.JetRecConfig import JetRecCfg
+    comp = JetRecCfg(AntiKt4Truth,ConfigFlags)
+    cfg.merge(comp)
+    # Write jet collection to AOD
+    # First define the output list
+    key = "{0}Jets".format(AntiKt4Truth.basename)
+    outputlist = ["xAOD::JetContainer#"+key,"xAOD::JetAuxContainer#"+key+"Aux.-PseudoJet"]
+    # Now get the output stream components
+    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+    cfg.merge(OutputStreamCfg(ConfigFlags,"xAOD",ItemList=outputlist))
+
   cfg.merge(PoolReadCfg(ConfigFlags))
 
   # The following class will make a sequence, configure algorithms, and link
   # them to GenericMonitoringTools
   from AthenaMonitoring import AthMonitorCfgHelper
   helper = AthMonitorCfgHelper(ConfigFlags,'TrigJetMonitorAlgorithm')
+  cfg.merge(helper.result()) # merge it to add the sequence needed to add matchers
 
-  # AthenaMT or Legacy
-  InputType = 'MT' if AthenaMT else 'Legacy'
+  # Match HLT to offline jets
+  for j1,j2 in JetColls2Match[InputType].items():
+    name = 'Matching_{}_{}'.format(j1,j2)
+    alg = CompFactory.JetMatcherAlg(name, JetContainerName1=j1,JetContainerName2=j2)
+    cfg.addEventAlgo(alg,sequenceName='AthMonSeq_TrigJetMonitorAlgorithm') # Add matchers to monitoring alg sequence
 
   # Loop over L1 jet collectoins
   for jetcoll in L1JetCollections:
@@ -600,13 +627,13 @@ if __name__=='__main__':
 
   # Loop over HLT jet chains
   for chain,jetcoll in Chain2JetCollDict[InputType].items():
+    # kinematic plots
     if AthenaMT:
       chainMonitorConfT = jetChainMonitoringConfig(ConfigFlags,jetcoll,chain,AthenaMT,True)
       chainMonitorConfT.toAlg(helper)
     chainMonitorConfF = jetChainMonitoringConfig(ConfigFlags,jetcoll,chain,AthenaMT,False)
     chainMonitorConfF.toAlg(helper)
-
-    # Produce efficiency plots
+    # efficiency plots
     refChain       = 'NONE'
     offlineJetColl = 'NONE'
     if chain in TurnOnCurves[InputType]:
@@ -618,4 +645,7 @@ if __name__=='__main__':
 
   cfg.merge(helper.result())
   
+  # Print config
+  cfg.printConfig(withDetails=PrintDetailedConfig)
+
   cfg.run()
-- 
GitLab


From d84bb23032a01177d6810a9f3160c35d839b2d4a Mon Sep 17 00:00:00 2001
From: Ludovica Aperio Bella <ludovica.aperio.bella@cern.ch>
Date: Thu, 17 Dec 2020 12:30:10 +0000
Subject: [PATCH 114/225] ATLASRECTS-5709 : Forward electron cluster cells

---
 .../share/RecExCommon_topOptions.py           |   2 +
 .../python/egammaLargeFWDClusterMakerAlg.py   |  27 ++
 .../egammaLargeFWDClusterMakerAlgConfig.py    |  31 +++
 .../egammaConfig/python/egammaConfigFlags.py  |   7 +-
 .../egammaRec/python/egammaForwardGetter.py   |  20 +-
 .../egamma/egammaRec/python/egammaKeys.py     |   8 +-
 .../share/egammaOutputItemList_jobOptions.py  |   7 +-
 .../egammaLargeFWDClusterMakerConfig.py       |  21 ++
 .../python/egammaToolsFactories.py            |   8 +
 .../src/egammaLargeClusterMaker.cxx           | 254 ++++++++++++------
 .../egammaTools/src/egammaLargeClusterMaker.h |  15 ++
 11 files changed, 316 insertions(+), 84 deletions(-)
 create mode 100644 Reconstruction/egamma/egammaAlgs/python/egammaLargeFWDClusterMakerAlg.py
 create mode 100644 Reconstruction/egamma/egammaAlgs/python/egammaLargeFWDClusterMakerAlgConfig.py
 create mode 100644 Reconstruction/egamma/egammaTools/python/egammaLargeFWDClusterMakerConfig.py

diff --git a/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py b/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py
index 9988b612aecf..4e676def9872 100644
--- a/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py
+++ b/Reconstruction/RecExample/RecExCommon/share/RecExCommon_topOptions.py
@@ -1285,6 +1285,8 @@ if ( rec.doAOD() or rec.doWriteAOD()) and not rec.readAOD() :
             if ( rec.readESD() or jobproperties.egammaRecFlags.Enabled ) and not rec.ScopingLevel()==4 and rec.doEgamma :
                 from egammaRec import egammaKeys
                 addClusterToCaloCellAOD(egammaKeys.outputClusterKey())
+                addClusterToCaloCellAOD(egammaKeys.outputFwdClusterKey())
+                addClusterToCaloCellAOD(egammaKeys.outputEgammaLargeFWDClustersKey())
                 if "itemList" in metadata:
                     if ('xAOD::CaloClusterContainer', egammaKeys.EgammaLargeClustersKey()) in metadata["itemList"]:
                         # check first for priority if both keys are in metadata
diff --git a/Reconstruction/egamma/egammaAlgs/python/egammaLargeFWDClusterMakerAlg.py b/Reconstruction/egamma/egammaAlgs/python/egammaLargeFWDClusterMakerAlg.py
new file mode 100644
index 000000000000..55d7995fc77c
--- /dev/null
+++ b/Reconstruction/egamma/egammaAlgs/python/egammaLargeFWDClusterMakerAlg.py
@@ -0,0 +1,27 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
+__doc__ = """ToolFactory to instantiate egammaLargeClusterMaker
+with FWD configuration"""
+__author__ = "Jovan Mitrevski"
+
+from egammaTools.egammaToolsFactories import egammaLargeFWDClusterMakerTool
+from CaloRec import CaloRecConf
+from egammaRec.Factories import AlgFactory, FcnWrapper
+from egammaRec import egammaKeys
+from CaloClusterCorrection.CaloSwCorrections import make_CaloSwCorrections
+
+
+def clusMakerTools():
+    return [egammaLargeFWDClusterMakerTool()]
+
+egammaLargeFWDClusterMakerAlg = AlgFactory(
+    CaloRecConf.CaloClusterMaker,
+    name="egammaLargeFWDClusterMaker",
+    SaveUncalibratedSignalState=False,
+    ClustersOutputName=egammaKeys.EgammaLargeFWDClustersKey(),
+    ClusterMakerTools=FcnWrapper(clusMakerTools),
+    ClusterCorrectionTools=make_CaloSwCorrections("FWDele6_6",
+                                                  suffix="Nocorr",
+                                                  version="none",
+                                                  corrlist=[],
+                                                  cells_name=egammaKeys.caloCellKey()))
diff --git a/Reconstruction/egamma/egammaAlgs/python/egammaLargeFWDClusterMakerAlgConfig.py b/Reconstruction/egamma/egammaAlgs/python/egammaLargeFWDClusterMakerAlgConfig.py
new file mode 100644
index 000000000000..5bfcfc53493f
--- /dev/null
+++ b/Reconstruction/egamma/egammaAlgs/python/egammaLargeFWDClusterMakerAlgConfig.py
@@ -0,0 +1,31 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+
+__doc__ = "Configure egammaLargeFWDClusterMaker, which chooses cells to store in the AOD" 
+__author__ = "Jovan Mitrevski"
+
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
+from egammaTools.egammaLargeFWDClusterMakerConfig import egammaLargeFWDClusterMakerCfg
+from CaloClusterCorrection.CaloSwCorrections import make_CaloSwCorrections
+CaloClusterMaker=CompFactory.CaloClusterMaker
+
+def egammaLargeFWDClusterMakerAlgCfg(flags, name = "egammaLargeClusterMaker", **kwargs):
+
+    acc = ComponentAccumulator
+    
+    kwargs.setdefault("SaveUncalibratedSignalState", False)
+    kwargs.setdefault("ClustersOutputName", flags.Egamma.Keys.Output.EgammaLargeFWDClusters)
+
+    if "ClusterMakerTools" not in kwargs:
+        toolAcc = egammaLargeFWDClusterMakerCfg(flags)
+        kwargs["ClusterMakerTools"] = [ toolAcc.popPrivateTools() ]
+        acc.merge(toolAcc)
+
+    kwargs.setdefault("ClusterCorrectionTools", make_CaloSwCorrections("FWDele6_6",
+                                                                       suffix="Nocorr",
+                                                                       version="none",
+                                                                       cells_name=flags.Egamma.Keys.Input.CaloCells))
+
+    acc.addEventAlgo(CaloClusterMaker(name, **kwargs))
+    return acc
+
diff --git a/Reconstruction/egamma/egammaConfig/python/egammaConfigFlags.py b/Reconstruction/egamma/egammaConfig/python/egammaConfigFlags.py
index 16e35e252163..1da6c4c5edfe 100644
--- a/Reconstruction/egamma/egammaConfig/python/egammaConfigFlags.py
+++ b/Reconstruction/egamma/egammaConfig/python/egammaConfigFlags.py
@@ -92,7 +92,12 @@ def createEgammaConfigFlags():
     egcf.addFlag("Egamma.Keys.Output.ForwardClusters", 'ForwardElectronClusters')
     egcf.addFlag("Egamma.Keys.Output.ForwardClustersSuppESD", '-SisterCluster')
     egcf.addFlag("Egamma.Keys.Output.ForwardClustersSuppAOD",
-                 '-SisterCluster.-CellLink')
+                 '-SisterCluster')
+
+    # These are the clusters that are used to determine which cells to write out to AOD
+    egcf.addFlag("Egamma.Keys.Output.EgammaLargeFWDClusters", 'egamma66FWDClusters')
+    egcf.addFlag("Egamma.Keys.Output.EgammaLargeFWDClustersSuppESD", '')
+    # don't define SuppAOD because the whole container is suppressed
 
     egcf.addFlag("Egamma.Keys.Output.Photons", 'Photons')
     egcf.addFlag("Egamma.Keys.Output.PhotonsSuppESD", '')
diff --git a/Reconstruction/egamma/egammaRec/python/egammaForwardGetter.py b/Reconstruction/egamma/egammaRec/python/egammaForwardGetter.py
index 13901af9f779..dca122f156c0 100755
--- a/Reconstruction/egamma/egammaRec/python/egammaForwardGetter.py
+++ b/Reconstruction/egamma/egammaRec/python/egammaForwardGetter.py
@@ -47,11 +47,11 @@ egammaForwardBuilder = AlgFactory(
 
 
 class egammaForwardGetter (Configured):
-
+    
     def configure(self):
         mlog = logging.getLogger('egammaForwardGetter.py::configure:')
         mlog.info('entering')
-
+        
         # configure egammaForward here:
         try:
             self._egammaFwdBuilderHandle = egammaForwardBuilder()
@@ -59,7 +59,21 @@ class egammaForwardGetter (Configured):
             mlog.error("could not get handle to egammaForward")
             traceback.print_exc()
             return False
+            
+            # the egammaLargeFWDClusterMaker
+            # (Which chooses the cells to store in the AOD)
+        from egammaAlgs.egammaLargeFWDClusterMakerAlg import (
+            egammaLargeFWDClusterMakerAlg)
+        try:
+            self._egammaLargeClusterMaker = egammaLargeFWDClusterMakerAlg()
+        except Exception:
+            mlog.error("could not get handle to egammaLargeClusterMaker")
+            import traceback
+            traceback.print_exc()
+            return False
+                
         return True
-
+                
     def egammaFwdBuilderHandle(self):
         return self._egammaFwdBuilderHandle
+                    
diff --git a/Reconstruction/egamma/egammaRec/python/egammaKeys.py b/Reconstruction/egamma/egammaRec/python/egammaKeys.py
index b6a4785be13a..51f654eb9a9e 100644
--- a/Reconstruction/egamma/egammaRec/python/egammaKeys.py
+++ b/Reconstruction/egamma/egammaRec/python/egammaKeys.py
@@ -23,6 +23,8 @@ class egammaKeysDict:
         Cluster=['xAOD::CaloClusterContainer', 'egammaClusters', '', ''],
         EgammaLargeClusters=['xAOD::CaloClusterContainer',
                              'egamma711Clusters', '', ''],  # not output to AOD
+        EgammaLargeFWDClusters=['xAOD::CaloClusterContainer',
+                                'egamma66FWDClusters', '', ''],  # not output to AOD
         TopoSeededCluster=['xAOD::CaloClusterContainer',
                            'egammaTopoSeededClusters', '', '-CellLink'],
         Electron=['xAOD::ElectronContainer', 'Electrons',
@@ -35,7 +37,7 @@ class egammaKeysDict:
         FwdElectron=['xAOD::ElectronContainer',
                      'ForwardElectrons', '', FwdElectronisemSupress],
         FwdCluster=['xAOD::CaloClusterContainer',
-                    'ForwardElectronClusters', '-SisterCluster', '.-CellLink'],
+                    'ForwardElectronClusters', '-SisterCluster', ''],
         Photon=['xAOD::PhotonContainer', 'Photons', '',
                 ShowerShapesSuppress+PhotonisemSupress],
         TrackParticle=['xAOD::TrackParticleContainer', 'GSFTrackParticles',
@@ -58,6 +60,10 @@ class egammaKeysDict:
                                               outputs['EgammaLargeClusters'][1] +
                                               '_links',
                                               '', '']
+    outputs['EgammaLargeFWDClustersCellLink'] = ['CaloClusterCellLinkContainer',
+                                              outputs['EgammaLargeFWDClusters'][1] +
+                                              '_links',
+                                              '', '']
     #
 
 
diff --git a/Reconstruction/egamma/egammaRec/share/egammaOutputItemList_jobOptions.py b/Reconstruction/egamma/egammaRec/share/egammaOutputItemList_jobOptions.py
index 04f7cb9a01ca..7b3d2acebc67 100755
--- a/Reconstruction/egamma/egammaRec/share/egammaOutputItemList_jobOptions.py
+++ b/Reconstruction/egamma/egammaRec/share/egammaOutputItemList_jobOptions.py
@@ -44,14 +44,13 @@ def addAuxContainer(outputList, cType, cKey, auxOptionAll='', auxOptionAOD=''):
 AOD_outputs = [i for i, j in egammaKeysDict.outputs.items()
                if i not in ('EgammaRec', 'PhotonSuperRec',
                             'ElectronSuperRec', 'TopoSeededCellLink',
-                            'FwdClusterCellLink', 'EgammaLargeClusters',
-                            'EgammaLargeClustersCellLink')]
+                            'EgammaLargeClusters',
+                            'EgammaLargeClustersCellLink','EgammaLargeFWDClusters', 'EgammaLargeFWDClustersCellLink')]
 
 
 ESD_outputs = [i for i, j in egammaKeysDict.outputs.items()
                if i not in ('EgammaRec', 'PhotonSuperRec',
-                            'ElectronSuperRec', 'TopoSeededCellLink',
-                            'FwdClusterCellLink')]
+                            'ElectronSuperRec', 'TopoSeededCellLink')]
 
 # Define egammaAODList in the proper format (<type>#<key><option>),
 # including aux containers
diff --git a/Reconstruction/egamma/egammaTools/python/egammaLargeFWDClusterMakerConfig.py b/Reconstruction/egamma/egammaTools/python/egammaLargeFWDClusterMakerConfig.py
new file mode 100644
index 000000000000..2d2938619f85
--- /dev/null
+++ b/Reconstruction/egamma/egammaTools/python/egammaLargeFWDClusterMakerConfig.py
@@ -0,0 +1,21 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+
+__doc__ = "Configure egammaLargeFWDClusterMaker, which chooses cells to store in the AOD" 
+__author__ = "Jovan Mitrevski"
+
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
+egammaLargeFWDClusterMaker=CompFactory.egammaLargeFWDClusterMaker
+
+def egammaLargeFWDClusterMakerCfg(flags, **kwargs):
+
+    acc = ComponentAccumulator
+    
+    kwargs.setdefault("CellsName", flags.Egamma.Keys.Input.CaloCells)
+    kwargs.setdefault("InputClusterCollection", flags.Egamma.Keys.Output.FwdCluster)
+    kwargs.setdefault("doFWDelesurraundingWindows", True)
+
+    acc.setPrivateTools(egammaLargeFWDClusterMaker(**kwargs))
+
+    return acc
+
diff --git a/Reconstruction/egamma/egammaTools/python/egammaToolsFactories.py b/Reconstruction/egamma/egammaTools/python/egammaToolsFactories.py
index 17caae683d5b..9871d1e65260 100644
--- a/Reconstruction/egamma/egammaTools/python/egammaToolsFactories.py
+++ b/Reconstruction/egamma/egammaTools/python/egammaToolsFactories.py
@@ -124,6 +124,14 @@ egammaLargeClusterMakerTool = ToolFactory(
     CellsName=egammaKeys.caloCellKey()
 )
 
+egammaLargeFWDClusterMakerTool = ToolFactory(
+    egammaToolsConf.egammaLargeClusterMaker,
+    name="egammaLCFWDMakerTool",
+    InputClusterCollection=egammaKeys.FwdClusterKey(),
+    CellsName=egammaKeys.caloCellKey(),
+    doFWDelesurraundingWindows = True
+)
+
 # Electron Selectors
 ElectronPIDBuilder = ToolFactory(
     EMPIDBuilderElectronBase,
diff --git a/Reconstruction/egamma/egammaTools/src/egammaLargeClusterMaker.cxx b/Reconstruction/egamma/egammaTools/src/egammaLargeClusterMaker.cxx
index f14bc25c976c..5b4679b947d7 100644
--- a/Reconstruction/egamma/egammaTools/src/egammaLargeClusterMaker.cxx
+++ b/Reconstruction/egamma/egammaTools/src/egammaLargeClusterMaker.cxx
@@ -5,6 +5,7 @@
 #include "egammaLargeClusterMaker.h"
 #include "CaloEvent/CaloCellContainer.h"
 #include "CaloEvent/CaloClusterCellLink.h"
+#include "CaloUtils/CaloCellList.h"
 #include "CaloUtils/CaloClusterStoreHelper.h"
 #include "egammaUtils/egammaEnergyPositionAllSamples.h"
 #include "xAODCaloEvent/CaloCluster.h"
@@ -52,83 +53,186 @@ egammaLargeClusterMaker::execute(const EventContext& ctx,
 
   const CaloDetDescrManager* dd_man = nullptr;
   ATH_CHECK(detStore()->retrieve(dd_man, "CaloMgr"));
-
+  
   // The main loop over clusters
   for (const auto *cluster : *inputClusters) {
-
-    // find the center of the cluster, copying the logic of
-    // egammaMiddleShape.cxx
-
-    // check if cluster is in barrel or in the end-cap
-    if (!cluster->inBarrel() && !cluster->inEndcap()) {
-      ATH_MSG_DEBUG(" Cluster is neither in Barrel nor in Endcap; skipping ");
-      continue;
-    }
-
-    // check if cluster is in barrel or end-cap
-    bool in_barrel = egammaEnergyPositionAllSamples::inBarrel(*cluster, 2);
-    CaloSampling::CaloSample sam = CaloSampling::EMB2;
-    if (in_barrel) {
-      sam = CaloSampling::EMB2;
-    } else {
-      sam = CaloSampling::EME2;
-    }
-    // granularity in (eta,phi) in the pre sampler
-    // CaloCellList needs both enums: subCalo and CaloSample
-    auto eta = cluster->etaSample(sam);
-    auto phi = cluster->phiSample(sam);
-
-    if ((eta == 0. && phi == 0.) || fabs(eta) > 100) {
-      return StatusCode::SUCCESS;
-    }
-
-    // Should get overritten
-    bool barrel = false;
-    CaloCell_ID::SUBCALO subcalo = CaloCell_ID::LAREM;
-    int sampling_or_module = 0;
-
-    CaloDetDescrManager::decode_sample(
+    
+    if (!m_isFWD) {
+      // find the center of the cluster, copying the logic of
+      // egammaMiddleShape.cxx
+      
+      // check if cluster is in barrel or in the end-cap
+      if (!cluster->inBarrel() && !cluster->inEndcap()) {
+	ATH_MSG_DEBUG(" Cluster is neither in Barrel nor in Endcap; skipping ");
+	continue;
+      }
+      
+      // check if cluster is in barrel or end-cap
+      bool in_barrel = egammaEnergyPositionAllSamples::inBarrel(*cluster, 2);
+      CaloSampling::CaloSample sam = CaloSampling::EMB2;
+      if (in_barrel) {
+	sam = CaloSampling::EMB2;
+      } else {
+	sam = CaloSampling::EME2;
+      }
+      
+      // granularity in (eta,phi) in the pre sampler
+      // CaloCellList needs both enums: subCalo and CaloSample
+      auto eta = cluster->etaSample(sam);
+      auto phi = cluster->phiSample(sam);
+      
+      if ((eta == 0. && phi == 0.) || fabs(eta) > 100) {
+	return StatusCode::SUCCESS;
+      }
+      
+      // Should get overritten
+      bool barrel = false;
+      CaloCell_ID::SUBCALO subcalo = CaloCell_ID::LAREM;
+      int sampling_or_module = 0;
+      
+      CaloDetDescrManager::decode_sample(
       subcalo, barrel, sampling_or_module, (CaloCell_ID::CaloSample)sam);
-
-    // Get the corresponding grannularities : needs to know where you are
-    //                  the easiest is to look for the CaloDetDescrElement
-
-    const CaloDetDescrElement* dde =
-      dd_man->get_element(CaloCell_ID::LAREM, 0, barrel, eta, phi);
-
-    // if object does not exist then return
-    if (!dde) {
-      return StatusCode::SUCCESS;
-    }
-
-    // local granularity
-    auto deta = dde->deta();
-    auto dphi = dde->dphi();
-
-    // search the hottest cell around the (eta,phi)
-    // (eta,phi) are defined as etaSample() and phiSample
-    // around this position a hot cell is searched for in a window
-    // (m_neta*m_deta,m_nphi*m_dphi), by default (m_neta,m_nphi)=(7,7)
-    CaloLayerCalculator calc;
-    StatusCode sc = calc.fill(*dd_man,
-                              cellcoll.ptr(),
-                              cluster->etaSample(sam),
-                              cluster->phiSample(sam),
-                              m_neta * deta,
-                              m_nphi * dphi,
-                              (CaloSampling::CaloSample)sam);
-    if (sc.isFailure()) {
-      ATH_MSG_WARNING("CaloLayerCalculator failed  fill ");
-    }
-    double etamax = calc.etarmax();
-    double phimax = calc.phirmax();
-
-    // create the new cluster
-    xAOD::CaloCluster* newCluster =
-      CaloClusterStoreHelper::makeCluster(collection, cellcoll.ptr());
-    newCluster->setEta0(etamax);
-    newCluster->setPhi0(phimax);
-    newCluster->setClusterSize(xAOD::CaloCluster::SW_7_11);
-  }
+      
+      // Get the corresponding grannularities : needs to know where you are
+      //                  the easiest is to look for the CaloDetDescrElement
+      
+      const CaloDetDescrElement* dde =
+	dd_man->get_element(CaloCell_ID::LAREM, 0, barrel, eta, phi);
+      
+      // if object does not exist then return
+      if (!dde) {
+	return StatusCode::SUCCESS;
+      }
+      
+      // local granularity
+      auto deta = dde->deta();
+      auto dphi = dde->dphi();
+      
+      // search the hottest cell around the (eta,phi)
+      // (eta,phi) are defined as etaSample() and phiSample
+      // around this position a hot cell is searched for in a window
+      // (m_neta*m_deta,m_nphi*m_dphi), by default (m_neta,m_nphi)=(7,7)
+      CaloLayerCalculator calc;
+      StatusCode sc = calc.fill(*dd_man,
+				cellcoll.ptr(),
+				cluster->etaSample(sam),
+				cluster->phiSample(sam),
+				m_neta * deta,
+				m_nphi * dphi,
+				(CaloSampling::CaloSample)sam);
+      if (sc.isFailure()) {
+	ATH_MSG_WARNING("CaloLayerCalculator failed  fill ");
+      }
+      double etamax = calc.etarmax();
+      double phimax = calc.phirmax();
+      
+      // create the new cluster
+      xAOD::CaloCluster* newCluster =
+	CaloClusterStoreHelper::makeCluster(collection, cellcoll.ptr());
+      newCluster->setEta0(etamax);
+      newCluster->setPhi0(phimax);
+      newCluster->setClusterSize(xAOD::CaloCluster::SW_7_11);
+      
+    } else { 
+      // FWD cluster collection
+      
+      // check if cluster is in EMEC or FCAL 
+      if (cluster->inBarrel()) {
+	ATH_MSG_DEBUG(" Cluster is not in FWD; skip ");
+	continue;
+      } else {
+	ATH_MSG_DEBUG (" CLuster is FWD Cluster ");
+      }
+      
+      // check if cluster is in FCAL or EMEC
+      bool in_EMEC = false;
+      if (cluster->eSample(CaloSampling::EME2) > cluster->eSample(CaloSampling::FCAL0) )
+	in_EMEC = true;
+      
+      CaloSampling::CaloSample sam = CaloSampling::FCAL0;
+      if (in_EMEC) {
+	sam = CaloSampling::EME2;
+      } else {
+	sam = CaloSampling::FCAL0;
+      }
+      
+      // granularity in (eta,phi) in the pre sampler
+      // CaloCellList needs both enums: subCalo and CaloSample
+      auto eta = cluster->etaSample(sam);
+      auto phi = cluster->phiSample(sam);
+       
+      if ((eta == 0. && phi == 0.) || fabs(eta) > 100) {
+	return StatusCode::SUCCESS;
+      }
+      
+      // Should get overritten
+      bool emec = false;
+      CaloCell_ID::SUBCALO subcalo = CaloCell_ID::LARFCAL;
+      int sampling_or_module = 0;
+      
+      CaloDetDescrManager::decode_sample(subcalo, emec, sampling_or_module, (CaloCell_ID::CaloSample)sam);
+      
+      // Get the corresponding grannularities : needs to know where you are
+      //                  the easiest is to look for the CaloDetDescrElement
+      //    const CaloDetDescrElement* get_element_FCAL (const CaloDetDescriptor* reg, double eta, double phi) const;
+      const CaloDetDescrElement* dde =
+	dd_man->get_element(subcalo, sampling_or_module, emec, eta, phi);
+      
+      // if object does not exist then return
+      if (!dde) {
+	return StatusCode::SUCCESS;
+      }
+      
+      // local granularity
+      auto deta = dde->deta();
+      auto dphi = dde->dphi();
+      
+      // search the hottest cell around the (eta,phi)
+      // (eta,phi) are defined as etaSample() and phiSample
+      // around this position a hot cell is searched for in a window
+      // (m_neta*m_deta,m_nphi*m_dphi), by default (m_neta,m_nphi)=(6,6) 
+      // for EMEC-OUTER FWD much bigger cell size 
+      
+      // create the new cluster
+      xAOD::CaloCluster* newCluster =
+	CaloClusterStoreHelper::makeCluster(collection, cellcoll.ptr());
+      
+      // if In EMEC
+      CaloLayerCalculator calc;
+      StatusCode sc = calc.fill(*dd_man,
+				cellcoll.ptr(),
+				cluster->etaSample(sam),
+				cluster->phiSample(sam),
+				m_netaFWD * deta,
+				m_nphiFWD * dphi,
+				(CaloSampling::CaloSample)sam, in_EMEC ? newCluster : nullptr);
+      
+      if (sc.isFailure()) {
+	ATH_MSG_WARNING("CaloLayerCalculator failed  fill for FWD cluster");
+      }
+      double etamax = calc.etarmax();
+      double phimax = calc.phirmax();
+      
+      newCluster->setEta0(etamax);
+      newCluster->setPhi0(phimax);
+      
+      if (!in_EMEC) {
+	// If FCAL need to add cell to cluster in a cone
+	std::vector<const CaloCell*> cells;
+	cells.reserve(300);
+	CaloCellList myList(cellcoll.ptr());
+	myList.select(cluster->etaSample(sam), cluster->phiSample(sam), m_drFWD,(CaloSampling::CaloSample)sam);
+	//  myList.select(dde,newCluster->eta0(), newCluster->phi0(),m_drFWD,(CaloSampling::CaloSample)sam); 
+	cells.insert(cells.end(), myList.begin(), myList.end());
+	
+	for ( const auto *cell : cells ) {
+	  if( !cell || !cell->caloDDE() ) continue;
+	  int index = cellcoll.ptr()->findIndex(cell->caloDDE()->calo_hash());
+	  if( index == -1 ) continue;
+	  newCluster->addCell(index,1.);
+	}
+      }
+    }// end isFWD
+  }// main loop over clusters
   return StatusCode::SUCCESS;
 }
diff --git a/Reconstruction/egamma/egammaTools/src/egammaLargeClusterMaker.h b/Reconstruction/egamma/egammaTools/src/egammaLargeClusterMaker.h
index 6dc09bf413b7..27c6d547a67f 100644
--- a/Reconstruction/egamma/egammaTools/src/egammaLargeClusterMaker.h
+++ b/Reconstruction/egamma/egammaTools/src/egammaLargeClusterMaker.h
@@ -51,6 +51,12 @@ private:
   /** @brief Cell container*/
   SG::ReadHandleKey<CaloCellContainer> m_cellsKey {this,
       "CellsName", "AllCalo", "Names of containers which contain cells"};
+
+  /** @brief do FWD cell **/
+  Gaudi::Property<bool> m_isFWD{ this,
+      "doFWDelesurraundingWindows",
+      false,
+      "Save FWD electron surraunding windows" };
   
   Gaudi::Property<double> m_neta {this, "Neta", 7.0,
       "Number of eta cells in each sampling in which to look for hottest cell"};
@@ -58,6 +64,15 @@ private:
   Gaudi::Property<double> m_nphi {this, "Nphi", 7.0,
       "Number of phi cell in each sampling in which to look for hottest cell"};
 
+  Gaudi::Property<double> m_netaFWD {this, "NetaFWD", 6.0,
+      "Number of eta cells in each sampling in which to look for hottest cell"};
+
+  Gaudi::Property<double> m_nphiFWD {this, "NphiFWD", 6.0,
+      "Number of phi cell in each sampling in which to look for hottest cell"};
+
+  Gaudi::Property<double> m_drFWD {this, "deltaR_FCAL", 0.4,
+      "Cone size to collec cell around hottest-cell FCAL"};
+
 
 };
 
-- 
GitLab


From 1404dd88f624304292405a3f31ed8fcc5552eacf Mon Sep 17 00:00:00 2001
From: Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
Date: Thu, 17 Dec 2020 14:41:11 +0100
Subject: [PATCH 115/225] Made AthenaConfiguration compatible with AthAnalysis.

---
 Control/AthenaConfiguration/CMakeLists.txt    | 24 +++++++++----------
 .../python/AutoConfigFlags.py                 |  2 +-
 2 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/Control/AthenaConfiguration/CMakeLists.txt b/Control/AthenaConfiguration/CMakeLists.txt
index fd94dd784b9c..dc6084e7b04f 100644
--- a/Control/AthenaConfiguration/CMakeLists.txt
+++ b/Control/AthenaConfiguration/CMakeLists.txt
@@ -4,30 +4,31 @@
 atlas_subdir( AthenaConfiguration )
 
 # Install files from the package:
-atlas_install_python_modules( python/*.py python/iconfTool 
+atlas_install_python_modules( python/*.py python/iconfTool
                               POST_BUILD_CMD ${ATLAS_FLAKE8} )
 atlas_install_scripts( share/confTool.py python/iconfTool/iconfTool python/CARunner.py)
 
-atlas_add_test( ComponentAccumulatorTest
-   SCRIPT python -m unittest -v AthenaConfiguration.ComponentAccumulatorTest
-   POST_EXEC_SCRIPT nopost.sh )
-
-
 atlas_add_test( AthConfigFlagsTest
    SCRIPT python -m unittest AthenaConfiguration.AthConfigFlags
    POST_EXEC_SCRIPT nopost.sh )
 
-atlas_add_test( AllConfigFlagsTest_EVNT_test
-                SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/python/testAllConfigFlags_EVNT.py
-                PROPERTIES TIMEOUT 300  )
+if( NOT XAOD_ANALYSIS )
+   atlas_add_test( ComponentAccumulatorTest
+      SCRIPT python -m unittest -v AthenaConfiguration.ComponentAccumulatorTest
+      POST_EXEC_SCRIPT nopost.sh )
 
-if( NOT GENERATIONBASE )
+   atlas_add_test( AllConfigFlagsTest_EVNT_test
+      SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/python/testAllConfigFlags_EVNT.py
+      PROPERTIES TIMEOUT 300  )
+endif()
+
+if( NOT GENERATIONBASE AND NOT XAOD_ANALYSIS )
     atlas_add_test( AllConfigFlagsTest_HITS_test
                     SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/python/testAllConfigFlags_HITS.py
                     PROPERTIES TIMEOUT 300  )
 endif()
 
-if( NOT SIMULATIONBASE AND NOT GENERATIONBASE )
+if( NOT SIMULATIONBASE AND NOT GENERATIONBASE AND NOT XAOD_ANALYSIS )
     atlas_add_test( AllConfigFlagsTest_RDO_test
                     SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/python/testAllConfigFlags_RDO.py
                     PROPERTIES TIMEOUT 300  )
@@ -36,4 +37,3 @@ if( NOT SIMULATIONBASE AND NOT GENERATIONBASE )
                     SCRIPT python -m AthenaConfiguration.AllConfigFlags
                     POST_EXEC_SCRIPT nopost.sh )
 endif()
-
diff --git a/Control/AthenaConfiguration/python/AutoConfigFlags.py b/Control/AthenaConfiguration/python/AutoConfigFlags.py
index cc58a4fb4b8a..5ac59444e947 100644
--- a/Control/AthenaConfiguration/python/AutoConfigFlags.py
+++ b/Control/AthenaConfiguration/python/AutoConfigFlags.py
@@ -1,7 +1,6 @@
 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 from PyUtils.MetaReader import read_metadata
-from AtlasGeoModel.AtlasGeoDBInterface import AtlasGeoDBInterface
 from AthenaCommon.Logging import logging
 from functools import lru_cache
 
@@ -33,6 +32,7 @@ def _initializeGeometryParameters(geoTag):
     from PixelGeoModel import PixelGeoDB
     from LArGeoAlgsNV import LArGeoDB
     from MuonGeoModel import MuonGeoDB
+    from AtlasGeoModel.AtlasGeoDBInterface import AtlasGeoDBInterface
 
     dbGeomCursor = AtlasGeoDBInterface(geoTag)
     dbGeomCursor.ConnectAndBrowseGeoDB()
-- 
GitLab


From 8f8fdfac10329546cd208476a850bd55533a29ef Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Thu, 17 Dec 2020 14:58:17 +0100
Subject: [PATCH 116/225] egammaD3PDMaker: cmake cleanup, enable flake8

Update link dependencies and enable flake8. Delete two unused modules.
---
 .../D3PDMaker/egammaD3PDMaker/CMakeLists.txt  |  9 +++----
 .../python/CorrectionClusterD3PDObject.py     |  8 +-----
 .../python/CorrectionClusterGetter.py         |  6 ++---
 .../python/ElectronD3PDObject.py              |  9 +++----
 .../python/GSFElectronD3PDObject.py           | 25 ------------------
 .../python/PhotonD3PDObject.py                | 12 ++-------
 .../python/egammaTriggerBitsD3PDObject.py     | 26 -------------------
 .../python/egammaTruthD3PDObject.py           |  4 +--
 8 files changed, 13 insertions(+), 86 deletions(-)
 delete mode 100644 PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/GSFElectronD3PDObject.py
 delete mode 100644 PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/egammaTriggerBitsD3PDObject.py

diff --git a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/CMakeLists.txt b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/CMakeLists.txt
index eda4cfa902c5..8b4a3693da9a 100644
--- a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/CMakeLists.txt
+++ b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/CMakeLists.txt
@@ -1,6 +1,4 @@
-################################################################################
-# Package: egammaD3PDMaker
-################################################################################
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # Declare the package name:
 atlas_subdir( egammaD3PDMaker )
@@ -13,9 +11,8 @@ atlas_add_component( egammaD3PDMaker
                      src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${CLHEP_INCLUDE_DIRS} 
-                     LINK_LIBRARIES ${CLHEP_LIBRARIES} AtlasHepMCLib CaloIdentifier AthenaKernel Navigation StoreGateLib SGtests EventKernel FourMomUtils xAODBase xAODCaloEvent xAODEgamma xAODJet xAODTracking xAODTruth GaudiKernel AnalysisTriggerEvent D3PDMakerUtils TriggerD3PDMakerLib MCTruthClassifierLib egammaEvent TrkParameters TrkExInterfaces TrkVertexFitterInterfaces TrigObjectMatchingLib TrigCaloEvent TrigInDetEvent TrigParticle CaloTrackingGeometryLib )
+                     LINK_LIBRARIES ${CLHEP_LIBRARIES} AtlasHepMCLib CaloIdentifier AthenaKernel Navigation StoreGateLib EventKernel FourMomUtils xAODBase xAODCaloEvent xAODEgamma xAODJet xAODTracking xAODTruth GaudiKernel AnalysisTriggerEvent D3PDMakerInterfaces D3PDMakerUtils TriggerD3PDMakerLib MCTruthClassifierLib egammaEvent TrkParameters TrkExInterfaces TrkVertexFitterInterfaces CaloTrackingGeometryLib )
 
 # Install files from the package:
-atlas_install_python_modules( python/*.py )
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
 atlas_install_joboptions( share/*.py )
-
diff --git a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/CorrectionClusterD3PDObject.py b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/CorrectionClusterD3PDObject.py
index cce388f2d6b8..2528bbe8c2e4 100644
--- a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/CorrectionClusterD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/CorrectionClusterD3PDObject.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# $Id$
 #
 # @file egammaD3PDMaker/python/CorrectionClusterD3PDObject.py
 # @author scott snyder <snyder@bnl.gov>
@@ -11,15 +10,10 @@
 
 
 from D3PDMakerCoreComps.D3PDObject    import make_SGDataVector_D3PDObject
-from D3PDMakerCoreComps               import SGObjGetterTool
-from D3PDMakerConfig.D3PDMakerFlags   import D3PDMakerFlags
 from egammaD3PDAnalysis.TileGapConfig import TileGapConfig
 from D3PDMakerCoreComps.D3PDObject    import DeferArg
-from D3PDMakerCoreComps.resolveSGKey  import resolveSGKey
-from AthenaCommon.AlgSequence         import AlgSequence
 import EventCommonD3PDMaker
 import D3PDMakerCoreComps
-import egammaD3PDMaker
 import CaloD3PDMaker
 
 
diff --git a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/CorrectionClusterGetter.py b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/CorrectionClusterGetter.py
index 7b5f30e44bf5..31fd018d9f3c 100644
--- a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/CorrectionClusterGetter.py
+++ b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/CorrectionClusterGetter.py
@@ -99,13 +99,13 @@ def make_CorrectionClusterGetter (typ, eta_size, phi_size,
     else:
         sizekey = "%d%d" % (eta_size, phi_size)
 
-    if output_key == None:
+    if output_key is None:
         output_key = name_base + typ + sizekey + suffix
 
-    if algname == None:
+    if algname is None:
         algname = output_key
 
-    if copier_name == None:
+    if copier_name is None:
         copier_name = algname + '_copier'
 
     key = typ
diff --git a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/ElectronD3PDObject.py b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/ElectronD3PDObject.py
index a7327726cea8..b0df9756add6 100644
--- a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/ElectronD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/ElectronD3PDObject.py
@@ -7,18 +7,15 @@
 # @brief Configure electron D3PD object.
 #
 
-from egammaD3PDMaker.defineBlockAndAlg   \
-     import defineAlgLODFunc, defineBlockAndAlg
+from egammaD3PDMaker.defineBlockAndAlg      import defineBlockAndAlg
 from EventCommonD3PDMaker.DRAssociation     import DRAssociation
 from TrackD3PDMaker.xAODTrackSummaryFiller  import xAODTrackSummaryFiller
 from D3PDMakerCoreComps.D3PDObject          import make_SGDataVector_D3PDObject
 from D3PDMakerCoreComps.D3PDObject          import DeferArg
-from D3PDMakerCoreComps.SimpleAssociation   import SimpleAssociation, IdentityAssociation
-from D3PDMakerCoreComps.IndexAssociation    import IndexAssociation
+from D3PDMakerCoreComps.SimpleAssociation   import SimpleAssociation
 from D3PDMakerCoreComps.IndexMultiAssociation import IndexMultiAssociation
-from D3PDMakerCoreComps.resolveSGKey        import resolveSGKey, testSGKey
+from D3PDMakerCoreComps.resolveSGKey        import testSGKey
 from D3PDMakerConfig.D3PDMakerFlags         import D3PDMakerFlags
-# from TriggerD3PDMaker.defineTriggerBits     import defineTriggerBits
 from RecExConfig.RecFlags                   import rec
 import egammaD3PDMaker
 import EventCommonD3PDMaker
diff --git a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/GSFElectronD3PDObject.py b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/GSFElectronD3PDObject.py
deleted file mode 100644
index 740cf17002f4..000000000000
--- a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/GSFElectronD3PDObject.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-# $Id: GSFElectronD3PDObject.py 523036 2012-10-24 15:50:12Z ssnyder $
-#
-# @file egammaD3PDMaker/python/GSFElectronD3PDObject.py
-# @author scott snyder <snyder@bnl.gov>
-# @date 2009
-# @brief Configure GSF electron D3PD object.
-#
-
-from egammaD3PDMaker.defineBlockAndAlg      import defineBlockAndAlg
-from D3PDMakerCoreComps.D3PDObject          import DeferArg
-from D3PDMakerCoreComps.resolveSGKey        import resolveSGKey
-from D3PDMakerConfig.D3PDMakerFlags         import D3PDMakerFlags
-from AthenaCommon.AlgSequence               import AlgSequence
-from RecExConfig.RecFlags                   import rec
-import egammaD3PDMaker
-import egammaD3PDAnalysis
-import EventCommonD3PDMaker
-import D3PDMakerCoreComps
-
-
-from egammaD3PDMaker.ElectronD3PDObject import ElectronD3PDObject
-
-GSFElectronD3PDObject = ElectronD3PDObject.copy()
diff --git a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/PhotonD3PDObject.py b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/PhotonD3PDObject.py
index 8362699959af..fbf504ce8a1c 100644
--- a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/PhotonD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/PhotonD3PDObject.py
@@ -7,26 +7,18 @@
 # @brief Configure photon D3PD object.
 #
 
-
-# from egammaD3PDMaker.isem_version            import isem_version
-from egammaD3PDMaker.defineBlockAndAlg   \
-     import defineAlgLODFunc, defineBlockAndAlg
+from egammaD3PDMaker.defineBlockAndAlg       import defineBlockAndAlg
 from EventCommonD3PDMaker.DRAssociation      import DRAssociation
 from D3PDMakerCoreComps.D3PDObject           import make_SGDataVector_D3PDObject
 from D3PDMakerCoreComps.D3PDObject           import DeferArg
 from D3PDMakerCoreComps.SimpleAssociation    import SimpleAssociation
-# from D3PDMakerCoreComps.IndexAssociation     import IndexAssociation
 from D3PDMakerConfig.D3PDMakerFlags          import D3PDMakerFlags
-from D3PDMakerCoreComps.resolveSGKey         import resolveSGKey, testSGKey
+from D3PDMakerCoreComps.resolveSGKey         import testSGKey
 from TrackD3PDMaker.xAODTrackSummaryFiller   import xAODTrackSummaryFiller
 from D3PDMakerCoreComps.ContainedVectorMultiAssociation import ContainedVectorMultiAssociation
-# from TriggerD3PDMaker.defineTriggerBits      import defineTriggerBits
-# from AthenaCommon.AlgSequence                import AlgSequence
 from RecExConfig.RecFlags                    import rec
 import egammaD3PDMaker
-# import egammaD3PDAnalysis
 import EventCommonD3PDMaker
-# import CaloD3PDMaker
 import D3PDMakerCoreComps
 import TruthD3PDMaker
 import TrackD3PDMaker
diff --git a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/egammaTriggerBitsD3PDObject.py b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/egammaTriggerBitsD3PDObject.py
deleted file mode 100644
index b3b24424b854..000000000000
--- a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/egammaTriggerBitsD3PDObject.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-# $Id$
-#
-# @file  egammaD3PDMaker/python/egammaTriggerBitsD3PDObject.py
-# @author  Haifeng Li <Haifeng.Li@cern.ch>, sss
-# @date    Sep, 2009
-# @brief   Define trigger bit blocks for egamma.
-#
-
-
-import D3PDMakerCoreComps
-import TriggerD3PDMaker
-from D3PDMakerCoreComps.D3PDObject  import make_Void_D3PDObject
-from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
-
-
-# Create the object type.
-egammaTriggerBitsD3PDObject = \
-  make_Void_D3PDObject (default_name = 'egammaTriggerBitsFiller')
-
-
-#
-# The egamma trigger bits are now added in ElectronD3PDObject and
-# PhotonD3PDObject; this file is kept just for backwards compatibility.
-#
diff --git a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/egammaTruthD3PDObject.py b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/egammaTruthD3PDObject.py
index f1e7f3ebcfb7..4dd8811b9da9 100644
--- a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/egammaTruthD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/egammaTruthD3PDObject.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# $Id$
 #
 # @file egammaD3PDMaker/python/egammaTruthD3PDObject.py
 # @author scott snyder <snyder@bnl.gov>
@@ -20,7 +19,6 @@ from D3PDMakerCoreComps.SimpleAssociation   import SimpleAssociation
 import D3PDMakerCoreComps
 import EventCommonD3PDMaker
 import TruthD3PDMaker
-import egammaD3PDAnalysis
 
 
 #FIXME:
-- 
GitLab


From ccf085bfa21e32d7dd819b41e0cdcf81f8f80f83 Mon Sep 17 00:00:00 2001
From: Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
Date: Thu, 17 Dec 2020 15:07:58 +0100
Subject: [PATCH 117/225] Made xAODEventInfoCnv compatible with AthAnalysis.

---
 Event/xAOD/xAODEventInfoCnv/CMakeLists.txt           |  4 ++--
 .../python/xAODEventInfoCnvConfig.py                 | 12 +++++++++---
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/Event/xAOD/xAODEventInfoCnv/CMakeLists.txt b/Event/xAOD/xAODEventInfoCnv/CMakeLists.txt
index c799b37dbb38..5a2c859b9011 100644
--- a/Event/xAOD/xAODEventInfoCnv/CMakeLists.txt
+++ b/Event/xAOD/xAODEventInfoCnv/CMakeLists.txt
@@ -5,7 +5,7 @@ atlas_subdir( xAODEventInfoCnv )
 
 # Optional dependencies:
 set( extra_libs )
-if( NOT SIMULATIONBASE AND NOT GENERATIONBASE )
+if( NOT SIMULATIONBASE AND NOT GENERATIONBASE AND NOT XAOD_ANALYSIS )
    set( extra_libs BeamSpotConditionsData LumiBlockData )
 endif()
 
@@ -30,7 +30,7 @@ atlas_add_test( EvenInfoCnvConfigTestMT
                 SCRIPT test/EventInfoCnv_test.py -n 25 -t 3
                 PROPERTIES TIMEOUT 300 )
 
-if( NOT SIMULATIONBASE AND NOT GENERATIONBASE )
+if( NOT SIMULATIONBASE AND NOT GENERATIONBASE AND NOT XAOD_ANALYSIS )
    atlas_add_test( EventInfoOverlayConfigTest
                    SCRIPT test/EventInfoOverlay_test.py
                    PROPERTIES TIMEOUT 300 )
diff --git a/Event/xAOD/xAODEventInfoCnv/python/xAODEventInfoCnvConfig.py b/Event/xAOD/xAODEventInfoCnv/python/xAODEventInfoCnvConfig.py
index 65ab4f5ac488..ff1996d04d63 100644
--- a/Event/xAOD/xAODEventInfoCnv/python/xAODEventInfoCnvConfig.py
+++ b/Event/xAOD/xAODEventInfoCnv/python/xAODEventInfoCnvConfig.py
@@ -3,6 +3,7 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+from AthenaCommon.Logging import logging
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
 
@@ -21,9 +22,14 @@ def EventInfoCnvAlgCfg(flags, name="EventInfoCnvAlg",
 
     # TODO: luminosity
 
-    if not disableBeamSpot and flags.Common.Project not in ["AthSimulation", "AthGeneration"]:
-        from BeamSpotConditions.BeamSpotConditionsConfig import BeamSpotCondAlgCfg
-        acc.merge(BeamSpotCondAlgCfg(flags))
+    if not disableBeamSpot:
+        try:
+            from BeamSpotConditions.BeamSpotConditionsConfig import BeamSpotCondAlgCfg
+            acc.merge(BeamSpotCondAlgCfg(flags))
+        except ImportError:
+            log = logging.getLogger( 'EventInfoCnvAlgCfg' )
+            log.info( 'BeamSpotConditions not available, not using it' )
+            pass
 
     xAODMaker__EventInfoCnvAlg = CompFactory.xAODMaker.EventInfoCnvAlg
     alg = xAODMaker__EventInfoCnvAlg(name, **kwargs)
-- 
GitLab


From db8b00d584ffb17966d098a1ca4f8b4b7823791c Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Thu, 17 Dec 2020 15:21:24 +0100
Subject: [PATCH 118/225] JetMomentTools: cleanup and enable flake8

Enable flake8 and delete two unused modules (`JetCopyMomentsAlg`,
`JetMomentsConfigHelpers`). Only install ROOT files into data area.
---
 .../share/TruthD3PDfromEVGEN_preInclude.py    |   8 -
 .../Jet/JetMomentTools/CMakeLists.txt         |   6 +-
 .../JetMomentTools/python/GhostAssociation.py |   4 +-
 .../python/JetCopyMomentsAlg.py               |  72 ----
 .../python/JetMomentsConfigHelpers.py         | 365 ------------------
 5 files changed, 2 insertions(+), 453 deletions(-)
 delete mode 100644 Reconstruction/Jet/JetMomentTools/python/JetCopyMomentsAlg.py
 delete mode 100644 Reconstruction/Jet/JetMomentTools/python/JetMomentsConfigHelpers.py

diff --git a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/share/TruthD3PDfromEVGEN_preInclude.py b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/share/TruthD3PDfromEVGEN_preInclude.py
index 937b69d20376..d394adc7703b 100644
--- a/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/share/TruthD3PDfromEVGEN_preInclude.py
+++ b/PhysicsAnalysis/D3PDMaker/TruthD3PDMaker/share/TruthD3PDfromEVGEN_preInclude.py
@@ -34,14 +34,6 @@ from JetRec.JetRecFlags import jetFlags
 jetFlags.noStandardConfig.set_Value_and_Lock(True)
 jetFlags.evgenJets.set_Value_and_Lock(True)
 
-# This is necessary to properly disable JVF tools...
-#  Unfortunately, the functions only exist in newer releases...
-try:
-    from JetMomentTools import JetMomentsConfigHelpers
-    JetMomentsConfigHelpers.recommendedAreaAndJVFMoments = lambda *l,**a:None
-except:
-    pass
-
 #--------------------------------------------------------------------------
 # Configuration
 #--------------------------------------------------------------------------
diff --git a/Reconstruction/Jet/JetMomentTools/CMakeLists.txt b/Reconstruction/Jet/JetMomentTools/CMakeLists.txt
index 832412f36321..199ae2a0aabb 100644
--- a/Reconstruction/Jet/JetMomentTools/CMakeLists.txt
+++ b/Reconstruction/Jet/JetMomentTools/CMakeLists.txt
@@ -27,15 +27,11 @@ if( NOT XAOD_STANDALONE )
       LINK_LIBRARIES ${Boost_LIBRARIES} ${FASTJET_LIBRARIES} ${ROOT_LIBRARIES} AsgTools CaloIdentifier xAODCaloEvent xAODJet GaudiKernel JetCalibToolsLib JetEDM JetInterface JetRecLib JetUtils PFlowUtilsLib PathResolver JetMomentToolsLib ${extra_libs} )
 endif()
 
-#if( XAOD_STANDALONE )
 atlas_add_dictionary( JetMomentToolsDict
 	Root/JetMomentToolsDict.h
 	Root/selection.xml
 	LINK_LIBRARIES JetMomentToolsLib PFlowUtilsLib )
-#endif()
 
 # Install files from the package:
-atlas_install_python_modules( python/*.py )
-atlas_install_runtime( share/*.root )
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
 atlas_install_data( share/*.root )
-
diff --git a/Reconstruction/Jet/JetMomentTools/python/GhostAssociation.py b/Reconstruction/Jet/JetMomentTools/python/GhostAssociation.py
index 69cf912d32e5..09d8d3b0c328 100644
--- a/Reconstruction/Jet/JetMomentTools/python/GhostAssociation.py
+++ b/Reconstruction/Jet/JetMomentTools/python/GhostAssociation.py
@@ -1,8 +1,6 @@
 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-from __future__ import print_function
-
-from AthenaCommon.AlgSequence import AlgSequence    
+from AthenaCommon.AlgSequence import AlgSequence
 def interpretJetName(jetcollName,  finder = None,input=None, mainParam=None):
     # first step : guess the finder, input , mainParam, if needed
     if finder is None:
diff --git a/Reconstruction/Jet/JetMomentTools/python/JetCopyMomentsAlg.py b/Reconstruction/Jet/JetMomentTools/python/JetCopyMomentsAlg.py
deleted file mode 100644
index 34de18617863..000000000000
--- a/Reconstruction/Jet/JetMomentTools/python/JetCopyMomentsAlg.py
+++ /dev/null
@@ -1,72 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-# @file:    JetMomentTools/python/JetCopyMomentsAlg.py.py
-# @purpose: <Copy some moments from a collection to another >
-# @author:  P-A Delsart <delsart in2p3 fr>
-
-__doc__     = 'some documentation here'
-__version__ = '$Revision: 1.5 $'
-__author__  = 'Sebastien Binet <binet@cern.ch>'
-
-import AthenaCommon.SystemOfUnits as Units
-import AthenaPython.PyAthena as PyAthena
-from AthenaPython.PyAthena import StatusCode
-import ROOT
-
-class JetCopyMomentsAlg (PyAthena.Alg):
-    'put some documentation here'
-    def __init__(self, name='JetCopyMomentsAlg', **kw):
-        ## init base class
-        kw['name'] = name
-        super(JetCopyMomentsAlg, self).__init__(**kw)
-
-        ## properties and data members
-        self.Moments = kw.get('Moments', []) # default value
-        self.JetCollectionSrc = kw.get('JetCollectionSrc', "") # default value
-        self.JetCollectionDest = kw.get('JetCollectionDest', "") # default value
-        return
-
-    def initialize(self):
-        self.msg.info('==> initialize...')
-        self.sg = PyAthena.py_svc ('StoreGateSvc')
-        return StatusCode.Success
-
-    def execute(self):
-        jcoll_src = list(self.sg.retrieve('JetCollection', self.JetCollectionSrc))
-        jcoll_dest = list(self.sg.retrieve('JetCollection', self.JetCollectionDest))
-
-        # sort on constit scale to help with ordering.
-        jcoll_dest.sort(key= lambda x: x.pt(2) )
-        jcoll_src.sort(key= lambda x: x.pt(2) ) 
-        getMoment = ROOT.Jet.getMoment
-        moments = self.Moments
-        
-        dr = ROOT.JetDistances.deltaR
-        needUnorderedMatch = False
-        for i, (jS, jD) in enumerate(zip(jcoll_src, jcoll_dest)):
-            if dr(jS,jD)>0.05:
-                needUnorderedMatch = True
-                break 
-            for m in moments:
-                jD.setMoment(m,jS.getMoment(m))
-
-        if needUnorderedMatch :
-            # this may happen because of final Pt cut and a calibration changing order w.r.t lcscale.
-            # fall back to a double loop with deltaR check on remaining jets
-            jcoll_src = jcoll_src[i:]
-            jcoll_dest = jcoll_dest[i:]
-            for jS in jcoll_src:
-                for jD in jcoll_dest:
-                    if dr(jS,jD)<0.05:
-                        for m in moments:
-                            jD.setMoment(m,jS.getMoment(m))
-            
-
-        
-        return StatusCode.Success
-
-    def finalize(self):
-        self.msg.info('==> finalize...')
-        return StatusCode.Success
-
-    # class JetCopyMomentsAlg
diff --git a/Reconstruction/Jet/JetMomentTools/python/JetMomentsConfigHelpers.py b/Reconstruction/Jet/JetMomentTools/python/JetMomentsConfigHelpers.py
deleted file mode 100644
index 17936d2531bc..000000000000
--- a/Reconstruction/Jet/JetMomentTools/python/JetMomentsConfigHelpers.py
+++ /dev/null
@@ -1,365 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-"""
-A set of helper function to configure calculations of additionnal jet moments.
-
-"""
-from JetRec.JetAlgConfiguration import checkAndUpdateOptions, standardJetOption
-from RecExConfig.RecFlags import rec
-from AthenaCommon.SystemOfUnits import GeV
-from AthenaCommon.AlgSequence import AlgSequence    
-from AthenaCommon.Logging import logging
-from AthenaCommon.JobProperties import jobproperties
-
-from JetRec.JetRecFlags import jetFlags 
-from JetRec.JetFinderConfig import setupAreaCalculation    
-
-from JetMomentTools.SetupJetMomentTools import *
-
-
-## A dedicated logger
-_momlog = logging.getLogger( 'JetMomentConfig' )
-
-
-# We try to schedule cpu intensive moment calculation only once. This requires to keep track of
-# moments already scheduled for a given collection. Use this dictionnary.
-_specialMomentAlgDict = {}
-
-# Some moments request can translate in modification of option to already scheduled moment tool.
-# so we keep only one main algorithm (JetAlgorithm or JetMomentCalculator) per jet collection, in order to be able to
-# retrieve & modify the relevant moment tool. 
-# However this can cause dependency issue :
-# for example, truth ghostAssoc requires JetTruthParticleFilter to run before. If a 1st call doesn't require truth ghost assoc, then later a 2nd call does, then JetTruthParticleFilter will be scheduled *after* the moment calculator alg...
-# workaround : move by jand JetTruthParticleFilter at a proper place in the topSequence or the PreD3PDSequence.
-def moveAlgInSequence(alg, seq, newpos):
-    l = seq.getChildren()
-    delattr(seq, alg.getName())
-    seq.insert(newpos, alg)
-
-
-def checkRequiredAlgPosition(seq, momAlg, requiredAlg):
-    topSeq = AlgSequence()
-    
-    if requiredAlg in topSeq:
-        truthInd = topSeq.getChildren().index(requiredAlg)
-        if momAlg in topSeq:
-            index = topSeq.getChildren().index(momAlg)
-        else:
-            # then it is in seq, and seq must be in topSeq
-            index = topSeq.getChildren().index(seq)
-        # make sure requiredAlg is before index
-        if truthInd > index:
-            moveAlgInSequence(requiredAlg, topSeq, index)
-    else:
-        # will move requiredAlg in topSeq before seq and momAlg
-        # where is momAlg ?
-        seqInd = topSeq.getChildren().index(seq)
-        if momAlg in topSeq:
-            index = topSeq.getChildren().index(momAlg)
-        else:
-            index = seqInd
-        delattr(seq, requiredAlg.getName())
-        topSeq.insert(index, requiredAlg)
-    
-
-
-def checkTruthParticleFilterPosition(seq, momAlg):
-    from JetSimTools.JetTruthParticleFilterGetter import JetTruthParticleFilterGetter
-    truthAlg = JetTruthParticleFilterGetter().alg
-    checkRequiredAlgPosition(seq, momAlg, truthAlg)
-    
-    
-
-def retrieveFinderTool(toolSeq):
-    from JetRec.JetRecConf import JetConeFinderTool, JetFastJetFinderTool
-    for t in toolSeq:
-        if isinstance(t, JetFastJetFinderTool) or isinstance(t, JetConeFinderTool):
-            return t
-
-
-import inspect
-def whosdaddy():
-    l = [ ll[3] for ll in  inspect.stack()[2:] ]
-    return l
-
-
-
-
-
-# Helper functions to schedule jet moments.
-# They are typically wrappers around functions in SetupJetMomentTools which are as generic as possible
-#  The wrappers below also perform tasks related to the particular jet collection or configuration sequence. 
-def scheduleMFTool(toolType,jetcollname, jf, alg, seq ,*l):
-    from JetMomentTools.SetupJetMomentTools import getMatchingFractionTool
-    tool, requiredAlg = getMatchingFractionTool(jetcollname, toolType, seq)
-    checkRequiredAlgPosition(seq, alg, requiredAlg)
-    return tool
-
-from JetMomentTools.JetMomentToolsConf import JetWidthTool, NumTowerInJetTool, JetEinSamplingTool
-
-
-# The dictionnary below lists the known standard moments and how to compute them.
-# keys in the dict  are shorcuts, they might represent several moments
-# values are function used to actually schedule the moment calculations 
-defaultMoments = {
-    'ghostAssoc'   : lambda *l : None,
-    'area'         : lambda jcoll,jetfinder,*l : setupAreaCalculation(jetfinder, "ActiveArea", addArea4Vec=True, addSecondArea=jetFlags.jetPerformanceJob() ) ,
-    'quality'      : lambda jetcollname,*l : getCaloQualityTool(doCellBasedVars = (jetcollname=="AntiKt4TopoEMJets" or "Tower" in jetcollname ), computeFromCluster = "Tower" not in jetcollname ),
-    'ktDeltaR'     : lambda *l : getsubJetsMomentTool(),
-    'isolation'    : lambda *l : getJetIsolationTool("JetIsolation"),
-    'jvf'          : lambda jetcollname,*l : getJetVertexAssociationTool(toolName=jetcollname+'JVAtool')    ,
-    'jvt'          : lambda jetcollname,*l : getJetVertexAssociationTool(toolName=jetcollname+'JVAtool')    ,
-    'trackMoments' : lambda *l : getJetTracksMomentTool(),
-    'clusMoments'  : lambda *l : getJetClusterMomentTool(),
-    'truthMF'      : lambda *l : scheduleMFTool("Truth",*l) ,
-    'trackMF'      : lambda *l : scheduleMFTool("Track",*l) ,
-    'larHV'        : lambda *l : getJetLArHVMomentTool(),
-    'width'        : lambda *l : JetWidthTool(),
-    'eInSampling'  : lambda *l : JetEinSamplingTool(),
-    'numTowerJet'  : lambda *l : NumTowerInJetTool(),
-    'badChanCorr'  : lambda jc,jf,alg,seq,jetAlgConfigDict : getJetBadChanCorrTool(**jetAlgConfigDict),
-    'origin'       : lambda jetcollname,*l : getORIGINMoments(jetcollname),
-    }
-
-
-## The list of standard moments keys used in reconstruction.
-standardMoments = standardJetOption("jetMoments")
-
-class TestWithMsg(object):
-    """Simply a boolean and a str message explaining why the boolean is False
-    Also supports & and | operation (logical and or) with concatenation of message"""
-    jetcollname=""
-    def __init__(self, test, failmsg):
-        self.test, self.failmsg= test, failmsg
-    def check(self, mName):
-        if self.test:
-            return True
-        _momlog.info( "No "+mName+" moments for "+self.jetcollname+". Reason : "+self.failmsg)
-        return False
-    def __and__(self, o ):
-        test = self.test and o.test
-        failmsg = [ t.failmsg for t in (self,o) if not t.test ]
-        return TestWithMsg( test, ' AND '.join(failmsg) )
-    def __or__(self, o ):
-        test = self.test or o.test
-        failmsg = '' if test else self.failmsg+' AND '+o.failmsg
-        return TestWithMsg( test, failmsg )
-
-
-def checkMomentAvailability(jetcollname, momentList, jetAlgConfigDict={}):
-    """ Input :  a jet collection name (jetcollname), list of moment keys (momentList), a jet alg configuration dict (as in JetRec.JetAlgConfiguration)
-    returns a filtered list of moment keys where moments incompatible with the jet collection or the job conditions are removed.
-    """
-    # we'll need to know what the input file is
-    from JetRec.JetGetters import guessInputFileType
-    inputFileType = guessInputFileType()
-
-
-
-    from AthenaCommon.DetFlags import DetFlags
-    from AthenaCommon.AppMgr import ToolSvc
-    from AthenaCommon.GlobalFlags  import globalflags
-    from JetRec.TrackSelectionForJets import tracksAvailableForJets
-
-    TestWithMsg.jetcollname = jetcollname
-    # short cut flags
-    # use TestWithMsg rather than simply bool only to be able to display a reason for the rejection of the moment.
-    accessCells = TestWithMsg( (inputFileType=="RDO") or (inputFileType=="ESD") , "No CaloCell available") 
-    caloJet     = TestWithMsg( ("Topo" in jetcollname) or ("Tower" in jetcollname), "Not calo jets")
-    topoJet     = TestWithMsg( "Topo" in jetcollname, "Not TopoCluster jets")
-    lctopoJet   = TestWithMsg( "LCTopo" in jetcollname, "Not LC TopoCluster jets")
-    notTruthJet = TestWithMsg( 'Truth' not in jetcollname, "Is Truth jets")
-    tracksAvailable = TestWithMsg( tracksAvailableForJets(), "Tracks selection for jets impossible")
-
-    trueTest = TestWithMsg(True,"")
-
-    # build the conditions at which moments can be built
-    compatibilityDict = {
-        'area'        : TestWithMsg('Cone' not in jetcollname, "no area for cone jets"),
-        'ghostAssoc'  : notTruthJet,
-        'width' : trueTest,
-        'numTowerJet' : topoJet & accessCells,
-        'quality'     : caloJet,
-        'badChanCorr' : caloJet & accessCells,
-        'constitCalib': lctopoJet &  TestWithMsg( not jetAlgConfigDict.get('calibName','').startswith("LC:CONST") , "Calibration differ from LC:CONST") ,
-        'jvf'         : caloJet & tracksAvailable,
-        'larHV'       : caloJet & TestWithMsg( (inputFileType=='RDO') and DetFlags.dcs.LAr_on() and globalflags.DataSource()=='data', "No proper LAr info available"),
-        'eInSampling' : (caloJet & accessCells) | (topoJet), 
-        'truthMF'     : TestWithMsg( rec.doTruth() , "Truth not available") & notTruthJet,
-        'trackMF'     : notTruthJet & tracksAvailable,
-        'trackMoments': notTruthJet & tracksAvailable,
-        
-        }
-
-    # filter moments :
-    availableMoments = set([ m for m in momentList if compatibilityDict.get(m, trueTest).check(m) ])
-    return availableMoments
-    
-
-    
-
-def findMainAlgForJetCollection(jetcollname, seq = AlgSequence()):
-    """Given a JetCollection name (jetcollname) in input, returns an algorithm computing moments for this collection.
-    The functions explore all know possibilities for finding such algs.
-
-    The return value is (alg, set) where
-     - alg is a JetAlgorithm or a JetMomentCalculator. alg can be None if nothing found or unusable in the case a JetGetter was called with the disable option.
-     - set : is the set of known moments associated to the alg
-    """
-    # try to find a moment calculator for this collection :
-    alg , existing_moments = _specialMomentAlgDict.get( jetcollname, (None,set()) )
-    unknownAlg = alg is None
-
-    if alg is None:
-        # try to find a getter :
-        from JetRec.JetGetters import retrieveConfiguredJetAlg
-        alg  = retrieveConfiguredJetAlg(jetcollname, retrieveGetter=True)
-        if alg is not None: 
-            # check if usable :
-            if not alg.usable():
-                return ('unusable', set())
-            
-            # get the real JetAlgorithm
-            alg = alg.jetAlgorithmHandle()
-            # in this case, no moment have been associated yet
-            existing_moments = set()
-    if alg is None:
-        # check if a collection exists in input file
-        from RecExConfig.ObjKeyStore import objKeyStore
-        if 'JetCollection#'+jetcollname in objKeyStore['inputFile'].list("JetCollection"):
-            # then create a new moment alg for this collection
-            from JetRec.JetMomentGetter import getJetMomentAlgorithm
-            alg = getJetMomentAlgorithm(jetcollname, seq = seq)
-        else:
-            # likely to fail...
-            # try to invoke a standard JetAlgorithm
-            from JetRec.JetRec_defaults import standardJetAlgorithm
-            try :
-                alg = standardJetAlgorithm(jetcollname, seq = seq)
-            except:
-                alg = None #
-    if unknownAlg and alg is not None:
-        # we created a new alg, remember it
-        _specialMomentAlgDict[jetcollname] = (alg, set() )
-    return alg, existing_moments
-
-from JetRec.JetRecConf import JetAlgorithm
-from JetMomentTools.JetMomentToolsConf import JetMomentCalculator
-def addStandardMoments(jetcollname, moments=standardMoments, seq = AlgSequence(), jetAlgConfigDict={}):
-    """Add a list of jet moment calculation for a given jet collection
-      - jetcollname : string, the name of the jetcollection
-      - moments     : list of string or function. string are expected to be some of the defaultMoment shortcuts. functions must return a configured moment tool
-      - seq         : the AlgSequence to which the calculation is attached
-      (- jetAlgConfigDict : dictionnary, used to pass JetAlgorithm configuration options when this addStandardMoments is called while configuring the JetAlgorithm.)
-      Returns nothing.
-      Effect : retrieve (or invoke if needed) the moment calculation algorithm dedicated to jetcollname (this can be a JetAlgorithm or a JetMomentCalculator),
-               then add to this algorithm the moments requested in defaultMoment (only if they are not already scheduled).
-    """
-
-    if moments == []:
-        # nothing to do. Return now to avoid any inconvenience
-        return 
-    
-    # retrieve the main algorithm for this jet collection
-    alg, existing_moments = findMainAlgForJetCollection(jetcollname, seq)
-
-
-    # check if the alg is usable ---------
-    if alg == 'unusable':
-        _momlog.info("No usable algorithm for "+jetcollname+". No jet moments added")
-        return
-    if alg is None :
-        # didn't find any alg. We can't add moments
-        _momlog.error("Can't create momens for "+jetcollname+" : no such collection in input or no algorithms scheduled for it")
-        _momlog.error("  ---> possible solution, invoke make_StandardJetGetter() before to schedule a JetAlgorithm for "+jetcollname)
-        return
-
-    isJetMomentCalc = isinstance(alg, JetMomentCalculator)
-    
-    # filter moment list according to jet collection and other conditions
-    missing_moments =  checkMomentAvailability( jetcollname, set(moments) - existing_moments , jetAlgConfigDict )
-
-    # enforce ghostAssoc, thus jet refinding, if area requested (could separate the 2 options with more config) when using a JetMomentCalculator
-    if 'area' in missing_moments and ('ghostAssoc' not in existing_moments) and isJetMomentCalc:
-        missing_moments.add('ghostAssoc')
-
-
-    jetfinder = None
-    # ghost association is very particular since it needs jet finding.  
-    if 'ghostAssoc' in missing_moments:
-        gAssoc = []
-        from JetRec.TrackSelectionForJets import tracksAvailableForJets
-        if tracksAvailableForJets() :
-            gAssoc += ["TrackAssoc"]
-        if rec.doTruth():
-            gAssoc+=[ "TruthAssoc"]
-        if isJetMomentCalc:
-            from JetMomentTools.GhostAssociation import setupGhostAssociationTool
-            gtool = setupGhostAssociationTool(jetcollname, gAssoc, seq=seq)
-            tmpL = alg.CalculatorTools
-            alg.CalculatorTools = [gtool] + tmpL
-        else: # it's a JetAlgorithm
-            tmpL = list(alg.AlgTools)
-            from JetRec.JetGetters import adaptToolListToGhostAssociation
-            alg.AlgTools = adaptToolListToGhostAssociation(tmpL, gAssoc, seq)
-        if rec.doTruth():
-            checkTruthParticleFilterPosition( seq, alg)
-
-        jetfinder = alg.CalculatorTools['JetGhostAsso'].JetFindingSequence["JetFastJetFinder"] if isJetMomentCalc \
-                    else alg.AlgTools[0].JetFindingSequence["JetFastJetFinder"]
-
-        # we are done with ghostAssoc
-        missing_moments.remove('ghostAssoc')
-        existing_moments.add('ghostAssoc')
-    else: # still need to retrieve the jetfinder
-        if 'ghostAssoc' in existing_moments:
-            jetfinder = alg.CalculatorTools['JetGhostAsso'].JetFindingSequence["JetFastJetFinder"] if isJetMomentCalc \
-                        else alg.AlgTools[0].JetFindingSequence["JetFastJetFinder"]
-        else:
-            jetfinder = retrieveFinderTool( alg.CalculatorTools if isJetMomentCalc else alg.AlgTools)
-        
-    momentTools = []
-    # Loop over requested moment types and set-up the related tools
-    for momentType in missing_moments:
-        if callable(momentType):
-            # then assume a function returning a tool has been supplied
-            func = momentType
-        else:
-            func = defaultMoments[momentType]
-        # call the setup function, add the returned tool to the sequence 
-        tool =  func( jetcollname, jetfinder, alg, seq, jetAlgConfigDict)
-        if tool is not None: # some function just adapts existing tools
-            momentTools.append(tool)
-
-    # add the moment tools list to the relevant alg :
-    if isJetMomentCalc:
-        alg.CalculatorTools += momentTools
-    else:
-        alg.AlgTools += momentTools
-    
-    _specialMomentAlgDict[jetcollname] = (alg, missing_moments.union(existing_moments) )
-    return alg
-
-    
-        
-
-def recommendedAreaAndJVFMoments(jetcollname, oldMomentNames=False,seq=AlgSequence()):
-    """Recompute the area, JVF and track related jet moment on jetcollname.
-
-    jetcollname : string a JetCollection StoreGate key
-    oldMomentNames : bool, if True the moment naming will be the same as in 17.2.5 and previous releases.
-    """
-
-    alg = addStandardMoments(jetcollname,moments = ['ghostAssoc','area','jvf', 'trackMoments'],  seq=seq)
-
-    return alg
-
-def recommendedAreaAndJVF_StandardJetGetter( finder, mainParam, input, oldMomentNames=False,  **options):
-    """Run a jet algorithm, adding the recomended  area, JVF and track related jet moments calculation.
-    
-    all argument similar as in make_StandardJetGetter except :
-    
-    oldMomentNames : bool, if True the moment naming will be the same as in 17.2.5 and previous releases.
-    """
-    return make_StandardJetAlg(finder, mainParam, input, jetMoments = ['ghostAssoc','area','jvf', 'trackMoments'], **options)
-    #alg = specialJet( finder, mainParam, input, oldMomentNames = oldMomentNames, moments=['ghostAssoc','area','jvf', 'trackMoments'], **options)
-- 
GitLab


From d9ba5c75b1a04ce94a72d593de0482c5ead21c18 Mon Sep 17 00:00:00 2001
From: Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
Date: Thu, 17 Dec 2020 15:44:32 +0100
Subject: [PATCH 119/225] Made it possible to use TPCnvTestConfig.py in
 lightweight releases.

Specifically in AthAnalysis, where many of the packages that this file
can potentially use, are not available.
---
 .../python/TPCnvTestConfig.py                 | 35 +++++++++++++++----
 1 file changed, 28 insertions(+), 7 deletions(-)

diff --git a/Database/AthenaPOOL/AthenaPoolUtilities/python/TPCnvTestConfig.py b/Database/AthenaPOOL/AthenaPoolUtilities/python/TPCnvTestConfig.py
index e17f2dfe3bb3..8b2556970110 100644
--- a/Database/AthenaPOOL/AthenaPoolUtilities/python/TPCnvTestConfig.py
+++ b/Database/AthenaPOOL/AthenaPoolUtilities/python/TPCnvTestConfig.py
@@ -8,13 +8,34 @@ from AthenaConfiguration.MainServicesConfig import MainServicesCfg
 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
 from IOVDbSvc.IOVDbSvcConfig import IOVDbSvcCfg
 from AthenaPoolUtilities.DumperConfig import Dumper, find_file
-from AtlasGeoModel.GeoModelConfig import GeoModelCfg
-from PixelGeoModel.PixelGeoModelConfig import PixelGeometryCfg
-from SCT_GeoModel.SCT_GeoModelConfig import SCT_GeometryCfg
-from TRT_GeoModel.TRT_GeoModelConfig import TRT_GeometryCfg
-from LArGeoAlgsNV.LArGMConfig import LArGMCfg
-from TileGeoModel.TileGMConfig import TileGMCfg
-from MuonConfig.MuonGeometryConfig import MuonGeoModelCfg
+try:
+    from AtlasGeoModel.GeoModelConfig import GeoModelCfg
+except ImportError:
+    pass
+try:
+    from PixelGeoModel.PixelGeoModelConfig import PixelGeometryCfg
+except ImportError:
+    pass
+try:
+    from SCT_GeoModel.SCT_GeoModelConfig import SCT_GeometryCfg
+except ImportError:
+    pass
+try:
+    from TRT_GeoModel.TRT_GeoModelConfig import TRT_GeometryCfg
+except ImportError:
+    pass
+try:
+    from LArGeoAlgsNV.LArGMConfig import LArGMCfg
+except ImportError:
+    pass
+try:
+    from TileGeoModel.TileGMConfig import TileGMCfg
+except ImportError:
+    pass
+try:
+    from MuonConfig.MuonGeometryConfig import MuonGeoModelCfg
+except ImportError:
+    pass
 #from AtlasGeoModel.ForDetGeoModelConfig import ForDetGeometryCfg
 Configurable.configurableRun3Behavior = True
 
-- 
GitLab


From e044aa249b98f5bb2978a2e33a337aa3a5557b40 Mon Sep 17 00:00:00 2001
From: Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
Date: Thu, 17 Dec 2020 15:46:57 +0100
Subject: [PATCH 120/225] Added 3 additional packages to AthAnalysis.

These are necessary for the basic operation of the project.
---
 Projects/AthAnalysis/package_filters.txt | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/Projects/AthAnalysis/package_filters.txt b/Projects/AthAnalysis/package_filters.txt
index dee4753b679e..c7eedec977ae 100644
--- a/Projects/AthAnalysis/package_filters.txt
+++ b/Projects/AthAnalysis/package_filters.txt
@@ -19,13 +19,14 @@
 # EDM:
 + Event/EventPrimitives
 + Event/FourMomUtils
++ Event/PyDumper
 + Event/xAOD/xAODMetaDataCnv
 + Event/xAOD/xAODTriggerCnv
 + Event/xAOD/xAODTrackingCnv
 + Event/xAOD/xAODEventFormatCnv
 + Event/xAOD/xAODCoreCnv
 + Event/xAOD/xAODTruthCnv
-#+ Event/xAOD/xAODEventInfoCnv
++ Event/xAOD/xAODEventInfoCnv
 - Event/xAOD/.*Cnv
 + Event/xAOD/.*
 
@@ -137,6 +138,7 @@
 
 # Core Athena (would like to reduce) :
 + Control/AthAllocators
++ Control/AthenaConfiguration
 + Control/AthenaServices
 + Control/StoreGate
 + Control/SGComps
-- 
GitLab


From 0bd3b48d8ac5de6cab6d00aace1832d40d54183b Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Thu, 17 Dec 2020 15:51:18 +0100
Subject: [PATCH 121/225] TrigConfigSvc: remove usage of TrigConfDBConnection

The alternative Frontier client from TrigConfDBConnection was never used
and is obsolete now.
---
 .../TrigConfigSvc/python/TrigConfFrontier.py  | 123 +-----------------
 1 file changed, 5 insertions(+), 118 deletions(-)

diff --git a/Trigger/TrigConfiguration/TrigConfigSvc/python/TrigConfFrontier.py b/Trigger/TrigConfiguration/TrigConfigSvc/python/TrigConfFrontier.py
index 0af22a9bbeb2..bf9554b7d67c 100755
--- a/Trigger/TrigConfiguration/TrigConfigSvc/python/TrigConfFrontier.py
+++ b/Trigger/TrigConfiguration/TrigConfigSvc/python/TrigConfFrontier.py
@@ -1,28 +1,11 @@
 #!/usr/bin/env python
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-from __future__ import print_function
-
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-
-from __future__ import print_function
-
-from future import standard_library
-standard_library.install_aliases()
-from builtins import map
-from builtins import str
-from builtins import zip
-from builtins import object
 from AthenaCommon.Logging import logging
 import time
 import sys
 
 
-# useFrontierClient 
-# True: one uses the python bindings of frontier_client from the TrigConfDBConnection package
-# False: one uses a purely python-based implementation
-useFrontierClient = False
-
-
 def getServerUrls(frontier_servers):
     """
     turns
@@ -66,29 +49,9 @@ def getFrontierCursor(url, schema, loglevel = logging.INFO):
         return None
     else:
         log.info(f"Will use Frontier server at {url}")
-    if useFrontierClient:
-        log.info("Using frontier_client from TrigConfDBConnection")
-        return FrontierCursor2( url = url, schema = schema)
-    else:
-        log.info("Using a pure python implementation of frontier")
-        return FrontierCursor( url = url, schema = schema)
+
+    return FrontierCursor( url = url, schema = schema)
         
-# used by FrontierCursor2
-def resolvebindvars(query, bindvars):
-    """Replaces the bound variables :xyz with a ? in the query and
-    adding the value behind a : at the end"""
-    log = logging.getLogger( "TrigConfFrontier.py" )
-    log.info("Query: %s", query)
-    log.info("bound variables: %r", bindvars)
-    import re
-    varsextract = re.findall(':([A-z0-9]*)',query)
-    values = list(map(bindvars.get, varsextract))
-    log.debug("Resolving bound variable %r with %r", varsextract,values)
-    appendix = ":".join([str(v) for v in values])
-    queryWithQuestionMarks = re.sub(':[A-z0-9]*','?', query)
-    query = queryWithQuestionMarks + ':' + appendix
-    log.info("Resolved query new style: %s", query)
-    return query
 
 # used by FrontierCursor
 def replacebindvars(query, bindvars):
@@ -109,76 +72,6 @@ def replacebindvars(query, bindvars):
     return query
 
 
-            
-
-
-class FrontierCursor2(object):
-    def __init__(self, url, schema, refreshFlag=False):
-        log = logging.getLogger( "TrigConfFrontier.py" )
-        self.url = url
-        self.schema = schema
-        self.refreshFlag = refreshFlag
-        from TrigConfDBConnection import frontier_client as fc
-        fc.init("PyFrontier","debug")
-        log.debug("Frontier URL      : %s", self.url)
-        log.debug("Schema            : %s", self.schema)
-        log.debug("Refresh cache     : %s", self.refreshFlag)
-
-
-    def execute(self, query, bindvars={}):
-        if len(bindvars)>0:
-            query = resolvebindvars(query,bindvars)
-            
-        from TrigConfDBConnection import frontier_client as fc
-        log = logging.getLogger( "TrigConfFrontier.py" )
-        log.debug("Executing query : %s", query)
-
-        conn = fc.Connection(self.url)
-        session = fc.Session(conn)
-
-        doReload = self.refreshFlag
-        conn.setReload(doReload)
-        
-        queryStart = time.localtime()
-        log.debug("Query started: %s", time.strftime("%m/%d/%y %H:%M:%S %Z", queryStart))
-
-        t1 = time.time()
-        req = fc.Request("frontier_request:1:DEFAULT", fc.encoding_t.BLOB)
-        param = fc.Request.encodeParam(query)
-        req.addKey("p1",param)
-        
-        session.getData([req])
-        t2 = time.time()
-
-        #session.printHeader()
-        
-        #nfield = session.getNumberOfFields()
-        #print ("\nNumber of fields:", nfield, "\n")
-    
-        #nrec = session.getNumberOfRecords()
-        #print ("\nResult contains", nrec, "objects.\n")
-        
-        #session.printRecords2()
-        queryEnd = time.localtime()
-        
-        self.result = [r for r in session.getRecords2()]
-        log.debug("Query ended: %s", time.strftime("%m/%d/%y %H:%M:%S %Z", queryEnd))
-        log.debug("Query time: %s seconds", (t2-t1))
-        log.debug("Result size: %i entries", len(self.result))
-            
-    def fetchall(self):
-        return self.result
-
-    def __str__(self):
-        s =  "FrontierCursor2:\n"
-        s += "Using Frontier URL: %s\n" % self.url
-        s += "Schema: %s\n" % self.schema
-        s += "Refresh cache:  %s" % self.refreshFlag
-        return s
-
-
-
-    
 class FrontierCursor(object):
     def __init__(self, url, schema, refreshFlag=False, doDecode=True, retrieveZiplevel="zip"):
         self.url = url + "/Frontier"
@@ -202,7 +95,7 @@ class FrontierCursor(object):
         log.debug("Refresh cache : %s", self.refreshFlag)
         log.debug("Query         : %s", query)
         
-        import base64, zlib, urllib.request, urllib.error, urllib.parse, time
+        import base64, zlib, urllib.request, urllib.error, urllib.parse
 
         self.result = None
 
@@ -338,11 +231,6 @@ def testQuery(query, bindvars):
         return 1
     return 0
 
-
-def testBindVarResolution(query, bindvars):
-    resolvebindvars(query, bindvars)
-    return 0
-
     
 if __name__=="__main__":
     log = logging.getLogger( "TrigConfFrontier.py" )
@@ -352,6 +240,5 @@ if __name__=="__main__":
     query = "select distinct HPS.HPS_NAME from ATLAS_CONF_TRIGGER_RUN2_MC.HLT_PRESCALE_SET HPS where HPS.HPS_ID = :psk"
     bindvars = { "psk": 260 }
 
-    res = testBindVarResolution(query, bindvars) # query resolution for c++ frontier client
-    res = max(res, testQuery(query, bindvars)) # pure python frontier query
+    res = testQuery(query, bindvars)  # pure python frontier query
     sys.exit(res)
-- 
GitLab


From 7e7f8e39cbbc467a07da0d0fe532f11d6d17d223 Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Thu, 17 Dec 2020 14:32:05 +0100
Subject: [PATCH 122/225] TrigConfDBConnection: delete package

This Python Frontier client was never finished/used and is obsolete.
---
 .../TrigConfDBConnection/CMakeLists.txt       |  33 --
 .../TrigConfDBConnection/HelloWorld.h         |  26 --
 .../TrigConfDBConnection/python/__init__.py   |   3 -
 .../python/frontier_client.py                 | 124 --------
 .../TrigConfDBConnection/src/Bindings.cxx     | 244 ---------------
 .../TrigConfDBConnection/src/HelloWorld.cxx   |  41 ---
 .../src/HelloWorldBindings.cxx                |  18 --
 .../src/exe/TriggerFrontierClientTest.cxx     | 284 ------------------
 .../test/testFrontierClient.py                |  60 ----
 .../test/testHelloWorld.py                    |  25 --
 .../TrigConfDBConnection/test/testquery.txt   |   1 -
 11 files changed, 859 deletions(-)
 delete mode 100644 Trigger/TrigConfiguration/TrigConfDBConnection/CMakeLists.txt
 delete mode 100644 Trigger/TrigConfiguration/TrigConfDBConnection/TrigConfDBConnection/HelloWorld.h
 delete mode 100644 Trigger/TrigConfiguration/TrigConfDBConnection/python/__init__.py
 delete mode 100755 Trigger/TrigConfiguration/TrigConfDBConnection/python/frontier_client.py
 delete mode 100644 Trigger/TrigConfiguration/TrigConfDBConnection/src/Bindings.cxx
 delete mode 100644 Trigger/TrigConfiguration/TrigConfDBConnection/src/HelloWorld.cxx
 delete mode 100644 Trigger/TrigConfiguration/TrigConfDBConnection/src/HelloWorldBindings.cxx
 delete mode 100644 Trigger/TrigConfiguration/TrigConfDBConnection/src/exe/TriggerFrontierClientTest.cxx
 delete mode 100755 Trigger/TrigConfiguration/TrigConfDBConnection/test/testFrontierClient.py
 delete mode 100755 Trigger/TrigConfiguration/TrigConfDBConnection/test/testHelloWorld.py
 delete mode 100644 Trigger/TrigConfiguration/TrigConfDBConnection/test/testquery.txt

diff --git a/Trigger/TrigConfiguration/TrigConfDBConnection/CMakeLists.txt b/Trigger/TrigConfiguration/TrigConfDBConnection/CMakeLists.txt
deleted file mode 100644
index bbecfb58a95c..000000000000
--- a/Trigger/TrigConfiguration/TrigConfDBConnection/CMakeLists.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-
-# Declare the package name:
-atlas_subdir( TrigConfDBConnection )
-
-# External dependencies:
-find_package( Frontier_Client )
-find_package( Python COMPONENTS Development )
-find_package( Boost COMPONENTS filesystem thread system
-              OPTIONAL_COMPONENTS python${Python_VERSION_MAJOR}${Python_VERSION_MINOR} )
-
-# Component(s) in the package:
-atlas_add_library( TrigConfDBConnection
-                   src/*.cxx
-                   PUBLIC_HEADERS TrigConfDBConnection
-                   PRIVATE_INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${FRONTIER_CLIENT_INCLUDE_DIRS} ${Python_INCLUDE_DIRS}
-                   PRIVATE_LINK_LIBRARIES ${Boost_LIBRARIES} ${FRONTIER_CLIENT_LIBRARIES} ${Python_LIBRARIES} )
-
-atlas_add_library( TrigConfDBFrontier
-                   src/*.cxx
-                   PUBLIC_HEADERS TrigConfDBConnection
-                   PRIVATE_INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${FRONTIER_CLIENT_INCLUDE_DIRS} ${Python_INCLUDE_DIRS}
-                   PRIVATE_LINK_LIBRARIES ${Boost_LIBRARIES} ${FRONTIER_CLIENT_LIBRARIES} ${Python_LIBRARIES} )
-
-
-atlas_add_executable( TriggerFrontierClientTest
-                      src/exe/TriggerFrontierClientTest.cxx
-                      INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${FRONTIER_CLIENT_INCLUDE_DIRS} ${Python_INCLUDE_DIRS}
-                      LINK_LIBRARIES ${Boost_LIBRARIES} ${FRONTIER_CLIENT_LIBRARIES} ${Python_LIBRARIES} TrigConfDBConnection )
-
-# Install files from the package:
-atlas_install_python_modules( python/*.py
-                              POST_BUILD_CMD ${ATLAS_FLAKE8} )
diff --git a/Trigger/TrigConfiguration/TrigConfDBConnection/TrigConfDBConnection/HelloWorld.h b/Trigger/TrigConfiguration/TrigConfDBConnection/TrigConfDBConnection/HelloWorld.h
deleted file mode 100644
index 4e035cbc1b8a..000000000000
--- a/Trigger/TrigConfiguration/TrigConfDBConnection/TrigConfDBConnection/HelloWorld.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-#ifndef HelloWorld_h
-#define HelloWorld_h
-
-#include <string>
-
-class HelloWorld {
-public:
-   HelloWorld();
-   HelloWorld(const std::string& s);
-   virtual ~HelloWorld();
-
-   void greetings();
-   void setGreetings(const std::string& s);
-   void setStrPtr(const std::string* p);
-
-private:
-
-   std::string m_message;
-
-};
-
-#endif
diff --git a/Trigger/TrigConfiguration/TrigConfDBConnection/python/__init__.py b/Trigger/TrigConfiguration/TrigConfDBConnection/python/__init__.py
deleted file mode 100644
index fb371954d109..000000000000
--- a/Trigger/TrigConfiguration/TrigConfDBConnection/python/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-
diff --git a/Trigger/TrigConfiguration/TrigConfDBConnection/python/frontier_client.py b/Trigger/TrigConfiguration/TrigConfDBConnection/python/frontier_client.py
deleted file mode 100755
index deab009a8184..000000000000
--- a/Trigger/TrigConfiguration/TrigConfDBConnection/python/frontier_client.py
+++ /dev/null
@@ -1,124 +0,0 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-
-from libTrigConfDBFrontier import Session as _Session
-from libTrigConfDBFrontier import AnyData as __AnyData
-
-import libTrigConfDBFrontier as libF
-import sys
-
-class AnyData(__AnyData):
-    def __str__(self):
-        return "%s %s" % (self.type(), self.getString() )
-
-
-class Session:
-
-    def __getattr__(self,name):
-        # forward all calls to self.__session
-        if name in dir(self.__session):
-            return getattr(self.__session,name)
-        raise AttributeError("Session instance does not attribute %s" % name)
-
-    def __init__(self, conn):
-        self.__fieldNames = []
-        self.__fieldTypeStr = []
-        self.__fieldType = []
-        self.__numberOfFields = 0
-        self.__records = []
-        self.__session = _Session(conn)
-
-    def getData(self, requests):
-        self.__session.getData(requests)
-        self.__getHeader()
-        self.__getAllFields()
-        
-
-    def getHeader(self):
-        return (self.__fieldNames,self.__fieldTypeStr)
-
-
-    def getRecords(self):
-        return self.__records
-
-
-    def getRecords2(self):
-        return ( self.__mapRecord(record) for record in self.__records )
-
-
-    def __mapRecord(self,record):
-        return tuple( [ t(r) for (r,t) in zip(record,self.__fieldType) ] )
-        
-
-
-    def printHeader(self):
-        for i, (fname, ftype) in enumerate(zip(self.__fieldNames,self.__fieldTypeStr)):
-            print("%2i :  %-20s %-10s" % (i+1, fname, ftype))
-
-
-    def printRecords(self):
-        for i,record in enumerate(self.getRecords()):
-            print("record %4i :  %r" % (i+1, record))
-
-
-    def printRecords2(self):
-        for i,record in enumerate(self.getRecords2()):
-            print("record %4i :  %r" % (i+1, record))
-
-
-    def getNumberOfFields(self):
-        return self.__numberOfFields
-
-
-    def __getHeader(self):
-        self.__fieldNames = []
-        self.__fieldTypeStr = []
-        self.__fieldType = []
-        self.__numberOfFields = 0
-        # jump to start
-        self.__session.setCurrentLoad(1)
-        # read first field and move 
-        self.__session.next()
-        # and then the rest
-        while not self.isEOR():
-            self.__fieldNames     += [self.__session.assignString()]
-            self.__fieldTypeStr     += [self.__session.assignString()]
-            if self.__fieldTypeStr[-1].startswith("NUMBER"):
-                if ",0" in self.__fieldTypeStr[-1]:
-                    self.__fieldType += [int]
-                else:
-                    self.__fieldType += [float]
-            elif self.__fieldTypeStr[-1].startswith("VARCHAR"):
-                self.__fieldType += [str]
-            else:
-                self.__fieldType += [str]
-            self.__numberOfFields += 1
-
-
-    def __getAllFields(self):
-        self.__records = []
-
-        ad = AnyData()
-        while self.next():
-            record = tuple()
-            for k in range(self.__numberOfFields):
-                self.getAnyData(ad)
-                if   ad.type()==libF.BLOB_TYPE_INT4:        record += (ad.getInt(),)
-                elif ad.type()==libF.BLOB_TYPE_INT8:        record += (ad.getLongLong(),)
-                elif ad.type()==libF.BLOB_TYPE_FLOAT:       record += (ad.getFloat(),)
-                elif ad.type()==libF.BLOB_TYPE_DOUBLE:      record += (ad.getDouble(),)
-                elif ad.type()==libF.BLOB_TYPE_TIME:        record += (ad.getLongLong(),)
-                elif ad.type()==libF.BLOB_TYPE_ARRAY_BYTE:
-                    if not ad.getRawStrP():        record += ('NULL',)
-                    elif (ad.getRawStrS() == 0):   record += ('',)
-                    else:                          record += ('%s' % libF.str_escape_quota(ad.getString()),)
-                else: 
-                    print("Error: unknown typeId %d" % ad.type())
-                    sys.exit(1)
-                ad.clean()
-
-            self.__records += [record]
-            ad.clean()
-
-        if not self.isEOF():
-            print("Error: must be EOF here")
-            sys.exit(1)
diff --git a/Trigger/TrigConfiguration/TrigConfDBConnection/src/Bindings.cxx b/Trigger/TrigConfiguration/TrigConfDBConnection/src/Bindings.cxx
deleted file mode 100644
index 8be99d2cec61..000000000000
--- a/Trigger/TrigConfiguration/TrigConfDBConnection/src/Bindings.cxx
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-*/
-
-#include <boost/python.hpp>
-
-#include "frontier_client/frontier-cpp.h"
-#include <iostream>
-
-namespace {
-   std::string escape_list="\\\'";
-   std::string
-   str_escape_quota(const std::string& str_orig) {
-      std::string str(str_orig);
-      std::string::size_type pos = 0;
-      for(;;) {
-         pos=str.find_first_of(escape_list,pos);
-         if(pos==str.npos) break;
-         str.insert(pos,1,'\\');    
-         pos+=2;
-      }
-      return str;
-   }
-}
-
-
-void getData(frontier::Session& s, const boost::python::list& l) {
-   typedef std::vector<const frontier::Request*> RequestList;
-   typedef std::vector<const frontier::Request*> RequestValueTypoe;
-
-   RequestList cl;
-
-   PyObject *obj_ptr = l.ptr();
-   boost::python::handle<> obj_iter(PyObject_GetIter(obj_ptr));
-   for(std::size_t i=0;;i++) {
-      boost::python::handle<> 
-         py_elem_hdl(boost::python::allow_null(PyIter_Next(obj_iter.get())));
-      
-      if (PyErr_Occurred()) boost::python::throw_error_already_set();
-      if (!py_elem_hdl.get()) break; // end of iteration
-
-      boost::python::object py_elem_obj(py_elem_hdl);
-      boost::python::extract<const frontier::Request*> elem_proxy(py_elem_obj);
-
-      bool success = elem_proxy.check();
-      if (success) {
-         cl.push_back(elem_proxy());
-      } else if (i == 0) {
-         break;
-      } else {
-         PyErr_SetString(PyExc_TypeError, "All items must be of same type.");
-         boost::python::throw_error_already_set();
-      }
-   }
-   s.getData(cl);
-}
-
-// // Determine if obj_ptr can be converted in a QString
-//   static void* convertible(PyObject* obj_ptr)
-//     {
-//       if (!PyString_Check(obj_ptr)) return 0;
-//       return obj_ptr;
-//     }
-
-
-PyObject*
-assignString(frontier::Session& s) {
-   std::string fieldvalue;
-   s.assignString(&fieldvalue);
-   return PyUnicode_FromString(fieldvalue.c_str());
-}
-
-
-frontier::AnyData anydata;
-
-boost::python::object class_anydata;
-
-// frontier::AnyData
-// getAnyData1(frontier::Session& s, int not_eor) {
-//    s.getAnyData(&anydata, not_eor);
-//    return anydata; 
-// }
-
-// frontier::AnyData
-// getAnyData11(frontier::Session& s) { return getAnyData1(s,1); }
-
-int
-getAnyData2(frontier::Session & s, frontier::AnyData & anydata, int not_eor) {
-   return s.getAnyData(&anydata, not_eor);
-}
-
-int
-getAnyData21(frontier::Session & s, frontier::AnyData & anydata) { return getAnyData2(s, anydata, 1); }
-
-
-PyObject*
-getString(frontier::AnyData& data) {
-   std::string* str = data.getString();
-   if(str==0) return 0;
-   return PyUnicode_FromString(data.getString()->c_str());
-}
-
-
-enum BLOB_TYPE {
-   BLOB_TYPE_BYTE       = 0,
-   BLOB_TYPE_INT4       = 1,
-   BLOB_TYPE_INT8       = 2,
-   BLOB_TYPE_FLOAT      = 3,
-   BLOB_TYPE_DOUBLE     = 4,
-   BLOB_TYPE_TIME       = 5,
-   BLOB_TYPE_ARRAY_BYTE = 6,
-   BLOB_TYPE_EOR        = 7,
-   BLOB_TYPE_NONE       = (1<<7),
-   BLOB_BIT_NULL        = (1<<7)
-};
-
-
-BOOST_PYTHON_MODULE(libTrigConfDBFrontier)
-{
-   using namespace boost::python;
-
-   /***
-    * function frontier::init
-    ***/
-   int (*init1)() = &frontier::init;
-   int (*init2)(const std::string&, const std::string&) = &frontier::init;
-
-   def("init", init1, "Initializes frontier client.");
-   def("init", init2, 
-       "Initializes frontier client. \nloglevel can can be 'nolog', 'error', 'info' or 'warning' (which are equivalent), or anything else (treated as 'debug')",
-       args("logfilename", "loglevel"));
-   def("str_escape_quota", str_escape_quota, "add \\ before any \\\'", args("string"));
-   def("getFieldTypeName", frontier::getFieldTypeName, "returns string representation of field type", args("BLOB_TYPE"));
-
-
-   /***
-    * class frontier::Connection
-    ***/
-   class_<frontier::Connection>("Connection", init<const std::string&, const std::string*>("Connection with server url and proxy url", args("self","serverurl","proxyurl")) )
-      .def(init<const std::string&>("Connection with server url.", args("self","serverurl")))
-      .def(init<const std::list<std::string>&, const std::list<std::string>&>("Connection with list of server urls and list of proxy urls",args("self","serverurl","proxyurl")))
-      .def("setReload", &frontier::Connection::setReload)
-      .def("setDefaultParams", &frontier::Connection::setDefaultParams)
-      ;
-
-
-   /***
-    * To do the list wrapping we have two choices:
-    *   * wrap them with class_<> ourself or
-    *   * write to_python_converter() and some wrappers to extract<data> from python. 
-    * Our goal is to get to the working prototype as soon as we can. So in simplistic (a) approach 
-    * A full flexed wrapper is long and expensive, e.g. http://cci.lbl.gov/cctbx_sources/scitbx/array_family/boost_python/flex_wrapper.h
-    ***/
-
-
-   /***
-    * class frontier::Session
-    ***/
-
-   //BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(getAnyData_overloads, frontier::Session::getAnyData, 1, 2)
-   //BOOST_PYTHON_FUNCTION_OVERLOADS(getAnyData2_overloads, getAnyData2, 2, 3)
-      //    int (*init1)() = &frontier::init;
-      //    int (*init2)(const std::string&, const std::string&) = &frontier::init;
-
-
-   class_<frontier::Session>("Session", init<frontier::Connection*>() )
-      .def("getData", &getData)
-      .def("next", &frontier::Session::next)
-      .def("isEOR", &frontier::Session::isEOR)
-      .def("isEOF", &frontier::Session::isEOF)
-      .def("assignString", &assignString)
-      .def("getNumberOfRecords", &frontier::Session::getNumberOfRecords)
-      .def("getRecNum", &frontier::Session::getRecNum)
-      .def("setCurrentLoad", &frontier::Session::setCurrentLoad,
-           "Each Request generates a payload. Payload numbers started with 1.\nSo, to get data for the first Request call setCurrentLoad(1)",
-           args("self","n"))
-      .def("getAnyData", &frontier::Session::getAnyData)
-//       .def("getAnyData", &getAnyData1)
-//       .def("getAnyData", &getAnyData11)
-      .def("getAnyData", &getAnyData2)
-      .def("getAnyData", &getAnyData21)
-      ;
-
-   /***
-    * enum frontier::BLOB_TYPE
-    ***/
-   enum_<BLOB_TYPE>("BLOB_TYPE")
-      .value("BLOB_TYPE_BYTE",       BLOB_TYPE_BYTE      )
-      .value("BLOB_TYPE_INT4",       BLOB_TYPE_INT4      )
-      .value("BLOB_TYPE_INT8",       BLOB_TYPE_INT8      )
-      .value("BLOB_TYPE_FLOAT",      BLOB_TYPE_FLOAT     )
-      .value("BLOB_TYPE_DOUBLE",     BLOB_TYPE_DOUBLE    )
-      .value("BLOB_TYPE_TIME",       BLOB_TYPE_TIME      )
-      .value("BLOB_TYPE_ARRAY_BYTE", BLOB_TYPE_ARRAY_BYTE)
-      .value("BLOB_TYPE_EOR",        BLOB_TYPE_EOR       )
-      .value("BLOB_TYPE_NONE",       BLOB_TYPE_NONE      )
-      .value("BLOB_BIT_NULL",        BLOB_BIT_NULL       )
-      .export_values()
-      ;
-
-   /***
-    * enum frontier::encoding_t
-    ***/
-   enum_<frontier::encoding_t>("encoding_t")
-      .value("BLOB", frontier::BLOB)
-      .export_values()
-      ;
-
-   /***
-    * class frontier::AnyData
-    ***/
-   class_anydata = class_<frontier::AnyData>("AnyData")
-      .def("type",       &frontier::AnyData::type,        "type of data field")
-      .def("getRawI8",   &frontier::AnyData::getRawI8,    "type long long")
-      .def("getRawD",    &frontier::AnyData::getRawD,     "type double")
-      .def("getRawStrP", &frontier::AnyData::getRawStrP,  "type string")
-      .def("getRawStrS", &frontier::AnyData::getRawStrS,  "type unsigned int")
-      .def("getRawI4",   &frontier::AnyData::getRawI4,    "type int")
-      .def("getRawF",    &frontier::AnyData::getRawF,     "type float")
-      .def("getRawB",    &frontier::AnyData::getRawB,     "type char")
-      .def("getInt",     &frontier::AnyData::getInt,      "cast to type int")
-      .def("getLongLong",&frontier::AnyData::getLongLong, "cast to type long long")
-      .def("getFloat",   &frontier::AnyData::getFloat,    "cast to type float")
-      .def("getDouble",  &frontier::AnyData::getDouble,   "cast to type double")
-      .def("getString",  &getString,                      "cast to type string")
-      .def("clean",      &frontier::AnyData::clean,       "clean data")
-      ;
-
-   /***
-    * class frontier::Request
-    ***/
-   object class_req = class_<frontier::Request>("Request", init<const std::string&, frontier::encoding_t>() )
-      .def("addKey", &frontier::Request::addKey, "", args("self", "key", "value"))
-      .def("encodeParam", &frontier::Request::encodeParam, "", args("value"))
-      .def("setRetrieveZipLevel", &frontier::Request::setRetrieveZipLevel,
-           "Set the zip level of retrieved data\nlevel 0 is off, level 1 is fast, level 5 is normal, level 9 is best\ndefault is 5",
-           args("level"))
-      .staticmethod("encodeParam")
-      .staticmethod("setRetrieveZipLevel")
-      ;
-
-
-
-}
diff --git a/Trigger/TrigConfiguration/TrigConfDBConnection/src/HelloWorld.cxx b/Trigger/TrigConfiguration/TrigConfDBConnection/src/HelloWorld.cxx
deleted file mode 100644
index 95fa07a932bb..000000000000
--- a/Trigger/TrigConfiguration/TrigConfDBConnection/src/HelloWorld.cxx
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-#include "TrigConfDBConnection/HelloWorld.h"
-
-#include <iostream>
-
-HelloWorld::HelloWorld() :
-   m_message("")
-{}
-
-
-HelloWorld::HelloWorld(const std::string& s) :
-   m_message(s)
-{}
-
-
-HelloWorld::~HelloWorld()
-{}
-
-
-void
-HelloWorld::greetings()
-{
-   std::cout << m_message << std::endl;
-}
-
-
-void
-HelloWorld::setGreetings(const std::string& s) {
-   m_message = s;
-}
-
-
-void
-HelloWorld::setStrPtr(const std::string* p) {
-   m_message = *p;
-}
-
-
diff --git a/Trigger/TrigConfiguration/TrigConfDBConnection/src/HelloWorldBindings.cxx b/Trigger/TrigConfiguration/TrigConfDBConnection/src/HelloWorldBindings.cxx
deleted file mode 100644
index 3afedf181c38..000000000000
--- a/Trigger/TrigConfiguration/TrigConfDBConnection/src/HelloWorldBindings.cxx
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-#include <boost/python.hpp>
-
-#include "TrigConfDBConnection/HelloWorld.h"
-
-
-BOOST_PYTHON_MODULE(hello_world)
-{
-   using namespace boost::python;
-   class_<HelloWorld>("HelloWorld", init<std::string>() )
-      .def("greetings", &HelloWorld::greetings)
-      .def("setGreetings", &HelloWorld::setGreetings)
-      .def("setStrPtr", &HelloWorld::setStrPtr)
-      ;
-}
diff --git a/Trigger/TrigConfiguration/TrigConfDBConnection/src/exe/TriggerFrontierClientTest.cxx b/Trigger/TrigConfiguration/TrigConfDBConnection/src/exe/TriggerFrontierClientTest.cxx
deleted file mode 100644
index 12cb6ad5174d..000000000000
--- a/Trigger/TrigConfiguration/TrigConfDBConnection/src/exe/TriggerFrontierClientTest.cxx
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * frontier client test C++ main program that can load any query
- * 
- * Author: Sergey Kosyakov
- *
- * $Id: TriggerFrontierClientTest.cxx 696788 2015-09-25 09:17:58Z czodrows $
- *
- * Copyright (c) 2009, FERMI NATIONAL ACCELERATOR LABORATORY
- * All rights reserved. 
- *
- * For details of the Fermitools (BSD) license see Fermilab-2009.txt or
- *  http://fermitools.fnal.gov/about/terms.html
- *
- */
-#include "frontier_client/frontier-cpp.h"
-#include "frontier_client/FrontierException.hpp"
-
-#include <iostream>
-#include <fstream>
-#include <stdexcept>
-#include <cstdlib>
-#include <cstring>
-
-#include <unistd.h>
-
-static std::string escape_list="\\\'";
-static std::string req_data="frontier_request:1:DEFAULT";
-
-static void str_escape_quota(std::string *str) {
-   std::string::size_type pos = 0;
-   while(1) {
-      pos=str->find_first_of(escape_list,pos);
-      if(pos==str->npos) return;
-      //std::cout<<"pos="<<pos<<'\n';
-      str->insert(pos,1,'\\');    
-      pos+=2;
-   }
-}
-
- 
-static void print_usage(char **argv) {
-   std::cout<<"Usage: \n"<<argv[0]<<" -h\n\tPrint this info\n";
-   std::cout<<"\n"<<argv[0]<<" [-r] [-n] [-c N] [-F N] [-f file_name]\n";
-   std::cout<<"  if -f file_name is missing, reads query from stdin\n";
-   std::cout<<"  [-r] means to force a reload\n";
-   std::cout<<"  [-n] means do not print data\n";
-   std::cout<<"  [-c N] repeat the query N count times\n";
-   std::cout<<"  [-F N] fork after Nth repitition\n";
-}
- 
-
-
-int main(int argc, char **argv) {
-   //char vc;
-   int vi;
-   long long vl;
-   float vf;
-   double vd;
-   std::string stringBuf;
-   std::string *vs=&stringBuf;
-   frontier::AnyData ad;
-   char *file_name=0;
-   int do_reload=0;
-   int do_print=1;
-   int repeat_count=1;
-   int fork_count=0;
-   int idx;
-   std::string sql("");
-  
-   try {
-      frontier::init();
-
-      // check for -h
-      for(int arg_ind=1; arg_ind<argc; arg_ind++)
-         if(strcmp(argv[arg_ind],"-h")==0) {
-            print_usage(argv);
-            return 0;
-         }
-      
-
-      for(int arg_ind=1; arg_ind<argc; arg_ind++) {
-
-         const char* arg = argv[arg_ind];
-
-         if(strcmp(arg,"-r")==0) {
-            do_reload=1;
-            continue;
-         }
-         
-         if(strcmp(arg,"-n")==0) {
-            do_print=0;
-            continue;
-         }
-
-         if(strcmp(arg,"-c")==0) {
-            if(argc==++arg_ind) {
-               std::cerr << "No number specified after -c option\n";
-               return 2;
-            }
-            sscanf(argv[arg_ind],"%d",&repeat_count);
-            continue;
-         }
-
-         if(strcmp(arg,"-F")==0) {
-            if(argc==++arg_ind) {
-               std::cerr << "No number specified after -F option\n";
-               return 2;
-            }
-            sscanf(argv[arg_ind],"%d",&fork_count);
-            continue;
-         }
-
-         if(strcmp(arg,"-f")==0) {
-            if(argc==++arg_ind) {
-               std::cerr << "No file name specified after -f option\n";
-               return 2;
-            }
-            file_name=argv[arg_ind];
-            continue;
-         }
-      }
-     
-      std::ifstream in_file;
-      if(file_name) {
-         in_file.open(file_name);
-         if(!in_file.is_open()) {
-            std::cerr << "Can not open file " << file_name << '\n';
-            return 2;
-         }
-      }
-
-      while(1) {
-         std::string tmp;      
-         if(file_name) {
-            if(!in_file.good()) break;
-            std::getline(in_file,tmp,'\n');
-         } else {
-            if(!std::cin.good()) break;
-            std::getline(std::cin,tmp,'\n');       
-         }
-         sql += tmp;
-      }
-      if(file_name) {in_file.close();}
-
-      std::cout<<"Entered:\n"<<sql<<'\n';
-    
-      std::string param=frontier::Request::encodeParam(sql);
-      std::cout<<"Param ["<<param<<"]\n";
-          
-      std::list<std::string> serverList;
-      //serverList.push_back("http://lxfs6043.cern.ch:8080/Frontier3D");
-      std::list<std::string> proxyList;
-      //frontier::DataSource ds(serverList, proxyList);
-      frontier::Connection con(serverList, proxyList);
-
-      for(idx=0;idx<repeat_count;idx++) {
-         if((fork_count>0)&&(idx==fork_count))
-            fork();
-
-         frontier::Session ses(&con);
-         con.setReload(do_reload);
-
-         frontier::Request req(req_data,frontier::BLOB);
-         req.addKey("p1",param);
-
-         std::vector<const frontier::Request*> vrq;
-         vrq.push_back(&req);
-         ses.getData(vrq);
-
-         ses.setCurrentLoad(1);
-      
-         int field_num=0;
-         
-         std::cout<<"\nObject fields:\n";
-         
-         ses.next();
-         // MetaData consists of one record with filed names.
-         // Let's go over all fields:
-         std::string name,type;
-      
-         while(!ses.isEOR()) {
-            ses.assignString(&name);
-            ses.assignString(&type);
-            ++field_num;
-            std::cout<<field_num<<" "<<(name)<<" "<<(type)<<std::endl;
-         }
-
-
-         // SECOND TIME
-//          ses.setCurrentLoad(1);
-//          field_num=0;
-//          std::cout<<"\nObject fields:\n";
-//          ses.next();
-//          while(!ses.isEOR()) {
-//             ses.assignString(&name);
-//             ses.assignString(&type);
-//             ++field_num;
-//             std::cout<<field_num<<" "<<(name)<<" "<<(type)<<std::endl;
-//          }
-         // END SECOND TIME
-
-
-
-	   
-         int nrec=ses.getNumberOfRecords();
-         std::cout<<"\nResult contains "<< nrec<<" objects.\n";
-	  
-         while(ses.next()) {
-            if(!do_print)continue;
-            for(int k=0;k<field_num;k++) {
-               ses.getAnyData(&ad);
-               switch(ad.type()) {
-                  //case frontier::BLOB_TYPE_BYTE:       vc=ses.getByte(); break;
-               case frontier::BLOB_TYPE_INT4:       
-                  vi=ad.getInt(); 
-                  std::cout<<vi; 
-                  break;
-               case frontier::BLOB_TYPE_INT8:       
-                  vl=ad.getLongLong(); 
-                  std::cout<<vl; 
-                  break;
-               case frontier::BLOB_TYPE_FLOAT:      
-                  vf=ad.getFloat(); 
-                  std::cout<<vf; 
-                  break;
-               case frontier::BLOB_TYPE_DOUBLE:     
-                  vd=ad.getDouble(); 
-                  std::cout<<vd; 
-                  break;
-               case frontier::BLOB_TYPE_TIME:       
-                  vl=ad.getLongLong(); 
-                  std::cout<<vl; 
-                  break;
-               case frontier::BLOB_TYPE_ARRAY_BYTE: 
-                  if(!ad.getRawStrP()) {
-                     std::cout<<"NULL";
-                  }
-                  else if (ad.getRawStrS() == 0)
-                     std::cout<<"''"; 
-                  else if (ad.getRawStrS() > 1000)
-                     std::cout<<'('<<ad.getRawStrS()<<" byte blob)"; 
-                  else {
-                     vs=ad.getString(); 
-                     str_escape_quota(vs);
-                     std::cout<<'\''<<(*vs)<<'\''<<'('<<ad.getRawStrS()<<')'; 
-                  }
-                  break;	  
-               default: 
-                  std::cout<<"Error: unknown typeId "<<((int)(ad.type()))<<"\n"; 
-                  exit(1);
-               }
-               if(k+1<field_num) {
-                  std::cout<<" ";
-               }
-               ad.clean();
-            }
-            ad.clean();
-            std::cout<<std::endl;
-         }
-         if(!ses.isEOF()) {
-            std::cout<<"Error: must be EOF here\n";
-            exit(1);
-         }
-      }
-   }
-   catch(const frontier::ConfigurationError& e) {
-      std::cout << "Frontier configuration error caught: " << e.what() << std::endl;
-      exit(1);
-   }
-   catch(const frontier::FrontierException& e) {
-      std::cout << "Frontier exception caught: " << e.what() << std::endl;
-      exit(1);
-   }
-   catch(std::exception& e) {
-      std::cout << "Error: " << e.what() << "\n";
-      exit(1);
-   }
-   catch(...) {
-      std::cout << "Unknown exception\n";
-      exit(1);
-   }
-
-   return 0;
-}
diff --git a/Trigger/TrigConfiguration/TrigConfDBConnection/test/testFrontierClient.py b/Trigger/TrigConfiguration/TrigConfDBConnection/test/testFrontierClient.py
deleted file mode 100755
index f8cdd8aa3d1e..000000000000
--- a/Trigger/TrigConfiguration/TrigConfDBConnection/test/testFrontierClient.py
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-def main(sql, doReload):
-
-    (ALL, VERBOSE, DEBUG, INFO, WARNING, ERROR, FATAL) = range(7)
-    from AthenaCommon.Logging import logging
-    log = logging.getLogger( "TrigConfigSvcUtils.py" )
-    log.setLevel(VERBOSE)
-
-    connection = "TRIGGERDBREPR"
-
-    from TriggerJobOpts.TriggerFlags import TriggerFlags as tf
-    tf.triggerUseFrontier = True
-
-    from TrigConfigSvc.TrigConfigSvcUtils import interpretConnection
-    connectionParameters = interpretConnection(connection)
-
-    print "Connection: ", connectionParameters
-
-    from TrigConfDBConnection import frontier_client as fc
-
-    fc.init("testFrontier.log","debug")
-
-    conn = fc.Connection(connectionParameters['url'])
-
-    session = fc.Session(conn)
-
-    conn.setReload(doReload)
-
-    req = fc.Request("frontier_request:1:DEFAULT", fc.encoding_t.BLOB)
-    param = fc.Request.encodeParam(sql)
-    req.addKey("p1",param)
-
-    session.getData([req])
-
-    session.printHeader()
-
-    nfield = session.getNumberOfFields()
-    print "\nNumber of fields:", nfield, "\n"
-
-    
-    nrec = session.getNumberOfRecords()
-    print "\nResult contains", nrec, "objects.\n"
-
-    session.printRecords2()
-
-    return 0
-
-
-
-if __name__=="__main__":
-    from sys import exit
-
-    doReload = True
-    sql = "select distinct SM.SMT_ID, SM.SMT_NAME, SM.SMT_VERSION, SM.SMT_COMMENT, SM.SMT_ORIGIN, SM.SMT_USERNAME, SM.SMT_STATUS from ATLAS_CONF_TRIGGER_REPR.SUPER_MASTER_TABLE SM"
-    
-    exit(main(sql=sql, doReload=doReload))
-    
diff --git a/Trigger/TrigConfiguration/TrigConfDBConnection/test/testHelloWorld.py b/Trigger/TrigConfiguration/TrigConfDBConnection/test/testHelloWorld.py
deleted file mode 100755
index 6b3f554ff81c..000000000000
--- a/Trigger/TrigConfiguration/TrigConfDBConnection/test/testHelloWorld.py
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-def main():
-    from TrigConfDBConnection import frontier_client as fc
-
-    hw = fc.HelloWorld("Hello world!")
-
-    hw.greetings()
-    
-    hw.setGreetings("Hello universe!")
-    
-    hw.greetings()
-
-    hw.setStrPtr("Hello All!")
-    
-    hw.greetings()
-
-    return 0
-
-if __name__=="__main__":
-    from sys import exit
-    exit(main())
-    
diff --git a/Trigger/TrigConfiguration/TrigConfDBConnection/test/testquery.txt b/Trigger/TrigConfiguration/TrigConfDBConnection/test/testquery.txt
deleted file mode 100644
index b23d24255d68..000000000000
--- a/Trigger/TrigConfiguration/TrigConfDBConnection/test/testquery.txt
+++ /dev/null
@@ -1 +0,0 @@
-select distinct SM.SMT_ID, SM.SMT_NAME, SM.SMT_VERSION, SM.SMT_COMMENT, SM.SMT_ORIGIN, SM.SMT_USERNAME, SM.SMT_STATUS from ATLAS_CONF_TRIGGER_REPR.SUPER_MASTER_TABLE SM
-- 
GitLab


From aca928f36a8ac95a88d6afb6c7770370685af363 Mon Sep 17 00:00:00 2001
From: tstreble <thomas.strebler@cern.ch>
Date: Thu, 17 Dec 2020 16:31:42 +0100
Subject: [PATCH 123/225] Updated negeative determinant error handling in
 KalmanVertexOnJetAxisUpdator

---
 .../TrkJetVxFitter/src/KalmanVertexOnJetAxisUpdator.cxx      | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/Tracking/TrkVertexFitter/TrkJetVxFitter/src/KalmanVertexOnJetAxisUpdator.cxx b/Tracking/TrkVertexFitter/TrkJetVxFitter/src/KalmanVertexOnJetAxisUpdator.cxx
index 9174452f37c6..4ca06b1cd109 100755
--- a/Tracking/TrkVertexFitter/TrkJetVxFitter/src/KalmanVertexOnJetAxisUpdator.cxx
+++ b/Tracking/TrkVertexFitter/TrkJetVxFitter/src/KalmanVertexOnJetAxisUpdator.cxx
@@ -257,7 +257,10 @@ namespace Trk{
     
       if (trackParametersWeight.determinant()<=0)  
       {
-        ATH_MSG_ERROR(" The determinant of the track covariance matrix is negative: " << trackParametersWeight.determinant());
+        ATH_MSG_WARNING(" The determinant of the inverse of the track covariance matrix is negative: " << trackParametersWeight.determinant());
+        if(trk->expectedCovarianceAtPCA().determinant()<=0){
+          ATH_MSG_ERROR(" As well as the determinant of the track covariance matrix: " << trk->expectedCovarianceAtPCA().determinant());
+	}
       }
       
 
-- 
GitLab


From 9702edf7dec0304aa213d987313ce57a6442e136 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Thu, 17 Dec 2020 16:43:01 +0100
Subject: [PATCH 124/225] release -> reset

---
 Control/IOVSvc/src/IOVSvc.cxx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Control/IOVSvc/src/IOVSvc.cxx b/Control/IOVSvc/src/IOVSvc.cxx
index 131db47d71cb..e968fe7af849 100755
--- a/Control/IOVSvc/src/IOVSvc.cxx
+++ b/Control/IOVSvc/src/IOVSvc.cxx
@@ -855,7 +855,7 @@ IOVSvc::createCondObj(CondContBase* ccb, const DataObjID& id,
   // In that case, when we delete the address, it will
   // follow an invalid pointer.  So be sure to delete
   // the address before the object is added to CondCont.
-  ioa.release();
+  ioa.reset();
 
   // DataObject *d2 = static_cast<DataObject*>(v);
   
-- 
GitLab


From 3519ebd228408b154ab223125300c0043db4bfa2 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Thu, 17 Dec 2020 16:49:53 +0100
Subject: [PATCH 125/225] Fix conflict with gtest macro

---
 .../CxxUtils/CxxUtils/ConcurrentHashmapImpl.h | 55 ++++++++++---------
 .../CxxUtils/ConcurrentHashmapImpl.icc        | 20 +++----
 2 files changed, 39 insertions(+), 36 deletions(-)

diff --git a/Control/CxxUtils/CxxUtils/ConcurrentHashmapImpl.h b/Control/CxxUtils/CxxUtils/ConcurrentHashmapImpl.h
index 8f6daf8beb11..04aeda1488cf 100644
--- a/Control/CxxUtils/CxxUtils/ConcurrentHashmapImpl.h
+++ b/Control/CxxUtils/CxxUtils/ConcurrentHashmapImpl.h
@@ -35,7 +35,7 @@ namespace detail {
 
 /// Type used for keys and values --- an unsigned big enough to hold a pointer.
 /// Need to have this defined outside of ConcurrentHashmapImpl itself
-/// in order to avoid instantiation circularities, as the HASHER and MATCHER
+/// in order to avoid instantiation circularities, as the HASHER_ and MATCHER_
 /// classes will probably want to use it.
 using ConcurrentHashmapVal_t = uintptr_t;
 
@@ -130,15 +130,15 @@ private:
  * are much more frequent than writes.
  *
  * Template arguments:
- *  UPDATER - Object used for memory management; see below.
- *            This has the same requirements as for ConcurrentRangeMap;
- *            see there for further details.
- *  HASHER  - Functional to compute a hash value from a key.
- *            Defaults to std::hash.
- *  MATCHER - Functional to compare two keys for equality.
- *            Defaults to std::equal_to.
- *  NULLVAL - Value of the key to be considered null.
- *            A key with this value may not be inserted.
+ *  UPDATER_ - Object used for memory management; see below.
+ *             This has the same requirements as for ConcurrentRangeMap;
+ *             see there for further details.
+ *  HASHER_  - Functional to compute a hash value from a key.
+ *             Defaults to std::hash.
+ *  MATCHER_ - Functional to compare two keys for equality.
+ *             Defaults to std::equal_to.
+ *  NULLVAL_ -  Value of the key to be considered null.
+ *              A key with this value may not be inserted.
  *
  * Implementation notes:
  *  We use open addressing (see, eg, knuth AOCP 6.4), in which the payloads
@@ -150,22 +150,25 @@ private:
  *
  *  The implementation here is inspired by the hash maps from ConcurrencyKit
  *  (http://concurrencykit.org), though the code is all new.
+ *
+ * nb. Can't use plain `MATCHER' as a template argument because it collides
+ * with gtest.
  */
-template <template <class> class UPDATER,
-          typename HASHER = std::hash<uintptr_t>,
-          typename MATCHER = std::equal_to<uintptr_t>,
-          uintptr_t NULLVAL = 0>
+template <template <class> class UPDATER_,
+          typename HASHER_ = std::hash<uintptr_t>,
+          typename MATCHER_ = std::equal_to<uintptr_t>,
+          uintptr_t NULLVAL_ = 0>
 class ConcurrentHashmapImpl
 {
 public:
   /// Type used for keys and values --- an unsigned big enough to hold a pointer.
   using val_t = ConcurrentHashmapVal_t;
   /// Hash object.
-  using Hasher_t = HASHER;
+  using Hasher_t = HASHER_;
   /// Key match object.
-  using Matcher_t = MATCHER;
+  using Matcher_t = MATCHER_;
   /// Null key value.
-  static constexpr uintptr_t nullval = NULLVAL;
+  static constexpr uintptr_t nullval = NULLVAL_;
   /// Used to represent an invalid table index.
   static constexpr size_t INVALID = static_cast<size_t>(-1);
 
@@ -217,8 +220,8 @@ private:
      * @param matcher Key match object to use.
      */
     Table (size_t capacity,
-           const HASHER& hasher = HASHER(),
-           const MATCHER& matcher = MATCHER());
+           const Hasher_t& hasher = Hasher_t(),
+           const Matcher_t& matcher = Matcher_t());
 
 
     /**
@@ -291,9 +294,9 @@ private:
     /// Number of bits in the mask.
     const size_t m_maskBits;
     /// The hash object.
-    const HASHER& m_hasher;
+    const Hasher_t& m_hasher;
     /// The key match object.
-    const MATCHER& m_matcher;
+    const Matcher_t& m_matcher;
     /// Longest probe needed so far.
     std::atomic<size_t> m_longestProbe;
     /// The actual table entries.
@@ -303,7 +306,7 @@ private:
 
 public:
   /// Updater object.
-  using Updater_t = UPDATER<Table>;
+  using Updater_t = UPDATER_<Table>;
   /// Context type for the updater.
   using Context_t = typename Updater_t::Context_t;
 
@@ -320,8 +323,8 @@ public:
    */
   ConcurrentHashmapImpl (Updater_t&& updater,
                          size_t capacity_in,
-                         const HASHER& hasher,
-                         const MATCHER& matcher,
+                         const Hasher_t& hasher,
+                         const Matcher_t& matcher,
                          const typename Updater_t::Context_t& ctx);
 
 
@@ -549,9 +552,9 @@ private:
   /// Updater object managing memory.  See above.
   Updater_t m_updater;
   /// The hash object.
-  const HASHER m_hasher;
+  const Hasher_t m_hasher;
   /// The key match object.
-  const MATCHER m_matcher;
+  const Matcher_t m_matcher;
   /// The current table instance.  Must be holding the mutex to access this.
   Table* m_table;
   /// Number of entries in the map.
diff --git a/Control/CxxUtils/CxxUtils/ConcurrentHashmapImpl.icc b/Control/CxxUtils/CxxUtils/ConcurrentHashmapImpl.icc
index 63830114c683..0b07bef12532 100644
--- a/Control/CxxUtils/CxxUtils/ConcurrentHashmapImpl.icc
+++ b/Control/CxxUtils/CxxUtils/ConcurrentHashmapImpl.icc
@@ -97,12 +97,12 @@ bool CHMTableIterator<ENTRIES_PER_CACHELINE>::next()
 
 
 #define T_CHMIMPL \
-  template <template <class> class UPDATER,     \
-            typename HASHER,                    \
-            typename MATCHER,                   \
-            uintptr_t NULLVAL>
+  template <template <class> class UPDATER_,     \
+            typename HASHER_,                    \
+            typename MATCHER_,                   \
+            uintptr_t NULLVAL_>
 
-#define CHMIMPL ConcurrentHashmapImpl<UPDATER, HASHER, MATCHER, NULLVAL>
+#define CHMIMPL ConcurrentHashmapImpl<UPDATER_, HASHER_, MATCHER_, NULLVAL_>
 
 
 /**
@@ -113,8 +113,8 @@ bool CHMTableIterator<ENTRIES_PER_CACHELINE>::next()
  */
 T_CHMIMPL
 CHMIMPL::Table::Table (size_t capacity,
-                       const HASHER& hasher /*= HASHER()*/,
-                       const MATCHER& matcher /*= MATCHER()*/)
+                       const Hasher_t& hasher /*= Hasher_t()*/,
+                       const Matcher_t& matcher /*= Matcher_t()*/)
   : m_capacity (capacity),
     m_maxProbe (capacity / 4),
     m_mask (capacity-1),
@@ -125,7 +125,7 @@ CHMIMPL::Table::Table (size_t capacity,
 {
   // Clear all the keys.
   for (size_t i = 0; i < capacity; i++) {
-    m_entries[i].m_key = NULLVAL;
+    m_entries[i].m_key = nullval;
   }
 }
 
@@ -278,8 +278,8 @@ typename CHMIMPL::entry_t& CHMIMPL::Table::entry (size_t offset)
 T_CHMIMPL
 CHMIMPL::ConcurrentHashmapImpl (Updater_t&& updater,
                                 size_t capacity_in,
-                                const HASHER& hasher,
-                                const MATCHER& matcher,
+                                const Hasher_t& hasher,
+                                const Matcher_t& matcher,
                                 const typename Updater_t::Context_t& ctx)
   : m_updater (std::move (updater)),
     m_hasher (hasher),
-- 
GitLab


From 5b45ee35c379ae31dfc5a967fbfe944060b01b96 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Thu, 17 Dec 2020 03:26:25 +0100
Subject: [PATCH 126/225] TrkGeometry: BinnedMaterial should take the Material
 pointer by value.

No point in passing the pointer by (non-const!) ref --- it is never
modified --- and this prevents calling with an rvalue.
---
 Tracking/TrkDetDescr/TrkGeometry/TrkGeometry/BinnedMaterial.h | 4 ++--
 Tracking/TrkDetDescr/TrkGeometry/src/BinnedMaterial.cxx       | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/Tracking/TrkDetDescr/TrkGeometry/TrkGeometry/BinnedMaterial.h b/Tracking/TrkDetDescr/TrkGeometry/TrkGeometry/BinnedMaterial.h
index d7bcd1bc2cda..b3f05a29713e 100644
--- a/Tracking/TrkDetDescr/TrkGeometry/TrkGeometry/BinnedMaterial.h
+++ b/Tracking/TrkDetDescr/TrkGeometry/TrkGeometry/BinnedMaterial.h
@@ -53,11 +53,11 @@ namespace Trk {
       {}    
 
       /** Constructor with averaged material and binning in 1D*/
-      BinnedMaterial(const Material*& mat, BinUtility*& bu, const std::vector<size_t>& index,
+      BinnedMaterial(const Material* mat, BinUtility*& bu, const std::vector<size_t>& index,
 		     const std::vector<IdentifiedMaterial>& detailedMat); 
 
       /** Constructor with averaged material and binning in 2D*/
-      BinnedMaterial(const Material*& mat, BinUtility*& bu, std::vector< Trk::BinUtility*>& bVec,
+      BinnedMaterial(const Material* mat, BinUtility*& bu, std::vector< Trk::BinUtility*>& bVec,
 		     const std::vector<std::vector<size_t> >& index,
 		     const std::vector<IdentifiedMaterial>& detailedMat);
       
diff --git a/Tracking/TrkDetDescr/TrkGeometry/src/BinnedMaterial.cxx b/Tracking/TrkDetDescr/TrkGeometry/src/BinnedMaterial.cxx
index 351094fa2cfa..dea51ba1813e 100755
--- a/Tracking/TrkDetDescr/TrkGeometry/src/BinnedMaterial.cxx
+++ b/Tracking/TrkDetDescr/TrkGeometry/src/BinnedMaterial.cxx
@@ -5,7 +5,7 @@
 #include "TrkGeometry/BinnedMaterial.h"
 
 /** Constructor with averaged material and binning in 1D*/
-Trk::BinnedMaterial::BinnedMaterial(const Trk::Material*& mat, Trk::BinUtility*& bu, const std::vector<size_t>& index, 
+Trk::BinnedMaterial::BinnedMaterial(const Trk::Material* mat, Trk::BinUtility*& bu, const std::vector<size_t>& index, 
 				    const std::vector<Trk::IdentifiedMaterial>& detailedMat ) : 
   Trk::Material(*mat),
   m_matVec (detailedMat),
@@ -14,7 +14,7 @@ Trk::BinnedMaterial::BinnedMaterial(const Trk::Material*& mat, Trk::BinUtility*&
 }    
 
 /** Constructor with averaged material and binning in 2D*/
-Trk::BinnedMaterial::BinnedMaterial(const Trk::Material*& mat, Trk::BinUtility*& bu, std::vector< Trk::BinUtility*>& bVec,
+Trk::BinnedMaterial::BinnedMaterial(const Trk::Material* mat, Trk::BinUtility*& bu, std::vector< Trk::BinUtility*>& bVec,
 				    const std::vector<std::vector<size_t> >& index, 
 				    const std::vector<Trk::IdentifiedMaterial>& detailedMat ) :
   Trk::Material(*mat),
-- 
GitLab


From 44accd20fb37a254a06d92dfeba823b70c90c084 Mon Sep 17 00:00:00 2001
From: Nicholas Styles <nicholas.styles@desy.de>
Date: Thu, 17 Dec 2020 17:54:21 +0100
Subject: [PATCH 127/225] fix errant linear (not needed when applied on points)

---
 .../ReadoutGeometryBase/src/SolidStateDetectorElementBase.cxx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/DetectorDescription/ReadoutGeometryBase/src/SolidStateDetectorElementBase.cxx b/DetectorDescription/ReadoutGeometryBase/src/SolidStateDetectorElementBase.cxx
index 144bf769ab86..c82b8bad0f77 100644
--- a/DetectorDescription/ReadoutGeometryBase/src/SolidStateDetectorElementBase.cxx
+++ b/DetectorDescription/ReadoutGeometryBase/src/SolidStateDetectorElementBase.cxx
@@ -388,13 +388,13 @@ using Trk::distDepth;
     bool firstTimeBaseTmp = m_firstTimeBase;
     m_firstTimeBase = false;
     
-    m_center = geoTransform.linear() * m_design->sensorCenter();
+    m_center = geoTransform * m_design->sensorCenter();
     
     //Is this needed outside e.g. ReadSiDetElements? Maybe candidate for future removal?
     m_centerCLHEP = HepGeom::Point3D<double>(m_center[0],m_center[1],m_center[2]);
 
     Amg::Vector3D centerGeoModel(0., 0., 0.);
-    m_origin = geoTransform.linear() * centerGeoModel;
+    m_origin = geoTransform * centerGeoModel;
    
     //
     // Determine directions depth, eta and phi axis in reconstruction local frame
-- 
GitLab


From 6f2161b584a51fb3ab31c4882cdbd1179edd3e59 Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Thu, 17 Dec 2020 18:05:22 +0100
Subject: [PATCH 128/225] egammaD3PDAnalysis: cmake fixes, enable flake8

---
 .../D3PDMaker/egammaD3PDAnalysis/CMakeLists.txt          | 9 +++------
 .../egammaD3PDAnalysis/python/TileGapSelectionGetter.py  | 5 ++---
 .../python/egammaTruthParticleConfig.py                  | 8 ++------
 3 files changed, 7 insertions(+), 15 deletions(-)

diff --git a/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/CMakeLists.txt b/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/CMakeLists.txt
index dc849b86d410..f7de71e2dbd4 100644
--- a/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/CMakeLists.txt
+++ b/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/CMakeLists.txt
@@ -1,6 +1,4 @@
-################################################################################
-# Package: egammaD3PDAnalysis
-################################################################################
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # Declare the package name:
 atlas_subdir( egammaD3PDAnalysis )
@@ -9,8 +7,7 @@ atlas_subdir( egammaD3PDAnalysis )
 atlas_add_component( egammaD3PDAnalysis
                      src/*.cxx
                      src/components/*.cxx
-                     LINK_LIBRARIES CaloClusterCorrectionLib CaloEvent CaloGeoHelpers CaloRecLib AthContainers AthenaBaseComps AthenaKernel EventKernel xAODCaloEvent xAODEgamma xAODTruth GaudiKernel LArCablingLib D3PDMakerUtils MCTruthClassifierLib RecoToolInterfaces egammaEvent TrkCaloExtension VxVertex egammaInterfacesLib )
+                     LINK_LIBRARIES AthContainers AthenaBaseComps AthenaKernel CaloEvent CaloGeoHelpers D3PDMakerInterfaces EventKernel GaudiKernel LArCablingLib MCTruthClassifierLib RecoToolInterfaces StoreGateLib TrkCaloExtension egammaInterfacesLib xAODCaloEvent xAODEgamma xAODTruth )
 
 # Install files from the package:
-atlas_install_python_modules( python/*.py )
-
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
diff --git a/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/python/TileGapSelectionGetter.py b/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/python/TileGapSelectionGetter.py
index b0820af63f4f..89f3ad6f8c51 100644
--- a/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/python/TileGapSelectionGetter.py
+++ b/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/python/TileGapSelectionGetter.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# $Id$
 #
 # @file egammaD3PDAnalysis/python/TileGapSelectionGetter.py
 # @author scott snyder <snyder@bnl.gov>
@@ -53,7 +52,7 @@ class TileGapSelectionGetter ( Configured )  :
 
             self._handle = alg
 
-        except:
+        except Exception:
             mlog.error ("Error configuring TileGapSelectionAlg.")
             traceback.print_exc()
 
diff --git a/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/python/egammaTruthParticleConfig.py b/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/python/egammaTruthParticleConfig.py
index eb659e62ebbb..6fd9a3d84675 100644
--- a/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/python/egammaTruthParticleConfig.py
+++ b/PhysicsAnalysis/D3PDMaker/egammaD3PDAnalysis/python/egammaTruthParticleConfig.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# $Id$
 #
 # @file egammaD3PDAnalysis/python/egammaTruthParticleConfig.py
 # @author scott snyder <snyder@bnl.gov>
@@ -11,12 +10,10 @@
 
 
 import egammaD3PDAnalysis
-import D3PDMakerCoreComps
 from D3PDMakerConfig.D3PDMakerFlags           import D3PDMakerFlags
-from McParticleAlgs.JobOptCfg                 import createMcAodBuilder
-from RecExConfig.RecFlags                     import rec
 from AthenaCommon.AlgSequence                 import AlgSequence
 from RecExConfig.ObjKeyStore                  import cfgKeyStore
+from RecExConfig.RecFlags                     import rec
 from AthenaCommon                             import CfgMgr
 
 
@@ -36,7 +33,6 @@ def egammaTruthParticleConfig \
 
     algname = prefix + sgkey + 'Builder'
     if not hasattr (seq, algname):
-        import AthenaCommon.CfgMgr as CfgMgr
         from egammaRec.Factories import ToolFactory
         exten = ToolFactory (CfgMgr.Trk__ParticleCaloExtensionTool,
                              name="GSFParticleCaloExtensionTool",
-- 
GitLab


From 9e71e417f3527f17ba17c6469918a8454bd8efd8 Mon Sep 17 00:00:00 2001
From: Andrew Mehta <andrew.mehta@cern.ch>
Date: Thu, 17 Dec 2020 17:06:51 +0000
Subject: [PATCH 129/225] Update version.txt

---
 Projects/AnalysisBase/version.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Projects/AnalysisBase/version.txt b/Projects/AnalysisBase/version.txt
index 469a03d2db00..16085fbb4e04 100644
--- a/Projects/AnalysisBase/version.txt
+++ b/Projects/AnalysisBase/version.txt
@@ -1 +1 @@
-22.2.5
+22.2.6
-- 
GitLab


From 6e64f2ae18706211c3b16813943a47150e548cd7 Mon Sep 17 00:00:00 2001
From: Zachary Louis Marshall <zach.marshall@cern.ch>
Date: Thu, 17 Dec 2020 17:31:49 +0000
Subject: [PATCH 130/225] Adding NTUP_PILEUP back into master

It looks like this (DF_DataPrep) was missed in the migration, so
NTUP_PILEUP wasn't working. This adds it back in.
---
 .../CMakeLists.txt                            | 11 ++++
 .../python/DAPR2EventList.py                  |  3 +
 .../python/DataPrepJobProperties.py           | 27 +++++++++
 .../python/__init__.py                        |  2 +
 .../share/DAPR0.py                            | 24 ++++++++
 .../share/DAPR1.py                            | 55 +++++++++++++++++++
 .../share/DAPR2.py                            | 35 ++++++++++++
 .../share/skeleton.AODtoDAOD_tf.py            | 18 ++++--
 8 files changed, 170 insertions(+), 5 deletions(-)
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/CMakeLists.txt
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/python/DAPR2EventList.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/python/DataPrepJobProperties.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/python/__init__.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/share/DAPR0.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/share/DAPR1.py
 create mode 100644 PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/share/DAPR2.py

diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/CMakeLists.txt b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/CMakeLists.txt
new file mode 100644
index 000000000000..80ef5a4f884f
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/CMakeLists.txt
@@ -0,0 +1,11 @@
+################################################################################
+# Package: DerivationFrameworkDataPrep
+################################################################################
+
+# Declare the package name:
+atlas_subdir( DerivationFrameworkDataPrep )
+
+# Install files from the package:
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
+atlas_install_joboptions( share/*.py )
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/python/DAPR2EventList.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/python/DAPR2EventList.py
new file mode 100644
index 000000000000..c488e7d5cd6a
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/python/DAPR2EventList.py
@@ -0,0 +1,3 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+EventList = [(276262, 366216946), (276262, 12241502), (276262, 13647343), (276262, 198181590), (276262, 255004128), (276262, 191476906), (276262, 157951929), (276262, 219513416), (276262, 78609439), (276262, 7160282), (276262, 126115945), (276262, 108109797), (276262, 404124285), (276329, 67649584), (276329, 372178767), (276329, 246999417), (276329, 250386040), (276329, 133096046), (276329, 102349619), (276329, 260927287), (276329, 112387366), (276329, 115922962), (276329, 142650297), (276329, 71039435), (276329, 76160804), (276329, 277617312), (276329, 282573830), (276329, 19659640), (276329, 19075347), (276329, 138616006), (276329, 313784553), (276329, 98972081), (276329, 181000569), (276329, 186351646), (276329, 187254326), (276329, 207602715), (276329, 242427871), (276329, 287238498), (276329, 411900298), (276329, 167534390), (276329, 304550306), (276329, 201405515), (276329, 342398721), (276329, 310320039), (276336, 21273207), (276336, 6843552), (276336, 18040781), (276336, 18758716), (276336, 19385659), (276416, 143538017), (276416, 148159084), (276416, 134005896), (276416, 124106650), (276416, 125792472), (276416, 113629388), (276416, 65624569), (276416, 28043912), (276416, 35408791), (276416, 7612513), (276416, 92938525), (276511, 159344994), (276511, 227121168), (276511, 233743915), (276511, 248005016), (276511, 249844151), (276511, 266426359), (276511, 79967862), (276511, 84849641), (276511, 219365115), (276511, 147446961), (276511, 174338302), (276511, 24260973), (276511, 32926183), (276511, 181357786), (276511, 182858171), (276511, 183801762), (276511, 1183208), (276511, 4154561), (276511, 4735843), (276511, 95688892), (276511, 103283877), (276511, 132322634), (276511, 6477457), (276511, 5920544), (276511, 107156789), (276511, 110970816), (276511, 112398479), (276511, 125207371), (276511, 129332450), (276511, 74064515), (276511, 73769311), (276511, 198957977), (276511, 199282143), (276511, 257523172), (276689, 137109697), (276689, 143074596), (276689, 148879715), (276689, 77815761), (276689, 23929472), (276689, 27292496), (276689, 42023947), (276689, 198530398), (276689, 201728804), (276689, 202903111), (276689, 206101041), (276689, 85069330), (276689, 89384650), (276689, 115425020), (276689, 117237937), (276689, 172727967), (276689, 215560663), (276689, 8167397), (276689, 9680864), (276689, 261453453), (276689, 263199154), (276689, 1156290), (276689, 2640029), (276689, 98684383), (276689, 103129126), (276689, 108532720), (276689, 57290075), (276689, 59748649), (276689, 20420693), (276689, 49207872), (276689, 164401024), (276689, 170474206), (276689, 171359319), (276689, 186780139), (276689, 192011862), (276689, 193051077), (276778, 16041787), (276790, 11276967), (276790, 12110486), (276790, 52748416), (276790, 23078325), (276790, 22495017), (276790, 34538441), (276790, 37589269), (276952, 124070203), (276952, 205579598), (276952, 11888053), (276952, 41857703), (276952, 44242529), (276952, 147258878), (276952, 152814611), (276952, 69524185), (276952, 70773235), (276952, 83921840), (276952, 218433117), (276952, 221081946), (276952, 225867095), (276952, 225466398), (276952, 181078925), (276952, 20310337), (276952, 23744446), (276954, 14574690), (278880, 558085589), (278880, 210318172), (278880, 602265022), (278880, 676792095), (278880, 689755707), (278880, 146778511), (278880, 148342250), (278880, 255538473), (278880, 256393458), (278880, 286576235), (278880, 70264671), (278880, 74174619), (278880, 81445605), (278880, 94801954), (278880, 164505578), (278880, 202139538), (278880, 291210636), (278880, 170499965), (278880, 174445448), (278880, 187835224), (278880, 187910379), (278880, 188228430), (278880, 118180964), (278880, 322668008), (278880, 326402710), (278880, 374369278), (278880, 376121296), (278880, 380385214), (278880, 129786175), (278880, 133038506), (278880, 585833415), (278880, 587265014), (278880, 593009820), (278880, 470197912), (278880, 438328550), (278880, 439565190), (278880, 230061545), (278880, 235385490), (278880, 235517755), (278880, 248583650), (278880, 262270235), (278880, 265998789), (278880, 268630374), (278880, 269180081), (278880, 343397990), (278880, 351883614), (278880, 33685726), (278880, 36588872), (278880, 53513443), (278880, 702200008), (278880, 542587395), (278880, 708878720), (278880, 713175974), (278880, 17985738), (278880, 23266001), (278880, 67423146), (278880, 68561247), (278880, 416560385), (278880, 418053900), (278880, 460066094), (278880, 526379537), (278880, 529065042), (278880, 481414837), (278880, 482487092), (278880, 664807109), (278880, 613104986), (278880, 720200839), (278880, 433085407), (278912, 9325788), (278912, 24180006), (278912, 391830323), (278912, 393428345), (278912, 395672838), (278912, 398174556), (278912, 402368383), (278912, 402248151), (278912, 446740704), (278912, 247226791), (278912, 210164111), (278912, 174301934), (278912, 330690799), (278912, 344532504), (278912, 351056473), (278912, 356562325), (278912, 425889292), (278912, 440821328), (278912, 444778724), (278912, 452320099), (278912, 523727655), (278912, 127070976), (278912, 129230005), (278912, 130967009), (278912, 64417832), (278912, 154518859), (278912, 162475008), (278912, 165148177), (278912, 247472369), (278912, 254465819), (278912, 258958314), (278912, 266113254), (278912, 268525890), (278912, 268869947), (278912, 270704153), (278912, 87571939), (278912, 509095340), (278912, 554264734), (278912, 370087212), (278912, 373296021), (278912, 377909850), (278912, 275131369), (278912, 110561647), (278912, 115742166), (278912, 218423882), (278912, 46664935), (278912, 477148808), (278912, 487054716), (278968, 165182532), (278968, 143260590), (278968, 90174946), (278968, 89956812), (278968, 101489709), (278968, 102767612), (278968, 115572316), (278968, 73571144), (278968, 76769497), (278968, 155339552), (278968, 44114170), (278968, 250824132), (278968, 218357057), (278968, 219828633), (278968, 70324804), (278968, 71490596), (278968, 11649887), (278968, 173738447), (278968, 198894682), (278968, 3659739), (278968, 2329077), (278968, 120012398), (278968, 122865406), (278968, 127440137), (278970, 15845225), (278970, 15760301), (278970, 18356759), (278970, 22424983), (278970, 6132230), (279169, 943996713), (279169, 945083670), (279169, 633433430), (279169, 643462941), (279169, 520296143), (279169, 575857015), (279169, 595636736), (279169, 1469883743), (279169, 1495023079), (279169, 438293368), (279169, 439642378), (279169, 442226342), (279169, 194302338), (279169, 201262625), (279169, 214362147), (279169, 219305303), (279169, 219891400), (279169, 919112711), (279169, 275333897), (279169, 273252362), (279169, 279551154), (279169, 1402864338), (279169, 1401821825), (279169, 1103410929), (279169, 1109269936), (279169, 1118067608), (279169, 1530082412), (279169, 1541038448), (279169, 377875241), (279169, 384300248), (279169, 792841748), (279169, 1447900865), (279169, 1454385855), (279169, 1457631427), (279169, 1461591590), (279169, 612607030), (279169, 1031987980), (279169, 1563254647), (279169, 171512400), (279169, 178315806), (279169, 987341454), (279169, 987577577), (279169, 988458822), (279169, 1502738552), (279169, 1506590293), (279169, 1510296981), (279169, 1211088344), (279169, 1211046418), (279169, 1227526456), (279169, 1231226864), (279169, 1240810263), (279169, 1626433282), (279169, 1644149115), (279169, 1651353222), (279169, 1652072980), (279169, 74878768), (279169, 74272943), (279169, 79981385), (279169, 98877310), (279169, 99460073), (279169, 887998446), (279169, 1312869297), (279169, 1314976476), (279169, 1362180102), (279169, 301744794), (279169, 307888886), (279169, 323690739), (279169, 1246287325), (279169, 1261465613), (279169, 1266924280), (279169, 679173076), (279169, 680351387), (279169, 691777525), (279169, 691072555), (279169, 701892284), (279169, 707648124), (279169, 707568505), (279169, 717681383), (279169, 723981578), (279169, 481962563), (279169, 487473644), (279169, 488883027), (279169, 492009472), (279169, 493588232), (279169, 495697730), (279169, 1600602838), (279169, 1601131811), (279169, 1620265042), (279169, 1052348336), (279169, 1055573472), (279169, 1063099189), (279169, 843802936), (279169, 845268121), (279169, 852984357), (279169, 861205000), (279169, 868808229), (279169, 898947734), (279169, 915126543), (279169, 393777873), (279169, 412778817), (279169, 834609284), (279169, 836143404), (279169, 840498834), (279169, 843015382), (279169, 337210178), (279169, 340406409), (279169, 343555274), (279169, 550545934), (279169, 555766315), (279169, 738857915), (279169, 746714708), (279169, 292554193), (279169, 1408623093), (279169, 1425453083), (279169, 1434103497), (279169, 223326543), (279169, 1276286341), (279169, 1386275048), (279169, 764020905), (279169, 773224456), (279169, 775604446), (279169, 656640231), (279169, 670951445), (279169, 1585273614), (279169, 1593711986), (279169, 10495054), (279169, 14241626), (279169, 38752459), (279169, 42158648), (279169, 56057584), (279169, 62105065), (279169, 75106139), (279169, 104712796), (279169, 110649292), (279169, 1157924659), (279169, 1157392517), (279169, 1163371091), (279169, 1175355814), (279169, 1173940835), (279169, 1325159713), (279169, 964857934), (279169, 974587831), (279169, 981256056), (279169, 255320225), (279169, 1142754619), (279169, 20613346), (279169, 22695063), (279169, 22325424), (279169, 27853806), (279169, 27346911), (279169, 117668500), (279169, 129461531), (279169, 153607428), (279169, 157204853), (279169, 446801433), (279169, 455096017), (279169, 456322832), (279259, 7382766), (279259, 189538654), (279259, 102973716), (279259, 101874907), (279259, 132973056), (279259, 138363059), (279259, 80747505), (279259, 84429720), (279259, 85725926), (279259, 87470015), (279259, 109137471), (279259, 121163788), (279259, 127555797), (279259, 127082625), (279259, 127666691), (279259, 131478932), (279259, 10070234), (279259, 13036249), (279259, 164655706), (279259, 30998749), (279259, 50182595), (279279, 157765700), (279279, 168431568), (279279, 169652815), (279279, 67409918), (279279, 85068026), (279279, 85127053), (279279, 290268491), (279279, 299528243), (279279, 299566094), (279279, 302116573), (279279, 307050736), (279279, 309944889), (279279, 447787237), (279279, 453259422), (279279, 483013239), (279279, 485476237), (279279, 486723062), (279279, 126953859), (279279, 126802184), (279279, 254565509), (279279, 410226903), (279279, 412237714), (279279, 415017426), (279279, 419043534), (279279, 433225859), (279279, 221870318), (279279, 223467366), (279279, 224901359), (279279, 227022877), (279279, 228353326), (279279, 237957054), (279279, 37607554), (279279, 40198656), (279279, 41247657), (279279, 41110764), (279279, 43339592), (279279, 177409592), (279279, 2092291), (279279, 2820861), (279279, 398014464), (279279, 109275223), (279279, 364090925), (279279, 363952307), (279279, 10109417), (279279, 13987633), (279279, 96812330), (279279, 270819332), (279279, 274604367), (279279, 282865118), (279279, 285082097), (279279, 285292483), (279279, 368048886), (279279, 373448746), (279279, 384438338), (279279, 145606367), (279279, 154558799), (279284, 28905365), (279284, 711776478), (279284, 130411483), (279284, 136143656), (279284, 829015000), (279284, 835342939), (279284, 837716724), (279284, 837366208), (279284, 394256920), (279284, 415461541), (279284, 2233942), (279284, 5383290), (279284, 4962413), (279284, 460276836), (279284, 607205529), (279284, 612988048), (279284, 501138096), (279284, 502913949), (279284, 761425665), (279284, 801288658), (279284, 654380441), (279284, 687703411), (279284, 484577148), (279284, 514082039), (279284, 514885483), (279284, 280743447), (279284, 282317355), (279284, 283789373), (279284, 294779317), (279284, 296376533), (279284, 154051371), (279284, 155181782), (279284, 743942311), (279284, 59447991), (279284, 68941988), (279284, 73656051), (279284, 77895813), (279284, 83709286), (279284, 344485613), (279284, 352887723), (279284, 433393828), (279284, 574089358), (279284, 577247890), (279284, 587648267), (279284, 589509722), (279284, 537429716), (279284, 48378100), (279284, 52885094), (279284, 854511572), (279284, 862036119), (279284, 238168122), (279284, 635300126), (279284, 639849600), (279284, 669783559), (279284, 671430320), (279284, 679269563), (279284, 248397464), (279284, 248662417), (279284, 251367153), (279284, 269248448), (279284, 272268398), (279284, 85331968), (279284, 89642837), (279284, 177128897), (279284, 185555331), (279284, 191882785), (279284, 447640716), (279284, 472040355), (279284, 473125716), (279284, 476588693), (279284, 311601042), (279284, 331197293), (279284, 372210446), (279284, 544739342), (279284, 547223675), (279284, 562957561), (279284, 213125379), (279284, 219938554), (279284, 232966410), (279345, 1035190249), (279345, 520602143), (279345, 288259752), (279345, 287864601), (279345, 299122084), (279345, 172001233), (279345, 174561880), (279345, 868237357), (279345, 871382796), (279345, 409098444), (279345, 415021297), (279345, 425620990), (279345, 986389970), (279345, 988615034), (279345, 436533637), (279345, 438627316), (279345, 495882386), (279345, 501744769), (279345, 163235851), (279345, 211866800), (279345, 353160612), (279345, 352651640), (279345, 355025669), (279345, 362343899), (279345, 387977378), (279345, 391534047), (279345, 140224469), (279345, 142067599), (279345, 240762906), (279345, 239642198), (279345, 598401438), (279345, 833596648), (279345, 836382436), (279345, 839222405), (279345, 855322438), (279345, 855083629), (279345, 854708266), (279345, 854585572), (279345, 1212650394), (279345, 538114794), (279345, 540618998), (279345, 738298753), (279345, 745585855), (279345, 771636157), (279345, 959810044), (279345, 230122533), (279345, 232017519), (279345, 235776182), (279345, 243152325), (279345, 721857512), (279345, 785702676), (279345, 1070785781), (279345, 1072388432), (279345, 1074858200), (279345, 1074108987), (279345, 1076452646), (279345, 1076024173), (279345, 1080436445), (279345, 1080239910), (279345, 559910786), (279345, 822683782), (279345, 1288844147), (279345, 1287915007), (279345, 217003404), (279345, 226238055), (279345, 304060822), (279345, 286949721), (279345, 5123407), (279345, 1014928454), (279345, 88352598), (279345, 1270445702), (279345, 271977692), (279345, 885256205), (279345, 891679622), (279345, 943499700), (279345, 946809273), (279345, 664254380), (279345, 670608593), (279345, 110996821), (279345, 112071858), (279345, 115874894), (279345, 128839186), (279345, 95625492), (279345, 96220242), (279345, 362828182), (279345, 708545744), (279345, 726001340), (279345, 902047367), (279345, 908118968), (279345, 911886178), (279345, 922167447), (279345, 785822161), (279345, 935610164), (279345, 1224224035), (279345, 345742201), (279345, 1105239291), (279345, 1162661409), (279345, 1170563502), (279345, 618487713), (279345, 994488043), (279345, 996787419), (279345, 1009472954), (279345, 1067422589), (279345, 1318184448), (279345, 1321398967), (279345, 1325145992), (279345, 1326432358), (279345, 1327204644), (279345, 1344880322), (279345, 815036794), (279345, 1210248345), (279345, 1327837723), (279345, 1335034130), (279345, 1334771383), (279345, 632480228), (279345, 635028969), (279345, 636606307), (279345, 638759437), (279345, 447501400), (279345, 449630229), (279345, 467888331), (279345, 468707961), (279345, 471549014), (279345, 929791657), (279345, 318807004), (279345, 317523398), (279345, 319990672), (279345, 323366206), (279345, 8164514), (279345, 11556745), (279345, 16486019), (279345, 18358344), (279345, 45118043), (279345, 46521827), (279345, 30445828), (279515, 3962434), (279515, 6025764), (279598, 1388891327), (279598, 1394176644), (279598, 1402783909), (279598, 1414448132), (279598, 973620427), (279598, 979595015), (279598, 1357688820), (279598, 1367718704), (279598, 1295010706), (279598, 1325608057), (279598, 1325292726), (279598, 1331886192), (279598, 1333373735), (279598, 968291813), (279598, 778914918), (279598, 791411562), (279598, 792167092), (279598, 793569288), (279598, 802113884), (279598, 374698810), (279598, 1087649368), (279598, 1086700195), (279598, 1099884791), (279598, 1100165415), (279598, 166600860), (279598, 183119109), (279598, 189322469), (279598, 636050899), (279598, 640113663), (279598, 645427167), (279598, 654528034), (279598, 574322297), (279598, 1476144889), (279598, 1480949682), (279598, 1495046331), (279598, 318291690), (279598, 325819776), (279598, 325662467), (279598, 330550056), (279598, 330805523), (279598, 337870049), (279598, 1168991694), (279598, 1462950863), (279598, 1472530964), (279598, 46900118), (279598, 50172613), (279598, 134367249), (279598, 135152816), (279598, 138378804), (279598, 139400399), (279598, 143550149), (279598, 65573096), (279598, 77298165), (279598, 144551097), (279598, 154392977), (279598, 188545455), (279598, 195185261), (279598, 226348599), (279598, 228384923), (279598, 690706845), (279598, 694306428), (279598, 706586806), (279598, 274219499), (279598, 280547611), (279598, 385199347), (279598, 393248273), (279598, 462195139), (279598, 447756374), (279598, 452728423), (279598, 884694866), (279598, 1137834059), (279598, 751497185), (279598, 766523514), (279598, 766040455), (279598, 459560248), (279598, 1037949989), (279598, 1045713975), (279598, 230240202), (279598, 232625906), (279598, 243269391), (279598, 242906848), (279598, 983813384), (279598, 57268567), (279598, 75977588), (279598, 85810638), (279598, 946421835), (279598, 948621510), (279598, 735859214), (279598, 736132092), (279598, 103977647), (279598, 114269921), (279598, 112714572), (279598, 621897976), (279598, 624834907), (279598, 624080216), (279598, 626422330), (279598, 627832560), (279598, 630342724), (279598, 1235398562), (279598, 1237488346), (279598, 1239492690), (279598, 1283427434), (279598, 1384764421), (279598, 515633192), (279598, 529583548), (279598, 1207920667), (279598, 1209120259), (279598, 1216893537), (279598, 1228972019), (279598, 1227261582), (279598, 666698134), (279598, 671396538), (279598, 677029107), (279598, 1112966914), (279598, 1114815598), (279598, 1175389910), (279598, 1177181779), (279598, 1178599861), (279598, 1183212184), (279598, 1185121044), (279598, 1187097618), (279598, 1253293190), (279598, 1254691608), (279598, 1258902383), (279598, 1342732987), (279598, 1348632307), (279598, 202102884), (279598, 206321910), (279598, 551627349), (279598, 601203267), (279598, 602094181), (279598, 917868637), (279598, 920180716), (279598, 985622816), (279598, 994793323), (279598, 997881402), (279598, 999419684), (279598, 857365954), (279598, 856326326), (279598, 1145231627), (279598, 1149974331), (279598, 1154115475), (279598, 1189717883), (279598, 1197191331), (279598, 1198249657), (279598, 850139548), (279598, 853681341), (279598, 866434381), (279598, 876900879), (279598, 892730309), (279598, 898433744), (279598, 902822367), (279598, 905176377), (279598, 1418666154), (279598, 1417706379), (279598, 1446180251), (279598, 1447516086), (279598, 1452474604), (279598, 720949184), (279598, 1502027023), (279598, 1503190290), (279598, 1502430080), (279598, 1510860539), (279598, 1555272155), (279598, 314197678), (279598, 925078528), (279598, 929238548), (279598, 935507622), (279598, 9198293), (279598, 11441207), (279598, 13672638), (279598, 1561732067), (279598, 1561952673), (279598, 1565191883), (279598, 432956996), (279598, 433448327), (279598, 437574148), (279598, 288344344), (279598, 350407838), (279598, 352028446), (279598, 358330446), (279598, 527123760), (279598, 527808485), (279598, 589276780), (279598, 1616503410), (279598, 1616885503), (279598, 1543088721), (279598, 1590951544), (279598, 1593452632), (279598, 1600151675), (279598, 1004261079), (279598, 1002572312), (279598, 1006881782), (279598, 1010589620), (279598, 1014570747), (279598, 1015903907), (279598, 1624740973), (279598, 1643829316), (279685, 569724665), (279685, 994915396), (279685, 1058293500), (279685, 1059691471), (279685, 1060524274), (279685, 902029287), (279685, 906221432), (279685, 905353716), (279685, 908822177), (279685, 1587215741), (279685, 102225689), (279685, 111265479), (279685, 112437604), (279685, 117232487), (279685, 170008812), (279685, 173618549), (279685, 172685200), (279685, 548219355), (279685, 548775161), (279685, 551082383), (279685, 572228553), (279685, 584895490), (279685, 859593162), (279685, 1019141524), (279685, 1041391686), (279685, 1043945604), (279685, 75254343), (279685, 82429255), (279685, 90451060), (279685, 98910890), (279685, 308173810), (279685, 307481942), (279685, 1077573297), (279685, 1079943156), (279685, 601199047), (279685, 610366173), (279685, 632813454), (279685, 1084232152), (279685, 1085663679), (279685, 757468064), (279685, 758660432), (279685, 1449718623), (279685, 1449419797), (279685, 1448800734), (279685, 1458862243), (279685, 931230941), (279685, 1787373449), (279685, 1273019788), (279685, 1623723627), (279685, 1627345414), (279685, 1665215377), (279685, 941561732), (279685, 945808152), (279685, 952069422), (279685, 959386543), (279685, 957489617), (279685, 960091593), (279685, 1498853), (279685, 3354467), (279685, 1825441210), (279685, 1826135061), (279685, 447177602), (279685, 450784276), (279685, 1114561661), (279685, 1145965756), (279685, 1301362874), (279685, 1305530278), (279685, 744120151), (279685, 1479609626), (279685, 1481369452), (279685, 1487977743), (279685, 1486709793), (279685, 1493011696), (279685, 222575576), (279685, 225567252), (279685, 230102870), (279685, 178592801), (279685, 179247331), (279685, 1101776168), (279685, 46448084), (279685, 54285602), (279685, 58410530), (279685, 1182376397), (279685, 1240387257), (279685, 1496184362), (279685, 1817476143), (279685, 648076843), (279685, 651304603), (279685, 660023662), (279685, 659626008), (279685, 66462959), (279685, 68135525), (279685, 26480868), (279685, 497932998), (279685, 1692021026), (279685, 1698150911), (279685, 1717769174), (279685, 1795794646), (279685, 1810537926), (279685, 463073158), (279685, 467817677), (279685, 470133770), (279685, 476165445), (279685, 478420692), (279685, 484119678), (279685, 1474311126), (279685, 252408862), (279685, 616175955), (279685, 615044725), (279685, 617188215), (279685, 710888398), (279685, 717128856), (279685, 1824722195), (279685, 1828119641), (279685, 255853864), (279685, 157159798), (279685, 185747999), (279685, 185578178), (279685, 187779327), (279685, 1216555452), (279685, 1744754317), (279685, 1747211832), (279685, 1748341060), (279685, 1753005273), (279685, 402618250), (279685, 404631466), (279685, 119795507), (279685, 120091061), (279685, 211043904), (279685, 1171421202), (279685, 134159756), (279685, 141460532), (279685, 147255417), (279685, 155870083), (279685, 378532264), (279685, 665461073), (279685, 667677456), (279685, 671112770), (279685, 672741895), (279685, 696755721), (279685, 695307543), (279685, 697244349), (279685, 701432480), (279685, 706392932), (279685, 350271855), (279685, 353883987), (279685, 796806157), (279685, 806779151), (279685, 1546891437), (279685, 1549430039), (279685, 1550267182), (279685, 1552145210), (279685, 1553505171), (279685, 1559780666), (279685, 1562932412), (279685, 1573740582), (279685, 1575135572), (279685, 1576802830), (279685, 967514807), (279685, 967681480), (279685, 973546702), (279685, 973249481), (279685, 528038554), (279685, 1222927166), (279685, 1225955645), (279685, 1154233143), (279685, 841042729), (279685, 845988910), (279685, 847464153), (279685, 847679312), (279685, 897288539), (279685, 1259574788), (279685, 327324918), (279685, 771342809), (279685, 770222271), (279685, 769856136), (279685, 1682320978), (279685, 1727605776), (279685, 1732050788), (279685, 1734545390), (279685, 777495529), (279685, 785254618), (279685, 916319792), (279685, 926937122), (279685, 598508746), (279685, 679806409), (279685, 687090831), (279685, 1372152899), (279685, 1377678026), (279685, 1386934868), (279685, 1389046709), (279685, 1397343325), (279685, 1338092042), (279685, 1339637549), (279685, 1600116897), (279685, 1607910084), (279685, 1610191079), (279685, 1611562685), (279685, 1617446423), (279685, 1364914813), (279685, 1759463409), (279685, 1758881557), (279685, 1770512895), (279685, 1770039305), (279764, 5819788), (279764, 147785766), (279764, 40232410), (279813, 616466172), (279813, 619809037), (279813, 635457094), (279813, 642836718), (279813, 440447256), (279813, 444048352), (279813, 447706527), (279813, 451702099), (279813, 460232356), (279813, 461352233), (279813, 464634867), (279813, 97955957), (279813, 102338113), (279813, 107652008), (279813, 106361232), (279813, 120228827), (279813, 299404856), (279813, 303064762), (279813, 128018090), (279813, 130202428), (279813, 130015733), (279813, 139140794), (279813, 140139893), (279813, 146724224), (279813, 43947930), (279813, 45549576), (279813, 52577520), (279813, 3658787), (279813, 5210712), (279813, 1154321916), (279813, 1158790717), (279813, 1159090290), (279813, 1165572770), (279813, 754406947), (279813, 756800398), (279813, 761144976), (279813, 768822871), (279813, 853840890), (279813, 211655354), (279813, 221445554), (279813, 222492549), (279813, 789441169), (279813, 791778110), (279813, 797592164), (279813, 1178568495), (279813, 1215922757), (279813, 646372100), (279813, 647978944), (279813, 654188675), (279813, 405800339), (279813, 409339907), (279813, 410688911), (279813, 1068596105), (279813, 1102506220), (279813, 1115180157), (279813, 333100810), (279813, 332941516), (279813, 682743143), (279813, 681445084), (279813, 701309533), (279813, 702546536), (279813, 707476487), (279813, 484253053), (279813, 559204132), (279813, 559137019), (279813, 563071462), (279813, 576910951), (279813, 971824075), (279813, 160199615), (279813, 163499359), (279813, 168546333), (279813, 985775743), (279813, 1030903032), (279813, 1226590420), (279813, 1235865797), (279813, 1197688367), (279813, 1205015713), (279813, 1242594781), (279813, 1245317384), (279813, 998085516), (279813, 369482646), (279813, 498844966), (279813, 388459936), (279813, 391427043), (279813, 870999559), (279813, 880378200), (279813, 249523725), (279813, 260842731), (279813, 15368714), (279813, 24934870), (279813, 26265330), (279813, 1033632667), (279813, 1037311167), (279813, 1050859949), (279813, 1054815393), (279813, 1055943910), (279813, 1100057814), (279813, 720370499), (279813, 1125950845), (279813, 1135480408), (279813, 1148403014), (279813, 174172890), (279813, 188787273), (279813, 198702267), (279813, 261175451), (279813, 265130671), (279813, 281487612), (279813, 279948829), (279813, 280070287), (279813, 287516402), (279813, 887283232), (279813, 886117066), (279813, 895690048), (279813, 904706566), (279813, 907326665), (279813, 803716262), (279813, 816588518), (279813, 64799420), (279813, 68953861), (279813, 69378380), (279813, 85998116), (279813, 930068729), (279813, 931303409), (279867, 276462710), (279867, 283478093), (279867, 40374415), (279867, 48205478), (279867, 57832404), (279867, 220727668), (279867, 225201413), (279867, 230083828), (279867, 234090186), (279867, 238214821), (279867, 152315704), (279867, 173150219), (279867, 552916125), (279867, 553492391), (279867, 578475797), (279867, 576636245), (279867, 584246967), (279867, 587806044), (279867, 593262754), (279867, 251156171), (279867, 254720060), (279867, 256562575), (279867, 260388389), (279867, 656092326), (279867, 662938194), (279867, 375865760), (279867, 382566734), (279867, 523629106), (279867, 527358731), (279867, 384262353), (279867, 391137986), (279867, 397526232), (279867, 397540041), (279867, 400144067), (279867, 404250675), (279867, 404098489), (279867, 71976189), (279867, 79482015), (279867, 79330119), (279867, 119159109), (279867, 131839848), (279867, 132829782), (279867, 420847658), (279867, 435767466), (279867, 437218546), (279867, 439333394), (279867, 445515368), (279867, 448633490), (279867, 298901939), (279867, 298322683), (279867, 301192556), (279867, 305637241), (279867, 321738423), (279867, 565324594), (279867, 198556976), (279867, 200365902), (279867, 507533248), (279867, 506970520), (279867, 539183937), (279867, 102905619), (279867, 110790455), (279867, 607416904), (279867, 636596608), (279867, 637566889), (279867, 650399144), (279867, 481990882), (279867, 406846348), (279867, 413020649), (279867, 414061437), (279867, 464538507), (279867, 470960911), (279867, 377607978), (279867, 330766943), (279867, 336013625), (279867, 347635818), (279867, 15012112), (279867, 30367924), (279928, 7904736), (279928, 9543411), (279928, 12132872), (279928, 10267765), (279928, 13923914), (279932, 537387934), (279932, 539808166), (279932, 789532614), (279932, 789657845), (279932, 808591363), (279932, 998123955), (279932, 364772005), (279932, 994715156), (279932, 1005236149), (279932, 1025399141), (279932, 468459692), (279932, 475890612), (279932, 480958467), (279932, 482504840), (279932, 756247031), (279932, 781018138), (279932, 779002166), (279932, 8599822), (279932, 11297069), (279932, 13758917), (279932, 18341275), (279932, 23782059), (279932, 32004457), (279932, 42835472), (279932, 57139278), (279932, 61398373), (279932, 655807898), (279932, 656157158), (279932, 669401622), (279932, 670162684), (279932, 683482319), (279932, 483179039), (279932, 487609186), (279932, 529394225), (279932, 533504637), (279932, 534178827), (279932, 817866564), (279932, 816951913), (279932, 818753917), (279932, 819868781), (279932, 837041074), (279932, 942574028), (279932, 955031554), (279932, 967752540), (279932, 975385966), (279932, 984086477), (279932, 713773421), (279932, 717300387), (279932, 324553947), (279932, 334270094), (279932, 335402320), (279932, 335293482), (279932, 342731578), (279932, 343360308), (279932, 346826503), (279932, 108413293), (279932, 111805388), (279932, 113513911), (279932, 587004807), (279932, 589257352), (279932, 589655067), (279932, 598241304), (279932, 645215674), (279932, 648275647), (279932, 650544540), (279932, 650704969), (279932, 612999477), (279932, 624961067), (279932, 624870367), (279932, 289855172), (279932, 298845396), (279932, 164032909), (279932, 382890312), (279932, 384772370), (279932, 394903722), (279932, 403247539), (279932, 407152872), (279932, 504185577), (279932, 509093509), (279932, 508082245), (279932, 511656679), (279932, 521597703), (279932, 522413971), (279932, 914749114), (279932, 932025556), (279932, 198622212), (279932, 204366335), (279932, 244685199), (279932, 244026524), (279932, 244238860), (279932, 266770046), (279932, 282178729), (279932, 215396000), (279932, 231451835), (279932, 237463069), (279932, 244724002), (279932, 428678783), (279932, 355284109), (279932, 357576354), (279932, 377540805), (279932, 170531949), (279932, 174834997), (279932, 172400430), (279932, 181016157), (279932, 184914053), (279932, 694033901), (279932, 717728719), (279932, 719205259), (279932, 721348777), (279932, 723676165), (279932, 725029952), (279932, 728355726), (279932, 126115705), (279932, 137736437), (279932, 146822795), (279932, 149518335), (279932, 897126465), (279932, 944327392), (279932, 944128650), (279932, 968702873), (279932, 735075940), (279932, 863481189), (279932, 870290007), (279932, 880476512), (279932, 882826003), (279932, 430969735), (279932, 436899787), (279932, 438809167), (279932, 441542389), (279932, 448622663), (279932, 449855856), (279932, 315692580), (279932, 319865821), (279932, 324410202), (279984, 203574371), (279984, 209494295), (279984, 226576929), (279984, 704677185), (279984, 725065273), (279984, 1439950282), (279984, 1467346953), (279984, 132238512), (279984, 431702444), (279984, 438988933), (279984, 441301622), (279984, 286135090), (279984, 296404412), (279984, 660624978), (279984, 662480441), (279984, 668485621), (279984, 696383882), (279984, 871248035), (279984, 1374875253), (279984, 612588484), (279984, 621139315), (279984, 638134633), (279984, 649232536), (279984, 651233229), (279984, 566194111), (279984, 567007312), (279984, 574983306), (279984, 576866499), (279984, 1021322692), (279984, 177530616), (279984, 183527026), (279984, 184583254), (279984, 1111779127), (279984, 1121587255), (279984, 1127647502), (279984, 1133875712), (279984, 1342363616), (279984, 1346473479), (279984, 1348345553), (279984, 1351367224), (279984, 1356393695), (279984, 1357845360), (279984, 1360145796), (279984, 1478546588), (279984, 1479723233), (279984, 1479556604), (279984, 1231063345), (279984, 632328323), (279984, 635344308), (279984, 377026438), (279984, 1294597823), (279984, 1295812372), (279984, 1300422864), (279984, 1318499940), (279984, 1391311353), (279984, 1395298056), (279984, 1403930012), (279984, 910584338), (279984, 915779140), (279984, 918777379), (279984, 1053399407), (279984, 1055807660), (279984, 89828430), (279984, 91910483), (279984, 104113253), (279984, 115354325), (279984, 1171798273), (279984, 1175375807), (279984, 1176891721), (279984, 1179008859), (279984, 1183606039), (279984, 1143860751), (279984, 1148604631), (279984, 1149254523), (279984, 1159875136), (279984, 1259816663), (279984, 1272290835), (279984, 1277090444), (279984, 1277682507), (279984, 820536378), (279984, 820836378), (279984, 824599473), (279984, 826173615), (279984, 830614230), (279984, 837218918), (279984, 12778623), (279984, 466189416), (279984, 471202313), (279984, 586104960), (279984, 598971757), (279984, 980040724), (279984, 1075070408), (279984, 1076778676), (279984, 1096572243), (279984, 1097230136), (279984, 796893590), (279984, 803375607), (279984, 807804261), (279984, 818481701), (279984, 238278996), (279984, 244367499), (279984, 242452118), (279984, 1411309100), (279984, 1419513519), (279984, 1433269542), (279984, 1441285496), (279984, 163377331), (279984, 194595648), (279984, 194918883), (279984, 539118309), (279984, 548242271), (279984, 128843345), (279984, 502122075), (279984, 511562984), (279984, 512742536), (279984, 512165378), (279984, 523680108), (279984, 525423661), (279984, 1199110775), (279984, 1219873554), (279984, 328987017), (279984, 341031913), (279984, 356654933), (279984, 743171650), (279984, 743165336), (279984, 749235945), (279984, 25077169), (279984, 27537063), (279984, 32563160), (279984, 39885749), (279984, 305895209), (279984, 309206165), (279984, 308155401), (279984, 322667967), (279984, 1002613611), (279984, 1012315666), (279984, 1015736657), (279984, 395391978), (279984, 399735682), (279984, 1067305476), (279984, 1072074541), (279984, 61881584), (279984, 66529886), (279984, 774111109), (279984, 776114527), (279984, 784425595), (279984, 677779731), (279984, 682195540), (279984, 415868084), (279984, 415447915), (279984, 56984747), (279984, 58416632), (279984, 60491232), (279984, 123743894), (279984, 127103528), (279984, 473768215), (279984, 488222088), (279984, 500081545), (279984, 274552281), (279984, 341306171), (279984, 345399690), (279984, 346526187), (279984, 154874931), (279984, 152774031), (279984, 927028121), (279984, 941866077), (279984, 942073042), (279984, 940069951), (280231, 1697220415), (280231, 2044826238), (280231, 2173299266), (280231, 2212872429), (280231, 2216552214), (280231, 1449968217), (280231, 1527271497), (280231, 1534504071), (280231, 1541691770), (280231, 1545610057), (280231, 1552437414), (280231, 2233292561), (280231, 2237120544), (280231, 2237811313), (280231, 2246005121), (280231, 369689579), (280231, 367543760), (280231, 1458179665), (280231, 1474698197), (280231, 1482665388), (280231, 1156069677), (280231, 1157252005), (280231, 1158855586), (280231, 1164197770), (280231, 1180553520), (280231, 1180765527), (280231, 793501146), (280231, 1667479009), (280231, 1676573399), (280231, 1687565918), (280231, 1692799960), (280231, 1698406588), (280231, 855957288), (280231, 854394699), (280231, 869243622), (280231, 873562692), (280231, 876920574), (280231, 875530537), (280231, 880532971), (280231, 881173153), (280231, 971849653), (280231, 1002395450), (280231, 1013068944), (280231, 945670592), (280231, 953019147), (280231, 1260055395), (280231, 1263800365), (280231, 1268507030), (280231, 1269911400), (280231, 1273571681), (280231, 1278011838), (280231, 38558870), (280231, 40878906), (280231, 61455973), (280231, 66713800), (280231, 1339192349), (280231, 1344392823), (280231, 217745065), (280231, 227728751), (280231, 231636765), (280231, 235466307), (280231, 2012570930), (280231, 2016636496), (280231, 671510359), (280231, 434101590), (280231, 443192737), (280231, 450134377), (280231, 459055082), (280231, 460538315), (280231, 1973708885), (280231, 1980187692), (280231, 471164304), (280231, 473567922), (280231, 473221885), (280231, 473991357), (280231, 479249399), (280231, 488312835), (280231, 490615902), (280231, 1315844372), (280231, 1313857790), (280231, 1321860185), (280231, 1326534006), (280231, 1356225718), (280231, 1375092666), (280231, 196298124), (280231, 1949842409), (280231, 1931123628), (280231, 1930664315), (280231, 89110006), (280231, 91182123), (280231, 95836512), (280231, 100768792), (280231, 108884461), (280231, 111613478), (280231, 2087566099), (280231, 2096000312), (280231, 2096781713), (280231, 2100684572), (280231, 2103911713), (280231, 2119938426), (280231, 1243456494), (280231, 1260778712), (280231, 1520861485), (280231, 1528260441), (280231, 1635043760), (280231, 1634847333), (280231, 1640387994), (280231, 1639530458), (280231, 1958665413), (280231, 1964739554), (280231, 1972308456), (280231, 2140453858), (280231, 2148717251), (280231, 2151283867), (280231, 2153712104), (280231, 2161705125), (280231, 2162933936), (280231, 2163098832), (280231, 1655056891), (280231, 1654594888), (280231, 1578063704), (280231, 1581115715), (280231, 1588933605), (280231, 1620659373), (280231, 1621635609), (280231, 561112136), (280231, 569793875), (280231, 1701958330), (280231, 1716112176), (280231, 1718629600), (280231, 12832494), (280231, 11445384), (280231, 13101419), (280231, 14209417), (280231, 19447751), (280231, 19967925), (280231, 27121746), (280231, 348600562), (280231, 349861950), (280231, 606171478), (280231, 615592694), (280231, 49282306), (280231, 48459971), (280231, 49570849), (280231, 50060693), (280231, 54294670), (280231, 73396555), (280231, 591443490), (280231, 622639558), (280231, 631088748), (280231, 631753816), (280231, 638446503), (280231, 647084730), (280231, 647441215), (280231, 1072450928), (280231, 1080299669), (280231, 1088259805), (280231, 1093289411), (280231, 400797053), (280231, 407606480), (280231, 417324542), (280231, 420912100), (280231, 1049057108), (280231, 1057775763), (280231, 495433553), (280231, 497678002), (280231, 496555495), (280231, 541558273), (280231, 2028905291), (280231, 2032968631), (280231, 837219032), (280231, 842594902), (280231, 852619081), (280231, 1386675206), (280231, 1387030296), (280231, 1395214136), (280231, 1395978315), (280231, 1413343276), (280231, 1415373351), (280231, 2225072885), (280231, 308583604), (280231, 650446390), (280231, 801609983), (280231, 812889623), (280231, 895818306), (280231, 897375449), (280231, 898263363), (280231, 902393965), (280231, 136391466), (280231, 144644538), (280231, 758891910), (280231, 758987458), (280231, 770711413), (280231, 1212711538), (280231, 1215676249), (280231, 2189604584), (280231, 1912203263), (280231, 1914766176), (280231, 707984122), (280231, 712923693), (280231, 1500562379), (280231, 1508198363), (280231, 1507843608), (280231, 1097216072), (280231, 1099777576), (280231, 1106135966), (280231, 1116050195), (280231, 1116882997), (280231, 341892480), (280231, 345016738), (280231, 2120184031), (280231, 691741058), (280231, 731223052), (280231, 741232200), (280231, 508826854), (280231, 521848336), (280231, 245281313), (280231, 302371622), (280231, 317351811), (280231, 327312659), (280231, 980624274), (280231, 1022196008), (280231, 1026226964), (280231, 1031787135), (280231, 996629778), (280231, 1000502763), (280231, 262686527), (280231, 272031523), (280231, 274498243), (280231, 286401785), (280231, 1575675636), (280231, 1607855932), (280231, 163417619), (280231, 165752059), (280231, 175324013), (280231, 179745591), (280231, 181073967), (280231, 536480514), (280231, 921620215), (280231, 1995330311), (280231, 2058751034), (280319, 562029959), (280319, 567143828), (280319, 573275578), (280319, 591403563), (280319, 1036903160), (280319, 1034517720), (280319, 733740633), (280319, 1523819931), (280319, 281959301), (280319, 290356572), (280319, 336382906), (280319, 367243891), (280319, 369071591), (280319, 367052586), (280319, 1080619643), (280319, 810881493), (280319, 212091003), (280319, 271544005), (280319, 1167221976), (280319, 1203245495), (280319, 1206062859), (280319, 1205889842), (280319, 179803922), (280319, 179756949), (280319, 184887165), (280319, 194079815), (280319, 563318190), (280319, 695883268), (280319, 695447406), (280319, 701649500), (280319, 509676059), (280319, 512035916), (280319, 513593907), (280319, 515140366), (280319, 518901728), (280319, 524487015), (280319, 1691227729), (280319, 785236144), (280319, 790450488), (280319, 24388459), (280319, 27495707), (280319, 30626154), (280319, 278408387), (280319, 774601762), (280319, 826676971), (280319, 832932290), (280319, 833909729), (280319, 1120682424), (280319, 528264020), (280319, 318047356), (280319, 319639794), (280319, 326288942), (280319, 1525417169), (280319, 1534808191), (280319, 1537085700), (280319, 1550724777), (280319, 1555280491), (280319, 633887102), (280319, 634398978), (280319, 640806170), (280319, 868271764), (280319, 227574195), (280319, 239073291), (280319, 1805498900), (280319, 1717915951), (280319, 1176247), (280319, 1883466548), (280319, 1888059765), (280319, 1994844252), (280319, 952055843), (280319, 950653148), (280319, 953307970), (280319, 974019669), (280319, 981646637), (280319, 1090291013), (280319, 1091898446), (280319, 1102018261), (280319, 1225829518), (280319, 1228858773), (280319, 1266571891), (280319, 1268793110), (280319, 1275046676), (280319, 1983955191), (280319, 1989324817), (280319, 1927883623), (280319, 1936849157), (280319, 1936707257), (280319, 1946712502), (280319, 1948913625), (280319, 75809074), (280319, 87910127), (280319, 1828850376), (280319, 1839057146), (280319, 1844923384), (280319, 1844702370), (280319, 745442820), (280319, 752623568), (280319, 798105003), (280319, 722094647), (280319, 760235715), (280319, 1648730072), (280319, 2008777571), (280319, 2013904070), (280319, 2016151584), (280319, 736964000), (280319, 1681460726), (280319, 1682247541), (280319, 1691355864), (280319, 1771934315), (280319, 1775183359), (280319, 1774691556), (280319, 1777191468), (280319, 1822163649), (280319, 1823376735), (280319, 1826273957), (280319, 1826940160), (280319, 1851634850), (280319, 1855972106), (280319, 1864367352), (280319, 1864414128), (280319, 1871948254), (280319, 1873304852), (280319, 1874785103), (280319, 1133321903), (280319, 1139047711), (280319, 1153638375), (280319, 1151415477), (280319, 1153720565), (280319, 1008081445), (280319, 913051817), (280319, 914450704), (280319, 921187787), (280319, 931194131), (280319, 2036770261), (280319, 2042319778), (280319, 2046979488), (280319, 2050121279), (280319, 2058398448), (280319, 726127616), (280319, 1894777433), (280319, 887921870), (280319, 889450748), (280319, 935184686), (280319, 935513275), (280319, 942862333), (280319, 1475173173), (280319, 1479514672), (280319, 1478120277), (280319, 1478257757), (280319, 1488525960), (280319, 1569643892), (280319, 963155881), (280319, 1173822256), (280319, 1178287036), (280319, 1951070306), (280319, 1963080845), (280319, 1965865848), (280319, 1965685628), (280319, 1589594523), (280319, 1596104201), (280319, 1596443921), (280319, 1599250983), (280319, 1621956298), (280319, 1628997553), (280319, 667498270), (280319, 688232169), (280319, 420925509), (280319, 425494828), (280319, 430397837), (280319, 1294198318), (280319, 101558805), (280319, 105389815), (280319, 108272689), (280319, 113253324), (280319, 116449667), (280319, 122212963), (280319, 121504127), (280319, 1049077141), (280319, 1051348408), (280319, 1072422024), (280319, 408586138), (280319, 417241152), (280319, 1355988103), (280319, 1398061854), (280319, 1400246374), (280319, 1401513478), (280319, 1408234862), (280319, 1330192822), (280319, 1337393000), (280319, 1348856615), (280319, 1354491936), (280319, 131565819), (280319, 131691545), (280319, 143449561), (280319, 170322087), (280319, 260408945), (280319, 47716555), (280319, 55118355), (280319, 60906203), (280319, 65631594), (280319, 70697683), (280319, 1331803255), (280319, 649497548), (280319, 476259839), (280319, 1378419054), (280319, 1379556550), (280319, 1418979438), (280319, 1425810973), (280319, 840781166), (280319, 844110200), (280319, 862377450), (280319, 1218209634), (280319, 1216278078), (280319, 1253627767), (280319, 295870607), (280319, 298961705), (280319, 1448768963), (280319, 1452532772), (280319, 1460778453), (280319, 1459335527), (280319, 1470974161), (280319, 1473438001), (280319, 356245342), (280319, 401966385), (280319, 443060472), (280319, 445957840), (280319, 453840378), (280319, 461955172), (280319, 468243075), (280319, 1607864717), (280319, 1613732251), (280319, 36789003), (280319, 40320283), (280319, 1790009047), (280319, 1373261437), (280319, 1427358349), (280319, 593790933), (280319, 610486929), (280319, 373797091), (280319, 384690953), (280319, 387231970), (280319, 404758158), (280368, 18630561), (280368, 51648904), (280368, 54941288), (280368, 3646070), (280368, 98914941), (280368, 102460266), (280368, 111188172), (280368, 110195295), (280368, 111231202), (280368, 35044919), (280368, 37803137), (280368, 46074631), (280368, 119864418), (280368, 120542057), (280368, 122424631), (280368, 126731420), (280368, 20144526), (280368, 28604229), (280368, 86306278), (280368, 157377745), (280368, 145775947), (280368, 76870390), (280368, 159538570), (280423, 361879287), (280423, 362830248), (280423, 364833223), (280423, 373737920), (280423, 376217318), (280423, 373150603), (280423, 381102402), (280423, 382471972), (280423, 385475890), (280423, 617874050), (280423, 1148716645), (280423, 1154025636), (280423, 1254129385), (280423, 394025670), (280423, 395246647), (280423, 395278324), (280423, 400221258), (280423, 1427172638), (280423, 1180567303), (280423, 1185909605), (280423, 1187368199), (280423, 165419390), (280423, 181035460), (280423, 188028507), (280423, 190016366), (280423, 1230869026), (280423, 876312069), (280423, 1101820335), (280423, 1104512803), (280423, 1118381906), (280423, 1129146016), (280423, 782844728), (280423, 787249204), (280423, 961887294), (280423, 972534323), (280423, 970727751), (280423, 1002887456), (280423, 1007692904), (280423, 1010794041), (280423, 1382253233), (280423, 1383416018), (280423, 538486944), (280423, 557206463), (280423, 561990306), (280423, 9878484), (280423, 14216983), (280423, 16326388), (280423, 18767832), (280423, 241148225), (280423, 244595846), (280423, 1070353107), (280423, 937828273), (280423, 947795856), (280423, 527038547), (280423, 1031743590), (280423, 1203185849), (280423, 1260779023), (280423, 1271032060), (280423, 1274946917), (280423, 86295392), (280423, 449834672), (280423, 454760804), (280423, 469015037), (280423, 1325322649), (280423, 1357782077), (280423, 1359154942), (280423, 1363741945), (280423, 1364463414), (280423, 28462304), (280423, 349285383), (280423, 349810042), (280423, 353367542), (280423, 1238212366), (280423, 1238753925), (280423, 1239476174), (280423, 880301270), (280423, 926231166), (280423, 1137299942), (280423, 1171790310), (280423, 1395159771), (280423, 1398240379), (280423, 1440351100), (280423, 1442033968), (280423, 1450644524), (280423, 286229470), (280423, 307998315), (280423, 313571606), (280423, 316574001), (280423, 575438226), (280423, 581449935), (280423, 584326224), (280423, 587953050), (280423, 409497173), (280423, 415687661), (280423, 975667197), (280423, 985158814), (280423, 984716930), (280423, 990209212), (280423, 1040033763), (280423, 628695807), (280423, 630821228), (280423, 630413949), (280423, 858619782), (280423, 861359093), (280423, 865932277), (280423, 116060826), (280423, 122388586), (280423, 206059696), (280423, 211654495), (280423, 224046559), (280423, 227375400), (280423, 632865993), (280423, 654235135), (280423, 657561622), (280423, 129766561), (280423, 138283972), (280423, 152330182), (280423, 194073332), (280423, 199973590), (280423, 200852470), (280423, 201522099), (280423, 203303471), (280423, 892527775), (280423, 893096566), (280423, 895141051), (280423, 914557524), (280423, 918190132), (280423, 671877647), (280423, 692407000), (280423, 697758178), (280423, 700384917), (280423, 699184191), (280423, 295070462), (280423, 298640650), (280423, 300261327), (280423, 398038121), (280423, 419468311), (280423, 429311954), (280423, 439364946), (280423, 440470825), (280423, 440692290), (280423, 259349181), (280423, 262207679), (280423, 262061175), (280423, 263154947), (280423, 263838645), (280423, 272479713), (280423, 1353299397), (280423, 1392249888), (280423, 1455292838), (280423, 1454925780), (280423, 1470162509), (280423, 1013683544), (280423, 1016912491), (280423, 1049866282), (280423, 1051711843), (280423, 725890228), (280423, 740450907), (280423, 744155732), (280423, 743752620), (280423, 1290387569), (280423, 65023309), (280423, 64989151), (280423, 66160176), (280423, 67561661), (280423, 68518681), (280423, 72267220), (280423, 490779190), (280423, 495189076), (280423, 1299561766), (280423, 247905881), (280423, 251975039), (280423, 1201706120), (280423, 1206298512), (280423, 1216431096), (280423, 756513490), (280423, 767520638), (280423, 770310698), (280423, 812035014), (280423, 823451393), (280423, 830257107), (280423, 829574918), (280464, 403679437), (280464, 947987832), (280464, 952240148), (280464, 503924435), (280464, 1083589410), (280464, 1163146080), (280464, 1162478083), (280464, 1164288631), (280464, 710930850), (280464, 703262462), (280464, 600587508), (280464, 607176800), (280464, 245203634), (280464, 249008186), (280464, 251459903), (280464, 254136179), (280464, 682723454), (280464, 686307471), (280464, 688567342), (280464, 689606912), (280464, 693794106), (280464, 725116424), (280464, 735303390), (280464, 738387074), (280464, 152556344), (280464, 458632505), (280464, 460104446), (280464, 463842979), (280464, 468517915), (280464, 232273755), (280464, 196920263), (280464, 200933676), (280464, 273749193), (280464, 272973462), (280464, 633972651), (280464, 633220390), (280464, 634574687), (280464, 637155335), (280464, 1031693888), (280464, 1114412068), (280464, 418652990), (280464, 126759885), (280464, 1160231009), (280464, 214628406), (280464, 217360033), (280464, 528663619), (280464, 220336136), (280464, 221661891), (280464, 226532362), (280464, 226632558), (280464, 553839938), (280464, 563302945), (280464, 565035967), (280464, 175172492), (280464, 176815328), (280464, 568239726), (280464, 572283010), (280464, 572552135), (280464, 581587223), (280464, 1065216667), (280464, 1069118617), (280464, 514796437), (280464, 271733586), (280464, 271647938), (280464, 86107134), (280464, 91133906), (280464, 92700049), (280464, 391974029), (280464, 388911563), (280464, 400621603), (280464, 287676836), (280464, 289009994), (280464, 308881491), (280464, 367648003), (280464, 370260559), (280464, 380561608), (280464, 382928385), (280464, 387213831), (280464, 386525088), (280464, 880447668), (280464, 888303196), (280464, 259950335), (280464, 259765338), (280464, 268881406), (280464, 1130301946), (280464, 1138638990), (280464, 1137776122), (280464, 737099342), (280464, 744662924), (280464, 748251064), (280464, 909578492), (280464, 911354300), (280464, 926316827), (280464, 1138881294), (280464, 1147367215), (280464, 1173373755), (280464, 1185306156), (280464, 1103977707), (280464, 1110296971), (280464, 279661057), (280464, 975352871), (280464, 979075921), (280464, 983442153), (280464, 987957933), (280464, 988819437), (280464, 989634663), (280464, 330503907), (280464, 332597272), (280464, 357975715), (280464, 9219814), (280464, 49735110), (280464, 54605145), (280464, 310541782), (280464, 312614388), (280464, 318887683), (280464, 319806632), (280464, 30366027), (280464, 836579683), (280464, 839912275), (280464, 842333950), (280464, 847153251), (280464, 852064668), (280464, 779913363), (280464, 793047081), (280464, 791995874), (280464, 65413515), (280464, 126125351), (280464, 110061655), (280464, 113411803), (280464, 20288421), (280464, 26048665), (280464, 68823987), (280464, 81902464), (280464, 343969365), (280464, 342160879), (280464, 815285637), (280464, 178978607), (280464, 187603384), (280464, 490965341), (280464, 492847873), (280464, 491456439), (280464, 493532551), (280464, 497126245), (280500, 134703333), (280500, 154142130), (280500, 157250753), (280500, 161506305), (280500, 110635174), (280500, 129681932), (280500, 127520832), (280500, 40285631), (280500, 66590758), (280500, 80784169), (280500, 23335506), (280500, 24345010), (280500, 26259749), (280500, 31766868), (280500, 88711753), (280500, 175173724), (280500, 142811965), (280500, 149327890), (280500, 150787598), (280520, 487785931), (280520, 492044036), (280520, 497803222), (280520, 517744529), (280520, 372978976), (280520, 418145603), (280520, 472984019), (280520, 436928009), (280520, 446183506), (280520, 125120877), (280520, 193329262), (280520, 352549231), (280520, 164065382), (280520, 197168109), (280520, 201281443), (280520, 147743883), (280520, 245928907), (280520, 249866083), (280520, 256947489), (280520, 257632916), (280520, 255478538), (280520, 263837247), (280520, 265476786), (280520, 350819590), (280520, 432126142), (280520, 213138882), (280520, 217266710), (280520, 224127542), (280520, 228135497), (280614, 161177673), (280614, 169745152), (280614, 170767640), (280614, 215146625), (280614, 219127570), (280614, 301178226), (280614, 303707437), (280614, 332449119), (280614, 335003120), (280614, 345722410), (280614, 353058908), (280614, 411236139), (280614, 414979598), (280614, 419235273), (280614, 426610368), (280614, 175746364), (280614, 2832819), (280614, 445394990), (280614, 23884140), (280614, 26304101), (280614, 36897069), (280614, 52567457), (280614, 263895374), (280614, 197529463), (280614, 195487015), (280614, 200548148), (280614, 381849649), (280614, 484299614), (280614, 251899309), (280614, 258595205), (280614, 262503389), (280614, 266054651), (280614, 508036054), (280614, 135108736), (280614, 469203363), (280614, 197406782), (280614, 280156426), (280614, 66251511), (280614, 68094944), (280614, 68851524), (280614, 402762268), (280614, 234643177), (280614, 241494472), (280614, 182710441), (280614, 124825582), (280614, 131963406), (280614, 129554236), (280614, 398377511), (280614, 15314641), (280614, 75177979), (280614, 81554504), (280614, 84242925), (280614, 249695289), (280614, 48491778), (280614, 425895393), (280614, 429688367), (280614, 430584664), (280614, 430786875), (280614, 470180942), (280614, 101543692), (280614, 118170578), (280614, 343741138), (280614, 377386110), (280614, 310506941), (280673, 1561502610), (280673, 52197766), (280673, 51903608), (280673, 277801020), (280673, 280047936), (280673, 286316962), (280673, 287350710), (280673, 287567264), (280673, 2717432142), (280673, 627110595), (280673, 635454801), (280673, 667428224), (280673, 668936168), (280673, 676414835), (280673, 1179958099), (280673, 1179577719), (280673, 753417563), (280673, 925801475), (280673, 929027626), (280673, 928808433), (280673, 932066869), (280673, 936543525), (280673, 2177212635), (280673, 2181799462), (280673, 2182347482), (280673, 2183016874), (280673, 2187212326), (280673, 2482538521), (280673, 2765600574), (280673, 2770492663), (280673, 2778816414), (280673, 1340984944), (280673, 1341338341), (280673, 1343587778), (280673, 1356827410), (280673, 2118192753), (280673, 2119242422), (280673, 2124148901), (280673, 2193498932), (280673, 210239745), (280673, 217201639), (280673, 1785965118), (280673, 2532511534), (280673, 2540140200), (280673, 2634973887), (280673, 2638154345), (280673, 2640706025), (280673, 2644529335), (280673, 2353158959), (280673, 2356623320), (280673, 2355325771), (280673, 2362575975), (280673, 2362574478), (280673, 2200915370), (280673, 2167541330), (280673, 2170303336), (280673, 151665751), (280673, 150994206), (280673, 159901037), (280673, 960791346), (280673, 966344732), (280673, 1001228209), (280673, 353035512), (280673, 388200329), (280673, 3028503266), (280673, 3033721245), (280673, 3041435788), (280673, 3045258635), (280673, 1541222359), (280673, 1903177089), (280673, 1903343123), (280673, 1913750957), (280673, 1927101566), (280673, 1926692554), (280673, 1926495149), (280673, 2489966503), (280673, 2494706635), (280673, 2497573278), (280673, 3077092792), (280673, 3084576045), (280673, 3097295300), (280673, 3108240355), (280673, 2448458780), (280673, 415504114), (280673, 433390588), (280673, 2330851434), (280673, 2335889912), (280673, 2348111074), (280673, 2350683365), (280673, 1366214126), (280673, 1368434425), (280673, 1368106313), (280673, 1370854154), (280673, 1371304327), (280673, 1388443622), (280673, 1598767572), (280673, 1598692856), (280673, 1605479287), (280673, 1607307218), (280673, 1608987310), (280673, 1612751849), (280673, 1615433136), (280673, 1628068009), (280673, 1627193982), (280673, 1632071699), (280673, 1639670651), (280673, 1664330995), (280673, 1674930087), (280673, 2993363444), (280673, 2997148328), (280673, 1952785961), (280673, 1960201606), (280673, 2026525657), (280673, 2028900521), (280673, 2034778729), (280673, 2892196239), (280673, 2893130910), (280673, 2499185660), (280673, 2505613462), (280673, 600059506), (280673, 599870982), (280673, 603985827), (280673, 764333824), (280673, 256951192), (280673, 262963837), (280673, 1823410733), (280673, 2197123741), (280673, 2305157070), (280673, 143442741), (280673, 145327957), (280673, 146058228), (280673, 974479952), (280673, 1115470566), (280673, 1122200277), (280673, 1125565319), (280673, 1446940697), (280673, 1456938274), (280673, 1432608078), (280673, 1439332158), (280673, 1442001118), (280673, 1506108555), (280673, 1507118668), (280673, 940729316), (280673, 948917043), (280673, 952956637), (280673, 1308336479), (280673, 1309842978), (280673, 1312823890), (280673, 1041312063), (280673, 105431623), (280673, 113254383), (280673, 113609086), (280673, 269472024), (280673, 301050464), (280673, 2084153001), (280673, 2096012343), (280673, 2094350623), (280673, 2099192829), (280673, 695743717), (280673, 740399793), (280673, 740833989), (280673, 2699043355), (280673, 2700838882), (280673, 2704280557), (280673, 2702117297), (280673, 2755267267), (280673, 2755748945), (280673, 1838517358), (280673, 1847546351), (280673, 1849982083), (280673, 183913264), (280673, 190962116), (280673, 254167831), (280673, 362515909), (280673, 368705629), (280673, 378884323), (280673, 438647052), (280673, 33080895), (280673, 37404310), (280673, 73257613), (280673, 74321810), (280673, 2058495473), (280673, 2610520806), (280673, 2615440234), (280673, 3061036739), (280673, 3063705592), (280673, 3063983815), (280673, 3069199853), (280673, 987541087), (280673, 993205767), (280673, 1248630674), (280673, 1256550197), (280673, 1282700034), (280673, 1282805298), (280673, 1285256834), (280673, 2967185399), (280673, 2968235722), (280673, 2984633757), (280673, 1693042776), (280673, 1693515134), (280673, 2559633088), (280673, 2564757270), (280673, 2570199648), (280673, 1754905208), (280673, 1765885177), (280673, 776706806), (280673, 779280908), (280673, 786048765), (280673, 826548990), (280673, 1989749719), (280673, 1993721146), (280673, 2003265224), (280673, 880005111), (280673, 881453173), (280673, 880853423), (280673, 879119855), (280673, 885268972), (280673, 893896382), (280673, 921251337), (280673, 920049075), (280673, 619607431), (280673, 620337836), (280673, 800148757), (280673, 805493593), (280673, 2216766663), (280673, 2215203701), (280673, 2224732686), (280673, 1548675198), (280673, 1409701972), (280673, 2132591573), (280673, 2135459734), (280673, 2140137426), (280673, 2141521944), (280673, 2139289914), (280673, 517281588), (280673, 518474148), (280673, 521836884), (280673, 524072652), (280673, 529364317), (280673, 527380335), (280673, 541839586), (280673, 545146215), (280673, 1737032501), (280673, 1803102265), (280673, 1805904365), (280673, 862793888), (280673, 1141134627), (280673, 1154242847), (280673, 1152145113), (280673, 1156283181), (280673, 1234105644), (280673, 1238746015), (280673, 1241679168), (280673, 1244259699), (280673, 1288357225), (280673, 1292190420), (280673, 1301023266), (280673, 3161467555), (280673, 3168914014), (280673, 3169608364), (280673, 3170980301), (280673, 2927975162), (280673, 2940655712), (280673, 2938539332), (280673, 2942247737), (280673, 2946249490), (280673, 2943982655), (280673, 2949947284), (280673, 2383804628), (280673, 2394990476), (280673, 2393558202), (280673, 1793918043), (280673, 1797617325), (280673, 1801893686), (280673, 1802994817), (280673, 1868958632), (280673, 1881612349), (280673, 1015828677), (280673, 1040684819), (280673, 1044120721), (280673, 1055563895), (280673, 1861044367), (280673, 1861840516), (280673, 1563278273), (280673, 1573321097), (280673, 636521337), (280673, 658334485), (280673, 657853395), (280673, 658923859), (280673, 661353763), (280673, 719032876), (280673, 730277027), (280673, 130772988), (280673, 128639410), (280673, 192722347), (280673, 2520714318), (280673, 2524900212), (280673, 540252534), (280673, 1129293375), (280673, 1127880961), (280673, 1127567985), (280673, 1129709373), (280673, 1130442500), (280673, 1204578001), (280673, 1210239213), (280673, 1209987687), (280673, 515678340), (280673, 638356141), (280673, 714091151), (280673, 573577074), (280673, 441791715), (280673, 450639263), (280673, 550449120), (280673, 1400216651), (280673, 1461712657), (280673, 1103085132), (280673, 2829060797), (280673, 2834122239), (280673, 507612086), (280673, 529883757), (280673, 301723541), (280673, 308973827), (280673, 337108746), (280673, 1963106847), (280673, 1970219336), (280673, 1973879931), (280673, 2041576452), (280673, 1189283571), (280673, 1193924154), (280673, 2900701815), (280673, 2911558212), (280673, 2910735588), (280673, 2915446398), (280673, 292745140), (280673, 294918744), (280673, 868664676), (280673, 1943757842), (280673, 2009219993), (280673, 2009186699), (280673, 2016738385), (280673, 2752894471), (280673, 2675317465), (280673, 2672561025), (280673, 905540049), (280673, 1059283304), (280673, 1062503441), (280673, 1065882767), (280673, 2596434341), (280673, 2080012190), (280673, 2148602850), (280673, 2152193836), (280673, 2156881522), (280673, 2849611504), (280673, 2848484692), (280673, 2854571066), (280673, 2857016500), (280673, 2857678756), (280673, 2856700246), (280673, 2861374546), (280673, 484140310), (280673, 2245104868), (280673, 2245529823), (280673, 2274565601), (280673, 2279370083), (280673, 2288397076), (280673, 61651056), (280673, 61793945), (280673, 3053976855), (280673, 588981061), (280673, 592194568), (280673, 679256630), (280673, 680769321), (280673, 679405752), (280673, 685018370), (280673, 690886151), (280673, 460404830), (280673, 2455078568), (280673, 2466014369), (280673, 2467491159), (280673, 243904759), (280673, 266544725), (280673, 270497155), (280673, 159954028), (280673, 1099507887), (280673, 3126832728), (280673, 3127107304), (280673, 3132352042), (280673, 3140983301), (280673, 848535089), (280673, 856939280), (280673, 854182688), (280673, 860166988), (280673, 859509052), (280673, 1416123410), (280673, 1420559613), (280673, 1426036490), (280673, 1683872098), (280673, 1589446887), (280673, 1741238339), (280673, 1746826593), (280673, 1776252952), (280673, 1853050261), (280673, 2806294018), (280673, 85913912), (280673, 117009110), (280753, 365456849), (280753, 376437185), (280753, 422998503), (280753, 441378620), (280753, 27753821), (280753, 30829464), (280753, 39366995), (280753, 43218719), (280753, 44351741), (280753, 74941574), (280753, 79893511), (280753, 89066701), (280753, 95489617), (280753, 96879307), (280753, 766664461), (280753, 768428703), (280753, 778821400), (280753, 813375609), (280753, 811693821), (280753, 134561155), (280753, 177384900), (280753, 864135449), (280753, 864682742), (280753, 240478542), (280753, 346171992), (280753, 351796583), (280753, 354102534), (280753, 358289357), (280753, 363569966), (280753, 333717286), (280753, 333390112), (280753, 61541558), (280753, 66437573), (280753, 69680529), (280753, 635429149), (280753, 732689189), (280753, 649050361), (280753, 210010568), (280753, 217994521), (280753, 221475865), (280753, 567552131), (280753, 568115382), (280753, 572486468), (280753, 574235324), (280753, 592483954), (280753, 797604745), (280753, 807802541), (280753, 828723584), (280753, 833447390), (280753, 266513600), (280753, 268646852), (280753, 297250576), (280753, 679828943), (280753, 698044006), (280753, 13265533), (280753, 17051870), (280753, 19064691), (280753, 54122633), (280753, 55443906), (280753, 59454949), (280753, 848380537), (280753, 847713278), (280753, 850429585), (280753, 867607441), (280753, 398836135), (280753, 403106756), (280753, 406391793), (280753, 412998749), (280753, 527747276), (280753, 528489947), (280753, 530333422), (280753, 272398089), (280753, 272996746), (280753, 274428674), (280753, 314356589), (280753, 317616096), (280753, 321620391), (280753, 321338962), (280753, 325417838), (280753, 326718901), (280753, 330419057), (280753, 735448189), (280753, 745653570), (280753, 746224121), (280753, 744096305), (280753, 745172692), (280753, 754549904), (280753, 758217185), (280753, 104405491), (280753, 102213244), (280753, 112652971), (280753, 709038478), (280753, 383705797), (280753, 388628709), (280753, 395875171), (280753, 139888392), (280753, 168114146), (280753, 491280594), (280753, 496091622), (280753, 503858086), (280753, 508881079), (280753, 508900345), (280753, 510314834), (280753, 446256192), (280753, 466184764), (280753, 471900183), (280753, 537464779), (280753, 537857180), (280753, 538573954), (280753, 548561281), (280753, 721826545), (280753, 721146202), (280753, 723937158), (280753, 129616839), (280753, 144474583), (280753, 151148259), (280753, 778906192), (280753, 779344349), (280753, 784367794), (280753, 793117292), (280753, 299895622), (280753, 300936115), (280753, 301573976), (280753, 304803216), (280753, 314520592), (280753, 622741527), (280753, 626422097), (280753, 474243198), (280753, 475736691), (280753, 485297093), (280753, 486264713), (280753, 486742407), (280753, 486776862), (280753, 173211963), (280753, 171428593), (280753, 180617209), (280753, 181021134), (280753, 179266464), (280753, 186307027), (280753, 191317520), (280753, 197266902), (280853, 12280853), (280853, 33570179), (280853, 34929280), (280853, 40356388), (280853, 116187520), (280853, 119434178), (280853, 20546136), (280853, 84246492), (280853, 85596120), (280853, 88044578), (280853, 90630872), (280853, 130933362), (280853, 29144998), (280853, 64187219), (280853, 137691992), (280853, 144074454), (280853, 149266631), (280853, 146187670), (280853, 88975116), (280853, 99122399), (280853, 106334941), (280853, 107318663), (280853, 104888757), (280853, 46534033), (280853, 58769889), (280853, 68391127), (280862, 1936729688), (280862, 1939640883), (280862, 1990292225), (280862, 867603545), (280862, 896122487), (280862, 896383546), (280862, 896945507), (280862, 2402827453), (280862, 2423759093), (280862, 821967323), (280862, 857152963), (280862, 713621141), (280862, 746087171), (280862, 203985064), (280862, 229448002), (280862, 612509241), (280862, 657018655), (280862, 663803029), (280862, 2553060717), (280862, 2554443443), (280862, 2814934281), (280862, 2821494034), (280862, 2710543225), (280862, 2724475109), (280862, 15860086), (280862, 22107217), (280862, 43776347), (280862, 42416817), (280862, 1640972519), (280862, 1642090940), (280862, 1651901077), (280862, 1649496131), (280862, 1652832256), (280862, 1327171764), (280862, 1329650273), (280862, 1342897375), (280862, 56730589), (280862, 62673646), (280862, 93077037), (280862, 99420604), (280862, 133954936), (280862, 140387903), (280862, 141121340), (280862, 1291240322), (280862, 1314102134), (280862, 290732474), (280862, 299935456), (280862, 311404245), (280862, 1690685297), (280862, 1700860944), (280862, 1715156393), (280862, 1244772049), (280862, 1255681830), (280862, 1256103772), (280862, 1256009495), (280862, 1258305841), (280862, 1265008715), (280862, 2738723628), (280862, 2428284929), (280862, 1210198658), (280862, 1211845504), (280862, 1215231325), (280862, 1226234981), (280862, 951121817), (280862, 956744691), (280862, 715462687), (280862, 724143788), (280862, 727069118), (280862, 807006290), (280862, 809621319), (280862, 812612068), (280862, 818301705), (280862, 1334790134), (280862, 1389016245), (280862, 1395169725), (280862, 1008250128), (280862, 1035630940), (280862, 545557701), (280862, 546949626), (280862, 567468081), (280862, 570314712), (280862, 629847337), (280862, 633573311), (280862, 2743119066), (280862, 2764711185), (280862, 2765637164), (280862, 2768183806), (280862, 2794984941), (280862, 2800983297), (280862, 2037607826), (280862, 2040024507), (280862, 2045468401), (280862, 2107725751), (280862, 2112942609), (280862, 2122516125), (280862, 2120629988), (280862, 2537670027), (280862, 2542190370), (280862, 2158080235), (280862, 2159024598), (280862, 2157786872), (280862, 2164196799), (280862, 2169573471), (280862, 2171297732), (280862, 2175720789), (280862, 2179742953), (280862, 976613967), (280862, 979898299), (280862, 986506321), (280862, 991177184), (280862, 2276671032), (280862, 2281197545), (280862, 2289575465), (280862, 2232202599), (280862, 2238228435), (280862, 2241430816), (280862, 2239384335), (280862, 2240949225), (280862, 1666130369), (280862, 1667750866), (280862, 1669406620), (280862, 1682719992), (280862, 1685189623), (280862, 1689879531), (280862, 2068254682), (280862, 2079299679), (280862, 2078538876), (280862, 1195152778), (280862, 272130933), (280862, 1161378968), (280862, 1162412120), (280862, 1177120505), (280862, 1176007128), (280862, 1178698178), (280862, 1187914969), (280862, 1186425075), (280862, 1189445789), (280862, 1190057139), (280862, 1108281142), (280862, 1113116381), (280862, 1117312152), (280862, 1144753088), (280862, 1913058206), (280862, 1920023133), (280862, 1922260023), (280862, 1942673546), (280862, 1946330493), (280862, 1948746787), (280862, 2091669582), (280862, 2093959715), (280862, 2144270206), (280862, 2146144224), (280862, 1099773133), (280862, 1104547958), (280862, 1998019138), (280862, 2005713864), (280862, 1569260676), (280862, 2694393663), (280862, 119799453), (280862, 128240362), (280862, 130519007), (280862, 130479131), (280862, 753245725), (280862, 756185863), (280862, 328205191), (280862, 331874629), (280862, 336203476), (280862, 338073877), (280862, 574551286), (280862, 518000123), (280862, 518670612), (280862, 529592999), (280862, 529969791), (280862, 2594025546), (280862, 2592807741), (280862, 1534382210), (280862, 1543216121), (280862, 1545545228), (280862, 2488691940), (280862, 1235245545), (280862, 1236983053), (280862, 1277626098), (280862, 1280829228), (280862, 1428881574), (280862, 1432775428), (280862, 1435958310), (280862, 1467938622), (280862, 1470418864), (280862, 1506396265), (280862, 1512029239), (280862, 1512574377), (280862, 482711349), (280862, 484242904), (280862, 486725465), (280862, 490217718), (280862, 496650932), (280862, 499969488), (280862, 502779400), (280862, 505942519), (280862, 349367078), (280862, 359120213), (280862, 359514221), (280862, 366644149), (280862, 371475378), (280862, 371854967), (280862, 1719322879), (280862, 1732456364), (280862, 1731646721), (280862, 1747017202), (280862, 1746814883), (280862, 1359484923), (280862, 1367486108), (280862, 1489789760), (280862, 1498098377), (280862, 911372192), (280862, 191495989), (280862, 400422481), (280862, 399408254), (280862, 405703078), (280862, 412703611), (280862, 414838548), (280862, 418647465), (280862, 419893532), (280862, 1881257041), (280862, 1890503462), (280862, 1896192790), (280862, 1902521620), (280862, 1905613362), (280862, 467673712), (280862, 475297805), (280862, 480572831), (280862, 1204314195), (280862, 1206865151), (280862, 1210795875), (280862, 2554738642), (280862, 2555403349), (280862, 1128855636), (280862, 1128654572), (280862, 1139937029), (280862, 429036746), (280862, 429576381), (280862, 443264366), (280862, 2358092347), (280862, 2357012942), (280862, 2373704825), (280862, 2201343365), (280862, 2209057199), (280862, 2215225892), (280862, 372987968), (280862, 385473040), (280862, 1603566196), (280862, 1613280670), (280862, 1614281766), (280862, 1623364984), (280862, 172377859), (280862, 185306777), (280862, 267942018), (280862, 2839580707), (280862, 2844485290), (280862, 2845391423), (280862, 36459351), (280862, 40180071), (280862, 214815856), (280862, 218381590), (280862, 779627720), (280862, 788837479), (280862, 796723737), (280862, 802425527), (280862, 2304775305), (280862, 2314457834), (280862, 2339563661), (280862, 2338300334), (280862, 2642124476), (280862, 2652318187), (280862, 2679892082), (280862, 2043607768), (280862, 2056918125), (280862, 838759902), (280862, 838396870), (280862, 837898324), (280862, 922951041), (280862, 927190041), (280862, 2259173821), (280862, 2264841189), (280862, 2460190921), (280862, 2463622000), (280862, 1381019832), (280862, 1765201656), (280862, 1768499397), (280862, 2327547421), (280862, 2391395233), (280862, 670901657), (280862, 672365919), (280862, 684807023), (280862, 730553949), (280862, 743375024), (280862, 1906755767), (280862, 650741360), (280862, 692690208), (280862, 698045808), (280862, 1852091942), (280862, 1859495024), (280862, 1861341486), (280862, 1867554834), (280862, 4557498), (280862, 1956304251), (280862, 1967369720), (280862, 1975214121), (280862, 1976918308), (280862, 1784778936), (280862, 1812882271), (280862, 2506404062), (280862, 2521556515), (280862, 2524252375), (280862, 2529070602), (280862, 2527789606), (280862, 2529176065), (280862, 2532785557), (280862, 2444434784), (280862, 2471758467), (280862, 1827824719), (280862, 1000389632), (280862, 1000345540), (280862, 999253428), (280862, 1002714896), (280950, 9187792), (280950, 10573357), (280950, 15426066), (280950, 46269099), (280950, 2091805267), (280950, 2099319268), (280950, 31622797), (280950, 35168551), (280950, 43030101), (280950, 1940683396), (280950, 1941715174), (280950, 1947825900), (280950, 1952905345), (280950, 1956837999), (280950, 1959532130), (280950, 1961848279), (280950, 1962030557), (280950, 785219841), (280950, 1401071968), (280950, 1403064168), (280950, 2196490951), (280950, 2206078699), (280950, 2262474812), (280950, 2120041978), (280950, 2169421001), (280950, 2170277470), (280950, 2178144511), (280950, 2176782694), (280950, 918318666), (280950, 927134967), (280950, 933235833), (280950, 2013504605), (280950, 2018155443), (280950, 2021915036), (280950, 1448702144), (280950, 1453108272), (280950, 1455215108), (280950, 1462402856), (280950, 547970785), (280950, 1442542891), (280950, 2530424009), (280950, 1800383430), (280950, 2515838222), (280950, 2630916879), (280950, 514241981), (280950, 2676172703), (280950, 1896655511), (280950, 1980256960), (280950, 1042194167), (280950, 460922609), (280950, 460060389), (280950, 2759986721), (280950, 1206536739), (280950, 1224356812), (280950, 1226964877), (280950, 1229969147), (280950, 1194698193), (280950, 1196987667), (280950, 1197424102), (280950, 1196471523), (280950, 1201551663), (280950, 2040164846), (280950, 2073381890), (280950, 217010196), (280950, 216241130), (280950, 218544658), (280950, 224155340), (280950, 222576270), (280950, 1615760514), (280950, 1622709325), (280950, 1632852912), (280950, 1641044367), (280950, 2432357397), (280950, 2432380255), (280950, 2433659234), (280950, 2433504468), (280950, 2435858510), (280950, 2472439228), (280950, 202310071), (280950, 211275664), (280950, 686771187), (280950, 690085116), (280950, 699797332), (280950, 618585677), (280950, 2644770071), (280950, 2654921358), (280950, 2672582001), (280950, 896106167), (280950, 898463347), (280950, 900390575), (280950, 903717758), (280950, 903685949), (280950, 902188528), (280950, 597354230), (280950, 616443696), (280950, 620428396), (280950, 686770893), (280950, 769238391), (280950, 782960901), (280950, 780584805), (280950, 2698933738), (280950, 2725480045), (280950, 2727186545), (280950, 2727922757), (280950, 2730100018), (280950, 1203696268), (280950, 2668705330), (280950, 568573960), (280950, 592317107), (280950, 640631308), (280950, 871595251), (280950, 1853411342), (280950, 1854943843), (280950, 2459054882), (280950, 172546934), (280950, 178447971), (280950, 180731110), (280950, 1381143962), (280950, 1382719827), (280950, 1382286130), (280950, 1396600388), (280950, 1421139067), (280950, 1643886106), (280950, 1649847875), (280950, 1678561481), (280950, 1681380804), (280950, 1685958364), (280950, 2506702592), (280950, 2531013364), (280950, 2538022589), (280950, 2232143594), (280950, 2235724297), (280950, 2397100911), (280950, 2400091803), (280950, 55938289), (280950, 164293201), (280950, 164758887), (280950, 740419859), (280950, 748953982), (280950, 798503363), (280950, 1550678128), (280950, 1551141875), (280950, 1565132053), (280950, 1577685175), (280950, 415960293), (280950, 429105295), (280950, 432442865), (280950, 1255920926), (280950, 1279027199), (280950, 1314769620), (280950, 1318313104), (280950, 2182468282), (280950, 2185594221), (280950, 2193074722), (280950, 2212404870), (280950, 2215674158), (280950, 2223413389), (280950, 2225108144), (280950, 1245124618), (280950, 1243668726), (280950, 1252038712), (280950, 100994888), (280950, 2565448924), (280950, 2366568844), (280950, 2370482874), (280950, 2381837292), (280950, 2390299835), (280950, 779094582), (280950, 2608806073), (280950, 2611412637), (280950, 2465702865), (280950, 2490088451), (280950, 2578986171), (280950, 2581625840), (280950, 2586125413), (280950, 2588526174), (280950, 2588738299), (280950, 2305064763), (280950, 2302717073), (280950, 2309448731), (280950, 2309348064), (280950, 821399184), (280950, 2281920330), (280950, 2298973606), (280950, 1885824052), (280950, 390884024), (280950, 391290294), (280950, 394699644), (280950, 486908069), (280950, 486132085), (280950, 490595926), (280950, 305591552), (280950, 359989187), (280950, 402676873), (280950, 409635007), (280950, 150050882), (280950, 188005538), (280950, 188546090), (280950, 191857467), (280950, 198806467), (280950, 666853790), (280950, 678649811), (280950, 1331151907), (280950, 1334888408), (280950, 1340224942), (280950, 1340246351), (280950, 1341251784), (280950, 1345336268), (280950, 1344999325), (280950, 1368686209), (280950, 1369587334), (280950, 1379598532), (280950, 1381155620), (280950, 1747349975), (280950, 2151714800), (280950, 2153242888), (280950, 2165461918), (280950, 1089394105), (280950, 1092184227), (280950, 1098848585), (280950, 291471134), (280950, 291165699), (280950, 292388086), (280950, 339673226), (280950, 338862055), (280950, 342882783), (280950, 343500323), (280950, 348591802), (280950, 348996382), (280950, 2084970545), (280950, 1488177585), (280950, 1509611449), (280950, 1515974652), (280950, 1523070263), (280950, 1530576371), (280950, 1530681802), (280950, 1533824804), (280950, 1533777383), (280950, 1542907252), (280950, 1546548452), (280950, 942098275), (280950, 952307608), (280950, 955382378), (280950, 958077598), (280950, 958478251), (280950, 1348297776), (280950, 1351511901), (280950, 1819528064), (280950, 1823941983), (280950, 1826396540), (280950, 1829445299), (280950, 1835138534), (280950, 1839793045), (280950, 2409375600), (280950, 121388814), (280950, 129781940), (280950, 141286649), (280950, 2334399095), (280950, 2339120571), (280950, 2338464004), (280950, 2345395320), (280950, 2357744286), (280950, 1252934566), (280950, 1254642535), (280950, 1301373943), (280950, 514391868), (280950, 2558688824), (280950, 2570736613), (280950, 2572515614), (280950, 2591739883), (280950, 2590356712), (280950, 1106733176), (280950, 1115347484), (280950, 1121101659), (280950, 1136380420), (280950, 278954200), (280950, 1170998405), (280950, 1178038074), (280950, 1182566484), (280950, 2048105149), (280950, 2057177350), (280950, 2069061825), (280950, 1741224312), (280950, 1758566231), (280950, 2250737075), (280950, 2254483171), (280950, 2255300639), (280950, 841986149), (280950, 1304276175), (280950, 1858428247), (280950, 2553499282), (280950, 1138365575), (280950, 1143441355), (280950, 1148253879), (280950, 624173882), (280950, 626677314), (280950, 625909626), (280950, 630053485), (280950, 633265575), (280950, 631597106), (280950, 633550198), (280950, 714767325), (280950, 1441891656), (280950, 2708801908), (280950, 1212121970), (280950, 1215532849), (280950, 253357251), (280950, 1659042563), (280950, 1662876409), (280950, 1596439210), (280950, 1599492079), (280950, 1600645713), (280950, 1608476523), (280950, 1912550607), (280950, 1913498795), (280950, 1923586719), (280950, 1926123390), (280950, 1004275197), (280950, 1003968518), (280950, 1703331530), (280950, 1714222073), (280950, 1718175549), (280950, 1723617236), (280950, 1730950376), (280950, 1732502258), (280950, 57659816), (280950, 57339283), (280950, 68258663), (280950, 74728508), (280950, 79158940), (280950, 969962423), (280950, 975470051), (280950, 987998671), (280950, 988405369), (280950, 441058642), (280950, 441841561), (280950, 447892321), (280950, 450418617), (280950, 458532184), (280950, 471529575), (280950, 477724912), (280950, 1584828435), (280950, 1585333327), (280950, 1687866358), (280950, 1692308383), (280950, 1759796335), (280950, 1780363835), (280950, 1782406431), (280950, 1847266266), (280977, 365476451), (280977, 364189059), (280977, 378598000), (280977, 379847289), (280977, 384502784), (280977, 168219347), (280977, 170150834), (280977, 175265938), (280977, 260779171), (280977, 263358794), (280977, 262998198), (280977, 270748746), (280977, 308420144), (280977, 314744346), (280977, 313117914), (280977, 318579550), (280977, 323924193), (280977, 328004323), (280977, 651919378), (280977, 657069957), (280977, 687757675), (280977, 689418308), (280977, 690568203), (280977, 6454166), (280977, 291533608), (280977, 297919938), (280977, 522768282), (280977, 526225015), (280977, 525533660), (280977, 527183092), (280977, 538785640), (280977, 539021081), (280977, 575593408), (280977, 608429027), (280977, 617104047), (280977, 621060722), (280977, 224326637), (280977, 233906123), (280977, 560430540), (280977, 564988210), (280977, 395393455), (280977, 401165409), (280977, 405380990), (280977, 405911735), (280977, 406614162), (280977, 678795478), (280977, 634166393), (280977, 639503585), (280977, 208210784), (280977, 210689436), (280977, 216258743), (280977, 332039712), (280977, 336935310), (280977, 352487256), (280977, 153230677), (280977, 166250829), (280977, 66074774), (280977, 67127586), (280977, 76055636), (280977, 83852289), (280977, 412254450), (280977, 410086940), (280977, 414781074), (280977, 413178405), (280977, 448899856), (280977, 33743971), (280977, 454519437), (280977, 454676225), (280977, 457989478), (280977, 458331691), (280977, 460722996), (280977, 463704913), (280977, 483725490), (280977, 486034888), (280977, 491265322), (280977, 492901163), (280977, 493856576), (280977, 492987217), (280977, 112230533), (280977, 117017185), (280977, 121554458), (280977, 125364129), (280977, 128580510), (280977, 127087245), (280977, 133646013), (280977, 92772944), (280977, 141971410), (280977, 179538658), (280977, 190066310), (280977, 472641774), (280977, 387762143), (280977, 392312600), (280977, 392269655), (280977, 391564990), (281070, 192337253), (281070, 192416400), (281070, 242797712), (281070, 245696669), (281070, 231555092), (281070, 162773670), (281070, 38006893), (281070, 111059704), (281070, 117559049), (281070, 205031551), (281070, 208844055), (281070, 211244538), (281070, 211220593), (281070, 218253382), (281070, 47932856), (281070, 51835840), (281070, 222924259), (281070, 221759413), (281070, 221189065), (281070, 228367360), (281070, 131313504), (281070, 135752567), (281070, 135030279), (281070, 72656009), (281070, 78383468), (281070, 96376699), (281070, 97931771), (281070, 86943653), (281070, 137681597), (281070, 140381102), (281070, 142449920), (281070, 144465752), (281070, 171575804), (281070, 7736444), (281070, 14510533), (281070, 18259543), (281070, 15430442), (281070, 19309202), (281070, 19513374), (281070, 23385511), (281070, 23541950), (281070, 25470016), (281070, 65188443), (281070, 65714474), (281070, 67028285), (281074, 888484336), (281074, 273537729), (281074, 276212772), (281074, 280942138), (281074, 619507362), (281074, 630092935), (281074, 640436165), (281074, 645548959), (281074, 34808881), (281074, 325482124), (281074, 330318367), (281074, 366247814), (281074, 369538972), (281074, 381602704), (281074, 397184907), (281074, 406959623), (281074, 285329216), (281074, 360913395), (281074, 453544923), (281074, 459621542), (281074, 460050685), (281074, 465477012), (281074, 335421019), (281074, 339822511), (281074, 344811336), (281074, 414147451), (281074, 439321357), (281074, 840278119), (281074, 708549150), (281074, 718698674), (281074, 524711937), (281074, 535678391), (281074, 537148497), (281074, 550235441), (281074, 760541692), (281074, 760209243), (281074, 767516472), (281074, 769024585), (281074, 770721279), (281074, 779275957), (281074, 244683125), (281074, 244814916), (281074, 250761141), (281074, 141696082), (281074, 149311146), (281074, 154146117), (281074, 160561783), (281074, 552578557), (281074, 559889754), (281074, 570633644), (281074, 572602585), (281074, 577173612), (281074, 584363979), (281074, 597333283), (281074, 893176571), (281074, 892244664), (281074, 895550244), (281074, 113603384), (281074, 193168847), (281074, 197278677), (281074, 200411496), (281074, 200984217), (281074, 205670863), (281074, 206410720), (281074, 472895841), (281074, 579330928), (281074, 647383111), (281074, 650371446), (281074, 658452666), (281074, 664281861), (281074, 669697895), (281074, 669033136), (281074, 669198066), (281074, 129967617), (281074, 133959788), (281074, 136321117), (281074, 137479241), (281074, 218345823), (281074, 228988690), (281074, 238126522), (281074, 238540891), (281074, 789247969), (281074, 792747399), (281074, 794519565), (281074, 794631689), (281074, 797536535), (281074, 800188797), (281074, 303344684), (281074, 722474558), (281074, 722497656), (281074, 725579326), (281074, 729485499), (281074, 739848233), (281074, 744960772), (281074, 495225638), (281074, 482688754), (281074, 483413322), (281074, 480396575), (281074, 489869351), (281074, 821563734), (281074, 823917117), (281074, 824327382), (281074, 851911621), (281074, 58980774), (281074, 62062566), (281074, 66468550), (281074, 68234192), (281074, 265893479), (281074, 268485881), (281074, 3994271), (281074, 31061967), (281075, 1901934), (281075, 10768291), (281075, 18968296), (281075, 16705086), (281130, 316962841), (281130, 314158900), (281130, 303467992), (281130, 306513303), (281130, 151852403), (281130, 118932816), (281130, 122882407), (281130, 123838423), (281130, 141225843), (281130, 145368974), (281130, 210656037), (281130, 191798820), (281130, 196179651), (281130, 216584551), (281130, 217499609), (281130, 222954151), (281130, 244504707), (281130, 246734873), (281130, 393187507), (281130, 359568397), (281130, 366141086), (281130, 371919789), (281130, 46220569), (281130, 131823719), (281130, 281194765), (281130, 122990048), (281130, 160070069), (281130, 165438380), (281130, 173108140), (281130, 183086891), (281130, 183946265), (281130, 5428775), (281130, 28119213), (281130, 58308319), (281130, 286532535), (281130, 286251240), (281130, 294442485), (281130, 39252595), (281130, 62533604), (281130, 71034790), (281130, 398165520), (281130, 92892529), (281130, 104827700), (281143, 157595537), (281143, 333156839), (281143, 333619871), (281143, 347320050), (281143, 2761202471), (281143, 256754619), (281143, 2032281195), (281143, 2037877561), (281143, 1234798740), (281143, 1239163686), (281143, 1243066433), (281143, 1247808657), (281143, 1251899109), (281143, 1255678609), (281143, 1979316791), (281143, 2008822283), (281143, 951503985), (281143, 956153284), (281143, 3061612232), (281143, 3063409045), (281143, 3062680360), (281143, 3071698440), (281143, 3072038605), (281143, 806559205), (281143, 813593589), (281143, 2319301390), (281143, 3461810341), (281143, 3470210182), (281143, 3473567503), (281143, 205434538), (281143, 216658970), (281143, 215583292), (281143, 425370058), (281143, 2289348760), (281143, 2299002002), (281143, 2310641698), (281143, 1202495606), (281143, 1221726046), (281143, 2646382125), (281143, 2644875629), (281143, 2644618760), (281143, 2644347068), (281143, 1116332496), (281143, 1127155737), (281143, 1125402431), (281143, 1134122026), (281143, 1136070997), (281143, 2730733203), (281143, 2742489017), (281143, 2745879884), (281143, 2747109642), (281143, 585174740), (281143, 627857416), (281143, 1583607000), (281143, 3352377218), (281143, 3363067074), (281143, 3412975265), (281143, 3412354320), (281143, 3423020787), (281143, 840870609), (281143, 843593950), (281143, 850167655), (281143, 3905430950), (281143, 996119847), (281143, 1003063210), (281143, 1000046734), (281143, 1003652866), (281143, 1013707046), (281143, 1010848037), (281143, 1010430921), (281143, 1016637269), (281143, 1019820624), (281143, 2837116235), (281143, 2835623662), (281143, 2850328518), (281143, 1747460907), (281143, 1747688852), (281143, 1767844683), (281143, 1455827208), (281143, 1461169862), (281143, 1463881902), (281143, 1473882717), (281143, 1477019555), (281143, 1725686810), (281143, 1725822113), (281143, 1401955295), (281143, 1412262046), (281143, 1415285278), (281143, 1420115705), (281143, 1419347139), (281143, 1421363192), (281143, 623654255), (281143, 3595181463), (281143, 3602409437), (281143, 3601870538), (281143, 3609556274), (281143, 676867234), (281143, 678554447), (281143, 1492687951), (281143, 1518002588), (281143, 2246989491), (281143, 2252447406), (281143, 2270923360), (281143, 2077545436), (281143, 2083628985), (281143, 2106914318), (281143, 38105202), (281143, 55081438), (281143, 60845464), (281143, 57726921), (281143, 65061871), (281143, 1257144239), (281143, 1264564611), (281143, 1263737532), (281143, 2783687433), (281143, 2785643143), (281143, 2788666669), (281143, 2791888303), (281143, 2795422122), (281143, 2799707900), (281143, 1534777181), (281143, 1538080978), (281143, 1537115408), (281143, 1548229928), (281143, 1550903174), (281143, 1622204649), (281143, 1625307021), (281143, 1647435924), (281143, 1649806534), (281143, 2863691662), (281143, 2869448870), (281143, 2879063404), (281143, 2879132229), (281143, 2881423057), (281143, 2882934281), (281143, 2885269854), (281143, 2889163508), (281143, 2554623654), (281143, 2565211002), (281143, 3284741171), (281143, 3334235996), (281143, 3339428466), (281143, 3348951685), (281143, 2687920571), (281143, 2184506418), (281143, 4223756601), (281143, 4229645827), (281143, 143059276), (281143, 142287587), (281143, 141306090), (281143, 4152602640), (281143, 1788217665), (281143, 1790921846), (281143, 1791744222), (281143, 1802805812), (281143, 1802356894), (281143, 2341726799), (281143, 712697671), (281143, 302269251), (281143, 303376108), (281143, 304409387), (281143, 315328905), (281143, 317401697), (281143, 2451692247), (281143, 2457472381), (281143, 2471725123), (281143, 2471637185), (281143, 2066381892), (281143, 2066358496), (281143, 2073387720), (281143, 3248338144), (281143, 3254266012), (281143, 3263486956), (281143, 3267096980), (281143, 3274987680), (281143, 469895296), (281143, 473053691), (281143, 481896991), (281143, 867227854), (281143, 3570845149), (281143, 3700234654), (281143, 3705064006), (281143, 35980951), (281143, 185368900), (281143, 185558909), (281143, 3972163292), (281143, 3558718112), (281143, 3564724489), (281143, 3568326480), (281143, 3571861904), (281143, 882854121), (281143, 888231558), (281143, 1937194549), (281143, 1941898983), (281143, 1953807538), (281143, 1967829737), (281143, 3626709104), (281143, 735126205), (281143, 737825896), (281143, 741721313), (281143, 687713916), (281143, 690622746), (281143, 1874777712), (281143, 1883147330), (281143, 1891159931), (281143, 1060702981), (281143, 1081424334), (281143, 587915869), (281143, 590877447), (281143, 592547173), (281143, 593015307), (281143, 594103820), (281143, 598254838), (281143, 610397433), (281143, 3089558356), (281143, 3141145145), (281143, 3142150545), (281143, 3140353149), (281143, 3143500116), (281143, 3144815266), (281143, 3149260607), (281143, 1365468325), (281143, 1367516994), (281143, 1382914120), (281143, 1383973147), (281143, 1387266804), (281143, 1385973507), (281143, 2402048662), (281143, 2402067900), (281143, 2413902475), (281143, 2413959429), (281143, 2419397288), (281143, 1838274807), (281143, 1846413688), (281143, 1853436960), (281143, 1851750722), (281143, 1024296031), (281143, 2204340582), (281143, 2206945713), (281143, 2208801285), (281143, 2214581867), (281143, 3204740050), (281143, 3209039866), (281143, 3211528833), (281143, 2442716992), (281143, 504259125), (281143, 526827836), (281143, 3533048294), (281143, 3547406065), (281143, 152915185), (281143, 154608774), (281143, 156381922), (281143, 4196794118), (281143, 4205595171), (281143, 4208442399), (281143, 4213738161), (281143, 2983956191), (281143, 2985557102), (281143, 759027281), (281143, 761304834), (281143, 769368571), (281143, 778111761), (281143, 783679510), (281143, 782022651), (281143, 2478223815), (281143, 2495347223), (281143, 1081092273), (281143, 1093583895), (281143, 1109700494), (281143, 1109322409), (281143, 3295261786), (281143, 3307978769), (281143, 2945783255), (281143, 2951857003), (281143, 2952973606), (281143, 2968703933), (281143, 2976641388), (281143, 2977578156), (281143, 3096808706), (281143, 3123104163), (281143, 3753336078), (281143, 3758069083), (281143, 3763472525), (281143, 3785778424), (281143, 3428628298), (281143, 3428729768), (281143, 3435313396), (281143, 3445141280), (281143, 3446160451), (281143, 3456425420), (281143, 3458166225), (281143, 3456266623), (281143, 98702485), (281143, 107009256), (281143, 116605576), (281143, 117840018), (281143, 119047242), (281143, 437738114), (281143, 445959894), (281143, 449043103), (281143, 452944263), (281143, 454736249), (281143, 2702060967), (281143, 2709145254), (281143, 2710239244), (281143, 2712247657), (281143, 2715576586), (281143, 3046811437), (281143, 3047583327), (281143, 972514684), (281143, 981032119), (281143, 3814779570), (281143, 638826157), (281143, 649742776), (281143, 656846303), (281143, 661819091), (281143, 1568666882), (281143, 1580094041), (281143, 1688012722), (281143, 1700089887), (281143, 1706750974), (281143, 3166661545), (281143, 3223632514), (281143, 3230944477), (281143, 4072332515), (281143, 4084860737), (281143, 4084145884), (281143, 4096486712), (281143, 4095856169), (281143, 4101946684), (281143, 2108694354), (281143, 2111790854), (281143, 2120584830), (281143, 2132546579), (281143, 3372010167), (281143, 3801303010), (281143, 3801153977), (281143, 3808070823), (281143, 3811917914), (281143, 176303631), (281143, 184989418), (281143, 183031458), (281143, 265196423), (281143, 541672995), (281143, 542382512), (281143, 546198417), (281143, 546878667), (281143, 550833127), (281143, 2654323785), (281143, 2659469406), (281143, 2659630671), (281143, 1172403041), (281143, 1183838491), (281143, 3881496657), (281143, 3887796806), (281143, 3897305500), (281143, 3901054726), (281143, 1138789946), (281143, 1142412487), (281143, 1145384194), (281143, 1152447689), (281143, 1150105806), (281143, 1156000849), (281143, 1157422020), (281143, 1163277282), (281143, 3689572719), (281143, 3691241074), (281143, 3702412630), (281143, 3705826100), (281143, 3712828940), (281143, 3723702909), (281143, 280514869), (281143, 3010000753), (281143, 3018777947), (281143, 3512212480), (281143, 3516170502), (281143, 3520289068), (281143, 3525794265), (281143, 3678497429), (281143, 3680449961), (281143, 3751149759), (281143, 820823967), (281143, 830729691), (281143, 68656648), (281143, 77148174), (281143, 95193594), (281143, 93074616), (281143, 1896997077), (281143, 1904800650), (281143, 1912257707), (281143, 1917430690), (281143, 2931804457), (281143, 2991935317), (281143, 2996718205), (281143, 4037788178), (281143, 4038457975), (281143, 4045366719), (281143, 4048314793), (281143, 4052795248), (281143, 4053510388), (281143, 4051936651), (281143, 2050455506), (281143, 2060434996), (281143, 2229992476), (281143, 2239539990), (281143, 2576651931), (281143, 2584641333), (281143, 2586417263), (281143, 2584370048), (281143, 2598772901), (281143, 930207541), (281143, 1430806120), (281143, 1435246489), (281143, 1445827843), (281143, 1443984051), (281143, 1448418108), (281143, 497238709), (281143, 361030086), (281143, 362222246), (281143, 375548425), (281143, 322076796), (281143, 327939823), (281143, 330209440), (281143, 3181489347), (281143, 3185362500), (281143, 3185657411), (281143, 3190497661), (281143, 3200995243), (281143, 1808896031), (281143, 1812577312), (281143, 1812157791), (281143, 1032330697), (281143, 1041326703), (281143, 1057417818), (281143, 381820393), (281143, 395348181), (281143, 394617983), (281143, 401329985), (281143, 399121161), (281143, 397846921), (281143, 2150353112), (281143, 2160156197), (281143, 2164461832), (281143, 2165720688), (281143, 3919429582), (281143, 3932479759), (281143, 2756431), (281143, 11106510), (281143, 11050325), (281143, 25756691), (281143, 28144957), (281143, 1333449112), (281143, 1339005972), (281143, 1338366733), (281143, 721203231), (281143, 2043826073), (281143, 1982282379), (281143, 4009947724), (281143, 4179450299), (281143, 4187220539), (281143, 3950299722), (281143, 4023612212), (281143, 4028049269), (281143, 4031368686), (281143, 4127241917), (281143, 4140411189), (281143, 908671097), (281143, 914008100), (281143, 913495166), (281143, 918852184), (281143, 919220828), (281143, 2368205853), (281143, 2377009233), (281143, 2389832336), (281143, 2400245319), (281143, 3834775499), (281143, 3848924798), (281143, 3855738234), (281143, 3319954939), (281143, 3323639709), (281143, 227084758), (281143, 237116621), (281143, 240841256), (281143, 250997266), (281143, 2514319250), (281143, 2515072889), (281143, 2526203403), (281143, 2526938628), (281143, 3654995106), (281143, 3656926151), (281143, 3663007478), (281143, 3669937719), (281143, 3670518898), (281143, 3677939818), (281143, 2610880409), (281143, 2627156766), (281143, 2627322721), (281143, 2630747559), (281143, 2633581850), (281143, 288986712), (281143, 289469861), (281143, 293902396), (281143, 298413220), (281143, 1602346659), (281143, 1613154549), (281143, 1661088138), (281143, 1667082188), (281143, 1668638047), (281143, 1674983167), (281143, 1676949270), (281143, 1676671010), (281143, 1676999016), (281143, 1679177550), (281143, 3240089300), (281143, 4106098845), (281143, 4113697974), (281143, 4117256686), (281143, 4119363295), (281143, 1282591969), (281143, 1285789506), (281143, 1287074927), (281143, 2899261219), (281143, 2907127329), (281143, 2910948284), (281143, 2919579992), (281143, 2921247872), (281143, 1777076882), (281317, 32518025), (281317, 35402318), (281317, 410841126), (281317, 414490582), (281317, 418398611), (281317, 431245411), (281317, 394529793), (281317, 395792496), (281317, 397491850), (281317, 259973640), (281317, 145824965), (281317, 155818668), (281317, 363862383), (281317, 39330713), (281317, 47208018), (281317, 56434457), (281317, 60177362), (281317, 69074711), (281317, 322578241), (281317, 383138111), (281317, 160741254), (281317, 173020785), (281317, 171616660), (281317, 177421660), (281317, 192765043), (281317, 189952644), (281317, 7026550), (281317, 8185433), (281317, 7591136), (281317, 8661374), (281317, 15249375), (281317, 27265533), (281317, 292294684), (281317, 298825016), (281317, 305890084), (281317, 229039232), (281317, 234566222), (281317, 241415349), (281317, 242796222), (281317, 248264282), (281317, 251714859), (281317, 96214206), (281317, 227422336), (281317, 229567177), (281317, 274763899), (281317, 275688193), (281317, 278980962), (281317, 282530232), (281317, 332027659), (281317, 336102716), (281317, 347939257), (281317, 111927337), (281317, 115742920), (281317, 116599249), (281317, 120482530), (281317, 123680104), (281317, 129416389), (281317, 130455328), (281317, 136601838), (281317, 135648929), (281317, 138895774), (281385, 1166803573), (281385, 1169829490), (281385, 1179336499), (281385, 1403781898), (281385, 1404677260), (281385, 1408089491), (281385, 1409869505), (281385, 1413063128), (281385, 1417497573), (281385, 1425157474), (281385, 1428853992), (281385, 1388079518), (281385, 1917657899), (281385, 1492378778), (281385, 1491609265), (281385, 1502393604), (281385, 495747737), (281385, 501189070), (281385, 517461069), (281385, 574881507), (281385, 590696146), (281385, 605326260), (281385, 1540080460), (281385, 1549918738), (281385, 1556317449), (281385, 1557381290), (281385, 2140165087), (281385, 2153043496), (281385, 539913767), (281385, 543335546), (281385, 544383660), (281385, 545794434), (281385, 547027374), (281385, 552732304), (281385, 553059816), (281385, 552172327), (281385, 556037306), (281385, 553782387), (281385, 557340600), (281385, 560856414), (281385, 1856011992), (281385, 2115963135), (281385, 2129611655), (281385, 2133905081), (281385, 2176100628), (281385, 2178917324), (281385, 2179172162), (281385, 2182077711), (281385, 2184415713), (281385, 2183737175), (281385, 1328411487), (281385, 1333819359), (281385, 439346906), (281385, 445429273), (281385, 447527528), (281385, 704644469), (281385, 715418167), (281385, 721177433), (281385, 729057069), (281385, 734643796), (281385, 734249191), (281385, 737079227), (281385, 1741254183), (281385, 1745166456), (281385, 1744571536), (281385, 1747777200), (281385, 1761628323), (281385, 1761552493), (281385, 2039310342), (281385, 2038413098), (281385, 2042942686), (281385, 1697695625), (281385, 1698690641), (281385, 1700193361), (281385, 483238850), (281385, 489870078), (281385, 623305995), (281385, 629655981), (281385, 640513875), (281385, 641197422), (281385, 642656796), (281385, 1034954318), (281385, 1042651235), (281385, 1048545116), (281385, 1050926491), (281385, 1065164967), (281385, 1067898580), (281385, 1071998037), (281385, 1974985259), (281385, 1982535752), (281385, 1983462364), (281385, 1985849127), (281385, 1998285428), (281385, 2001825787), (281385, 1828865231), (281385, 1839338993), (281385, 1850931701), (281385, 528278767), (281385, 1467852201), (281385, 1471344634), (281385, 1475932184), (281385, 1528364261), (281385, 1531745150), (281385, 910181586), (281385, 911566493), (281385, 916280650), (281385, 923227825), (281385, 1918033635), (281385, 1091486360), (281385, 1507819072), (281385, 1512171947), (281385, 1514749613), (281385, 1514537924), (281385, 1575803953), (281385, 1581687082), (281385, 1605804623), (281385, 1613039197), (281385, 1122597203), (281385, 1124670577), (281385, 1134765913), (281385, 1147186602), (281385, 2008745132), (281385, 2010751381), (281385, 2013244918), (281385, 2015071288), (281385, 2017007784), (281385, 2021432069), (281385, 2032998684), (281385, 2032211331), (281385, 2035326933), (281385, 1184958970), (281385, 1200292642), (281385, 1208550872), (281385, 1073528150), (281385, 1001824746), (281385, 999491313), (281385, 1003009744), (281385, 1007146005), (281385, 1010573099), (281385, 1011263926), (281385, 1018432099), (281385, 1019184930), (281385, 1022747304), (281385, 1662615434), (281385, 1667987118), (281385, 1673993137), (281385, 1671994282), (281385, 1677164357), (281385, 1679241983), (281385, 1680724294), (281385, 1694144618), (281385, 963069256), (281385, 962516681), (281385, 965793898), (281385, 968674189), (281385, 975113633), (281385, 890140254), (281385, 894981872), (281385, 1661921906), (281385, 1028563565), (281385, 977766425), (281385, 980730781), (281385, 987336483), (281385, 990291653), (281385, 991989937), (281385, 989640726), (281385, 419813596), (281385, 425599496), (281385, 653516481), (281385, 870081375), (281385, 872077132), (281385, 1968876126), (281385, 1970719918), (281385, 1969115879), (281385, 1082740267), (281385, 1097785216), (281385, 1098207242), (281385, 1097530077), (281385, 1102044123), (281385, 1739962232), (281385, 825847190), (281385, 1941358448), (281385, 1940731451), (281385, 1947418685), (281385, 1956759197), (281385, 1956357890), (281385, 1256517836), (281385, 1214161516), (281385, 1217645604), (281385, 1794197259), (281385, 1803728783), (281385, 1801133887), (281385, 1809691076), (281385, 1622566040), (281385, 1622313659), (281385, 1623541543), (281385, 1626020598), (281385, 1651702198), (281385, 1350709903), (281385, 1352776810), (281385, 1357638537), (281385, 1369136090), (281385, 1382834411), (281385, 1156946546), (281385, 1156563153), (281385, 1714194557), (281385, 1715451942), (281385, 1721212809), (281385, 2084309371), (281385, 2096916097), (281385, 2099466381), (281385, 1434239234), (281385, 1432486123), (281385, 1433928160), (281385, 1440594116), (281385, 1453117941), (281385, 747799865), (281385, 1885455563), (281385, 1269983750), (281385, 1277281219), (281385, 1284596682), (281385, 1283350391), (281385, 1244384867), (281385, 1602882145), (281385, 930534379), (281385, 947299446), (281385, 1285523334), (281385, 1611650175), (281385, 1617754646), (281385, 797345264), (281385, 2200163602), (281385, 2206392910), (281385, 2204124322), (281385, 2208015440), (281385, 858309749), (281385, 857280222), (281385, 1822084888), (281411, 137947779), (281411, 151338255), (281411, 159844857), (281411, 160858710), (281411, 1898226718), (281411, 1898973049), (281411, 1917609981), (281411, 1877331539), (281411, 1884696854), (281411, 1886962280), (281411, 915533943), (281411, 38319417), (281411, 40536636), (281411, 38845323), (281411, 54152727), (281411, 410543375), (281411, 412792380), (281411, 416946572), (281411, 420642269), (281411, 426686043), (281411, 424158800), (281411, 426725072), (281411, 433328640), (281411, 1120344246), (281411, 1125139041), (281411, 1131825431), (281411, 617441193), (281411, 829522133), (281411, 830202183), (281411, 534856399), (281411, 537636170), (281411, 547867890), (281411, 547686532), (281411, 550654951), (281411, 392351854), (281411, 397225157), (281411, 396450611), (281411, 398205093), (281411, 403021648), (281411, 408315181), (281411, 432455402), (281411, 437744959), (281411, 436096458), (281411, 439242043), (281411, 442107985), (281411, 445209396), (281411, 454457098), (281411, 90526410), (281411, 2329082087), (281411, 2339000952), (281411, 2341013887), (281411, 2347420152), (281411, 2356127194), (281411, 1274956815), (281411, 1275858850), (281411, 1296200774), (281411, 1299729555), (281411, 1301827098), (281411, 1302436693), (281411, 1682241379), (281411, 1690031203), (281411, 569993507), (281411, 572870027), (281411, 571659871), (281411, 576600323), (281411, 577227389), (281411, 586206683), (281411, 2076944854), (281411, 2073929920), (281411, 2082828478), (281411, 2175425186), (281411, 2182090915), (281411, 2201577115), (281411, 1737729881), (281411, 1737776182), (281411, 1741683287), (281411, 1742791232), (281411, 1751875086), (281411, 1751467021), (281411, 949421112), (281411, 2089932835), (281411, 2095570578), (281411, 654855803), (281411, 652908327), (281411, 662778023), (281411, 663035212), (281411, 671026946), (281411, 677835239), (281411, 678571454), (281411, 679951483), (281411, 1402120349), (281411, 1401588869), (281411, 1407271725), (281411, 1424547033), (281411, 1426939915), (281411, 512291583), (281411, 514471989), (281411, 522686254), (281411, 522315907), (281411, 524682367), (281411, 121873192), (281411, 131739317), (281411, 128639106), (281411, 699184528), (281411, 704143866), (281411, 721936958), (281411, 1762519428), (281411, 1777039309), (281411, 1782989700), (281411, 1786384106), (281411, 9085842), (281411, 20872509), (281411, 25971095), (281411, 28521815), (281411, 26923907), (281411, 172233365), (281411, 189768272), (281411, 189700911), (281411, 1060612921), (281411, 1064636512), (281411, 1061264910), (281411, 1066043374), (281411, 1076509976), (281411, 1073518979), (281411, 561500432), (281411, 2269423696), (281411, 2274894478), (281411, 2281750497), (281411, 2464515149), (281411, 2475503986), (281411, 2492127680), (281411, 2508628457), (281411, 2509744902), (281411, 206916373), (281411, 208354805), (281411, 208256375), (281411, 624819143), (281411, 639105340), (281411, 638917378), (281411, 639300418), (281411, 640659994), (281411, 643404469), (281411, 644870515), (281411, 1429542022), (281411, 1444179270), (281411, 2295873390), (281411, 228499834), (281411, 238523563), (281411, 2372962450), (281411, 2377414339), (281411, 2381168931), (281411, 2383752692), (281411, 2387785755), (281411, 1639815238), (281411, 1642185274), (281411, 1643536629), (281411, 1654807440), (281411, 1660478022), (281411, 1667766524), (281411, 1664940957), (281411, 504936849), (281411, 505222624), (281411, 1989273463), (281411, 1996284623), (281411, 1999728749), (281411, 2002791029), (281411, 2004911940), (281411, 2008535736), (281411, 2012947340), (281411, 298059912), (281411, 298725986), (281411, 301170660), (281411, 300890468), (281411, 304076788), (281411, 301686448), (281411, 307114673), (281411, 319951976), (281411, 920780273), (281411, 922917599), (281411, 924946371), (281411, 923092694), (281411, 927837765), (281411, 930378675), (281411, 930910410), (281411, 933994108), (281411, 936788463), (281411, 938507929), (281411, 944256998), (281411, 1161386513), (281411, 1802322833), (281411, 1804250261), (281411, 1804350243), (281411, 1811086894), (281411, 1813089653), (281411, 1821189740), (281411, 1623071773), (281411, 1623484350), (281411, 1625158423), (281411, 1631335719), (281411, 1918924707), (281411, 1923983984), (281411, 1930699915), (281411, 1936331234), (281411, 2015258715), (281411, 956291541), (281411, 959924897), (281411, 967047746), (281411, 980370277), (281411, 982981644), (281411, 460519601), (281411, 1023709332), (281411, 1024744798), (281411, 1043963279), (281411, 1046449998), (281411, 366889605), (281411, 369846251), (281411, 371306667), (281411, 382504714), (281411, 1336498299), (281411, 1350658011), (281411, 323089751), (281411, 327108674), (281411, 325868535), (281411, 327896142), (281411, 336871930), (281411, 337278310), (281411, 339637663), (281411, 2054325875), (281411, 2058285734), (281411, 2063682603), (281411, 2067356902), (281411, 2073235988), (281411, 2124774364), (281411, 2127732713), (281411, 2131611852), (281411, 2134569102), (281411, 735346718), (281411, 736125997), (281411, 743800219), (281411, 744889899), (281411, 256276592), (281411, 263416623), (281411, 263999789), (281411, 1553496398), (281411, 1570452113), (281411, 1569537841), (281411, 2244180012), (281411, 2265506376), (281411, 2421142016), (281411, 2433070377), (281411, 2442759932), (281411, 1370693637), (281411, 1377733038), (281411, 1379425170), (281411, 1380185764), (281411, 1381009217), (281411, 1386861205), (281411, 1389343074), (281411, 1393369239), (281411, 1826713256), (281411, 1826130829), (281411, 1837498611), (281411, 1840276080), (281411, 1843418919), (281411, 1203280503), (281411, 1213732411), (281411, 1218153332), (281411, 1230249461), (281411, 2517933330), (281411, 2523860792), (281411, 2527931236), (281411, 2536166240), (281411, 1962858529), (281411, 1962612569), (281411, 1973067398), (281411, 1983755088), (281411, 1470336291), (281411, 1481285252), (281411, 484332137), (281411, 486586484), (281411, 489403072), (281411, 489685439), (281411, 490490640), (281411, 493434821), (281411, 499851606), (281411, 502528289), (281411, 502195101), (281411, 1088393891), (281411, 1088736682), (281411, 1096407143), (281411, 1105359643), (281411, 1103884353), (281411, 1107878825), (281411, 1110838324), (281411, 2541722927), (281411, 2547903479), (281411, 2554760257), (281411, 1598185829), (281411, 1598703739), (281411, 66704854), (281411, 111828957), (281411, 267687679), (281411, 270520861), (281411, 271888559), (281411, 276782551), (281411, 278641857), (281411, 282497094), (281411, 288056813), (281411, 2210087467), (281411, 2230056977), (281411, 1502470070), (281411, 1506284529), (281411, 1507999446), (281411, 1511142338), (281411, 354859965), (281411, 362754527), (281411, 365434952), (281411, 363728210), (281411, 1523363845), (281411, 1528931922), (281411, 1540682207), (281411, 1707440174), (281411, 1707727906), (281411, 1713788480), (281411, 1716158228), (281411, 1715064431), (281411, 1717372051), (281411, 1718963830), (281411, 1719854126), (281411, 1727728457), (281411, 1301887021), (281411, 1303181507), (281411, 1308148385), (281411, 1322682565), (281411, 1326195379), (281411, 2388472707), (281411, 2398070546), (281411, 2410535535), (281411, 2415712821), (281411, 2413956907), (281411, 2141794107), (281411, 2171142496), (281411, 1238440672), (281411, 1248094002), (281411, 1246262900), (281411, 1257009156), (281411, 1255434196), (281411, 1265086457), (281411, 593147924), (281411, 612822411), (281411, 615088109), (281411, 994006798), (281411, 995922398), (281411, 1002678075), (281411, 1003043229), (281411, 1008954784), (281411, 1011309099), (281411, 692671354), (281411, 1175343312), (281411, 1179230017), (281411, 1178102591), (281411, 1181673278), (281411, 1181834093), (281411, 1183385738), (281411, 1195121856), (281411, 2014996510), (281411, 2014878068), (281411, 2024353197), (281411, 2027208695), (281411, 2029522374), (281411, 2030114830), (281411, 2035915455), (282631, 164145147), (282631, 172636144), (282631, 172152699), (282631, 174434844), (282631, 179928046), (282631, 183230456), (282631, 523659965), (282631, 524175880), (282631, 526307054), (282631, 528525381), (282631, 532426345), (282631, 534692956), (282631, 140457108), (282631, 72394287), (282631, 79322921), (282631, 87687843), (282631, 457133688), (282631, 464432582), (282631, 464840905), (282631, 48431519), (282631, 54105578), (282631, 57793888), (282631, 13691678), (282631, 23420702), (282631, 22244749), (282631, 25360542), (282631, 31817306), (282631, 66831383), (282631, 105030383), (282631, 107770511), (282631, 114199554), (282631, 113605190), (282631, 116129552), (282631, 199067188), (282631, 200972369), (282631, 204448318), (282631, 208368489), (282631, 287220382), (282631, 288771130), (282631, 300466818), (282631, 181190985), (282631, 189604314), (282631, 316847565), (282631, 329158325), (282631, 223143649), (282631, 226372046), (282631, 236561993), (282631, 241403014), (282631, 243709095), (282631, 247027686), (282631, 247686013), (282631, 103605080), (282631, 406209206), (282631, 414785039), (282631, 414343446), (282631, 419290818), (282631, 425722136), (282631, 429717615), (282631, 481796677), (282631, 344823384), (282631, 350091474), (282631, 349401847), (282631, 353204333), (282631, 435233292), (282631, 440803772), (282631, 443850796), (282631, 478142100), (282631, 338236152), (282631, 340084300), (282631, 360771635), (282631, 375906112), (282631, 498994058), (282631, 507875751), (282712, 281503239), (282712, 286434708), (282712, 88319302), (282712, 88866193), (282712, 92985689), (282712, 100280934), (282712, 102382789), (282712, 107153133), (282712, 109273376), (282712, 108657057), (282712, 116068553), (282712, 1013927163), (282712, 1019120311), (282712, 1026923892), (282712, 449799817), (282712, 455154639), (282712, 453301508), (282712, 479965646), (282712, 1591686909), (282712, 1616587791), (282712, 514291356), (282712, 239459900), (282712, 7885361), (282712, 14042241), (282712, 117297847), (282712, 119169907), (282712, 1250511769), (282712, 1255031765), (282712, 1258916908), (282712, 1265229947), (282712, 301751957), (282712, 303004392), (282712, 307309098), (282712, 345601072), (282712, 346112488), (282712, 812877298), (282712, 830369607), (282712, 837625008), (282712, 1140248495), (282712, 695773453), (282712, 709436355), (282712, 615082015), (282712, 794729112), (282712, 794950039), (282712, 1453337605), (282712, 1451969787), (282712, 1456770956), (282712, 1458706470), (282712, 1463869951), (282712, 1471463602), (282712, 1473372122), (282712, 1477668749), (282712, 38660565), (282712, 45320617), (282712, 45694035), (282712, 790734487), (282712, 798638754), (282712, 802746378), (282712, 806690932), (282712, 807698273), (282712, 769738952), (282712, 768263543), (282712, 466717584), (282712, 215316272), (282712, 1203789614), (282712, 1215039466), (282712, 1219471579), (282712, 1222956523), (282712, 128715187), (282712, 134141735), (282712, 135343271), (282712, 138539853), (282712, 139101984), (282712, 138973686), (282712, 63856919), (282712, 65533295), (282712, 70492518), (282712, 75489278), (282712, 74120086), (282712, 632336039), (282712, 638093613), (282712, 649946548), (282712, 914892035), (282712, 922692047), (282712, 927687869), (282712, 926015329), (282712, 1485446237), (282712, 1514444547), (282712, 1522069277), (282712, 359158896), (282712, 360337972), (282712, 372430062), (282712, 743204098), (282712, 747377098), (282712, 748038550), (282712, 269148113), (282712, 270681847), (282712, 271566281), (282712, 276161360), (282712, 278926535), (282712, 282058736), (282712, 287565611), (282712, 289265632), (282712, 289715928), (282712, 309362408), (282712, 325490901), (282712, 1083077939), (282712, 1091658790), (282712, 89225285), (282712, 418966250), (282712, 429731165), (282712, 437430600), (282712, 338036190), (282712, 1328858563), (282712, 1369307982), (282712, 1374704448), (282712, 1379018645), (282712, 1385936630), (282712, 402220110), (282712, 489228759), (282712, 495840062), (282712, 496800748), (282712, 1442423427), (282712, 1445872111), (282712, 1446643220), (282712, 1449701487), (282712, 1449065783), (282712, 555857703), (282712, 577598305), (282712, 845473343), (282712, 845627908), (282712, 851839315), (282712, 854964652), (282712, 937575447), (282712, 941456314), (282712, 956229444), (282712, 971260457), (282712, 1688405539), (282712, 1689695945), (282712, 1701662423), (282712, 1702472198), (282712, 1179943863), (282712, 1184281103), (282712, 1190782484), (282712, 1191798010), (282712, 528390450), (282712, 533218350), (282712, 538918442), (282712, 537386367), (282712, 673829644), (282712, 675404714), (282712, 675214565), (282712, 675327498), (282712, 676034846), (282712, 682515221), (282712, 685348605), (282712, 1120936199), (282712, 1657341999), (282712, 1662966956), (282712, 1662022616), (282712, 865247513), (282712, 867974903), (282712, 875838618), (282712, 878291731), (282712, 881617396), (282712, 25908370), (282712, 27319310), (282712, 29878572), (282712, 585480051), (282712, 582591255), (282712, 586909199), (282712, 601035211), (282712, 1363519019), (282712, 1363469522), (282712, 155594944), (282712, 164150731), (282712, 169949251), (282712, 179646546), (282712, 177952632), (282712, 180667539), (282712, 966481555), (282712, 987951300), (282712, 987892137), (282712, 992669933), (282712, 1036581793), (282712, 1035806227), (282712, 1037328879), (282712, 1048897072), (282712, 1045259557), (282712, 1055128234), (282712, 1056418297), (282712, 1059587994), (282712, 1062474835), (282712, 1066204788), (282712, 1154811079), (282712, 1162143477), (282712, 1169114059), (282712, 1167190380), (282712, 1174090853), (282712, 1178575044), (282712, 376269137), (282712, 380679836), (282712, 387667239), (282712, 395429988), (282712, 567388425), (282712, 645142748), (282712, 247223028), (282712, 257696585), (282712, 261095829), (282712, 266015717), (282712, 267801783), (282712, 1400405523), (282712, 1413840599), (282712, 1421477395), (282712, 1421547094), (282712, 684946496), (282712, 737373695), (282712, 744238898), (282712, 1345610885), (282712, 1357056666), (282712, 658152214), (282712, 151343646), (282712, 228154044), (282712, 229460118), (282712, 1280062625), (282712, 1280421338), (282712, 1617021782), (282712, 1634019125), (282712, 1639755171), (282712, 1645394184), (282712, 1647118432), (282712, 183071675), (282712, 183824040), (282712, 1232413675), (282712, 1234507659), (282712, 1238950355), (282712, 1242440883), (282712, 202492892), (282712, 212041168), (282712, 213280350), (282712, 1566723774), (282712, 1576865231), (282712, 1301866112), (282712, 1303987841), (282712, 1309702397), (282712, 1322701344), (282712, 1522431536), (282712, 1529576228), (282712, 1538987376), (282712, 1554186064), (282784, 214990654), (282784, 186669593), (282784, 190115226), (282784, 192328893), (282784, 198450167), (282784, 201009003), (282784, 199693025), (282784, 205139952), (282784, 210950615), (282784, 212502657), (282992, 1369468980), (282992, 1384541083), (282992, 1490332461), (282992, 1488281007), (282992, 1503888366), (282992, 1512288755), (282992, 1519961330), (282992, 1487289827), (282992, 1688369842), (282992, 1694560400), (282992, 1697233400), (282992, 1699794724), (282992, 1703028820), (282992, 1703479842), (282992, 1710868796), (282992, 1815708714), (282992, 1821291048), (282992, 1825141642), (282992, 1824915980), (282992, 1677932827), (282992, 1676444247), (282992, 1684323682), (282992, 1833331320), (282992, 1837202715), (282992, 1839748999), (282992, 86800076), (282992, 94469874), (282992, 99310122), (282992, 105401527), (282992, 118338605), (282992, 834609128), (282992, 842107496), (282992, 859364748), (282992, 156139420), (282992, 154177383), (282992, 162471403), (282992, 167632681), (282992, 172265484), (282992, 351580395), (282992, 371192926), (282992, 379626357), (282992, 378563244), (282992, 1108365502), (282992, 1028923119), (282992, 1033296444), (282992, 1037058205), (282992, 1042589043), (282992, 620757647), (282992, 627993366), (282992, 636346167), (282992, 637542203), (282992, 303902811), (282992, 528200428), (282992, 553940478), (282992, 703509169), (282992, 703648166), (282992, 708366977), (282992, 710507315), (282992, 709048911), (282992, 710471116), (282992, 713984794), (282992, 712131398), (282992, 721765977), (282992, 723044147), (282992, 724740770), (282992, 731376548), (282992, 733153192), (282992, 74028032), (282992, 948226460), (282992, 956957137), (282992, 956337043), (282992, 966193126), (282992, 969659490), (282992, 969956701), (282992, 1580650260), (282992, 1588974554), (282992, 2057118256), (282992, 941783114), (282992, 1887494624), (282992, 1893242089), (282992, 1898092758), (282992, 1899072635), (282992, 1914503524), (282992, 1266369114), (282992, 1270173928), (282992, 1289991550), (282992, 1295117616), (282992, 696421227), (282992, 602780333), (282992, 610181314), (282992, 612578585), (282992, 614861689), (282992, 189048096), (282992, 788265646), (282992, 1856028682), (282992, 1859992654), (282992, 1859348300), (282992, 1863556838), (282992, 1863087351), (282992, 1872531805), (282992, 1873480399), (282992, 1878042450), (282992, 245666044), (282992, 250165465), (282992, 262077444), (282992, 1636579531), (282992, 1640383529), (282992, 1641252236), (282992, 1652213186), (282992, 1658189811), (282992, 1659187722), (282992, 1662461275), (282992, 1666559306), (282992, 866104136), (282992, 876204178), (282992, 878535487), (282992, 887625285), (282992, 343422334), (282992, 344362973), (282992, 346932440), (282992, 619486735), (282992, 1230041483), (282992, 1240462701), (282992, 1250741850), (282992, 1187597163), (282992, 1152515775), (282992, 1158826398), (282992, 1161161836), (282992, 559048523), (282992, 1095486584), (282992, 1101508812), (282992, 437236161), (282992, 445313545), (282992, 1193506553), (282992, 1204082141), (282992, 1225028371), (282992, 1786706653), (282992, 1796268256), (282992, 1798188652), (282992, 907134588), (282992, 909855422), (282992, 917937031), (282992, 1441602093), (282992, 1542328364), (282992, 1778608809), (282992, 860715296), (282992, 864346080), (282992, 867287651), (282992, 120877521), (282992, 227843463), (282992, 232389139), (282992, 316346808), (282992, 318543518), (282992, 322487299), (282992, 340103616), (282992, 1987380229), (282992, 1993811040), (282992, 1998841988), (282992, 2003118036), (282992, 2009327605), (282992, 2009882343), (282992, 2014033155), (282992, 675779717), (282992, 680401496), (282992, 680401677), (282992, 681640257), (282992, 684177504), (282992, 686320809), (282992, 690149979), (282992, 33082249), (282992, 130497780), (282992, 149646511), (282992, 499645985), (282992, 506220530), (282992, 503698882), (282992, 508751263), (282992, 983189140), (282992, 983212343), (282992, 985489420), (282992, 991760279), (282992, 991920605), (282992, 997407124), (282992, 1004735019), (282992, 1556496187), (282992, 1558852819), (282992, 1566512813), (282992, 1567867313), (282992, 1575275403), (282992, 1576403301), (282992, 560710255), (282992, 564635153), (282992, 576169719), (282992, 576038965), (282992, 1744423827), (282992, 1750290008), (282992, 1764221550), (282992, 1767287806), (282992, 1770620825), (282992, 1170319725), (282992, 1174962492), (282992, 902305658), (282992, 1121688638), (282992, 1125786066), (282992, 1130386322), (282992, 1137689537), (282992, 1147014465), (282992, 589569963), (282992, 595748111), (282992, 1590081674), (282992, 1593109055), (282992, 1600857751), (282992, 1603607155), (282992, 1609087998), (282992, 1614450082), (282992, 395679384), (282992, 399887047), (282992, 406047446), (282992, 402843592), (282992, 406100830), (282992, 415397114), (282992, 419057119), (282992, 418462677), (282992, 797628482), (282992, 808180777), (282992, 809857909), (282992, 2024251316), (282992, 2027115584), (282992, 2034516914), (282992, 2037315874), (282992, 2038612523), (282992, 2045674360), (282992, 2049630608), (282992, 462841266), (282992, 473764450), (282992, 482902372), (282992, 1344358957), (282992, 1345599765), (282992, 58084171), (282992, 61106243), (282992, 932190055), (282992, 929965989), (282992, 934679987), (282992, 277126723), (282992, 279720069), (282992, 277933972), (282992, 287893949), (282992, 295195884), (282992, 1059179264), (282992, 1059366283), (282992, 1064382267), (282992, 1716174230), (282992, 1522571756), (282992, 1525513618), (282992, 1525692773), (282992, 1529571099), (282992, 1450847850), (282992, 1456164393), (282992, 1754460), (282992, 3869674), (282992, 9614057), (282992, 13874393), (282992, 1393055058), (282992, 1397792638), (282992, 1397487166), (282992, 1402934344), (282992, 1411488371), (282992, 1415188041), (282992, 1420929731), (282992, 1227658113), (282992, 1307053624), (282992, 1939951520), (282992, 1950010036), (282992, 1961511934), (282992, 197789704), (282992, 198076477), (282992, 196052754), (282992, 200902747), (282992, 204329774), (282992, 220678674), (282992, 1614318414), (282992, 1624075976), (282992, 1626065956), (282992, 1627250791), (282992, 1633247809), (282992, 1631070459), (282992, 1632260828), (282992, 1785055939), (282992, 2069018885), (282992, 748987174), (282992, 746940214), (282992, 750601558), (282992, 753205069), (282992, 757041740), (282992, 773301112), (283074, 413962421), (283074, 646013336), (283074, 650629004), (283074, 654947848), (283074, 669849879), (283074, 668368900), (283074, 125393055), (283074, 35092814), (283074, 58796804), (283074, 60034698), (283074, 64083335), (283074, 852156132), (283074, 855503794), (283074, 857774819), (283074, 859603837), (283074, 869146271), (283074, 443223995), (283074, 457800440), (283074, 462039488), (283074, 467035898), (283074, 171948160), (283074, 171514785), (283074, 177208813), (283074, 180793725), (283074, 178404694), (283074, 181925388), (283074, 203366813), (283074, 982240747), (283074, 730567567), (283074, 737010345), (283074, 885060386), (283074, 892431376), (283074, 908334404), (283074, 914310650), (283074, 923121020), (283074, 922310719), (283074, 407586874), (283074, 431306664), (283074, 433649415), (283074, 242750003), (283074, 247079410), (283074, 519196350), (283074, 521143241), (283074, 528440854), (283074, 532569046), (283074, 340999735), (283074, 343509910), (283074, 482123898), (283074, 498062067), (283074, 349663342), (283074, 346793587), (283074, 824011492), (283074, 830863121), (283074, 844175588), (283074, 843152720), (283074, 149881125), (283074, 151747353), (283074, 236243179), (283074, 297881234), (283074, 302229066), (283074, 302410366), (283074, 301291543), (283074, 3232598), (283074, 19142224), (283074, 108608961), (283074, 118196938), (283074, 254543909), (283074, 394026334), (283074, 397204580), (283074, 416583891), (283074, 432311874), (283074, 431136905), (283074, 173465640), (283074, 622740088), (283074, 909917370), (283074, 87529457), (283074, 84989916), (283074, 752929218), (283074, 800821491), (283074, 808557274), (283074, 810573999), (283074, 77480842), (283074, 79556274), (283074, 83326275), (283074, 85629156), (283074, 92028977), (283074, 22186194), (283074, 27059898), (283074, 572851277), (283074, 593984818), (283074, 593259555), (283074, 603009893), (283074, 608371529), (283074, 615339862), (283074, 632894283), (283074, 170112725), (283074, 537612567), (283074, 539762853), (283074, 500072422), (283074, 512174529), (283074, 562409932), (283074, 310356627), (283074, 369753747), (283074, 377307282), (283074, 1012699693), (283074, 1015196526), (283074, 699588484), (283074, 705700940), (283074, 711679453), (283074, 959195913), (283074, 957045172), (283074, 965402006), (283074, 966620502), (283074, 261307649), (283074, 264687684), (283074, 262069609), (283074, 265477195), (283074, 265311981), (283074, 275360017), (283074, 277300892), (283074, 279910138), (283074, 785412612), (283074, 793663598), (283074, 792304498), (283074, 386056127), (283074, 390669110), (283074, 392802805), (283074, 188467611), (283074, 190702979), (283155, 255415335), (283155, 375332043), (283155, 372987828), (283155, 378054182), (283155, 390431257), (283155, 411870342), (283155, 31961439), (283155, 29825428), (283155, 66830298), (283155, 74220812), (283155, 78463673), (283155, 80000034), (283155, 81231352), (283155, 82108929), (283155, 455612776), (283155, 464364209), (283155, 466591493), (283155, 251325493), (283155, 265780702), (283155, 265392746), (283155, 60335975), (283155, 63431180), (283155, 65031520), (283155, 339776290), (283155, 351448942), (283155, 353690469), (283155, 404129905), (283155, 407734955), (283155, 2434826), (283155, 12593978), (283155, 13516481), (283155, 15581545), (283155, 19157358), (283155, 22059563), (283155, 25103385), (283155, 514586471), (283155, 210202168), (283155, 223342059), (283155, 226138675), (283155, 225543919), (283155, 326599941), (283155, 334276112), (283155, 353041192), (283155, 357697338), (283155, 127414098), (283155, 269547021), (283155, 278387638), (283155, 281383602), (283155, 482701672), (283155, 495422653), (283155, 497751094), (283155, 173310297), (283155, 179959945), (283155, 192055255), (283155, 235609940), (283155, 245767391), (283155, 411623221), (283155, 416341368), (283155, 424910220), (283155, 431784196), (283155, 441773001), (283155, 298057100), (283155, 302125674), (283155, 311379775), (283155, 35030390), (283155, 43072717), (283155, 51971999), (283155, 211406580), (283155, 92191386), (283155, 94001150), (283155, 93208800), (283155, 137685525), (283155, 141439776), (283155, 145900642), (283155, 145535911), (283155, 145537315), (283155, 150613654), (283155, 153803009), (283155, 157555819), (283155, 155743540), (283155, 159332962), (283155, 196063676), (283270, 33294235), (283270, 36192261), (283270, 59321623), (283270, 58058012), (283270, 1820228), (283270, 4498654), (283270, 3617124), (283270, 6598496), (283270, 9906075), (283270, 12351943), (283270, 137056290), (283270, 144679678), (283270, 143022586), (283270, 144968888), (283270, 100376419), (283270, 102016811), (283270, 102735375), (283270, 187178678), (283270, 194896126), (283270, 122793824), (283270, 127780643), (283270, 132087804), (283270, 198632194), (283270, 200259063), (283270, 151920098), (283270, 149356594), (283270, 164944045), (283270, 168684140), (283270, 169574492), (283270, 168198551), (283270, 90191285), (283270, 90877228), (283270, 92847189), (283270, 92446332), (283270, 60312914), (283270, 65323314), (283270, 66654094), (283270, 177425604), (283270, 186523400), (283270, 187582241), (283270, 196284164), (283270, 22527357), (283270, 24693622), (283270, 33253502), (283270, 77688725), (283270, 79011437), (283270, 83039711), (283429, 1568219006), (283429, 619115370), (283429, 625818835), (283429, 630689310), (283429, 632240653), (283429, 636723935), (283429, 641297584), (283429, 97700639), (283429, 110931576), (283429, 108211614), (283429, 109939007), (283429, 112927238), (283429, 115655026), (283429, 244485841), (283429, 247006731), (283429, 247340541), (283429, 250729503), (283429, 130985192), (283429, 136074718), (283429, 152898599), (283429, 1610875741), (283429, 1630687495), (283429, 493306414), (283429, 500716570), (283429, 1739935191), (283429, 1748348130), (283429, 1760812562), (283429, 3154832141), (283429, 3163370499), (283429, 3166626130), (283429, 432308390), (283429, 438987055), (283429, 453007110), (283429, 452746668), (283429, 4287180121), (283429, 4289714320), (283429, 4303772153), (283429, 4308246034), (283429, 3984249254), (283429, 3992442565), (283429, 4002305370), (283429, 3201252170), (283429, 3206252045), (283429, 3211497408), (283429, 3214499570), (283429, 779193563), (283429, 789613734), (283429, 791578685), (283429, 791560253), (283429, 793497821), (283429, 975012959), (283429, 985822987), (283429, 994827429), (283429, 889160859), (283429, 930426329), (283429, 931856983), (283429, 946405503), (283429, 959435798), (283429, 961840220), (283429, 962030017), (283429, 2565172596), (283429, 2566373514), (283429, 2570815020), (283429, 1092410746), (283429, 3832416470), (283429, 3832095668), (283429, 3834350993), (283429, 3835111780), (283429, 3834325054), (283429, 3843068920), (283429, 3846943720), (283429, 3844826725), (283429, 3850130737), (283429, 3854984852), (283429, 3899905144), (283429, 3902255541), (283429, 3902406164), (283429, 3903956539), (283429, 3910264546), (283429, 919575980), (283429, 927166860), (283429, 1138765052), (283429, 1142429272), (283429, 1146786562), (283429, 1148515735), (283429, 4319779759), (283429, 3250899224), (283429, 3262843742), (283429, 2965553285), (283429, 2977648409), (283429, 2980144403), (283429, 2983755714), (283429, 3045583763), (283429, 191432685), (283429, 203409887), (283429, 205793440), (283429, 203941339), (283429, 2041283869), (283429, 2050026896), (283429, 2054795990), (283429, 2063988991), (283429, 2067288657), (283429, 2071331679), (283429, 2077565655), (283429, 3658909047), (283429, 3658563341), (283429, 1854549429), (283429, 710988344), (283429, 715251126), (283429, 726764622), (283429, 759171954), (283429, 764356472), (283429, 765851778), (283429, 767728949), (283429, 771439619), (283429, 769829729), (283429, 4025323188), (283429, 4024244068), (283429, 4029368436), (283429, 4040229899), (283429, 4041097666), (283429, 4040389161), (283429, 3720369363), (283429, 3858160171), (283429, 3856484892), (283429, 3862943273), (283429, 3874003074), (283429, 3880790472), (283429, 4376574550), (283429, 4382553006), (283429, 3617300603), (283429, 4051947625), (283429, 4064107769), (283429, 4062204931), (283429, 4065520608), (283429, 4067188391), (283429, 4072878367), (283429, 4076825505), (283429, 4081293443), (283429, 3460567151), (283429, 3462075389), (283429, 3465467335), (283429, 3468422260), (283429, 3472653911), (283429, 3475164236), (283429, 29863443), (283429, 36912675), (283429, 558569517), (283429, 570456916), (283429, 567782100), (283429, 3775156959), (283429, 3777512506), (283429, 3789189626), (283429, 1691485510), (283429, 1701962439), (283429, 1705665608), (283429, 167359932), (283429, 165676008), (283429, 172673772), (283429, 1497078368), (283429, 1497461720), (283429, 1499296873), (283429, 3368399226), (283429, 3369511102), (283429, 3370455364), (283429, 3377644708), (283429, 3380450858), (283429, 3389047231), (283429, 3390071769), (283429, 3091100277), (283429, 3099868561), (283429, 3108629569), (283429, 3113014176), (283429, 3113073679), (283429, 2589713617), (283429, 2596702142), (283429, 2602444722), (283429, 2602098431), (283429, 2600529493), (283429, 2606581332), (283429, 2712151929), (283429, 2715080532), (283429, 2719123793), (283429, 2721256348), (283429, 2724216377), (283429, 2725514909), (283429, 2798374229), (283429, 2134419828), (283429, 2149066396), (283429, 2154109300), (283429, 2158705712), (283429, 2170931364), (283429, 1411251880), (283429, 1960933562), (283429, 1973709523), (283429, 1974079176), (283429, 296045908), (283429, 296357193), (283429, 297523875), (283429, 301525545), (283429, 302105104), (283429, 305746143), (283429, 305493606), (283429, 3275801214), (283429, 3278435582), (283429, 3299159541), (283429, 1001056843), (283429, 1018867418), (283429, 1024295603), (283429, 1032296511), (283429, 214343518), (283429, 226772014), (283429, 361253582), (283429, 363078983), (283429, 367517457), (283429, 370318809), (283429, 673886676), (283429, 679351213), (283429, 679978717), (283429, 679730532), (283429, 681304456), (283429, 685193626), (283429, 687066592), (283429, 688427583), (283429, 3505588038), (283429, 3510530848), (283429, 3512779320), (283429, 3514463952), (283429, 3517901017), (283429, 3532020390), (283429, 745052602), (283429, 754261689), (283429, 760669830), (283429, 43262327), (283429, 47486802), (283429, 56229484), (283429, 54836344), (283429, 60530253), (283429, 57905552), (283429, 1422277783), (283429, 1923742587), (283429, 1954595987), (283429, 190690269), (283429, 189780618), (283429, 230196771), (283429, 231338891), (283429, 2645719604), (283429, 2649828905), (283429, 2662413856), (283429, 2666023662), (283429, 2670419257), (283429, 2673593832), (283429, 2080849777), (283429, 2078573315), (283429, 1594744936), (283429, 3538737879), (283429, 3551290031), (283429, 3555061094), (283429, 3555837313), (283429, 3559905432), (283429, 3567206309), (283429, 1672817258), (283429, 3683952589), (283429, 3689518027), (283429, 3701752323), (283429, 3707488220), (283429, 3712909476), (283429, 2322124907), (283429, 2324677768), (283429, 2331267540), (283429, 2807247984), (283429, 2807823212), (283429, 2805910454), (283429, 2824178115), (283429, 321312843), (283429, 326932750), (283429, 328995004), (283429, 334318321), (283429, 1428487157), (283429, 1431543265), (283429, 1430371235), (283429, 1444619042), (283429, 1448204477), (283429, 1451549730), (283429, 1452257562), (283429, 1458434832), (283429, 2478349822), (283429, 3924890130), (283429, 3927361733), (283429, 3939657121), (283429, 273590802), (283429, 278833118), (283429, 279751057), (283429, 282731641), (283429, 283168232), (283429, 1893054343), (283429, 1907078338), (283429, 1905490517), (283429, 1906339863), (283429, 1289025873), (283429, 873832655), (283429, 880604991), (283429, 1785672245), (283429, 1793004654), (283429, 403679302), (283429, 1542179329), (283429, 1545147684), (283429, 3396333867), (283429, 3404253778), (283429, 2457503578), (283429, 2460940619), (283429, 2467411411), (283429, 2468851110), (283429, 2467614009), (283429, 3028259758), (283429, 3339249463), (283429, 1874233061), (283429, 4333055508), (283429, 4345902245), (283429, 4353011335), (283429, 4360234404), (283429, 4359784933), (283429, 2259226438), (283429, 2265174467), (283429, 2265505835), (283429, 2268586840), (283429, 2281706051), (283429, 2285086152), (283429, 2288554919), (283429, 1777389605), (283429, 1774499522), (283429, 1783805170), (283429, 1262083256), (283429, 1001418601), (283429, 2109819049), (283429, 2111498696), (283429, 2121797053), (283429, 1470407735), (283429, 1472927198), (283429, 1474612726), (283429, 1473282681), (283429, 2862578531), (283429, 2861251935), (283429, 2868557501), (283429, 2872669265), (283429, 2877049740), (283429, 2292211727), (283429, 2296247868), (283429, 2296837506), (283429, 2492528996), (283429, 2492997104), (283429, 2493706220), (283429, 2501355218), (283429, 2804685501), (283429, 2514477542), (283429, 1042922326), (283429, 519055607), (283429, 520801387), (283429, 521233569), (283429, 528342675), (283429, 533443923), (283429, 534892139), (283429, 1338715098), (283429, 1341227525), (283429, 1345933502), (283429, 1347572381), (283429, 1350628719), (283429, 1353750201), (283429, 1710451591), (283429, 1712457222), (283429, 1714267360), (283429, 1725472193), (283429, 1731691979), (283429, 1203632208), (283429, 1255479864), (283429, 2168165121), (283429, 387232267), (283429, 385696011), (283429, 469139851), (283429, 470252232), (283429, 476014765), (283429, 473119260), (283429, 478765328), (283429, 483913232), (283429, 2222485530), (283429, 2226167441), (283429, 2227436004), (283429, 2241407046), (283429, 660386328), (283429, 667238559), (283429, 670704258), (283429, 1641788340), (283429, 1648356349), (283429, 1652779083), (283429, 1650961418), (283429, 1653088121), (283429, 1654780636), (283429, 4119344671), (283429, 4122529634), (283429, 4120936515), (283429, 4126424447), (283429, 4139856975), (283429, 4145084929), (283429, 4149114126), (283429, 837859816), (283429, 847065940), (283429, 1301737586), (283429, 1302326650), (283429, 1302356172), (283429, 1303174246), (283429, 1309077525), (283429, 2177602759), (283429, 2185680487), (283429, 2204205931), (283429, 2206742965), (283429, 4094774025), (283429, 3061607704), (283429, 3069835072), (283429, 3073394332), (283429, 504770333), (283429, 508533816), (283429, 508791938), (283429, 509846159), (283429, 515007267), (283429, 514419073), (283429, 2377780619), (283429, 2380812873), (283429, 2383699803), (283429, 578385949), (283429, 587274544), (283429, 594567488), (283429, 599439862), (283429, 606280065), (283429, 3807815327), (283429, 3808711099), (283429, 3818027379), (283429, 3828974950), (283429, 3450044180), (283429, 571929234), (283429, 1085283746), (283429, 3888795367), (283429, 3952584570), (283429, 3959814402), (283429, 3969734607), (283429, 3973943845), (283429, 3973087613), (283429, 2247302053), (283429, 2248557476), (283429, 2300072786), (283429, 2300474375), (283429, 2306265719), (283429, 2309074071), (283429, 2616834008), (283429, 2626664227), (283429, 2635374872), (283429, 614899326), (283429, 1982551741), (283429, 1985809357), (283429, 1993294074), (283429, 2001454718), (283429, 1998281606), (283429, 2006147523), (283429, 1119270326), (283429, 1116497310), (283429, 1124415366), (283429, 1127072185), (283429, 1127605030), (283429, 1153630855), (283429, 4242479524), (283429, 4243012845), (283429, 4254037800), (283429, 4260292556), (283429, 2924571602), (283429, 2929287436), (283429, 2943703779), (283429, 2947551678), (283429, 2948633892), (283429, 2959332695), (283429, 2690802429), (283429, 2752070992), (283429, 3537345202), (283429, 3725899743), (283429, 3728313248), (283429, 3730635520), (283429, 3745033277), (283429, 3408085420), (283429, 3420104884), (283429, 3425693670), (283429, 3425930013), (283429, 3432953454), (283429, 3431631450), (283429, 3439455866), (283429, 1318435491), (283429, 1326788884), (283429, 1327516212), (283429, 3594906738), (283429, 3595153036), (283429, 1812929456), (283429, 1822408863), (283429, 1824967979), (283429, 1219879484), (283429, 1228982280), (283429, 1233393258), (283429, 1237024743), (283429, 1236247156), (283429, 1241669258), (283429, 64812095), (283429, 66543092), (283429, 67551797), (283429, 66413539), (283429, 461288363), (283429, 2009703357), (283429, 2013785421), (283429, 2014166506), (283429, 2013259179), (283429, 2033368422), (283429, 2406979974), (283429, 2426140270), (283429, 2423371590), (283429, 346552488), (283429, 350441743), (283429, 415905704), (283429, 423017570), (283429, 421244554), (283429, 425692996), (283429, 883661690), (283429, 1080451873), (283429, 1358857561), (283429, 2996639550), (283429, 3000465308), (283429, 3010114648), (283429, 3012836552), (283429, 3018374053), (283429, 3021384870), (283429, 5961771), (283429, 7253149), (283429, 15570795), (283429, 20154264), (283429, 19685710), (283429, 2842231648), (283429, 2841058576), (283429, 4267295154), (283429, 4279255345), (283429, 4279523644), (283429, 822228323), (283429, 835374236), (283429, 836791829), (283429, 2433749393), (283429, 2433775635), (283429, 2437613859), (283429, 2536502620), (283429, 2536232272), (283429, 2537859565), (283429, 2539502626), (283429, 2541082686), (283429, 2542905291), (283429, 2559536502), (283429, 314350829), (283429, 316107436), (283429, 316588549), (283429, 542406971), (283429, 549310005), (283429, 695567037), (283429, 695914374), (283429, 654093188), (283429, 652490083), (283429, 1157082497), (283429, 1399981608), (283429, 1402190633), (283429, 2886327653), (283429, 4190755807), (283429, 4194329473), (283429, 4200790959), (283429, 4204458339), (283429, 4206272332), (283429, 4206862755), (283429, 4215249761), (283429, 2889419075), (283429, 2896761969), (283429, 2911371579), (283429, 2914552420), (283429, 2916047563), (283429, 957062010), (283429, 734935200), (283429, 3173693858), (283429, 3175532695), (283429, 1522124357), (283429, 1523460241), (283429, 1528911699), (283429, 1529058807), (283429, 897799768), (283429, 898802791), (283429, 4155624346), (283429, 4155148108), (283429, 4159769626), (283429, 4162755704), (283429, 4176942076), (283429, 1371282786), (283429, 1418982615), (283429, 1421516753), (283429, 1943542253), (283429, 1948627460), (283429, 1954787433), (283429, 2761394969), (283429, 2762686314), (283429, 2769748038), (283429, 2777190725), (283429, 2782265861), (283429, 2785600722), (283429, 2784289792), (283429, 2789001055), (283429, 3121953603), (283429, 3132074200), (283429, 3193668384), (283429, 1166414802), (283429, 1169639766), (283429, 1188221585), (283608, 230783744), (283608, 239120681), (283608, 244556602), (283608, 245127400), (283608, 254812251), (283608, 260653310), (283608, 263593060), (283608, 509147330), (283608, 513195901), (283608, 512519793), (283608, 512920303), (283608, 440327782), (283608, 442097325), (283608, 503332057), (283608, 506002791), (283608, 519204763), (283608, 526172034), (283608, 526906545), (283608, 526309772), (283608, 531087861), (283608, 531327937), (283608, 86694374), (283608, 139624232), (283608, 142637908), (283608, 143402327), (283608, 156079832), (283608, 91017438), (283608, 97869609), (283608, 7998489), (283608, 12545393), (283608, 20408461), (283608, 353533622), (283608, 358208870), (283608, 330302665), (283608, 351007207), (283608, 294067137), (283608, 308433261), (283608, 313174940), (283608, 200218740), (283608, 179229333), (283608, 180751046), (283608, 197792416), (283608, 205988942), (283608, 445070852), (283608, 453810671), (283608, 459220233), (283608, 458220275), (283608, 464005501), (283608, 465958375), (283608, 39049180), (283608, 432052906), (283608, 437520149), (283608, 368252592), (283608, 369502190), (283608, 375358455), (283608, 375223072), (283608, 390435260), (283608, 393478393), (283608, 400421189), (283608, 267903407), (283608, 282507624), (283608, 279479526), (283608, 286907351), (283608, 287740302), (283608, 57071810), (283608, 64244341), (283780, 2389418545), (283780, 28009081), (283780, 191658792), (283780, 194849381), (283780, 196520440), (283780, 1732702970), (283780, 1735762915), (283780, 1738639519), (283780, 1738566216), (283780, 1741967934), (283780, 1750105019), (283780, 1754961006), (283780, 2473543519), (283780, 2473238267), (283780, 2475920584), (283780, 2480374821), (283780, 2488887403), (283780, 2492904095), (283780, 1980444067), (283780, 2001285396), (283780, 666381247), (283780, 681726046), (283780, 870341786), (283780, 888241480), (283780, 890397823), (283780, 893810944), (283780, 897326713), (283780, 2592392602), (283780, 2593442590), (283780, 1475295752), (283780, 1490157740), (283780, 1766657750), (283780, 1767902629), (283780, 756541389), (283780, 2429751212), (283780, 2439695784), (283780, 2449299932), (283780, 1540374071), (283780, 1544802210), (283780, 1549059206), (283780, 1555537208), (283780, 1557739082), (283780, 1576574168), (283780, 87380767), (283780, 94421099), (283780, 94267745), (283780, 94013898), (283780, 93712366), (283780, 203593948), (283780, 200794822), (283780, 202143006), (283780, 200617064), (283780, 518499697), (283780, 523768529), (283780, 527229904), (283780, 539121182), (283780, 550748883), (283780, 101195958), (283780, 101114770), (283780, 113006728), (283780, 118639609), (283780, 119785217), (283780, 66498980), (283780, 178345882), (283780, 183485709), (283780, 188512535), (283780, 188231490), (283780, 192173081), (283780, 267637627), (283780, 268589354), (283780, 274706595), (283780, 909703008), (283780, 915453821), (283780, 916106931), (283780, 925637478), (283780, 927148118), (283780, 2559556325), (283780, 2560941638), (283780, 2564836329), (283780, 2569654623), (283780, 2577886435), (283780, 2580783140), (283780, 2585614566), (283780, 683605023), (283780, 690324781), (283780, 693584166), (283780, 693798728), (283780, 704970432), (283780, 712078159), (283780, 462491199), (283780, 466406477), (283780, 2060908403), (283780, 2065311306), (283780, 2064701836), (283780, 2065116793), (283780, 2066788725), (283780, 2074812482), (283780, 2078130199), (283780, 1798676518), (283780, 1803046616), (283780, 1806081477), (283780, 1810961794), (283780, 2081946655), (283780, 2085798792), (283780, 2086252833), (283780, 2089007488), (283780, 2105972603), (283780, 335850785), (283780, 339057435), (283780, 362461147), (283780, 1159189132), (283780, 1174241368), (283780, 2640124660), (283780, 2656177358), (283780, 1307206757), (283780, 1319035095), (283780, 1324452253), (283780, 1328281889), (283780, 1813885580), (283780, 1813087153), (283780, 1816847846), (283780, 1817770651), (283780, 1827150122), (283780, 1832411756), (283780, 1833135460), (283780, 1838248947), (283780, 2227986045), (283780, 2325080513), (283780, 2332034094), (283780, 2342562554), (283780, 2345096226), (283780, 1261531439), (283780, 1262267161), (283780, 1273815327), (283780, 1278486261), (283780, 624842914), (283780, 625806004), (283780, 1210657936), (283780, 1215226405), (283780, 1682158759), (283780, 778636133), (283780, 787952516), (283780, 794582438), (283780, 797603977), (283780, 800125939), (283780, 801178696), (283780, 70339459), (283780, 72918714), (283780, 81177742), (283780, 947703349), (283780, 944533894), (283780, 947775060), (283780, 1949173296), (283780, 1970982743), (283780, 2016113982), (283780, 2020137235), (283780, 1443173386), (283780, 1441467169), (283780, 1446104021), (283780, 1465269725), (283780, 980624575), (283780, 167077117), (283780, 167942542), (283780, 170778703), (283780, 174821602), (283780, 175411168), (283780, 423543200), (283780, 125366642), (283780, 131626974), (283780, 130830560), (283780, 138180340), (283780, 137367979), (283780, 150694550), (283780, 153786298), (283780, 2512586540), (283780, 2524472090), (283780, 2527868926), (283780, 2535640341), (283780, 2540419530), (283780, 2541213497), (283780, 2011896347), (283780, 2167833401), (283780, 2177677325), (283780, 2177571279), (283780, 2177777889), (283780, 294112986), (283780, 296777171), (283780, 309087957), (283780, 321578367), (283780, 1551516628), (283780, 1184485916), (283780, 1187992259), (283780, 1196136542), (283780, 1201973266), (283780, 1201865724), (283780, 1201652453), (283780, 1204194690), (283780, 366288685), (283780, 371749209), (283780, 375025974), (283780, 1893398603), (283780, 1906300657), (283780, 2131634042), (283780, 2130601760), (283780, 1723482573), (283780, 278900477), (283780, 276772331), (283780, 278375880), (283780, 278598264), (283780, 277804952), (283780, 284895231), (283780, 1349601584), (283780, 1917417743), (283780, 1922090608), (283780, 1934009008), (283780, 1937945821), (283780, 713280368), (283780, 710652837), (283780, 712073305), (283780, 711925887), (283780, 716176501), (283780, 640444013), (283780, 641566258), (283780, 656692670), (283780, 657959463), (283780, 1096977121), (283780, 959120376), (283780, 963191151), (283780, 974035270), (283780, 2136852538), (283780, 2137232889), (283780, 2139344055), (283780, 2149883111), (283780, 2150701838), (283780, 2155749019), (283780, 2157986043), (283780, 2157803510), (283780, 2161916971), (283780, 2181816970), (283780, 1147340365), (283780, 2555328674), (283780, 214925692), (283780, 223394056), (283780, 228985953), (283780, 231734345), (283780, 433996420), (283780, 441772719), (283780, 2506326511), (283780, 2504372931), (283780, 2505965436), (283780, 2611794178), (283780, 2610209177), (283780, 2610224800), (283780, 2613386559), (283780, 2627639784), (283780, 2628918998), (283780, 242193950), (283780, 245617995), (283780, 1676712722), (283780, 1681959398), (283780, 2198292342), (283780, 2199122076), (283780, 2203598539), (283780, 2214621793), (283780, 2216512407), (283780, 2217276294), (283780, 1337563838), (283780, 1344795319), (283780, 1592639869), (283780, 1598505674), (283780, 1626606125), (283780, 1632334217), (283780, 1636690402), (283780, 1644280110), (283780, 840059628), (283780, 837957595), (283780, 847287470), (283780, 850167259), (283780, 862347651), (283780, 1124607559), (283780, 40703269), (283780, 42144692), (283780, 47064959), (283780, 58802565), (283780, 1000820332), (283780, 1005507327), (283780, 1022012948), (283780, 2030214240), (283780, 2032921083), (283780, 2031141562), (283780, 2034390837), (283780, 2043384183), (283780, 2260271400), (283780, 2263863548), (283780, 2265385358), (283780, 2267194299), (283780, 2275651235), (283780, 1511697999), (283780, 1516395116), (283780, 1514350463), (283780, 1516077804), (283780, 1516705249), (283780, 1525092040), (283780, 471603232), (283780, 476536608), (283780, 478746421), (283780, 480245180), (283780, 489490534), (283780, 1392487382), (283780, 1391001400), (283780, 1421206703), (283780, 1418910954), (283780, 816902186), (283780, 819762850), (283780, 929733252), (283780, 1032048497), (283780, 1030836837), (283780, 1033851455), (283780, 1039767810), (283780, 1428638986), (283780, 1430539731), (283780, 1433719557), (283780, 1867185570), (283780, 1881959481), (283780, 1885858424), (283780, 587840111), (283780, 594571853), (283780, 555628283), (283780, 557704755), (283780, 559757094), (283780, 559443685), (283780, 560485210), (283780, 565472909), (283780, 566390509), (283780, 570652920), (283780, 573791047), (283780, 575706251), (283780, 582163072), (283780, 2611963), (283780, 11621285), (283780, 19923734), (283780, 20256596), (283780, 1692454048), (283780, 1695134225), (283780, 1711084634), (283780, 2116353620), (283780, 2115408099), (283780, 2233994159), (283780, 1231802205), (283780, 1233779000), (283780, 1236898248), (283780, 1241120162), (283780, 1248855254), (283780, 1248866990), (283780, 1248967062), (283780, 1252879432), (283780, 1254543462), (283780, 1284687687), (283780, 1295453648), (283780, 1454180886), (283780, 1454542896), (283780, 393485075), (283780, 404971466), (283780, 412873908), (283780, 2279327546), (283780, 2283223237), (283780, 2291565405), (283780, 2296369487), (283780, 2304991561), (283780, 2689449856), (283780, 2705644699), (283780, 499926895), (283780, 496867991), (283780, 502360914), (283780, 500911892), (283780, 504619674), (283780, 509026410), (283780, 721694409), (283780, 722228482), (283780, 730763053), (283780, 730407119), (283780, 733067966), (283780, 735734366), (283780, 754309425), (283780, 2347958665), (283780, 2350581063), (283780, 2351638644), (283780, 2362030202), (283780, 2414096269), (283780, 1050821159), (283780, 1070263713), (283780, 1067610995), (283780, 1071037144), (284006, 547467726), (284006, 551678576), (284006, 562474153), (284006, 482550001), (284006, 490335078), (284006, 490380894), (284006, 388693677), (284006, 392481712), (284006, 221470687), (284006, 224004348), (284006, 223182147), (284006, 294049599), (284006, 297777910), (284006, 325269803), (284006, 333315135), (284006, 334464904), (284006, 336685123), (284006, 337517456), (284006, 350995421), (284006, 354386329), (284006, 367319026), (284006, 373431697), (284006, 439628616), (284006, 440826245), (284006, 287486456), (284006, 87053704), (284006, 89564068), (284006, 31423737), (284006, 82541878), (284006, 193712914), (284006, 206720357), (284006, 402174009), (284006, 405852427), (284006, 454568805), (284006, 459900774), (284006, 472992658), (284006, 227729968), (284006, 245664248), (284006, 246780181), (284006, 129348968), (284006, 262994884), (284006, 268278540), (284006, 272426846), (284006, 273884444), (284006, 275749711), (284006, 285142502), (284006, 101949741), (284006, 112817621), (284006, 113703124), (284006, 115957948), (284006, 123558845), (284006, 416212700), (284006, 419612781), (284006, 420537648), (284006, 429008488), (284006, 431237040), (284006, 438671941), (284006, 572128834), (284006, 138975822), (284006, 151464467), (284006, 153547703), (284006, 255011554), (284006, 301449277), (284006, 304466281), (284006, 309018135), (284006, 312361133), (284006, 323905136), (284006, 327109167), (284006, 2507151), (284006, 8951810), (284006, 19745678), (284006, 16718185), (284006, 404857501), (284006, 524854343), (284006, 524941222), (284006, 529811290), (284006, 530631320), (284006, 539109071), (284006, 509183751), (284006, 517428436), (284006, 517163850), (284006, 518717918), (284006, 519646797), (284006, 519921691), (284006, 69879289), (284006, 38259632), (284006, 44562677), (284006, 42498766), (284006, 47992703), (284006, 164165371), (284154, 118872765), (284154, 176033671), (284154, 184498941), (284154, 194771443), (284154, 89448633), (284154, 90793231), (284154, 93561245), (284154, 95065424), (284154, 102194480), (284154, 111600155), (284154, 112664111), (284154, 204961698), (284154, 122551501), (284154, 10738450), (284154, 13391783), (284154, 21136264), (284154, 22166811), (284154, 24148803), (284154, 33512236), (284154, 35596347), (284154, 55499495), (284154, 62796697), (284154, 70056781), (284154, 73333358), (284154, 157090375), (284154, 161570733), (284154, 80410022), (284213, 2606549963), (284213, 2276654185), (284213, 2277706332), (284213, 2286971971), (284213, 2295547574), (284213, 2302765330), (284213, 2306642894), (284213, 2308651219), (284213, 2306812235), (284213, 3485630881), (284213, 3488042797), (284213, 3488473902), (284213, 3496552410), (284213, 3497015333), (284213, 161366075), (284213, 169333189), (284213, 177711062), (284213, 176660591), (284213, 176462288), (284213, 183551120), (284213, 775356331), (284213, 1638401664), (284213, 1638239326), (284213, 1642948162), (284213, 1770110875), (284213, 756486209), (284213, 755944412), (284213, 197457357), (284213, 201242364), (284213, 209829421), (284213, 211954641), (284213, 217331043), (284213, 816562833), (284213, 817245216), (284213, 825591829), (284213, 829317684), (284213, 833765414), (284213, 2271290498), (284213, 2273679633), (284213, 2336497150), (284213, 2358777375), (284213, 431235053), (284213, 430445619), (284213, 435764435), (284213, 444119788), (284213, 3236401728), (284213, 3258893429), (284213, 2770340214), (284213, 2775857500), (284213, 1450535116), (284213, 1453273502), (284213, 1457713244), (284213, 1471968761), (284213, 456287316), (284213, 461086024), (284213, 2260188263), (284213, 1216797577), (284213, 1225019345), (284213, 2110975544), (284213, 224202608), (284213, 228528965), (284213, 234267578), (284213, 243892848), (284213, 1585778210), (284213, 1588032339), (284213, 1594221239), (284213, 1595725922), (284213, 1596725322), (284213, 1597926091), (284213, 1604140042), (284213, 1609071327), (284213, 1610967920), (284213, 3139326081), (284213, 3155376172), (284213, 1022918607), (284213, 1025812928), (284213, 1029213266), (284213, 1028629248), (284213, 1031297703), (284213, 1048455982), (284213, 1048308565), (284213, 1047110291), (284213, 1801074890), (284213, 1354669192), (284213, 739568956), (284213, 736444338), (284213, 740441336), (284213, 9950375), (284213, 686410117), (284213, 687929212), (284213, 685471606), (284213, 695479982), (284213, 695532799), (284213, 698080792), (284213, 698415354), (284213, 701584122), (284213, 1345672615), (284213, 1344029112), (284213, 1234617838), (284213, 1240343170), (284213, 1245626229), (284213, 1251812467), (284213, 1258927258), (284213, 1261343971), (284213, 1262138938), (284213, 554874455), (284213, 566210271), (284213, 565987259), (284213, 566592442), (284213, 775495685), (284213, 778732256), (284213, 641074443), (284213, 1853502392), (284213, 1879639644), (284213, 1894007530), (284213, 3271279683), (284213, 3269925104), (284213, 3273185788), (284213, 1121569975), (284213, 1128287072), (284213, 1132110496), (284213, 1313825574), (284213, 3501517600), (284213, 1910966591), (284213, 2123721424), (284213, 2135842288), (284213, 2137791888), (284213, 96085946), (284213, 93968203), (284213, 99021698), (284213, 103830977), (284213, 121958939), (284213, 2720583567), (284213, 2730905826), (284213, 2729906588), (284213, 2731258883), (284213, 25276021), (284213, 30417830), (284213, 1081666837), (284213, 1084979045), (284213, 1085685073), (284213, 1085096455), (284213, 1087157447), (284213, 1094923389), (284213, 1097144130), (284213, 1101010024), (284213, 1104889370), (284213, 1534056902), (284213, 1550024149), (284213, 1558894621), (284213, 1698641955), (284213, 1697681182), (284213, 1716250135), (284213, 1718925344), (284213, 3312227123), (284213, 1738931975), (284213, 1749326068), (284213, 1749676909), (284213, 1757705807), (284213, 67410408), (284213, 70630496), (284213, 79710282), (284213, 88454298), (284213, 91407137), (284213, 3432368048), (284213, 3433851309), (284213, 3444665554), (284213, 3463460830), (284213, 2065843643), (284213, 2069615288), (284213, 3186691218), (284213, 3188244614), (284213, 3190335306), (284213, 3200464265), (284213, 2175372848), (284213, 2175610165), (284213, 2181108142), (284213, 2183068865), (284213, 384981185), (284213, 387234161), (284213, 390564195), (284213, 2793097905), (284213, 2799730338), (284213, 2801711746), (284213, 2799754430), (284213, 786171537), (284213, 786772490), (284213, 793695698), (284213, 710863241), (284213, 718531316), (284213, 722559334), (284213, 726712477), (284213, 353496124), (284213, 359697195), (284213, 365980010), (284213, 364977299), (284213, 366390662), (284213, 369775249), (284213, 371705696), (284213, 371487930), (284213, 1300673862), (284213, 1302920029), (284213, 1305115410), (284213, 1308070884), (284213, 2612523651), (284213, 1672767284), (284213, 1674106771), (284213, 1678919907), (284213, 1735662568), (284213, 1736007654), (284213, 2039327191), (284213, 468287250), (284213, 476467816), (284213, 481115908), (284213, 481876228), (284213, 482867313), (284213, 996700729), (284213, 1001851002), (284213, 1983583940), (284213, 3357123421), (284213, 3362172364), (284213, 3370054303), (284213, 3373779500), (284213, 3391707702), (284213, 2999361153), (284213, 3005816400), (284213, 3010025478), (284213, 3017691907), (284213, 3024846380), (284213, 3025810159), (284213, 1207916736), (284213, 1210734874), (284213, 1211754435), (284213, 1224664176), (284213, 1226199720), (284213, 1504789272), (284213, 2877522955), (284213, 2878097645), (284213, 2892618455), (284213, 2898979796), (284213, 2899684644), (284213, 2902315954), (284213, 2903169247), (284213, 42622525), (284213, 56875864), (284213, 39584793), (284213, 1511479390), (284213, 1510741119), (284213, 1513295575), (284213, 1517043476), (284213, 1814691648), (284213, 1831719074), (284213, 1837360057), (284213, 1840844655), (284213, 1766707786), (284213, 902989701), (284213, 903139394), (284213, 912954696), (284213, 282412784), (284213, 293917263), (284213, 2586927043), (284213, 2594588885), (284213, 2598125179), (284213, 305547779), (284213, 307647315), (284213, 310341155), (284213, 308399028), (284213, 315763570), (284213, 2843480046), (284213, 2848725654), (284213, 1899466452), (284213, 1931630267), (284213, 1939721032), (284213, 2386668945), (284213, 2391680804), (284213, 2413422871), (284213, 2464548470), (284213, 2465838953), (284213, 2470837500), (284213, 3103992386), (284213, 3108707150), (284213, 3109338684), (284213, 3111344203), (284213, 3113559447), (284213, 3113585460), (284213, 3115969872), (284213, 1730411716), (284213, 934560603), (284213, 934839849), (284213, 2905006637), (284213, 798220406), (284213, 800561272), (284213, 803956925), (284213, 806281954), (284213, 2191434612), (284213, 2203582262), (284213, 2206933352), (284213, 2215721478), (284213, 2696622867), (284213, 2711396820), (284213, 647077947), (284213, 653774603), (284213, 655316990), (284213, 656210261), (284213, 666696055), (284213, 665528855), (284213, 1425091763), (284213, 1427010267), (284213, 1436816986), (284213, 1436797622), (284213, 1448274506), (284213, 2317049073), (284213, 2316554442), (284213, 2316924858), (284213, 2567742438), (284213, 2567006163), (284213, 2568693926), (284213, 2573036291), (284213, 332578253), (284213, 334044542), (284213, 345433908), (284213, 349465433), (284213, 2235740668), (284213, 2244165631), (284213, 2647111137), (284213, 2650973235), (284213, 975868321), (284213, 981776138), (284213, 979674987), (284213, 981320944), (284213, 983595299), (284213, 984059739), (284213, 995080581), (284213, 625778886), (284213, 623866736), (284213, 625583464), (284213, 633268604), (284213, 1389739537), (284213, 1388553366), (284213, 1391019625), (284213, 1396718751), (284213, 1394760673), (284213, 1398610271), (284213, 1408709526), (284213, 500310924), (284213, 498205888), (284213, 574434814), (284213, 584855001), (284213, 1105987561), (284213, 1114648432), (284213, 1117405575), (284213, 2928015088), (284213, 2932139153), (284213, 2935288766), (284213, 2938112897), (284213, 2941744172), (284213, 2984159901), (284213, 2997606908), (284213, 501507395), (284213, 522353923), (284213, 524311113), (284213, 2086425481), (284213, 2094647486), (284213, 2380410384), (284213, 2388017732), (284213, 2390807157), (284213, 2392572796), (284213, 2397448856), (284213, 2402817219), (284213, 672684760), (284213, 674422456), (284213, 675705732), (284213, 1166864542), (284213, 1168384105), (284213, 1172616222), (284213, 1177053841), (284213, 2857704267), (284213, 2860156392), (284213, 3133868033), (284213, 842912415), (284213, 845729824), (284213, 847735869), (284213, 848131180), (284213, 851221300), (284213, 848892871), (284213, 862737896), (284213, 862373344), (284213, 867108788), (284213, 866900082), (284213, 399733055), (284213, 401023824), (284213, 403759791), (284213, 419429605), (284213, 879029316), (284213, 880653112), (284213, 964712207), (284213, 963464908), (284213, 965402442), (284213, 2666532800), (284213, 2675664909), (284213, 2956618577), (284213, 2956096229), (284213, 2957230547), (284213, 2978196333), (284213, 2982848406), (284213, 2987711258), (284213, 1056790181), (284213, 1064798193), (284213, 1068344400), (284213, 1072086543), (284213, 1479048429), (284213, 1481912426), (284213, 1486627824), (284213, 1491003737), (284213, 3298940250), (284213, 3305100658), (284213, 3304874012), (284213, 257138038), (284213, 269380629), (284213, 269447122), (284213, 2451735455), (284213, 2453370443), (284213, 2454781871), (284213, 2459004425), (284213, 2461094050), (284213, 2461354873), (284213, 1991806967), (284213, 1992493177), (284213, 1997982451), (284213, 2017590410), (284213, 1961056397), (284213, 2030673698), (284213, 2235771176), (284213, 534892205), (284213, 535496537), (284213, 532721516), (284213, 542074990), (284213, 541216907), (284213, 2139219001), (284213, 2140697723), (284213, 2152611294), (284213, 2155071486), (284213, 3071435983), (284213, 3073026980), (284213, 3075073338), (284213, 3079557207), (284213, 3096852034), (284213, 591796204), (284213, 602052293), (284213, 614017823), (284213, 2523653102), (284213, 2525756416), (284213, 2534316767), (284213, 1274953341), (284213, 1280769001), (284213, 2732339188), (284213, 2736832576), (284213, 2740906500), (284213, 2749247061), (284213, 2757394890), (284213, 2759989486), (284213, 2761843277), (284213, 151478930), (284213, 148062450), (284213, 151967530), (284213, 3201855770), (284213, 3202886134), (284213, 3206581251), (284213, 3209039845), (284213, 1332296226), (284213, 189927044), (284213, 1161319334), (284213, 1149974756), (284213, 1565266922), (284213, 1483389682), (284213, 1488539374), (284213, 2268288138), (284213, 2350713619), (284213, 2359810706), (284213, 2372213644), (284213, 1656560630), (284213, 919374493), (284213, 922927368), (284213, 3029701978), (284213, 3052338941), (284213, 137377857), (284213, 141026521), (284213, 2415574441), (284213, 2420218534), (284213, 2418552965), (284213, 2420025714), (284213, 2422775870), (284213, 2428675502), (284213, 2430308838), (284213, 2438740898), (284213, 2504297820), (284213, 2503211326), (284213, 2506610545), (284213, 2605055627), (284213, 2612396396), (284213, 2621904503), (284213, 3394543455), (284213, 3409964405), (284213, 3411589506), (284213, 3418729672), (284213, 2224899284), (284213, 2231689989), (284213, 1848894038), (284213, 1852114871), (284213, 2131863387), (284285, 33636635), (284285, 38918853), (284285, 207492014), (284285, 211105414), (284285, 209106001), (284285, 3143395864), (284285, 3145473019), (284285, 3142672197), (284285, 3155672659), (284285, 3159725898), (284285, 3176674767), (284285, 289970618), (284285, 293436195), (284285, 295551209), (284285, 301354985), (284285, 2035802185), (284285, 2040048200), (284285, 2041046794), (284285, 2043145379), (284285, 3297108619), (284285, 3303926356), (284285, 2274703655), (284285, 2277048543), (284285, 1055039111), (284285, 1060993406), (284285, 1064710980), (284285, 1634400284), (284285, 1318769950), (284285, 1323925394), (284285, 1496090057), (284285, 1499018814), (284285, 1502656421), (284285, 1507985474), (284285, 2088236582), (284285, 2391859388), (284285, 2528689805), (284285, 2531981691), (284285, 965426172), (284285, 985220014), (284285, 982609611), (284285, 1975185812), (284285, 1981802885), (284285, 1981728817), (284285, 1988449684), (284285, 1336050263), (284285, 1341048289), (284285, 1342572231), (284285, 1346029309), (284285, 1347730150), (284285, 1352460232), (284285, 1356522892), (284285, 1360273610), (284285, 2319781514), (284285, 2339487592), (284285, 2347412184), (284285, 499284505), (284285, 511307700), (284285, 511659385), (284285, 515075587), (284285, 518058934), (284285, 520115069), (284285, 4427480685), (284285, 4427214569), (284285, 4425194545), (284285, 4431674790), (284285, 994260527), (284285, 1368910955), (284285, 1367175833), (284285, 1374033876), (284285, 1386606346), (284285, 1384656211), (284285, 1388721050), (284285, 2988973121), (284285, 3539747618), (284285, 3539948481), (284285, 3543847957), (284285, 3549235811), (284285, 3557730189), (284285, 3561061238), (284285, 3562357872), (284285, 3736526628), (284285, 3899225877), (284285, 999722262), (284285, 999639892), (284285, 1004143263), (284285, 1008291274), (284285, 1009068788), (284285, 1014251719), (284285, 1018751664), (284285, 3851092389), (284285, 3873535558), (284285, 878678881), (284285, 877534158), (284285, 1112401192), (284285, 1113847945), (284285, 1119980367), (284285, 1119739228), (284285, 1213485460), (284285, 1212962367), (284285, 1209893812), (284285, 1210513185), (284285, 1667135505), (284285, 1677575261), (284285, 1678529787), (284285, 1679020084), (284285, 1680126507), (284285, 1682568392), (284285, 4313186893), (284285, 4313573020), (284285, 4334181927), (284285, 4343598423), (284285, 4343111497), (284285, 2475734564), (284285, 2481757675), (284285, 2488125156), (284285, 2915221137), (284285, 738665916), (284285, 741982827), (284285, 746218586), (284285, 752141300), (284285, 749366728), (284285, 3498515680), (284285, 3501962006), (284285, 3509413595), (284285, 3513463997), (284285, 3521214100), (284285, 3523923789), (284285, 3527148776), (284285, 3529424154), (284285, 4522870758), (284285, 4530531752), (284285, 4531286513), (284285, 4532704105), (284285, 4535318163), (284285, 3096931846), (284285, 3109674767), (284285, 3118643771), (284285, 3120852711), (284285, 3123163858), (284285, 318037786), (284285, 1791752), (284285, 6631312), (284285, 20343623), (284285, 24914142), (284285, 23817893), (284285, 29496117), (284285, 337960251), (284285, 339777781), (284285, 345955525), (284285, 3264329230), (284285, 3277039668), (284285, 3280522094), (284285, 3288572213), (284285, 3285459952), (284285, 3289974173), (284285, 2699486820), (284285, 2706709718), (284285, 2708450023), (284285, 2715022648), (284285, 2717134080), (284285, 2726881985), (284285, 2729471569), (284285, 2738134601), (284285, 569151765), (284285, 580055061), (284285, 589659059), (284285, 591731538), (284285, 3764654213), (284285, 3766633368), (284285, 3767776533), (284285, 3769891373), (284285, 3784015485), (284285, 3788803651), (284285, 3447301163), (284285, 3447748620), (284285, 3452792303), (284285, 3455822623), (284285, 1408782805), (284285, 1423828443), (284285, 1424526754), (284285, 1431683050), (284285, 1431554252), (284285, 1433526949), (284285, 1433966573), (284285, 1434837632), (284285, 3914706362), (284285, 3916728508), (284285, 2007264489), (284285, 2005942665), (284285, 2009769254), (284285, 2013570114), (284285, 2018725197), (284285, 2020547109), (284285, 2021933564), (284285, 2030266599), (284285, 2032450362), (284285, 263409022), (284285, 264805595), (284285, 1132984363), (284285, 1141354309), (284285, 2403181236), (284285, 2410061994), (284285, 2410581343), (284285, 2420440861), (284285, 2426118246), (284285, 2424641838), (284285, 2426852503), (284285, 2814178068), (284285, 2818715882), (284285, 2832045213), (284285, 2838340009), (284285, 2842810245), (284285, 2064669890), (284285, 2062241295), (284285, 2075547338), (284285, 2078554501), (284285, 472356237), (284285, 469880658), (284285, 471529263), (284285, 477279259), (284285, 479120967), (284285, 493123521), (284285, 494394252), (284285, 267986317), (284285, 276563131), (284285, 278691898), (284285, 1027481328), (284285, 1033005308), (284285, 1042589452), (284285, 1044480023), (284285, 1049475782), (284285, 958584594), (284285, 1064510129), (284285, 1074940088), (284285, 1075860391), (284285, 1077647874), (284285, 1080733737), (284285, 1082844284), (284285, 1083090494), (284285, 1084306108), (284285, 1880842442), (284285, 1933228445), (284285, 2447083686), (284285, 2447550855), (284285, 2451578843), (284285, 2448134399), (284285, 2449062459), (284285, 2467807740), (284285, 2467737635), (284285, 1277564030), (284285, 1281031825), (284285, 1279591708), (284285, 1283322289), (284285, 1280885026), (284285, 81715919), (284285, 89073466), (284285, 93300422), (284285, 98318393), (284285, 107274046), (284285, 108976283), (284285, 3664835635), (284285, 3992966842), (284285, 4011081818), (284285, 1514233299), (284285, 1517779743), (284285, 3888472645), (284285, 3888601315), (284285, 3891832409), (284285, 3894775501), (284285, 3894216640), (284285, 1481162541), (284285, 1481920076), (284285, 1482835779), (284285, 2677519370), (284285, 2685378112), (284285, 653960435), (284285, 652177471), (284285, 663054336), (284285, 662844404), (284285, 666231330), (284285, 666468179), (284285, 927160095), (284285, 927497797), (284285, 930770716), (284285, 940680339), (284285, 940120878), (284285, 1804778257), (284285, 1846269012), (284285, 1852121785), (284285, 1859822692), (284285, 2428680540), (284285, 2432059909), (284285, 2432274807), (284285, 2433676724), (284285, 2436907400), (284285, 114227165), (284285, 118813100), (284285, 119854869), (284285, 1236941725), (284285, 1244353619), (284285, 1247194558), (284285, 3799454738), (284285, 3804615423), (284285, 4046609616), (284285, 142479400), (284285, 145283521), (284285, 642376419), (284285, 638295840), (284285, 643955605), (284285, 4344292495), (284285, 4356839593), (284285, 4354445572), (284285, 4358443170), (284285, 4369908750), (284285, 3938661551), (284285, 3939715319), (284285, 71548953), (284285, 74549569), (284285, 880103889), (284285, 881303288), (284285, 905825136), (284285, 904061103), (284285, 3670175691), (284285, 3696469718), (284285, 2172562332), (284285, 2175297375), (284285, 179001330), (284285, 445793581), (284285, 466272300), (284285, 3715772524), (284285, 3719852500), (284285, 3733180613), (284285, 1088508975), (284285, 1145467198), (284285, 1151266404), (284285, 1808427330), (284285, 1809710763), (284285, 1812320841), (284285, 1820820115), (284285, 2095007346), (284285, 2104592507), (284285, 2103855408), (284285, 2108306080), (284285, 2109271786), (284285, 2117857285), (284285, 848447837), (284285, 856174467), (284285, 860936750), (284285, 857166302), (284285, 867527628), (284285, 789101954), (284285, 793344912), (284285, 826501817), (284285, 830422228), (284285, 2354565969), (284285, 2364296788), (284285, 2365005382), (284285, 2368317937), (284285, 2367116792), (284285, 2380688017), (284285, 2386424498), (284285, 3987338150), (284285, 3985471723), (284285, 1732140134), (284285, 1737964909), (284285, 1737269125), (284285, 2763584811), (284285, 2761699162), (284285, 2787649561), (284285, 2783757993), (284285, 221375462), (284285, 228010991), (284285, 227997239), (284285, 232023015), (284285, 237258038), (284285, 1202552334), (284285, 1205558747), (284285, 2863500526), (284285, 3189979761), (284285, 3576944315), (284285, 3582787808), (284285, 49327304), (284285, 51966999), (284285, 50991772), (284285, 56769031), (284285, 3128601358), (284285, 3473856416), (284285, 3485469945), (284285, 3488494086), (284285, 3491189660), (284285, 1303104112), (284285, 1317064589), (284285, 4476425860), (284285, 4476635023), (284285, 4474642035), (284285, 531286244), (284285, 531171042), (284285, 533538576), (284285, 2349726439), (284285, 598172167), (284285, 1590053392), (284285, 4187413855), (284285, 4187515076), (284285, 4199055247), (284285, 4205918535), (284285, 4209481820), (284285, 4210250607), (284285, 4212741169), (284285, 3218558722), (284285, 3220173293), (284285, 3234664471), (284285, 124890803), (284285, 128593653), (284285, 134192443), (284285, 4062671970), (284285, 4064068763), (284285, 4067239530), (284285, 4065582707), (284285, 4074020680), (284285, 4083839685), (284285, 2947395090), (284285, 2951352243), (284285, 2966408513), (284285, 1526185387), (284285, 1536956181), (284285, 1540881221), (284285, 1547594968), (284285, 1546480615), (284285, 1554461844), (284285, 1553990579), (284285, 1558659666), (284285, 1181186845), (284285, 1188987304), (284285, 1194215486), (284285, 1192391174), (284285, 4541157492), (284285, 4542353894), (284285, 4545060420), (284285, 4088806780), (284285, 4094638019), (284285, 4098551678), (284285, 4113883459), (284285, 2793055639), (284285, 2798678607), (284285, 2798253493), (284285, 2799388220), (284285, 4506005222), (284285, 4515308092), (284285, 4031532173), (284285, 4033464554), (284285, 4036450349), (284285, 570528019), (284285, 725296237), (284285, 728397244), (284285, 733621346), (284285, 732625064), (284285, 3954497072), (284285, 3964109543), (284285, 3964040362), (284285, 3974321805), (284285, 2543325311), (284285, 2557821913), (284285, 2570083423), (284285, 2574513368), (284285, 2574530554), (284285, 2854765782), (284285, 2495023029), (284285, 2496415031), (284285, 2508346508), (284285, 1156903442), (284285, 1158609187), (284285, 1168769728), (284285, 1178084482), (284285, 1390833349), (284285, 1397271529), (284285, 4234350388), (284285, 4242975373), (284285, 4244107018), (284285, 4246759476), (284285, 4245155105), (284285, 4255872468), (284285, 4265483715), (284285, 359861273), (284285, 356807290), (284285, 363158730), (284285, 364679871), (284285, 374267876), (284285, 374964355), (284285, 617397162), (284285, 621443034), (284285, 628517435), (284285, 632096325), (284285, 629972737), (284285, 631561557), (284285, 1453646501), (284285, 1453394389), (284285, 1454912549), (284285, 1464433830), (284285, 1467713759), (284285, 1472607900), (284285, 1474612360), (284285, 3239890293), (284285, 3245823575), (284285, 3250254587), (284285, 3319498880), (284285, 3318885122), (284285, 4144723400), (284285, 4148293515), (284285, 4161924759), (284285, 4163402479), (284285, 4164596973), (284285, 4169621121), (284285, 428299462), (284285, 430849026), (284285, 434528389), (284285, 3017881115), (284285, 3025060409), (284285, 3036538705), (284285, 4438208984), (284285, 4445776145), (284285, 4454725285), (284285, 4465041007), (284285, 2627315119), (284285, 2632630668), (284285, 3086180553), (284285, 4130015795), (284285, 4129535537), (284285, 4132903868), (284285, 4131879802), (284285, 3586448737), (284285, 3585257593), (284285, 3591548434), (284285, 3597136432), (284285, 2181819357), (284285, 2189693645), (284285, 2190834704), (284285, 2200077542), (284285, 2205325284), (284285, 1695969550), (284285, 3702035888), (284285, 3702913333), (284285, 3703273081), (284285, 3708070573), (284285, 3640486603), (284285, 3645099634), (284285, 3648292247), (284285, 3649412794), (284285, 3653604567), (284285, 3657341809), (284285, 3655532747), (284285, 2919734105), (284285, 2929949555), (284285, 2930746508), (284285, 2289473863), (284285, 2296411633), (284285, 2299771376), (284285, 2309048269), (284285, 1636202918), (284285, 1645959396), (284285, 1654379098), (284285, 1653545117), (284285, 3334753510), (284285, 3338599243), (284285, 3341062871), (284285, 3357318236), (284285, 1705198184), (284285, 2660109036), (284285, 2660604168), (284285, 2667238044), (284285, 2668818992), (284285, 3840835079), (284285, 3846328622), (284285, 3849715392), (284285, 2123245760), (284285, 2123831256), (284285, 2123358944), (284285, 2127196523), (284285, 2156623210), (284285, 2160175496), (284285, 2162830462), (284285, 680997030), (284285, 1557374534), (284285, 1562463496), (284285, 2588034839), (284285, 4291645864), (284285, 4291586639), (284285, 4288910191), (284285, 4298147467), (284285, 4303792264), (284285, 2221482201), (284285, 2230410656), (284285, 2226912354), (284285, 2232618144), (284285, 2241745500), (284285, 1611628179), (284285, 1620847371), (284285, 1619594895), (284285, 1621232047), (284285, 1624832068), (284285, 1622288958), (284285, 1628767303), (284285, 715301923), (284285, 762673007), (284285, 779440973), (284285, 537343574), (284285, 551389400), (284285, 558474796), (284285, 2181476454), (284285, 3824979784), (284285, 3829749701), (284285, 3829602784), (284285, 3832534806), (284285, 3833791484), (284285, 3835217665), (284285, 3835225258), (284285, 2316264651), (284285, 2316472662), (284285, 2604542625), (284285, 2610252456), (284285, 1936070412), (284285, 1939557644), (284285, 1955132989), (284285, 1963769478), (284285, 1962334784), (284285, 1440446284), (284285, 1441631203), (284285, 1448795376), (284285, 1575105042), (284285, 1578912544), (284285, 1583614545), (284285, 1908544073), (284285, 1918862607), (284285, 384818546), (284285, 386612138), (284285, 386157439), (284285, 410934606), (284285, 3384359403), (284285, 3397459330), (284285, 1755542416), (284285, 1758367607), (284285, 1764209356), (284285, 3565184557), (284285, 3571149500), (284285, 3577533637), (284285, 3578623768), (284285, 1633497595), (284285, 1249638545), (284285, 1249132525), (284285, 1251279641), (284285, 1254052680), (284285, 1259588595), (284285, 2891059727), (284285, 1844160455), (284285, 1893945497), (284285, 1902215134), (284285, 1902818884), (284285, 1904485161), (284285, 1903669559), (284285, 806886478), (284285, 814075225), (284285, 815490484), (284285, 826280584), (284285, 828708533), (284285, 685859801), (284285, 695523491), (284285, 3418048170), (284285, 3416611686), (284285, 3417502152), (284285, 3424208656), (284285, 3425996629), (284285, 3432660137), (284285, 3437811780), (284285, 3442885413), (284285, 4225832291), (284285, 2988724606), (284285, 2992734704), (284285, 2991656108), (284285, 3000263065), (284285, 3000813723), (284285, 3012919644), (284285, 3016312492), (284285, 1774510750), (284285, 1778605508), (284285, 1793359632), (284285, 1791786552), (284285, 3042958985), (284285, 3055930105), (284285, 3062660960), (284285, 3065496828), (284420, 539128223), (284420, 545479469), (284420, 554820629), (284420, 824935127), (284420, 115520963), (284420, 124027725), (284420, 761830354), (284420, 770327522), (284420, 779142990), (284420, 221396615), (284420, 226580476), (284420, 567764851), (284420, 702751748), (284420, 703343056), (284420, 710168965), (284420, 710255179), (284420, 706581110), (284420, 714736907), (284420, 718659675), (284420, 266449051), (284420, 268086034), (284420, 269348598), (284420, 180119365), (284420, 181342878), (284420, 182761887), (284420, 188577848), (284420, 206984651), (284420, 341077336), (284420, 346105362), (284420, 349672357), (284420, 351569065), (284420, 356238344), (284420, 362163171), (284420, 74356679), (284420, 76099347), (284420, 83312403), (284420, 83549510), (284420, 84557546), (284420, 791437469), (284420, 39331445), (284420, 42695382), (284420, 44976026), (284420, 45790626), (284420, 49614502), (284420, 49913708), (284420, 311776749), (284420, 311292049), (284420, 602319153), (284420, 605042484), (284420, 610296169), (284420, 611554790), (284420, 615690924), (284420, 837034831), (284420, 683484639), (284420, 684036108), (284420, 688983914), (284420, 686839120), (284420, 689928610), (284420, 865769334), (284420, 869910303), (284420, 879893854), (284420, 1697303), (284420, 6260834), (284420, 19294636), (284420, 486072716), (284420, 491193335), (284420, 492555496), (284420, 497392958), (284420, 210336339), (284420, 211860757), (284420, 213688846), (284420, 422387882), (284420, 424041189), (284420, 719643516), (284420, 29425048), (284420, 92082036), (284420, 96739409), (284420, 97800624), (284420, 97337893), (284420, 452800622), (284420, 456406796), (284420, 461540870), (284420, 464421590), (284420, 466737474), (284420, 473645423), (284420, 574296094), (284420, 573242421), (284420, 574026493), (284420, 577617819), (284420, 582590925), (284420, 582808247), (284420, 584193170), (284420, 588006353), (284420, 584878719), (284420, 590089264), (284420, 591146042), (284420, 595655923), (284420, 593333270), (284420, 142650498), (284420, 154649468), (284420, 158288622), (284420, 159733046), (284420, 160386284), (284420, 162780228), (284420, 736792752), (284420, 753378631), (284420, 753299727), (284420, 756595628), (284420, 320666263), (284420, 320356077), (284420, 321392648), (284420, 795253705), (284420, 795308538), (284420, 801593761), (284420, 810351015), (284420, 812264259), (284420, 816635806), (284420, 134552400), (284420, 134358313), (284420, 136596608), (284420, 138899145), (284420, 400306445), (284420, 403975414), (284420, 63106344), (284420, 637133359), (284420, 640704129), (284420, 639383097), (284420, 638221644), (284420, 640443440), (284420, 649494235), (284420, 654370201), (284420, 660451521), (284420, 433674322), (284420, 444356967), (284420, 449700597), (284420, 446825156), (284420, 237606548), (284420, 625295020), (284420, 626138552), (284420, 631776751), (284420, 634025163), (284420, 858217350), (284420, 859103533), (284420, 864868915), (284420, 285596176), (284420, 286694903), (284420, 301330657), (284420, 302938873), (284420, 305858325), (284420, 697345733), (284420, 701365521), (284420, 504050941), (284420, 502874016), (284420, 507356339), (284420, 523579699), (284420, 372479898), (284420, 374838099), (284420, 379566261), (284420, 380545961), (284420, 250187950), (284427, 392505551), (284427, 395651523), (284427, 401558190), (284427, 406646309), (284427, 409731287), (284427, 413609670), (284427, 414395604), (284427, 230838287), (284427, 418597068), (284427, 425648311), (284427, 433407176), (284427, 436905648), (284427, 435526791), (284427, 438153275), (284427, 445512213), (284427, 275044163), (284427, 273829489), (284427, 323666982), (284427, 325959511), (284427, 329028621), (284427, 329744850), (284427, 333257718), (284427, 527991808), (284427, 529145325), (284427, 531064604), (284427, 168456998), (284427, 172993232), (284427, 172574594), (284427, 175001222), (284427, 192361040), (284427, 197284137), (284427, 166785118), (284427, 235561491), (284427, 238193036), (284427, 238993558), (284427, 243002439), (284427, 449041407), (284427, 87027154), (284427, 92532393), (284427, 62101100), (284427, 67110341), (284427, 299121380), (284427, 338106066), (284427, 492081093), (284427, 123543582), (284427, 127859101), (284427, 132636482), (284427, 135808177), (284427, 384003532), (284427, 485960543), (284427, 486543570), (284427, 354893417), (284427, 358945218), (284427, 368267679), (284427, 370030262), (284427, 370658075), (284427, 521025752), (284427, 522173165), (284427, 321510001), (284427, 40621793), (284427, 49529220), (284427, 48664553), (284427, 203369931), (284427, 218126342), (284427, 220250159), (284427, 221979185), (284427, 186240430), (284427, 184852511), (284427, 185054426), (284427, 20311217), (284427, 20174496), (284427, 28935019), (284427, 33942277), (284427, 11268392), (284427, 13096636), (284427, 18423084), (284427, 93163524), (284427, 107085366), (284427, 110646694), (284427, 115464096), (284427, 457748267), (284427, 459063076), (284427, 458448322), (284427, 465382096), (284427, 472063680), (284427, 473272866), (284427, 472105785), (284427, 477176977), (284427, 133380466), (284427, 145753675), (284427, 149946247), (284427, 152458404), (284427, 157132206), (284427, 247819894), (284427, 255323953), (284427, 261286872), (276262, 12241502), (276262, 13647343), (276262, 198181590), (276262, 255004128), (276262, 191476906), (276262, 366216946), (276262, 157951929), (276262, 219513416), (276262, 7160282), (276262, 126115945), (276262, 78609439), (276262, 108109797), (276262, 404124285), (276329, 67649584), (276329, 372178767), (276329, 246999417), (276329, 250386040), (276329, 133096046), (276329, 102349619), (276329, 260927287), (276329, 112387366), (276329, 115922962), (276329, 142650297), (276329, 71039435), (276329, 76160804), (276329, 277617312), (276329, 282573830), (276329, 19659640), (276329, 19075347), (276329, 138616006), (276329, 313784553), (276329, 181000569), (276329, 186351646), (276329, 187254326), (276329, 207602715), (276329, 242427871), (276329, 287238498), (276329, 411900298), (276329, 167534390), (276329, 98972081), (276329, 304550306), (276329, 201405515), (276329, 342398721), (276329, 310320039), (276336, 21273207), (276336, 6843552), (276336, 18040781), (276336, 18758716), (276336, 19385659), (276416, 143538017), (276416, 148159084), (276416, 124106650), (276416, 125792472), (276416, 113629388), (276416, 134005896), (276416, 65624569), (276416, 28043912), (276416, 35408791), (276416, 7612513), (276416, 92938525), (276511, 159344994), (276511, 227121168), (276511, 233743915), (276511, 248005016), (276511, 249844151), (276511, 79967862), (276511, 84849641), (276511, 219365115), (276511, 147446961), (276511, 174338302), (276511, 24260973), (276511, 32926183), (276511, 266426359), (276511, 181357786), (276511, 182858171), (276511, 183801762), (276511, 1183208), (276511, 4154561), (276511, 4735843), (276511, 95688892), (276511, 103283877), (276511, 132322634), (276511, 6477457), (276511, 5920544), (276511, 107156789), (276511, 110970816), (276511, 112398479), (276511, 125207371), (276511, 129332450), (276511, 74064515), (276511, 73769311), (276511, 198957977), (276511, 199282143), (276511, 257523172), (276689, 137109697), (276689, 143074596), (276689, 148879715), (276689, 23929472), (276689, 27292496), (276689, 42023947), (276689, 198530398), (276689, 201728804), (276689, 202903111), (276689, 206101041), (276689, 85069330), (276689, 89384650), (276689, 115425020), (276689, 117237937), (276689, 172727967), (276689, 215560663), (276689, 8167397), (276689, 9680864), (276689, 261453453), (276689, 263199154), (276689, 77815761), (276689, 98684383), (276689, 103129126), (276689, 108532720), (276689, 1156290), (276689, 2640029), (276689, 57290075), (276689, 59748649), (276689, 20420693), (276689, 49207872), (276689, 164401024), (276689, 170474206), (276689, 171359319), (276689, 186780139), (276689, 192011862), (276689, 193051077), (276778, 16041787), (276790, 11276967), (276790, 12110486), (276790, 52748416), (276790, 23078325), (276790, 22495017), (276790, 34538441), (276790, 37589269), (276952, 124070203), (276952, 205579598), (276952, 11888053), (276952, 41857703), (276952, 44242529), (276952, 147258878), (276952, 152814611), (276952, 69524185), (276952, 70773235), (276952, 83921840), (276952, 218433117), (276952, 221081946), (276952, 225867095), (276952, 225466398), (276952, 181078925), (276952, 20310337), (276952, 23744446), (276954, 14574690), (278880, 210318172), (278880, 602265022), (278880, 676792095), (278880, 689755707), (278880, 146778511), (278880, 148342250), (278880, 255538473), (278880, 256393458), (278880, 286576235), (278880, 70264671), (278880, 74174619), (278880, 81445605), (278880, 94801954), (278880, 164505578), (278880, 202139538), (278880, 291210636), (278880, 170499965), (278880, 174445448), (278880, 187835224), (278880, 187910379), (278880, 188228430), (278880, 558085589), (278880, 322668008), (278880, 326402710), (278880, 374369278), (278880, 376121296), (278880, 380385214), (278880, 129786175), (278880, 133038506), (278880, 585833415), (278880, 587265014), (278880, 593009820), (278880, 470197912), (278880, 438328550), (278880, 439565190), (278880, 118180964), (278880, 262270235), (278880, 265998789), (278880, 268630374), (278880, 269180081), (278880, 343397990), (278880, 351883614), (278880, 33685726), (278880, 36588872), (278880, 53513443), (278880, 702200008), (278880, 542587395), (278880, 708878720), (278880, 713175974), (278880, 230061545), (278880, 235385490), (278880, 235517755), (278880, 248583650), (278880, 416560385), (278880, 418053900), (278880, 460066094), (278880, 526379537), (278880, 529065042), (278880, 481414837), (278880, 482487092), (278880, 17985738), (278880, 23266001), (278880, 67423146), (278880, 68561247), (278880, 664807109), (278880, 613104986), (278880, 720200839), (278880, 433085407), (278912, 9325788), (278912, 24180006), (278912, 391830323), (278912, 393428345), (278912, 395672838), (278912, 398174556), (278912, 402368383), (278912, 402248151), (278912, 446740704), (278912, 247226791), (278912, 210164111), (278912, 174301934), (278912, 444778724), (278912, 452320099), (278912, 523727655), (278912, 127070976), (278912, 129230005), (278912, 130967009), (278912, 64417832), (278912, 330690799), (278912, 344532504), (278912, 351056473), (278912, 356562325), (278912, 425889292), (278912, 440821328), (278912, 247472369), (278912, 254465819), (278912, 258958314), (278912, 266113254), (278912, 268525890), (278912, 268869947), (278912, 270704153), (278912, 87571939), (278912, 509095340), (278912, 554264734), (278912, 154518859), (278912, 162475008), (278912, 165148177), (278912, 370087212), (278912, 373296021), (278912, 377909850), (278912, 275131369), (278912, 110561647), (278912, 115742166), (278912, 218423882), (278912, 46664935), (278912, 477148808), (278912, 487054716), (278968, 165182532), (278968, 90174946), (278968, 89956812), (278968, 101489709), (278968, 102767612), (278968, 115572316), (278968, 73571144), (278968, 76769497), (278968, 155339552), (278968, 44114170), (278968, 250824132), (278968, 218357057), (278968, 219828633), (278968, 143260590), (278968, 70324804), (278968, 71490596), (278968, 11649887), (278968, 173738447), (278968, 198894682), (278968, 3659739), (278968, 2329077), (278968, 120012398), (278968, 122865406), (278968, 127440137), (278970, 15845225), (278970, 15760301), (278970, 18356759), (278970, 22424983), (278970, 6132230), (279169, 943996713), (279169, 945083670), (279169, 633433430), (279169, 643462941), (279169, 520296143), (279169, 575857015), (279169, 595636736), (279169, 1469883743), (279169, 1495023079), (279169, 438293368), (279169, 439642378), (279169, 442226342), (279169, 194302338), (279169, 201262625), (279169, 214362147), (279169, 219305303), (279169, 219891400), (279169, 919112711), (279169, 275333897), (279169, 273252362), (279169, 279551154), (279169, 1402864338), (279169, 1401821825), (279169, 1530082412), (279169, 1541038448), (279169, 377875241), (279169, 384300248), (279169, 792841748), (279169, 1447900865), (279169, 1454385855), (279169, 1457631427), (279169, 1461591590), (279169, 612607030), (279169, 1031987980), (279169, 1563254647), (279169, 171512400), (279169, 178315806), (279169, 1103410929), (279169, 1109269936), (279169, 1118067608), (279169, 1502738552), (279169, 1506590293), (279169, 1510296981), (279169, 1211088344), (279169, 1211046418), (279169, 1227526456), (279169, 1231226864), (279169, 1240810263), (279169, 1626433282), (279169, 1644149115), (279169, 1651353222), (279169, 1652072980), (279169, 74878768), (279169, 74272943), (279169, 79981385), (279169, 98877310), (279169, 99460073), (279169, 887998446), (279169, 1312869297), (279169, 1314976476), (279169, 1362180102), (279169, 301744794), (279169, 307888886), (279169, 323690739), (279169, 1246287325), (279169, 1261465613), (279169, 1266924280), (279169, 987341454), (279169, 987577577), (279169, 988458822), (279169, 707648124), (279169, 707568505), (279169, 717681383), (279169, 723981578), (279169, 481962563), (279169, 487473644), (279169, 488883027), (279169, 492009472), (279169, 493588232), (279169, 495697730), (279169, 1600602838), (279169, 1601131811), (279169, 1620265042), (279169, 1052348336), (279169, 1055573472), (279169, 1063099189), (279169, 843802936), (279169, 845268121), (279169, 852984357), (279169, 861205000), (279169, 868808229), (279169, 898947734), (279169, 915126543), (279169, 393777873), (279169, 412778817), (279169, 834609284), (279169, 836143404), (279169, 840498834), (279169, 843015382), (279169, 337210178), (279169, 340406409), (279169, 343555274), (279169, 550545934), (279169, 555766315), (279169, 679173076), (279169, 680351387), (279169, 691777525), (279169, 691072555), (279169, 701892284), (279169, 292554193), (279169, 1408623093), (279169, 1425453083), (279169, 1434103497), (279169, 223326543), (279169, 1276286341), (279169, 1386275048), (279169, 764020905), (279169, 773224456), (279169, 775604446), (279169, 656640231), (279169, 670951445), (279169, 738857915), (279169, 746714708), (279169, 10495054), (279169, 14241626), (279169, 38752459), (279169, 42158648), (279169, 56057584), (279169, 62105065), (279169, 75106139), (279169, 104712796), (279169, 110649292), (279169, 1157924659), (279169, 1157392517), (279169, 1163371091), (279169, 1175355814), (279169, 1173940835), (279169, 1325159713), (279169, 964857934), (279169, 974587831), (279169, 981256056), (279169, 255320225), (279169, 1142754619), (279169, 20613346), (279169, 22695063), (279169, 22325424), (279169, 27853806), (279169, 27346911), (279169, 1585273614), (279169, 1593711986), (279169, 117668500), (279169, 129461531), (279169, 153607428), (279169, 157204853), (279169, 446801433), (279169, 455096017), (279169, 456322832), (279259, 7382766), (279259, 189538654), (279259, 102973716), (279259, 101874907), (279259, 132973056), (279259, 138363059), (279259, 80747505), (279259, 84429720), (279259, 85725926), (279259, 87470015), (279259, 109137471), (279259, 121163788), (279259, 127555797), (279259, 127082625), (279259, 127666691), (279259, 131478932), (279259, 10070234), (279259, 13036249), (279259, 164655706), (279259, 30998749), (279259, 50182595), (279279, 157765700), (279279, 168431568), (279279, 169652815), (279279, 67409918), (279279, 85068026), (279279, 85127053), (279279, 290268491), (279279, 299528243), (279279, 299566094), (279279, 302116573), (279279, 307050736), (279279, 309944889), (279279, 447787237), (279279, 453259422), (279279, 483013239), (279279, 485476237), (279279, 486723062), (279279, 126953859), (279279, 126802184), (279279, 254565509), (279279, 410226903), (279279, 412237714), (279279, 415017426), (279279, 419043534), (279279, 433225859), (279279, 37607554), (279279, 40198656), (279279, 41247657), (279279, 41110764), (279279, 43339592), (279279, 177409592), (279279, 2092291), (279279, 2820861), (279279, 398014464), (279279, 109275223), (279279, 221870318), (279279, 223467366), (279279, 224901359), (279279, 227022877), (279279, 228353326), (279279, 237957054), (279279, 10109417), (279279, 13987633), (279279, 96812330), (279279, 364090925), (279279, 363952307), (279279, 270819332), (279279, 274604367), (279279, 282865118), (279279, 285082097), (279279, 285292483), (279279, 368048886), (279279, 373448746), (279279, 384438338), (279279, 145606367), (279279, 154558799), (279284, 28905365), (279284, 130411483), (279284, 136143656), (279284, 829015000), (279284, 835342939), (279284, 837716724), (279284, 837366208), (279284, 394256920), (279284, 415461541), (279284, 2233942), (279284, 5383290), (279284, 4962413), (279284, 460276836), (279284, 607205529), (279284, 612988048), (279284, 501138096), (279284, 502913949), (279284, 761425665), (279284, 801288658), (279284, 711776478), (279284, 654380441), (279284, 687703411), (279284, 484577148), (279284, 514082039), (279284, 514885483), (279284, 280743447), (279284, 282317355), (279284, 283789373), (279284, 294779317), (279284, 296376533), (279284, 154051371), (279284, 155181782), (279284, 743942311), (279284, 59447991), (279284, 68941988), (279284, 73656051), (279284, 77895813), (279284, 83709286), (279284, 344485613), (279284, 352887723), (279284, 433393828), (279284, 574089358), (279284, 577247890), (279284, 587648267), (279284, 589509722), (279284, 537429716), (279284, 48378100), (279284, 52885094), (279284, 854511572), (279284, 862036119), (279284, 238168122), (279284, 635300126), (279284, 639849600), (279284, 669783559), (279284, 671430320), (279284, 679269563), (279284, 248397464), (279284, 248662417), (279284, 251367153), (279284, 269248448), (279284, 272268398), (279284, 85331968), (279284, 89642837), (279284, 177128897), (279284, 185555331), (279284, 191882785), (279284, 447640716), (279284, 472040355), (279284, 473125716), (279284, 476588693), (279284, 311601042), (279284, 331197293), (279284, 372210446), (279284, 544739342), (279284, 547223675), (279284, 562957561), (279284, 213125379), (279284, 219938554), (279284, 232966410), (279345, 520602143), (279345, 288259752), (279345, 287864601), (279345, 299122084), (279345, 172001233), (279345, 174561880), (279345, 868237357), (279345, 871382796), (279345, 409098444), (279345, 415021297), (279345, 425620990), (279345, 986389970), (279345, 988615034), (279345, 436533637), (279345, 438627316), (279345, 495882386), (279345, 501744769), (279345, 1035190249), (279345, 353160612), (279345, 352651640), (279345, 355025669), (279345, 362343899), (279345, 387977378), (279345, 391534047), (279345, 140224469), (279345, 142067599), (279345, 240762906), (279345, 239642198), (279345, 598401438), (279345, 833596648), (279345, 836382436), (279345, 839222405), (279345, 855322438), (279345, 855083629), (279345, 854708266), (279345, 854585572), (279345, 1212650394), (279345, 538114794), (279345, 540618998), (279345, 738298753), (279345, 745585855), (279345, 771636157), (279345, 959810044), (279345, 230122533), (279345, 232017519), (279345, 235776182), (279345, 243152325), (279345, 163235851), (279345, 211866800), (279345, 1070785781), (279345, 1072388432), (279345, 1074858200), (279345, 1074108987), (279345, 1076452646), (279345, 1076024173), (279345, 1080436445), (279345, 1080239910), (279345, 559910786), (279345, 822683782), (279345, 1288844147), (279345, 1287915007), (279345, 217003404), (279345, 226238055), (279345, 304060822), (279345, 286949721), (279345, 5123407), (279345, 721857512), (279345, 785702676), (279345, 88352598), (279345, 1270445702), (279345, 271977692), (279345, 885256205), (279345, 891679622), (279345, 943499700), (279345, 946809273), (279345, 664254380), (279345, 670608593), (279345, 110996821), (279345, 112071858), (279345, 115874894), (279345, 128839186), (279345, 1014928454), (279345, 362828182), (279345, 708545744), (279345, 726001340), (279345, 902047367), (279345, 908118968), (279345, 911886178), (279345, 922167447), (279345, 785822161), (279345, 935610164), (279345, 1224224035), (279345, 345742201), (279345, 1105239291), (279345, 1162661409), (279345, 1170563502), (279345, 618487713), (279345, 994488043), (279345, 996787419), (279345, 1009472954), (279345, 1067422589), (279345, 1318184448), (279345, 1321398967), (279345, 1325145992), (279345, 1326432358), (279345, 1327204644), (279345, 1344880322), (279345, 95625492), (279345, 96220242), (279345, 1210248345), (279345, 1327837723), (279345, 1335034130), (279345, 1334771383), (279345, 632480228), (279345, 635028969), (279345, 636606307), (279345, 638759437), (279345, 447501400), (279345, 449630229), (279345, 467888331), (279345, 468707961), (279345, 471549014), (279345, 929791657), (279345, 318807004), (279345, 317523398), (279345, 319990672), (279345, 323366206), (279345, 8164514), (279345, 11556745), (279345, 16486019), (279345, 18358344), (279345, 45118043), (279345, 46521827), (279345, 815036794), (279345, 30445828), (279515, 3962434), (279515, 6025764), (279598, 1388891327), (279598, 1394176644), (279598, 1402783909), (279598, 1414448132), (279598, 973620427), (279598, 979595015), (279598, 1357688820), (279598, 1367718704), (279598, 1295010706), (279598, 1325608057), (279598, 1325292726), (279598, 1331886192), (279598, 1333373735), (279598, 968291813), (279598, 778914918), (279598, 791411562), (279598, 792167092), (279598, 793569288), (279598, 802113884), (279598, 374698810), (279598, 1087649368), (279598, 1086700195), (279598, 1099884791), (279598, 1100165415), (279598, 166600860), (279598, 183119109), (279598, 189322469), (279598, 574322297), (279598, 1476144889), (279598, 1480949682), (279598, 1495046331), (279598, 318291690), (279598, 325819776), (279598, 325662467), (279598, 330550056), (279598, 330805523), (279598, 337870049), (279598, 1168991694), (279598, 1462950863), (279598, 1472530964), (279598, 46900118), (279598, 50172613), (279598, 134367249), (279598, 135152816), (279598, 138378804), (279598, 139400399), (279598, 143550149), (279598, 636050899), (279598, 640113663), (279598, 645427167), (279598, 654528034), (279598, 188545455), (279598, 195185261), (279598, 226348599), (279598, 228384923), (279598, 690706845), (279598, 694306428), (279598, 706586806), (279598, 274219499), (279598, 280547611), (279598, 385199347), (279598, 393248273), (279598, 462195139), (279598, 447756374), (279598, 452728423), (279598, 65573096), (279598, 77298165), (279598, 144551097), (279598, 154392977), (279598, 751497185), (279598, 766523514), (279598, 766040455), (279598, 459560248), (279598, 1037949989), (279598, 1045713975), (279598, 230240202), (279598, 232625906), (279598, 243269391), (279598, 242906848), (279598, 983813384), (279598, 57268567), (279598, 75977588), (279598, 85810638), (279598, 946421835), (279598, 948621510), (279598, 884694866), (279598, 1137834059), (279598, 103977647), (279598, 114269921), (279598, 112714572), (279598, 621897976), (279598, 624834907), (279598, 624080216), (279598, 626422330), (279598, 627832560), (279598, 630342724), (279598, 1235398562), (279598, 1237488346), (279598, 1239492690), (279598, 1283427434), (279598, 1384764421), (279598, 515633192), (279598, 529583548), (279598, 1207920667), (279598, 1209120259), (279598, 1216893537), (279598, 1228972019), (279598, 1227261582), (279598, 666698134), (279598, 671396538), (279598, 677029107), (279598, 1112966914), (279598, 1114815598), (279598, 1175389910), (279598, 1177181779), (279598, 1178599861), (279598, 1183212184), (279598, 1185121044), (279598, 1187097618), (279598, 1253293190), (279598, 1254691608), (279598, 1258902383), (279598, 1342732987), (279598, 1348632307), (279598, 202102884), (279598, 206321910), (279598, 735859214), (279598, 736132092), (279598, 917868637), (279598, 920180716), (279598, 985622816), (279598, 994793323), (279598, 997881402), (279598, 999419684), (279598, 857365954), (279598, 856326326), (279598, 1145231627), (279598, 1149974331), (279598, 1154115475), (279598, 1189717883), (279598, 1197191331), (279598, 1198249657), (279598, 850139548), (279598, 853681341), (279598, 866434381), (279598, 876900879), (279598, 892730309), (279598, 898433744), (279598, 902822367), (279598, 905176377), (279598, 1418666154), (279598, 1417706379), (279598, 1446180251), (279598, 1447516086), (279598, 1452474604), (279598, 720949184), (279598, 1502027023), (279598, 1503190290), (279598, 1502430080), (279598, 1510860539), (279598, 551627349), (279598, 601203267), (279598, 602094181), (279598, 314197678), (279598, 925078528), (279598, 929238548), (279598, 935507622), (279598, 9198293), (279598, 11441207), (279598, 13672638), (279598, 1561732067), (279598, 1561952673), (279598, 1565191883), (279598, 432956996), (279598, 433448327), (279598, 437574148), (279598, 288344344), (279598, 1555272155), (279598, 350407838), (279598, 352028446), (279598, 358330446), (279598, 527123760), (279598, 527808485), (279598, 589276780), (279598, 1616503410), (279598, 1616885503), (279598, 1543088721), (279598, 1590951544), (279598, 1593452632), (279598, 1600151675), (279598, 1004261079), (279598, 1002572312), (279598, 1006881782), (279598, 1010589620), (279598, 1014570747), (279598, 1015903907), (279598, 1624740973), (279598, 1643829316), (279685, 569724665), (279685, 902029287), (279685, 906221432), (279685, 905353716), (279685, 908822177), (279685, 1587215741), (279685, 102225689), (279685, 111265479), (279685, 112437604), (279685, 117232487), (279685, 170008812), (279685, 173618549), (279685, 172685200), (279685, 548219355), (279685, 548775161), (279685, 551082383), (279685, 572228553), (279685, 584895490), (279685, 859593162), (279685, 1019141524), (279685, 1041391686), (279685, 1043945604), (279685, 75254343), (279685, 82429255), (279685, 90451060), (279685, 98910890), (279685, 308173810), (279685, 307481942), (279685, 1077573297), (279685, 1079943156), (279685, 994915396), (279685, 1058293500), (279685, 1059691471), (279685, 1060524274), (279685, 1084232152), (279685, 1085663679), (279685, 757468064), (279685, 758660432), (279685, 1449718623), (279685, 1449419797), (279685, 1448800734), (279685, 1458862243), (279685, 931230941), (279685, 1787373449), (279685, 1273019788), (279685, 1623723627), (279685, 1627345414), (279685, 1665215377), (279685, 941561732), (279685, 945808152), (279685, 952069422), (279685, 959386543), (279685, 957489617), (279685, 960091593), (279685, 601199047), (279685, 610366173), (279685, 632813454), (279685, 1825441210), (279685, 1826135061), (279685, 447177602), (279685, 450784276), (279685, 1114561661), (279685, 1145965756), (279685, 1301362874), (279685, 1305530278), (279685, 744120151), (279685, 1479609626), (279685, 1481369452), (279685, 1487977743), (279685, 1486709793), (279685, 1493011696), (279685, 222575576), (279685, 225567252), (279685, 230102870), (279685, 1498853), (279685, 3354467), (279685, 1101776168), (279685, 46448084), (279685, 54285602), (279685, 58410530), (279685, 1182376397), (279685, 1240387257), (279685, 1496184362), (279685, 1817476143), (279685, 648076843), (279685, 651304603), (279685, 660023662), (279685, 659626008), (279685, 66462959), (279685, 68135525), (279685, 26480868), (279685, 497932998), (279685, 178592801), (279685, 179247331), (279685, 1692021026), (279685, 1698150911), (279685, 1717769174), (279685, 1795794646), (279685, 1810537926), (279685, 463073158), (279685, 467817677), (279685, 470133770), (279685, 476165445), (279685, 478420692), (279685, 484119678), (279685, 1474311126), (279685, 252408862), (279685, 616175955), (279685, 615044725), (279685, 617188215), (279685, 710888398), (279685, 717128856), (279685, 1824722195), (279685, 1828119641), (279685, 255853864), (279685, 157159798), (279685, 185747999), (279685, 185578178), (279685, 187779327), (279685, 1216555452), (279685, 1744754317), (279685, 1747211832), (279685, 1748341060), (279685, 1753005273), (279685, 402618250), (279685, 404631466), (279685, 119795507), (279685, 120091061), (279685, 211043904), (279685, 1171421202), (279685, 134159756), (279685, 141460532), (279685, 147255417), (279685, 155870083), (279685, 378532264), (279685, 665461073), (279685, 667677456), (279685, 671112770), (279685, 672741895), (279685, 696755721), (279685, 695307543), (279685, 697244349), (279685, 701432480), (279685, 706392932), (279685, 796806157), (279685, 806779151), (279685, 1546891437), (279685, 1549430039), (279685, 1550267182), (279685, 1552145210), (279685, 1553505171), (279685, 1559780666), (279685, 1562932412), (279685, 1573740582), (279685, 1575135572), (279685, 1576802830), (279685, 967514807), (279685, 967681480), (279685, 973546702), (279685, 973249481), (279685, 528038554), (279685, 1222927166), (279685, 1225955645), (279685, 1154233143), (279685, 841042729), (279685, 845988910), (279685, 847464153), (279685, 847679312), (279685, 897288539), (279685, 1259574788), (279685, 327324918), (279685, 350271855), (279685, 353883987), (279685, 1682320978), (279685, 1727605776), (279685, 1732050788), (279685, 1734545390), (279685, 777495529), (279685, 785254618), (279685, 916319792), (279685, 926937122), (279685, 598508746), (279685, 679806409), (279685, 687090831), (279685, 1372152899), (279685, 1377678026), (279685, 1386934868), (279685, 1389046709), (279685, 1397343325), (279685, 1338092042), (279685, 1339637549), (279685, 1600116897), (279685, 1607910084), (279685, 1610191079), (279685, 1611562685), (279685, 1617446423), (279685, 1364914813), (279685, 771342809), (279685, 770222271), (279685, 769856136), (279685, 1759463409), (279685, 1758881557), (279685, 1770512895), (279685, 1770039305), (279764, 5819788), (279764, 147785766), (279764, 40232410), (279813, 616466172), (279813, 619809037), (279813, 635457094), (279813, 642836718), (279813, 97955957), (279813, 102338113), (279813, 107652008), (279813, 106361232), (279813, 120228827), (279813, 299404856), (279813, 303064762), (279813, 128018090), (279813, 130202428), (279813, 130015733), (279813, 139140794), (279813, 140139893), (279813, 146724224), (279813, 43947930), (279813, 45549576), (279813, 52577520), (279813, 3658787), (279813, 5210712), (279813, 1154321916), (279813, 1158790717), (279813, 1159090290), (279813, 1165572770), (279813, 754406947), (279813, 756800398), (279813, 761144976), (279813, 768822871), (279813, 853840890), (279813, 211655354), (279813, 221445554), (279813, 222492549), (279813, 789441169), (279813, 791778110), (279813, 797592164), (279813, 440447256), (279813, 444048352), (279813, 447706527), (279813, 451702099), (279813, 460232356), (279813, 461352233), (279813, 464634867), (279813, 646372100), (279813, 647978944), (279813, 654188675), (279813, 405800339), (279813, 409339907), (279813, 410688911), (279813, 1068596105), (279813, 1102506220), (279813, 1115180157), (279813, 333100810), (279813, 332941516), (279813, 682743143), (279813, 681445084), (279813, 701309533), (279813, 702546536), (279813, 707476487), (279813, 484253053), (279813, 559204132), (279813, 559137019), (279813, 563071462), (279813, 576910951), (279813, 971824075), (279813, 160199615), (279813, 163499359), (279813, 168546333), (279813, 1178568495), (279813, 1215922757), (279813, 1226590420), (279813, 1235865797), (279813, 1197688367), (279813, 1205015713), (279813, 1242594781), (279813, 1245317384), (279813, 998085516), (279813, 369482646), (279813, 498844966), (279813, 388459936), (279813, 391427043), (279813, 870999559), (279813, 880378200), (279813, 249523725), (279813, 260842731), (279813, 15368714), (279813, 24934870), (279813, 26265330), (279813, 985775743), (279813, 1030903032), (279813, 1100057814), (279813, 720370499), (279813, 1125950845), (279813, 1135480408), (279813, 1148403014), (279813, 174172890), (279813, 188787273), (279813, 198702267), (279813, 261175451), (279813, 265130671), (279813, 281487612), (279813, 279948829), (279813, 280070287), (279813, 287516402), (279813, 1033632667), (279813, 1037311167), (279813, 1050859949), (279813, 1054815393), (279813, 1055943910), (279813, 887283232), (279813, 886117066), (279813, 895690048), (279813, 904706566), (279813, 907326665), (279813, 803716262), (279813, 816588518), (279813, 64799420), (279813, 68953861), (279813, 69378380), (279813, 85998116), (279813, 930068729), (279813, 931303409), (279867, 276462710), (279867, 283478093), (279867, 40374415), (279867, 48205478), (279867, 57832404), (279867, 220727668), (279867, 225201413), (279867, 230083828), (279867, 234090186), (279867, 238214821), (279867, 152315704), (279867, 173150219), (279867, 552916125), (279867, 553492391), (279867, 578475797), (279867, 576636245), (279867, 584246967), (279867, 587806044), (279867, 593262754), (279867, 251156171), (279867, 254720060), (279867, 256562575), (279867, 260388389), (279867, 656092326), (279867, 662938194), (279867, 375865760), (279867, 382566734), (279867, 384262353), (279867, 391137986), (279867, 397526232), (279867, 397540041), (279867, 400144067), (279867, 404250675), (279867, 404098489), (279867, 71976189), (279867, 79482015), (279867, 79330119), (279867, 119159109), (279867, 131839848), (279867, 132829782), (279867, 420847658), (279867, 435767466), (279867, 437218546), (279867, 439333394), (279867, 445515368), (279867, 448633490), (279867, 298901939), (279867, 298322683), (279867, 301192556), (279867, 305637241), (279867, 321738423), (279867, 565324594), (279867, 198556976), (279867, 200365902), (279867, 507533248), (279867, 506970520), (279867, 539183937), (279867, 523629106), (279867, 527358731), (279867, 102905619), (279867, 110790455), (279867, 607416904), (279867, 636596608), (279867, 637566889), (279867, 650399144), (279867, 481990882), (279867, 406846348), (279867, 413020649), (279867, 414061437), (279867, 464538507), (279867, 470960911), (279867, 377607978), (279867, 330766943), (279867, 336013625), (279867, 347635818), (279867, 15012112), (279867, 30367924), (279928, 7904736), (279928, 9543411), (279928, 12132872), (279928, 10267765), (279928, 13923914), (279932, 998123955), (279932, 364772005), (279932, 994715156), (279932, 1005236149), (279932, 1025399141), (279932, 468459692), (279932, 475890612), (279932, 480958467), (279932, 482504840), (279932, 756247031), (279932, 781018138), (279932, 779002166), (279932, 8599822), (279932, 11297069), (279932, 13758917), (279932, 18341275), (279932, 23782059), (279932, 32004457), (279932, 42835472), (279932, 57139278), (279932, 61398373), (279932, 655807898), (279932, 656157158), (279932, 669401622), (279932, 670162684), (279932, 683482319), (279932, 483179039), (279932, 487609186), (279932, 529394225), (279932, 533504637), (279932, 534178827), (279932, 817866564), (279932, 816951913), (279932, 818753917), (279932, 819868781), (279932, 837041074), (279932, 537387934), (279932, 539808166), (279932, 789532614), (279932, 789657845), (279932, 808591363), (279932, 942574028), (279932, 955031554), (279932, 967752540), (279932, 975385966), (279932, 984086477), (279932, 713773421), (279932, 717300387), (279932, 324553947), (279932, 334270094), (279932, 335402320), (279932, 335293482), (279932, 342731578), (279932, 343360308), (279932, 346826503), (279932, 108413293), (279932, 111805388), (279932, 113513911), (279932, 587004807), (279932, 589257352), (279932, 589655067), (279932, 598241304), (279932, 645215674), (279932, 648275647), (279932, 650544540), (279932, 650704969), (279932, 612999477), (279932, 624961067), (279932, 624870367), (279932, 289855172), (279932, 298845396), (279932, 382890312), (279932, 384772370), (279932, 394903722), (279932, 403247539), (279932, 407152872), (279932, 504185577), (279932, 509093509), (279932, 508082245), (279932, 511656679), (279932, 521597703), (279932, 522413971), (279932, 914749114), (279932, 932025556), (279932, 198622212), (279932, 204366335), (279932, 244685199), (279932, 244026524), (279932, 244238860), (279932, 266770046), (279932, 282178729), (279932, 215396000), (279932, 231451835), (279932, 237463069), (279932, 244724002), (279932, 428678783), (279932, 355284109), (279932, 357576354), (279932, 377540805), (279932, 164032909), (279932, 694033901), (279932, 717728719), (279932, 719205259), (279932, 721348777), (279932, 723676165), (279932, 725029952), (279932, 728355726), (279932, 126115705), (279932, 137736437), (279932, 146822795), (279932, 149518335), (279932, 170531949), (279932, 174834997), (279932, 172400430), (279932, 181016157), (279932, 184914053), (279932, 897126465), (279932, 944327392), (279932, 944128650), (279932, 968702873), (279932, 735075940), (279932, 863481189), (279932, 870290007), (279932, 880476512), (279932, 882826003), (279932, 430969735), (279932, 436899787), (279932, 438809167), (279932, 441542389), (279932, 448622663), (279932, 449855856), (279932, 315692580), (279932, 319865821), (279932, 324410202), (279984, 203574371), (279984, 209494295), (279984, 226576929), (279984, 704677185), (279984, 725065273), (279984, 1439950282), (279984, 1467346953), (279984, 132238512), (279984, 431702444), (279984, 438988933), (279984, 441301622), (279984, 286135090), (279984, 296404412), (279984, 660624978), (279984, 662480441), (279984, 668485621), (279984, 696383882), (279984, 871248035), (279984, 1374875253), (279984, 566194111), (279984, 567007312), (279984, 574983306), (279984, 576866499), (279984, 1021322692), (279984, 177530616), (279984, 183527026), (279984, 184583254), (279984, 1111779127), (279984, 1121587255), (279984, 1127647502), (279984, 1133875712), (279984, 1342363616), (279984, 1346473479), (279984, 1348345553), (279984, 1351367224), (279984, 1356393695), (279984, 1357845360), (279984, 1360145796), (279984, 1478546588), (279984, 1479723233), (279984, 1479556604), (279984, 612588484), (279984, 621139315), (279984, 638134633), (279984, 649232536), (279984, 651233229), (279984, 632328323), (279984, 635344308), (279984, 377026438), (279984, 1294597823), (279984, 1295812372), (279984, 1300422864), (279984, 1318499940), (279984, 1391311353), (279984, 1395298056), (279984, 1403930012), (279984, 910584338), (279984, 915779140), (279984, 918777379), (279984, 1053399407), (279984, 1055807660), (279984, 89828430), (279984, 91910483), (279984, 104113253), (279984, 115354325), (279984, 1171798273), (279984, 1175375807), (279984, 1176891721), (279984, 1179008859), (279984, 1183606039), (279984, 1143860751), (279984, 1148604631), (279984, 1149254523), (279984, 1159875136), (279984, 1231063345), (279984, 820536378), (279984, 820836378), (279984, 824599473), (279984, 826173615), (279984, 830614230), (279984, 837218918), (279984, 12778623), (279984, 466189416), (279984, 471202313), (279984, 586104960), (279984, 598971757), (279984, 980040724), (279984, 1075070408), (279984, 1076778676), (279984, 1096572243), (279984, 1097230136), (279984, 796893590), (279984, 803375607), (279984, 807804261), (279984, 818481701), (279984, 238278996), (279984, 244367499), (279984, 242452118), (279984, 1259816663), (279984, 1272290835), (279984, 1277090444), (279984, 1277682507), (279984, 163377331), (279984, 194595648), (279984, 194918883), (279984, 539118309), (279984, 548242271), (279984, 128843345), (279984, 502122075), (279984, 511562984), (279984, 512742536), (279984, 512165378), (279984, 523680108), (279984, 525423661), (279984, 1199110775), (279984, 1219873554), (279984, 328987017), (279984, 341031913), (279984, 356654933), (279984, 1411309100), (279984, 1419513519), (279984, 1433269542), (279984, 1441285496), (279984, 25077169), (279984, 27537063), (279984, 32563160), (279984, 39885749), (279984, 305895209), (279984, 309206165), (279984, 308155401), (279984, 322667967), (279984, 1002613611), (279984, 1012315666), (279984, 1015736657), (279984, 395391978), (279984, 399735682), (279984, 1067305476), (279984, 1072074541), (279984, 61881584), (279984, 66529886), (279984, 774111109), (279984, 776114527), (279984, 784425595), (279984, 677779731), (279984, 682195540), (279984, 743171650), (279984, 743165336), (279984, 749235945), (279984, 415868084), (279984, 415447915), (279984, 56984747), (279984, 58416632), (279984, 60491232), (279984, 123743894), (279984, 127103528), (279984, 473768215), (279984, 488222088), (279984, 500081545), (279984, 274552281), (279984, 341306171), (279984, 345399690), (279984, 346526187), (279984, 154874931), (279984, 152774031), (279984, 927028121), (279984, 941866077), (279984, 942073042), (279984, 940069951), (280231, 2173299266), (280231, 2212872429), (280231, 2216552214), (280231, 1449968217), (280231, 1527271497), (280231, 1534504071), (280231, 1541691770), (280231, 1545610057), (280231, 1552437414), (280231, 2233292561), (280231, 2237120544), (280231, 2237811313), (280231, 2246005121), (280231, 369689579), (280231, 367543760), (280231, 1458179665), (280231, 1474698197), (280231, 1482665388), (280231, 1156069677), (280231, 1157252005), (280231, 1158855586), (280231, 1164197770), (280231, 1180553520), (280231, 1180765527), (280231, 793501146), (280231, 1667479009), (280231, 1676573399), (280231, 1687565918), (280231, 1692799960), (280231, 1698406588), (280231, 1697220415), (280231, 2044826238), (280231, 971849653), (280231, 1002395450), (280231, 1013068944), (280231, 945670592), (280231, 953019147), (280231, 1260055395), (280231, 1263800365), (280231, 1268507030), (280231, 1269911400), (280231, 1273571681), (280231, 1278011838), (280231, 38558870), (280231, 40878906), (280231, 61455973), (280231, 66713800), (280231, 1339192349), (280231, 1344392823), (280231, 217745065), (280231, 227728751), (280231, 231636765), (280231, 235466307), (280231, 2012570930), (280231, 2016636496), (280231, 671510359), (280231, 434101590), (280231, 443192737), (280231, 450134377), (280231, 459055082), (280231, 460538315), (280231, 1973708885), (280231, 1980187692), (280231, 855957288), (280231, 854394699), (280231, 869243622), (280231, 873562692), (280231, 876920574), (280231, 875530537), (280231, 880532971), (280231, 881173153), (280231, 1315844372), (280231, 1313857790), (280231, 1321860185), (280231, 1326534006), (280231, 1356225718), (280231, 1375092666), (280231, 196298124), (280231, 1949842409), (280231, 1931123628), (280231, 1930664315), (280231, 89110006), (280231, 91182123), (280231, 95836512), (280231, 100768792), (280231, 108884461), (280231, 111613478), (280231, 2087566099), (280231, 2096000312), (280231, 2096781713), (280231, 2100684572), (280231, 2103911713), (280231, 2119938426), (280231, 471164304), (280231, 473567922), (280231, 473221885), (280231, 473991357), (280231, 479249399), (280231, 488312835), (280231, 490615902), (280231, 1520861485), (280231, 1528260441), (280231, 1635043760), (280231, 1634847333), (280231, 1640387994), (280231, 1639530458), (280231, 1958665413), (280231, 1964739554), (280231, 1972308456), (280231, 2140453858), (280231, 2148717251), (280231, 2151283867), (280231, 2153712104), (280231, 2161705125), (280231, 2162933936), (280231, 2163098832), (280231, 1655056891), (280231, 1654594888), (280231, 1578063704), (280231, 1581115715), (280231, 1588933605), (280231, 1620659373), (280231, 1621635609), (280231, 561112136), (280231, 569793875), (280231, 1701958330), (280231, 1716112176), (280231, 1718629600), (280231, 12832494), (280231, 11445384), (280231, 13101419), (280231, 14209417), (280231, 19447751), (280231, 19967925), (280231, 27121746), (280231, 1243456494), (280231, 1260778712), (280231, 606171478), (280231, 615592694), (280231, 49282306), (280231, 48459971), (280231, 49570849), (280231, 50060693), (280231, 54294670), (280231, 73396555), (280231, 591443490), (280231, 622639558), (280231, 631088748), (280231, 631753816), (280231, 638446503), (280231, 647084730), (280231, 647441215), (280231, 1072450928), (280231, 1080299669), (280231, 1088259805), (280231, 1093289411), (280231, 400797053), (280231, 407606480), (280231, 417324542), (280231, 420912100), (280231, 1049057108), (280231, 1057775763), (280231, 495433553), (280231, 497678002), (280231, 496555495), (280231, 541558273), (280231, 2028905291), (280231, 2032968631), (280231, 348600562), (280231, 349861950), (280231, 1386675206), (280231, 1387030296), (280231, 1395214136), (280231, 1395978315), (280231, 1413343276), (280231, 1415373351), (280231, 2225072885), (280231, 308583604), (280231, 650446390), (280231, 801609983), (280231, 812889623), (280231, 895818306), (280231, 897375449), (280231, 898263363), (280231, 902393965), (280231, 136391466), (280231, 144644538), (280231, 758891910), (280231, 758987458), (280231, 770711413), (280231, 837219032), (280231, 842594902), (280231, 852619081), (280231, 2189604584), (280231, 1912203263), (280231, 1914766176), (280231, 707984122), (280231, 712923693), (280231, 1500562379), (280231, 1508198363), (280231, 1507843608), (280231, 1097216072), (280231, 1099777576), (280231, 1106135966), (280231, 1116050195), (280231, 1116882997), (280231, 341892480), (280231, 345016738), (280231, 2120184031), (280231, 691741058), (280231, 731223052), (280231, 741232200), (280231, 508826854), (280231, 521848336), (280231, 1212711538), (280231, 1215676249), (280231, 302371622), (280231, 317351811), (280231, 327312659), (280231, 980624274), (280231, 1022196008), (280231, 1026226964), (280231, 1031787135), (280231, 996629778), (280231, 1000502763), (280231, 262686527), (280231, 272031523), (280231, 274498243), (280231, 286401785), (280231, 1575675636), (280231, 1607855932), (280231, 163417619), (280231, 165752059), (280231, 175324013), (280231, 179745591), (280231, 181073967), (280231, 536480514), (280231, 245281313), (280231, 921620215), (280231, 1995330311), (280231, 2058751034), (280319, 562029959), (280319, 567143828), (280319, 573275578), (280319, 591403563), (280319, 733740633), (280319, 1523819931), (280319, 281959301), (280319, 290356572), (280319, 336382906), (280319, 367243891), (280319, 369071591), (280319, 367052586), (280319, 1080619643), (280319, 810881493), (280319, 212091003), (280319, 271544005), (280319, 1167221976), (280319, 1203245495), (280319, 1206062859), (280319, 1205889842), (280319, 179803922), (280319, 179756949), (280319, 184887165), (280319, 194079815), (280319, 563318190), (280319, 695883268), (280319, 695447406), (280319, 701649500), (280319, 509676059), (280319, 512035916), (280319, 513593907), (280319, 515140366), (280319, 518901728), (280319, 524487015), (280319, 1036903160), (280319, 1034517720), (280319, 785236144), (280319, 790450488), (280319, 24388459), (280319, 27495707), (280319, 30626154), (280319, 278408387), (280319, 774601762), (280319, 826676971), (280319, 832932290), (280319, 833909729), (280319, 1120682424), (280319, 528264020), (280319, 318047356), (280319, 319639794), (280319, 326288942), (280319, 1525417169), (280319, 1534808191), (280319, 1537085700), (280319, 1550724777), (280319, 1555280491), (280319, 633887102), (280319, 634398978), (280319, 640806170), (280319, 1691227729), (280319, 227574195), (280319, 239073291), (280319, 1805498900), (280319, 1717915951), (280319, 1176247), (280319, 1883466548), (280319, 1888059765), (280319, 1994844252), (280319, 952055843), (280319, 950653148), (280319, 953307970), (280319, 974019669), (280319, 981646637), (280319, 1090291013), (280319, 1091898446), (280319, 1102018261), (280319, 868271764), (280319, 1225829518), (280319, 1228858773), (280319, 1266571891), (280319, 1268793110), (280319, 1275046676), (280319, 1983955191), (280319, 1989324817), (280319, 1927883623), (280319, 1936849157), (280319, 1936707257), (280319, 1946712502), (280319, 1948913625), (280319, 75809074), (280319, 87910127), (280319, 1828850376), (280319, 1839057146), (280319, 1844923384), (280319, 1844702370), (280319, 745442820), (280319, 752623568), (280319, 798105003), (280319, 722094647), (280319, 760235715), (280319, 1648730072), (280319, 736964000), (280319, 1681460726), (280319, 1682247541), (280319, 1691355864), (280319, 1771934315), (280319, 1775183359), (280319, 1774691556), (280319, 1777191468), (280319, 1822163649), (280319, 1823376735), (280319, 1826273957), (280319, 1826940160), (280319, 1851634850), (280319, 1855972106), (280319, 1864367352), (280319, 1864414128), (280319, 1871948254), (280319, 1873304852), (280319, 1874785103), (280319, 1133321903), (280319, 1139047711), (280319, 1153638375), (280319, 1151415477), (280319, 1153720565), (280319, 1008081445), (280319, 913051817), (280319, 914450704), (280319, 921187787), (280319, 931194131), (280319, 2036770261), (280319, 2042319778), (280319, 2046979488), (280319, 2050121279), (280319, 2058398448), (280319, 726127616), (280319, 1894777433), (280319, 2008777571), (280319, 2013904070), (280319, 2016151584), (280319, 1475173173), (280319, 1479514672), (280319, 1478120277), (280319, 1478257757), (280319, 1488525960), (280319, 1569643892), (280319, 963155881), (280319, 1173822256), (280319, 1178287036), (280319, 1951070306), (280319, 1963080845), (280319, 1965865848), (280319, 1965685628), (280319, 1589594523), (280319, 1596104201), (280319, 1596443921), (280319, 1599250983), (280319, 1621956298), (280319, 1628997553), (280319, 667498270), (280319, 688232169), (280319, 420925509), (280319, 425494828), (280319, 430397837), (280319, 1294198318), (280319, 101558805), (280319, 105389815), (280319, 108272689), (280319, 113253324), (280319, 116449667), (280319, 122212963), (280319, 121504127), (280319, 887921870), (280319, 889450748), (280319, 935184686), (280319, 935513275), (280319, 942862333), (280319, 408586138), (280319, 417241152), (280319, 1355988103), (280319, 1398061854), (280319, 1400246374), (280319, 1401513478), (280319, 1408234862), (280319, 1330192822), (280319, 1337393000), (280319, 1348856615), (280319, 1354491936), (280319, 131565819), (280319, 131691545), (280319, 143449561), (280319, 170322087), (280319, 260408945), (280319, 47716555), (280319, 55118355), (280319, 60906203), (280319, 65631594), (280319, 70697683), (280319, 1331803255), (280319, 649497548), (280319, 476259839), (280319, 1049077141), (280319, 1051348408), (280319, 1072422024), (280319, 840781166), (280319, 844110200), (280319, 862377450), (280319, 1218209634), (280319, 1216278078), (280319, 1253627767), (280319, 295870607), (280319, 298961705), (280319, 1448768963), (280319, 1452532772), (280319, 1460778453), (280319, 1459335527), (280319, 1470974161), (280319, 1473438001), (280319, 356245342), (280319, 401966385), (280319, 443060472), (280319, 445957840), (280319, 453840378), (280319, 461955172), (280319, 468243075), (280319, 1607864717), (280319, 1613732251), (280319, 1378419054), (280319, 1379556550), (280319, 1418979438), (280319, 1425810973), (280319, 1790009047), (280319, 1373261437), (280319, 1427358349), (280319, 593790933), (280319, 610486929), (280319, 373797091), (280319, 384690953), (280319, 387231970), (280319, 404758158), (280319, 36789003), (280319, 40320283), (280368, 18630561), (280368, 51648904), (280368, 54941288), (280368, 98914941), (280368, 102460266), (280368, 111188172), (280368, 110195295), (280368, 111231202), (280368, 3646070), (280368, 35044919), (280368, 37803137), (280368, 46074631), (280368, 119864418), (280368, 120542057), (280368, 122424631), (280368, 126731420), (280368, 20144526), (280368, 28604229), (280368, 86306278), (280368, 157377745), (280368, 145775947), (280368, 76870390), (280368, 159538570), (280423, 361879287), (280423, 362830248), (280423, 364833223), (280423, 373737920), (280423, 376217318), (280423, 373150603), (280423, 381102402), (280423, 382471972), (280423, 385475890), (280423, 1148716645), (280423, 1154025636), (280423, 1254129385), (280423, 394025670), (280423, 395246647), (280423, 395278324), (280423, 400221258), (280423, 1427172638), (280423, 1180567303), (280423, 1185909605), (280423, 1187368199), (280423, 165419390), (280423, 181035460), (280423, 188028507), (280423, 190016366), (280423, 1230869026), (280423, 876312069), (280423, 617874050), (280423, 782844728), (280423, 787249204), (280423, 961887294), (280423, 972534323), (280423, 970727751), (280423, 1002887456), (280423, 1007692904), (280423, 1010794041), (280423, 1382253233), (280423, 1383416018), (280423, 538486944), (280423, 557206463), (280423, 561990306), (280423, 9878484), (280423, 14216983), (280423, 16326388), (280423, 18767832), (280423, 241148225), (280423, 244595846), (280423, 1070353107), (280423, 937828273), (280423, 947795856), (280423, 527038547), (280423, 1031743590), (280423, 1101820335), (280423, 1104512803), (280423, 1118381906), (280423, 1129146016), (280423, 86295392), (280423, 449834672), (280423, 454760804), (280423, 469015037), (280423, 1325322649), (280423, 1357782077), (280423, 1359154942), (280423, 1363741945), (280423, 1364463414), (280423, 28462304), (280423, 349285383), (280423, 349810042), (280423, 353367542), (280423, 1238212366), (280423, 1238753925), (280423, 1239476174), (280423, 880301270), (280423, 926231166), (280423, 1137299942), (280423, 1171790310), (280423, 1395159771), (280423, 1398240379), (280423, 1440351100), (280423, 1442033968), (280423, 1450644524), (280423, 1203185849), (280423, 1260779023), (280423, 1271032060), (280423, 1274946917), (280423, 575438226), (280423, 581449935), (280423, 584326224), (280423, 587953050), (280423, 409497173), (280423, 415687661), (280423, 975667197), (280423, 985158814), (280423, 984716930), (280423, 990209212), (280423, 1040033763), (280423, 628695807), (280423, 630821228), (280423, 630413949), (280423, 858619782), (280423, 861359093), (280423, 865932277), (280423, 116060826), (280423, 122388586), (280423, 206059696), (280423, 211654495), (280423, 224046559), (280423, 227375400), (280423, 632865993), (280423, 654235135), (280423, 657561622), (280423, 129766561), (280423, 138283972), (280423, 152330182), (280423, 286229470), (280423, 307998315), (280423, 313571606), (280423, 316574001), (280423, 892527775), (280423, 893096566), (280423, 895141051), (280423, 914557524), (280423, 918190132), (280423, 671877647), (280423, 692407000), (280423, 697758178), (280423, 700384917), (280423, 699184191), (280423, 295070462), (280423, 298640650), (280423, 300261327), (280423, 398038121), (280423, 419468311), (280423, 429311954), (280423, 439364946), (280423, 440470825), (280423, 440692290), (280423, 259349181), (280423, 262207679), (280423, 262061175), (280423, 263154947), (280423, 263838645), (280423, 272479713), (280423, 1353299397), (280423, 1392249888), (280423, 1455292838), (280423, 1454925780), (280423, 1470162509), (280423, 1013683544), (280423, 1016912491), (280423, 1049866282), (280423, 1051711843), (280423, 725890228), (280423, 740450907), (280423, 744155732), (280423, 743752620), (280423, 194073332), (280423, 199973590), (280423, 200852470), (280423, 201522099), (280423, 203303471), (280423, 65023309), (280423, 64989151), (280423, 66160176), (280423, 67561661), (280423, 68518681), (280423, 72267220), (280423, 490779190), (280423, 495189076), (280423, 1299561766), (280423, 247905881), (280423, 251975039), (280423, 1290387569), (280423, 1201706120), (280423, 1206298512), (280423, 1216431096), (280423, 756513490), (280423, 767520638), (280423, 770310698), (280423, 812035014), (280423, 823451393), (280423, 830257107), (280423, 829574918), (280464, 403679437), (280464, 503924435), (280464, 1083589410), (280464, 1163146080), (280464, 1162478083), (280464, 1164288631), (280464, 710930850), (280464, 703262462), (280464, 600587508), (280464, 607176800), (280464, 245203634), (280464, 249008186), (280464, 251459903), (280464, 254136179), (280464, 682723454), (280464, 686307471), (280464, 688567342), (280464, 689606912), (280464, 693794106), (280464, 947987832), (280464, 952240148), (280464, 725116424), (280464, 735303390), (280464, 738387074), (280464, 152556344), (280464, 458632505), (280464, 460104446), (280464, 463842979), (280464, 468517915), (280464, 232273755), (280464, 196920263), (280464, 200933676), (280464, 273749193), (280464, 272973462), (280464, 1031693888), (280464, 1114412068), (280464, 418652990), (280464, 633972651), (280464, 633220390), (280464, 634574687), (280464, 637155335), (280464, 1160231009), (280464, 214628406), (280464, 217360033), (280464, 528663619), (280464, 220336136), (280464, 221661891), (280464, 226532362), (280464, 226632558), (280464, 553839938), (280464, 563302945), (280464, 565035967), (280464, 175172492), (280464, 176815328), (280464, 568239726), (280464, 572283010), (280464, 572552135), (280464, 581587223), (280464, 1065216667), (280464, 1069118617), (280464, 126759885), (280464, 271733586), (280464, 271647938), (280464, 86107134), (280464, 91133906), (280464, 92700049), (280464, 391974029), (280464, 388911563), (280464, 400621603), (280464, 287676836), (280464, 289009994), (280464, 308881491), (280464, 367648003), (280464, 370260559), (280464, 380561608), (280464, 382928385), (280464, 387213831), (280464, 386525088), (280464, 880447668), (280464, 888303196), (280464, 259950335), (280464, 259765338), (280464, 268881406), (280464, 1130301946), (280464, 1138638990), (280464, 1137776122), (280464, 737099342), (280464, 744662924), (280464, 748251064), (280464, 514796437), (280464, 1138881294), (280464, 1147367215), (280464, 1173373755), (280464, 1185306156), (280464, 1103977707), (280464, 1110296971), (280464, 279661057), (280464, 975352871), (280464, 979075921), (280464, 983442153), (280464, 987957933), (280464, 988819437), (280464, 989634663), (280464, 330503907), (280464, 332597272), (280464, 357975715), (280464, 9219814), (280464, 49735110), (280464, 54605145), (280464, 310541782), (280464, 312614388), (280464, 318887683), (280464, 319806632), (280464, 30366027), (280464, 836579683), (280464, 839912275), (280464, 842333950), (280464, 847153251), (280464, 852064668), (280464, 779913363), (280464, 793047081), (280464, 791995874), (280464, 909578492), (280464, 911354300), (280464, 926316827), (280464, 110061655), (280464, 113411803), (280464, 20288421), (280464, 26048665), (280464, 68823987), (280464, 81902464), (280464, 343969365), (280464, 342160879), (280464, 815285637), (280464, 65413515), (280464, 126125351), (280464, 178978607), (280464, 187603384), (280464, 490965341), (280464, 492847873), (280464, 491456439), (280464, 493532551), (280464, 497126245), (280500, 134703333), (280500, 154142130), (280500, 157250753), (280500, 161506305), (280500, 40285631), (280500, 66590758), (280500, 80784169), (280500, 110635174), (280500, 129681932), (280500, 127520832), (280500, 23335506), (280500, 24345010), (280500, 26259749), (280500, 31766868), (280500, 88711753), (280500, 175173724), (280500, 142811965), (280500, 149327890), (280500, 150787598), (280520, 487785931), (280520, 492044036), (280520, 497803222), (280520, 517744529), (280520, 472984019), (280520, 436928009), (280520, 446183506), (280520, 125120877), (280520, 193329262), (280520, 352549231), (280520, 164065382), (280520, 197168109), (280520, 201281443), (280520, 372978976), (280520, 418145603), (280520, 147743883), (280520, 245928907), (280520, 249866083), (280520, 256947489), (280520, 257632916), (280520, 255478538), (280520, 263837247), (280520, 265476786), (280520, 350819590), (280520, 432126142), (280520, 213138882), (280520, 217266710), (280520, 224127542), (280520, 228135497), (280614, 161177673), (280614, 169745152), (280614, 170767640), (280614, 215146625), (280614, 219127570), (280614, 301178226), (280614, 303707437), (280614, 332449119), (280614, 335003120), (280614, 345722410), (280614, 353058908), (280614, 411236139), (280614, 414979598), (280614, 419235273), (280614, 426610368), (280614, 175746364), (280614, 2832819), (280614, 445394990), (280614, 263895374), (280614, 197529463), (280614, 195487015), (280614, 200548148), (280614, 381849649), (280614, 484299614), (280614, 251899309), (280614, 258595205), (280614, 262503389), (280614, 266054651), (280614, 508036054), (280614, 135108736), (280614, 469203363), (280614, 197406782), (280614, 23884140), (280614, 26304101), (280614, 36897069), (280614, 52567457), (280614, 66251511), (280614, 68094944), (280614, 68851524), (280614, 402762268), (280614, 234643177), (280614, 241494472), (280614, 182710441), (280614, 124825582), (280614, 131963406), (280614, 129554236), (280614, 398377511), (280614, 280156426), (280614, 249695289), (280614, 15314641), (280614, 75177979), (280614, 81554504), (280614, 84242925), (280614, 48491778), (280614, 425895393), (280614, 429688367), (280614, 430584664), (280614, 430786875), (280614, 470180942), (280614, 101543692), (280614, 118170578), (280614, 343741138), (280614, 377386110), (280614, 310506941), (280673, 1561502610), (280673, 627110595), (280673, 635454801), (280673, 667428224), (280673, 668936168), (280673, 676414835), (280673, 1179958099), (280673, 1179577719), (280673, 753417563), (280673, 925801475), (280673, 929027626), (280673, 928808433), (280673, 932066869), (280673, 936543525), (280673, 2177212635), (280673, 2181799462), (280673, 2182347482), (280673, 2183016874), (280673, 2187212326), (280673, 2482538521), (280673, 2765600574), (280673, 2770492663), (280673, 2778816414), (280673, 1340984944), (280673, 1341338341), (280673, 1343587778), (280673, 1356827410), (280673, 2717432142), (280673, 210239745), (280673, 217201639), (280673, 1785965118), (280673, 2532511534), (280673, 2540140200), (280673, 2634973887), (280673, 2638154345), (280673, 2640706025), (280673, 2644529335), (280673, 2353158959), (280673, 2356623320), (280673, 2355325771), (280673, 2362575975), (280673, 2362574478), (280673, 2200915370), (280673, 2167541330), (280673, 2170303336), (280673, 2118192753), (280673, 2119242422), (280673, 2124148901), (280673, 2193498932), (280673, 960791346), (280673, 966344732), (280673, 1001228209), (280673, 353035512), (280673, 388200329), (280673, 3028503266), (280673, 3033721245), (280673, 3041435788), (280673, 3045258635), (280673, 1541222359), (280673, 1903177089), (280673, 1903343123), (280673, 1913750957), (280673, 1927101566), (280673, 1926692554), (280673, 1926495149), (280673, 2489966503), (280673, 2494706635), (280673, 2497573278), (280673, 3077092792), (280673, 3084576045), (280673, 3097295300), (280673, 3108240355), (280673, 2448458780), (280673, 151665751), (280673, 150994206), (280673, 159901037), (280673, 2330851434), (280673, 2335889912), (280673, 2348111074), (280673, 2350683365), (280673, 1366214126), (280673, 1368434425), (280673, 1368106313), (280673, 1370854154), (280673, 1371304327), (280673, 1388443622), (280673, 1598767572), (280673, 1598692856), (280673, 1605479287), (280673, 1607307218), (280673, 1608987310), (280673, 1612751849), (280673, 1615433136), (280673, 1628068009), (280673, 1627193982), (280673, 1632071699), (280673, 1639670651), (280673, 1664330995), (280673, 1674930087), (280673, 2993363444), (280673, 2997148328), (280673, 1952785961), (280673, 1960201606), (280673, 2026525657), (280673, 2028900521), (280673, 2034778729), (280673, 2892196239), (280673, 2893130910), (280673, 2499185660), (280673, 2505613462), (280673, 600059506), (280673, 599870982), (280673, 603985827), (280673, 764333824), (280673, 415504114), (280673, 433390588), (280673, 1823410733), (280673, 2197123741), (280673, 2305157070), (280673, 143442741), (280673, 145327957), (280673, 146058228), (280673, 974479952), (280673, 1115470566), (280673, 1122200277), (280673, 1125565319), (280673, 1446940697), (280673, 1456938274), (280673, 1432608078), (280673, 1439332158), (280673, 1442001118), (280673, 1506108555), (280673, 1507118668), (280673, 940729316), (280673, 948917043), (280673, 952956637), (280673, 1308336479), (280673, 1309842978), (280673, 1312823890), (280673, 1041312063), (280673, 105431623), (280673, 113254383), (280673, 113609086), (280673, 269472024), (280673, 301050464), (280673, 256951192), (280673, 262963837), (280673, 2084153001), (280673, 2096012343), (280673, 2094350623), (280673, 2099192829), (280673, 695743717), (280673, 740399793), (280673, 740833989), (280673, 2699043355), (280673, 2700838882), (280673, 2704280557), (280673, 2702117297), (280673, 2755267267), (280673, 2755748945), (280673, 52197766), (280673, 51903608), (280673, 277801020), (280673, 280047936), (280673, 286316962), (280673, 287350710), (280673, 287567264), (280673, 183913264), (280673, 190962116), (280673, 254167831), (280673, 362515909), (280673, 368705629), (280673, 378884323), (280673, 438647052), (280673, 33080895), (280673, 37404310), (280673, 73257613), (280673, 74321810), (280673, 2058495473), (280673, 2610520806), (280673, 2615440234), (280673, 3061036739), (280673, 3063705592), (280673, 3063983815), (280673, 3069199853), (280673, 987541087), (280673, 993205767), (280673, 1248630674), (280673, 1256550197), (280673, 1282700034), (280673, 1282805298), (280673, 1285256834), (280673, 2967185399), (280673, 2968235722), (280673, 2984633757), (280673, 1838517358), (280673, 1847546351), (280673, 1849982083), (280673, 1693042776), (280673, 1693515134), (280673, 2559633088), (280673, 2564757270), (280673, 2570199648), (280673, 1754905208), (280673, 1765885177), (280673, 776706806), (280673, 779280908), (280673, 786048765), (280673, 826548990), (280673, 1989749719), (280673, 1993721146), (280673, 2003265224), (280673, 880005111), (280673, 881453173), (280673, 880853423), (280673, 879119855), (280673, 885268972), (280673, 893896382), (280673, 921251337), (280673, 920049075), (280673, 619607431), (280673, 620337836), (280673, 800148757), (280673, 805493593), (280673, 2216766663), (280673, 2215203701), (280673, 2224732686), (280673, 1548675198), (280673, 2132591573), (280673, 2135459734), (280673, 2140137426), (280673, 2141521944), (280673, 2139289914), (280673, 517281588), (280673, 518474148), (280673, 521836884), (280673, 524072652), (280673, 529364317), (280673, 527380335), (280673, 541839586), (280673, 545146215), (280673, 1737032501), (280673, 1803102265), (280673, 1805904365), (280673, 862793888), (280673, 1141134627), (280673, 1154242847), (280673, 1152145113), (280673, 1156283181), (280673, 1234105644), (280673, 1238746015), (280673, 1241679168), (280673, 1244259699), (280673, 1288357225), (280673, 1292190420), (280673, 1301023266), (280673, 3161467555), (280673, 3168914014), (280673, 3169608364), (280673, 3170980301), (280673, 2927975162), (280673, 2940655712), (280673, 2938539332), (280673, 2942247737), (280673, 2946249490), (280673, 2943982655), (280673, 2949947284), (280673, 2383804628), (280673, 2394990476), (280673, 2393558202), (280673, 1409701972), (280673, 1015828677), (280673, 1040684819), (280673, 1044120721), (280673, 1055563895), (280673, 1861044367), (280673, 1861840516), (280673, 1563278273), (280673, 1573321097), (280673, 636521337), (280673, 658334485), (280673, 657853395), (280673, 658923859), (280673, 661353763), (280673, 719032876), (280673, 730277027), (280673, 130772988), (280673, 128639410), (280673, 192722347), (280673, 2520714318), (280673, 2524900212), (280673, 540252534), (280673, 1129293375), (280673, 1127880961), (280673, 1127567985), (280673, 1129709373), (280673, 1130442500), (280673, 1204578001), (280673, 1210239213), (280673, 1209987687), (280673, 1793918043), (280673, 1797617325), (280673, 1801893686), (280673, 1802994817), (280673, 1868958632), (280673, 1881612349), (280673, 573577074), (280673, 441791715), (280673, 450639263), (280673, 550449120), (280673, 1400216651), (280673, 1461712657), (280673, 1103085132), (280673, 2829060797), (280673, 2834122239), (280673, 507612086), (280673, 529883757), (280673, 515678340), (280673, 638356141), (280673, 714091151), (280673, 1963106847), (280673, 1970219336), (280673, 1973879931), (280673, 2041576452), (280673, 1189283571), (280673, 1193924154), (280673, 2900701815), (280673, 2911558212), (280673, 2910735588), (280673, 2915446398), (280673, 292745140), (280673, 294918744), (280673, 868664676), (280673, 1943757842), (280673, 2009219993), (280673, 2009186699), (280673, 2016738385), (280673, 2752894471), (280673, 2675317465), (280673, 2672561025), (280673, 905540049), (280673, 1059283304), (280673, 1062503441), (280673, 1065882767), (280673, 2596434341), (280673, 2080012190), (280673, 301723541), (280673, 308973827), (280673, 337108746), (280673, 2849611504), (280673, 2848484692), (280673, 2854571066), (280673, 2857016500), (280673, 2857678756), (280673, 2856700246), (280673, 2861374546), (280673, 484140310), (280673, 2245104868), (280673, 2245529823), (280673, 2274565601), (280673, 2279370083), (280673, 2288397076), (280673, 61651056), (280673, 61793945), (280673, 3053976855), (280673, 588981061), (280673, 592194568), (280673, 679256630), (280673, 680769321), (280673, 679405752), (280673, 685018370), (280673, 690886151), (280673, 460404830), (280673, 2455078568), (280673, 2466014369), (280673, 2467491159), (280673, 2148602850), (280673, 2152193836), (280673, 2156881522), (280673, 159954028), (280673, 1099507887), (280673, 3126832728), (280673, 3127107304), (280673, 3132352042), (280673, 3140983301), (280673, 848535089), (280673, 856939280), (280673, 854182688), (280673, 860166988), (280673, 859509052), (280673, 1416123410), (280673, 1420559613), (280673, 1426036490), (280673, 1683872098), (280673, 1589446887), (280673, 1741238339), (280673, 1746826593), (280673, 1776252952), (280673, 1853050261), (280673, 2806294018), (280673, 85913912), (280673, 117009110), (280673, 243904759), (280673, 266544725), (280673, 270497155), (280753, 365456849), (280753, 376437185), (280753, 27753821), (280753, 30829464), (280753, 39366995), (280753, 43218719), (280753, 44351741), (280753, 74941574), (280753, 79893511), (280753, 89066701), (280753, 95489617), (280753, 96879307), (280753, 766664461), (280753, 768428703), (280753, 778821400), (280753, 813375609), (280753, 811693821), (280753, 134561155), (280753, 177384900), (280753, 864135449), (280753, 864682742), (280753, 240478542), (280753, 346171992), (280753, 351796583), (280753, 354102534), (280753, 358289357), (280753, 363569966), (280753, 422998503), (280753, 441378620), (280753, 61541558), (280753, 66437573), (280753, 69680529), (280753, 635429149), (280753, 732689189), (280753, 649050361), (280753, 210010568), (280753, 217994521), (280753, 221475865), (280753, 567552131), (280753, 568115382), (280753, 572486468), (280753, 574235324), (280753, 592483954), (280753, 797604745), (280753, 807802541), (280753, 828723584), (280753, 833447390), (280753, 266513600), (280753, 268646852), (280753, 333717286), (280753, 333390112), (280753, 679828943), (280753, 698044006), (280753, 13265533), (280753, 17051870), (280753, 19064691), (280753, 54122633), (280753, 55443906), (280753, 59454949), (280753, 848380537), (280753, 847713278), (280753, 850429585), (280753, 867607441), (280753, 398836135), (280753, 403106756), (280753, 406391793), (280753, 412998749), (280753, 527747276), (280753, 528489947), (280753, 530333422), (280753, 272398089), (280753, 272996746), (280753, 274428674), (280753, 314356589), (280753, 317616096), (280753, 321620391), (280753, 321338962), (280753, 325417838), (280753, 326718901), (280753, 330419057), (280753, 735448189), (280753, 745653570), (280753, 746224121), (280753, 744096305), (280753, 745172692), (280753, 754549904), (280753, 758217185), (280753, 297250576), (280753, 709038478), (280753, 383705797), (280753, 388628709), (280753, 395875171), (280753, 139888392), (280753, 168114146), (280753, 491280594), (280753, 496091622), (280753, 503858086), (280753, 508881079), (280753, 508900345), (280753, 510314834), (280753, 446256192), (280753, 466184764), (280753, 471900183), (280753, 537464779), (280753, 537857180), (280753, 538573954), (280753, 548561281), (280753, 721826545), (280753, 721146202), (280753, 723937158), (280753, 129616839), (280753, 144474583), (280753, 151148259), (280753, 104405491), (280753, 102213244), (280753, 112652971), (280753, 299895622), (280753, 300936115), (280753, 301573976), (280753, 304803216), (280753, 314520592), (280753, 778906192), (280753, 779344349), (280753, 784367794), (280753, 793117292), (280753, 622741527), (280753, 626422097), (280753, 474243198), (280753, 475736691), (280753, 485297093), (280753, 486264713), (280753, 486742407), (280753, 486776862), (280753, 173211963), (280753, 171428593), (280753, 180617209), (280753, 181021134), (280753, 179266464), (280753, 186307027), (280753, 191317520), (280753, 197266902), (280853, 12280853), (280853, 33570179), (280853, 34929280), (280853, 40356388), (280853, 20546136), (280853, 84246492), (280853, 85596120), (280853, 88044578), (280853, 90630872), (280853, 130933362), (280853, 116187520), (280853, 119434178), (280853, 29144998), (280853, 64187219), (280853, 137691992), (280853, 144074454), (280853, 149266631), (280853, 146187670), (280853, 88975116), (280853, 99122399), (280853, 106334941), (280853, 107318663), (280853, 104888757), (280853, 46534033), (280853, 58769889), (280853, 68391127), (280862, 1936729688), (280862, 1939640883), (280862, 1990292225), (280862, 821967323), (280862, 857152963), (280862, 713621141), (280862, 746087171), (280862, 203985064), (280862, 229448002), (280862, 612509241), (280862, 657018655), (280862, 663803029), (280862, 2553060717), (280862, 2554443443), (280862, 2814934281), (280862, 2821494034), (280862, 2710543225), (280862, 2724475109), (280862, 2402827453), (280862, 2423759093), (280862, 15860086), (280862, 22107217), (280862, 43776347), (280862, 42416817), (280862, 1640972519), (280862, 1642090940), (280862, 1651901077), (280862, 1649496131), (280862, 1652832256), (280862, 1327171764), (280862, 1329650273), (280862, 1342897375), (280862, 56730589), (280862, 62673646), (280862, 93077037), (280862, 99420604), (280862, 133954936), (280862, 140387903), (280862, 141121340), (280862, 1291240322), (280862, 1314102134), (280862, 290732474), (280862, 299935456), (280862, 311404245), (280862, 1690685297), (280862, 1700860944), (280862, 1715156393), (280862, 867603545), (280862, 896122487), (280862, 896383546), (280862, 896945507), (280862, 2738723628), (280862, 2428284929), (280862, 1210198658), (280862, 1211845504), (280862, 1215231325), (280862, 1226234981), (280862, 951121817), (280862, 956744691), (280862, 715462687), (280862, 724143788), (280862, 727069118), (280862, 807006290), (280862, 809621319), (280862, 812612068), (280862, 818301705), (280862, 1334790134), (280862, 1389016245), (280862, 1395169725), (280862, 1008250128), (280862, 1035630940), (280862, 545557701), (280862, 546949626), (280862, 567468081), (280862, 570314712), (280862, 629847337), (280862, 633573311), (280862, 2743119066), (280862, 2764711185), (280862, 2765637164), (280862, 2768183806), (280862, 1244772049), (280862, 1255681830), (280862, 1256103772), (280862, 1256009495), (280862, 1258305841), (280862, 1265008715), (280862, 2037607826), (280862, 2040024507), (280862, 2045468401), (280862, 2107725751), (280862, 2112942609), (280862, 2122516125), (280862, 2120629988), (280862, 2537670027), (280862, 2542190370), (280862, 2158080235), (280862, 2159024598), (280862, 2157786872), (280862, 2164196799), (280862, 2169573471), (280862, 2171297732), (280862, 2175720789), (280862, 2179742953), (280862, 976613967), (280862, 979898299), (280862, 986506321), (280862, 991177184), (280862, 2276671032), (280862, 2281197545), (280862, 2289575465), (280862, 2232202599), (280862, 2238228435), (280862, 2241430816), (280862, 2239384335), (280862, 2240949225), (280862, 1666130369), (280862, 1667750866), (280862, 1669406620), (280862, 1682719992), (280862, 1685189623), (280862, 1689879531), (280862, 2068254682), (280862, 2079299679), (280862, 2078538876), (280862, 1195152778), (280862, 2794984941), (280862, 2800983297), (280862, 1161378968), (280862, 1162412120), (280862, 1177120505), (280862, 1176007128), (280862, 1178698178), (280862, 1187914969), (280862, 1186425075), (280862, 1189445789), (280862, 1190057139), (280862, 1108281142), (280862, 1113116381), (280862, 1117312152), (280862, 1144753088), (280862, 1913058206), (280862, 1920023133), (280862, 1922260023), (280862, 1942673546), (280862, 1946330493), (280862, 1948746787), (280862, 2091669582), (280862, 2093959715), (280862, 2144270206), (280862, 2146144224), (280862, 1099773133), (280862, 1104547958), (280862, 1998019138), (280862, 2005713864), (280862, 1569260676), (280862, 2694393663), (280862, 119799453), (280862, 128240362), (280862, 130519007), (280862, 130479131), (280862, 753245725), (280862, 756185863), (280862, 272130933), (280862, 574551286), (280862, 518000123), (280862, 518670612), (280862, 529592999), (280862, 529969791), (280862, 2594025546), (280862, 2592807741), (280862, 1534382210), (280862, 1543216121), (280862, 1545545228), (280862, 2488691940), (280862, 1235245545), (280862, 1236983053), (280862, 1277626098), (280862, 1280829228), (280862, 1428881574), (280862, 1432775428), (280862, 1435958310), (280862, 1467938622), (280862, 1470418864), (280862, 1506396265), (280862, 1512029239), (280862, 1512574377), (280862, 482711349), (280862, 484242904), (280862, 486725465), (280862, 490217718), (280862, 496650932), (280862, 499969488), (280862, 502779400), (280862, 505942519), (280862, 349367078), (280862, 359120213), (280862, 359514221), (280862, 366644149), (280862, 371475378), (280862, 371854967), (280862, 328205191), (280862, 331874629), (280862, 336203476), (280862, 338073877), (280862, 1359484923), (280862, 1367486108), (280862, 1489789760), (280862, 1498098377), (280862, 911372192), (280862, 191495989), (280862, 400422481), (280862, 399408254), (280862, 405703078), (280862, 412703611), (280862, 414838548), (280862, 418647465), (280862, 419893532), (280862, 1881257041), (280862, 1890503462), (280862, 1896192790), (280862, 1902521620), (280862, 1905613362), (280862, 467673712), (280862, 475297805), (280862, 480572831), (280862, 1204314195), (280862, 1206865151), (280862, 1210795875), (280862, 2554738642), (280862, 2555403349), (280862, 1128855636), (280862, 1128654572), (280862, 1139937029), (280862, 1719322879), (280862, 1732456364), (280862, 1731646721), (280862, 1747017202), (280862, 1746814883), (280862, 2358092347), (280862, 2357012942), (280862, 2373704825), (280862, 2201343365), (280862, 2209057199), (280862, 2215225892), (280862, 372987968), (280862, 385473040), (280862, 1603566196), (280862, 1613280670), (280862, 1614281766), (280862, 1623364984), (280862, 172377859), (280862, 185306777), (280862, 267942018), (280862, 2839580707), (280862, 2844485290), (280862, 2845391423), (280862, 36459351), (280862, 40180071), (280862, 214815856), (280862, 218381590), (280862, 779627720), (280862, 788837479), (280862, 796723737), (280862, 802425527), (280862, 2304775305), (280862, 2314457834), (280862, 2339563661), (280862, 2338300334), (280862, 429036746), (280862, 429576381), (280862, 443264366), (280862, 2043607768), (280862, 2056918125), (280862, 838759902), (280862, 838396870), (280862, 837898324), (280862, 922951041), (280862, 927190041), (280862, 2259173821), (280862, 2264841189), (280862, 2460190921), (280862, 2463622000), (280862, 1381019832), (280862, 1765201656), (280862, 1768499397), (280862, 2327547421), (280862, 2391395233), (280862, 670901657), (280862, 672365919), (280862, 684807023), (280862, 730553949), (280862, 743375024), (280862, 1906755767), (280862, 650741360), (280862, 692690208), (280862, 698045808), (280862, 2642124476), (280862, 2652318187), (280862, 2679892082), (280862, 1852091942), (280862, 1859495024), (280862, 1861341486), (280862, 1867554834), (280862, 4557498), (280862, 1956304251), (280862, 1967369720), (280862, 1975214121), (280862, 1976918308), (280862, 1784778936), (280862, 1812882271), (280862, 2506404062), (280862, 2521556515), (280862, 2524252375), (280862, 2529070602), (280862, 2527789606), (280862, 2529176065), (280862, 2532785557), (280862, 2444434784), (280862, 2471758467), (280862, 1827824719), (280862, 1000389632), (280862, 1000345540), (280862, 999253428), (280862, 1002714896), (280950, 9187792), (280950, 10573357), (280950, 15426066), (280950, 46269099), (280950, 1940683396), (280950, 1941715174), (280950, 1947825900), (280950, 1952905345), (280950, 1956837999), (280950, 1959532130), (280950, 1961848279), (280950, 1962030557), (280950, 785219841), (280950, 1401071968), (280950, 1403064168), (280950, 2196490951), (280950, 2206078699), (280950, 2262474812), (280950, 2120041978), (280950, 2169421001), (280950, 2170277470), (280950, 2178144511), (280950, 2176782694), (280950, 918318666), (280950, 927134967), (280950, 933235833), (280950, 2013504605), (280950, 2018155443), (280950, 2021915036), (280950, 1448702144), (280950, 1453108272), (280950, 1455215108), (280950, 1462402856), (280950, 31622797), (280950, 35168551), (280950, 43030101), (280950, 1442542891), (280950, 2530424009), (280950, 1800383430), (280950, 2515838222), (280950, 2630916879), (280950, 514241981), (280950, 2676172703), (280950, 1896655511), (280950, 1980256960), (280950, 1042194167), (280950, 460922609), (280950, 460060389), (280950, 2759986721), (280950, 547970785), (280950, 1194698193), (280950, 1196987667), (280950, 1197424102), (280950, 1196471523), (280950, 1201551663), (280950, 2040164846), (280950, 2073381890), (280950, 217010196), (280950, 216241130), (280950, 218544658), (280950, 224155340), (280950, 222576270), (280950, 1615760514), (280950, 1622709325), (280950, 1632852912), (280950, 1641044367), (280950, 2432357397), (280950, 2432380255), (280950, 2433659234), (280950, 2433504468), (280950, 2435858510), (280950, 2472439228), (280950, 202310071), (280950, 211275664), (280950, 686771187), (280950, 690085116), (280950, 699797332), (280950, 1206536739), (280950, 1224356812), (280950, 1226964877), (280950, 1229969147), (280950, 896106167), (280950, 898463347), (280950, 900390575), (280950, 903717758), (280950, 903685949), (280950, 902188528), (280950, 597354230), (280950, 616443696), (280950, 620428396), (280950, 686770893), (280950, 769238391), (280950, 782960901), (280950, 780584805), (280950, 2698933738), (280950, 2725480045), (280950, 2727186545), (280950, 2727922757), (280950, 2730100018), (280950, 1203696268), (280950, 2668705330), (280950, 618585677), (280950, 2644770071), (280950, 2654921358), (280950, 2672582001), (280950, 568573960), (280950, 592317107), (280950, 640631308), (280950, 871595251), (280950, 2091805267), (280950, 2099319268), (280950, 172546934), (280950, 178447971), (280950, 180731110), (280950, 1381143962), (280950, 1382719827), (280950, 1382286130), (280950, 1396600388), (280950, 1421139067), (280950, 1643886106), (280950, 1649847875), (280950, 1678561481), (280950, 1681380804), (280950, 1685958364), (280950, 2506702592), (280950, 2531013364), (280950, 2538022589), (280950, 2232143594), (280950, 2235724297), (280950, 2397100911), (280950, 2400091803), (280950, 55938289), (280950, 164293201), (280950, 164758887), (280950, 740419859), (280950, 748953982), (280950, 798503363), (280950, 1550678128), (280950, 1551141875), (280950, 1565132053), (280950, 1577685175), (280950, 415960293), (280950, 429105295), (280950, 432442865), (280950, 1853411342), (280950, 1854943843), (280950, 2459054882), (280950, 2182468282), (280950, 2185594221), (280950, 2193074722), (280950, 2212404870), (280950, 2215674158), (280950, 2223413389), (280950, 2225108144), (280950, 1245124618), (280950, 1243668726), (280950, 1252038712), (280950, 100994888), (280950, 2565448924), (280950, 2366568844), (280950, 2370482874), (280950, 2381837292), (280950, 2390299835), (280950, 779094582), (280950, 2608806073), (280950, 2611412637), (280950, 2465702865), (280950, 2490088451), (280950, 2578986171), (280950, 2581625840), (280950, 2586125413), (280950, 2588526174), (280950, 2588738299), (280950, 1255920926), (280950, 1279027199), (280950, 1314769620), (280950, 1318313104), (280950, 2305064763), (280950, 2302717073), (280950, 2309448731), (280950, 2309348064), (280950, 821399184), (280950, 2281920330), (280950, 2298973606), (280950, 1885824052), (280950, 390884024), (280950, 391290294), (280950, 394699644), (280950, 486908069), (280950, 486132085), (280950, 490595926), (280950, 305591552), (280950, 359989187), (280950, 402676873), (280950, 409635007), (280950, 150050882), (280950, 188005538), (280950, 188546090), (280950, 191857467), (280950, 198806467), (280950, 666853790), (280950, 678649811), (280950, 1331151907), (280950, 1334888408), (280950, 1340224942), (280950, 1340246351), (280950, 1341251784), (280950, 1345336268), (280950, 1344999325), (280950, 1368686209), (280950, 1369587334), (280950, 1379598532), (280950, 1381155620), (280950, 1747349975), (280950, 2151714800), (280950, 2153242888), (280950, 2165461918), (280950, 1089394105), (280950, 1092184227), (280950, 1098848585), (280950, 291471134), (280950, 291165699), (280950, 292388086), (280950, 339673226), (280950, 338862055), (280950, 342882783), (280950, 343500323), (280950, 348591802), (280950, 348996382), (280950, 1488177585), (280950, 1509611449), (280950, 1515974652), (280950, 1523070263), (280950, 1530576371), (280950, 1530681802), (280950, 1533824804), (280950, 1533777383), (280950, 1542907252), (280950, 1546548452), (280950, 942098275), (280950, 952307608), (280950, 955382378), (280950, 958077598), (280950, 958478251), (280950, 1348297776), (280950, 1351511901), (280950, 1819528064), (280950, 1823941983), (280950, 1826396540), (280950, 1829445299), (280950, 1835138534), (280950, 1839793045), (280950, 2409375600), (280950, 2084970545), (280950, 2334399095), (280950, 2339120571), (280950, 2338464004), (280950, 2345395320), (280950, 2357744286), (280950, 1252934566), (280950, 1254642535), (280950, 1301373943), (280950, 514391868), (280950, 2558688824), (280950, 2570736613), (280950, 2572515614), (280950, 2591739883), (280950, 2590356712), (280950, 1106733176), (280950, 1115347484), (280950, 1121101659), (280950, 1136380420), (280950, 278954200), (280950, 1170998405), (280950, 1178038074), (280950, 1182566484), (280950, 2048105149), (280950, 2057177350), (280950, 2069061825), (280950, 1741224312), (280950, 1758566231), (280950, 121388814), (280950, 129781940), (280950, 141286649), (280950, 841986149), (280950, 1304276175), (280950, 1858428247), (280950, 2553499282), (280950, 1138365575), (280950, 1143441355), (280950, 1148253879), (280950, 624173882), (280950, 626677314), (280950, 625909626), (280950, 630053485), (280950, 633265575), (280950, 631597106), (280950, 633550198), (280950, 714767325), (280950, 1441891656), (280950, 2708801908), (280950, 1212121970), (280950, 1215532849), (280950, 253357251), (280950, 2250737075), (280950, 2254483171), (280950, 2255300639), (280950, 1659042563), (280950, 1662876409), (280950, 1596439210), (280950, 1599492079), (280950, 1600645713), (280950, 1608476523), (280950, 1912550607), (280950, 1913498795), (280950, 1923586719), (280950, 1926123390), (280950, 1004275197), (280950, 1003968518), (280950, 1703331530), (280950, 1714222073), (280950, 1718175549), (280950, 1723617236), (280950, 1730950376), (280950, 1732502258), (280950, 57659816), (280950, 57339283), (280950, 68258663), (280950, 74728508), (280950, 79158940), (280950, 969962423), (280950, 975470051), (280950, 987998671), (280950, 988405369), (280950, 441058642), (280950, 441841561), (280950, 447892321), (280950, 450418617), (280950, 458532184), (280950, 471529575), (280950, 477724912), (280950, 1584828435), (280950, 1585333327), (280950, 1687866358), (280950, 1692308383), (280950, 1759796335), (280950, 1780363835), (280950, 1782406431), (280950, 1847266266), (280977, 365476451), (280977, 364189059), (280977, 378598000), (280977, 379847289), (280977, 384502784), (280977, 168219347), (280977, 170150834), (280977, 175265938), (280977, 260779171), (280977, 263358794), (280977, 262998198), (280977, 270748746), (280977, 308420144), (280977, 314744346), (280977, 313117914), (280977, 318579550), (280977, 323924193), (280977, 328004323), (280977, 651919378), (280977, 657069957), (280977, 687757675), (280977, 689418308), (280977, 690568203), (280977, 6454166), (280977, 291533608), (280977, 297919938), (280977, 522768282), (280977, 526225015), (280977, 525533660), (280977, 527183092), (280977, 538785640), (280977, 539021081), (280977, 575593408), (280977, 608429027), (280977, 617104047), (280977, 621060722), (280977, 224326637), (280977, 233906123), (280977, 395393455), (280977, 401165409), (280977, 405380990), (280977, 405911735), (280977, 406614162), (280977, 678795478), (280977, 634166393), (280977, 639503585), (280977, 208210784), (280977, 210689436), (280977, 216258743), (280977, 332039712), (280977, 336935310), (280977, 352487256), (280977, 153230677), (280977, 166250829), (280977, 66074774), (280977, 67127586), (280977, 76055636), (280977, 83852289), (280977, 412254450), (280977, 410086940), (280977, 414781074), (280977, 413178405), (280977, 448899856), (280977, 33743971), (280977, 560430540), (280977, 564988210), (280977, 454519437), (280977, 454676225), (280977, 457989478), (280977, 458331691), (280977, 460722996), (280977, 463704913), (280977, 483725490), (280977, 486034888), (280977, 491265322), (280977, 492901163), (280977, 493856576), (280977, 492987217), (280977, 112230533), (280977, 117017185), (280977, 121554458), (280977, 125364129), (280977, 128580510), (280977, 127087245), (280977, 133646013), (280977, 92772944), (280977, 141971410), (280977, 179538658), (280977, 190066310), (280977, 472641774), (280977, 387762143), (280977, 392312600), (280977, 392269655), (280977, 391564990), (281070, 192337253), (281070, 192416400), (281070, 242797712), (281070, 245696669), (281070, 162773670), (281070, 38006893), (281070, 111059704), (281070, 117559049), (281070, 205031551), (281070, 208844055), (281070, 211244538), (281070, 211220593), (281070, 218253382), (281070, 47932856), (281070, 51835840), (281070, 231555092), (281070, 222924259), (281070, 221759413), (281070, 221189065), (281070, 228367360), (281070, 131313504), (281070, 135752567), (281070, 135030279), (281070, 72656009), (281070, 78383468), (281070, 96376699), (281070, 97931771), (281070, 86943653), (281070, 137681597), (281070, 140381102), (281070, 142449920), (281070, 144465752), (281070, 171575804), (281070, 7736444), (281070, 14510533), (281070, 18259543), (281070, 15430442), (281070, 19309202), (281070, 19513374), (281070, 23385511), (281070, 23541950), (281070, 25470016), (281070, 65188443), (281070, 65714474), (281070, 67028285), (281074, 888484336), (281074, 273537729), (281074, 276212772), (281074, 280942138), (281074, 619507362), (281074, 630092935), (281074, 640436165), (281074, 645548959), (281074, 34808881), (281074, 325482124), (281074, 330318367), (281074, 366247814), (281074, 369538972), (281074, 381602704), (281074, 397184907), (281074, 406959623), (281074, 285329216), (281074, 360913395), (281074, 453544923), (281074, 459621542), (281074, 460050685), (281074, 465477012), (281074, 335421019), (281074, 339822511), (281074, 344811336), (281074, 414147451), (281074, 439321357), (281074, 840278119), (281074, 708549150), (281074, 718698674), (281074, 524711937), (281074, 535678391), (281074, 537148497), (281074, 550235441), (281074, 760541692), (281074, 760209243), (281074, 767516472), (281074, 769024585), (281074, 770721279), (281074, 779275957), (281074, 244683125), (281074, 244814916), (281074, 250761141), (281074, 552578557), (281074, 559889754), (281074, 570633644), (281074, 572602585), (281074, 577173612), (281074, 584363979), (281074, 597333283), (281074, 893176571), (281074, 892244664), (281074, 895550244), (281074, 113603384), (281074, 193168847), (281074, 197278677), (281074, 200411496), (281074, 200984217), (281074, 205670863), (281074, 206410720), (281074, 472895841), (281074, 579330928), (281074, 647383111), (281074, 650371446), (281074, 658452666), (281074, 664281861), (281074, 669697895), (281074, 669033136), (281074, 669198066), (281074, 129967617), (281074, 133959788), (281074, 136321117), (281074, 137479241), (281074, 218345823), (281074, 228988690), (281074, 238126522), (281074, 238540891), (281074, 141696082), (281074, 149311146), (281074, 154146117), (281074, 160561783), (281074, 303344684), (281074, 722474558), (281074, 722497656), (281074, 725579326), (281074, 729485499), (281074, 739848233), (281074, 744960772), (281074, 495225638), (281074, 482688754), (281074, 483413322), (281074, 480396575), (281074, 489869351), (281074, 789247969), (281074, 792747399), (281074, 794519565), (281074, 794631689), (281074, 797536535), (281074, 800188797), (281074, 821563734), (281074, 823917117), (281074, 824327382), (281074, 851911621), (281074, 58980774), (281074, 62062566), (281074, 66468550), (281074, 68234192), (281074, 265893479), (281074, 268485881), (281074, 3994271), (281074, 31061967), (281075, 1901934), (281075, 10768291), (281075, 18968296), (281075, 16705086), (281130, 316962841), (281130, 314158900), (281130, 303467992), (281130, 306513303), (281130, 151852403), (281130, 118932816), (281130, 122882407), (281130, 123838423), (281130, 141225843), (281130, 145368974), (281130, 210656037), (281130, 191798820), (281130, 196179651), (281130, 216584551), (281130, 217499609), (281130, 222954151), (281130, 244504707), (281130, 246734873), (281130, 393187507), (281130, 46220569), (281130, 131823719), (281130, 281194765), (281130, 122990048), (281130, 160070069), (281130, 165438380), (281130, 173108140), (281130, 183086891), (281130, 183946265), (281130, 5428775), (281130, 28119213), (281130, 58308319), (281130, 359568397), (281130, 366141086), (281130, 371919789), (281130, 286532535), (281130, 286251240), (281130, 294442485), (281130, 39252595), (281130, 62533604), (281130, 71034790), (281130, 398165520), (281130, 92892529), (281130, 104827700), (281143, 157595537), (281143, 333156839), (281143, 333619871), (281143, 347320050), (281143, 2032281195), (281143, 2037877561), (281143, 1234798740), (281143, 1239163686), (281143, 1243066433), (281143, 1247808657), (281143, 1251899109), (281143, 1255678609), (281143, 1979316791), (281143, 2008822283), (281143, 951503985), (281143, 956153284), (281143, 3061612232), (281143, 3063409045), (281143, 3062680360), (281143, 3071698440), (281143, 3072038605), (281143, 806559205), (281143, 813593589), (281143, 2319301390), (281143, 3461810341), (281143, 3470210182), (281143, 3473567503), (281143, 205434538), (281143, 216658970), (281143, 215583292), (281143, 425370058), (281143, 256754619), (281143, 1202495606), (281143, 1221726046), (281143, 2646382125), (281143, 2644875629), (281143, 2644618760), (281143, 2644347068), (281143, 1116332496), (281143, 1127155737), (281143, 1125402431), (281143, 1134122026), (281143, 1136070997), (281143, 2730733203), (281143, 2742489017), (281143, 2745879884), (281143, 2747109642), (281143, 585174740), (281143, 627857416), (281143, 1583607000), (281143, 3352377218), (281143, 3363067074), (281143, 3412975265), (281143, 3412354320), (281143, 3423020787), (281143, 840870609), (281143, 843593950), (281143, 850167655), (281143, 2289348760), (281143, 2299002002), (281143, 2310641698), (281143, 996119847), (281143, 1003063210), (281143, 1000046734), (281143, 1003652866), (281143, 1013707046), (281143, 1010848037), (281143, 1010430921), (281143, 1016637269), (281143, 1019820624), (281143, 2837116235), (281143, 2835623662), (281143, 2850328518), (281143, 1747460907), (281143, 1747688852), (281143, 1767844683), (281143, 1455827208), (281143, 1461169862), (281143, 1463881902), (281143, 1473882717), (281143, 1477019555), (281143, 1725686810), (281143, 1725822113), (281143, 1401955295), (281143, 1412262046), (281143, 1415285278), (281143, 1420115705), (281143, 1419347139), (281143, 1421363192), (281143, 623654255), (281143, 3595181463), (281143, 3602409437), (281143, 3601870538), (281143, 3609556274), (281143, 676867234), (281143, 678554447), (281143, 1492687951), (281143, 1518002588), (281143, 3905430950), (281143, 2077545436), (281143, 2083628985), (281143, 2106914318), (281143, 38105202), (281143, 55081438), (281143, 60845464), (281143, 57726921), (281143, 65061871), (281143, 1257144239), (281143, 1264564611), (281143, 1263737532), (281143, 2783687433), (281143, 2785643143), (281143, 2788666669), (281143, 2791888303), (281143, 2795422122), (281143, 2799707900), (281143, 1534777181), (281143, 1538080978), (281143, 1537115408), (281143, 1548229928), (281143, 1550903174), (281143, 1622204649), (281143, 1625307021), (281143, 1647435924), (281143, 1649806534), (281143, 2246989491), (281143, 2252447406), (281143, 2270923360), (281143, 2554623654), (281143, 2565211002), (281143, 3284741171), (281143, 3334235996), (281143, 3339428466), (281143, 3348951685), (281143, 2687920571), (281143, 2184506418), (281143, 4223756601), (281143, 4229645827), (281143, 143059276), (281143, 142287587), (281143, 141306090), (281143, 4152602640), (281143, 1788217665), (281143, 1790921846), (281143, 1791744222), (281143, 1802805812), (281143, 1802356894), (281143, 2341726799), (281143, 712697671), (281143, 2863691662), (281143, 2869448870), (281143, 2879063404), (281143, 2879132229), (281143, 2881423057), (281143, 2882934281), (281143, 2885269854), (281143, 2889163508), (281143, 2451692247), (281143, 2457472381), (281143, 2471725123), (281143, 2471637185), (281143, 2066381892), (281143, 2066358496), (281143, 2073387720), (281143, 3248338144), (281143, 3254266012), (281143, 3263486956), (281143, 3267096980), (281143, 3274987680), (281143, 469895296), (281143, 473053691), (281143, 481896991), (281143, 867227854), (281143, 3570845149), (281143, 3700234654), (281143, 3705064006), (281143, 35980951), (281143, 185368900), (281143, 185558909), (281143, 3972163292), (281143, 3558718112), (281143, 3564724489), (281143, 3568326480), (281143, 3571861904), (281143, 302269251), (281143, 303376108), (281143, 304409387), (281143, 315328905), (281143, 317401697), (281143, 1937194549), (281143, 1941898983), (281143, 1953807538), (281143, 1967829737), (281143, 3626709104), (281143, 735126205), (281143, 737825896), (281143, 741721313), (281143, 687713916), (281143, 690622746), (281143, 1874777712), (281143, 1883147330), (281143, 1891159931), (281143, 1060702981), (281143, 1081424334), (281143, 587915869), (281143, 590877447), (281143, 592547173), (281143, 593015307), (281143, 594103820), (281143, 598254838), (281143, 610397433), (281143, 3089558356), (281143, 3141145145), (281143, 3142150545), (281143, 3140353149), (281143, 3143500116), (281143, 3144815266), (281143, 3149260607), (281143, 882854121), (281143, 888231558), (281143, 2402048662), (281143, 2402067900), (281143, 2413902475), (281143, 2413959429), (281143, 2419397288), (281143, 1838274807), (281143, 1846413688), (281143, 1853436960), (281143, 1851750722), (281143, 1024296031), (281143, 2204340582), (281143, 2206945713), (281143, 2208801285), (281143, 2214581867), (281143, 3204740050), (281143, 3209039866), (281143, 3211528833), (281143, 2442716992), (281143, 504259125), (281143, 526827836), (281143, 3533048294), (281143, 3547406065), (281143, 1365468325), (281143, 1367516994), (281143, 1382914120), (281143, 1383973147), (281143, 1387266804), (281143, 1385973507), (281143, 152915185), (281143, 154608774), (281143, 156381922), (281143, 4196794118), (281143, 4205595171), (281143, 4208442399), (281143, 4213738161), (281143, 2761202471), (281143, 759027281), (281143, 761304834), (281143, 769368571), (281143, 778111761), (281143, 783679510), (281143, 782022651), (281143, 2478223815), (281143, 2495347223), (281143, 1081092273), (281143, 1093583895), (281143, 1109700494), (281143, 1109322409), (281143, 3295261786), (281143, 3307978769), (281143, 2945783255), (281143, 2951857003), (281143, 2952973606), (281143, 2968703933), (281143, 2976641388), (281143, 2977578156), (281143, 3096808706), (281143, 3123104163), (281143, 3753336078), (281143, 3758069083), (281143, 3763472525), (281143, 3785778424), (281143, 3428628298), (281143, 3428729768), (281143, 3435313396), (281143, 3445141280), (281143, 3446160451), (281143, 3456425420), (281143, 3458166225), (281143, 3456266623), (281143, 98702485), (281143, 107009256), (281143, 116605576), (281143, 117840018), (281143, 119047242), (281143, 2983956191), (281143, 2985557102), (281143, 2702060967), (281143, 2709145254), (281143, 2710239244), (281143, 2712247657), (281143, 2715576586), (281143, 3046811437), (281143, 3047583327), (281143, 972514684), (281143, 981032119), (281143, 3814779570), (281143, 638826157), (281143, 649742776), (281143, 656846303), (281143, 661819091), (281143, 1568666882), (281143, 1580094041), (281143, 1688012722), (281143, 1700089887), (281143, 1706750974), (281143, 3166661545), (281143, 3223632514), (281143, 3230944477), (281143, 4072332515), (281143, 4084860737), (281143, 4084145884), (281143, 4096486712), (281143, 4095856169), (281143, 4101946684), (281143, 2108694354), (281143, 2111790854), (281143, 2120584830), (281143, 2132546579), (281143, 437738114), (281143, 445959894), (281143, 449043103), (281143, 452944263), (281143, 454736249), (281143, 3372010167), (281143, 3801303010), (281143, 3801153977), (281143, 3808070823), (281143, 3811917914), (281143, 176303631), (281143, 184989418), (281143, 183031458), (281143, 265196423), (281143, 541672995), (281143, 542382512), (281143, 546198417), (281143, 546878667), (281143, 550833127), (281143, 2654323785), (281143, 2659469406), (281143, 2659630671), (281143, 1172403041), (281143, 1183838491), (281143, 3881496657), (281143, 3887796806), (281143, 3897305500), (281143, 3901054726), (281143, 1138789946), (281143, 1142412487), (281143, 1145384194), (281143, 1152447689), (281143, 1150105806), (281143, 1156000849), (281143, 1157422020), (281143, 1163277282), (281143, 280514869), (281143, 3010000753), (281143, 3018777947), (281143, 3512212480), (281143, 3516170502), (281143, 3520289068), (281143, 3525794265), (281143, 3678497429), (281143, 3680449961), (281143, 3751149759), (281143, 820823967), (281143, 830729691), (281143, 68656648), (281143, 77148174), (281143, 95193594), (281143, 93074616), (281143, 1896997077), (281143, 1904800650), (281143, 1912257707), (281143, 1917430690), (281143, 2931804457), (281143, 2991935317), (281143, 2996718205), (281143, 4037788178), (281143, 4038457975), (281143, 4045366719), (281143, 4048314793), (281143, 4052795248), (281143, 4053510388), (281143, 4051936651), (281143, 2050455506), (281143, 2060434996), (281143, 3689572719), (281143, 3691241074), (281143, 3702412630), (281143, 3705826100), (281143, 3712828940), (281143, 3723702909), (281143, 2576651931), (281143, 2584641333), (281143, 2586417263), (281143, 2584370048), (281143, 2598772901), (281143, 930207541), (281143, 1430806120), (281143, 1435246489), (281143, 1445827843), (281143, 1443984051), (281143, 1448418108), (281143, 497238709), (281143, 361030086), (281143, 362222246), (281143, 375548425), (281143, 322076796), (281143, 327939823), (281143, 330209440), (281143, 2229992476), (281143, 2239539990), (281143, 1808896031), (281143, 1812577312), (281143, 1812157791), (281143, 1032330697), (281143, 1041326703), (281143, 1057417818), (281143, 381820393), (281143, 395348181), (281143, 394617983), (281143, 401329985), (281143, 399121161), (281143, 397846921), (281143, 2150353112), (281143, 2160156197), (281143, 2164461832), (281143, 2165720688), (281143, 3919429582), (281143, 3932479759), (281143, 2756431), (281143, 11106510), (281143, 11050325), (281143, 25756691), (281143, 28144957), (281143, 1333449112), (281143, 1339005972), (281143, 1338366733), (281143, 721203231), (281143, 2043826073), (281143, 1982282379), (281143, 4009947724), (281143, 4179450299), (281143, 4187220539), (281143, 3181489347), (281143, 3185362500), (281143, 3185657411), (281143, 3190497661), (281143, 3200995243), (281143, 4023612212), (281143, 4028049269), (281143, 4031368686), (281143, 4127241917), (281143, 4140411189), (281143, 908671097), (281143, 914008100), (281143, 913495166), (281143, 918852184), (281143, 919220828), (281143, 2368205853), (281143, 2377009233), (281143, 2389832336), (281143, 2400245319), (281143, 3834775499), (281143, 3848924798), (281143, 3855738234), (281143, 3319954939), (281143, 3323639709), (281143, 227084758), (281143, 237116621), (281143, 240841256), (281143, 250997266), (281143, 2514319250), (281143, 2515072889), (281143, 2526203403), (281143, 2526938628), (281143, 3950299722), (281143, 2610880409), (281143, 2627156766), (281143, 2627322721), (281143, 2630747559), (281143, 2633581850), (281143, 288986712), (281143, 289469861), (281143, 293902396), (281143, 298413220), (281143, 1602346659), (281143, 1613154549), (281143, 1661088138), (281143, 1667082188), (281143, 1668638047), (281143, 1674983167), (281143, 1676949270), (281143, 1676671010), (281143, 1676999016), (281143, 1679177550), (281143, 3240089300), (281143, 4106098845), (281143, 4113697974), (281143, 4117256686), (281143, 4119363295), (281143, 1282591969), (281143, 1285789506), (281143, 1287074927), (281143, 2899261219), (281143, 2907127329), (281143, 2910948284), (281143, 2919579992), (281143, 2921247872), (281143, 1777076882), (281143, 3654995106), (281143, 3656926151), (281143, 3663007478), (281143, 3669937719), (281143, 3670518898), (281143, 3677939818), (281317, 32518025), (281317, 35402318), (281317, 394529793), (281317, 395792496), (281317, 397491850), (281317, 259973640), (281317, 145824965), (281317, 155818668), (281317, 363862383), (281317, 39330713), (281317, 47208018), (281317, 56434457), (281317, 60177362), (281317, 69074711), (281317, 322578241), (281317, 383138111), (281317, 410841126), (281317, 414490582), (281317, 418398611), (281317, 431245411), (281317, 160741254), (281317, 173020785), (281317, 171616660), (281317, 177421660), (281317, 192765043), (281317, 189952644), (281317, 7026550), (281317, 8185433), (281317, 7591136), (281317, 8661374), (281317, 15249375), (281317, 27265533), (281317, 292294684), (281317, 298825016), (281317, 305890084), (281317, 229039232), (281317, 234566222), (281317, 241415349), (281317, 242796222), (281317, 248264282), (281317, 251714859), (281317, 96214206), (281317, 227422336), (281317, 229567177), (281317, 274763899), (281317, 275688193), (281317, 278980962), (281317, 282530232), (281317, 332027659), (281317, 336102716), (281317, 347939257), (281317, 111927337), (281317, 115742920), (281317, 116599249), (281317, 120482530), (281317, 123680104), (281317, 129416389), (281317, 130455328), (281317, 136601838), (281317, 135648929), (281317, 138895774), (281385, 1166803573), (281385, 1169829490), (281385, 1179336499), (281385, 1388079518), (281385, 1917657899), (281385, 1492378778), (281385, 1491609265), (281385, 1502393604), (281385, 495747737), (281385, 501189070), (281385, 517461069), (281385, 574881507), (281385, 590696146), (281385, 605326260), (281385, 1540080460), (281385, 1549918738), (281385, 1556317449), (281385, 1557381290), (281385, 2140165087), (281385, 2153043496), (281385, 539913767), (281385, 543335546), (281385, 544383660), (281385, 545794434), (281385, 547027374), (281385, 552732304), (281385, 553059816), (281385, 552172327), (281385, 556037306), (281385, 553782387), (281385, 557340600), (281385, 560856414), (281385, 1856011992), (281385, 2115963135), (281385, 2129611655), (281385, 2133905081), (281385, 2176100628), (281385, 2178917324), (281385, 2179172162), (281385, 2182077711), (281385, 2184415713), (281385, 2183737175), (281385, 1328411487), (281385, 1333819359), (281385, 1403781898), (281385, 1404677260), (281385, 1408089491), (281385, 1409869505), (281385, 1413063128), (281385, 1417497573), (281385, 1425157474), (281385, 1428853992), (281385, 704644469), (281385, 715418167), (281385, 721177433), (281385, 729057069), (281385, 734643796), (281385, 734249191), (281385, 737079227), (281385, 1741254183), (281385, 1745166456), (281385, 1744571536), (281385, 1747777200), (281385, 1761628323), (281385, 1761552493), (281385, 2039310342), (281385, 2038413098), (281385, 2042942686), (281385, 1697695625), (281385, 1698690641), (281385, 1700193361), (281385, 483238850), (281385, 489870078), (281385, 623305995), (281385, 629655981), (281385, 640513875), (281385, 641197422), (281385, 642656796), (281385, 1034954318), (281385, 1042651235), (281385, 1048545116), (281385, 1050926491), (281385, 1065164967), (281385, 1067898580), (281385, 1071998037), (281385, 1974985259), (281385, 1982535752), (281385, 1983462364), (281385, 1985849127), (281385, 1998285428), (281385, 2001825787), (281385, 439346906), (281385, 445429273), (281385, 447527528), (281385, 1828865231), (281385, 1839338993), (281385, 1850931701), (281385, 528278767), (281385, 1467852201), (281385, 1471344634), (281385, 1475932184), (281385, 1528364261), (281385, 1531745150), (281385, 910181586), (281385, 911566493), (281385, 916280650), (281385, 923227825), (281385, 1918033635), (281385, 1091486360), (281385, 1507819072), (281385, 1512171947), (281385, 1514749613), (281385, 1514537924), (281385, 1575803953), (281385, 1581687082), (281385, 1605804623), (281385, 1613039197), (281385, 2008745132), (281385, 2010751381), (281385, 2013244918), (281385, 2015071288), (281385, 2017007784), (281385, 2021432069), (281385, 2032998684), (281385, 2032211331), (281385, 2035326933), (281385, 1184958970), (281385, 1200292642), (281385, 1208550872), (281385, 1073528150), (281385, 1122597203), (281385, 1124670577), (281385, 1134765913), (281385, 1147186602), (281385, 1662615434), (281385, 1667987118), (281385, 1673993137), (281385, 1671994282), (281385, 1677164357), (281385, 1679241983), (281385, 1680724294), (281385, 1694144618), (281385, 963069256), (281385, 962516681), (281385, 965793898), (281385, 968674189), (281385, 975113633), (281385, 890140254), (281385, 894981872), (281385, 1661921906), (281385, 1028563565), (281385, 977766425), (281385, 980730781), (281385, 987336483), (281385, 990291653), (281385, 991989937), (281385, 989640726), (281385, 1001824746), (281385, 999491313), (281385, 1003009744), (281385, 1007146005), (281385, 1010573099), (281385, 1011263926), (281385, 1018432099), (281385, 1019184930), (281385, 1022747304), (281385, 653516481), (281385, 870081375), (281385, 872077132), (281385, 1968876126), (281385, 1970719918), (281385, 1969115879), (281385, 1082740267), (281385, 1097785216), (281385, 1098207242), (281385, 1097530077), (281385, 1102044123), (281385, 1739962232), (281385, 825847190), (281385, 419813596), (281385, 425599496), (281385, 1256517836), (281385, 1214161516), (281385, 1217645604), (281385, 1794197259), (281385, 1803728783), (281385, 1801133887), (281385, 1809691076), (281385, 1622566040), (281385, 1622313659), (281385, 1623541543), (281385, 1626020598), (281385, 1651702198), (281385, 1350709903), (281385, 1352776810), (281385, 1357638537), (281385, 1369136090), (281385, 1382834411), (281385, 1156946546), (281385, 1156563153), (281385, 1714194557), (281385, 1715451942), (281385, 1721212809), (281385, 2084309371), (281385, 2096916097), (281385, 2099466381), (281385, 1941358448), (281385, 1940731451), (281385, 1947418685), (281385, 1956759197), (281385, 1956357890), (281385, 747799865), (281385, 1885455563), (281385, 1269983750), (281385, 1277281219), (281385, 1284596682), (281385, 1283350391), (281385, 1244384867), (281385, 1434239234), (281385, 1432486123), (281385, 1433928160), (281385, 1440594116), (281385, 1453117941), (281385, 930534379), (281385, 947299446), (281385, 1285523334), (281385, 1611650175), (281385, 1617754646), (281385, 797345264), (281385, 2200163602), (281385, 2206392910), (281385, 2204124322), (281385, 2208015440), (281385, 858309749), (281385, 857280222), (281385, 1822084888), (281385, 1602882145), (281411, 137947779), (281411, 151338255), (281411, 159844857), (281411, 160858710), (281411, 1877331539), (281411, 1884696854), (281411, 1886962280), (281411, 915533943), (281411, 38319417), (281411, 40536636), (281411, 38845323), (281411, 54152727), (281411, 410543375), (281411, 412792380), (281411, 416946572), (281411, 420642269), (281411, 426686043), (281411, 424158800), (281411, 426725072), (281411, 433328640), (281411, 1120344246), (281411, 1125139041), (281411, 1131825431), (281411, 617441193), (281411, 829522133), (281411, 830202183), (281411, 534856399), (281411, 537636170), (281411, 547867890), (281411, 547686532), (281411, 550654951), (281411, 1898226718), (281411, 1898973049), (281411, 1917609981), (281411, 432455402), (281411, 437744959), (281411, 436096458), (281411, 439242043), (281411, 442107985), (281411, 445209396), (281411, 454457098), (281411, 90526410), (281411, 2329082087), (281411, 2339000952), (281411, 2341013887), (281411, 2347420152), (281411, 2356127194), (281411, 1274956815), (281411, 1275858850), (281411, 1296200774), (281411, 1299729555), (281411, 1301827098), (281411, 1302436693), (281411, 1682241379), (281411, 1690031203), (281411, 569993507), (281411, 572870027), (281411, 571659871), (281411, 576600323), (281411, 577227389), (281411, 586206683), (281411, 2076944854), (281411, 2073929920), (281411, 2082828478), (281411, 2175425186), (281411, 2182090915), (281411, 2201577115), (281411, 392351854), (281411, 397225157), (281411, 396450611), (281411, 398205093), (281411, 403021648), (281411, 408315181), (281411, 1737729881), (281411, 1737776182), (281411, 1741683287), (281411, 1742791232), (281411, 1751875086), (281411, 1751467021), (281411, 949421112), (281411, 2089932835), (281411, 2095570578), (281411, 654855803), (281411, 652908327), (281411, 662778023), (281411, 663035212), (281411, 671026946), (281411, 677835239), (281411, 678571454), (281411, 679951483), (281411, 1402120349), (281411, 1401588869), (281411, 1407271725), (281411, 1424547033), (281411, 1426939915), (281411, 512291583), (281411, 514471989), (281411, 522686254), (281411, 522315907), (281411, 524682367), (281411, 121873192), (281411, 131739317), (281411, 128639106), (281411, 699184528), (281411, 704143866), (281411, 721936958), (281411, 1762519428), (281411, 1777039309), (281411, 1782989700), (281411, 1786384106), (281411, 9085842), (281411, 20872509), (281411, 25971095), (281411, 28521815), (281411, 26923907), (281411, 172233365), (281411, 189768272), (281411, 189700911), (281411, 561500432), (281411, 2269423696), (281411, 2274894478), (281411, 2281750497), (281411, 2464515149), (281411, 2475503986), (281411, 2492127680), (281411, 2508628457), (281411, 2509744902), (281411, 206916373), (281411, 208354805), (281411, 208256375), (281411, 624819143), (281411, 639105340), (281411, 638917378), (281411, 639300418), (281411, 640659994), (281411, 643404469), (281411, 644870515), (281411, 1429542022), (281411, 1444179270), (281411, 2295873390), (281411, 1060612921), (281411, 1064636512), (281411, 1061264910), (281411, 1066043374), (281411, 1076509976), (281411, 1073518979), (281411, 2372962450), (281411, 2377414339), (281411, 2381168931), (281411, 2383752692), (281411, 2387785755), (281411, 1639815238), (281411, 1642185274), (281411, 1643536629), (281411, 1654807440), (281411, 1660478022), (281411, 1667766524), (281411, 1664940957), (281411, 504936849), (281411, 505222624), (281411, 1989273463), (281411, 1996284623), (281411, 1999728749), (281411, 2002791029), (281411, 2004911940), (281411, 2008535736), (281411, 2012947340), (281411, 298059912), (281411, 298725986), (281411, 301170660), (281411, 300890468), (281411, 304076788), (281411, 301686448), (281411, 307114673), (281411, 319951976), (281411, 920780273), (281411, 922917599), (281411, 924946371), (281411, 923092694), (281411, 927837765), (281411, 930378675), (281411, 930910410), (281411, 933994108), (281411, 936788463), (281411, 938507929), (281411, 944256998), (281411, 1161386513), (281411, 1802322833), (281411, 1804250261), (281411, 1804350243), (281411, 1811086894), (281411, 1813089653), (281411, 1821189740), (281411, 228499834), (281411, 238523563), (281411, 1918924707), (281411, 1923983984), (281411, 1930699915), (281411, 1936331234), (281411, 2015258715), (281411, 956291541), (281411, 959924897), (281411, 967047746), (281411, 980370277), (281411, 982981644), (281411, 460519601), (281411, 1023709332), (281411, 1024744798), (281411, 1043963279), (281411, 1046449998), (281411, 366889605), (281411, 369846251), (281411, 371306667), (281411, 382504714), (281411, 1336498299), (281411, 1350658011), (281411, 323089751), (281411, 327108674), (281411, 325868535), (281411, 327896142), (281411, 336871930), (281411, 337278310), (281411, 339637663), (281411, 2054325875), (281411, 2058285734), (281411, 2063682603), (281411, 2067356902), (281411, 2073235988), (281411, 2124774364), (281411, 2127732713), (281411, 2131611852), (281411, 2134569102), (281411, 1623071773), (281411, 1623484350), (281411, 1625158423), (281411, 1631335719), (281411, 256276592), (281411, 263416623), (281411, 263999789), (281411, 1553496398), (281411, 1570452113), (281411, 1569537841), (281411, 2244180012), (281411, 2265506376), (281411, 2421142016), (281411, 2433070377), (281411, 2442759932), (281411, 1370693637), (281411, 1377733038), (281411, 1379425170), (281411, 1380185764), (281411, 1381009217), (281411, 1386861205), (281411, 1389343074), (281411, 1393369239), (281411, 1826713256), (281411, 1826130829), (281411, 1837498611), (281411, 1840276080), (281411, 1843418919), (281411, 1203280503), (281411, 1213732411), (281411, 1218153332), (281411, 1230249461), (281411, 2517933330), (281411, 2523860792), (281411, 2527931236), (281411, 2536166240), (281411, 1962858529), (281411, 1962612569), (281411, 1973067398), (281411, 1983755088), (281411, 1470336291), (281411, 1481285252), (281411, 735346718), (281411, 736125997), (281411, 743800219), (281411, 744889899), (281411, 1088393891), (281411, 1088736682), (281411, 1096407143), (281411, 1105359643), (281411, 1103884353), (281411, 1107878825), (281411, 1110838324), (281411, 2541722927), (281411, 2547903479), (281411, 2554760257), (281411, 1598185829), (281411, 1598703739), (281411, 66704854), (281411, 111828957), (281411, 267687679), (281411, 270520861), (281411, 271888559), (281411, 276782551), (281411, 278641857), (281411, 282497094), (281411, 288056813), (281411, 2210087467), (281411, 2230056977), (281411, 1502470070), (281411, 1506284529), (281411, 1507999446), (281411, 1511142338), (281411, 354859965), (281411, 362754527), (281411, 365434952), (281411, 363728210), (281411, 1523363845), (281411, 1528931922), (281411, 1540682207), (281411, 1707440174), (281411, 1707727906), (281411, 1713788480), (281411, 1716158228), (281411, 1715064431), (281411, 1717372051), (281411, 1718963830), (281411, 1719854126), (281411, 1727728457), (281411, 484332137), (281411, 486586484), (281411, 489403072), (281411, 489685439), (281411, 490490640), (281411, 493434821), (281411, 499851606), (281411, 502528289), (281411, 502195101), (281411, 1301887021), (281411, 1303181507), (281411, 1308148385), (281411, 1322682565), (281411, 1326195379), (281411, 2388472707), (281411, 2398070546), (281411, 2410535535), (281411, 2415712821), (281411, 2413956907), (281411, 2141794107), (281411, 2171142496), (281411, 1238440672), (281411, 1248094002), (281411, 1246262900), (281411, 1257009156), (281411, 1255434196), (281411, 1265086457), (281411, 593147924), (281411, 612822411), (281411, 615088109), (281411, 994006798), (281411, 995922398), (281411, 1002678075), (281411, 1003043229), (281411, 1008954784), (281411, 1011309099), (281411, 692671354), (281411, 1175343312), (281411, 1179230017), (281411, 1178102591), (281411, 1181673278), (281411, 1181834093), (281411, 1183385738), (281411, 1195121856), (281411, 2014996510), (281411, 2014878068), (281411, 2024353197), (281411, 2027208695), (281411, 2029522374), (281411, 2030114830), (281411, 2035915455), (282631, 164145147), (282631, 172636144), (282631, 172152699), (282631, 174434844), (282631, 179928046), (282631, 183230456), (282631, 140457108), (282631, 72394287), (282631, 79322921), (282631, 87687843), (282631, 457133688), (282631, 464432582), (282631, 464840905), (282631, 48431519), (282631, 54105578), (282631, 57793888), (282631, 13691678), (282631, 23420702), (282631, 22244749), (282631, 25360542), (282631, 31817306), (282631, 66831383), (282631, 105030383), (282631, 107770511), (282631, 114199554), (282631, 113605190), (282631, 116129552), (282631, 199067188), (282631, 200972369), (282631, 204448318), (282631, 208368489), (282631, 287220382), (282631, 288771130), (282631, 300466818), (282631, 523659965), (282631, 524175880), (282631, 526307054), (282631, 528525381), (282631, 532426345), (282631, 534692956), (282631, 223143649), (282631, 226372046), (282631, 236561993), (282631, 241403014), (282631, 243709095), (282631, 247027686), (282631, 247686013), (282631, 103605080), (282631, 406209206), (282631, 414785039), (282631, 414343446), (282631, 419290818), (282631, 425722136), (282631, 429717615), (282631, 481796677), (282631, 181190985), (282631, 189604314), (282631, 316847565), (282631, 329158325), (282631, 344823384), (282631, 350091474), (282631, 349401847), (282631, 353204333), (282631, 435233292), (282631, 440803772), (282631, 443850796), (282631, 478142100), (282631, 338236152), (282631, 340084300), (282631, 360771635), (282631, 375906112), (282631, 498994058), (282631, 507875751), (282712, 281503239), (282712, 286434708), (282712, 1013927163), (282712, 1019120311), (282712, 1026923892), (282712, 449799817), (282712, 455154639), (282712, 453301508), (282712, 479965646), (282712, 1591686909), (282712, 1616587791), (282712, 514291356), (282712, 239459900), (282712, 7885361), (282712, 14042241), (282712, 88319302), (282712, 88866193), (282712, 92985689), (282712, 100280934), (282712, 102382789), (282712, 107153133), (282712, 109273376), (282712, 108657057), (282712, 116068553), (282712, 1250511769), (282712, 1255031765), (282712, 1258916908), (282712, 1265229947), (282712, 301751957), (282712, 303004392), (282712, 307309098), (282712, 345601072), (282712, 346112488), (282712, 812877298), (282712, 830369607), (282712, 837625008), (282712, 1140248495), (282712, 695773453), (282712, 709436355), (282712, 615082015), (282712, 794729112), (282712, 794950039), (282712, 1453337605), (282712, 1451969787), (282712, 1456770956), (282712, 1458706470), (282712, 1463869951), (282712, 1471463602), (282712, 1473372122), (282712, 1477668749), (282712, 38660565), (282712, 45320617), (282712, 45694035), (282712, 117297847), (282712, 119169907), (282712, 790734487), (282712, 798638754), (282712, 802746378), (282712, 806690932), (282712, 807698273), (282712, 769738952), (282712, 768263543), (282712, 466717584), (282712, 215316272), (282712, 1203789614), (282712, 1215039466), (282712, 1219471579), (282712, 1222956523), (282712, 128715187), (282712, 134141735), (282712, 135343271), (282712, 138539853), (282712, 139101984), (282712, 138973686), (282712, 63856919), (282712, 65533295), (282712, 70492518), (282712, 75489278), (282712, 74120086), (282712, 632336039), (282712, 638093613), (282712, 649946548), (282712, 1485446237), (282712, 1514444547), (282712, 1522069277), (282712, 359158896), (282712, 360337972), (282712, 372430062), (282712, 743204098), (282712, 747377098), (282712, 748038550), (282712, 269148113), (282712, 270681847), (282712, 271566281), (282712, 276161360), (282712, 278926535), (282712, 282058736), (282712, 287565611), (282712, 289265632), (282712, 289715928), (282712, 309362408), (282712, 325490901), (282712, 1083077939), (282712, 1091658790), (282712, 89225285), (282712, 418966250), (282712, 429731165), (282712, 437430600), (282712, 338036190), (282712, 914892035), (282712, 922692047), (282712, 927687869), (282712, 926015329), (282712, 402220110), (282712, 489228759), (282712, 495840062), (282712, 496800748), (282712, 1442423427), (282712, 1445872111), (282712, 1446643220), (282712, 1449701487), (282712, 1449065783), (282712, 555857703), (282712, 577598305), (282712, 845473343), (282712, 845627908), (282712, 851839315), (282712, 854964652), (282712, 937575447), (282712, 941456314), (282712, 956229444), (282712, 971260457), (282712, 1688405539), (282712, 1689695945), (282712, 1701662423), (282712, 1702472198), (282712, 1179943863), (282712, 1184281103), (282712, 1190782484), (282712, 1191798010), (282712, 528390450), (282712, 533218350), (282712, 538918442), (282712, 537386367), (282712, 1328858563), (282712, 1369307982), (282712, 1374704448), (282712, 1379018645), (282712, 1385936630), (282712, 1120936199), (282712, 1657341999), (282712, 1662966956), (282712, 1662022616), (282712, 865247513), (282712, 867974903), (282712, 875838618), (282712, 878291731), (282712, 881617396), (282712, 25908370), (282712, 27319310), (282712, 29878572), (282712, 585480051), (282712, 582591255), (282712, 586909199), (282712, 601035211), (282712, 1363519019), (282712, 1363469522), (282712, 155594944), (282712, 164150731), (282712, 169949251), (282712, 179646546), (282712, 177952632), (282712, 180667539), (282712, 966481555), (282712, 987951300), (282712, 987892137), (282712, 992669933), (282712, 673829644), (282712, 675404714), (282712, 675214565), (282712, 675327498), (282712, 676034846), (282712, 682515221), (282712, 685348605), (282712, 1154811079), (282712, 1162143477), (282712, 1169114059), (282712, 1167190380), (282712, 1174090853), (282712, 1178575044), (282712, 376269137), (282712, 380679836), (282712, 387667239), (282712, 395429988), (282712, 567388425), (282712, 645142748), (282712, 247223028), (282712, 257696585), (282712, 261095829), (282712, 266015717), (282712, 267801783), (282712, 1400405523), (282712, 1413840599), (282712, 1421477395), (282712, 1421547094), (282712, 684946496), (282712, 737373695), (282712, 744238898), (282712, 1345610885), (282712, 1357056666), (282712, 658152214), (282712, 151343646), (282712, 228154044), (282712, 229460118), (282712, 1036581793), (282712, 1035806227), (282712, 1037328879), (282712, 1048897072), (282712, 1045259557), (282712, 1055128234), (282712, 1056418297), (282712, 1059587994), (282712, 1062474835), (282712, 1066204788), (282712, 1617021782), (282712, 1634019125), (282712, 1639755171), (282712, 1645394184), (282712, 1647118432), (282712, 183071675), (282712, 183824040), (282712, 1232413675), (282712, 1234507659), (282712, 1238950355), (282712, 1242440883), (282712, 202492892), (282712, 212041168), (282712, 213280350), (282712, 1566723774), (282712, 1576865231), (282712, 1301866112), (282712, 1303987841), (282712, 1309702397), (282712, 1322701344), (282712, 1280062625), (282712, 1280421338), (282712, 1522431536), (282712, 1529576228), (282712, 1538987376), (282712, 1554186064), (282784, 214990654), (282784, 186669593), (282784, 190115226), (282784, 192328893), (282784, 198450167), (282784, 201009003), (282784, 199693025), (282784, 205139952), (282784, 210950615), (282784, 212502657), (282992, 1369468980), (282992, 1384541083), (282992, 1487289827), (282992, 1688369842), (282992, 1694560400), (282992, 1697233400), (282992, 1699794724), (282992, 1703028820), (282992, 1703479842), (282992, 1710868796), (282992, 1815708714), (282992, 1821291048), (282992, 1825141642), (282992, 1824915980), (282992, 1677932827), (282992, 1676444247), (282992, 1684323682), (282992, 1833331320), (282992, 1837202715), (282992, 1839748999), (282992, 86800076), (282992, 94469874), (282992, 99310122), (282992, 105401527), (282992, 118338605), (282992, 834609128), (282992, 842107496), (282992, 859364748), (282992, 156139420), (282992, 154177383), (282992, 162471403), (282992, 167632681), (282992, 172265484), (282992, 1490332461), (282992, 1488281007), (282992, 1503888366), (282992, 1512288755), (282992, 1519961330), (282992, 351580395), (282992, 371192926), (282992, 379626357), (282992, 378563244), (282992, 1108365502), (282992, 1028923119), (282992, 1033296444), (282992, 1037058205), (282992, 1042589043), (282992, 620757647), (282992, 627993366), (282992, 636346167), (282992, 637542203), (282992, 303902811), (282992, 528200428), (282992, 553940478), (282992, 74028032), (282992, 948226460), (282992, 956957137), (282992, 956337043), (282992, 966193126), (282992, 969659490), (282992, 969956701), (282992, 1580650260), (282992, 1588974554), (282992, 2057118256), (282992, 941783114), (282992, 1887494624), (282992, 1893242089), (282992, 1898092758), (282992, 1899072635), (282992, 1914503524), (282992, 1266369114), (282992, 1270173928), (282992, 1289991550), (282992, 1295117616), (282992, 703509169), (282992, 703648166), (282992, 708366977), (282992, 710507315), (282992, 709048911), (282992, 710471116), (282992, 713984794), (282992, 712131398), (282992, 721765977), (282992, 723044147), (282992, 724740770), (282992, 731376548), (282992, 733153192), (282992, 602780333), (282992, 610181314), (282992, 612578585), (282992, 614861689), (282992, 189048096), (282992, 788265646), (282992, 1856028682), (282992, 1859992654), (282992, 1859348300), (282992, 1863556838), (282992, 1863087351), (282992, 1872531805), (282992, 1873480399), (282992, 1878042450), (282992, 245666044), (282992, 250165465), (282992, 262077444), (282992, 1636579531), (282992, 1640383529), (282992, 1641252236), (282992, 1652213186), (282992, 1658189811), (282992, 1659187722), (282992, 1662461275), (282992, 1666559306), (282992, 866104136), (282992, 876204178), (282992, 878535487), (282992, 887625285), (282992, 343422334), (282992, 344362973), (282992, 346932440), (282992, 696421227), (282992, 619486735), (282992, 1230041483), (282992, 1240462701), (282992, 1250741850), (282992, 1187597163), (282992, 1152515775), (282992, 1158826398), (282992, 1161161836), (282992, 559048523), (282992, 1095486584), (282992, 1101508812), (282992, 437236161), (282992, 445313545), (282992, 1193506553), (282992, 1204082141), (282992, 1225028371), (282992, 907134588), (282992, 909855422), (282992, 917937031), (282992, 1441602093), (282992, 1542328364), (282992, 1778608809), (282992, 860715296), (282992, 864346080), (282992, 867287651), (282992, 120877521), (282992, 1786706653), (282992, 1796268256), (282992, 1798188652), (282992, 316346808), (282992, 318543518), (282992, 322487299), (282992, 340103616), (282992, 1987380229), (282992, 1993811040), (282992, 1998841988), (282992, 2003118036), (282992, 2009327605), (282992, 2009882343), (282992, 2014033155), (282992, 675779717), (282992, 680401496), (282992, 680401677), (282992, 681640257), (282992, 684177504), (282992, 686320809), (282992, 690149979), (282992, 33082249), (282992, 130497780), (282992, 149646511), (282992, 499645985), (282992, 506220530), (282992, 503698882), (282992, 508751263), (282992, 983189140), (282992, 983212343), (282992, 985489420), (282992, 991760279), (282992, 991920605), (282992, 997407124), (282992, 1004735019), (282992, 1556496187), (282992, 1558852819), (282992, 1566512813), (282992, 1567867313), (282992, 1575275403), (282992, 1576403301), (282992, 560710255), (282992, 564635153), (282992, 576169719), (282992, 576038965), (282992, 1744423827), (282992, 1750290008), (282992, 1764221550), (282992, 1767287806), (282992, 1770620825), (282992, 1170319725), (282992, 1174962492), (282992, 227843463), (282992, 232389139), (282992, 902305658), (282992, 1121688638), (282992, 1125786066), (282992, 1130386322), (282992, 1137689537), (282992, 1147014465), (282992, 589569963), (282992, 595748111), (282992, 1590081674), (282992, 1593109055), (282992, 1600857751), (282992, 1603607155), (282992, 1609087998), (282992, 1614450082), (282992, 395679384), (282992, 399887047), (282992, 406047446), (282992, 402843592), (282992, 406100830), (282992, 415397114), (282992, 419057119), (282992, 418462677), (282992, 797628482), (282992, 808180777), (282992, 809857909), (282992, 2024251316), (282992, 2027115584), (282992, 2034516914), (282992, 2037315874), (282992, 2038612523), (282992, 2045674360), (282992, 2049630608), (282992, 1344358957), (282992, 1345599765), (282992, 58084171), (282992, 61106243), (282992, 932190055), (282992, 929965989), (282992, 934679987), (282992, 277126723), (282992, 279720069), (282992, 277933972), (282992, 287893949), (282992, 295195884), (282992, 1059179264), (282992, 1059366283), (282992, 1064382267), (282992, 1716174230), (282992, 1522571756), (282992, 1525513618), (282992, 1525692773), (282992, 1529571099), (282992, 1450847850), (282992, 1456164393), (282992, 462841266), (282992, 473764450), (282992, 482902372), (282992, 1393055058), (282992, 1397792638), (282992, 1397487166), (282992, 1402934344), (282992, 1411488371), (282992, 1415188041), (282992, 1420929731), (282992, 1227658113), (282992, 1307053624), (282992, 1939951520), (282992, 1950010036), (282992, 1961511934), (282992, 197789704), (282992, 198076477), (282992, 196052754), (282992, 200902747), (282992, 204329774), (282992, 220678674), (282992, 1614318414), (282992, 1624075976), (282992, 1626065956), (282992, 1627250791), (282992, 1633247809), (282992, 1631070459), (282992, 1632260828), (282992, 1785055939), (282992, 2069018885), (282992, 748987174), (282992, 746940214), (282992, 750601558), (282992, 753205069), (282992, 757041740), (282992, 773301112), (282992, 1754460), (282992, 3869674), (282992, 9614057), (282992, 13874393), (283074, 413962421), (283074, 125393055), (283074, 35092814), (283074, 58796804), (283074, 60034698), (283074, 64083335), (283074, 852156132), (283074, 855503794), (283074, 857774819), (283074, 859603837), (283074, 869146271), (283074, 443223995), (283074, 457800440), (283074, 462039488), (283074, 467035898), (283074, 171948160), (283074, 171514785), (283074, 177208813), (283074, 180793725), (283074, 178404694), (283074, 181925388), (283074, 203366813), (283074, 982240747), (283074, 730567567), (283074, 737010345), (283074, 885060386), (283074, 892431376), (283074, 908334404), (283074, 914310650), (283074, 923121020), (283074, 922310719), (283074, 407586874), (283074, 431306664), (283074, 433649415), (283074, 646013336), (283074, 650629004), (283074, 654947848), (283074, 669849879), (283074, 668368900), (283074, 519196350), (283074, 521143241), (283074, 528440854), (283074, 532569046), (283074, 340999735), (283074, 343509910), (283074, 482123898), (283074, 498062067), (283074, 349663342), (283074, 346793587), (283074, 824011492), (283074, 830863121), (283074, 844175588), (283074, 843152720), (283074, 149881125), (283074, 151747353), (283074, 236243179), (283074, 297881234), (283074, 302229066), (283074, 302410366), (283074, 301291543), (283074, 3232598), (283074, 19142224), (283074, 242750003), (283074, 247079410), (283074, 254543909), (283074, 394026334), (283074, 397204580), (283074, 416583891), (283074, 432311874), (283074, 431136905), (283074, 173465640), (283074, 622740088), (283074, 909917370), (283074, 87529457), (283074, 84989916), (283074, 752929218), (283074, 800821491), (283074, 808557274), (283074, 810573999), (283074, 77480842), (283074, 79556274), (283074, 83326275), (283074, 85629156), (283074, 92028977), (283074, 22186194), (283074, 27059898), (283074, 572851277), (283074, 593984818), (283074, 593259555), (283074, 108608961), (283074, 118196938), (283074, 603009893), (283074, 608371529), (283074, 615339862), (283074, 632894283), (283074, 170112725), (283074, 537612567), (283074, 539762853), (283074, 500072422), (283074, 512174529), (283074, 562409932), (283074, 310356627), (283074, 369753747), (283074, 377307282), (283074, 1012699693), (283074, 1015196526), (283074, 699588484), (283074, 705700940), (283074, 711679453), (283074, 959195913), (283074, 957045172), (283074, 965402006), (283074, 966620502), (283074, 261307649), (283074, 264687684), (283074, 262069609), (283074, 265477195), (283074, 265311981), (283074, 275360017), (283074, 277300892), (283074, 279910138), (283074, 785412612), (283074, 793663598), (283074, 792304498), (283074, 386056127), (283074, 390669110), (283074, 392802805), (283074, 188467611), (283074, 190702979), (283155, 255415335), (283155, 31961439), (283155, 29825428), (283155, 66830298), (283155, 74220812), (283155, 78463673), (283155, 80000034), (283155, 81231352), (283155, 82108929), (283155, 455612776), (283155, 464364209), (283155, 466591493), (283155, 251325493), (283155, 265780702), (283155, 265392746), (283155, 60335975), (283155, 63431180), (283155, 65031520), (283155, 339776290), (283155, 351448942), (283155, 353690469), (283155, 404129905), (283155, 407734955), (283155, 2434826), (283155, 12593978), (283155, 13516481), (283155, 15581545), (283155, 19157358), (283155, 22059563), (283155, 25103385), (283155, 514586471), (283155, 375332043), (283155, 372987828), (283155, 378054182), (283155, 390431257), (283155, 411870342), (283155, 326599941), (283155, 334276112), (283155, 353041192), (283155, 357697338), (283155, 127414098), (283155, 269547021), (283155, 278387638), (283155, 281383602), (283155, 482701672), (283155, 495422653), (283155, 497751094), (283155, 173310297), (283155, 179959945), (283155, 192055255), (283155, 235609940), (283155, 245767391), (283155, 411623221), (283155, 416341368), (283155, 424910220), (283155, 431784196), (283155, 441773001), (283155, 210202168), (283155, 223342059), (283155, 226138675), (283155, 225543919), (283155, 298057100), (283155, 302125674), (283155, 311379775), (283155, 35030390), (283155, 43072717), (283155, 51971999), (283155, 211406580), (283155, 92191386), (283155, 94001150), (283155, 93208800), (283155, 137685525), (283155, 141439776), (283155, 145900642), (283155, 145535911), (283155, 145537315), (283155, 150613654), (283155, 153803009), (283155, 157555819), (283155, 155743540), (283155, 159332962), (283155, 196063676), (283270, 33294235), (283270, 36192261), (283270, 59321623), (283270, 58058012), (283270, 1820228), (283270, 4498654), (283270, 3617124), (283270, 6598496), (283270, 9906075), (283270, 12351943), (283270, 137056290), (283270, 144679678), (283270, 143022586), (283270, 144968888), (283270, 100376419), (283270, 102016811), (283270, 102735375), (283270, 187178678), (283270, 194896126), (283270, 122793824), (283270, 127780643), (283270, 132087804), (283270, 198632194), (283270, 200259063), (283270, 151920098), (283270, 149356594), (283270, 164944045), (283270, 168684140), (283270, 169574492), (283270, 168198551), (283270, 90191285), (283270, 90877228), (283270, 92847189), (283270, 92446332), (283270, 60312914), (283270, 65323314), (283270, 66654094), (283270, 177425604), (283270, 186523400), (283270, 187582241), (283270, 196284164), (283270, 22527357), (283270, 24693622), (283270, 33253502), (283270, 77688725), (283270, 79011437), (283270, 83039711), (283429, 1568219006), (283429, 244485841), (283429, 247006731), (283429, 247340541), (283429, 250729503), (283429, 130985192), (283429, 136074718), (283429, 152898599), (283429, 1610875741), (283429, 1630687495), (283429, 493306414), (283429, 500716570), (283429, 1739935191), (283429, 1748348130), (283429, 1760812562), (283429, 3154832141), (283429, 3163370499), (283429, 3166626130), (283429, 432308390), (283429, 438987055), (283429, 453007110), (283429, 452746668), (283429, 4287180121), (283429, 4289714320), (283429, 4303772153), (283429, 4308246034), (283429, 3984249254), (283429, 3992442565), (283429, 4002305370), (283429, 3201252170), (283429, 3206252045), (283429, 3211497408), (283429, 3214499570), (283429, 97700639), (283429, 110931576), (283429, 108211614), (283429, 109939007), (283429, 112927238), (283429, 115655026), (283429, 975012959), (283429, 985822987), (283429, 994827429), (283429, 889160859), (283429, 930426329), (283429, 931856983), (283429, 946405503), (283429, 959435798), (283429, 961840220), (283429, 962030017), (283429, 2565172596), (283429, 2566373514), (283429, 2570815020), (283429, 1092410746), (283429, 3832416470), (283429, 3832095668), (283429, 3834350993), (283429, 3835111780), (283429, 3834325054), (283429, 3843068920), (283429, 3846943720), (283429, 3844826725), (283429, 3850130737), (283429, 3854984852), (283429, 3899905144), (283429, 3902255541), (283429, 3902406164), (283429, 3903956539), (283429, 3910264546), (283429, 919575980), (283429, 927166860), (283429, 1138765052), (283429, 1142429272), (283429, 1146786562), (283429, 1148515735), (283429, 4319779759), (283429, 3250899224), (283429, 3262843742), (283429, 2965553285), (283429, 2977648409), (283429, 2980144403), (283429, 2983755714), (283429, 3045583763), (283429, 191432685), (283429, 203409887), (283429, 205793440), (283429, 203941339), (283429, 779193563), (283429, 789613734), (283429, 791578685), (283429, 791560253), (283429, 793497821), (283429, 3658909047), (283429, 3658563341), (283429, 1854549429), (283429, 710988344), (283429, 715251126), (283429, 726764622), (283429, 759171954), (283429, 764356472), (283429, 765851778), (283429, 767728949), (283429, 771439619), (283429, 769829729), (283429, 4025323188), (283429, 4024244068), (283429, 4029368436), (283429, 4040229899), (283429, 4041097666), (283429, 4040389161), (283429, 3720369363), (283429, 3858160171), (283429, 3856484892), (283429, 3862943273), (283429, 3874003074), (283429, 3880790472), (283429, 4376574550), (283429, 4382553006), (283429, 3617300603), (283429, 2041283869), (283429, 2050026896), (283429, 2054795990), (283429, 2063988991), (283429, 2067288657), (283429, 2071331679), (283429, 2077565655), (283429, 4051947625), (283429, 4064107769), (283429, 4062204931), (283429, 4065520608), (283429, 4067188391), (283429, 4072878367), (283429, 4076825505), (283429, 4081293443), (283429, 3460567151), (283429, 3462075389), (283429, 3465467335), (283429, 3468422260), (283429, 3472653911), (283429, 3475164236), (283429, 29863443), (283429, 36912675), (283429, 558569517), (283429, 570456916), (283429, 567782100), (283429, 3775156959), (283429, 3777512506), (283429, 3789189626), (283429, 1691485510), (283429, 1701962439), (283429, 1705665608), (283429, 167359932), (283429, 165676008), (283429, 172673772), (283429, 1497078368), (283429, 1497461720), (283429, 1499296873), (283429, 3368399226), (283429, 3369511102), (283429, 3370455364), (283429, 3377644708), (283429, 3380450858), (283429, 3389047231), (283429, 3390071769), (283429, 2589713617), (283429, 2596702142), (283429, 2602444722), (283429, 2602098431), (283429, 2600529493), (283429, 2606581332), (283429, 2712151929), (283429, 2715080532), (283429, 2719123793), (283429, 2721256348), (283429, 2724216377), (283429, 2725514909), (283429, 2798374229), (283429, 2134419828), (283429, 2149066396), (283429, 2154109300), (283429, 2158705712), (283429, 2170931364), (283429, 1411251880), (283429, 1960933562), (283429, 1973709523), (283429, 1974079176), (283429, 296045908), (283429, 296357193), (283429, 297523875), (283429, 301525545), (283429, 302105104), (283429, 305746143), (283429, 305493606), (283429, 3275801214), (283429, 3278435582), (283429, 3299159541), (283429, 1001056843), (283429, 1018867418), (283429, 1024295603), (283429, 1032296511), (283429, 214343518), (283429, 226772014), (283429, 3091100277), (283429, 3099868561), (283429, 3108629569), (283429, 3113014176), (283429, 3113073679), (283429, 673886676), (283429, 679351213), (283429, 679978717), (283429, 679730532), (283429, 681304456), (283429, 685193626), (283429, 687066592), (283429, 688427583), (283429, 3505588038), (283429, 3510530848), (283429, 3512779320), (283429, 3514463952), (283429, 3517901017), (283429, 3532020390), (283429, 745052602), (283429, 754261689), (283429, 760669830), (283429, 43262327), (283429, 47486802), (283429, 56229484), (283429, 54836344), (283429, 60530253), (283429, 57905552), (283429, 1422277783), (283429, 1923742587), (283429, 1954595987), (283429, 190690269), (283429, 189780618), (283429, 230196771), (283429, 231338891), (283429, 361253582), (283429, 363078983), (283429, 367517457), (283429, 370318809), (283429, 2080849777), (283429, 2078573315), (283429, 1594744936), (283429, 3538737879), (283429, 3551290031), (283429, 3555061094), (283429, 3555837313), (283429, 3559905432), (283429, 3567206309), (283429, 1672817258), (283429, 3683952589), (283429, 3689518027), (283429, 3701752323), (283429, 3707488220), (283429, 3712909476), (283429, 2322124907), (283429, 2324677768), (283429, 2331267540), (283429, 2807247984), (283429, 2807823212), (283429, 2805910454), (283429, 2824178115), (283429, 321312843), (283429, 326932750), (283429, 328995004), (283429, 334318321), (283429, 1428487157), (283429, 1431543265), (283429, 1430371235), (283429, 1444619042), (283429, 1448204477), (283429, 1451549730), (283429, 1452257562), (283429, 1458434832), (283429, 2478349822), (283429, 2645719604), (283429, 2649828905), (283429, 2662413856), (283429, 2666023662), (283429, 2670419257), (283429, 2673593832), (283429, 3924890130), (283429, 3927361733), (283429, 3939657121), (283429, 273590802), (283429, 278833118), (283429, 279751057), (283429, 282731641), (283429, 283168232), (283429, 1893054343), (283429, 1907078338), (283429, 1905490517), (283429, 1906339863), (283429, 1289025873), (283429, 873832655), (283429, 880604991), (283429, 1785672245), (283429, 1793004654), (283429, 403679302), (283429, 1542179329), (283429, 1545147684), (283429, 2457503578), (283429, 2460940619), (283429, 2467411411), (283429, 2468851110), (283429, 2467614009), (283429, 3028259758), (283429, 3339249463), (283429, 1874233061), (283429, 4333055508), (283429, 4345902245), (283429, 4353011335), (283429, 4360234404), (283429, 4359784933), (283429, 2259226438), (283429, 2265174467), (283429, 2265505835), (283429, 2268586840), (283429, 2281706051), (283429, 2285086152), (283429, 2288554919), (283429, 3396333867), (283429, 3404253778), (283429, 1777389605), (283429, 1774499522), (283429, 1783805170), (283429, 619115370), (283429, 625818835), (283429, 630689310), (283429, 632240653), (283429, 636723935), (283429, 641297584), (283429, 1001418601), (283429, 2109819049), (283429, 2111498696), (283429, 2121797053), (283429, 1470407735), (283429, 1472927198), (283429, 1474612726), (283429, 1473282681), (283429, 2862578531), (283429, 2861251935), (283429, 2868557501), (283429, 2872669265), (283429, 2877049740), (283429, 2292211727), (283429, 2296247868), (283429, 2296837506), (283429, 2492528996), (283429, 2492997104), (283429, 2493706220), (283429, 2501355218), (283429, 2804685501), (283429, 2514477542), (283429, 1042922326), (283429, 519055607), (283429, 520801387), (283429, 521233569), (283429, 528342675), (283429, 533443923), (283429, 534892139), (283429, 1338715098), (283429, 1341227525), (283429, 1345933502), (283429, 1347572381), (283429, 1350628719), (283429, 1353750201), (283429, 1710451591), (283429, 1712457222), (283429, 1714267360), (283429, 1725472193), (283429, 1731691979), (283429, 1262083256), (283429, 2168165121), (283429, 387232267), (283429, 385696011), (283429, 469139851), (283429, 470252232), (283429, 476014765), (283429, 473119260), (283429, 478765328), (283429, 483913232), (283429, 2222485530), (283429, 2226167441), (283429, 2227436004), (283429, 2241407046), (283429, 660386328), (283429, 667238559), (283429, 670704258), (283429, 1641788340), (283429, 1648356349), (283429, 1652779083), (283429, 1650961418), (283429, 1653088121), (283429, 1654780636), (283429, 4119344671), (283429, 4122529634), (283429, 4120936515), (283429, 4126424447), (283429, 4139856975), (283429, 4145084929), (283429, 4149114126), (283429, 837859816), (283429, 847065940), (283429, 1301737586), (283429, 1302326650), (283429, 1302356172), (283429, 1303174246), (283429, 1309077525), (283429, 2177602759), (283429, 2185680487), (283429, 2204205931), (283429, 2206742965), (283429, 1203632208), (283429, 1255479864), (283429, 3061607704), (283429, 3069835072), (283429, 3073394332), (283429, 504770333), (283429, 508533816), (283429, 508791938), (283429, 509846159), (283429, 515007267), (283429, 514419073), (283429, 2377780619), (283429, 2380812873), (283429, 2383699803), (283429, 578385949), (283429, 587274544), (283429, 594567488), (283429, 599439862), (283429, 606280065), (283429, 3807815327), (283429, 3808711099), (283429, 3818027379), (283429, 3828974950), (283429, 3450044180), (283429, 571929234), (283429, 1085283746), (283429, 4094774025), (283429, 2247302053), (283429, 2248557476), (283429, 2300072786), (283429, 2300474375), (283429, 2306265719), (283429, 2309074071), (283429, 2616834008), (283429, 2626664227), (283429, 2635374872), (283429, 614899326), (283429, 1982551741), (283429, 1985809357), (283429, 1993294074), (283429, 2001454718), (283429, 1998281606), (283429, 2006147523), (283429, 1119270326), (283429, 1116497310), (283429, 1124415366), (283429, 1127072185), (283429, 1127605030), (283429, 1153630855), (283429, 4242479524), (283429, 4243012845), (283429, 4254037800), (283429, 4260292556), (283429, 2924571602), (283429, 2929287436), (283429, 2943703779), (283429, 2947551678), (283429, 2948633892), (283429, 2959332695), (283429, 3888795367), (283429, 3952584570), (283429, 3959814402), (283429, 3969734607), (283429, 3973943845), (283429, 3973087613), (283429, 3537345202), (283429, 3725899743), (283429, 3728313248), (283429, 3730635520), (283429, 3745033277), (283429, 3408085420), (283429, 3420104884), (283429, 3425693670), (283429, 3425930013), (283429, 3432953454), (283429, 3431631450), (283429, 3439455866), (283429, 1318435491), (283429, 1326788884), (283429, 1327516212), (283429, 3594906738), (283429, 3595153036), (283429, 1812929456), (283429, 1822408863), (283429, 1824967979), (283429, 1219879484), (283429, 1228982280), (283429, 1233393258), (283429, 1237024743), (283429, 1236247156), (283429, 1241669258), (283429, 2690802429), (283429, 2752070992), (283429, 64812095), (283429, 66543092), (283429, 67551797), (283429, 66413539), (283429, 461288363), (283429, 2009703357), (283429, 2013785421), (283429, 2014166506), (283429, 2013259179), (283429, 2033368422), (283429, 2406979974), (283429, 2426140270), (283429, 2423371590), (283429, 346552488), (283429, 350441743), (283429, 415905704), (283429, 423017570), (283429, 421244554), (283429, 425692996), (283429, 883661690), (283429, 1080451873), (283429, 1358857561), (283429, 2996639550), (283429, 3000465308), (283429, 3010114648), (283429, 3012836552), (283429, 3018374053), (283429, 3021384870), (283429, 5961771), (283429, 7253149), (283429, 15570795), (283429, 20154264), (283429, 19685710), (283429, 4267295154), (283429, 4279255345), (283429, 4279523644), (283429, 822228323), (283429, 835374236), (283429, 836791829), (283429, 2433749393), (283429, 2433775635), (283429, 2437613859), (283429, 2536502620), (283429, 2536232272), (283429, 2537859565), (283429, 2539502626), (283429, 2541082686), (283429, 2542905291), (283429, 2559536502), (283429, 314350829), (283429, 316107436), (283429, 316588549), (283429, 542406971), (283429, 549310005), (283429, 695567037), (283429, 695914374), (283429, 654093188), (283429, 652490083), (283429, 1157082497), (283429, 1399981608), (283429, 1402190633), (283429, 2886327653), (283429, 4190755807), (283429, 4194329473), (283429, 4200790959), (283429, 4204458339), (283429, 4206272332), (283429, 4206862755), (283429, 4215249761), (283429, 2842231648), (283429, 2841058576), (283429, 957062010), (283429, 734935200), (283429, 3173693858), (283429, 3175532695), (283429, 1522124357), (283429, 1523460241), (283429, 1528911699), (283429, 1529058807), (283429, 897799768), (283429, 898802791), (283429, 4155624346), (283429, 4155148108), (283429, 4159769626), (283429, 4162755704), (283429, 4176942076), (283429, 1371282786), (283429, 1418982615), (283429, 1421516753), (283429, 1943542253), (283429, 1948627460), (283429, 1954787433), (283429, 2761394969), (283429, 2762686314), (283429, 2769748038), (283429, 2777190725), (283429, 2782265861), (283429, 2785600722), (283429, 2784289792), (283429, 2789001055), (283429, 3121953603), (283429, 3132074200), (283429, 3193668384), (283429, 1166414802), (283429, 1169639766), (283429, 1188221585), (283429, 2889419075), (283429, 2896761969), (283429, 2911371579), (283429, 2914552420), (283429, 2916047563), (283608, 254812251), (283608, 260653310), (283608, 263593060), (283608, 509147330), (283608, 513195901), (283608, 512519793), (283608, 512920303), (283608, 440327782), (283608, 442097325), (283608, 503332057), (283608, 506002791), (283608, 519204763), (283608, 526172034), (283608, 526906545), (283608, 526309772), (283608, 531087861), (283608, 531327937), (283608, 86694374), (283608, 139624232), (283608, 142637908), (283608, 143402327), (283608, 156079832), (283608, 91017438), (283608, 97869609), (283608, 7998489), (283608, 12545393), (283608, 20408461), (283608, 353533622), (283608, 358208870), (283608, 230783744), (283608, 239120681), (283608, 244556602), (283608, 245127400), (283608, 294067137), (283608, 308433261), (283608, 313174940), (283608, 200218740), (283608, 179229333), (283608, 180751046), (283608, 197792416), (283608, 205988942), (283608, 330302665), (283608, 351007207), (283608, 445070852), (283608, 453810671), (283608, 459220233), (283608, 458220275), (283608, 464005501), (283608, 465958375), (283608, 39049180), (283608, 432052906), (283608, 437520149), (283608, 368252592), (283608, 369502190), (283608, 375358455), (283608, 375223072), (283608, 390435260), (283608, 393478393), (283608, 400421189), (283608, 267903407), (283608, 282507624), (283608, 279479526), (283608, 286907351), (283608, 287740302), (283608, 57071810), (283608, 64244341), (283780, 2389418545), (283780, 2473543519), (283780, 2473238267), (283780, 2475920584), (283780, 2480374821), (283780, 2488887403), (283780, 2492904095), (283780, 1980444067), (283780, 2001285396), (283780, 666381247), (283780, 681726046), (283780, 870341786), (283780, 888241480), (283780, 890397823), (283780, 893810944), (283780, 897326713), (283780, 2592392602), (283780, 2593442590), (283780, 1475295752), (283780, 1490157740), (283780, 1766657750), (283780, 1767902629), (283780, 756541389), (283780, 2429751212), (283780, 2439695784), (283780, 2449299932), (283780, 1732702970), (283780, 1735762915), (283780, 1738639519), (283780, 1738566216), (283780, 1741967934), (283780, 1750105019), (283780, 1754961006), (283780, 87380767), (283780, 94421099), (283780, 94267745), (283780, 94013898), (283780, 93712366), (283780, 203593948), (283780, 200794822), (283780, 202143006), (283780, 200617064), (283780, 1540374071), (283780, 1544802210), (283780, 1549059206), (283780, 1555537208), (283780, 1557739082), (283780, 1576574168), (283780, 518499697), (283780, 523768529), (283780, 527229904), (283780, 539121182), (283780, 550748883), (283780, 101195958), (283780, 101114770), (283780, 113006728), (283780, 118639609), (283780, 119785217), (283780, 66498980), (283780, 178345882), (283780, 183485709), (283780, 188512535), (283780, 188231490), (283780, 192173081), (283780, 267637627), (283780, 268589354), (283780, 274706595), (283780, 909703008), (283780, 915453821), (283780, 916106931), (283780, 925637478), (283780, 927148118), (283780, 2559556325), (283780, 2560941638), (283780, 2564836329), (283780, 2569654623), (283780, 2577886435), (283780, 2580783140), (283780, 2585614566), (283780, 683605023), (283780, 690324781), (283780, 693584166), (283780, 693798728), (283780, 704970432), (283780, 712078159), (283780, 28009081), (283780, 191658792), (283780, 194849381), (283780, 196520440), (283780, 2060908403), (283780, 2065311306), (283780, 2064701836), (283780, 2065116793), (283780, 2066788725), (283780, 2074812482), (283780, 2078130199), (283780, 1798676518), (283780, 1803046616), (283780, 1806081477), (283780, 1810961794), (283780, 2081946655), (283780, 2085798792), (283780, 2086252833), (283780, 2089007488), (283780, 2105972603), (283780, 335850785), (283780, 339057435), (283780, 362461147), (283780, 1159189132), (283780, 1174241368), (283780, 2640124660), (283780, 2656177358), (283780, 1307206757), (283780, 1319035095), (283780, 1324452253), (283780, 1328281889), (283780, 1813885580), (283780, 1813087153), (283780, 1816847846), (283780, 1817770651), (283780, 1827150122), (283780, 1832411756), (283780, 1833135460), (283780, 1838248947), (283780, 462491199), (283780, 466406477), (283780, 1261531439), (283780, 1262267161), (283780, 1273815327), (283780, 1278486261), (283780, 624842914), (283780, 625806004), (283780, 1210657936), (283780, 1215226405), (283780, 1682158759), (283780, 778636133), (283780, 787952516), (283780, 794582438), (283780, 797603977), (283780, 800125939), (283780, 801178696), (283780, 70339459), (283780, 72918714), (283780, 81177742), (283780, 947703349), (283780, 944533894), (283780, 947775060), (283780, 1949173296), (283780, 1970982743), (283780, 2016113982), (283780, 2020137235), (283780, 2227986045), (283780, 2325080513), (283780, 2332034094), (283780, 2342562554), (283780, 2345096226), (283780, 980624575), (283780, 167077117), (283780, 167942542), (283780, 170778703), (283780, 174821602), (283780, 175411168), (283780, 423543200), (283780, 125366642), (283780, 131626974), (283780, 130830560), (283780, 138180340), (283780, 137367979), (283780, 150694550), (283780, 153786298), (283780, 2512586540), (283780, 2524472090), (283780, 2527868926), (283780, 2535640341), (283780, 2540419530), (283780, 2541213497), (283780, 2011896347), (283780, 2167833401), (283780, 2177677325), (283780, 2177571279), (283780, 2177777889), (283780, 294112986), (283780, 296777171), (283780, 309087957), (283780, 321578367), (283780, 1551516628), (283780, 1184485916), (283780, 1187992259), (283780, 1196136542), (283780, 1201973266), (283780, 1201865724), (283780, 1201652453), (283780, 1204194690), (283780, 366288685), (283780, 371749209), (283780, 375025974), (283780, 1893398603), (283780, 1906300657), (283780, 2131634042), (283780, 2130601760), (283780, 1443173386), (283780, 1441467169), (283780, 1446104021), (283780, 1465269725), (283780, 278900477), (283780, 276772331), (283780, 278375880), (283780, 278598264), (283780, 277804952), (283780, 284895231), (283780, 1349601584), (283780, 1917417743), (283780, 1922090608), (283780, 1934009008), (283780, 1937945821), (283780, 713280368), (283780, 710652837), (283780, 712073305), (283780, 711925887), (283780, 716176501), (283780, 640444013), (283780, 641566258), (283780, 656692670), (283780, 657959463), (283780, 1096977121), (283780, 959120376), (283780, 963191151), (283780, 974035270), (283780, 2136852538), (283780, 2137232889), (283780, 2139344055), (283780, 2149883111), (283780, 2150701838), (283780, 2155749019), (283780, 2157986043), (283780, 2157803510), (283780, 2161916971), (283780, 2181816970), (283780, 1723482573), (283780, 2555328674), (283780, 214925692), (283780, 223394056), (283780, 228985953), (283780, 231734345), (283780, 433996420), (283780, 441772719), (283780, 2506326511), (283780, 2504372931), (283780, 2505965436), (283780, 2611794178), (283780, 2610209177), (283780, 2610224800), (283780, 2613386559), (283780, 2627639784), (283780, 2628918998), (283780, 242193950), (283780, 245617995), (283780, 1676712722), (283780, 1681959398), (283780, 1147340365), (283780, 1337563838), (283780, 1344795319), (283780, 1592639869), (283780, 1598505674), (283780, 1626606125), (283780, 1632334217), (283780, 1636690402), (283780, 1644280110), (283780, 840059628), (283780, 837957595), (283780, 847287470), (283780, 850167259), (283780, 862347651), (283780, 1124607559), (283780, 40703269), (283780, 42144692), (283780, 47064959), (283780, 58802565), (283780, 1000820332), (283780, 1005507327), (283780, 1022012948), (283780, 2030214240), (283780, 2032921083), (283780, 2031141562), (283780, 2034390837), (283780, 2043384183), (283780, 2260271400), (283780, 2263863548), (283780, 2265385358), (283780, 2267194299), (283780, 2275651235), (283780, 1511697999), (283780, 1516395116), (283780, 1514350463), (283780, 1516077804), (283780, 1516705249), (283780, 1525092040), (283780, 2198292342), (283780, 2199122076), (283780, 2203598539), (283780, 2214621793), (283780, 2216512407), (283780, 2217276294), (283780, 1392487382), (283780, 1391001400), (283780, 1421206703), (283780, 1418910954), (283780, 816902186), (283780, 819762850), (283780, 929733252), (283780, 1032048497), (283780, 1030836837), (283780, 1033851455), (283780, 1039767810), (283780, 1428638986), (283780, 1430539731), (283780, 1433719557), (283780, 1867185570), (283780, 1881959481), (283780, 1885858424), (283780, 587840111), (283780, 594571853), (283780, 555628283), (283780, 557704755), (283780, 559757094), (283780, 559443685), (283780, 560485210), (283780, 565472909), (283780, 566390509), (283780, 570652920), (283780, 573791047), (283780, 575706251), (283780, 582163072), (283780, 2611963), (283780, 11621285), (283780, 19923734), (283780, 20256596), (283780, 1692454048), (283780, 1695134225), (283780, 1711084634), (283780, 471603232), (283780, 476536608), (283780, 478746421), (283780, 480245180), (283780, 489490534), (283780, 1231802205), (283780, 1233779000), (283780, 1236898248), (283780, 1241120162), (283780, 1248855254), (283780, 1248866990), (283780, 1248967062), (283780, 1252879432), (283780, 1254543462), (283780, 1284687687), (283780, 1295453648), (283780, 1454180886), (283780, 1454542896), (283780, 393485075), (283780, 404971466), (283780, 412873908), (283780, 2279327546), (283780, 2283223237), (283780, 2291565405), (283780, 2296369487), (283780, 2304991561), (283780, 2689449856), (283780, 2705644699), (283780, 499926895), (283780, 496867991), (283780, 502360914), (283780, 500911892), (283780, 504619674), (283780, 509026410), (283780, 721694409), (283780, 722228482), (283780, 730763053), (283780, 730407119), (283780, 733067966), (283780, 735734366), (283780, 754309425), (283780, 2347958665), (283780, 2350581063), (283780, 2351638644), (283780, 2362030202), (283780, 2414096269), (283780, 1050821159), (283780, 1070263713), (283780, 1067610995), (283780, 1071037144), (283780, 2116353620), (283780, 2115408099), (283780, 2233994159), (284006, 547467726), (284006, 551678576), (284006, 562474153), (284006, 388693677), (284006, 392481712), (284006, 221470687), (284006, 224004348), (284006, 223182147), (284006, 294049599), (284006, 297777910), (284006, 325269803), (284006, 333315135), (284006, 334464904), (284006, 336685123), (284006, 337517456), (284006, 350995421), (284006, 354386329), (284006, 367319026), (284006, 373431697), (284006, 439628616), (284006, 440826245), (284006, 287486456), (284006, 87053704), (284006, 89564068), (284006, 31423737), (284006, 82541878), (284006, 193712914), (284006, 206720357), (284006, 402174009), (284006, 405852427), (284006, 482550001), (284006, 490335078), (284006, 490380894), (284006, 227729968), (284006, 245664248), (284006, 246780181), (284006, 129348968), (284006, 262994884), (284006, 268278540), (284006, 272426846), (284006, 273884444), (284006, 275749711), (284006, 285142502), (284006, 101949741), (284006, 112817621), (284006, 113703124), (284006, 115957948), (284006, 123558845), (284006, 416212700), (284006, 419612781), (284006, 420537648), (284006, 429008488), (284006, 431237040), (284006, 438671941), (284006, 572128834), (284006, 138975822), (284006, 151464467), (284006, 153547703), (284006, 255011554), (284006, 301449277), (284006, 304466281), (284006, 309018135), (284006, 312361133), (284006, 323905136), (284006, 327109167), (284006, 454568805), (284006, 459900774), (284006, 472992658), (284006, 2507151), (284006, 8951810), (284006, 19745678), (284006, 16718185), (284006, 404857501), (284006, 524854343), (284006, 524941222), (284006, 529811290), (284006, 530631320), (284006, 539109071), (284006, 509183751), (284006, 517428436), (284006, 517163850), (284006, 518717918), (284006, 519646797), (284006, 519921691), (284006, 69879289), (284006, 38259632), (284006, 44562677), (284006, 42498766), (284006, 47992703), (284006, 164165371), (284154, 118872765), (284154, 176033671), (284154, 184498941), (284154, 194771443), (284154, 89448633), (284154, 90793231), (284154, 93561245), (284154, 95065424), (284154, 102194480), (284154, 111600155), (284154, 112664111), (284154, 204961698), (284154, 122551501), (284154, 10738450), (284154, 13391783), (284154, 21136264), (284154, 22166811), (284154, 24148803), (284154, 33512236), (284154, 35596347), (284154, 55499495), (284154, 62796697), (284154, 70056781), (284154, 73333358), (284154, 157090375), (284154, 161570733), (284154, 80410022), (284213, 2606549963), (284213, 161366075), (284213, 169333189), (284213, 177711062), (284213, 176660591), (284213, 176462288), (284213, 183551120), (284213, 775356331), (284213, 1638401664), (284213, 1638239326), (284213, 1642948162), (284213, 1770110875), (284213, 756486209), (284213, 755944412), (284213, 197457357), (284213, 201242364), (284213, 209829421), (284213, 211954641), (284213, 217331043), (284213, 816562833), (284213, 817245216), (284213, 825591829), (284213, 829317684), (284213, 833765414), (284213, 2271290498), (284213, 2273679633), (284213, 2336497150), (284213, 2358777375), (284213, 431235053), (284213, 430445619), (284213, 435764435), (284213, 444119788), (284213, 3236401728), (284213, 3258893429), (284213, 2770340214), (284213, 2775857500), (284213, 3485630881), (284213, 3488042797), (284213, 3488473902), (284213, 3496552410), (284213, 3497015333), (284213, 456287316), (284213, 461086024), (284213, 2260188263), (284213, 1216797577), (284213, 1225019345), (284213, 2110975544), (284213, 224202608), (284213, 228528965), (284213, 234267578), (284213, 243892848), (284213, 1585778210), (284213, 1588032339), (284213, 1594221239), (284213, 1595725922), (284213, 1596725322), (284213, 1597926091), (284213, 1604140042), (284213, 1609071327), (284213, 1610967920), (284213, 3139326081), (284213, 3155376172), (284213, 1022918607), (284213, 1025812928), (284213, 1029213266), (284213, 1028629248), (284213, 1031297703), (284213, 1048455982), (284213, 1048308565), (284213, 1047110291), (284213, 1801074890), (284213, 1450535116), (284213, 1453273502), (284213, 1457713244), (284213, 1471968761), (284213, 739568956), (284213, 736444338), (284213, 740441336), (284213, 9950375), (284213, 686410117), (284213, 687929212), (284213, 685471606), (284213, 695479982), (284213, 695532799), (284213, 698080792), (284213, 698415354), (284213, 701584122), (284213, 1345672615), (284213, 1344029112), (284213, 1234617838), (284213, 1240343170), (284213, 1245626229), (284213, 1251812467), (284213, 1258927258), (284213, 1261343971), (284213, 1262138938), (284213, 554874455), (284213, 566210271), (284213, 565987259), (284213, 566592442), (284213, 775495685), (284213, 778732256), (284213, 641074443), (284213, 1853502392), (284213, 1879639644), (284213, 1894007530), (284213, 3271279683), (284213, 3269925104), (284213, 3273185788), (284213, 1121569975), (284213, 1128287072), (284213, 1132110496), (284213, 1313825574), (284213, 1354669192), (284213, 1910966591), (284213, 2123721424), (284213, 2135842288), (284213, 2137791888), (284213, 96085946), (284213, 93968203), (284213, 99021698), (284213, 103830977), (284213, 121958939), (284213, 2720583567), (284213, 2730905826), (284213, 2729906588), (284213, 2731258883), (284213, 25276021), (284213, 30417830), (284213, 1081666837), (284213, 1084979045), (284213, 1085685073), (284213, 1085096455), (284213, 1087157447), (284213, 1094923389), (284213, 1097144130), (284213, 1101010024), (284213, 1104889370), (284213, 1534056902), (284213, 1550024149), (284213, 1558894621), (284213, 1698641955), (284213, 1697681182), (284213, 1716250135), (284213, 1718925344), (284213, 3312227123), (284213, 1738931975), (284213, 1749326068), (284213, 1749676909), (284213, 1757705807), (284213, 67410408), (284213, 70630496), (284213, 79710282), (284213, 88454298), (284213, 91407137), (284213, 3501517600), (284213, 3432368048), (284213, 3433851309), (284213, 3444665554), (284213, 3463460830), (284213, 2065843643), (284213, 2069615288), (284213, 3186691218), (284213, 3188244614), (284213, 3190335306), (284213, 3200464265), (284213, 2175372848), (284213, 2175610165), (284213, 2181108142), (284213, 2183068865), (284213, 384981185), (284213, 387234161), (284213, 390564195), (284213, 2793097905), (284213, 2799730338), (284213, 2801711746), (284213, 2799754430), (284213, 786171537), (284213, 786772490), (284213, 793695698), (284213, 710863241), (284213, 718531316), (284213, 722559334), (284213, 726712477), (284213, 353496124), (284213, 359697195), (284213, 365980010), (284213, 364977299), (284213, 366390662), (284213, 369775249), (284213, 371705696), (284213, 371487930), (284213, 1300673862), (284213, 1302920029), (284213, 1305115410), (284213, 1308070884), (284213, 2276654185), (284213, 2277706332), (284213, 2286971971), (284213, 2295547574), (284213, 2302765330), (284213, 2306642894), (284213, 2308651219), (284213, 2306812235), (284213, 1672767284), (284213, 1674106771), (284213, 1678919907), (284213, 1735662568), (284213, 1736007654), (284213, 2039327191), (284213, 468287250), (284213, 476467816), (284213, 481115908), (284213, 481876228), (284213, 482867313), (284213, 996700729), (284213, 1001851002), (284213, 1983583940), (284213, 3357123421), (284213, 3362172364), (284213, 3370054303), (284213, 3373779500), (284213, 3391707702), (284213, 2999361153), (284213, 3005816400), (284213, 3010025478), (284213, 3017691907), (284213, 3024846380), (284213, 3025810159), (284213, 1207916736), (284213, 1210734874), (284213, 1211754435), (284213, 1224664176), (284213, 1226199720), (284213, 1504789272), (284213, 2877522955), (284213, 2878097645), (284213, 2892618455), (284213, 2898979796), (284213, 2899684644), (284213, 2902315954), (284213, 2903169247), (284213, 42622525), (284213, 56875864), (284213, 2612523651), (284213, 39584793), (284213, 1511479390), (284213, 1510741119), (284213, 1513295575), (284213, 1517043476), (284213, 1814691648), (284213, 1831719074), (284213, 1837360057), (284213, 1840844655), (284213, 1766707786), (284213, 902989701), (284213, 903139394), (284213, 912954696), (284213, 282412784), (284213, 293917263), (284213, 2586927043), (284213, 2594588885), (284213, 2598125179), (284213, 305547779), (284213, 307647315), (284213, 310341155), (284213, 308399028), (284213, 315763570), (284213, 2843480046), (284213, 2848725654), (284213, 1899466452), (284213, 1931630267), (284213, 1939721032), (284213, 3103992386), (284213, 3108707150), (284213, 3109338684), (284213, 3111344203), (284213, 3113559447), (284213, 3113585460), (284213, 3115969872), (284213, 1730411716), (284213, 934560603), (284213, 934839849), (284213, 2905006637), (284213, 798220406), (284213, 800561272), (284213, 803956925), (284213, 806281954), (284213, 2191434612), (284213, 2203582262), (284213, 2206933352), (284213, 2215721478), (284213, 2696622867), (284213, 2711396820), (284213, 647077947), (284213, 653774603), (284213, 655316990), (284213, 656210261), (284213, 666696055), (284213, 665528855), (284213, 1425091763), (284213, 1427010267), (284213, 1436816986), (284213, 1436797622), (284213, 1448274506), (284213, 2386668945), (284213, 2391680804), (284213, 2413422871), (284213, 2464548470), (284213, 2465838953), (284213, 2470837500), (284213, 332578253), (284213, 334044542), (284213, 345433908), (284213, 349465433), (284213, 2235740668), (284213, 2244165631), (284213, 2647111137), (284213, 2650973235), (284213, 975868321), (284213, 981776138), (284213, 979674987), (284213, 981320944), (284213, 983595299), (284213, 984059739), (284213, 995080581), (284213, 625778886), (284213, 623866736), (284213, 625583464), (284213, 633268604), (284213, 1389739537), (284213, 1388553366), (284213, 1391019625), (284213, 1396718751), (284213, 1394760673), (284213, 1398610271), (284213, 1408709526), (284213, 500310924), (284213, 498205888), (284213, 574434814), (284213, 584855001), (284213, 1105987561), (284213, 1114648432), (284213, 1117405575), (284213, 2928015088), (284213, 2932139153), (284213, 2935288766), (284213, 2938112897), (284213, 2941744172), (284213, 2984159901), (284213, 2997606908), (284213, 501507395), (284213, 522353923), (284213, 524311113), (284213, 2317049073), (284213, 2316554442), (284213, 2316924858), (284213, 2567742438), (284213, 2567006163), (284213, 2568693926), (284213, 2573036291), (284213, 2380410384), (284213, 2388017732), (284213, 2390807157), (284213, 2392572796), (284213, 2397448856), (284213, 2402817219), (284213, 672684760), (284213, 674422456), (284213, 675705732), (284213, 1166864542), (284213, 1168384105), (284213, 1172616222), (284213, 1177053841), (284213, 2857704267), (284213, 2860156392), (284213, 3133868033), (284213, 842912415), (284213, 845729824), (284213, 847735869), (284213, 848131180), (284213, 851221300), (284213, 848892871), (284213, 862737896), (284213, 862373344), (284213, 867108788), (284213, 866900082), (284213, 399733055), (284213, 401023824), (284213, 403759791), (284213, 419429605), (284213, 879029316), (284213, 880653112), (284213, 964712207), (284213, 963464908), (284213, 965402442), (284213, 2666532800), (284213, 2675664909), (284213, 2956618577), (284213, 2956096229), (284213, 2957230547), (284213, 2978196333), (284213, 2982848406), (284213, 2987711258), (284213, 1056790181), (284213, 1064798193), (284213, 1068344400), (284213, 1072086543), (284213, 2086425481), (284213, 2094647486), (284213, 3298940250), (284213, 3305100658), (284213, 3304874012), (284213, 257138038), (284213, 269380629), (284213, 269447122), (284213, 2451735455), (284213, 2453370443), (284213, 2454781871), (284213, 2459004425), (284213, 2461094050), (284213, 2461354873), (284213, 1991806967), (284213, 1992493177), (284213, 1997982451), (284213, 2017590410), (284213, 1961056397), (284213, 2030673698), (284213, 2235771176), (284213, 534892205), (284213, 535496537), (284213, 532721516), (284213, 542074990), (284213, 541216907), (284213, 2139219001), (284213, 2140697723), (284213, 2152611294), (284213, 2155071486), (284213, 1479048429), (284213, 1481912426), (284213, 1486627824), (284213, 1491003737), (284213, 591796204), (284213, 602052293), (284213, 614017823), (284213, 2523653102), (284213, 2525756416), (284213, 2534316767), (284213, 1274953341), (284213, 1280769001), (284213, 2732339188), (284213, 2736832576), (284213, 2740906500), (284213, 2749247061), (284213, 2757394890), (284213, 2759989486), (284213, 2761843277), (284213, 151478930), (284213, 148062450), (284213, 151967530), (284213, 3201855770), (284213, 3202886134), (284213, 3206581251), (284213, 3209039845), (284213, 1332296226), (284213, 189927044), (284213, 1161319334), (284213, 1149974756), (284213, 1565266922), (284213, 3071435983), (284213, 3073026980), (284213, 3075073338), (284213, 3079557207), (284213, 3096852034), (284213, 1656560630), (284213, 919374493), (284213, 922927368), (284213, 3029701978), (284213, 3052338941), (284213, 137377857), (284213, 141026521), (284213, 2415574441), (284213, 2420218534), (284213, 2418552965), (284213, 2420025714), (284213, 2422775870), (284213, 2428675502), (284213, 2430308838), (284213, 2438740898), (284213, 2504297820), (284213, 2503211326), (284213, 2506610545), (284213, 2605055627), (284213, 2612396396), (284213, 2621904503), (284213, 3394543455), (284213, 3409964405), (284213, 3411589506), (284213, 3418729672), (284213, 2224899284), (284213, 2231689989), (284213, 1848894038), (284213, 1852114871), (284213, 2131863387), (284213, 1483389682), (284213, 1488539374), (284213, 2268288138), (284213, 2350713619), (284213, 2359810706), (284213, 2372213644), (284285, 33636635), (284285, 38918853), (284285, 207492014), (284285, 211105414), (284285, 209106001), (284285, 2035802185), (284285, 2040048200), (284285, 2041046794), (284285, 2043145379), (284285, 3297108619), (284285, 3303926356), (284285, 2274703655), (284285, 2277048543), (284285, 1055039111), (284285, 1060993406), (284285, 1064710980), (284285, 1634400284), (284285, 1318769950), (284285, 1323925394), (284285, 1496090057), (284285, 1499018814), (284285, 1502656421), (284285, 1507985474), (284285, 2088236582), (284285, 2391859388), (284285, 2528689805), (284285, 2531981691), (284285, 289970618), (284285, 293436195), (284285, 295551209), (284285, 301354985), (284285, 1975185812), (284285, 1981802885), (284285, 1981728817), (284285, 1988449684), (284285, 1336050263), (284285, 1341048289), (284285, 1342572231), (284285, 1346029309), (284285, 1347730150), (284285, 1352460232), (284285, 1356522892), (284285, 1360273610), (284285, 2319781514), (284285, 2339487592), (284285, 2347412184), (284285, 499284505), (284285, 511307700), (284285, 511659385), (284285, 515075587), (284285, 518058934), (284285, 520115069), (284285, 4427480685), (284285, 4427214569), (284285, 4425194545), (284285, 4431674790), (284285, 994260527), (284285, 1368910955), (284285, 1367175833), (284285, 1374033876), (284285, 1386606346), (284285, 1384656211), (284285, 1388721050), (284285, 2988973121), (284285, 3539747618), (284285, 3539948481), (284285, 3543847957), (284285, 3549235811), (284285, 3557730189), (284285, 3561061238), (284285, 3562357872), (284285, 3736526628), (284285, 3899225877), (284285, 965426172), (284285, 985220014), (284285, 982609611), (284285, 3851092389), (284285, 3873535558), (284285, 878678881), (284285, 877534158), (284285, 1112401192), (284285, 1113847945), (284285, 1119980367), (284285, 1119739228), (284285, 1213485460), (284285, 1212962367), (284285, 1209893812), (284285, 1210513185), (284285, 1667135505), (284285, 1677575261), (284285, 1678529787), (284285, 1679020084), (284285, 1680126507), (284285, 1682568392), (284285, 4313186893), (284285, 4313573020), (284285, 4334181927), (284285, 4343598423), (284285, 4343111497), (284285, 2475734564), (284285, 2481757675), (284285, 2488125156), (284285, 2915221137), (284285, 738665916), (284285, 741982827), (284285, 746218586), (284285, 752141300), (284285, 749366728), (284285, 3498515680), (284285, 3501962006), (284285, 3509413595), (284285, 3513463997), (284285, 3521214100), (284285, 3523923789), (284285, 3527148776), (284285, 3529424154), (284285, 4522870758), (284285, 4530531752), (284285, 4531286513), (284285, 4532704105), (284285, 4535318163), (284285, 999722262), (284285, 999639892), (284285, 1004143263), (284285, 1008291274), (284285, 1009068788), (284285, 1014251719), (284285, 1018751664), (284285, 318037786), (284285, 1791752), (284285, 6631312), (284285, 20343623), (284285, 24914142), (284285, 23817893), (284285, 29496117), (284285, 337960251), (284285, 339777781), (284285, 345955525), (284285, 3264329230), (284285, 3277039668), (284285, 3280522094), (284285, 3288572213), (284285, 3285459952), (284285, 3289974173), (284285, 2699486820), (284285, 2706709718), (284285, 2708450023), (284285, 2715022648), (284285, 2717134080), (284285, 2726881985), (284285, 2729471569), (284285, 2738134601), (284285, 569151765), (284285, 580055061), (284285, 589659059), (284285, 591731538), (284285, 3764654213), (284285, 3766633368), (284285, 3767776533), (284285, 3769891373), (284285, 3784015485), (284285, 3788803651), (284285, 3447301163), (284285, 3447748620), (284285, 3452792303), (284285, 3455822623), (284285, 1408782805), (284285, 1423828443), (284285, 1424526754), (284285, 1431683050), (284285, 1431554252), (284285, 1433526949), (284285, 1433966573), (284285, 1434837632), (284285, 3914706362), (284285, 3916728508), (284285, 3096931846), (284285, 3109674767), (284285, 3118643771), (284285, 3120852711), (284285, 3123163858), (284285, 263409022), (284285, 264805595), (284285, 1132984363), (284285, 1141354309), (284285, 2403181236), (284285, 2410061994), (284285, 2410581343), (284285, 2420440861), (284285, 2426118246), (284285, 2424641838), (284285, 2426852503), (284285, 2814178068), (284285, 2818715882), (284285, 2832045213), (284285, 2838340009), (284285, 2842810245), (284285, 2064669890), (284285, 2062241295), (284285, 2075547338), (284285, 2078554501), (284285, 472356237), (284285, 469880658), (284285, 471529263), (284285, 477279259), (284285, 479120967), (284285, 493123521), (284285, 494394252), (284285, 267986317), (284285, 276563131), (284285, 278691898), (284285, 1027481328), (284285, 1033005308), (284285, 1042589452), (284285, 1044480023), (284285, 1049475782), (284285, 958584594), (284285, 1064510129), (284285, 1074940088), (284285, 1075860391), (284285, 1077647874), (284285, 1080733737), (284285, 1082844284), (284285, 1083090494), (284285, 1084306108), (284285, 2007264489), (284285, 2005942665), (284285, 2009769254), (284285, 2013570114), (284285, 2018725197), (284285, 2020547109), (284285, 2021933564), (284285, 2030266599), (284285, 2032450362), (284285, 1880842442), (284285, 1933228445), (284285, 2447083686), (284285, 2447550855), (284285, 2451578843), (284285, 2448134399), (284285, 2449062459), (284285, 2467807740), (284285, 2467737635), (284285, 1277564030), (284285, 1281031825), (284285, 1279591708), (284285, 1283322289), (284285, 1280885026), (284285, 81715919), (284285, 89073466), (284285, 93300422), (284285, 98318393), (284285, 107274046), (284285, 108976283), (284285, 3664835635), (284285, 3992966842), (284285, 4011081818), (284285, 1514233299), (284285, 1517779743), (284285, 3888472645), (284285, 3888601315), (284285, 3891832409), (284285, 3894775501), (284285, 3894216640), (284285, 1481162541), (284285, 1481920076), (284285, 1482835779), (284285, 2677519370), (284285, 2685378112), (284285, 927160095), (284285, 927497797), (284285, 930770716), (284285, 940680339), (284285, 940120878), (284285, 1804778257), (284285, 1846269012), (284285, 1852121785), (284285, 1859822692), (284285, 2428680540), (284285, 2432059909), (284285, 2432274807), (284285, 2433676724), (284285, 2436907400), (284285, 114227165), (284285, 118813100), (284285, 119854869), (284285, 1236941725), (284285, 1244353619), (284285, 1247194558), (284285, 3799454738), (284285, 3804615423), (284285, 4046609616), (284285, 653960435), (284285, 652177471), (284285, 663054336), (284285, 662844404), (284285, 666231330), (284285, 666468179), (284285, 642376419), (284285, 638295840), (284285, 643955605), (284285, 4344292495), (284285, 4356839593), (284285, 4354445572), (284285, 4358443170), (284285, 4369908750), (284285, 3938661551), (284285, 3939715319), (284285, 71548953), (284285, 74549569), (284285, 880103889), (284285, 881303288), (284285, 905825136), (284285, 904061103), (284285, 3670175691), (284285, 3696469718), (284285, 142479400), (284285, 145283521), (284285, 179001330), (284285, 445793581), (284285, 466272300), (284285, 3715772524), (284285, 3719852500), (284285, 3733180613), (284285, 1088508975), (284285, 1145467198), (284285, 1151266404), (284285, 1808427330), (284285, 1809710763), (284285, 1812320841), (284285, 1820820115), (284285, 2095007346), (284285, 2104592507), (284285, 2103855408), (284285, 2108306080), (284285, 2109271786), (284285, 2117857285), (284285, 848447837), (284285, 856174467), (284285, 860936750), (284285, 857166302), (284285, 867527628), (284285, 789101954), (284285, 793344912), (284285, 826501817), (284285, 830422228), (284285, 2354565969), (284285, 2364296788), (284285, 2365005382), (284285, 2368317937), (284285, 2367116792), (284285, 2380688017), (284285, 2386424498), (284285, 2172562332), (284285, 2175297375), (284285, 3987338150), (284285, 3985471723), (284285, 1732140134), (284285, 1737964909), (284285, 1737269125), (284285, 2763584811), (284285, 2761699162), (284285, 2787649561), (284285, 2783757993), (284285, 221375462), (284285, 228010991), (284285, 227997239), (284285, 232023015), (284285, 237258038), (284285, 1202552334), (284285, 1205558747), (284285, 2863500526), (284285, 3143395864), (284285, 3145473019), (284285, 3142672197), (284285, 3155672659), (284285, 3159725898), (284285, 3176674767), (284285, 49327304), (284285, 51966999), (284285, 50991772), (284285, 56769031), (284285, 3128601358), (284285, 3473856416), (284285, 3485469945), (284285, 3488494086), (284285, 3491189660), (284285, 1303104112), (284285, 1317064589), (284285, 4476425860), (284285, 4476635023), (284285, 4474642035), (284285, 531286244), (284285, 531171042), (284285, 533538576), (284285, 2349726439), (284285, 598172167), (284285, 1590053392), (284285, 4187413855), (284285, 4187515076), (284285, 4199055247), (284285, 4205918535), (284285, 4209481820), (284285, 4210250607), (284285, 4212741169), (284285, 3189979761), (284285, 3576944315), (284285, 3582787808), (284285, 124890803), (284285, 128593653), (284285, 134192443), (284285, 4062671970), (284285, 4064068763), (284285, 4067239530), (284285, 4065582707), (284285, 4074020680), (284285, 4083839685), (284285, 2947395090), (284285, 2951352243), (284285, 2966408513), (284285, 1526185387), (284285, 1536956181), (284285, 1540881221), (284285, 1547594968), (284285, 1546480615), (284285, 1554461844), (284285, 1553990579), (284285, 1558659666), (284285, 1181186845), (284285, 1188987304), (284285, 1194215486), (284285, 1192391174), (284285, 4541157492), (284285, 4542353894), (284285, 4545060420), (284285, 4088806780), (284285, 4094638019), (284285, 4098551678), (284285, 4113883459), (284285, 2793055639), (284285, 2798678607), (284285, 2798253493), (284285, 2799388220), (284285, 4506005222), (284285, 4515308092), (284285, 4031532173), (284285, 4033464554), (284285, 4036450349), (284285, 3218558722), (284285, 3220173293), (284285, 3234664471), (284285, 3954497072), (284285, 3964109543), (284285, 3964040362), (284285, 3974321805), (284285, 2543325311), (284285, 2557821913), (284285, 2570083423), (284285, 2574513368), (284285, 2574530554), (284285, 2854765782), (284285, 2495023029), (284285, 2496415031), (284285, 2508346508), (284285, 1156903442), (284285, 1158609187), (284285, 1168769728), (284285, 1178084482), (284285, 1390833349), (284285, 1397271529), (284285, 4234350388), (284285, 4242975373), (284285, 4244107018), (284285, 4246759476), (284285, 4245155105), (284285, 4255872468), (284285, 4265483715), (284285, 359861273), (284285, 356807290), (284285, 363158730), (284285, 364679871), (284285, 374267876), (284285, 374964355), (284285, 617397162), (284285, 621443034), (284285, 628517435), (284285, 632096325), (284285, 629972737), (284285, 631561557), (284285, 570528019), (284285, 725296237), (284285, 728397244), (284285, 733621346), (284285, 732625064), (284285, 3239890293), (284285, 3245823575), (284285, 3250254587), (284285, 3319498880), (284285, 3318885122), (284285, 4144723400), (284285, 4148293515), (284285, 4161924759), (284285, 4163402479), (284285, 4164596973), (284285, 4169621121), (284285, 428299462), (284285, 430849026), (284285, 434528389), (284285, 3017881115), (284285, 3025060409), (284285, 3036538705), (284285, 4438208984), (284285, 4445776145), (284285, 4454725285), (284285, 4465041007), (284285, 2627315119), (284285, 2632630668), (284285, 3086180553), (284285, 4130015795), (284285, 4129535537), (284285, 4132903868), (284285, 4131879802), (284285, 3586448737), (284285, 3585257593), (284285, 3591548434), (284285, 3597136432), (284285, 1453646501), (284285, 1453394389), (284285, 1454912549), (284285, 1464433830), (284285, 1467713759), (284285, 1472607900), (284285, 1474612360), (284285, 1695969550), (284285, 3702035888), (284285, 3702913333), (284285, 3703273081), (284285, 3708070573), (284285, 3640486603), (284285, 3645099634), (284285, 3648292247), (284285, 3649412794), (284285, 3653604567), (284285, 3657341809), (284285, 3655532747), (284285, 2919734105), (284285, 2929949555), (284285, 2930746508), (284285, 2289473863), (284285, 2296411633), (284285, 2299771376), (284285, 2309048269), (284285, 1636202918), (284285, 1645959396), (284285, 1654379098), (284285, 1653545117), (284285, 3334753510), (284285, 3338599243), (284285, 3341062871), (284285, 3357318236), (284285, 1705198184), (284285, 2660109036), (284285, 2660604168), (284285, 2667238044), (284285, 2668818992), (284285, 3840835079), (284285, 3846328622), (284285, 3849715392), (284285, 2181819357), (284285, 2189693645), (284285, 2190834704), (284285, 2200077542), (284285, 2205325284), (284285, 2156623210), (284285, 2160175496), (284285, 2162830462), (284285, 680997030), (284285, 1557374534), (284285, 1562463496), (284285, 2588034839), (284285, 4291645864), (284285, 4291586639), (284285, 4288910191), (284285, 4298147467), (284285, 4303792264), (284285, 2221482201), (284285, 2230410656), (284285, 2226912354), (284285, 2232618144), (284285, 2241745500), (284285, 1611628179), (284285, 1620847371), (284285, 1619594895), (284285, 1621232047), (284285, 1624832068), (284285, 1622288958), (284285, 1628767303), (284285, 715301923), (284285, 762673007), (284285, 779440973), (284285, 537343574), (284285, 551389400), (284285, 558474796), (284285, 2123245760), (284285, 2123831256), (284285, 2123358944), (284285, 2127196523), (284285, 3824979784), (284285, 3829749701), (284285, 3829602784), (284285, 3832534806), (284285, 3833791484), (284285, 3835217665), (284285, 3835225258), (284285, 2316264651), (284285, 2316472662), (284285, 2604542625), (284285, 2610252456), (284285, 1936070412), (284285, 1939557644), (284285, 1955132989), (284285, 1963769478), (284285, 1962334784), (284285, 1440446284), (284285, 1441631203), (284285, 1448795376), (284285, 1575105042), (284285, 1578912544), (284285, 1583614545), (284285, 1908544073), (284285, 1918862607), (284285, 384818546), (284285, 386612138), (284285, 386157439), (284285, 410934606), (284285, 3384359403), (284285, 3397459330), (284285, 1755542416), (284285, 1758367607), (284285, 1764209356), (284285, 3565184557), (284285, 3571149500), (284285, 3577533637), (284285, 3578623768), (284285, 1633497595), (284285, 2181476454), (284285, 2891059727), (284285, 1844160455), (284285, 1893945497), (284285, 1902215134), (284285, 1902818884), (284285, 1904485161), (284285, 1903669559), (284285, 806886478), (284285, 814075225), (284285, 815490484), (284285, 826280584), (284285, 828708533), (284285, 685859801), (284285, 695523491), (284285, 3418048170), (284285, 3416611686), (284285, 3417502152), (284285, 3424208656), (284285, 3425996629), (284285, 3432660137), (284285, 3437811780), (284285, 3442885413), (284285, 4225832291), (284285, 2988724606), (284285, 2992734704), (284285, 2991656108), (284285, 3000263065), (284285, 3000813723), (284285, 3012919644), (284285, 3016312492), (284285, 1774510750), (284285, 1778605508), (284285, 1793359632), (284285, 1791786552), (284285, 3042958985), (284285, 3055930105), (284285, 3062660960), (284285, 3065496828), (284285, 1249638545), (284285, 1249132525), (284285, 1251279641), (284285, 1254052680), (284285, 1259588595), (284420, 539128223), (284420, 545479469), (284420, 554820629), (284420, 115520963), (284420, 124027725), (284420, 761830354), (284420, 770327522), (284420, 779142990), (284420, 221396615), (284420, 226580476), (284420, 567764851), (284420, 702751748), (284420, 703343056), (284420, 710168965), (284420, 710255179), (284420, 706581110), (284420, 714736907), (284420, 718659675), (284420, 266449051), (284420, 268086034), (284420, 269348598), (284420, 180119365), (284420, 181342878), (284420, 182761887), (284420, 188577848), (284420, 206984651), (284420, 341077336), (284420, 346105362), (284420, 349672357), (284420, 351569065), (284420, 356238344), (284420, 362163171), (284420, 74356679), (284420, 76099347), (284420, 83312403), (284420, 83549510), (284420, 84557546), (284420, 824935127), (284420, 39331445), (284420, 42695382), (284420, 44976026), (284420, 45790626), (284420, 49614502), (284420, 49913708), (284420, 311776749), (284420, 311292049), (284420, 602319153), (284420, 605042484), (284420, 610296169), (284420, 611554790), (284420, 615690924), (284420, 837034831), (284420, 683484639), (284420, 684036108), (284420, 688983914), (284420, 686839120), (284420, 689928610), (284420, 865769334), (284420, 869910303), (284420, 879893854), (284420, 1697303), (284420, 6260834), (284420, 19294636), (284420, 486072716), (284420, 491193335), (284420, 492555496), (284420, 497392958), (284420, 210336339), (284420, 211860757), (284420, 213688846), (284420, 791437469), (284420, 719643516), (284420, 29425048), (284420, 92082036), (284420, 96739409), (284420, 97800624), (284420, 97337893), (284420, 452800622), (284420, 456406796), (284420, 461540870), (284420, 464421590), (284420, 466737474), (284420, 473645423), (284420, 574296094), (284420, 573242421), (284420, 574026493), (284420, 577617819), (284420, 582590925), (284420, 582808247), (284420, 584193170), (284420, 588006353), (284420, 584878719), (284420, 590089264), (284420, 591146042), (284420, 595655923), (284420, 593333270), (284420, 142650498), (284420, 154649468), (284420, 158288622), (284420, 159733046), (284420, 160386284), (284420, 162780228), (284420, 736792752), (284420, 753378631), (284420, 753299727), (284420, 756595628), (284420, 422387882), (284420, 424041189), (284420, 795253705), (284420, 795308538), (284420, 801593761), (284420, 810351015), (284420, 812264259), (284420, 816635806), (284420, 134552400), (284420, 134358313), (284420, 136596608), (284420, 138899145), (284420, 400306445), (284420, 403975414), (284420, 63106344), (284420, 637133359), (284420, 640704129), (284420, 639383097), (284420, 638221644), (284420, 640443440), (284420, 649494235), (284420, 654370201), (284420, 660451521), (284420, 433674322), (284420, 444356967), (284420, 449700597), (284420, 446825156), (284420, 237606548), (284420, 625295020), (284420, 626138552), (284420, 631776751), (284420, 634025163), (284420, 858217350), (284420, 859103533), (284420, 864868915), (284420, 320666263), (284420, 320356077), (284420, 321392648), (284420, 285596176), (284420, 286694903), (284420, 301330657), (284420, 302938873), (284420, 305858325), (284420, 697345733), (284420, 701365521), (284420, 504050941), (284420, 502874016), (284420, 507356339), (284420, 523579699), (284420, 372479898), (284420, 374838099), (284420, 379566261), (284420, 380545961), (284420, 250187950), (284427, 392505551), (284427, 395651523), (284427, 401558190), (284427, 406646309), (284427, 409731287), (284427, 413609670), (284427, 414395604), (284427, 418597068), (284427, 425648311), (284427, 433407176), (284427, 436905648), (284427, 435526791), (284427, 438153275), (284427, 445512213), (284427, 275044163), (284427, 273829489), (284427, 323666982), (284427, 325959511), (284427, 329028621), (284427, 329744850), (284427, 333257718), (284427, 527991808), (284427, 529145325), (284427, 531064604), (284427, 168456998), (284427, 172993232), (284427, 172574594), (284427, 175001222), (284427, 192361040), (284427, 197284137), (284427, 166785118), (284427, 235561491), (284427, 238193036), (284427, 238993558), (284427, 243002439), (284427, 449041407), (284427, 87027154), (284427, 92532393), (284427, 230838287), (284427, 62101100), (284427, 67110341), (284427, 299121380), (284427, 338106066), (284427, 492081093), (284427, 123543582), (284427, 127859101), (284427, 132636482), (284427, 135808177), (284427, 384003532), (284427, 485960543), (284427, 486543570), (284427, 354893417), (284427, 358945218), (284427, 368267679), (284427, 370030262), (284427, 370658075), (284427, 521025752), (284427, 522173165), (284427, 321510001), (284427, 40621793), (284427, 49529220), (284427, 48664553), (284427, 186240430), (284427, 184852511), (284427, 185054426), (284427, 203369931), (284427, 218126342), (284427, 220250159), (284427, 221979185), (284427, 20311217), (284427, 20174496), (284427, 28935019), (284427, 33942277), (284427, 11268392), (284427, 13096636), (284427, 18423084), (284427, 93163524), (284427, 107085366), (284427, 110646694), (284427, 115464096), (284427, 457748267), (284427, 459063076), (284427, 458448322), (284427, 465382096), (284427, 472063680), (284427, 473272866), (284427, 472105785), (284427, 477176977), (284427, 133380466), (284427, 145753675), (284427, 149946247), (284427, 152458404), (284427, 157132206), (284427, 247819894), (284427, 255323953), (284427, 261286872)]
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/python/DataPrepJobProperties.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/python/DataPrepJobProperties.py
new file mode 100644
index 000000000000..25488fdf6b86
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/python/DataPrepJobProperties.py
@@ -0,0 +1,27 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+# From Marcelo Vogel to allow setting the name of the output ROOT file for DAPR0
+# See https://its.cern.ch/jira/browse/PRODSYS-601 for more info
+
+from AthenaCommon.JobProperties import JobProperty, JobPropertyContainer
+from AthenaCommon.JobProperties import jobproperties
+ 
+class outputFile(JobProperty):
+    statusOn     = True
+    allowedTypes = ['str']
+    StoredValue  = 'PILEUP.root'
+    
+## Definition of the flag container
+class DataPrepJobProperties(JobPropertyContainer):
+    """Container for the DerivationFrameworkDataPrep key flags
+    """
+    pass
+
+## adding the container to the general top-level container
+jobproperties.add_Container(DataPrepJobProperties)
+ 
+## adding the flag to the  container
+jobproperties.DataPrepJobProperties.add_JobProperty( outputFile )
+
+## shortcut to access flags
+DataPrepFlags = jobproperties.DataPrepJobProperties
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/python/__init__.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/python/__init__.py
new file mode 100644
index 000000000000..74583d364ec2
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/python/__init__.py
@@ -0,0 +1,2 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/share/DAPR0.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/share/DAPR0.py
new file mode 100644
index 000000000000..7c53c5b1dc6e
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/share/DAPR0.py
@@ -0,0 +1,24 @@
+#====================================================================
+# DAPR0.py 
+# reductionConf flag DAPR0 in Reco_tf.py   
+#====================================================================
+
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+streamName = derivationFlags.WriteDAOD_DAPR0Stream.StreamName
+fileName   = buildFileName( derivationFlags.WriteDAOD_DAPR0Stream )
+from DerivationFrameworkDataPrep.DataPrepJobProperties import DataPrepFlags
+pileupFileName = DataPrepFlags.outputFile()
+DAPR0Stream = MSMgr.NewPoolRootStream( streamName, fileName )
+
+
+##use pileupreweighting provider to generate a df.metadata.root prw config file
+##only to run if the input file is post-digitization (i.e. dont run this on EVNT)
+from RecExConfig.InputFilePeeker import inputFileSummary
+
+if 'metadata' in inputFileSummary and '/Digitization/Parameters' in inputFileSummary['metadata']:
+    ToolSvc += CfgMgr.CP__PileupReweightingTool("auto",ConfigFiles=[],LumiCalcFiles=[])
+    DerivationFrameworkJob += CfgMgr.CP__PileupReweightingProvider(ConfigOutputStream="DFMETADATA",Tool=ToolSvc.auto,RunSystematics=False)
+    if not hasattr(svcMgr,'THistSvc'):
+        svcMgr += CfgMgr.THistSvc()
+    histString = "DFMETADATA DATAFILE=\'"+pileupFileName+"\' OPT=\'RECREATE\'"
+    svcMgr.THistSvc.Output += [histString]
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/share/DAPR1.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/share/DAPR1.py
new file mode 100644
index 000000000000..f61767146f41
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/share/DAPR1.py
@@ -0,0 +1,55 @@
+#====================================================================
+# DAPR1.py 
+# reductionConf flag DAPR1 in Reco_tf.py   
+#====================================================================
+
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+from DerivationFrameworkJetEtMiss.JetCommon import *
+#from DerivationFrameworkJetEtMiss.ExtendedJetCommon import *
+#from DerivationFrameworkJetEtMiss.METCommon import *
+
+#====================================================================
+# SKIMMING TOOL 
+#====================================================================
+# NOTE: need to be able to OR isSimulated as an OR with the trigger
+trigger = '(EF_j360_a4tchad || HLT_j360_a4tchad || L1_BCM_AC_CA_BGRP0 || L1_BCM_Wide_EMPTY || L1_BCM_Wide_UNPAIRED_ISO || L1_BCM_Wide_UNPAIRED_NONISO || L1_BCM_Wide_CALIB || L1_BCM_Wide_ABORTGAPNOTCALIB || L1_BCM_AC_UNPAIRED_ISO || L1_BCM_CA_UNPAIRED_ISO || L1_BCM_AC_UNPAIRED_NONISO || L1_BCM_CA_UNPAIRED_NONISO || L1_BCM_AC_ABORTGAPNOTCALIB || L1_BCM_CA_ABORTGAPNOTCALIB || L1_BCM_AC_CALIB || L1_BCM_CA_CALIB || L1_J12_UNPAIRED_ISO || L1_J12_UNPAIRED_NONISO || L1_J12_ABORTGAPNOTCALIB || L1_J12 || L1_J12_EMPTY)'
+expression = trigger+' || (EventInfo.eventTypeBitmask==1)'
+
+from DerivationFrameworkTools.DerivationFrameworkToolsConf import DerivationFramework__xAODStringSkimmingTool
+DAPR1SkimmingTool = DerivationFramework__xAODStringSkimmingTool(name = "DAPR1SkimmingTool1",
+                                                                    expression = expression)
+ToolSvc += DAPR1SkimmingTool
+
+#=======================================
+# CREATE THE DERIVATION KERNEL ALGORITHM   
+#=======================================
+
+from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__DerivationKernel
+DerivationFrameworkJob += CfgMgr.DerivationFramework__DerivationKernel("DAPR1Kernel",
+                                                                       SkimmingTools = [DAPR1SkimmingTool])
+                                                                        
+
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+streamName = derivationFlags.WriteDAOD_DAPR1Stream.StreamName
+fileName   = buildFileName( derivationFlags.WriteDAOD_DAPR1Stream )
+DAPR1Stream = MSMgr.NewPoolRootStream( streamName, fileName )
+DAPR1Stream.AcceptAlgs(["DAPR1Kernel"])
+
+#====================================================================
+# Add the containers to the output stream - slimming done here
+#====================================================================
+from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
+DAPR1SlimmingHelper = SlimmingHelper("DAPR1SlimmingHelper")
+DAPR1SlimmingHelper.SmartCollections = ["Muons", "PrimaryVertices"]
+DAPR1SlimmingHelper.AllVariables = ["AntiKt4LCTopoJets",
+                                   "AntiKt4EMTopoJets",
+                                   "CaloCalTopoClusters",
+                                   "MuonSegments" ]
+DAPR1SlimmingHelper.IncludeMuonTriggerContent = True
+DAPR1SlimmingHelper.IncludeEGammaTriggerContent = True
+DAPR1SlimmingHelper.IncludeBPhysTriggerContent = True
+DAPR1SlimmingHelper.IncludeJetTauEtMissTriggerContent = True
+
+DAPR1SlimmingHelper.AppendContentToStream(DAPR1Stream)
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/share/DAPR2.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/share/DAPR2.py
new file mode 100644
index 000000000000..153be9c80275
--- /dev/null
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkDataPrep/share/DAPR2.py
@@ -0,0 +1,35 @@
+#====================================================================
+# DAPR2.py 
+# reductionConf flag DAPR2 in Reco_tf.py   
+# Special event picking format, to be used in case of event index
+# failure
+#====================================================================
+
+from DerivationFrameworkCore.DerivationFrameworkMaster import *
+
+#====================================================================
+# EVENT PICKING   
+#====================================================================
+from DerivationFrameworkDataPrep.DAPR2EventList import EventList
+seq = CfgMgr.AthSequencer("DFEventPickingSequence") 
+from GaudiSequencer.PyComps import PyEvtFilter
+seq += PyEvtFilter(
+   'DFEventPickingAlg',
+   # the store-gate key. leave as an empty string to take any eventinfo instance
+   evt_info='',
+   OutputLevel=Lvl.WARNING)
+seq.DFEventPickingAlg.evt_list = EventList
+DerivationFrameworkJob += seq
+#====================================================================
+# SET UP STREAM   
+#====================================================================
+streamName = derivationFlags.WriteDAOD_DAPR2Stream.StreamName
+fileName   = buildFileName( derivationFlags.WriteDAOD_DAPR2Stream )
+DAPR2Stream = MSMgr.NewPoolRootStream( streamName, fileName )
+DAPR2Stream.AcceptAlgs(["DFEventPickingAlg"])
+#====================================================================
+# Store all containers
+#====================================================================
+from PrimaryDPDMaker import PrimaryDPD_OutputDefinitions as dpdOutput
+excludeList = []
+dpdOutput.addAllItemsFromInputExceptExcludeList( streamName, excludeList )
diff --git a/PhysicsAnalysis/PATJobTransforms/share/skeleton.AODtoDAOD_tf.py b/PhysicsAnalysis/PATJobTransforms/share/skeleton.AODtoDAOD_tf.py
index 70f399fe7c4c..6aff290decc8 100644
--- a/PhysicsAnalysis/PATJobTransforms/share/skeleton.AODtoDAOD_tf.py
+++ b/PhysicsAnalysis/PATJobTransforms/share/skeleton.AODtoDAOD_tf.py
@@ -15,11 +15,12 @@ def getSubSequences(sequence,sequenceList):
             getSubSequences(item,sequenceList)
     return
 
-if hasattr(runArgs, "reductionConf"):
-    msg.info('Will attempt to make the following reduced formats: {0}'.format(runArgs.reductionConf))
-else:
-    msg.error('AOD Reduction job started, but with no "reductionConf" array - aborting')
-    raise RuntimeError("No reductions configured")
+if not hasattr(runArgs, "outputNTUP_PILEUPFile"):
+    if hasattr(runArgs, "reductionConf"):
+        msg.info('Will attempt to make the following reduced formats: {0}'.format(runArgs.reductionConf))
+    else:
+        msg.error('AOD Reduction job started, but with no "reductionConf" array - aborting')
+        raise RuntimeError("No reductions configured")
 
 include("RecJobTransforms/CommonRecoSkeletonJobOptions.py")
 
@@ -66,6 +67,13 @@ else:
     msg.error('AOD Reduction job started, but with no AOD inputs - aborting')
     raise RuntimeError("No AOD input")
 
+# Deal appropriately with NTUP_PILEUP
+if hasattr(runArgs, "outputNTUP_PILEUPFile"):
+    from DerivationFrameworkDataPrep.DataPrepJobProperties import DataPrepFlags
+    DataPrepFlags.outputFile = runArgs.outputNTUP_PILEUPFile
+    runArgs.outputDAOD_DAPR0File = "DAOD_DAPR0.root"
+    runArgs.reductionConf = "DAPR0"
+
 listOfFlags=[]
 
 try:
-- 
GitLab


From a84d6d45530d14b7028713dc2ca009419e81352a Mon Sep 17 00:00:00 2001
From: Christos Anastopoulos <christos.anastopoulos@cern.ch>
Date: Thu, 17 Dec 2020 17:33:26 +0000
Subject: [PATCH 131/225] Make CaloBanChanTool EventContext aware to avoid
 lookups

---
 .../CaloBadChannelTool/CaloBadChanTool.h      | 22 ++++---
 .../src/CaloBadChanTool.cxx                   | 57 +++++++++----------
 .../src/CaloClusterBadChannelList.cxx         | 11 ++--
 .../CaloConditions/ICaloBadChanTool.h         | 13 ++++-
 .../TileConditions/TileBadChanTool.h          |  4 +-
 .../TileConditions/src/TileBadChanTool.cxx    |  6 +-
 6 files changed, 67 insertions(+), 46 deletions(-)

diff --git a/Calorimeter/CaloBadChannelTool/CaloBadChannelTool/CaloBadChanTool.h b/Calorimeter/CaloBadChannelTool/CaloBadChannelTool/CaloBadChanTool.h
index db0b28852b32..38c44b229ae6 100644
--- a/Calorimeter/CaloBadChannelTool/CaloBadChannelTool/CaloBadChanTool.h
+++ b/Calorimeter/CaloBadChannelTool/CaloBadChannelTool/CaloBadChanTool.h
@@ -22,17 +22,25 @@ public:
   CaloBadChanTool(const std::string& type, const std::string& name, 
 		  const IInterface* parent);
 
-  virtual ~CaloBadChanTool();
+  virtual ~CaloBadChanTool() override;
 					  
-  virtual StatusCode initialize();
-
-  virtual CaloBadChannel caloStatus( Identifier id) const;
+  virtual StatusCode initialize() override;
 
+  using ICaloBadChanTool::caloStatus;
+  virtual CaloBadChannel caloStatus(const EventContext& ctx,
+                                    Identifier id) const override;
 
 private:
-
-  SG::ReadCondHandleKey<LArBadChannelCont> m_larBCKey{this, "LArBadChanKey", "LArBadChannel", "LAr bad channel SG key"};
-  ToolHandle<ICaloBadChanTool> m_tileBCT{this, "TileBadChanTool", "TileBadChanTool", "Tile bad channel tool"};
+  SG::ReadCondHandleKey<LArBadChannelCont> m_larBCKey{
+    this,
+    "LArBadChanKey",
+    "LArBadChannel",
+    "LAr bad channel SG key"
+  };
+  ToolHandle<ICaloBadChanTool> m_tileBCT{ this,
+                                          "TileBadChanTool",
+                                          "TileBadChanTool",
+                                          "Tile bad channel tool" };
   const CaloCell_ID* m_caloID;
 };
 
diff --git a/Calorimeter/CaloBadChannelTool/src/CaloBadChanTool.cxx b/Calorimeter/CaloBadChannelTool/src/CaloBadChanTool.cxx
index 9db108c108c3..70d49eb9916b 100644
--- a/Calorimeter/CaloBadChannelTool/src/CaloBadChanTool.cxx
+++ b/Calorimeter/CaloBadChannelTool/src/CaloBadChanTool.cxx
@@ -6,7 +6,7 @@
 
 //#include "GaudiKernel/MsgStream.h"
 
-CaloBadChanTool::CaloBadChanTool(const std::string& type, const std::string& name, 
+CaloBadChanTool::CaloBadChanTool(const std::string& type, const std::string& name,
 				 const IInterface* parent) :
   AthAlgTool( type, name, parent),
   m_caloID(nullptr)
@@ -26,7 +26,7 @@ StatusCode CaloBadChanTool::initialize()
   if (sc.isFailure()) {
     ATH_MSG_WARNING ( "Unable to initialize LAr bad channels key: no LAr bad channel info will be provided " );
   }
-  else 
+  else
     ATH_MSG_DEBUG ( "LAr bad channels key initialized" );
 
 
@@ -34,41 +34,40 @@ StatusCode CaloBadChanTool::initialize()
   if (sc.isFailure()) {
     ATH_MSG_WARNING ( "Unable to get TileBadChannelTool: no Tile bad channel info will be provided " );
   }
-  else 
+  else
     ATH_MSG_DEBUG ( "TileBadChannelTool retrieved" );
 
   ATH_CHECK( detStore()->retrieve(m_caloID, "CaloCell_ID") );
   return StatusCode::SUCCESS;
 }
 
-CaloBadChannel CaloBadChanTool::caloStatus(Identifier id) const{
+CaloBadChannel
+CaloBadChanTool::caloStatus(const EventContext& ctx, Identifier id) const
+{
   if (m_tileBCT && m_caloID->is_tile(id)) {
-    return m_tileBCT->caloStatus(id);
-  }
-  else if(m_caloID->is_lar(id)) {
-     SG::ReadCondHandle<LArBadChannelCont> bch{m_larBCKey};
-     const LArBadChannelCont* bcCont{*bch};
-     if(bcCont) {
-        CaloBadChannel::BitWord res = 0;
-        LArBadChannel lbc = bcCont->offlineStatus(id);
-        
-        if ( lbc.reallyNoisy() || lbc.sporadicBurstNoise()) {
-          CaloBadChannel::setBit( CaloBadChannel::noisyBit, res);
-        }
-        if (lbc.deadReadout() || lbc.deadPhys()) {
-          CaloBadChannel::setBit( CaloBadChannel::deadBit, res);
-        }
-        else if ( ! lbc.good()) {
-          CaloBadChannel::setBit( CaloBadChannel::affectedBit, res);
-        }
-        return CaloBadChannel(res);
-     } else {
-        CaloBadChannel empty;
-        return empty;
-     }
-  }
-  else {
+    return m_tileBCT->caloStatus(ctx,id);
+  } else if (m_caloID->is_lar(id)) {
+    SG::ReadCondHandle<LArBadChannelCont> bch{ m_larBCKey, ctx };
+    const LArBadChannelCont* bcCont{ *bch };
+    if (bcCont) {
+      CaloBadChannel::BitWord res = 0;
+      LArBadChannel lbc = bcCont->offlineStatus(id);
+
+      if (lbc.reallyNoisy() || lbc.sporadicBurstNoise()) {
+        CaloBadChannel::setBit(CaloBadChannel::noisyBit, res);
+      }
+      if (lbc.deadReadout() || lbc.deadPhys()) {
+        CaloBadChannel::setBit(CaloBadChannel::deadBit, res);
+      } else if (!lbc.good()) {
+        CaloBadChannel::setBit(CaloBadChannel::affectedBit, res);
+      }
+      return CaloBadChannel(res);
+    } else {
       CaloBadChannel empty;
       return empty;
+    }
+  } else {
+    CaloBadChannel empty;
+    return empty;
   }
 }
diff --git a/Calorimeter/CaloClusterCorrection/src/CaloClusterBadChannelList.cxx b/Calorimeter/CaloClusterCorrection/src/CaloClusterBadChannelList.cxx
index c5bda73dddce..920085af0c42 100755
--- a/Calorimeter/CaloClusterCorrection/src/CaloClusterBadChannelList.cxx
+++ b/Calorimeter/CaloClusterCorrection/src/CaloClusterBadChannelList.cxx
@@ -35,7 +35,7 @@ StatusCode CaloClusterBadChannelList::initialize()
 }
 
 
-void CaloClusterBadChannelList::makeCorrection (const Context& /*myctx*/,
+void CaloClusterBadChannelList::makeCorrection (const Context& myctx,
                                                 CaloCluster* cluster) const
 {
   xAOD::CaloClusterBadChannelList badChanList;
@@ -44,8 +44,8 @@ void CaloClusterBadChannelList::makeCorrection (const Context& /*myctx*/,
   CaloCluster::cell_iterator cellIterEnd = cluster->cell_end();
   for( ;cellIter!=cellIterEnd;cellIter++) {
       const CaloCell* cell = (*cellIter);
-      const Identifier id = cell->ID(); 
-      CaloBadChannel status = m_badChannelTool->caloStatus(id);
+      const Identifier id = cell->ID();
+      CaloBadChannel status = m_badChannelTool->caloStatus(myctx.ctx(),id);
       bool isBad = cell->badcell();
       if (status.dead() || status.noisy() || isBad )   {
          const float eta = cell->eta();
@@ -56,8 +56,9 @@ void CaloClusterBadChannelList::makeCorrection (const Context& /*myctx*/,
          if (isBad && !status.dead()) {
             CaloBadChannel::setBit(CaloBadChannel::deadBit,myword,true);
          }
-         ATH_MSG_DEBUG(" bad channel found eta,phi,layer,status " << eta << " " << phi << " " << layer << " " << myword);
-	 badChanList.emplace_back(eta,phi,layer,myword);
+         ATH_MSG_DEBUG(" bad channel found eta,phi,layer,status "
+                       << eta << " " << phi << " " << layer << " " << myword);
+         badChanList.emplace_back(eta, phi, layer, myword);
       }
   }  // end loop over cells
   cluster->setBadChannelList(badChanList);
diff --git a/Calorimeter/CaloConditions/CaloConditions/ICaloBadChanTool.h b/Calorimeter/CaloConditions/CaloConditions/ICaloBadChanTool.h
index 4aa9304052af..11d50456c9cf 100644
--- a/Calorimeter/CaloConditions/CaloConditions/ICaloBadChanTool.h
+++ b/Calorimeter/CaloConditions/CaloConditions/ICaloBadChanTool.h
@@ -8,13 +8,22 @@
 #include "Identifier/Identifier.h"
 #include "CaloConditions/CaloBadChannel.h"
 #include "GaudiKernel/IAlgTool.h"
+#include "GaudiKernel/EventContext.h"
+#include "GaudiKernel/ThreadLocalContext.h"
+
 
 class ICaloBadChanTool : public virtual IAlgTool {
 public:
 					  
   virtual ~ICaloBadChanTool() {}
-  
-  virtual CaloBadChannel caloStatus( Identifier id) const = 0;
+
+  virtual CaloBadChannel caloStatus(const EventContext& ctx,
+                                    Identifier id) const = 0;
+
+  virtual CaloBadChannel caloStatus(Identifier id) const
+  {
+    return caloStatus(Gaudi::Hive::currentContext(), id);
+  }
 
   static const InterfaceID& interfaceID() { 
     static const InterfaceID id("ICaloBadChanTool", 1 , 0);
diff --git a/TileCalorimeter/TileConditions/TileConditions/TileBadChanTool.h b/TileCalorimeter/TileConditions/TileConditions/TileBadChanTool.h
index f7af1ad527f9..52c7df546971 100644
--- a/TileCalorimeter/TileConditions/TileConditions/TileBadChanTool.h
+++ b/TileCalorimeter/TileConditions/TileConditions/TileBadChanTool.h
@@ -51,7 +51,9 @@ class TileBadChanTool: public extends<AthAlgTool, ITileBadChanTool, ICaloBadChan
      * @brief ICaloBadChanTool interface.
      * @param cell_id Calo cell identifier
      */
-    virtual CaloBadChannel caloStatus(Identifier cell_id) const override;
+    using ICaloBadChanTool::caloStatus;
+    virtual CaloBadChannel caloStatus(const EventContext& ctx,
+                                      Identifier cell_id) const override;
 
     //===============================================================
     //=== ITileBadChanTool methods
diff --git a/TileCalorimeter/TileConditions/src/TileBadChanTool.cxx b/TileCalorimeter/TileConditions/src/TileBadChanTool.cxx
index 7417de199984..9b70a2572c63 100644
--- a/TileCalorimeter/TileConditions/src/TileBadChanTool.cxx
+++ b/TileCalorimeter/TileConditions/src/TileBadChanTool.cxx
@@ -81,7 +81,9 @@ StatusCode TileBadChanTool::finalize() {
 
 //
 //____________________________________________________________________
-CaloBadChannel TileBadChanTool::caloStatus(Identifier cell_id) const {
+CaloBadChannel
+TileBadChanTool::caloStatus(const EventContext& ctx, Identifier cell_id) const
+{
 
   CaloBadChannel::BitWord res = 0;
 
@@ -94,7 +96,7 @@ CaloBadChannel TileBadChanTool::caloStatus(Identifier cell_id) const {
     std::abort();
   }
 
-  SG::ReadCondHandle<TileBadChannels> badChannels(m_badChannelsKey);
+  SG::ReadCondHandle<TileBadChannels> badChannels(m_badChannelsKey,ctx);
 
   IdentifierHash hash1_id(elem->onl1());
   IdentifierHash hash2_id(elem->onl2());
-- 
GitLab


From 835817cc924d2c3896131872ca63461105cbb48d Mon Sep 17 00:00:00 2001
From: Peter van Gemmeren <gemmeren@anl.gov>
Date: Thu, 17 Dec 2020 11:53:34 -0600
Subject: [PATCH 132/225] Make test a little more robust, fix Jira: ATEAM-687

---
 .../share/AthenaPoolExample_Concat.ref        |  66 +--
 .../share/AthenaPoolExample_Copy.ref          | 194 ++++----
 .../share/AthenaPoolExample_RCond.ref         | 178 +++----
 .../share/AthenaPoolExample_RMeta.ref         | 168 +++----
 .../share/AthenaPoolExample_ReWrite.ref       | 176 +++----
 .../share/AthenaPoolExample_ReWriteAgain.ref  | 194 ++++----
 .../share/AthenaPoolExample_ReWriteNext.ref   | 176 +++----
 .../share/AthenaPoolExample_Read.ref          | 418 ++++++++---------
 .../share/AthenaPoolExample_ReadAgain.ref     | 436 +++++++++---------
 .../share/AthenaPoolExample_ReadConcat.ref    | 428 ++++++++---------
 .../share/AthenaPoolExample_WCond.ref         | 172 +++----
 .../share/AthenaPoolExample_WMeta.ref         |  48 +-
 .../share/AthenaPoolExample_Write.ref         |  66 +--
 .../test/athenarun_test.sh.in                 |   1 -
 14 files changed, 1360 insertions(+), 1361 deletions(-)

diff --git a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_Concat.ref b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_Concat.ref
index d2a9fd62a6d3..56bebd2cf508 100644
--- a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_Concat.ref
+++ b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_Concat.ref
@@ -230,7 +230,7 @@ CollectionTree(...  DEBUG Opening
 CollectionTree(...  DEBUG    attributes# = 1
 CollectionTree(...  DEBUG Branch container 'EventInfo_p4_McEventInfo'
 CollectionTree(...  DEBUG Opened container CollectionTree(EventInfo_p4/McEventInfo) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[0 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:EventInfo_p4
@@ -242,7 +242,7 @@ CollectionTree(...  DEBUG Opening
 CollectionTree(...  DEBUG    attributes# = 1
 CollectionTree(...  DEBUG Branch container 'ExampleHitContainer_p1_MyHits'
 CollectionTree(...  DEBUG Opened container CollectionTree(ExampleHitContainer_p1/MyHits) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/CollectionTree(ExampleHitContainer_p1/MyHits) [20?]  (4 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/CollectionTree(ExampleHitContainer_p1/MyHits) [203]  (4 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[1 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:ExampleHitContainer_p1
@@ -254,7 +254,7 @@ POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
 POOLContainer(D...  DEBUG Branch container 'DataHeader'
 POOLContainer(D...  DEBUG Opened container POOLContainer(DataHeader) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[2 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:DataHeader_p6
@@ -266,7 +266,7 @@ POOLContainerFo...  DEBUG Opening
 POOLContainerFo...  DEBUG    attributes# = 1
 POOLContainerFo...  DEBUG Branch container 'DataHeaderForm'
 POOLContainerFo...  DEBUG Opened container POOLContainerForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[3 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:DataHeaderForm_p6
@@ -278,7 +278,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'Token'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(Token) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[4 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:Token
@@ -290,7 +290,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'IsSimulation'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(IsSimulation) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsSimulation) [20?]  (8 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsSimulation) [202]  (8 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[5 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:bool
@@ -300,14 +300,14 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'IsCalibration'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(IsCalibration) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsCalibration) [20?]  (9 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsCalibration) [202]  (9 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(IsTestBeam)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'IsTestBeam'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(IsTestBeam) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsTestBeam) [20?]  (a , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsTestBeam) [202]  (a , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 StorageSvc           INFO Building shape according to reflection information using shape ID for:
 StorageSvc           INFO unsigned int [????]
@@ -316,7 +316,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'McChannel'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(McChannel) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(McChannel) [20?]  (b , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(McChannel) [202]  (b , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[6 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:unsigned int
@@ -326,7 +326,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'RunNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(RunNumber) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(RunNumber) [20?]  (c , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(RunNumber) [202]  (c , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 StorageSvc           INFO Building shape according to reflection information using shape ID for:
 StorageSvc           INFO unsigned long long [????]
@@ -335,7 +335,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'EventNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(EventNumber) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventNumber) [20?]  (d , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventNumber) [202]  (d , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[7 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:unsigned long long
@@ -345,35 +345,35 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'LumiBlockN'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(LumiBlockN) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(LumiBlockN) [20?]  (e , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(LumiBlockN) [202]  (e , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(ConditionsRun)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'ConditionsRun'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(ConditionsRun) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(ConditionsRun) [20?]  (f , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(ConditionsRun) [202]  (f , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(EventTime)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'EventTime'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(EventTime) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventTime) [20?]  (10 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventTime) [202]  (10 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(EventTimeNanoSec)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'EventTimeNanoSec'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(EventTimeNanoSec) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventTimeNanoSec) [20?]  (11 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventTimeNanoSec) [202]  (11 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(BunchId)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'BunchId'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(BunchId) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(BunchId) [20?]  (12 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(BunchId) [202]  (12 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 StorageSvc           INFO Building shape according to reflection information using shape ID for:
 StorageSvc           INFO float [????]
@@ -382,7 +382,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'EventWeight'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(EventWeight) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventWeight) [20?]  (13 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventWeight) [202]  (13 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[8 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:float
@@ -438,7 +438,7 @@ CollectionTree(...  DEBUG Opening
 CollectionTree(...  DEBUG    attributes# = 1
 CollectionTree(...  DEBUG Branch container 'EventInfo_p4_McEventInfo'
 CollectionTree(...  DEBUG Opened container CollectionTree(EventInfo_p4/McEventInfo) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[0 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:EventInfo_p4
@@ -450,7 +450,7 @@ CollectionTree(...  DEBUG Opening
 CollectionTree(...  DEBUG    attributes# = 1
 CollectionTree(...  DEBUG Branch container 'ExampleTrackContainer_p1_MyTracks'
 CollectionTree(...  DEBUG Opened container CollectionTree(ExampleTrackContainer_p1/MyTracks) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/CollectionTree(ExampleTrackContainer_p1/MyTracks) [20?]  (4 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/CollectionTree(ExampleTrackContainer_p1/MyTracks) [203]  (4 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[1 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:ExampleTrackContainer_p1
@@ -460,7 +460,7 @@ POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
 POOLContainer(D...  DEBUG Branch container 'DataHeader'
 POOLContainer(D...  DEBUG Opened container POOLContainer(DataHeader) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[2 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:DataHeader_p6
@@ -470,7 +470,7 @@ POOLContainerFo...  DEBUG Opening
 POOLContainerFo...  DEBUG    attributes# = 1
 POOLContainerFo...  DEBUG Branch container 'DataHeaderForm'
 POOLContainerFo...  DEBUG Opened container POOLContainerForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[3 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:DataHeaderForm_p6
@@ -1658,7 +1658,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (14 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (14 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[9 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:xAOD::FileMetaDataAuxInfo_v1
@@ -1670,7 +1670,7 @@ MetaData(EventS...  DEBUG Opening
 MetaData(EventS...  DEBUG    attributes# = 1
 MetaData(EventS...  DEBUG Branch container 'EventStreamInfo_p3_Stream1'
 MetaData(EventS...  DEBUG Opened container MetaData(EventStreamInfo_p3/Stream1) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (15 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream1) [203]  (15 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[10 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:EventStreamInfo_p3
@@ -1682,7 +1682,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaData_v1_FileMetaData'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaData_v1/FileMetaData) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (16 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (16 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[11 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:xAOD::FileMetaData_v1
@@ -1694,7 +1694,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::EventFormat_v1_EventFormatStream1'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::EventFormat_v1/EventFormatStream1) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (17 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [203]  (17 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[12 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:xAOD::EventFormat_v1
@@ -1704,14 +1704,14 @@ MetaDataHdr(Dat...  DEBUG Opening
 MetaDataHdr(Dat...  DEBUG    attributes# = 1
 MetaDataHdr(Dat...  DEBUG Branch container 'DataHeader'
 MetaDataHdr(Dat...  DEBUG Opened container MetaDataHdr(DataHeader) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [20?]  (18 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [203]  (18 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] MetaDataHdrForm(DataHeaderForm)
 MetaDataHdrForm...  DEBUG Opening
 MetaDataHdrForm...  DEBUG    attributes# = 1
 MetaDataHdrForm...  DEBUG Branch container 'DataHeaderForm'
 MetaDataHdrForm...  DEBUG Opened container MetaDataHdrForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [20?]  (19 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [203]  (19 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 MetaData(xAOD::...  DEBUG  SG::IAuxStoreIO* detected in xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.
 MetaData(xAOD::...  DEBUG        Attributes= 1
@@ -1752,7 +1752,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (7 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (7 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[4 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:xAOD::FileMetaDataAuxInfo_v1
@@ -1762,7 +1762,7 @@ MetaData(EventS...  DEBUG Opening
 MetaData(EventS...  DEBUG    attributes# = 1
 MetaData(EventS...  DEBUG Branch container 'EventStreamInfo_p3_Stream2'
 MetaData(EventS...  DEBUG Opened container MetaData(EventStreamInfo_p3/Stream2) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream2) [20?]  (8 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream2) [203]  (8 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[5 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:EventStreamInfo_p3
@@ -1772,7 +1772,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaData_v1_FileMetaData'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaData_v1/FileMetaData) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (9 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (9 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[6 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:xAOD::FileMetaData_v1
@@ -1782,7 +1782,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::EventFormat_v1_EventFormatStream2'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::EventFormat_v1/EventFormatStream2) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream2) [20?]  (a , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream2) [203]  (a , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[7 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:xAOD::EventFormat_v1
@@ -1792,14 +1792,14 @@ MetaDataHdr(Dat...  DEBUG Opening
 MetaDataHdr(Dat...  DEBUG    attributes# = 1
 MetaDataHdr(Dat...  DEBUG Branch container 'DataHeader'
 MetaDataHdr(Dat...  DEBUG Opened container MetaDataHdr(DataHeader) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [20?]  (b , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [203]  (b , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] MetaDataHdrForm(DataHeaderForm)
 MetaDataHdrForm...  DEBUG Opening
 MetaDataHdrForm...  DEBUG    attributes# = 1
 MetaDataHdrForm...  DEBUG Branch container 'DataHeaderForm'
 MetaDataHdrForm...  DEBUG Opened container MetaDataHdrForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [20?]  (c , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [203]  (c , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 MetaData(xAOD::...  DEBUG  SG::IAuxStoreIO* detected in xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.
 MetaData(xAOD::...  DEBUG        Attributes= 1
diff --git a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_Copy.ref b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_Copy.ref
index 72d5c878fb4d..61744aeb1cf7 100644
--- a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_Copy.ref
+++ b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_Copy.ref
@@ -79,33 +79,33 @@ SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolFile1...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [20?]  (4 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [203]  (4 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [20?]  (8 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [202]  (8 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [20?]  (9 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [202]  (9 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [20?]  (a , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [202]  (a , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (b , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (b , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (c , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [203]  (c , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (d , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (d , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (e , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [203]  (e , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (f , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (f , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (10 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (10 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 15 Entries in total.
 SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -191,9 +191,9 @@ AthenaPoolCnvSvc    DEBUG setAttribute TREE_CACHE to -1 for db: SimplePoolFile1.
 Stream1.FileMet...   INFO Invalid "/TagInfo" handle
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000]
 SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_Tree] POOLContainer(DataHeader)
 POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
@@ -270,7 +270,7 @@ CollectionTree(...  DEBUG Opening
 CollectionTree(...  DEBUG    attributes# = 1
 CollectionTree(...  DEBUG Branch container 'EventInfo_p4_McEventInfo'
 CollectionTree(...  DEBUG Opened container CollectionTree(EventInfo_p4/McEventInfo) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --->Adding Shape[0 , ????]:  [1 Column(s)] 
 SimplePoolRepli...  DEBUG ---->Class:EventInfo_p4
@@ -280,7 +280,7 @@ CollectionTree(...  DEBUG Opening
 CollectionTree(...  DEBUG    attributes# = 1
 CollectionTree(...  DEBUG Branch container 'ExampleHitContainer_p1_MyHits'
 CollectionTree(...  DEBUG Opened container CollectionTree(ExampleHitContainer_p1/MyHits) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/CollectionTree(ExampleHitContainer_p1/MyHits) [20?]  (4 , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/CollectionTree(ExampleHitContainer_p1/MyHits) [203]  (4 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --->Adding Shape[1 , ????]:  [1 Column(s)] 
 SimplePoolRepli...  DEBUG ---->Class:ExampleHitContainer_p1
@@ -290,7 +290,7 @@ POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
 POOLContainer(D...  DEBUG Branch container 'DataHeader'
 POOLContainer(D...  DEBUG Opened container POOLContainer(DataHeader) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --->Adding Shape[2 , ????]:  [1 Column(s)] 
 SimplePoolRepli...  DEBUG ---->Class:DataHeader_p6
@@ -300,7 +300,7 @@ POOLContainerFo...  DEBUG Opening
 POOLContainerFo...  DEBUG    attributes# = 1
 POOLContainerFo...  DEBUG Branch container 'DataHeaderForm'
 POOLContainerFo...  DEBUG Opened container POOLContainerForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --->Adding Shape[3 , ????]:  [1 Column(s)] 
 SimplePoolRepli...  DEBUG ---->Class:DataHeaderForm_p6
@@ -310,7 +310,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'Token'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(Token) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --->Adding Shape[4 , ????]:  [1 Column(s)] 
 SimplePoolRepli...  DEBUG ---->Class:Token
@@ -322,7 +322,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'IsSimulation'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(IsSimulation) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsSimulation) [20?]  (8 , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsSimulation) [202]  (8 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --->Adding Shape[5 , ????]:  [1 Column(s)] 
 SimplePoolRepli...  DEBUG ---->Class:bool
@@ -332,21 +332,21 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'IsCalibration'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(IsCalibration) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsCalibration) [20?]  (9 , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsCalibration) [202]  (9 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(IsTestBeam)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'IsTestBeam'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(IsTestBeam) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsTestBeam) [20?]  (a , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsTestBeam) [202]  (a , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(McChannel)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'McChannel'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(McChannel) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(McChannel) [20?]  (b , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(McChannel) [202]  (b , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --->Adding Shape[6 , ????]:  [1 Column(s)] 
 SimplePoolRepli...  DEBUG ---->Class:unsigned int
@@ -356,7 +356,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'RunNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(RunNumber) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(RunNumber) [20?]  (c , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(RunNumber) [202]  (c , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 StorageSvc           INFO Building shape according to reflection information using shape ID for:
 StorageSvc           INFO unsigned long long [????]
@@ -365,7 +365,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'EventNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(EventNumber) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventNumber) [20?]  (d , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventNumber) [202]  (d , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --->Adding Shape[7 , ????]:  [1 Column(s)] 
 SimplePoolRepli...  DEBUG ---->Class:unsigned long long
@@ -375,35 +375,35 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'LumiBlockN'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(LumiBlockN) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(LumiBlockN) [20?]  (e , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(LumiBlockN) [202]  (e , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(ConditionsRun)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'ConditionsRun'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(ConditionsRun) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(ConditionsRun) [20?]  (f , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(ConditionsRun) [202]  (f , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(EventTime)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'EventTime'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(EventTime) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventTime) [20?]  (10 , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventTime) [202]  (10 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(EventTimeNanoSec)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'EventTimeNanoSec'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(EventTimeNanoSec) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventTimeNanoSec) [20?]  (11 , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventTimeNanoSec) [202]  (11 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(BunchId)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'BunchId'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(BunchId) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(BunchId) [20?]  (12 , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(BunchId) [202]  (12 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 StorageSvc           INFO Building shape according to reflection information using shape ID for:
 StorageSvc           INFO float [????]
@@ -412,7 +412,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'EventWeight'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(EventWeight) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventWeight) [20?]  (13 , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventWeight) [202]  (13 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --->Adding Shape[8 , ????]:  [1 Column(s)] 
 SimplePoolRepli...  DEBUG ---->Class:float
@@ -424,9 +424,9 @@ Stream1.FileMet...  DEBUG set xAOD::FileMetaData::dataType to Stream1
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #0, run #1 1 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -448,9 +448,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #1, run #1 2 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -472,9 +472,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #2, run #1 3 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -496,9 +496,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #3, run #1 4 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -520,9 +520,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #4, run #1 5 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -544,9 +544,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #5, run #1 6 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -568,9 +568,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #6, run #1 7 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -592,9 +592,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #7, run #1 8 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -616,9 +616,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #8, run #1 9 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -640,9 +640,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #9, run #1 10 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -664,9 +664,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #1 11 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -688,9 +688,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #1 12 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -712,9 +712,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #1 13 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -736,9 +736,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #1 14 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -760,9 +760,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #1 15 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -784,9 +784,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #1 16 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -808,9 +808,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #1 17 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -832,9 +832,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #1 18 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -856,9 +856,9 @@ Stream1             DEBUG connectOutput done for SimplePoolReplica1.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #1 19 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -918,7 +918,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (14 , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (14 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --->Adding Shape[9 , ????]:  [1 Column(s)] 
 SimplePoolRepli...  DEBUG ---->Class:xAOD::FileMetaDataAuxInfo_v1
@@ -930,7 +930,7 @@ MetaData(EventS...  DEBUG Opening
 MetaData(EventS...  DEBUG    attributes# = 1
 MetaData(EventS...  DEBUG Branch container 'EventStreamInfo_p3_Stream1'
 MetaData(EventS...  DEBUG Opened container MetaData(EventStreamInfo_p3/Stream1) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (15 , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream1) [203]  (15 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --->Adding Shape[10 , ????]:  [1 Column(s)] 
 SimplePoolRepli...  DEBUG ---->Class:EventStreamInfo_p3
@@ -942,7 +942,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaData_v1_FileMetaData'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaData_v1/FileMetaData) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (16 , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (16 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --->Adding Shape[11 , ????]:  [1 Column(s)] 
 SimplePoolRepli...  DEBUG ---->Class:xAOD::FileMetaData_v1
@@ -954,7 +954,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::EventFormat_v1_EventFormatStream1'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::EventFormat_v1/EventFormatStream1) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (17 , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [203]  (17 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --->Adding Shape[12 , ????]:  [1 Column(s)] 
 SimplePoolRepli...  DEBUG ---->Class:xAOD::EventFormat_v1
@@ -964,14 +964,14 @@ MetaDataHdr(Dat...  DEBUG Opening
 MetaDataHdr(Dat...  DEBUG    attributes# = 1
 MetaDataHdr(Dat...  DEBUG Branch container 'DataHeader'
 MetaDataHdr(Dat...  DEBUG Opened container MetaDataHdr(DataHeader) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [20?]  (18 , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [203]  (18 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 SimplePoolRepli...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] MetaDataHdrForm(DataHeaderForm)
 MetaDataHdrForm...  DEBUG Opening
 MetaDataHdrForm...  DEBUG    attributes# = 1
 MetaDataHdrForm...  DEBUG Branch container 'DataHeaderForm'
 MetaDataHdrForm...  DEBUG Opened container MetaDataHdrForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolRepli...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [20?]  (19 , ffffffff)
+SimplePoolRepli...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [203]  (19 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 MetaData(xAOD::...  DEBUG  SG::IAuxStoreIO* detected in xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.
 MetaData(xAOD::...  DEBUG        Attributes= 1
diff --git a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_RCond.ref b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_RCond.ref
index 6ab064a1bd33..68bd01c5b92c 100644
--- a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_RCond.ref
+++ b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_RCond.ref
@@ -92,51 +92,51 @@ SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolFile1...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [20?]  (4 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [203]  (4 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsSimulation) [20?]  (8 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsSimulation) [202]  (8 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsCalibration) [20?]  (9 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsCalibration) [202]  (9 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsTestBeam) [20?]  (a , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsTestBeam) [202]  (a , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(McChannel) [20?]  (b , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(McChannel) [202]  (b , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [20?]  (c , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [202]  (c , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [20?]  (d , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [202]  (d , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(LumiBlockN) [20?]  (e , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(LumiBlockN) [202]  (e , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(ConditionsRun) [20?]  (f , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(ConditionsRun) [202]  (f , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTime) [20?]  (10 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTime) [202]  (10 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTimeNanoSec) [20?]  (11 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTimeNanoSec) [202]  (11 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(BunchId) [20?]  (12 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(BunchId) [202]  (12 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventWeight) [20?]  (13 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventWeight) [202]  (13 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (14 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (14 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (15 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [203]  (15 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (16 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (16 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (17 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [203]  (17 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (18 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (18 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (19 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (19 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 24 Entries in total.
 SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -192,11 +192,11 @@ SimplePoolFile4...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolFile4...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/ConditionsContainer(ExampleHitContainer_p1/PedestalWriteData) [20?]  (3 , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/ConditionsContainer(ExampleHitContainer_p1/PedestalWriteData) [203]  (3 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (4 , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (4 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (5 , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (5 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 4 Entries in total.
 SimplePoolFile4...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -227,9 +227,9 @@ MetaDataSvc         DEBUG Loaded input meta data store proxies
 MetaDataSvc         DEBUG  calling beginInputFile for ToolSvc.IOVDbMetaDataTool
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000]
 SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_Tree] POOLContainer(DataHeader)
 POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
@@ -273,11 +273,11 @@ SimplePoolFile4...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolFile4...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/ConditionsContainer(ExampleHitContainer_p1/PedestalWriteData) [20?]  (3 , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/ConditionsContainer(ExampleHitContainer_p1/PedestalWriteData) [203]  (3 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (4 , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (4 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (5 , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (5 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 4 Entries in total.
 SimplePoolFile4...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -341,10 +341,10 @@ ReadData             INFO Hit x = 30.1245 y = 46.5449 z = 43.831 detector = Dumm
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #0, run #1 1 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
 ClassIDSvc           INFO  getRegistryEntries: read 21 CLIDRegistry entries for module ALL
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001]
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -375,9 +375,9 @@ ReadData             INFO Hit x = 130.125 y = 46.5449 z = -56.169 detector = Dum
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #1, run #1 2 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -408,9 +408,9 @@ ReadData             INFO Hit x = 230.125 y = 46.5449 z = -156.169 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #2, run #1 3 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -441,9 +441,9 @@ ReadData             INFO Hit x = 330.125 y = 46.5449 z = -256.169 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #3, run #1 4 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -474,9 +474,9 @@ ReadData             INFO Hit x = 430.125 y = 46.5449 z = -356.169 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #4, run #1 5 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -507,9 +507,9 @@ ReadData             INFO Hit x = 530.125 y = 46.5449 z = -456.169 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #5, run #1 6 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -540,9 +540,9 @@ ReadData             INFO Hit x = 630.125 y = 46.5449 z = -556.169 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #6, run #1 7 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -573,9 +573,9 @@ ReadData             INFO Hit x = 730.125 y = 46.5449 z = -656.169 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #7, run #1 8 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -606,9 +606,9 @@ ReadData             INFO Hit x = 830.125 y = 46.5449 z = -756.169 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #8, run #1 9 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -639,9 +639,9 @@ ReadData             INFO Hit x = 930.125 y = 46.5449 z = -856.169 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #9, run #1 10 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -672,9 +672,9 @@ ReadData             INFO Hit x = 1030.12 y = 46.5449 z = -956.169 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #1 11 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -705,9 +705,9 @@ ReadData             INFO Hit x = 1130.12 y = 46.5449 z = -1056.17 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #1 12 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -738,9 +738,9 @@ ReadData             INFO Hit x = 1230.12 y = 46.5449 z = -1156.17 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #1 13 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -771,9 +771,9 @@ ReadData             INFO Hit x = 1330.12 y = 46.5449 z = -1256.17 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #1 14 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -804,9 +804,9 @@ ReadData             INFO Hit x = 1430.12 y = 46.5449 z = -1356.17 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #1 15 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -837,9 +837,9 @@ ReadData             INFO Hit x = 1530.12 y = 46.5449 z = -1456.17 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #1 16 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -870,9 +870,9 @@ ReadData             INFO Hit x = 1630.12 y = 46.5449 z = -1556.17 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #1 17 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -903,9 +903,9 @@ ReadData             INFO Hit x = 1730.12 y = 46.5449 z = -1656.17 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #1 18 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -936,9 +936,9 @@ ReadData             INFO Hit x = 1830.12 y = 46.5449 z = -1756.17 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #1 19 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
diff --git a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_RMeta.ref b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_RMeta.ref
index 4265520c8b57..62d7dbe9ca0f 100644
--- a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_RMeta.ref
+++ b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_RMeta.ref
@@ -89,53 +89,53 @@ SimplePoolFile5...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolFile5...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [20?]  (4 , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [203]  (4 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsSimulation) [20?]  (8 , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsSimulation) [202]  (8 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsCalibration) [20?]  (9 , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsCalibration) [202]  (9 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsTestBeam) [20?]  (a , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsTestBeam) [202]  (a , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(McChannel) [20?]  (b , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(McChannel) [202]  (b , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [20?]  (c , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [202]  (c , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [20?]  (d , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [202]  (d , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(LumiBlockN) [20?]  (e , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(LumiBlockN) [202]  (e , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(ConditionsRun) [20?]  (f , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(ConditionsRun) [202]  (f , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTime) [20?]  (10 , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTime) [202]  (10 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTimeNanoSec) [20?]  (11 , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTimeNanoSec) [202]  (11 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(BunchId) [20?]  (12 , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(BunchId) [202]  (12 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventWeight) [20?]  (13 , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventWeight) [202]  (13 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (14 , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [202]  (14 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/MetaData(ExampleHitContainer_p1/PedestalWriteData) [20?]  (15 , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/MetaData(ExampleHitContainer_p1/PedestalWriteData) [202]  (15 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (16 , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [202]  (16 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (17 , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [202]  (17 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (18 , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [202]  (18 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (19 , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [202]  (19 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
-SimplePoolFile5...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (1a , ffffffff)
+SimplePoolFile5...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [202]  (1a , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 25 Entries in total.
 SimplePoolFile5...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -195,10 +195,10 @@ MetaData(Exampl...  DEBUG Opened container MetaData(ExampleHitContainer_p1/Pedes
 ToolSvc.AthPool...   INFO Pedestal x = 193136 y = -5580.01 z = -175208 string = <..........o..........o..........o..........o..........o..........o..........o..........o..........o..........o..........o..........o..........o..........o..........o..........o..........o..........o..........o..........o>
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
 ClassIDSvc           INFO  getRegistryEntries: read 6 CLIDRegistry entries for module ALL
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000]
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000]
 SimplePoolFile5...  DEBUG --> Access   DbContainer  READ      [ROOT_Tree] POOLContainer(DataHeader)
 POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
@@ -249,10 +249,10 @@ ReadData             INFO Hit x = 30.1245 y = -53.4551 z = 43.831 detector = Dum
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #0, run #0 1 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
 ClassIDSvc           INFO  getRegistryEntries: read 15 CLIDRegistry entries for module ALL
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001]
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -281,9 +281,9 @@ ReadData             INFO Hit x = 130.125 y = -53.4551 z = -56.169 detector = Du
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #1, run #0 2 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -312,9 +312,9 @@ ReadData             INFO Hit x = 230.125 y = -53.4551 z = -156.169 detector = D
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #2, run #0 3 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -343,9 +343,9 @@ ReadData             INFO Hit x = 330.125 y = -53.4551 z = -256.169 detector = D
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #3, run #0 4 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -374,9 +374,9 @@ ReadData             INFO Hit x = 430.125 y = -53.4551 z = -356.169 detector = D
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #4, run #0 5 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -405,9 +405,9 @@ ReadData             INFO Hit x = 530.125 y = -53.4551 z = -456.169 detector = D
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #5, run #0 6 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -436,9 +436,9 @@ ReadData             INFO Hit x = 630.125 y = -53.4551 z = -556.169 detector = D
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #6, run #0 7 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -467,9 +467,9 @@ ReadData             INFO Hit x = 730.125 y = -53.4551 z = -656.169 detector = D
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #7, run #0 8 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -498,9 +498,9 @@ ReadData             INFO Hit x = 830.125 y = -53.4551 z = -756.169 detector = D
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #8, run #0 9 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -529,9 +529,9 @@ ReadData             INFO Hit x = 930.125 y = -53.4551 z = -856.169 detector = D
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #9, run #0 10 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -560,9 +560,9 @@ ReadData             INFO Hit x = 1030.12 y = -53.4551 z = -956.169 detector = D
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #0 11 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -591,9 +591,9 @@ ReadData             INFO Hit x = 1130.12 y = -53.4551 z = -1056.17 detector = D
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #0 12 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -622,9 +622,9 @@ ReadData             INFO Hit x = 1230.12 y = -53.4551 z = -1156.17 detector = D
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #0 13 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -653,9 +653,9 @@ ReadData             INFO Hit x = 1330.12 y = -53.4551 z = -1256.17 detector = D
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #0 14 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -684,9 +684,9 @@ ReadData             INFO Hit x = 1430.12 y = -53.4551 z = -1356.17 detector = D
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #0 15 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -715,9 +715,9 @@ ReadData             INFO Hit x = 1530.12 y = -53.4551 z = -1456.17 detector = D
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #0 16 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -746,9 +746,9 @@ ReadData             INFO Hit x = 1630.12 y = -53.4551 z = -1556.17 detector = D
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #0 17 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -777,9 +777,9 @@ ReadData             INFO Hit x = 1730.12 y = -53.4551 z = -1656.17 detector = D
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #0 18 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -808,9 +808,9 @@ ReadData             INFO Hit x = 1830.12 y = -53.4551 z = -1756.17 detector = D
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #0 19 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
diff --git a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReWrite.ref b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReWrite.ref
index f59c16bcdff4..7dbd1a0dd9f5 100644
--- a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReWrite.ref
+++ b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReWrite.ref
@@ -84,33 +84,33 @@ SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolFile1...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [20?]  (4 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [203]  (4 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [20?]  (8 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [202]  (8 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [20?]  (9 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [202]  (9 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [20?]  (a , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [202]  (a , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (b , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (b , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (c , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [203]  (c , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (d , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (d , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (e , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [203]  (e , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (f , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (f , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (10 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (10 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 15 Entries in total.
 SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -221,9 +221,9 @@ MetaDataSvc         DEBUG  calling beginInputFile for ToolSvc.IOVDbMetaDataTool
 Stream1.FileMet...   INFO Invalid "/TagInfo" handle
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000]
 SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_Tree] POOLContainer(DataHeader)
 POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
@@ -357,7 +357,7 @@ CollectionTree(...  DEBUG Opening
 CollectionTree(...  DEBUG    attributes# = 1
 CollectionTree(...  DEBUG Branch container 'EventInfo_p4_McEventInfo'
 CollectionTree(...  DEBUG Opened container CollectionTree(EventInfo_p4/McEventInfo) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[0 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:EventInfo_p4
@@ -369,7 +369,7 @@ CollectionTree(...  DEBUG Opening
 CollectionTree(...  DEBUG    attributes# = 1
 CollectionTree(...  DEBUG Branch container 'ExampleTrackContainer_p1_MyTracks'
 CollectionTree(...  DEBUG Opened container CollectionTree(ExampleTrackContainer_p1/MyTracks) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/CollectionTree(ExampleTrackContainer_p1/MyTracks) [20?]  (4 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/CollectionTree(ExampleTrackContainer_p1/MyTracks) [203]  (4 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[1 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:ExampleTrackContainer_p1
@@ -379,7 +379,7 @@ POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
 POOLContainer(D...  DEBUG Branch container 'DataHeader'
 POOLContainer(D...  DEBUG Opened container POOLContainer(DataHeader) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[2 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:DataHeader_p6
@@ -389,7 +389,7 @@ POOLContainerFo...  DEBUG Opening
 POOLContainerFo...  DEBUG    attributes# = 1
 POOLContainerFo...  DEBUG Branch container 'DataHeaderForm'
 POOLContainerFo...  DEBUG Opened container POOLContainerForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[3 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:DataHeaderForm_p6
@@ -399,7 +399,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'Token'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(Token) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[4 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:Token
@@ -409,7 +409,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'RunNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(RunNumber) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLCollectionTree(RunNumber) [20?]  (8 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLCollectionTree(RunNumber) [202]  (8 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[5 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:unsigned int
@@ -419,14 +419,14 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'EventNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(EventNumber) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventNumber) [20?]  (9 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventNumber) [202]  (9 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(MagicNumber)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'MagicNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(MagicNumber) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLCollectionTree(MagicNumber) [20?]  (a , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLCollectionTree(MagicNumber) [202]  (a , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 MetaDataSvc         DEBUG MetaDataSvc will handle ClassID 167728019
 MetaDataSvc         DEBUG MetaDataSvc will handle ClassID 167728019
@@ -439,9 +439,9 @@ Stream1.FileMet...  DEBUG set xAOD::FileMetaData::dataType to Stream1
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #0, run #1 1 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -516,9 +516,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #1, run #1 2 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -593,9 +593,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #2, run #1 3 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -670,9 +670,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #3, run #1 4 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -747,9 +747,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #4, run #1 5 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -824,9 +824,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #5, run #1 6 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -901,9 +901,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #6, run #1 7 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -978,9 +978,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #7, run #1 8 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1055,9 +1055,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #8, run #1 9 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1132,9 +1132,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #9, run #1 10 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1209,9 +1209,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #1 11 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1286,9 +1286,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #1 12 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1363,9 +1363,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #1 13 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1440,9 +1440,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #1 14 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1517,9 +1517,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #1 15 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1594,9 +1594,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #1 16 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1671,9 +1671,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #1 17 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1748,9 +1748,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #1 18 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1825,9 +1825,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #1 19 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1954,7 +1954,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (b , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (b , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[6 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:xAOD::FileMetaDataAuxInfo_v1
@@ -1966,7 +1966,7 @@ MetaData(EventS...  DEBUG Opening
 MetaData(EventS...  DEBUG    attributes# = 1
 MetaData(EventS...  DEBUG Branch container 'EventStreamInfo_p3_Stream1'
 MetaData(EventS...  DEBUG Opened container MetaData(EventStreamInfo_p3/Stream1) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (c , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream1) [203]  (c , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[7 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:EventStreamInfo_p3
@@ -1978,7 +1978,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaData_v1_FileMetaData'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaData_v1/FileMetaData) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (d , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (d , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[8 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:xAOD::FileMetaData_v1
@@ -1990,7 +1990,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::EventFormat_v1_EventFormatStream1'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::EventFormat_v1/EventFormatStream1) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (e , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [203]  (e , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[9 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:xAOD::EventFormat_v1
@@ -2000,14 +2000,14 @@ MetaDataHdr(Dat...  DEBUG Opening
 MetaDataHdr(Dat...  DEBUG    attributes# = 1
 MetaDataHdr(Dat...  DEBUG Branch container 'DataHeader'
 MetaDataHdr(Dat...  DEBUG Opened container MetaDataHdr(DataHeader) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [20?]  (f , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [203]  (f , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] MetaDataHdrForm(DataHeaderForm)
 MetaDataHdrForm...  DEBUG Opening
 MetaDataHdrForm...  DEBUG    attributes# = 1
 MetaDataHdrForm...  DEBUG Branch container 'DataHeaderForm'
 MetaDataHdrForm...  DEBUG Opened container MetaDataHdrForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [20?]  (10 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [203]  (10 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 MetaData(xAOD::...  DEBUG  SG::IAuxStoreIO* detected in xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.
 MetaData(xAOD::...  DEBUG        Attributes= 1
diff --git a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReWriteAgain.ref b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReWriteAgain.ref
index 69b1edba3e59..4d45eebc078a 100644
--- a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReWriteAgain.ref
+++ b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReWriteAgain.ref
@@ -90,51 +90,51 @@ SimplePoolRepli...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolRepli...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [20?]  (4 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [203]  (4 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsSimulation) [20?]  (8 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsSimulation) [202]  (8 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsCalibration) [20?]  (9 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsCalibration) [202]  (9 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsTestBeam) [20?]  (a , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsTestBeam) [202]  (a , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(McChannel) [20?]  (b , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(McChannel) [202]  (b , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [20?]  (c , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [202]  (c , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [20?]  (d , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [202]  (d , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(LumiBlockN) [20?]  (e , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(LumiBlockN) [202]  (e , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(ConditionsRun) [20?]  (f , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(ConditionsRun) [202]  (f , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTime) [20?]  (10 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTime) [202]  (10 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTimeNanoSec) [20?]  (11 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTimeNanoSec) [202]  (11 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(BunchId) [20?]  (12 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(BunchId) [202]  (12 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventWeight) [20?]  (13 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventWeight) [202]  (13 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (14 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (14 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (15 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [203]  (15 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (16 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (16 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (17 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [203]  (17 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (18 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (18 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (19 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (19 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 24 Entries in total.
 SimplePoolRepli...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -245,9 +245,9 @@ MetaDataSvc         DEBUG  calling beginInputFile for ToolSvc.IOVDbMetaDataTool
 Stream1.FileMet...   INFO Invalid "/TagInfo" handle
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000]
 SimplePoolRepli...  DEBUG --> Access   DbContainer  READ      [ROOT_Tree] POOLContainer(DataHeader)
 POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
@@ -380,7 +380,7 @@ CollectionTree(...  DEBUG Opening
 CollectionTree(...  DEBUG    attributes# = 1
 CollectionTree(...  DEBUG Branch container 'EventInfo_p4_McEventInfo'
 CollectionTree(...  DEBUG Opened container CollectionTree(EventInfo_p4/McEventInfo) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[0 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:EventInfo_p4
@@ -392,7 +392,7 @@ CollectionTree(...  DEBUG Opening
 CollectionTree(...  DEBUG    attributes# = 1
 CollectionTree(...  DEBUG Branch container 'ExampleTrackContainer_p1_MyTracks'
 CollectionTree(...  DEBUG Opened container CollectionTree(ExampleTrackContainer_p1/MyTracks) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/CollectionTree(ExampleTrackContainer_p1/MyTracks) [20?]  (4 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/CollectionTree(ExampleTrackContainer_p1/MyTracks) [203]  (4 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[1 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:ExampleTrackContainer_p1
@@ -402,7 +402,7 @@ POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
 POOLContainer(D...  DEBUG Branch container 'DataHeader'
 POOLContainer(D...  DEBUG Opened container POOLContainer(DataHeader) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[2 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:DataHeader_p6
@@ -412,7 +412,7 @@ POOLContainerFo...  DEBUG Opening
 POOLContainerFo...  DEBUG    attributes# = 1
 POOLContainerFo...  DEBUG Branch container 'DataHeaderForm'
 POOLContainerFo...  DEBUG Opened container POOLContainerForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[3 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:DataHeaderForm_p6
@@ -422,7 +422,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'Token'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(Token) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[4 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:Token
@@ -432,7 +432,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'RunNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(RunNumber) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLCollectionTree(RunNumber) [20?]  (8 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLCollectionTree(RunNumber) [202]  (8 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[5 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:unsigned int
@@ -442,14 +442,14 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'EventNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(EventNumber) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventNumber) [20?]  (9 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventNumber) [202]  (9 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(MagicNumber)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'MagicNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(MagicNumber) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLCollectionTree(MagicNumber) [20?]  (a , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/POOLCollectionTree(MagicNumber) [202]  (a , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 MetaDataSvc         DEBUG MetaDataSvc will handle ClassID 167728019
 MetaDataSvc         DEBUG MetaDataSvc will handle ClassID 167728019
@@ -462,9 +462,9 @@ Stream1.FileMet...  DEBUG set xAOD::FileMetaData::dataType to Stream1
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #0, run #1 1 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -539,9 +539,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #1, run #1 2 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -616,9 +616,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #2, run #1 3 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -693,9 +693,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #3, run #1 4 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -770,9 +770,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #4, run #1 5 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -847,9 +847,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #5, run #1 6 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -924,9 +924,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #6, run #1 7 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1001,9 +1001,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #7, run #1 8 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1078,9 +1078,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #8, run #1 9 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1155,9 +1155,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #9, run #1 10 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1232,9 +1232,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #1 11 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1309,9 +1309,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #1 12 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1386,9 +1386,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #1 13 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1463,9 +1463,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #1 14 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1540,9 +1540,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #1 15 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1617,9 +1617,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #1 16 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1694,9 +1694,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #1 17 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1771,9 +1771,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #1 18 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1848,9 +1848,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile3.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #1 19 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1977,7 +1977,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (b , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (b , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[6 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:xAOD::FileMetaDataAuxInfo_v1
@@ -1989,7 +1989,7 @@ MetaData(EventS...  DEBUG Opening
 MetaData(EventS...  DEBUG    attributes# = 1
 MetaData(EventS...  DEBUG Branch container 'EventStreamInfo_p3_Stream1'
 MetaData(EventS...  DEBUG Opened container MetaData(EventStreamInfo_p3/Stream1) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (c , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream1) [203]  (c , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[7 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:EventStreamInfo_p3
@@ -2001,7 +2001,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaData_v1_FileMetaData'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaData_v1/FileMetaData) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (d , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (d , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[8 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:xAOD::FileMetaData_v1
@@ -2013,7 +2013,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::EventFormat_v1_EventFormatStream1'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::EventFormat_v1/EventFormatStream1) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (e , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [203]  (e , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --->Adding Shape[9 , ????]:  [1 Column(s)] 
 SimplePoolFile3...  DEBUG ---->Class:xAOD::EventFormat_v1
@@ -2023,14 +2023,14 @@ MetaDataHdr(Dat...  DEBUG Opening
 MetaDataHdr(Dat...  DEBUG    attributes# = 1
 MetaDataHdr(Dat...  DEBUG Branch container 'DataHeader'
 MetaDataHdr(Dat...  DEBUG Opened container MetaDataHdr(DataHeader) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [20?]  (f , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [203]  (f , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 SimplePoolFile3...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] MetaDataHdrForm(DataHeaderForm)
 MetaDataHdrForm...  DEBUG Opening
 MetaDataHdrForm...  DEBUG    attributes# = 1
 MetaDataHdrForm...  DEBUG Branch container 'DataHeaderForm'
 MetaDataHdrForm...  DEBUG Opened container MetaDataHdrForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [20?]  (10 , ffffffff)
+SimplePoolFile3...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [203]  (10 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 MetaData(xAOD::...  DEBUG  SG::IAuxStoreIO* detected in xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.
 MetaData(xAOD::...  DEBUG        Attributes= 1
diff --git a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReWriteNext.ref b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReWriteNext.ref
index f3db9bc89576..0947d2390700 100644
--- a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReWriteNext.ref
+++ b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReWriteNext.ref
@@ -84,33 +84,33 @@ SimplePoolFile3...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolFile3...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleTrackContainer_p1/MyTracks) [20?]  (4 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleTrackContainer_p1/MyTracks) [203]  (4 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [20?]  (8 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [202]  (8 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [20?]  (9 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [202]  (9 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [20?]  (a , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [202]  (a , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (b , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (b , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (c , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [203]  (c , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (d , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (d , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (e , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [203]  (e , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (f , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (f , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (10 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (10 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 15 Entries in total.
 SimplePoolFile3...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -221,9 +221,9 @@ MetaDataSvc         DEBUG  calling beginInputFile for ToolSvc.IOVDbMetaDataTool
 Stream1.FileMet...   INFO Invalid "/TagInfo" handle
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000]
 SimplePoolFile3...  DEBUG --> Access   DbContainer  READ      [ROOT_Tree] POOLContainer(DataHeader)
 POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
@@ -325,7 +325,7 @@ CollectionTree(...  DEBUG Opening
 CollectionTree(...  DEBUG    attributes# = 1
 CollectionTree(...  DEBUG Branch container 'EventInfo_p4_McEventInfo'
 CollectionTree(...  DEBUG Opened container CollectionTree(EventInfo_p4/McEventInfo) of type ROOT_Tree
-SimplePoolFile4...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile4...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 SimplePoolFile4...  DEBUG --->Adding Shape[0 , ????]:  [1 Column(s)] 
 SimplePoolFile4...  DEBUG ---->Class:EventInfo_p4
@@ -335,7 +335,7 @@ CollectionTree(...  DEBUG Opening
 CollectionTree(...  DEBUG    attributes# = 1
 CollectionTree(...  DEBUG Branch container 'ExampleTrackContainer_p1_MyTracks'
 CollectionTree(...  DEBUG Opened container CollectionTree(ExampleTrackContainer_p1/MyTracks) of type ROOT_Tree
-SimplePoolFile4...  DEBUG --->Adding Assoc :????/CollectionTree(ExampleTrackContainer_p1/MyTracks) [20?]  (4 , ffffffff)
+SimplePoolFile4...  DEBUG --->Adding Assoc :????/CollectionTree(ExampleTrackContainer_p1/MyTracks) [203]  (4 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 SimplePoolFile4...  DEBUG --->Adding Shape[1 , ????]:  [1 Column(s)] 
 SimplePoolFile4...  DEBUG ---->Class:ExampleTrackContainer_p1
@@ -345,7 +345,7 @@ POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
 POOLContainer(D...  DEBUG Branch container 'DataHeader'
 POOLContainer(D...  DEBUG Opened container POOLContainer(DataHeader) of type ROOT_Tree
-SimplePoolFile4...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile4...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 SimplePoolFile4...  DEBUG --->Adding Shape[2 , ????]:  [1 Column(s)] 
 SimplePoolFile4...  DEBUG ---->Class:DataHeader_p6
@@ -355,7 +355,7 @@ POOLContainerFo...  DEBUG Opening
 POOLContainerFo...  DEBUG    attributes# = 1
 POOLContainerFo...  DEBUG Branch container 'DataHeaderForm'
 POOLContainerFo...  DEBUG Opened container POOLContainerForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolFile4...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile4...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 SimplePoolFile4...  DEBUG --->Adding Shape[3 , ????]:  [1 Column(s)] 
 SimplePoolFile4...  DEBUG ---->Class:DataHeaderForm_p6
@@ -365,7 +365,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'Token'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(Token) of type ROOT_Tree
-SimplePoolFile4...  DEBUG --->Adding Assoc :????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolFile4...  DEBUG --->Adding Assoc :????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 SimplePoolFile4...  DEBUG --->Adding Shape[4 , ????]:  [1 Column(s)] 
 SimplePoolFile4...  DEBUG ---->Class:Token
@@ -375,7 +375,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'RunNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(RunNumber) of type ROOT_Tree
-SimplePoolFile4...  DEBUG --->Adding Assoc :????/POOLCollectionTree(RunNumber) [20?]  (8 , ffffffff)
+SimplePoolFile4...  DEBUG --->Adding Assoc :????/POOLCollectionTree(RunNumber) [202]  (8 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 SimplePoolFile4...  DEBUG --->Adding Shape[5 , ????]:  [1 Column(s)] 
 SimplePoolFile4...  DEBUG ---->Class:unsigned int
@@ -385,14 +385,14 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'EventNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(EventNumber) of type ROOT_Tree
-SimplePoolFile4...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventNumber) [20?]  (9 , ffffffff)
+SimplePoolFile4...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventNumber) [202]  (9 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 SimplePoolFile4...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(MagicNumber)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'MagicNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(MagicNumber) of type ROOT_Tree
-SimplePoolFile4...  DEBUG --->Adding Assoc :????/POOLCollectionTree(MagicNumber) [20?]  (a , ffffffff)
+SimplePoolFile4...  DEBUG --->Adding Assoc :????/POOLCollectionTree(MagicNumber) [202]  (a , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 MetaDataSvc         DEBUG MetaDataSvc will handle ClassID 167728019
 MetaDataSvc         DEBUG MetaDataSvc will handle ClassID 167728019
@@ -405,9 +405,9 @@ Stream1.FileMet...  DEBUG set xAOD::FileMetaData::dataType to Stream1
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #0, run #1 1 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -450,9 +450,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #1, run #1 2 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -495,9 +495,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #2, run #1 3 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -540,9 +540,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #3, run #1 4 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -585,9 +585,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #4, run #1 5 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -630,9 +630,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #5, run #1 6 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -675,9 +675,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #6, run #1 7 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -720,9 +720,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #7, run #1 8 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -765,9 +765,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #8, run #1 9 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -810,9 +810,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #9, run #1 10 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -855,9 +855,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #1 11 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -900,9 +900,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #1 12 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -945,9 +945,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #1 13 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -990,9 +990,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #1 14 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1035,9 +1035,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #1 15 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1080,9 +1080,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #1 16 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1125,9 +1125,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #1 17 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1170,9 +1170,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #1 18 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1215,9 +1215,9 @@ Stream1             DEBUG connectOutput done for SimplePoolFile4.root
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #1 19 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1312,7 +1312,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) of type ROOT_Tree
-SimplePoolFile4...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (b , ffffffff)
+SimplePoolFile4...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (b , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 SimplePoolFile4...  DEBUG --->Adding Shape[6 , ????]:  [1 Column(s)] 
 SimplePoolFile4...  DEBUG ---->Class:xAOD::FileMetaDataAuxInfo_v1
@@ -1324,7 +1324,7 @@ MetaData(EventS...  DEBUG Opening
 MetaData(EventS...  DEBUG    attributes# = 1
 MetaData(EventS...  DEBUG Branch container 'EventStreamInfo_p3_Stream1'
 MetaData(EventS...  DEBUG Opened container MetaData(EventStreamInfo_p3/Stream1) of type ROOT_Tree
-SimplePoolFile4...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (c , ffffffff)
+SimplePoolFile4...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream1) [203]  (c , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 SimplePoolFile4...  DEBUG --->Adding Shape[7 , ????]:  [1 Column(s)] 
 SimplePoolFile4...  DEBUG ---->Class:EventStreamInfo_p3
@@ -1336,7 +1336,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaData_v1_FileMetaData'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaData_v1/FileMetaData) of type ROOT_Tree
-SimplePoolFile4...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (d , ffffffff)
+SimplePoolFile4...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (d , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 SimplePoolFile4...  DEBUG --->Adding Shape[8 , ????]:  [1 Column(s)] 
 SimplePoolFile4...  DEBUG ---->Class:xAOD::FileMetaData_v1
@@ -1348,7 +1348,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::EventFormat_v1_EventFormatStream1'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::EventFormat_v1/EventFormatStream1) of type ROOT_Tree
-SimplePoolFile4...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (e , ffffffff)
+SimplePoolFile4...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [203]  (e , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 SimplePoolFile4...  DEBUG --->Adding Shape[9 , ????]:  [1 Column(s)] 
 SimplePoolFile4...  DEBUG ---->Class:xAOD::EventFormat_v1
@@ -1358,14 +1358,14 @@ MetaDataHdr(Dat...  DEBUG Opening
 MetaDataHdr(Dat...  DEBUG    attributes# = 1
 MetaDataHdr(Dat...  DEBUG Branch container 'DataHeader'
 MetaDataHdr(Dat...  DEBUG Opened container MetaDataHdr(DataHeader) of type ROOT_Tree
-SimplePoolFile4...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [20?]  (f , ffffffff)
+SimplePoolFile4...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [203]  (f , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 SimplePoolFile4...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] MetaDataHdrForm(DataHeaderForm)
 MetaDataHdrForm...  DEBUG Opening
 MetaDataHdrForm...  DEBUG    attributes# = 1
 MetaDataHdrForm...  DEBUG Branch container 'DataHeaderForm'
 MetaDataHdrForm...  DEBUG Opened container MetaDataHdrForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolFile4...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [20?]  (10 , ffffffff)
+SimplePoolFile4...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [203]  (10 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 MetaData(xAOD::...  DEBUG  SG::IAuxStoreIO* detected in xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.
 MetaData(xAOD::...  DEBUG        Attributes= 1
diff --git a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_Read.ref b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_Read.ref
index 8a75c9f577ca..27f7aeb810c1 100644
--- a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_Read.ref
+++ b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_Read.ref
@@ -72,17 +72,17 @@ EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 EmptyPoolFile.root  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (3 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (3 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [20?]  (4 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [203]  (4 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (5 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (5 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [20?]  (6 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [203]  (6 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (7 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (7 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (8 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (8 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 7 Entries in total.
 EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -137,33 +137,33 @@ SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolFile1...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [20?]  (4 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [203]  (4 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [20?]  (8 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [202]  (8 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [20?]  (9 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [202]  (9 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [20?]  (a , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [202]  (a , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (b , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (b , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (c , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [203]  (c , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (d , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (d , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (e , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [203]  (e , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (f , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (f , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (10 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (10 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 15 Entries in total.
 SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -229,17 +229,17 @@ EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 EmptyPoolFile.root  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (3 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (3 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [20?]  (4 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [203]  (4 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (5 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (5 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [20?]  (6 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [203]  (6 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (7 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (7 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (8 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (8 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 7 Entries in total.
 EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -300,9 +300,9 @@ EventSelector        INFO skipping event 9
 EventSelector        INFO skipping event 10
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A]
 SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_Tree] POOLContainer(DataHeader)
 POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
@@ -361,10 +361,10 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #1 1 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
 ClassIDSvc           INFO  getRegistryEntries: read 21 CLIDRegistry entries for module ALL
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B]
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -395,9 +395,9 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #1 2 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -428,9 +428,9 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #1 3 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -461,9 +461,9 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #1 4 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -494,9 +494,9 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #1 5 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -527,9 +527,9 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #1 6 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -560,9 +560,9 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #1 7 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -593,9 +593,9 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #1 8 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -626,9 +626,9 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #1 9 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -691,17 +691,17 @@ EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 EmptyPoolFile.root  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (3 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (3 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [20?]  (4 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [203]  (4 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (5 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (5 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [20?]  (6 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [203]  (6 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (7 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (7 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (8 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (8 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 7 Entries in total.
 EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -764,31 +764,31 @@ SimplePoolFile2...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolFile2...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (4 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (4 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (5 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (5 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [20?]  (6 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [202]  (6 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [20?]  (7 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [202]  (7 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [20?]  (8 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [202]  (8 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [20?]  (9 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [202]  (9 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (a , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (a , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream2) [20?]  (b , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream2) [203]  (b , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (c , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (c , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream2) [20?]  (d , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream2) [203]  (d , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (e , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (e , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (f , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (f , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 14 Entries in total.
 SimplePoolFile2...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -827,9 +827,9 @@ MetaDataSvc         DEBUG Loaded input meta data store proxies
 MetaDataSvc         DEBUG  calling beginInputFile for ToolSvc.IOVDbMetaDataTool
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000000].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000000].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000000]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000000].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000000].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000000]
 SimplePoolFile2...  DEBUG --> Access   DbContainer  READ      [ROOT_Tree] POOLContainer(DataHeader)
 POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
@@ -869,9 +869,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #0, run #1 11 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000001].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000001].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000001]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000001].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000001].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000001]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #1, run #1 11 events processed so far  <<<===
@@ -891,9 +891,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #1, run #1 12 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000002].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000002].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000002]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000002].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000002].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000002]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #2, run #1 12 events processed so far  <<<===
@@ -913,9 +913,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #2, run #1 13 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000003].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000003].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000003]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000003].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000003].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000003]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #3, run #1 13 events processed so far  <<<===
@@ -935,9 +935,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #3, run #1 14 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000004].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000004].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000004]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000004].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000004].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000004]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #4, run #1 14 events processed so far  <<<===
@@ -957,9 +957,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #4, run #1 15 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000005].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000005].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000005]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000005].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000005].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000005]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #5, run #1 15 events processed so far  <<<===
@@ -979,9 +979,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #5, run #1 16 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000006].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000006].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000006]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000006].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000006].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000006]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #6, run #1 16 events processed so far  <<<===
@@ -1001,9 +1001,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #6, run #1 17 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000007].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000007].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000007]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000007].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000007].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000007]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #7, run #1 17 events processed so far  <<<===
@@ -1023,9 +1023,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #7, run #1 18 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000008].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000008].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000008]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000008].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000008].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000008]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #8, run #1 18 events processed so far  <<<===
@@ -1045,9 +1045,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #8, run #1 19 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000009].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000009].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000009]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000009].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000009].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000009]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #9, run #1 19 events processed so far  <<<===
@@ -1067,9 +1067,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #9, run #1 20 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000A].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000A].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000A]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000A].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000A].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000A]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #10, run #1 20 events processed so far  <<<===
@@ -1089,9 +1089,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #1 21 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000B].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000B].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000B]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000B].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000B]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #11, run #1 21 events processed so far  <<<===
@@ -1111,9 +1111,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #1 22 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000C].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000C].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000C]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000C].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000C].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000C]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #12, run #1 22 events processed so far  <<<===
@@ -1133,9 +1133,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #1 23 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000D].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000D].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000D]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000D].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000D].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000D]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #13, run #1 23 events processed so far  <<<===
@@ -1155,9 +1155,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #1 24 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000E].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000E].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000E]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000E].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000E].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000E]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #14, run #1 24 events processed so far  <<<===
@@ -1177,9 +1177,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #1 25 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000F].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000F].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000F]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000F].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000F].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000F]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #15, run #1 25 events processed so far  <<<===
@@ -1199,9 +1199,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #1 26 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000010].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000010].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000010]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000010].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000010].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000010]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #16, run #1 26 events processed so far  <<<===
@@ -1221,9 +1221,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #1 27 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000011].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000011].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000011]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000011].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000011].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000011]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #17, run #1 27 events processed so far  <<<===
@@ -1243,9 +1243,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #1 28 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000012].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000012].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000012]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000012].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000012].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000012]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #18, run #1 28 events processed so far  <<<===
@@ -1265,9 +1265,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #1 29 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000013].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000013].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000013]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000013].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000013].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000013]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #19, run #1 29 events processed so far  <<<===
@@ -1327,33 +1327,33 @@ SimplePoolFile3...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolFile3...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleTrackContainer_p1/MyTracks) [20?]  (4 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleTrackContainer_p1/MyTracks) [203]  (4 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [20?]  (8 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [202]  (8 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [20?]  (9 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [202]  (9 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [20?]  (a , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [202]  (a , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (b , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (b , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (c , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [203]  (c , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (d , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (d , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (e , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [203]  (e , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (f , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (f , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (10 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (10 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 15 Entries in total.
 SimplePoolFile3...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -1392,9 +1392,9 @@ MetaDataSvc         DEBUG Loaded input meta data store proxies
 MetaDataSvc         DEBUG  calling beginInputFile for ToolSvc.IOVDbMetaDataTool
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000]
 SimplePoolFile3...  DEBUG --> Access   DbContainer  READ      [ROOT_Tree] POOLContainer(DataHeader)
 POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
@@ -1443,9 +1443,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #0, run #1 31 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1469,9 +1469,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #1, run #1 32 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1495,9 +1495,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #2, run #1 33 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1521,9 +1521,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #3, run #1 34 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1547,9 +1547,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #4, run #1 35 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1573,9 +1573,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #5, run #1 36 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1599,9 +1599,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #6, run #1 37 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1625,9 +1625,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #7, run #1 38 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1651,9 +1651,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #8, run #1 39 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1677,9 +1677,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #9, run #1 40 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1703,9 +1703,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #1 41 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1729,9 +1729,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #1 42 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1755,9 +1755,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #1 43 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1781,9 +1781,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #1 44 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1807,9 +1807,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #1 45 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1833,9 +1833,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #1 46 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1859,9 +1859,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #1 47 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1885,9 +1885,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #1 48 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1911,9 +1911,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #1 49 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
diff --git a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReadAgain.ref b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReadAgain.ref
index 3b284314ed15..cee43fc01fd9 100644
--- a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReadAgain.ref
+++ b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReadAgain.ref
@@ -73,17 +73,17 @@ EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 EmptyPoolFile.root  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (3 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (3 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [20?]  (4 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [203]  (4 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (5 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (5 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [20?]  (6 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [203]  (6 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (7 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (7 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (8 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (8 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 7 Entries in total.
 EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -144,51 +144,51 @@ SimplePoolRepli...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolRepli...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [20?]  (4 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [203]  (4 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsSimulation) [20?]  (8 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsSimulation) [202]  (8 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsCalibration) [20?]  (9 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsCalibration) [202]  (9 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsTestBeam) [20?]  (a , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsTestBeam) [202]  (a , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(McChannel) [20?]  (b , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(McChannel) [202]  (b , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [20?]  (c , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [202]  (c , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [20?]  (d , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [202]  (d , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(LumiBlockN) [20?]  (e , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(LumiBlockN) [202]  (e , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(ConditionsRun) [20?]  (f , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(ConditionsRun) [202]  (f , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTime) [20?]  (10 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTime) [202]  (10 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTimeNanoSec) [20?]  (11 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTimeNanoSec) [202]  (11 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(BunchId) [20?]  (12 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(BunchId) [202]  (12 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventWeight) [20?]  (13 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventWeight) [202]  (13 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (14 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (14 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (15 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [203]  (15 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (16 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (16 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (17 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [203]  (17 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (18 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (18 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
-SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (19 , ffffffff)
+SimplePoolRepli...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (19 , ffffffff)
 SimplePoolRepli...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 24 Entries in total.
 SimplePoolRepli...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -259,17 +259,17 @@ EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 EmptyPoolFile.root  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (3 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (3 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [20?]  (4 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [203]  (4 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (5 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (5 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [20?]  (6 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [203]  (6 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (7 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (7 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (8 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (8 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 7 Entries in total.
 EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -330,9 +330,9 @@ EventSelector        INFO skipping event 9
 EventSelector        INFO skipping event 10
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A]
 SimplePoolRepli...  DEBUG --> Access   DbContainer  READ      [ROOT_Tree] POOLContainer(DataHeader)
 POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
@@ -391,10 +391,10 @@ PoolSvc              INFO Database (SimplePoolReplica1.root) attribute [READ_CAL
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #1 1 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
 ClassIDSvc           INFO  getRegistryEntries: read 21 CLIDRegistry entries for module ALL
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B]
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -425,9 +425,9 @@ PoolSvc              INFO Database (SimplePoolReplica1.root) attribute [READ_CAL
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #1 2 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -458,9 +458,9 @@ PoolSvc              INFO Database (SimplePoolReplica1.root) attribute [READ_CAL
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #1 3 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -491,9 +491,9 @@ PoolSvc              INFO Database (SimplePoolReplica1.root) attribute [READ_CAL
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #1 4 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -524,9 +524,9 @@ PoolSvc              INFO Database (SimplePoolReplica1.root) attribute [READ_CAL
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #1 5 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -557,9 +557,9 @@ PoolSvc              INFO Database (SimplePoolReplica1.root) attribute [READ_CAL
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #1 6 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -590,9 +590,9 @@ PoolSvc              INFO Database (SimplePoolReplica1.root) attribute [READ_CAL
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #1 7 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -623,9 +623,9 @@ PoolSvc              INFO Database (SimplePoolReplica1.root) attribute [READ_CAL
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #1 8 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -656,9 +656,9 @@ PoolSvc              INFO Database (SimplePoolReplica1.root) attribute [READ_CAL
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #1 9 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -721,17 +721,17 @@ EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 EmptyPoolFile.root  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (3 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (3 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [20?]  (4 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [203]  (4 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (5 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (5 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [20?]  (6 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [203]  (6 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (7 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (7 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (8 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (8 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 7 Entries in total.
 EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -794,31 +794,31 @@ SimplePoolFile2...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolFile2...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (4 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (4 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (5 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (5 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [20?]  (6 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [202]  (6 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [20?]  (7 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [202]  (7 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [20?]  (8 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [202]  (8 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [20?]  (9 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [202]  (9 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (a , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (a , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream2) [20?]  (b , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream2) [203]  (b , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (c , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (c , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream2) [20?]  (d , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream2) [203]  (d , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (e , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (e , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (f , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (f , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 14 Entries in total.
 SimplePoolFile2...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -857,9 +857,9 @@ MetaDataSvc         DEBUG Loaded input meta data store proxies
 MetaDataSvc         DEBUG  calling beginInputFile for ToolSvc.IOVDbMetaDataTool
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000000].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000000].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000000]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000000].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000000].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000000]
 SimplePoolFile2...  DEBUG --> Access   DbContainer  READ      [ROOT_Tree] POOLContainer(DataHeader)
 POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
@@ -899,9 +899,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #0, run #1 11 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000001].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000001].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000001]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000001].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000001].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000001]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #1, run #1 11 events processed so far  <<<===
@@ -921,9 +921,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #1, run #1 12 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000002].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000002].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000002]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000002].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000002].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000002]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #2, run #1 12 events processed so far  <<<===
@@ -943,9 +943,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #2, run #1 13 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000003].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000003].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000003]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000003].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000003].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000003]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #3, run #1 13 events processed so far  <<<===
@@ -965,9 +965,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #3, run #1 14 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000004].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000004].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000004]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000004].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000004].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000004]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #4, run #1 14 events processed so far  <<<===
@@ -987,9 +987,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #4, run #1 15 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000005].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000005].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000005]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000005].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000005].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000005]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #5, run #1 15 events processed so far  <<<===
@@ -1009,9 +1009,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #5, run #1 16 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000006].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000006].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000006]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000006].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000006].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000006]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #6, run #1 16 events processed so far  <<<===
@@ -1031,9 +1031,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #6, run #1 17 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000007].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000007].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000007]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000007].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000007].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000007]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #7, run #1 17 events processed so far  <<<===
@@ -1053,9 +1053,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #7, run #1 18 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000008].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000008].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000008]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000008].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000008].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000008]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #8, run #1 18 events processed so far  <<<===
@@ -1075,9 +1075,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #8, run #1 19 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000009].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000009].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000009]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000009].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000009].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000009]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #9, run #1 19 events processed so far  <<<===
@@ -1097,9 +1097,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #9, run #1 20 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000A].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000A].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000A]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000A].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000A].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000A]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #10, run #1 20 events processed so far  <<<===
@@ -1119,9 +1119,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #1 21 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000B].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000B].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000B]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000B].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000B]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #11, run #1 21 events processed so far  <<<===
@@ -1141,9 +1141,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #1 22 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000C].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000C].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000C]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000C].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000C].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000C]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #12, run #1 22 events processed so far  <<<===
@@ -1163,9 +1163,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #1 23 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000D].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000D].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000D]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000D].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000D].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000D]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #13, run #1 23 events processed so far  <<<===
@@ -1185,9 +1185,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #1 24 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000E].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000E].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000E]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000E].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000E].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000E]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #14, run #1 24 events processed so far  <<<===
@@ -1207,9 +1207,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #1 25 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000F].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000F].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000F]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000F].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000F].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000F]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #15, run #1 25 events processed so far  <<<===
@@ -1229,9 +1229,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #1 26 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000010].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000010].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000010]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000010].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000010].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000010]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #16, run #1 26 events processed so far  <<<===
@@ -1251,9 +1251,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #1 27 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000011].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000011].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000011]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000011].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000011].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000011]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #17, run #1 27 events processed so far  <<<===
@@ -1273,9 +1273,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #1 28 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000012].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000012].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000012]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000012].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000012].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000012]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #18, run #1 28 events processed so far  <<<===
@@ -1295,9 +1295,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #1 29 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000013].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000013].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000013]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000013].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000013].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000013]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #19, run #1 29 events processed so far  <<<===
@@ -1357,33 +1357,33 @@ SimplePoolFile4...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolFile4...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleTrackContainer_p1/MyTracks) [20?]  (4 , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleTrackContainer_p1/MyTracks) [203]  (4 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [20?]  (8 , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [202]  (8 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [20?]  (9 , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [202]  (9 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [20?]  (a , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [202]  (a , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (b , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (b , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (c , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [203]  (c , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (d , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (d , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (e , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [203]  (e , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (f , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (f , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
-SimplePoolFile4...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (10 , ffffffff)
+SimplePoolFile4...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (10 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 15 Entries in total.
 SimplePoolFile4...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -1422,9 +1422,9 @@ MetaDataSvc         DEBUG Loaded input meta data store proxies
 MetaDataSvc         DEBUG  calling beginInputFile for ToolSvc.IOVDbMetaDataTool
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000]
 SimplePoolFile4...  DEBUG --> Access   DbContainer  READ      [ROOT_Tree] POOLContainer(DataHeader)
 POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
@@ -1473,9 +1473,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #0, run #1 31 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1499,9 +1499,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #1, run #1 32 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1525,9 +1525,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #2, run #1 33 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1551,9 +1551,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #3, run #1 34 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1577,9 +1577,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #4, run #1 35 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1603,9 +1603,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #5, run #1 36 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1629,9 +1629,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #6, run #1 37 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1655,9 +1655,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #7, run #1 38 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1681,9 +1681,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #8, run #1 39 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1707,9 +1707,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #9, run #1 40 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1733,9 +1733,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #1 41 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1759,9 +1759,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #1 42 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1785,9 +1785,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #1 43 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1811,9 +1811,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #1 44 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1837,9 +1837,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #1 45 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1863,9 +1863,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #1 46 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1889,9 +1889,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #1 47 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1915,9 +1915,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #1 48 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1941,9 +1941,9 @@ PoolSvc              INFO Database (SimplePoolFile4.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #1 49 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
diff --git a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReadConcat.ref b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReadConcat.ref
index 4e10b02a9623..263b1c53a6c1 100644
--- a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReadConcat.ref
+++ b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_ReadConcat.ref
@@ -72,17 +72,17 @@ EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 EmptyPoolFile.root  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (3 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (3 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [20?]  (4 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [203]  (4 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (5 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (5 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [20?]  (6 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [203]  (6 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (7 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (7 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (8 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (8 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 7 Entries in total.
 EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -143,51 +143,51 @@ SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolFile1...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [20?]  (4 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [203]  (4 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsSimulation) [20?]  (8 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsSimulation) [202]  (8 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsCalibration) [20?]  (9 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsCalibration) [202]  (9 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsTestBeam) [20?]  (a , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsTestBeam) [202]  (a , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(McChannel) [20?]  (b , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(McChannel) [202]  (b , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [20?]  (c , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [202]  (c , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [20?]  (d , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [202]  (d , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(LumiBlockN) [20?]  (e , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(LumiBlockN) [202]  (e , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(ConditionsRun) [20?]  (f , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(ConditionsRun) [202]  (f , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTime) [20?]  (10 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTime) [202]  (10 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTimeNanoSec) [20?]  (11 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTimeNanoSec) [202]  (11 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(BunchId) [20?]  (12 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(BunchId) [202]  (12 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventWeight) [20?]  (13 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventWeight) [202]  (13 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (14 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (14 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (15 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [203]  (15 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (16 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (16 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (17 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [203]  (17 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (18 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (18 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (19 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (19 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 24 Entries in total.
 SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -253,17 +253,17 @@ EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 EmptyPoolFile.root  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (3 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (3 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [20?]  (4 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [203]  (4 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (5 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (5 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [20?]  (6 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [203]  (6 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (7 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (7 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (8 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (8 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 7 Entries in total.
 EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -324,9 +324,9 @@ EventSelector        INFO skipping event 9
 EventSelector        INFO skipping event 10
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A]
 SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_Tree] POOLContainer(DataHeader)
 POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
@@ -379,10 +379,10 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #1 1 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
 ClassIDSvc           INFO  getRegistryEntries: read 21 CLIDRegistry entries for module ALL
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B]
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -413,9 +413,9 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #1 2 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -446,9 +446,9 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #1 3 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -479,9 +479,9 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #1 4 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -512,9 +512,9 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #1 5 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -545,9 +545,9 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #1 6 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -578,9 +578,9 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #1 7 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -611,9 +611,9 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #1 8 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -644,9 +644,9 @@ PoolSvc              INFO Database (SimplePoolFile1.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #1 9 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -709,17 +709,17 @@ EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 EmptyPoolFile.root  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (3 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (3 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [20?]  (4 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream3) [203]  (4 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (5 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (5 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [20?]  (6 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [203]  (6 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (7 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (7 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
-EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (8 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (8 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 7 Entries in total.
 EmptyPoolFile.root  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -782,31 +782,31 @@ SimplePoolFile2...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolFile2...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (4 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (4 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (5 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (5 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [20?]  (6 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [202]  (6 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [20?]  (7 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [202]  (7 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [20?]  (8 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [202]  (8 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [20?]  (9 , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/POOLCollectionTree(MagicNumber) [202]  (9 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (a , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (a , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream2) [20?]  (b , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream2) [203]  (b , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (c , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (c , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream2) [20?]  (d , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream2) [203]  (d , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (e , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (e , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
-SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (f , ffffffff)
+SimplePoolFile2...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (f , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 14 Entries in total.
 SimplePoolFile2...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -845,9 +845,9 @@ MetaDataSvc         DEBUG Loaded input meta data store proxies
 MetaDataSvc         DEBUG  calling beginInputFile for ToolSvc.IOVDbMetaDataTool
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000000].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000000].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000000]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000000].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000000].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000000]
 SimplePoolFile2...  DEBUG --> Access   DbContainer  READ      [ROOT_Tree] POOLContainer(DataHeader)
 POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
@@ -888,9 +888,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #0, run #1 11 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000001].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000001].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000001]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000001].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000001].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000001]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #1, run #1 11 events processed so far  <<<===
@@ -910,9 +910,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #1, run #1 12 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000002].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000002].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000002]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000002].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000002].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000002]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #2, run #1 12 events processed so far  <<<===
@@ -932,9 +932,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #2, run #1 13 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000003].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000003].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000003]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000003].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000003].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000003]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #3, run #1 13 events processed so far  <<<===
@@ -954,9 +954,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #3, run #1 14 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000004].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000004].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000004]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000004].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000004].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000004]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #4, run #1 14 events processed so far  <<<===
@@ -976,9 +976,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #4, run #1 15 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000005].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000005].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000005]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000005].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000005].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000005]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #5, run #1 15 events processed so far  <<<===
@@ -998,9 +998,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #5, run #1 16 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000006].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000006].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000006]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000006].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000006].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000006]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #6, run #1 16 events processed so far  <<<===
@@ -1020,9 +1020,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #6, run #1 17 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000007].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000007].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000007]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000007].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000007].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000007]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #7, run #1 17 events processed so far  <<<===
@@ -1042,9 +1042,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #7, run #1 18 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000008].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000008].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000008]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000008].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000008].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000008]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #8, run #1 18 events processed so far  <<<===
@@ -1064,9 +1064,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #8, run #1 19 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000009].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000009].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000009]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000009].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000009].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000009]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #9, run #1 19 events processed so far  <<<===
@@ -1086,9 +1086,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #9, run #1 20 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000A].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000A].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000A]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000A].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000A].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000A]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #10, run #1 20 events processed so far  <<<===
@@ -1108,9 +1108,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #1 21 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000B].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000B].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000B]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000B].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000B]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #11, run #1 21 events processed so far  <<<===
@@ -1130,9 +1130,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #1 22 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000C].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000C].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000C]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000C].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000C].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000C]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #12, run #1 22 events processed so far  <<<===
@@ -1152,9 +1152,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #1 23 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000D].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000D].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000D]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000D].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000D].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000D]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #13, run #1 23 events processed so far  <<<===
@@ -1174,9 +1174,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #1 24 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000E].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000E].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000E]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000E].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000E].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000E]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #14, run #1 24 events processed so far  <<<===
@@ -1196,9 +1196,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #1 25 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000F].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000F].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-0000000F]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000F].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000F].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-0000000F]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #15, run #1 25 events processed so far  <<<===
@@ -1218,9 +1218,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #1 26 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000010].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000010].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000010]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000010].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000010].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000010]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #16, run #1 26 events processed so far  <<<===
@@ -1240,9 +1240,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #1 27 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000011].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000011].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000011]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000011].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000011].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000011]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #17, run #1 27 events processed so far  <<<===
@@ -1262,9 +1262,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #1 28 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000012].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000012].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000012]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000012].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000012].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000012]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #18, run #1 28 events processed so far  <<<===
@@ -1284,9 +1284,9 @@ PoolSvc              INFO Database (SimplePoolFile2.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #1 29 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 3
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000013].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000013].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000004-00000013]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000013].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000013].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000004-00000013]
 AthenaPoolAddre...  DEBUG The current Event contains: 2 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #19, run #1 29 events processed so far  <<<===
@@ -1342,25 +1342,25 @@ SimplePoolFile3...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolFile3...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleTrackContainer_p1/MyTracks) [20?]  (4 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleTrackContainer_p1/MyTracks) [203]  (4 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (7 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (7 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream2) [20?]  (8 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream2) [203]  (8 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (9 , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (9 , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream2) [20?]  (a , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream2) [203]  (a , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (b , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (b , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
-SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (c , ffffffff)
+SimplePoolFile3...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (c , ffffffff)
 SimplePoolFile3...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 11 Entries in total.
 SimplePoolFile3...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -1404,9 +1404,9 @@ MetaDataSvc         DEBUG Loaded input meta data store proxies
 MetaDataSvc         DEBUG  calling beginInputFile for ToolSvc.IOVDbMetaDataTool
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000]
 SimplePoolFile3...  DEBUG --> Access   DbContainer  READ      [ROOT_Tree] POOLContainerForm(DataHeaderForm)
 POOLContainerFo...  DEBUG Opening
 POOLContainerFo...  DEBUG    attributes# = 1
@@ -1450,9 +1450,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #0, run #1 31 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1476,9 +1476,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #1, run #1 32 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1502,9 +1502,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #2, run #1 33 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1528,9 +1528,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #3, run #1 34 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1554,9 +1554,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #4, run #1 35 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1580,9 +1580,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #5, run #1 36 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1606,9 +1606,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #6, run #1 37 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1632,9 +1632,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #7, run #1 38 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1658,9 +1658,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #8, run #1 39 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1684,9 +1684,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #9, run #1 40 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1710,9 +1710,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #1 41 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1736,9 +1736,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #1 42 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1762,9 +1762,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #1 43 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1788,9 +1788,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #1 44 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1814,9 +1814,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #1 45 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1840,9 +1840,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #1 46 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1866,9 +1866,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #1 47 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1892,9 +1892,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #1 48 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
@@ -1918,9 +1918,9 @@ PoolSvc              INFO Database (SimplePoolFile3.root) attribute [READ_CALLS]
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #1 49 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 0
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9103, name = MyTracks
diff --git a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_WCond.ref b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_WCond.ref
index deb12fd3bf51..9d9107bd030c 100644
--- a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_WCond.ref
+++ b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_WCond.ref
@@ -91,51 +91,51 @@ SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Links
 ##Links             DEBUG Opened container ##Links of type ROOT_Tree
 SimplePoolFile1...  DEBUG --->Reading Assoc:????/##Params [200]  (2 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [20?]  (4 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/CollectionTree(ExampleHitContainer_p1/MyHits) [203]  (4 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsSimulation) [20?]  (8 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsSimulation) [202]  (8 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsCalibration) [20?]  (9 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsCalibration) [202]  (9 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsTestBeam) [20?]  (a , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(IsTestBeam) [202]  (a , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(McChannel) [20?]  (b , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(McChannel) [202]  (b , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [20?]  (c , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(RunNumber) [202]  (c , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [20?]  (d , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventNumber) [202]  (d , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(LumiBlockN) [20?]  (e , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(LumiBlockN) [202]  (e , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(ConditionsRun) [20?]  (f , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(ConditionsRun) [202]  (f , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTime) [20?]  (10 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTime) [202]  (10 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTimeNanoSec) [20?]  (11 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventTimeNanoSec) [202]  (11 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(BunchId) [20?]  (12 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(BunchId) [202]  (12 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventWeight) [20?]  (13 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/POOLCollectionTree(EventWeight) [202]  (13 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (14 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (14 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (15 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(EventStreamInfo_p3/Stream1) [203]  (15 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (16 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (16 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (17 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [203]  (17 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [20?]  (18 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdr(DataHeader) [203]  (18 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
-SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [20?]  (19 , ffffffff)
+SimplePoolFile1...  DEBUG --->Reading Assoc:????/MetaDataHdrForm(DataHeaderForm) [203]  (19 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 ##Links             DEBUG No objects passing selection criteria... Container has 24 Entries in total.
 SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_All] ##Params
@@ -193,9 +193,9 @@ MetaDataSvc         DEBUG Loaded input meta data store proxies
 MetaDataSvc         DEBUG  calling beginInputFile for ToolSvc.IOVDbMetaDataTool
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000000]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000000]
 SimplePoolFile1...  DEBUG --> Access   DbContainer  READ      [ROOT_Tree] POOLContainer(DataHeader)
 POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
@@ -258,10 +258,10 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #0, run #1 1 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001].
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001].
 ClassIDSvc           INFO  getRegistryEntries: read 21 CLIDRegistry entries for module ALL
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000001]
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000001]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -302,9 +302,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #1, run #1 2 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000002]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000002]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -345,9 +345,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #2, run #1 3 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000003]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000003]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -388,9 +388,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #3, run #1 4 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000004]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000004]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -431,9 +431,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #4, run #1 5 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000005]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000005]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -474,9 +474,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #5, run #1 6 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000006]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000006]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -517,9 +517,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #6, run #1 7 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000007]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000007]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -560,9 +560,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #7, run #1 8 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000008]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000008]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -603,9 +603,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #8, run #1 9 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000009]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000009]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -646,9 +646,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #9, run #1 10 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000A]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000A]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -689,9 +689,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #1 11 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000B]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000B]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -732,9 +732,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #1 12 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000C]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000C]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -775,9 +775,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #1 13 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000D]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000D]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -818,9 +818,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #1 14 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000E]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000E]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -861,9 +861,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #1 15 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-0000000F]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-0000000F]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -904,9 +904,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #1 16 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000010]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000010]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -947,9 +947,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #1 17 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000011]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000011]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -990,9 +990,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #1 18 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000012]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000012]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1033,9 +1033,9 @@ WriteCond            INFO registered all data
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #1 19 events processed so far  <<<===
 EventSelector       DEBUG Get AttributeList from the collection
 EventSelector       DEBUG AttributeList size 12
-EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013].
-EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=0000020?][OID=00000005-00000013]
+EventSelector       DEBUG record AthenaAttribute, name = Token = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG record AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013].
+EventSelector       DEBUG found AthenaAttribute, name = eventRef = [DB=????][CNT=POOLContainer(DataHeader)][CLID=????][TECH=00000203][OID=00000005-00000013]
 AthenaPoolAddre...  DEBUG The current Event contains: 3 objects
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 2101, name = McEventInfo
 AthenaPoolAddre...  DEBUG loadAddresses: DataObject address, clid = 9102, name = MyHits
@@ -1117,7 +1117,7 @@ ConditionsConta...  DEBUG Opening
 ConditionsConta...  DEBUG    attributes# = 1
 ConditionsConta...  DEBUG Branch container 'ExampleHitContainer_p1_PedestalWriteData'
 ConditionsConta...  DEBUG Opened container ConditionsContainer(ExampleHitContainer_p1/PedestalWriteData) of type ROOT_Tree
-SimplePoolFile4...  DEBUG --->Adding Assoc :????/ConditionsContainer(ExampleHitContainer_p1/PedestalWriteData) [20?]  (3 , ffffffff)
+SimplePoolFile4...  DEBUG --->Adding Assoc :????/ConditionsContainer(ExampleHitContainer_p1/PedestalWriteData) [203]  (3 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 SimplePoolFile4...  DEBUG --->Adding Shape[0 , ????]:  [1 Column(s)] 
 SimplePoolFile4...  DEBUG ---->Class:ExampleHitContainer_p1
@@ -1129,7 +1129,7 @@ POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
 POOLContainer(D...  DEBUG Branch container 'DataHeader'
 POOLContainer(D...  DEBUG Opened container POOLContainer(DataHeader) of type ROOT_Tree
-SimplePoolFile4...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [20?]  (4 , ffffffff)
+SimplePoolFile4...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [203]  (4 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 SimplePoolFile4...  DEBUG --->Adding Shape[1 , ????]:  [1 Column(s)] 
 SimplePoolFile4...  DEBUG ---->Class:DataHeader_p6
@@ -1141,7 +1141,7 @@ POOLContainerFo...  DEBUG Opening
 POOLContainerFo...  DEBUG    attributes# = 1
 POOLContainerFo...  DEBUG Branch container 'DataHeaderForm'
 POOLContainerFo...  DEBUG Opened container POOLContainerForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolFile4...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [20?]  (5 , ffffffff)
+SimplePoolFile4...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [203]  (5 , ffffffff)
 SimplePoolFile4...  DEBUG ---->ClassID:????
 SimplePoolFile4...  DEBUG --->Adding Shape[2 , ????]:  [1 Column(s)] 
 SimplePoolFile4...  DEBUG ---->Class:DataHeaderForm_p6
diff --git a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_WMeta.ref b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_WMeta.ref
index a3596372151a..d062ff0f0ce7 100644
--- a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_WMeta.ref
+++ b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_WMeta.ref
@@ -167,7 +167,7 @@ CollectionTree(...  DEBUG Opening
 CollectionTree(...  DEBUG    attributes# = 1
 CollectionTree(...  DEBUG Branch container 'EventInfo_p4_McEventInfo'
 CollectionTree(...  DEBUG Opened container CollectionTree(EventInfo_p4/McEventInfo) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --->Adding Shape[0 , ????]:  [1 Column(s)] 
 SimplePoolFile5...  DEBUG ---->Class:EventInfo_p4
@@ -179,7 +179,7 @@ CollectionTree(...  DEBUG Opening
 CollectionTree(...  DEBUG    attributes# = 1
 CollectionTree(...  DEBUG Branch container 'ExampleHitContainer_p1_MyHits'
 CollectionTree(...  DEBUG Opened container CollectionTree(ExampleHitContainer_p1/MyHits) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/CollectionTree(ExampleHitContainer_p1/MyHits) [20?]  (4 , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/CollectionTree(ExampleHitContainer_p1/MyHits) [203]  (4 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --->Adding Shape[1 , ????]:  [1 Column(s)] 
 SimplePoolFile5...  DEBUG ---->Class:ExampleHitContainer_p1
@@ -191,7 +191,7 @@ POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
 POOLContainer(D...  DEBUG Branch container 'DataHeader'
 POOLContainer(D...  DEBUG Opened container POOLContainer(DataHeader) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --->Adding Shape[2 , ????]:  [1 Column(s)] 
 SimplePoolFile5...  DEBUG ---->Class:DataHeader_p6
@@ -203,7 +203,7 @@ POOLContainerFo...  DEBUG Opening
 POOLContainerFo...  DEBUG    attributes# = 1
 POOLContainerFo...  DEBUG Branch container 'DataHeaderForm'
 POOLContainerFo...  DEBUG Opened container POOLContainerForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --->Adding Shape[3 , ????]:  [1 Column(s)] 
 SimplePoolFile5...  DEBUG ---->Class:DataHeaderForm_p6
@@ -215,7 +215,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'Token'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(Token) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --->Adding Shape[4 , ????]:  [1 Column(s)] 
 SimplePoolFile5...  DEBUG ---->Class:Token
@@ -227,7 +227,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'IsSimulation'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(IsSimulation) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsSimulation) [20?]  (8 , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsSimulation) [202]  (8 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --->Adding Shape[5 , ????]:  [1 Column(s)] 
 SimplePoolFile5...  DEBUG ---->Class:bool
@@ -237,14 +237,14 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'IsCalibration'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(IsCalibration) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsCalibration) [20?]  (9 , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsCalibration) [202]  (9 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(IsTestBeam)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'IsTestBeam'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(IsTestBeam) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsTestBeam) [20?]  (a , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(IsTestBeam) [202]  (a , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 StorageSvc           INFO Building shape according to reflection information using shape ID for:
 StorageSvc           INFO unsigned int [????]
@@ -253,7 +253,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'McChannel'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(McChannel) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(McChannel) [20?]  (b , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(McChannel) [202]  (b , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --->Adding Shape[6 , ????]:  [1 Column(s)] 
 SimplePoolFile5...  DEBUG ---->Class:unsigned int
@@ -263,7 +263,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'RunNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(RunNumber) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(RunNumber) [20?]  (c , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(RunNumber) [202]  (c , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 StorageSvc           INFO Building shape according to reflection information using shape ID for:
 StorageSvc           INFO unsigned long long [????]
@@ -272,7 +272,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'EventNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(EventNumber) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventNumber) [20?]  (d , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventNumber) [202]  (d , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --->Adding Shape[7 , ????]:  [1 Column(s)] 
 SimplePoolFile5...  DEBUG ---->Class:unsigned long long
@@ -282,35 +282,35 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'LumiBlockN'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(LumiBlockN) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(LumiBlockN) [20?]  (e , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(LumiBlockN) [202]  (e , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(ConditionsRun)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'ConditionsRun'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(ConditionsRun) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(ConditionsRun) [20?]  (f , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(ConditionsRun) [202]  (f , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(EventTime)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'EventTime'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(EventTime) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventTime) [20?]  (10 , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventTime) [202]  (10 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(EventTimeNanoSec)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'EventTimeNanoSec'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(EventTimeNanoSec) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventTimeNanoSec) [20?]  (11 , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventTimeNanoSec) [202]  (11 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(BunchId)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'BunchId'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(BunchId) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(BunchId) [20?]  (12 , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(BunchId) [202]  (12 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 StorageSvc           INFO Building shape according to reflection information using shape ID for:
 StorageSvc           INFO float [????]
@@ -319,7 +319,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'EventWeight'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(EventWeight) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventWeight) [20?]  (13 , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventWeight) [202]  (13 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --->Adding Shape[8 , ????]:  [1 Column(s)] 
 SimplePoolFile5...  DEBUG ---->Class:float
@@ -963,7 +963,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (14 , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [202]  (14 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --->Adding Shape[9 , ????]:  [1 Column(s)] 
 SimplePoolFile5...  DEBUG ---->Class:xAOD::FileMetaDataAuxInfo_v1
@@ -973,7 +973,7 @@ MetaData(Exampl...  DEBUG Opening
 MetaData(Exampl...  DEBUG    attributes# = 1
 MetaData(Exampl...  DEBUG Branch container 'ExampleHitContainer_p1_PedestalWriteData'
 MetaData(Exampl...  DEBUG Opened container MetaData(ExampleHitContainer_p1/PedestalWriteData) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/MetaData(ExampleHitContainer_p1/PedestalWriteData) [20?]  (15 , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/MetaData(ExampleHitContainer_p1/PedestalWriteData) [202]  (15 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 StorageSvc           INFO Building shape according to reflection information using shape ID for:
 StorageSvc           INFO EventStreamInfo_p3 [????]
@@ -982,7 +982,7 @@ MetaData(EventS...  DEBUG Opening
 MetaData(EventS...  DEBUG    attributes# = 1
 MetaData(EventS...  DEBUG Branch container 'EventStreamInfo_p3_Stream1'
 MetaData(EventS...  DEBUG Opened container MetaData(EventStreamInfo_p3/Stream1) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (16 , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream1) [202]  (16 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --->Adding Shape[10 , ????]:  [1 Column(s)] 
 SimplePoolFile5...  DEBUG ---->Class:EventStreamInfo_p3
@@ -994,7 +994,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaData_v1_FileMetaData'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaData_v1/FileMetaData) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (17 , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [202]  (17 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --->Adding Shape[11 , ????]:  [1 Column(s)] 
 SimplePoolFile5...  DEBUG ---->Class:xAOD::FileMetaData_v1
@@ -1006,7 +1006,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::EventFormat_v1_EventFormatStream1'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::EventFormat_v1/EventFormatStream1) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (18 , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [202]  (18 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --->Adding Shape[12 , ????]:  [1 Column(s)] 
 SimplePoolFile5...  DEBUG ---->Class:xAOD::EventFormat_v1
@@ -1016,14 +1016,14 @@ MetaDataHdr(Dat...  DEBUG Opening
 MetaDataHdr(Dat...  DEBUG    attributes# = 1
 MetaDataHdr(Dat...  DEBUG Branch container 'DataHeader'
 MetaDataHdr(Dat...  DEBUG Opened container MetaDataHdr(DataHeader) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [20?]  (19 , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [202]  (19 , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 SimplePoolFile5...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] MetaDataHdrForm(DataHeaderForm)
 MetaDataHdrForm...  DEBUG Opening
 MetaDataHdrForm...  DEBUG    attributes# = 1
 MetaDataHdrForm...  DEBUG Branch container 'DataHeaderForm'
 MetaDataHdrForm...  DEBUG Opened container MetaDataHdrForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolFile5...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [20?]  (1a , ffffffff)
+SimplePoolFile5...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [202]  (1a , ffffffff)
 SimplePoolFile5...  DEBUG ---->ClassID:????
 MetaData(xAOD::...  DEBUG  SG::IAuxStoreIO* detected in xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.
 MetaData(xAOD::...  DEBUG        Attributes= 1
diff --git a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_Write.ref b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_Write.ref
index e95598dcdbf1..3c365a990859 100644
--- a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_Write.ref
+++ b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/share/AthenaPoolExample_Write.ref
@@ -215,7 +215,7 @@ CollectionTree(...  DEBUG Opening
 CollectionTree(...  DEBUG    attributes# = 1
 CollectionTree(...  DEBUG Branch container 'EventInfo_p4_McEventInfo'
 CollectionTree(...  DEBUG Opened container CollectionTree(EventInfo_p4/McEventInfo) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[0 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:EventInfo_p4
@@ -227,7 +227,7 @@ CollectionTree(...  DEBUG Opening
 CollectionTree(...  DEBUG    attributes# = 1
 CollectionTree(...  DEBUG Branch container 'ExampleHitContainer_p1_MyHits'
 CollectionTree(...  DEBUG Opened container CollectionTree(ExampleHitContainer_p1/MyHits) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/CollectionTree(ExampleHitContainer_p1/MyHits) [20?]  (4 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/CollectionTree(ExampleHitContainer_p1/MyHits) [203]  (4 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[1 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:ExampleHitContainer_p1
@@ -239,7 +239,7 @@ POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
 POOLContainer(D...  DEBUG Branch container 'DataHeader'
 POOLContainer(D...  DEBUG Opened container POOLContainer(DataHeader) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [20?]  (5 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [203]  (5 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[2 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:DataHeader_p6
@@ -251,7 +251,7 @@ POOLContainerFo...  DEBUG Opening
 POOLContainerFo...  DEBUG    attributes# = 1
 POOLContainerFo...  DEBUG Branch container 'DataHeaderForm'
 POOLContainerFo...  DEBUG Opened container POOLContainerForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [20?]  (6 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [203]  (6 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[3 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:DataHeaderForm_p6
@@ -263,7 +263,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'Token'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(Token) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(Token) [20?]  (7 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(Token) [202]  (7 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[4 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:Token
@@ -275,7 +275,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'RunNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(RunNumber) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(RunNumber) [20?]  (8 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(RunNumber) [202]  (8 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[5 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:unsigned int
@@ -285,14 +285,14 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'EventNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(EventNumber) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventNumber) [20?]  (9 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventNumber) [202]  (9 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(MagicNumber)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'MagicNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(MagicNumber) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(MagicNumber) [20?]  (a , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/POOLCollectionTree(MagicNumber) [202]  (a , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 ClassIDSvc           INFO  getRegistryEntries: read 83 CLIDRegistry entries for module ALL
 Stream1.FileMet...  DEBUG Valid  'EventInfoKey':'EventInfo' handle
@@ -344,7 +344,7 @@ CollectionTree(...  DEBUG Opening
 CollectionTree(...  DEBUG    attributes# = 1
 CollectionTree(...  DEBUG Branch container 'EventInfo_p4_McEventInfo'
 CollectionTree(...  DEBUG Opened container CollectionTree(EventInfo_p4/McEventInfo) of type ROOT_Tree
-SimplePoolFile2...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [20?]  (3 , ffffffff)
+SimplePoolFile2...  DEBUG --->Adding Assoc :????/CollectionTree(EventInfo_p4/McEventInfo) [203]  (3 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
 SimplePoolFile2...  DEBUG --->Adding Shape[0 , ????]:  [1 Column(s)] 
 SimplePoolFile2...  DEBUG ---->Class:EventInfo_p4
@@ -354,7 +354,7 @@ POOLContainer(D...  DEBUG Opening
 POOLContainer(D...  DEBUG    attributes# = 1
 POOLContainer(D...  DEBUG Branch container 'DataHeader'
 POOLContainer(D...  DEBUG Opened container POOLContainer(DataHeader) of type ROOT_Tree
-SimplePoolFile2...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [20?]  (4 , ffffffff)
+SimplePoolFile2...  DEBUG --->Adding Assoc :????/POOLContainer(DataHeader) [203]  (4 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
 SimplePoolFile2...  DEBUG --->Adding Shape[1 , ????]:  [1 Column(s)] 
 SimplePoolFile2...  DEBUG ---->Class:DataHeader_p6
@@ -364,7 +364,7 @@ POOLContainerFo...  DEBUG Opening
 POOLContainerFo...  DEBUG    attributes# = 1
 POOLContainerFo...  DEBUG Branch container 'DataHeaderForm'
 POOLContainerFo...  DEBUG Opened container POOLContainerForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolFile2...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [20?]  (5 , ffffffff)
+SimplePoolFile2...  DEBUG --->Adding Assoc :????/POOLContainerForm(DataHeaderForm) [203]  (5 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
 SimplePoolFile2...  DEBUG --->Adding Shape[2 , ????]:  [1 Column(s)] 
 SimplePoolFile2...  DEBUG ---->Class:DataHeaderForm_p6
@@ -374,7 +374,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'Token'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(Token) of type ROOT_Tree
-SimplePoolFile2...  DEBUG --->Adding Assoc :????/POOLCollectionTree(Token) [20?]  (6 , ffffffff)
+SimplePoolFile2...  DEBUG --->Adding Assoc :????/POOLCollectionTree(Token) [202]  (6 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
 SimplePoolFile2...  DEBUG --->Adding Shape[3 , ????]:  [1 Column(s)] 
 SimplePoolFile2...  DEBUG ---->Class:Token
@@ -384,7 +384,7 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'RunNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(RunNumber) of type ROOT_Tree
-SimplePoolFile2...  DEBUG --->Adding Assoc :????/POOLCollectionTree(RunNumber) [20?]  (7 , ffffffff)
+SimplePoolFile2...  DEBUG --->Adding Assoc :????/POOLCollectionTree(RunNumber) [202]  (7 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
 SimplePoolFile2...  DEBUG --->Adding Shape[4 , ????]:  [1 Column(s)] 
 SimplePoolFile2...  DEBUG ---->Class:unsigned int
@@ -394,14 +394,14 @@ POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'EventNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(EventNumber) of type ROOT_Tree
-SimplePoolFile2...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventNumber) [20?]  (8 , ffffffff)
+SimplePoolFile2...  DEBUG --->Adding Assoc :????/POOLCollectionTree(EventNumber) [202]  (8 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
 SimplePoolFile2...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] POOLCollectionTree(MagicNumber)
 POOLCollectionT...  DEBUG Opening
 POOLCollectionT...  DEBUG    attributes# = 1
 POOLCollectionT...  DEBUG Branch container 'MagicNumber'
 POOLCollectionT...  DEBUG Opened container POOLCollectionTree(MagicNumber) of type ROOT_Tree
-SimplePoolFile2...  DEBUG --->Adding Assoc :????/POOLCollectionTree(MagicNumber) [20?]  (9 , ffffffff)
+SimplePoolFile2...  DEBUG --->Adding Assoc :????/POOLCollectionTree(MagicNumber) [202]  (9 , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
 Stream2.FileMet...  DEBUG Valid  'EventInfoKey':'EventInfo' handle
 Stream2.FileMet...  DEBUG setting xAOD::FileMetaData::mcProcID to 0
@@ -1220,7 +1220,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (b , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (b , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[6 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:xAOD::FileMetaDataAuxInfo_v1
@@ -1232,7 +1232,7 @@ MetaData(EventS...  DEBUG Opening
 MetaData(EventS...  DEBUG    attributes# = 1
 MetaData(EventS...  DEBUG Branch container 'EventStreamInfo_p3_Stream1'
 MetaData(EventS...  DEBUG Opened container MetaData(EventStreamInfo_p3/Stream1) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream1) [20?]  (c , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream1) [203]  (c , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[7 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:EventStreamInfo_p3
@@ -1244,7 +1244,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaData_v1_FileMetaData'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaData_v1/FileMetaData) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (d , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (d , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[8 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:xAOD::FileMetaData_v1
@@ -1256,7 +1256,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::EventFormat_v1_EventFormatStream1'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::EventFormat_v1/EventFormatStream1) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [20?]  (e , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream1) [203]  (e , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --->Adding Shape[9 , ????]:  [1 Column(s)] 
 SimplePoolFile1...  DEBUG ---->Class:xAOD::EventFormat_v1
@@ -1266,14 +1266,14 @@ MetaDataHdr(Dat...  DEBUG Opening
 MetaDataHdr(Dat...  DEBUG    attributes# = 1
 MetaDataHdr(Dat...  DEBUG Branch container 'DataHeader'
 MetaDataHdr(Dat...  DEBUG Opened container MetaDataHdr(DataHeader) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [20?]  (f , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [203]  (f , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 SimplePoolFile1...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] MetaDataHdrForm(DataHeaderForm)
 MetaDataHdrForm...  DEBUG Opening
 MetaDataHdrForm...  DEBUG    attributes# = 1
 MetaDataHdrForm...  DEBUG Branch container 'DataHeaderForm'
 MetaDataHdrForm...  DEBUG Opened container MetaDataHdrForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [20?]  (10 , ffffffff)
+SimplePoolFile1...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [203]  (10 , ffffffff)
 SimplePoolFile1...  DEBUG ---->ClassID:????
 MetaData(xAOD::...  DEBUG  SG::IAuxStoreIO* detected in xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.
 MetaData(xAOD::...  DEBUG        Attributes= 1
@@ -1314,7 +1314,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) of type ROOT_Tree
-SimplePoolFile2...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (a , ffffffff)
+SimplePoolFile2...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (a , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
 SimplePoolFile2...  DEBUG --->Adding Shape[5 , ????]:  [1 Column(s)] 
 SimplePoolFile2...  DEBUG ---->Class:xAOD::FileMetaDataAuxInfo_v1
@@ -1324,7 +1324,7 @@ MetaData(EventS...  DEBUG Opening
 MetaData(EventS...  DEBUG    attributes# = 1
 MetaData(EventS...  DEBUG Branch container 'EventStreamInfo_p3_Stream2'
 MetaData(EventS...  DEBUG Opened container MetaData(EventStreamInfo_p3/Stream2) of type ROOT_Tree
-SimplePoolFile2...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream2) [20?]  (b , ffffffff)
+SimplePoolFile2...  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream2) [203]  (b , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
 SimplePoolFile2...  DEBUG --->Adding Shape[6 , ????]:  [1 Column(s)] 
 SimplePoolFile2...  DEBUG ---->Class:EventStreamInfo_p3
@@ -1334,7 +1334,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaData_v1_FileMetaData'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaData_v1/FileMetaData) of type ROOT_Tree
-SimplePoolFile2...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (c , ffffffff)
+SimplePoolFile2...  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (c , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
 SimplePoolFile2...  DEBUG --->Adding Shape[7 , ????]:  [1 Column(s)] 
 SimplePoolFile2...  DEBUG ---->Class:xAOD::FileMetaData_v1
@@ -1344,7 +1344,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::EventFormat_v1_EventFormatStream2'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::EventFormat_v1/EventFormatStream2) of type ROOT_Tree
-SimplePoolFile2...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream2) [20?]  (d , ffffffff)
+SimplePoolFile2...  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream2) [203]  (d , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
 SimplePoolFile2...  DEBUG --->Adding Shape[8 , ????]:  [1 Column(s)] 
 SimplePoolFile2...  DEBUG ---->Class:xAOD::EventFormat_v1
@@ -1354,14 +1354,14 @@ MetaDataHdr(Dat...  DEBUG Opening
 MetaDataHdr(Dat...  DEBUG    attributes# = 1
 MetaDataHdr(Dat...  DEBUG Branch container 'DataHeader'
 MetaDataHdr(Dat...  DEBUG Opened container MetaDataHdr(DataHeader) of type ROOT_Tree
-SimplePoolFile2...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [20?]  (e , ffffffff)
+SimplePoolFile2...  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [203]  (e , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
 SimplePoolFile2...  DEBUG --> Access   DbContainer  CREA/UPDA [ROOT_Tree] MetaDataHdrForm(DataHeaderForm)
 MetaDataHdrForm...  DEBUG Opening
 MetaDataHdrForm...  DEBUG    attributes# = 1
 MetaDataHdrForm...  DEBUG Branch container 'DataHeaderForm'
 MetaDataHdrForm...  DEBUG Opened container MetaDataHdrForm(DataHeaderForm) of type ROOT_Tree
-SimplePoolFile2...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [20?]  (f , ffffffff)
+SimplePoolFile2...  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [203]  (f , ffffffff)
 SimplePoolFile2...  DEBUG ---->ClassID:????
 MetaData(xAOD::...  DEBUG  SG::IAuxStoreIO* detected in xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.
 MetaData(xAOD::...  DEBUG        Attributes= 1
@@ -1402,7 +1402,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaDataAuxInfo_v1_FileMetaDataAux.'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) of type ROOT_Tree
-EmptyPoolFile.root  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [20?]  (3 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaDataAuxInfo_v1/FileMetaDataAux.) [203]  (3 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
 EmptyPoolFile.root  DEBUG --->Adding Shape[0 , ????]:  [1 Column(s)] 
 EmptyPoolFile.root  DEBUG ---->Class:xAOD::FileMetaDataAuxInfo_v1
@@ -1412,7 +1412,7 @@ MetaData(EventS...  DEBUG Opening
 MetaData(EventS...  DEBUG    attributes# = 1
 MetaData(EventS...  DEBUG Branch container 'EventStreamInfo_p3_Stream3'
 MetaData(EventS...  DEBUG Opened container MetaData(EventStreamInfo_p3/Stream3) of type ROOT_Tree
-EmptyPoolFile.root  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream3) [20?]  (4 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Adding Assoc :????/MetaData(EventStreamInfo_p3/Stream3) [203]  (4 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
 EmptyPoolFile.root  DEBUG --->Adding Shape[1 , ????]:  [1 Column(s)] 
 EmptyPoolFile.root  DEBUG ---->Class:EventStreamInfo_p3
@@ -1422,7 +1422,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::FileMetaData_v1_FileMetaData'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::FileMetaData_v1/FileMetaData) of type ROOT_Tree
-EmptyPoolFile.root  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [20?]  (5 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Adding Assoc :????/MetaData(xAOD::FileMetaData_v1/FileMetaData) [203]  (5 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
 EmptyPoolFile.root  DEBUG --->Adding Shape[2 , ????]:  [1 Column(s)] 
 EmptyPoolFile.root  DEBUG ---->Class:xAOD::FileMetaData_v1
@@ -1432,7 +1432,7 @@ MetaData(xAOD::...  DEBUG Opening
 MetaData(xAOD::...  DEBUG    attributes# = 1
 MetaData(xAOD::...  DEBUG Branch container 'xAOD::EventFormat_v1_EventFormatStream3'
 MetaData(xAOD::...  DEBUG Opened container MetaData(xAOD::EventFormat_v1/EventFormatStream3) of type ROOT_Tree
-EmptyPoolFile.root  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [20?]  (6 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Adding Assoc :????/MetaData(xAOD::EventFormat_v1/EventFormatStream3) [203]  (6 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
 EmptyPoolFile.root  DEBUG --->Adding Shape[3 , ????]:  [1 Column(s)] 
 EmptyPoolFile.root  DEBUG ---->Class:xAOD::EventFormat_v1
@@ -1442,7 +1442,7 @@ MetaDataHdr(Dat...  DEBUG Opening
 MetaDataHdr(Dat...  DEBUG    attributes# = 1
 MetaDataHdr(Dat...  DEBUG Branch container 'DataHeader'
 MetaDataHdr(Dat...  DEBUG Opened container MetaDataHdr(DataHeader) of type ROOT_Tree
-EmptyPoolFile.root  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [20?]  (7 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Adding Assoc :????/MetaDataHdr(DataHeader) [203]  (7 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
 EmptyPoolFile.root  DEBUG --->Adding Shape[4 , ????]:  [1 Column(s)] 
 EmptyPoolFile.root  DEBUG ---->Class:DataHeader_p6
@@ -1452,7 +1452,7 @@ MetaDataHdrForm...  DEBUG Opening
 MetaDataHdrForm...  DEBUG    attributes# = 1
 MetaDataHdrForm...  DEBUG Branch container 'DataHeaderForm'
 MetaDataHdrForm...  DEBUG Opened container MetaDataHdrForm(DataHeaderForm) of type ROOT_Tree
-EmptyPoolFile.root  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [20?]  (8 , ffffffff)
+EmptyPoolFile.root  DEBUG --->Adding Assoc :????/MetaDataHdrForm(DataHeaderForm) [203]  (8 , ffffffff)
 EmptyPoolFile.root  DEBUG ---->ClassID:????
 EmptyPoolFile.root  DEBUG --->Adding Shape[5 , ????]:  [1 Column(s)] 
 EmptyPoolFile.root  DEBUG ---->Class:DataHeaderForm_p6
diff --git a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/test/athenarun_test.sh.in b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/test/athenarun_test.sh.in
index 947680d2cf2d..fb6503e414f0 100755
--- a/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/test/athenarun_test.sh.in
+++ b/Database/AthenaPOOL/AthenaPoolExample/AthenaPoolExampleAlgorithms/test/athenarun_test.sh.in
@@ -20,7 +20,6 @@ s/\\\\[00000000/[/g
 s/-000000000/-0/g
 s/=00000000/=/g
 s/ ffffffff/ /g
-s/20[23]/20?/g
 s/INFO CLID = 222376821, key = Stream[12]/INFO CLID = 222376821, key = StreamX/g
 s/0x[0-9a-f]\\\\{7,12\\\\}/0x????/g
 s/[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]00*//g
-- 
GitLab


From c1fc024b5d2e4cf54df0c432d32ee81c0ca9b43d Mon Sep 17 00:00:00 2001
From: Tomasz Bold <tomasz.bold@gmail.com>
Date: Thu, 17 Dec 2020 21:43:56 +0000
Subject: [PATCH 133/225] Fixed saving decorations from SP counts

---
 .../TrigOutputHandling/src/HLTEDMCreator.cxx         | 12 ++----------
 .../TrigEDMConfig/python/TriggerEDMRun3.py           |  2 +-
 2 files changed, 3 insertions(+), 11 deletions(-)

diff --git a/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.cxx b/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.cxx
index 1ebbc05f0eff..3ed35a16063f 100644
--- a/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.cxx
+++ b/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.cxx
@@ -342,13 +342,7 @@ StatusCode HLTEDMCreator::createOutput(const EventContext& context) const {
   }
 
 
-#define CREATE_XAOD_NO_MERGE(__TYPE, __STORE_TYPE)      \
-  { \
-    xAODGenerator<xAOD::__TYPE, xAOD::__STORE_TYPE> generator; \
-    ATH_CHECK( createIfMissing<xAOD::__TYPE>( context, ConstHandlesGroup<xAOD::__TYPE>( m_##__TYPE, m_##__TYPE##InViews, m_##__TYPE##Views ), generator, &HLTEDMCreator::noMerge<xAOD::__TYPE> )  ); \
-  }
-  
-  CREATE_XAOD_NO_MERGE( TrigCompositeContainer, TrigCompositeAuxContainer );
+  CREATE_XAOD( TrigCompositeContainer, TrigCompositeAuxContainer );
   CREATE_XAOD( TrigElectronContainer, TrigElectronAuxContainer );
   CREATE_XAOD( ElectronContainer, ElectronAuxContainer );
   CREATE_XAOD( PhotonContainer, PhotonAuxContainer );
@@ -366,18 +360,16 @@ StatusCode HLTEDMCreator::createOutput(const EventContext& context) const {
   CREATE_XAOD( TauJetContainer, TauJetAuxContainer );
   CREATE_XAOD( TauTrackContainer, TauTrackAuxContainer );
   CREATE_XAOD( CaloClusterContainer, CaloClusterTrigAuxContainer ); // NOTE: Difference in interface and aux
-  // After view collections are merged, need to update collection links
-
   CREATE_XAOD( JetContainer, JetAuxContainer );
   CREATE_XAOD( VertexContainer,VertexAuxContainer );
   CREATE_XAOD( TrigBphysContainer, TrigBphysAuxContainer );
   CREATE_XAOD( BTaggingContainer,BTaggingAuxContainer );
   CREATE_XAOD( BTagVertexContainer,BTagVertexAuxContainer );
 
+  // After view collections are merged, need to update collection links
   ATH_CHECK( fixLinks() );
   
 #undef CREATE_XAOD
-#undef CREATE_XAOD_NO_MERGE
 
   // special cases
   #define CREATE_SHALLOW(__TYPE) \
diff --git a/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py b/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py
index 2b2c6f4cb2d3..c407db4b6584 100644
--- a/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py
+++ b/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py
@@ -526,7 +526,7 @@ TriggerHLTListRun3 = [
 
     ('ROIB::RoIBResult#*',                         'ESD', 'Misc'),
 
-    ('xAOD::TrigCompositeContainer#HLT_SpacePointCounts',            'BS ESD AODFULL AODSLIM', 'MinBias'),
+    ('xAOD::TrigCompositeContainer#HLT_SpacePointCounts',            'BS ESD AODFULL AODSLIM', 'MinBias', 'inViews:SPView'),
     ('xAOD::TrigCompositeAuxContainer#HLT_SpacePointCountsAux.totNumPixSP.totNumPixCL_1.totNumPixCL_2.totNumPixCLmin3.pixClBarrel.pixClEndcapA.pixClEndcapC.totNumSctSP.SctSpBarrel.SctSpEndcapA.SctSpEndcapC',     'BS ESD AODFULL AODSLIM', 'MinBias'),
 
     ('xAOD::TrigCompositeContainer#HLT_TrackCount',                                             'BS ESD AODFULL AODSLIM', 'MinBias'),
-- 
GitLab


From b0459bf9d8e7713f0aba5bade76e85766d91502e Mon Sep 17 00:00:00 2001
From: christos <christos@cern.ch>
Date: Thu, 17 Dec 2020 22:59:24 +0100
Subject: [PATCH 134/225] EgammaFourMomBuilder some flake8 fixes. Quite few
 more remain

---
 .../python/create_input.py                    | 71 ++++++++------
 .../python/dump_layer.py                      | 40 +++++---
 .../python/merge_scale_histograms.py          | 93 +++++++++----------
 3 files changed, 114 insertions(+), 90 deletions(-)

diff --git a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/create_input.py b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/create_input.py
index f1b161dacf85..7114879c3521 100644
--- a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/create_input.py
+++ b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/create_input.py
@@ -2,6 +2,7 @@
 
 # this file do not work out of the box
 
+import shutil
 import ROOT
 from array import array
 import numpy as np
@@ -27,7 +28,8 @@ assert old_ct_sys
 file_christophe = ROOT.TFile("~/ElectronEnergyScaleFactor.root")
 scales_christophe = file_christophe.Get("alpha68")
 ct_christophe = file_christophe.Get("sigma24")
-scales_sys_christophe = file_christophe.Get("systAlpha")  # sum of 8 / 13 TeV diff + 64 / 32 bins diff
+# sum of 8 / 13 TeV diff + 64 / 32 bins diff
+scales_sys_christophe = file_christophe.Get("systAlpha")
 ct_sys_christophe = file_christophe.Get("systSigma")  # 8 / 13 TeV diff
 
 assert scales_christophe
@@ -39,7 +41,7 @@ assert ct_sys_christophe
 def qsum_histograms(histo1, histo2):
     new_histo = histo1.Clone()
     new_histo.Reset()
-    for ibin in xrange(histo1.GetNbinsX() + 2):
+    for ibin in range(histo1.GetNbinsX() + 2):
         value1 = histo1.GetBinContent(ibin)
         central_value = histo1.GetBinCenter(ibin)
         ibin2 = histo2.FindBin(central_value)
@@ -127,23 +129,23 @@ def merge_histograms(old, new, merge_error=True):
     UNDERFLOW = 0
     OVERFLOW = new.GetNbinsX() + 1
 
-    for iold in xrange(1, old.GetNbinsX()):
-        l = old.GetBinLowEdge(iold)
-        r = l + old.GetBinWidth(iold)
+    for iold in range(1, old.GetNbinsX()):
+        low = old.GetBinLowEdge(iold)
+        r = low + old.GetBinWidth(iold)
 
-        il_new = new.FindFixBin(l)
+        il_new = new.FindFixBin(low)
         ir_new = new.FindFixBin(r)
         remainer = None
 
         if il_new == UNDERFLOW and ir_new == UNDERFLOW:
-            new_binning.append((l, r))
+            new_binning.append((low, r))
             new_values.append(old.GetBinContent(iold))
             new_errors.append(old.GetBinError(iold))
 
         elif il_new == UNDERFLOW and ir_new > UNDERFLOW and ir_new < OVERFLOW:
-            if abs(new.GetBinLowEdge(1) - l) < 1E-100:
+            if abs(new.GetBinLowEdge(1) - low) < 1E-100:
                 continue
-            new_binning.append((l, new.GetBinLowEdge(1)))
+            new_binning.append((low, new.GetBinLowEdge(1)))
             new_values.append(old.GetBinContent(iold))
             new_errors.append(old.GetBinError(iold))
             if ir_new == OVERFLOW:
@@ -151,27 +153,29 @@ def merge_histograms(old, new, merge_error=True):
             break
     last_old = iold
 
-    for inew in xrange(1, new.GetNbinsX() + 1):
-        l = new.GetBinLowEdge(inew)
-        r = l + new.GetBinWidth(inew)
-        new_binning.append((l, r))
+    for inew in range(1, new.GetNbinsX() + 1):
+        low = new.GetBinLowEdge(inew)
+        r = low + new.GetBinWidth(inew)
+        new_binning.append((low, r))
         new_values.append(new.GetBinContent(inew))
         new_errors.append(new.GetBinError(inew))
 
     if remainer is not None:
-        new_binning.append((new.GetBinLowEdge(new.GetNbinsX()), old.GetBinLowEdge(remainer) + old.GetBinWidth(remainer)))
+        new_binning.append((new.GetBinLowEdge(new.GetNbinsX()),
+                            old.GetBinLowEdge(remainer)
+                            + old.GetBinWidth(remainer)))
         new_values.append(old.GetBinContent(remainer))
         new_errors.append(old.GetBinError(remainer))
 
-    for iold in xrange(last_old, old.GetNbinsX() + 1):
-        l = old.GetBinLowEdge(iold)
-        r = l + old.GetBinWidth(iold)
+    for iold in range(last_old, old.GetNbinsX() + 1):
+        low = old.GetBinLowEdge(iold)
+        r = low + old.GetBinWidth(iold)
 
-        il_new = new.FindFixBin(l)
+        il_new = new.FindFixBin(low)
         ir_new = new.FindFixBin(r)
 
         if il_new == OVERFLOW and ir_new == OVERFLOW:
-            new_binning.append((l, r))
+            new_binning.append((low, r))
             new_values.append(old.GetBinContent(iold))
             new_errors.append(old.GetBinError(iold))
         elif il_new < OVERFLOW and ir_new == OVERFLOW:
@@ -183,7 +187,8 @@ def merge_histograms(old, new, merge_error=True):
 
     new_edges = array('f', [x[0] for x in new_binning] + [new_binning[-1][1]])
     histo_type = type(new)
-    result = histo_type(new.GetName(), new.GetTitle(), len(new_edges) - 1, new_edges)
+    result = histo_type(new.GetName(), new.GetTitle(),
+                        len(new_edges) - 1, new_edges)
     for i, (v, e) in enumerate(zip(new_values, new_errors), 1):
         result.SetBinContent(i, v)
         if merge_error:
@@ -223,15 +228,16 @@ histo_scale.SetName("alphaZee_errStat")
 histo_ct.SetName("ctZee_errStat")
 
 # this created a file structured as the official one, with empty directories
-#output_file = create_structured_file("calibration_constants_run2.root")
-import shutil
+# output_file = create_structured_file("calibration_constants_run2.root")
 print(old_filename)
 shutil.copy2(old_filename, "xxx.root")
 output_file = ROOT.TFile("xxx.root", "update")
 create_new_directories(output_file)
 
-output_file.GetDirectory("Scales").GetDirectory("es2015PRE").WriteObject(histo_scale, "alphaZee_errStat")
-output_file.GetDirectory("Resolution").GetDirectory("es2015PRE").WriteObject(histo_ct, "ctZee_errStat")
+output_file.GetDirectory("Scales").GetDirectory(
+    "es2015PRE").WriteObject(histo_scale, "alphaZee_errStat")
+output_file.GetDirectory("Resolution").GetDirectory(
+    "es2015PRE").WriteObject(histo_ct, "ctZee_errStat")
 
 # systematics
 
@@ -239,10 +245,13 @@ new_scale_sys = qsum_histograms(scales_sys_christophe, old_scale_sys)
 new_ct_sys = qsum_histograms(ct_sys_christophe, old_ct_sys)
 new_scale_sys = merge_histograms(old_scale_sys, new_scale_sys, False)
 new_ct_sys = merge_histograms(old_ct_sys, new_ct_sys, False)
-new_scale_sys.SetTitle("es2015PRE scales sys = es2012c sys + 7/13 TeV diff + 34/68 bin diff")
+new_scale_sys.SetTitle(
+    "es2015PRE scales sys = es2012c sys + 7/13 TeV diff + 34/68 bin diff")
 new_ct_sys.SetTitle("es2015 ct sys = es2012c sys + 7/13 TeV diff")
-output_file.GetDirectory("Scales").GetDirectory("es2015PRE").WriteObject(new_scale_sys, "alphaZee_errSyst")
-output_file.GetDirectory("Resolution").GetDirectory("es2015PRE").WriteObject(new_ct_sys, "ctZee_errSyst")
+output_file.GetDirectory("Scales").GetDirectory(
+    "es2015PRE").WriteObject(new_scale_sys, "alphaZee_errSyst")
+output_file.GetDirectory("Resolution").GetDirectory(
+    "es2015PRE").WriteObject(new_ct_sys, "ctZee_errSyst")
 
 legend3 = ROOT.TLegend(0.6, 0.7, 0.9, 0.9)
 legend3.SetBorderSize(0)
@@ -277,8 +286,10 @@ legend4.Draw()
 # stefano input for sensitivity
 
 stefano_file = ROOT.TFile("egammaEnergyCorrectionDataMC15.root")
-copy_dir(stefano_file.GetDirectory("PSRecalibration"), output_file.GetDirectory("PSRecalibration").GetDirectory("es2015PRE"))
-copy_dir(stefano_file.GetDirectory("S1Recalibration"), output_file.GetDirectory("S1Recalibration").GetDirectory("es2015PRE"))
+copy_dir(stefano_file.GetDirectory("PSRecalibration"),
+         output_file.GetDirectory("PSRecalibration").GetDirectory("es2015PRE"))
+copy_dir(stefano_file.GetDirectory("S1Recalibration"),
+         output_file.GetDirectory("S1Recalibration").GetDirectory("es2015PRE"))
 
 # correction for uA2MeV first week 2015
 
@@ -286,4 +297,4 @@ f_ua2mev = ROOT.TFile.Open("~/uA2MeV.root")
 histo_ua2mev = f_ua2mev.Get("histo_uA2MeV_week12")
 output_file.Get("Scales").Get("es2015PRE").WriteTObject(histo_ua2mev)
 
-raw_input()
+input("Press Key")
diff --git a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/dump_layer.py b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/dump_layer.py
index 42f5aa849b45..53d0d86e2708 100644
--- a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/dump_layer.py
+++ b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/dump_layer.py
@@ -31,26 +31,34 @@ def main(path, particle):
 
     layers = "rawcl_Es0", "rawcl_Es1", "rawcl_Es2", "rawcl_Es3"
     layers = [prefix + "_" + v for v in layers]
-    title = ["ratio_Es0_true_E", "ratio_Es1_true_E", "ratio_Es2_true_E", "ratio_Es3_true_E"]
+    title = ["ratio_Es0_true_E",
+             "ratio_Es1_true_E",
+             "ratio_Es2_true_E",
+             "ratio_Es3_true_E"]
     aetaCalo = "abs(" + prefix + "_" + "cl_etaCalo" + ")"
     truth_E = prefix + "_truth_E"
-    ratio_layers = ["%s / %s" % (l, truth_E) for l in layers]
+    ratio_layers = ["%s / %s" % (layer, truth_E) for layer in layers]
     truth_eta = prefix + "_truth_eta"
     truth_pt = "(%s / cosh(%s))" % (truth_E, truth_eta)
-    matched = "abs(({0}_rawcl_Es0 + {0}_rawcl_Es1 + {0}_rawcl_Es2 + {0}_rawcl_Es3)/{0}_truth_E - 1)<1".format(prefix)
+    matched = ("abs(({0}_rawcl_Es0 + "
+               "{0}_rawcl_Es1 + {0}_rawcl_Es2 + "
+               "{0}_rawcl_Es3)/{0}_truth_E - 1)<1").format(prefix)
     vars_to_plot = ratio_layers
     selection += " && " + "(" + matched + ")"
 
     pt_binning = [0, 5E3, 10E3, 15E3, 20E3,
-                  30E3, 35E3, 40E3, 45E3, 50E3, 55E3, 60E3, 65E3, 70E3, 75E3, 80E3, 85E3, 90E3,
+                  30E3, 35E3, 40E3, 45E3, 50E3, 55E3, 60E3, 65E3,
+                  70E3, 75E3, 80E3, 85E3, 90E3,
                   100E3, 110E3, 120E3, 130E3,
                   140E3, 160E3, 180E3, 200E3, 220E3,
                   250E3, 300E3, 350E3, 400E3, 450E3, 500E3, 550E3, 600E3,
                   700E3, 800E3, 900E3, 1000E3,
                   1200E3, 1400E3, 1600E3, 1800E3, 2000E3,
                   2500E3]
-    aeta_binning = [0, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.75, 0.8, 0.85, 0.9, 1.0,
-                    1.1, 1.2, 1.3, 1.425, 1.550, 1.6, 1.65, 1.7, 1.75, 1.8, 1.9, 2.0, 2.1,
+    aeta_binning = [0, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6,
+                    0.7, 0.75, 0.8, 0.85, 0.9, 1.0,
+                    1.1, 1.2, 1.3, 1.425, 1.550, 1.6,
+                    1.65, 1.7, 1.75, 1.8, 1.9, 2.0, 2.1,
                     2.2, 2.3, 2.35, 2.4, 2.5]
     pt_binning = array('d', pt_binning)
     aeta_binning = array('d', aeta_binning)
@@ -62,7 +70,8 @@ def main(path, particle):
 
     print("plotting counting")
     histo_name = "histo_count_%s" % particle
-    histo_count = ROOT.TH2F(histo_name, "count %s" % particle, len(pt_binning) - 1, pt_binning, len(aeta_binning) - 1, aeta_binning)
+    histo_count = ROOT.TH2F(histo_name, "count %s" % particle, len(
+        pt_binning) - 1, pt_binning, len(aeta_binning) - 1, aeta_binning)
     chain.Draw(aetaCalo + ":" + truth_pt + ">>" + histo_name, selection)
 
     result = []
@@ -73,7 +82,8 @@ def main(path, particle):
             sel = selection + " && abs(ph_zconv) < 5000"
         else:
             sel = selection
-        histo = ROOT.TProfile2D(histo_name, t, len(pt_binning) - 1, pt_binning, len(aeta_binning) - 1, aeta_binning)
+        histo = ROOT.TProfile2D(histo_name, t, len(
+            pt_binning) - 1, pt_binning, len(aeta_binning) - 1, aeta_binning)
         arg = v + ":" + aetaCalo + ":" + truth_pt + ">>" + histo_name
         chain.Draw(arg, sel, "profcolz")
         histo.GetXaxis().SetTitle("true pT [MeV]")
@@ -82,10 +92,18 @@ def main(path, particle):
     result.append(histo_count)
     return result
 
+
 if __name__ == "__main__":
     output_file = ROOT.TFile.Open("average_layers.root", "recreate")
-    result = main("/storage_tmp/atlas/MVA2015/inputs_MC15/photon_grid_v5/data-output/*/*.root", "unconv")
-    result += main("/storage_tmp/atlas/MVA2015/inputs_MC15/photon_grid_v5/data-output/*/*.root", "conv")
-    result += main("/storage_tmp/atlas/MVA2015/inputs_MC15/electron_local_v5.1/data-output/mc15_electron.root", "electron")
+    result = main(
+        "/storage_tmp/atlas/MVA2015/inputs_MC15/"
+        "photon_grid_v5/data-output/*/*.root",
+        "unconv")
+    result += main("/storage_tmp/atlas/MVA2015/inputs_MC15/"
+                   "photon_grid_v5/data-output/*/*.root",
+                   "conv")
+    result += main("/storage_tmp/atlas/MVA2015/inputs_MC15/"
+                   "electron_local_v5.1/data-output/mc15_electron.root",
+                   "electron")
     for r in result:
         r.Write()
diff --git a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/merge_scale_histograms.py b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/merge_scale_histograms.py
index 12548deec608..0e461885105a 100755
--- a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/merge_scale_histograms.py
+++ b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/merge_scale_histograms.py
@@ -3,21 +3,26 @@
 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 
+from array import array
+import logging
+import ROOT
 doc = """
 This is an utility to merge histograms. The common case is when you have
 old scale factors for the whole calorimeter and new scale factor only for
 a subpart.
 """
 
-import ROOT
 ROOT.PyConfig.IgnoreCommandLineOptions = True
-import logging
 logging.basicConfig(level=logging.INFO)
-from array import array
+
 
 def merge_histograms(old, new, merge_error=True):
-    print("old binning: " + ", ".join(("%.3f" % old.GetBinLowEdge(ibin)) for ibin in xrange(1, old.GetNbinsX() + 2)))
-    print("new binning: " + ", ".join(("%.3f" % new.GetBinLowEdge(ibin)) for ibin in xrange(1, new.GetNbinsX() + 2)))
+    print("old binning: " + ", ".join(("%.3f" % old.GetBinLowEdge(ibin))
+                                      for ibin in range(1, old.GetNbinsX()
+                                                        + 2)))
+    print("new binning: " + ", ".join(("%.3f" % new.GetBinLowEdge(ibin))
+                                      for ibin in range(1, new.GetNbinsX()
+                                                        + 2)))
 
     new_binning = []
     new_values = []
@@ -25,24 +30,24 @@ def merge_histograms(old, new, merge_error=True):
     UNDERFLOW = 0
     OVERFLOW = new.GetNbinsX() + 1
 
-    for iold in xrange(1, old.GetNbinsX()):
-        l = old.GetBinLowEdge(iold)
-        r = l + old.GetBinWidth(iold)
+    for iold in range(1, old.GetNbinsX()):
+        low = old.GetBinLowEdge(iold)
+        r = low + old.GetBinWidth(iold)
 
-        il_new = new.FindFixBin(l)
+        il_new = new.FindFixBin(low)
         ir_new = new.FindFixBin(r)
         remainer = None
 
         if il_new == UNDERFLOW and ir_new == UNDERFLOW:
-            print("1. adding %.3f - %.3f from old" % (l, r))
-            new_binning.append((l, r))
+            print("1. adding %.3f - %.3f from old" % (low, r))
+            new_binning.append((low, r))
             new_values.append(old.GetBinContent(iold))
             new_errors.append(old.GetBinError(iold))
 
         elif il_new == UNDERFLOW and ir_new > UNDERFLOW:
-            if abs(new.GetBinLowEdge(1) - l) < 1E-100:
+            if abs(new.GetBinLowEdge(1) - low) < 1E-100:
                 continue
-            new_binning.append((l, new.GetBinLowEdge(1)))
+            new_binning.append((low, new.GetBinLowEdge(1)))
             new_values.append(old.GetBinContent(iold))
             new_errors.append(old.GetBinError(iold))
             if ir_new == OVERFLOW:
@@ -51,30 +56,24 @@ def merge_histograms(old, new, merge_error=True):
             break
     last_old = iold
 
-    for inew in xrange(1, new.GetNbinsX() + 1):
-        l = new.GetBinLowEdge(inew)
-        r = l + new.GetBinWidth(inew)
-        print("2. adding %.3f - %.3f from new" % (l, r))
-        new_binning.append((l, r))
+    for inew in range(1, new.GetNbinsX() + 1):
+        low = new.GetBinLowEdge(inew)
+        r = low + new.GetBinWidth(inew)
+        print("2. adding %.3f - %.3f from new" % (low, r))
+        new_binning.append((low, r))
         new_values.append(new.GetBinContent(inew))
         new_errors.append(new.GetBinError(inew))
-    """
-    if remainer is not None:
-        print("3. adding %.3f - %.3f from old" % (new.GetBinLowEdge(new.GetNbinsX()), old.GetBinLowEdge(remainer) + old.GetBinWidth(remainer)))
-        new_binning.append((new.GetBinLowEdge(new.GetNbinsX()), old.GetBinLowEdge(remainer) + old.GetBinWidth(remainer)))
-        new_values.append(old.GetBinContent(remainer))
-        new_errors.append(old.GetBinError(remainer))
-    """
-    for iold in xrange(last_old, old.GetNbinsX() + 1):
-        l = old.GetBinLowEdge(iold)
-        r = l + old.GetBinWidth(iold)
-
-        il_new = new.FindFixBin(l)
+
+    for iold in range(last_old, old.GetNbinsX() + 1):
+        low = old.GetBinLowEdge(iold)
+        r = low + old.GetBinWidth(iold)
+
+        il_new = new.FindFixBin(low)
         ir_new = new.FindFixBin(r)
 
         if il_new == OVERFLOW and ir_new == OVERFLOW:
-            print("4. adding %.3f - %.3f from old" % (l, r))
-            new_binning.append((l, r))
+            print("4. adding %.3f - %.3f from old" % (low, r))
+            new_binning.append((low, r))
             new_values.append(old.GetBinContent(iold))
             new_errors.append(old.GetBinError(iold))
         elif il_new < OVERFLOW and ir_new == OVERFLOW:
@@ -87,19 +86,20 @@ def merge_histograms(old, new, merge_error=True):
     print(new_binning)
     new_edges = array('f', [x[0] for x in new_binning] + [new_binning[-1][1]])
     histo_type = type(new)
-    result = histo_type(new.GetName(), new.GetTitle(), len(new_edges) - 1, new_edges)
+    result = histo_type(new.GetName(), new.GetTitle(),
+                        len(new_edges) - 1, new_edges)
     for i, (v, e) in enumerate(zip(new_values, new_errors), 1):
         result.SetBinContent(i, v)
         if merge_error:
             result.SetBinError(i, e)
 
-    print("merged binning: " + ", ".join(("%.3f" % result.GetBinLowEdge(ibin)) for ibin in xrange(1, result.GetNbinsX() + 1)))
-
+    print("merged binning: " + ", ".join(("%.3f" % result.GetBinLowEdge(ibin))
+                                         for ibin in range(1, result.GetNbinsX()
+                                         + 1)))
 
     return result
 
 
-
 if __name__ == "__main__":
     try:
         ROOT.gROOT.ProcessLine(".x ~/atlasstyle/AtlasStyle.C")
@@ -110,20 +110,13 @@ if __name__ == "__main__":
     import argparse
 
     parser = argparse.ArgumentParser(description=doc,
-                                     formatter_class=argparse.RawTextHelpFormatter,
-                                     epilog='''example (merge scales 2015PRE + 2015 summer): ./merge_scale_histograms.py ../../RootCoreBin/download/ElectronPhotonFourMomentumCorrection/v7/egammaEnergyCorrectionData.root:Scales/es2015PRE/alphaZee_errStat ~/Scaricati/EnergyScaleFactors.root:centVal_alpha --title="2015 summer" --name alphaZee_errStat
-
-example (merge ct 2015PRE + 2015 summer): ./merge_scale_histograms.py ../../RootCoreBin/download/ElectronPhotonFourMomentumCorrection/v7/egammaEnergyCorrectionData.root:Resolution/es2015PRE/ctZee_errStat ~/Scaricati/EnergyScaleFactors.root:centVal_c --title "2015 summer" --name ctZee_errStat
-
-example (merge scales sys 2015PRE + 2015 summer):  ./merge_scale_histograms.py ../../RootCoreBin/download/ElectronPhotonFourMomentumCorrection/v7/egammaEnergyCorrectionData.root:Scales/es2015PRE/alphaZee_errSyst ~/Scaricati/EnergyScaleFactors.root:totSyst_alpha --title="2015 summer" --name alphaZee_errSyst
-
-example (merge ct sys 2015PRE + 2015 summer): ./merge_scale_histograms.py ../../RootCoreBin/download/ElectronPhotonFourMomentumCorrection/v7/egammaEnergyCorrectionData.root:Resolution/es2015PRE_res_improved/ctZee_errSyst ~/Scaricati/EnergyScaleFactors.root:totSyst_c --title="2015 summer" --name ctZee_errSyst
-''')
+                                     formatter_class=argparse.RawTextHelpFormatter)
     parser.add_argument('histo_old')
     parser.add_argument('histo_new')
     parser.add_argument('--title', help='title of the new histogram')
     parser.add_argument('--name', help='name of the new histogram')
-    parser.add_argument('--recreate', help='create a new file', action='store_true')
+    parser.add_argument(
+        '--recreate', help='create a new file', action='store_true')
     parser.add_argument('--output-filename', default='output.root')
 
     args = parser.parse_args()
@@ -139,7 +132,8 @@ example (merge ct sys 2015PRE + 2015 summer): ./merge_scale_histograms.py ../../
     if not histo_new:
         raise IOError("cannot find histogram %s" % args.histo_new)
 
-    logging.info("going to merge %s with %s", histo_old.GetName(), histo_new.GetName())
+    logging.info("going to merge %s with %s",
+                 histo_old.GetName(), histo_new.GetName())
     histo_merged = merge_histograms(histo_old, histo_new)
 
     canvas = ROOT.TCanvas()
@@ -159,11 +153,12 @@ example (merge ct sys 2015PRE + 2015 summer): ./merge_scale_histograms.py ../../
     legend.SetBorderSize(0)
     legend.Draw()
 
-    fout = ROOT.TFile.Open(args.output_filename, "recreate" if args.recreate else "update")
+    fout = ROOT.TFile.Open(args.output_filename,
+                           "recreate" if args.recreate else "update")
     if args.title is not None:
         histo_merged.SetTitle(args.title)
     name = args.name or histo_old.GetName()
     histo_merged.SetName(name)
     histo_merged.Write()
 
-    raw_input()
+    input("press a key")
-- 
GitLab


From e5067f56d856f4a8960297e865b29f7fed92b902 Mon Sep 17 00:00:00 2001
From: christos <christos@cern.ch>
Date: Thu, 17 Dec 2020 23:30:23 +0100
Subject: [PATCH 135/225] Some more flake8 related tests , for the .py under
 the test folder

---
 .../test/ut_test.py                           | 245 ++++++++++++------
 .../test/ut_test_factory.py                   |  41 +--
 .../test/ut_test_resolution.py                |  68 +++--
 3 files changed, 232 insertions(+), 122 deletions(-)

diff --git a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/test/ut_test.py b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/test/ut_test.py
index ce598840a5fd..7d51513b54e2 100755
--- a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/test/ut_test.py
+++ b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/test/ut_test.py
@@ -10,6 +10,7 @@ import random
 RUN2016 = 297730l
 RUN2015 = 252604l
 
+
 def arange(xmin, xmax, delta):
     # just to don't inject dep from numpy
     result = []
@@ -35,7 +36,8 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
     def setUpClass(cls):
         cls.event = ROOT.xAOD.TEvent()
         cls.factory = ROOT.EgammaFactory()
-        cls.tool_es2012c = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_es2012c")
+        cls.tool_es2012c = ROOT.CP.EgammaCalibrationAndSmearingTool(
+            "tool_es2012c")
 
     def test_initialization(self):
         tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool")
@@ -48,14 +50,19 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
         self.assertTrue(tool.setProperty("ESModel", "es2010").isSuccess())
         self.assertTrue(tool.initialize().isSuccess())
 
-    def generator_kinematics(self, eta_range=None, e_range=None, phi_range=None):
+    def generator_kinematics(self, eta_range=None,
+                             e_range=None,
+                             phi_range=None):
         eta_range = eta_range or arange(-2.49, 2.49, 0.05)
         e_range = e_range or arange(5E3, 1000E3, 100E3)
         phi_range = phi_range or [0.]
         from itertools import product
         return product(e_range, eta_range, phi_range)
 
-    def generator_photon(self, eta_range=None, e_range=None, phi_range=None):
+    def generator_photon(self,
+                         eta_range=None,
+                         e_range=None,
+                         phi_range=None):
         random.seed(10)
         factory = self.factory
         for e, eta, phi in self.generator_kinematics(eta_range, e_range, phi_range):
@@ -66,21 +73,34 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
                 yield factory.create_unconverted_photon(eta, phi, e)
         factory.clear()
 
-    def generator_converted(self, eta_range=None, e_range=None, phi_range=None):
+    def generator_converted(self, eta_range=None,
+                            e_range=None,
+                            phi_range=None):
         factory = self.factory
-        for e, eta, phi in self.generator_kinematics(eta_range, e_range, phi_range):
+        for e, eta, phi in self.generator_kinematics(eta_range,
+                                                     e_range,
+                                                     phi_range):
             yield factory.create_converted_photon(eta, phi, e)
         factory.clear()
 
-    def generator_unconverted(self, eta_range=None, e_range=None, phi_range=None):
+    def generator_unconverted(self, eta_range=None,
+                              e_range=None,
+                              phi_range=None):
         factory = self.factory
-        for e, eta, phi in self.generator_kinematics(eta_range, e_range, phi_range):
+        for e, eta, phi in self.generator_kinematics(eta_range,
+                                                     e_range,
+                                                     phi_range):
             yield factory.create_unconverted_photon(eta, phi, e)
         factory.clear()
 
-    def generator_electron(self, eta_range=None, e_range=None, phi_range=None):
+    def generator_electron(self,
+                           eta_range=None,
+                           e_range=None,
+                           phi_range=None):
         factory = self.factory
-        for e, eta, phi in self.generator_kinematics(eta_range, e_range, phi_range):
+        for e, eta, phi in self.generator_kinematics(eta_range,
+                                                     e_range,
+                                                     phi_range):
             yield factory.create_electron(eta, phi, e)
         factory.clear()
 
@@ -96,7 +116,8 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
         """
         tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool")
         self.assertTrue(tool.setProperty("ESModel", "es2012c").isSuccess())
-        self.assertTrue(tool.setProperty("int")("randomRunNumber", RUN2015).isSuccess())
+        self.assertTrue(tool.setProperty("int")(
+            "randomRunNumber", RUN2015).isSuccess())
         self.assertTrue(tool.setProperty("int")("doSmearing", 0).isSuccess())
         tool.msg().setLevel(ROOT.MSG.WARNING)
 
@@ -118,7 +139,8 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
         tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_2015PRE")
         self.assertTrue(tool.setProperty("ESModel", "es2015PRE").isSuccess())
         self.assertTrue(tool.setProperty("int")("doSmearing", 0).isSuccess())
-        self.assertTrue(tool.setProperty("decorrelationModel", "1NP_v1"). isSuccess())
+        self.assertTrue(tool.setProperty(
+            "decorrelationModel", "1NP_v1"). isSuccess())
         tool.msg().setLevel(ROOT.MSG.WARNING)
         self.assertTrue(tool.initialize().isSuccess())
         ei = self.factory.create_eventinfo(True, 100000)   # simulation
@@ -141,12 +163,15 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
         ei = self.factory.create_eventinfo(True, 100000)   # simulation
         for el in self.generator_electron():
             e_before = el.e()
-            e_cluster = el.caloCluster().energyBE(0) + el.caloCluster().energyBE(1) + el.caloCluster().energyBE(2) + el.caloCluster().energyBE(3)
+            e_cluster = el.caloCluster().energyBE(0) + el.caloCluster().energyBE(1) + \
+                el.caloCluster().energyBE(2) + el.caloCluster().energyBE(3)
             tool.applyCorrection(el, ei)
             e_after = el.e()
             if e_before > 7E3:
                 self.assertTrue(abs(e_before / e_after - 1) < 0.5,
-                                msg="energy cluser/calibrated very different at eta = %f: %f/%f, e0=%.2f, e1=%.2f, e2=%.2f, e3=%.2f" % (el.eta(), e_cluster, e_after, el.caloCluster().energyBE(0), el.caloCluster().energyBE(1), el.caloCluster().energyBE(2), el.caloCluster().energyBE(3)))
+                                msg="energy cluser/calibrated very different at eta = %f: %f/%f, e0=%.2f, e1=%.2f, e2=%.2f, e3=%.2f" % (el.eta(),
+                                                                                                                                        e_cluster, e_after, el.caloCluster().energyBE(0), el.caloCluster().energyBE(1),
+                                                                                                                                        el.caloCluster().energyBE(2), el.caloCluster().energyBE(3)))
             self.assertGreater(e_after, 0)
 
     def test_es2012XX(self):
@@ -264,11 +289,14 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
         import random
         import csv
         with open("testmva_%s_%s_%s.csv" % (esmodel, particle, "data" if isdata else "fullsim"), 'wb') as csvfile:
-            spamwriter = csv.writer(csvfile, delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL)
+            spamwriter = csv.writer(
+                csvfile, delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL)
             if particle == "photon":
-                spamwriter.writerow(('eta', 'phi', 'e0', 'e1', 'e2', 'e3', 'e', 'rconv', 'zconv', 'output'))
+                spamwriter.writerow(
+                    ('eta', 'phi', 'e0', 'e1', 'e2', 'e3', 'e', 'rconv', 'zconv', 'output'))
             elif particle == "electron":
-                spamwriter.writerow(('eta', 'phi', 'e0', 'e1', 'e2', 'e3', 'e', 'output'))
+                spamwriter.writerow(
+                    ('eta', 'phi', 'e0', 'e1', 'e2', 'e3', 'e', 'output'))
 
             for eta in arange(-3.0, 3.0, 0.05):
                 phi = 0
@@ -321,11 +349,13 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
 
         import os
         basedir = os.path.dirname(os.path.abspath(__file__))
-        filename = os.path.join(basedir, "testmva_%s_%s_%s.csv" % (esmodel, particle, "data" if isdata else "fullsim"))
+        filename = os.path.join(basedir, "testmva_%s_%s_%s.csv" % (
+            esmodel, particle, "data" if isdata else "fullsim"))
 
         import csv
         with open(filename, 'rb') as csvfile:
-            reader = csv.reader(csvfile, delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL)
+            reader = csv.reader(csvfile, delimiter=' ',
+                                quotechar='|', quoting=csv.QUOTE_MINIMAL)
             next(reader, None)  # skip header
             for row in reader:
                 args = map(float, row[:-1])
@@ -333,7 +363,8 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
                      'photon': self.factory.create_photon}[particle](*args)
                 tool.applyCorrection(p, ei)
                 calibrated_energy = p.e()
-                self.assertAlmostEqual(calibrated_energy, float(row[-1]), delta=0.1)
+                self.assertAlmostEqual(
+                    calibrated_energy, float(row[-1]), delta=0.1)
         self.factory.clear()
 
     def test_list_syst(self):
@@ -347,56 +378,84 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
             """
             tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool")
             tool.msg().setLevel(ROOT.MSG.WARNING)
-            self.assertTrue(tool.setProperty("int")("useMVACalibration", 0).isSuccess())
+            self.assertTrue(tool.setProperty("int")(
+                "useMVACalibration", 0).isSuccess())
             self.assertTrue(tool.setProperty("ESModel", model).isSuccess())
             if decorrelation is not None:
-                self.assertTrue(tool.setProperty("decorrelationModel", decorrelation).isSuccess())
+                self.assertTrue(tool.setProperty(
+                    "decorrelationModel", decorrelation).isSuccess())
             if decorrelation_scale is not None:
-                self.assertTrue(tool.setProperty("decorrelationModelScale", decorrelation_scale).isSuccess())
+                self.assertTrue(tool.setProperty(
+                    "decorrelationModelScale", decorrelation_scale).isSuccess())
             if decorrelation_resolution is not None:
-                self.assertTrue(tool.setProperty("decorrelationModelResolution", decorrelation_resolution).isSuccess())
+                self.assertTrue(tool.setProperty(
+                    "decorrelationModelResolution", decorrelation_resolution).isSuccess())
 
             tool.msg().setLevel(ROOT.MSG.WARNING)
             if success:
-                self.assertTrue(tool.initialize().isSuccess(), msg='cannot initialize tool with %s' % model)
+                self.assertTrue(tool.initialize().isSuccess(),
+                                msg='cannot initialize tool with %s' % model)
             else:
-                self.assertFalse(tool.initialize().isSuccess(), msg='should not possible to initialize tool with %s' % model)
+                self.assertFalse(tool.initialize().isSuccess(
+                ), msg='should not possible to initialize tool with %s' % model)
                 return
             sys_list = get_names_sys(tool)
             if type(allsyst) is int:
-                self.assertEqual(len(sys_list), allsyst, msg='actual (expected) number of sys %d(%d): %s' % (len(sys_list), allsyst, sys_list))
+                self.assertEqual(len(sys_list), allsyst, msg='actual (expected) number of sys %d(%d): %s' % (
+                    len(sys_list), allsyst, sys_list))
             else:
                 self.assertItemsEqual(sys_list, allsyst)
             return sys_list
 
-
         list_1NP_scale = ['EG_SCALE_ALL__1down', 'EG_SCALE_ALL__1up']
-        list_1NP_resolution = ['EG_RESOLUTION_ALL__1down', 'EG_RESOLUTION_ALL__1up']
-        list_FULL_resolution = ['EG_RESOLUTION_MATERIALCALO__1down', 'EG_RESOLUTION_MATERIALCALO__1up',
-                                'EG_RESOLUTION_MATERIALCRYO__1down', 'EG_RESOLUTION_MATERIALCRYO__1up',
-                                'EG_RESOLUTION_MATERIALGAP__1down', 'EG_RESOLUTION_MATERIALGAP__1up',
-                                'EG_RESOLUTION_MATERIALID__1down', 'EG_RESOLUTION_MATERIALID__1up',
-                                'EG_RESOLUTION_PILEUP__1down', 'EG_RESOLUTION_PILEUP__1up',
-                                'EG_RESOLUTION_SAMPLINGTERM__1down', 'EG_RESOLUTION_SAMPLINGTERM__1up',
-                                'EG_RESOLUTION_ZSMEARING__1down', 'EG_RESOLUTION_ZSMEARING__1up']
-        list_1NPCOR_PLUS_UNCOR_scale = ['EG_SCALE_ALLCORR__1down', 'EG_SCALE_ALLCORR__1up',
-                                        'EG_SCALE_E4SCINTILLATOR__1down', 'EG_SCALE_E4SCINTILLATOR__1up',
-                                        'EG_SCALE_LARCALIB_EXTRA2015PRE__1down', 'EG_SCALE_LARCALIB_EXTRA2015PRE__1up',
-                                        'EG_SCALE_LARTEMPERATURE_EXTRA2015PRE__1down', 'EG_SCALE_LARTEMPERATURE_EXTRA2015PRE__1up',
-                                        'EG_SCALE_LARTEMPERATURE_EXTRA2016PRE__1down', 'EG_SCALE_LARTEMPERATURE_EXTRA2016PRE__1up']
-        _test_list_syst("es2015PRE", "1NP_v1", None, None, list_1NP_scale + list_1NP_resolution)
-        _test_list_syst("es2012c", "1NP_v1", None, None, list_1NP_scale + list_1NP_resolution)
-        _test_list_syst("es2016PRE", None, "1NP_v1", "1NP_v1", list_1NP_scale + list_1NP_resolution)
-        _test_list_syst("es2016PRE", None, "1NP_v1", "FULL_v1", list_1NP_scale + list_FULL_resolution)
-        _test_list_syst("es2015PRE", "1NPCOR_PLUS_UNCOR", None, None, list_1NP_resolution + list_1NPCOR_PLUS_UNCOR_scale)
-        _test_list_syst("es2015PRE", "1NP_v1", "1NPCOR_PLUS_UNCOR", None, list_1NP_resolution + list_1NPCOR_PLUS_UNCOR_scale)
-        _test_list_syst("es2015c_summer", "1NP_v1", None, None, list_1NP_scale + list_1NP_resolution)
+        list_1NP_resolution = [
+            'EG_RESOLUTION_ALL__1down', 'EG_RESOLUTION_ALL__1up']
+        list_FULL_resolution = ['EG_RESOLUTION_MATERIALCALO__1down',
+                                'EG_RESOLUTION_MATERIALCALO__1up',
+                                'EG_RESOLUTION_MATERIALCRYO__1down',
+                                'EG_RESOLUTION_MATERIALCRYO__1up',
+                                'EG_RESOLUTION_MATERIALGAP__1down',
+                                'EG_RESOLUTION_MATERIALGAP__1up',
+                                'EG_RESOLUTION_MATERIALID__1down',
+                                'EG_RESOLUTION_MATERIALID__1up',
+                                'EG_RESOLUTION_PILEUP__1down',
+                                'EG_RESOLUTION_PILEUP__1up',
+                                'EG_RESOLUTION_SAMPLINGTERM__1down',
+                                'EG_RESOLUTION_SAMPLINGTERM__1up',
+                                'EG_RESOLUTION_ZSMEARING__1down',
+                                'EG_RESOLUTION_ZSMEARING__1up']
+        list_1NPCOR_PLUS_UNCOR_scale = ['EG_SCALE_ALLCORR__1down',
+                                        'EG_SCALE_ALLCORR__1up',
+                                        'EG_SCALE_E4SCINTILLATOR__1down',
+                                        'EG_SCALE_E4SCINTILLATOR__1up',
+                                        'EG_SCALE_LARCALIB_EXTRA2015PRE__1down',
+                                        'EG_SCALE_LARCALIB_EXTRA2015PRE__1up',
+                                        'EG_SCALE_LARTEMPERATURE_EXTRA2015PRE__1down',
+                                        'EG_SCALE_LARTEMPERATURE_EXTRA2015PRE__1up',
+                                        'EG_SCALE_LARTEMPERATURE_EXTRA2016PRE__1down',
+                                        'EG_SCALE_LARTEMPERATURE_EXTRA2016PRE__1up']
+        _test_list_syst("es2015PRE", "1NP_v1", None, None,
+                        list_1NP_scale + list_1NP_resolution)
+        _test_list_syst("es2012c", "1NP_v1", None, None,
+                        list_1NP_scale + list_1NP_resolution)
+        _test_list_syst("es2016PRE", None, "1NP_v1", "1NP_v1",
+                        list_1NP_scale + list_1NP_resolution)
+        _test_list_syst("es2016PRE", None, "1NP_v1", "FULL_v1",
+                        list_1NP_scale + list_FULL_resolution)
+        _test_list_syst("es2015PRE", "1NPCOR_PLUS_UNCOR", None,
+                        None, list_1NP_resolution + list_1NPCOR_PLUS_UNCOR_scale)
+        _test_list_syst("es2015PRE", "1NP_v1", "1NPCOR_PLUS_UNCOR",
+                        None, list_1NP_resolution + list_1NPCOR_PLUS_UNCOR_scale)
+        _test_list_syst("es2015c_summer", "1NP_v1", None, None,
+                        list_1NP_scale + list_1NP_resolution)
 
         _test_list_syst("es2015PRE", "FULL_ETACORRELATED_v1", None, None, 58)
         _test_list_syst("es2012c", "FULL_ETACORRELATED_v1", None, None, 54)
         _test_list_syst("es2016PRE", "FULL_ETACORRELATED_v1", None, None, 62)
-        _test_list_syst("es2015c_summer", "FULL_ETACORRELATED_v1", None, None, 60)
-        _test_list_syst("es2016data_mc15c",  "FULL_ETACORRELATED_v1", None, None, 68)
+        _test_list_syst("es2015c_summer",
+                        "FULL_ETACORRELATED_v1", None, None, 60)
+        _test_list_syst("es2016data_mc15c",
+                        "FULL_ETACORRELATED_v1", None, None, 68)
         _test_list_syst("es2012c", "FULL_v1", None, None, 148)
         _test_list_syst("es2012c", None, "FULL_v1", "FULL_v1", 148)
         _test_list_syst("es2015PRE", "FULL_v1", None, None, 158)
@@ -404,9 +463,8 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
         _test_list_syst("es2015PRE", None, None, None, 158)
 
         # these works, but generate FATALS, as expected
-        _test_list_syst("es2016PRE", "1NP_v1", "1NP_v1", "1NP_v1", [], success=False)
-
-
+        _test_list_syst("es2016PRE", "1NP_v1", "1NP_v1",
+                        "1NP_v1", [], success=False)
 
     def test_same_smearing(self):
         tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool")
@@ -462,7 +520,8 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
             tool.applySystematicVariation(sys_set).ignore()
             e_zee_syst = tool.getEnergy(ph, ei)
             sys_set = ROOT.CP.SystematicSet()
-            sys_set.insert(ROOT.CP.SystematicVariation("EG_SCALE_LARCALIB__ETABIN0", 1.))
+            sys_set.insert(ROOT.CP.SystematicVariation(
+                "EG_SCALE_LARCALIB__ETABIN0", 1.))
             tool.applySystematicVariation(sys_set).ignore()
             e_larcalib__bin0 = tool.getEnergy(ph, ei)
             if abs(ph.eta()) < 2.47:
@@ -478,9 +537,11 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
     def test_intermodule_correction_working(self):
         tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool")
         self.assertTrue(tool.setProperty("ESModel", "es2012c").isSuccess())
-        tool_no_correction = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_no_correction")
+        tool_no_correction = ROOT.CP.EgammaCalibrationAndSmearingTool(
+            "tool_no_correction")
         tool_no_correction.setProperty("ESModel", "es2012c").ignore()
-        tool_no_correction.setProperty("int")("useIntermoduleCorrection", 0).ignore()
+        tool_no_correction.setProperty("int")(
+            "useIntermoduleCorrection", 0).ignore()
 
         self.assertTrue(tool.initialize().isSuccess())
         self.assertTrue(tool_no_correction.initialize().isSuccess())
@@ -493,7 +554,8 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
             energy.append(tool.getEnergy(ph, ei))
             energy_no_correction.append(tool_no_correction.getEnergy(ph, ei))
 
-        self.assertFalse(all([x == y for x, y in zip(energy, energy_no_correction)]))
+        self.assertFalse(
+            all([x == y for x, y in zip(energy, energy_no_correction)]))
 
     def test_idempotence(self):
         tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_es2015PRE")
@@ -516,23 +578,26 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
 
     def test_1NP_vs_FULL_es2017(self):
         """ check that the 1NP model is the squared sum of the single systematics """
-        tool_1NP = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_es2016data_mc15c_1NP")
+        tool_1NP = ROOT.CP.EgammaCalibrationAndSmearingTool(
+            "tool_es2016data_mc15c_1NP")
         tool_1NP.setProperty("ESModel", "es2016data_mc15c").ignore()
         tool_1NP.setProperty("decorrelationModel", "1NP_v1").ignore()
         tool_1NP.setProperty("int")("randomRunNumber", RUN2015).ignore()
-        #tool_1NP.setProperty("int")("doSmearing", 0).ignore()   # remove
-        #tool_1NP.msg().setLevel(ROOT.MSG.DEBUG)
+        # tool_1NP.setProperty("int")("doSmearing", 0).ignore()   # remove
+        # tool_1NP.msg().setLevel(ROOT.MSG.DEBUG)
 
         tool_1NP.initialize().ignore()
 
-        tool_FULL = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_es2016data_mc15c_FULL")
+        tool_FULL = ROOT.CP.EgammaCalibrationAndSmearingTool(
+            "tool_es2016data_mc15c_FULL")
         tool_FULL.setProperty("ESModel", "es2016data_mc15c").ignore()
         tool_FULL.setProperty("int")("randomRunNumber", RUN2015).ignore()
         # use ETACORRELATED to compare. FULL_v1 will differ (very small difference) since by default
         # FULL_v1 divide the ZEESTAT by the sqrt(#bins)
-        tool_FULL.setProperty("decorrelationModel", "FULL_ETACORRELATED_v1").ignore()
-        #tool_FULL.setProperty("int")("doSmearing", 0).ignore()    # remove
-        #tool_FULL.msg().setLevel(ROOT.MSG.DEBUG)
+        tool_FULL.setProperty("decorrelationModel",
+                              "FULL_ETACORRELATED_v1").ignore()
+        # tool_FULL.setProperty("int")("doSmearing", 0).ignore()    # remove
+        # tool_FULL.msg().setLevel(ROOT.MSG.DEBUG)
         tool_FULL.initialize().ignore()
 
         ei = self.factory.create_eventinfo(True, 100000)  # MC
@@ -550,9 +615,11 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
                 all_syst_FULL = tool_FULL.recommendedSystematics()
                 all_syst_1NP = tool_1NP.recommendedSystematics()
 
-                self.assertTrue('EG_SCALE_ALL__1up' in [s.name() for s in list(all_syst_1NP)])
+                self.assertTrue('EG_SCALE_ALL__1up' in [
+                                s.name() for s in list(all_syst_1NP)])
 
-                all_syst_FULL_scale_up = [s for s in all_syst_FULL if ('SCALE' in s.name() and '__1up' in s.name())]
+                all_syst_FULL_scale_up = [s for s in all_syst_FULL if (
+                    'SCALE' in s.name() and '__1up' in s.name())]
 
                 all_biases = []
                 for sys in all_syst_FULL_scale_up:
@@ -561,12 +628,11 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
                     tool_FULL.applySystematicVariation(sys_set).ignore()
                     e = tool_FULL.getEnergy(particle, ei)
                     bias = e - e_full
-                    #print "{:<40} {:10.5f} {:10.5f}".format(sys.name(), e, bias)
+                    # print "{:<40} {:10.5f} {:10.5f}".format(sys.name(), e, bias)
                     all_biases.append(bias)
 
                 sum_quadrature = math.sqrt(sum([b * b for b in all_biases]))
-                #print "bias sum quadrature: ", sum_quadrature
-
+                # print "bias sum quadrature: ", sum_quadrature
 
                 bias_up, bias_down = None, None
                 for sys in all_syst_1NP:
@@ -581,12 +647,13 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
                         bias_up = bias
                     elif sys.name() == 'EG_SCALE_ALL__1down':
                         bias_down = bias
-                    #print sys.name() + "\t" + str(bias)
-
+                    # print sys.name() + "\t" + str(bias)
 
-                self.assertAlmostEqual(sum_quadrature, bias_up, delta=1, msg="sum of errors not equal to 1NP (up) %.7f!=%.7f" % (sum_quadrature, bias_up))
+                self.assertAlmostEqual(sum_quadrature, bias_up, delta=1,
+                                       msg="sum of errors not equal to 1NP (up) %.7f!=%.7f" % (sum_quadrature, bias_up))
                 # TODO: check why fails
-                #self.assertAlmostEqual(sum_quadrature, -bias_down, delta=1, msg="sum of errors not equal to 1NP (down) %.7f!=%.7f" % (sum_quadrature, bias_down))
+                # self.assertAlmostEqual(sum_quadrature, -bias_down, delta=1, 
+                # msg="sum of errors not equal to 1NP (down) %.7f!=%.7f" % (sum_quadrature, bias_down))
 
     def test_1NP_100GeV_electron_es2015PRE(self):
         """
@@ -595,7 +662,8 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
         """
         tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_es2015PRE")
         self.assertTrue(tool.setProperty("ESModel", "es2015PRE").isSuccess())
-        self.assertTrue(tool.setProperty("decorrelationModel", "1NP_v1").isSuccess())
+        self.assertTrue(tool.setProperty(
+            "decorrelationModel", "1NP_v1").isSuccess())
         tool.msg().setLevel(ROOT.MSG.WARNING)
         tool.initialize().ignore()
         ei = self.factory.create_eventinfo(False, 100000)  # data
@@ -632,13 +700,15 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
         check that es2015cPRE == es2015PRE for electron except for crack region [1.4-1.6]
         check that es2015cPRE == es2015PRE for photons
         """
-        tool_es2015PRE = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_es2015PRE")
+        tool_es2015PRE = ROOT.CP.EgammaCalibrationAndSmearingTool(
+            "tool_es2015PRE")
         tool_es2015PRE.setProperty("ESModel", "es2015PRE").ignore()
         tool_es2015PRE.setProperty("decorrelationModel", "1NP_v1").ignore()
         tool_es2015PRE.setProperty("int")("doSmearing", 0).ignore()
         tool_es2015PRE.initialize().ignore()
 
-        tool_es2015cPRE = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_es2015cPRE")
+        tool_es2015cPRE = ROOT.CP.EgammaCalibrationAndSmearingTool(
+            "tool_es2015cPRE")
         tool_es2015cPRE.setProperty("ESModel", "es2015cPRE").ignore()
         tool_es2015cPRE.setProperty("decorrelationModel", "1NP_v1").ignore()
         tool_es2015cPRE.setProperty("int")("doSmearing", 0).ignore()
@@ -651,7 +721,7 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
             e_es2015PRE = tool_es2015PRE.getEnergy(el, ei)
             e_es2015cPRE = tool_es2015cPRE.getEnergy(el, ei)
 
-            #print el.eta(), el.e(), e_es2015PRE, e_es2015cPRE
+            # print el.eta(), el.e(), e_es2015PRE, e_es2015cPRE
             if 1.4 < abs(el.eta()) < 1.6:
                 self.assertNotAlmostEqual(e_es2015PRE, e_es2015cPRE)
             else:
@@ -670,16 +740,20 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
         check that es2015c_summer == es2015cPRE for electrons
                                   !=            for photons
         """
-        tool_es2015c_summer = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_es2015c_summer")
+        tool_es2015c_summer = ROOT.CP.EgammaCalibrationAndSmearingTool(
+            "tool_es2015c_summer")
         tool_es2015c_summer.setProperty("ESModel", "es2015c_summer").ignore()
-        tool_es2015c_summer.setProperty("decorrelationModel", "1NPCOR_PLUS_UNCOR").ignore()
+        tool_es2015c_summer.setProperty(
+            "decorrelationModel", "1NPCOR_PLUS_UNCOR").ignore()
         tool_es2015c_summer.setProperty("int")("doSmearing", 0).ignore()
         tool_es2015c_summer.msg().setLevel(ROOT.MSG.WARNING)
         tool_es2015c_summer.initialize().ignore()
 
-        tool_es2015cPRE = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_es2015cPRE")
+        tool_es2015cPRE = ROOT.CP.EgammaCalibrationAndSmearingTool(
+            "tool_es2015cPRE")
         tool_es2015cPRE.setProperty("ESModel", "es2015cPRE").ignore()
-        tool_es2015cPRE.setProperty("decorrelationModel", "1NPCOR_PLUS_UNCOR").ignore()
+        tool_es2015cPRE.setProperty(
+            "decorrelationModel", "1NPCOR_PLUS_UNCOR").ignore()
         tool_es2015cPRE.setProperty("int")("doSmearing", 0).ignore()
         tool_es2015cPRE.msg().setLevel(ROOT.MSG.WARNING)
         tool_es2015cPRE.initialize().ignore()
@@ -701,15 +775,18 @@ class TestEgammaCalibrationAndSmearingTool(unittest.TestCase):
             e_es2015cPRE = tool_es2015cPRE.getEnergy(ph, ei)
             self.assertGreater(e_es2015cPRE, 0)
             self.assertNotAlmostEqual(e_es2015c_summer, e_es2015cPRE,
-                                      msg="e_es2015c_summer == e_es2015cPRE == %.2f at eta=%.2f for photons" % (e_es2015c_summer, ph.eta()))
+                                      msg="e_es2015c_summer == e_es2015cPRE == %.2f at eta=%.2f for photons" % (e_es2015c_summer, 
+                                      ph.eta()))
 
     def test_es2015c_summer_data(self):
         """
         check that energy > 0
         """
-        tool_es2015c_summer = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_es2015c_summer")
+        tool_es2015c_summer = ROOT.CP.EgammaCalibrationAndSmearingTool(
+            "tool_es2015c_summer")
         tool_es2015c_summer.setProperty("ESModel", "es2015c_summer").ignore()
-        tool_es2015c_summer.setProperty("decorrelationModel", "1NPCOR_PLUS_UNCOR").ignore()
+        tool_es2015c_summer.setProperty(
+            "decorrelationModel", "1NPCOR_PLUS_UNCOR").ignore()
         tool_es2015c_summer.msg().setLevel(ROOT.MSG.WARNING)
         tool_es2015c_summer.initialize().ignore()
 
@@ -728,5 +805,5 @@ if __name__ == '__main__':
     ROOT.gROOT.ProcessLine(".x $ROOTCOREDIR/scripts/load_packages.C")
 #    from ROOT import EgammaCalibPeriodRunNumbersExample
 
-    #ROOT.xAOD.TReturnCode.enableFailure()
+    # ROOT.xAOD.TReturnCode.enableFailure()
     unittest.main()
diff --git a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/test/ut_test_factory.py b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/test/ut_test_factory.py
index ff2ae3998b80..644e69fe4f8c 100755
--- a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/test/ut_test_factory.py
+++ b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/test/ut_test_factory.py
@@ -8,7 +8,7 @@ import unittest
 class TestEgammaFactory(unittest.TestCase):
 
     def test_eventinfo(self):
-        event = ROOT.xAOD.TEvent()
+        ROOT.xAOD.TEvent()
         factory = ROOT.EgammaFactory()
         ei1 = factory.create_eventinfo(True, 100000)
         self.assertTrue(ei1.eventType(ROOT.xAOD.EventInfo.IS_SIMULATION))
@@ -16,7 +16,7 @@ class TestEgammaFactory(unittest.TestCase):
         self.assertFalse(ei2.eventType(ROOT.xAOD.EventInfo.IS_SIMULATION))
 
     def test_unconverted(self):
-        event = ROOT.xAOD.TEvent()
+        ROOT.xAOD.TEvent()
         factory = ROOT.EgammaFactory()
 
         runnumber = 10000
@@ -32,11 +32,13 @@ class TestEgammaFactory(unittest.TestCase):
         self.assertAlmostEqual(ph.caloCluster().eta(), eta)
         self.assertAlmostEqual(ph.phi(), phi)
         self.assertAlmostEqual(ph.caloCluster().phi(), phi)
-        self.assertAlmostEqual(ph.caloCluster().auxdata("float")("etaCalo"), eta)
-        self.assertAlmostEqual(ph.caloCluster().auxdata("float")("phiCalo"), phi)
+        self.assertAlmostEqual(
+            ph.caloCluster().auxdata("float")("etaCalo"), eta)
+        self.assertAlmostEqual(
+            ph.caloCluster().auxdata("float")("phiCalo"), phi)
         self.assertAlmostEqual(ph.e(), e, delta=0.01)
         self.assertEqual(ph.caloCluster().e(), e)
-        for i in xrange(3):
+        for i in range(3):
             self.assertGreater(ph.caloCluster().energyBE(i), 0)
 
     def test_converted(self):
@@ -56,15 +58,17 @@ class TestEgammaFactory(unittest.TestCase):
         self.assertAlmostEqual(ph.caloCluster().eta(), eta)
         self.assertAlmostEqual(ph.phi(), phi)
         self.assertAlmostEqual(ph.caloCluster().phi(), phi)
-        self.assertAlmostEqual(ph.caloCluster().auxdata("float")("etaCalo"), eta)
-        self.assertAlmostEqual(ph.caloCluster().auxdata("float")("phiCalo"), phi)
+        self.assertAlmostEqual(
+            ph.caloCluster().auxdata("float")("etaCalo"), eta)
+        self.assertAlmostEqual(
+            ph.caloCluster().auxdata("float")("phiCalo"), phi)
         self.assertAlmostEqual(ph.e(), e, delta=0.01)
         self.assertEqual(ph.caloCluster().e(), e)
-        for i in xrange(3):
+        for i in range(3):
             self.assertGreater(ph.caloCluster().energyBE(i), 0)
 
     def test_photon(self):
-        event = ROOT.xAOD.TEvent()
+         ROOT.xAOD.TEvent()
         factory = ROOT.EgammaFactory()
 
         runnumber = 10000
@@ -89,8 +93,10 @@ class TestEgammaFactory(unittest.TestCase):
         self.assertAlmostEqual(ph.caloCluster().eta(), eta)
         self.assertAlmostEqual(ph.phi(), phi)
         self.assertAlmostEqual(ph.caloCluster().phi(), phi)
-        self.assertAlmostEqual(ph.caloCluster().auxdata("float")("etaCalo"), eta)
-        self.assertAlmostEqual(ph.caloCluster().auxdata("float")("phiCalo"), phi)
+        self.assertAlmostEqual(
+            ph.caloCluster().auxdata("float")("etaCalo"), eta)
+        self.assertAlmostEqual(
+            ph.caloCluster().auxdata("float")("phiCalo"), phi)
         self.assertAlmostEqual(ph.e(), e, delta=0.01)
         self.assertEqual(ph.caloCluster().e(), e)
 
@@ -101,7 +107,7 @@ class TestEgammaFactory(unittest.TestCase):
         tool.applyCorrection(ph, ei)
 
     def test_electron(self):
-        event = ROOT.xAOD.TEvent()
+        ROOT.xAOD.TEvent()
         factory = ROOT.EgammaFactory()
 
         runnumber = 10000
@@ -124,14 +130,16 @@ class TestEgammaFactory(unittest.TestCase):
         self.assertAlmostEqual(el.caloCluster().eta(), eta)
         self.assertAlmostEqual(el.phi(), phi)
         self.assertAlmostEqual(el.caloCluster().phi(), phi)
-        self.assertAlmostEqual(el.caloCluster().auxdata("float")("etaCalo"), eta)
-        self.assertAlmostEqual(el.caloCluster().auxdata("float")("phiCalo"), phi)
+        self.assertAlmostEqual(
+            el.caloCluster().auxdata("float")("etaCalo"), eta)
+        self.assertAlmostEqual(
+            el.caloCluster().auxdata("float")("phiCalo"), phi)
         self.assertAlmostEqual(el.e(), e, delta=0.01)
         self.assertEqual(el.caloCluster().e(), e)
         self.assertAlmostEqual(el.trackParticle().eta(), eta, delta=0.00001)
 
     def test_clean(self):
-        event = ROOT.xAOD.TEvent()
+        ROOT.xAOD.TEvent()
 
         factory = ROOT.EgammaFactory()
         runnumber = 10000
@@ -147,7 +155,7 @@ class TestEgammaFactory(unittest.TestCase):
         self.assertAlmostEqual(el.eta(), 1)
 
     def test_decoration(self):
-        event = ROOT.xAOD.TEvent()
+        ROOT.xAOD.TEvent()
 
         factory = ROOT.EgammaFactory()
         runnumber = 10000
@@ -158,7 +166,6 @@ class TestEgammaFactory(unittest.TestCase):
         el.auxdecor("double")("mydeco")
         el.auxdataConst("double")("mydeco")
 
-        #factory.clear()
         el = factory.create_electron(1, 2, 3, 4, 5, 6, 7)
         el.auxdataConst("double")("mydeco")
 
diff --git a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/test/ut_test_resolution.py b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/test/ut_test_resolution.py
index b4a330f56ace..72b99d4cbf6f 100755
--- a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/test/ut_test_resolution.py
+++ b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/test/ut_test_resolution.py
@@ -31,16 +31,16 @@ class TestEgammaResolution(unittest.TestCase):
         cls.factory = ROOT.EgammaFactory()
 
     def loop_combination(self, eta_min=-2.5, eta_max=2.5, eta_step=0.05,
-                              energy_min=0, energy_max=200E3, energy_step=10E3,
-                              ptypes=(0, 1, 2, 3),
-                              resol_types=(0, 1, 2)):
+                         energy_min=0, energy_max=200E3, energy_step=10E3,
+                         ptypes=(0, 1, 2, 3),
+                         resol_types=(0, 1, 2)):
         for ptype in ptypes:
             for resol_type in resol_types:
                 for eta in arange(eta_min, eta_max, eta_step):
                     for energy in arange(energy_min, energy_max, energy_step):
                         yield ptype, energy, eta, resol_type
 
-    #@unittest.expectedFailure  # return nan in the crack (1.37-1.52), inf at >= 2.4
+    # @unittest.expectedFailure  # return nan in the crack (1.37-1.52), inf at >= 2.4
     def test_resolution_positive(self):
         for ptype, energy, eta, resol_type in self.loop_combination():
             for tool in self.tool_run1, self.tool_run2:
@@ -49,7 +49,8 @@ class TestEgammaResolution(unittest.TestCase):
                 if ptype == 3:
                     continue
                 resolution = tool.getResolution(ptype, energy, eta, resol_type)
-                self.assertFalse(math.isnan(resolution), msg="resolution is nan for eta=%f" % eta)
+                self.assertFalse(math.isnan(resolution),
+                                 msg="resolution is nan for eta=%f" % eta)
                 self.assertGreater(resolution, 0)
 
     def create_response_run1(self):
@@ -57,9 +58,13 @@ class TestEgammaResolution(unittest.TestCase):
         this should not be executed, to don't invalidate reference file created
         on 2015-04-27 with ElectronPhotonFourMomentumCorrection-00-01-23
         """
-        fout = ROOT.TFile("$ROOTCOREBIN/data/ElectronPhotonFourMomentumCorrection/test_resolution_nonregression_run1_data.root", "recreate")
-        tree = ROOT.TTree("test_resolution_nonregression_data_run1", "test_resolution_nonregression_data")
-        data_ptype, data_resol_type, data_eta, data_energy, data_resolution = map(lambda t: array(t, [0]), ('i', 'i', 'f', 'f', 'f'))
+        fout = ROOT.TFile(
+            "$ROOTCOREBIN/data/ElectronPhotonFourMomentumCorrection/test_resolution_nonregression_run1_data.root",
+            "recreate")
+        tree = ROOT.TTree("test_resolution_nonregression_data_run1",
+                          "test_resolution_nonregression_data")
+        data_ptype, data_resol_type, data_eta, data_energy, data_resolution = map(
+            lambda t: array(t, [0]), ('i', 'i', 'f', 'f', 'f'))
 
         tree.Branch("ptype", data_ptype, "ptype/I")
         tree.Branch("resol_type", data_resol_type, "resol_type/I")
@@ -68,7 +73,8 @@ class TestEgammaResolution(unittest.TestCase):
         tree.Branch("resolution", data_resolution, "resolution/F")
 
         for ptype, energy, eta, resol_type in self.loop_combination_run1():
-            resolution = self.tool_run1.getResolution(ptype, energy, eta, resol_type)
+            resolution = self.tool_run1.getResolution(
+                ptype, energy, eta, resol_type)
             data_ptype[0] = ptype
             data_energy[0] = energy
             data_eta[0] = eta
@@ -86,18 +92,23 @@ class TestEgammaResolution(unittest.TestCase):
             for eta in arange(0, 1.37, 0.1):
                 for e in arange(10E3, 1000E3, 100E3):
                     for t in 0, 1, 2:
-                        resolution_run1 = self.tool_run1.getResolution(ptype, e, eta, t)
-                        resolution_run2 = tool_run2.getResolution(ptype, e, eta, t)
-                        self.assertNotAlmostEqual(resolution_run1, resolution_run2,
-                                                  msg="resolution should be different for particle=%d, eta=%f, e=%d, rtype=%d" % (ptype, eta, e, t))
+                        resolution_run1 = self.tool_run1.getResolution(
+                            ptype, e, eta, t)
+                        resolution_run2 = tool_run2.getResolution(
+                            ptype, e, eta, t)
+                        self.assertNotAlmostEqual(resolution_run1,
+                                                  resolution_run2,
+                                                  msg="resolution should be different for particle=%d, eta=%f, e=%d, rtype=%d" % (ptype,
+                                                                                                                                  eta, e, t))
 
     def test_nonregression_run1(self):
         from PathResolver import PathResolver
-        rootfile = PathResolver.FindCalibFile("ElectronPhotonFourMomentumCorrection/v8/test_resolution_nonregression_run1_data.root")
+        rootfile = PathResolver.FindCalibFile(
+            "ElectronPhotonFourMomentumCorrection/v8/test_resolution_nonregression_run1_data.root")
         f = ROOT.TFile(rootfile)
         tree = f.Get("test_resolution_nonregression_data_run1")
 
-        for ievent in xrange(tree.GetEntries()):
+        for ievent in range(tree.GetEntries()):
 
             tree.GetEntry(ievent)
             resolution = self.tool_run1.getResolution(tree.ptype,
@@ -105,12 +116,20 @@ class TestEgammaResolution(unittest.TestCase):
                                                       tree.resol_type)
             expected_response = tree.resolution
             if math.isnan(resolution):
-                self.assertTrue(math.isnan(expected_response), msg="resolution is nan, but expected resonse is %f" % expected_response)
+                self.assertTrue(math.isnan(
+                    expected_response), msg="resolution is nan, but expected resonse is %f" % expected_response)
             elif math.isnan(expected_response):
-                self.assertTrue(math.isnan(resolution), msg="expected response is nan, but resolution is %f" % resolution)
+                self.assertTrue(math.isnan(
+                    resolution), msg="expected response is nan, but resolution is %f" % resolution)
             else:
                 self.assertAlmostEqual(resolution, expected_response,
-                                       msg="resolution mismatch %f != %f at eta=%f, energy=%f, ptype=%d, resol_type=%d" % (resolution, expected_response, tree.eta, tree.energy, tree.ptype, tree.resol_type))
+                                       msg="resolution mismatch %f != %f at eta=%f, energy=%f, ptype=%d, resol_type=%d" % (
+                                           resolution,
+                                           expected_response,
+                                           tree.eta,
+                                           tree.energy,
+                                           tree.ptype,
+                                           tree.resol_type))
 
     @unittest.skip("CHECK")
     def test_resolution_interface(self):
@@ -125,22 +144,29 @@ class TestEgammaResolution(unittest.TestCase):
             for energy in energies:
                 if particle == 'unconverted':
                     p = self.factory.create_photon(0., 0.1, energy, 0)
-                    r1 = tool.resolution(energy, 0., 0., ROOT.PATCore.ParticleType.UnconvertedPhoton)
+                    r1 = tool.resolution(
+                        energy, 0., 0.,
+                        ROOT.PATCore.ParticleType.UnconvertedPhoton)
                     r2 = tool.getResolution(p)
                     self.assertAlmostEqual(r1, r2)
                 elif particle == 'converted':
                     p = self.factory.create_photon(0., 0.1, energy, 100)
-                    r1 = tool.resolution(energy, 0., 0., ROOT.PATCore.ParticleType.ConvertedPhoton)
+                    r1 = tool.resolution(
+                        energy, 0., 0.,
+                        ROOT.PATCore.ParticleType.ConvertedPhoton)
                     r2 = tool.getResolution(p)
                     self.assertAlmostEqual(r1, r2)
                 elif particle == 'electron':
                     p = self.factory.create_electron(0., 0.1, energy)
-                    r1 = tool.resolution(energy, 0., 0., ROOT.PATCore.ParticleType.Electron)
+                    r1 = tool.resolution(
+                        energy, 0., 0.,
+                        ROOT.PATCore.ParticleType.Electron)
                     r2 = tool.getResolution(p)
                     self.assertAlmostEqual(r1, r2)
                 else:
                     raise ValueError()
 
+
 if __name__ == '__main__':
     ROOT.gROOT.ProcessLine(".x $ROOTCOREDIR/scripts/load_packages.C")
     unittest.main()
-- 
GitLab


From a4685992ea47743fdd231f6a2e7c187a30cf3771 Mon Sep 17 00:00:00 2001
From: christos <christos@cern.ch>
Date: Thu, 17 Dec 2020 23:57:06 +0100
Subject: [PATCH 136/225] vec.h use prefix increment for fallback type

---
 Control/CxxUtils/CxxUtils/vec.h | 32 ++++++++++++++++----------------
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/Control/CxxUtils/CxxUtils/vec.h b/Control/CxxUtils/CxxUtils/vec.h
index 3ab1c057ea22..1b072d809881 100644
--- a/Control/CxxUtils/CxxUtils/vec.h
+++ b/Control/CxxUtils/CxxUtils/vec.h
@@ -166,7 +166,7 @@ using ivec = vec_fb<typename boost::int_t<sizeof(T)*8>::exact, N>;
   vec_fb<T, N> operator op (const vec_fb<T, N>& a, const vec_fb<T, N>& b) \
   {                                                                       \
     vec_fb<T, N> c;                                                       \
-    for (size_t i = 0; i < N; i++)                                        \
+    for (size_t i = 0; i < N; ++i)                                        \
       c.m_arr[i] = a.m_arr[i] op b.m_arr[i];                              \
     return c;                                                             \
   }                                                                       \
@@ -175,7 +175,7 @@ using ivec = vec_fb<typename boost::int_t<sizeof(T)*8>::exact, N>;
   vec_fb<T, N> operator op (const vec_fb<T, N>& a, U b)                   \
   {                                                                       \
     vec_fb<T, N> c;                                                       \
-    for (size_t i = 0; i < N; i++)                                        \
+    for (size_t i = 0; i < N; ++i)                                        \
       c.m_arr[i] = a.m_arr[i] op b;                                       \
     return c;                                                             \
   }                                                                       \
@@ -184,7 +184,7 @@ using ivec = vec_fb<typename boost::int_t<sizeof(T)*8>::exact, N>;
   vec_fb<T, N> operator op (U a, const vec_fb<T, N>& b)                   \
   {                                                                       \
     vec_fb<T, N> c;                                                       \
-    for (size_t i = 0; i < N; i++)                                        \
+    for (size_t i = 0; i < N; ++i)                                        \
       c.m_arr[i] = a op b.m_arr[i];                                       \
     return c;                                                             \
   }                                                                       \
@@ -192,7 +192,7 @@ using ivec = vec_fb<typename boost::int_t<sizeof(T)*8>::exact, N>;
   inline                                                                  \
   vec_fb<T, N>& operator op ## = (vec_fb<T, N>& a, const vec_fb<T, N>& b) \
   {                                                                       \
-     for (size_t i = 0; i < N; i++)                                       \
+     for (size_t i = 0; i < N; ++i)                                       \
       a.m_arr[i] op ## = b.m_arr[i];                                      \
     return a;                                                             \
   }                                                                       \
@@ -200,7 +200,7 @@ using ivec = vec_fb<typename boost::int_t<sizeof(T)*8>::exact, N>;
   inline                                                                  \
   vec_fb<T, N>& operator op ## = (vec_fb<T, N>& a, U b)                   \
   {                                                                       \
-    for (size_t i = 0; i < N; i++)                                        \
+    for (size_t i = 0; i < N; ++i)                                        \
       a.m_arr[i] op ## = b;                                               \
     return a;                                                             \
   }
@@ -229,7 +229,7 @@ BINOP(<<)
   vec_fb<T, N> operator op (const vec_fb<T, N>& a)                      \
   {                                                                     \
     vec_fb<T, N> c;                                                     \
-    for (size_t i = 0; i < N; i++)                                      \
+    for (size_t i = 0; i < N; ++i)                                      \
       c.m_arr[i] = op a.m_arr[i];                                       \
     return c;                                                           \
   }                                                                     \
@@ -251,7 +251,7 @@ UNOP(~)
   ivec<T, N> operator op (const vec_fb<T, N>& a, const vec_fb<T, N>& b) \
   {                                                                     \
     ivec<T, N> c;                                                       \
-    for (size_t i = 0; i < N; i++)                                      \
+    for (size_t i = 0; i < N; ++i)                                      \
       c.m_arr[i] = a.m_arr[i] op b.m_arr[i];                            \
     return c;                                                           \
   }
@@ -273,7 +273,7 @@ inline
 ivec<T, N> operator! (const vec_fb<T, N>& a)
 {
   ivec<T, N> c;
-  for (size_t i = 0; i < N; i++)
+  for (size_t i = 0; i < N; ++i)
     c.m_arr[i] = a.m_arr[i] == 0;
   return c;
 }
@@ -285,7 +285,7 @@ inline
 ivec<T, N> operator&& (const vec_fb<T, N>& a, const vec_fb<T, N>& b)
 {
   ivec<T, N> c;
-  for (size_t i = 0; i < N; i++)
+  for (size_t i = 0; i < N; ++i)
     c.m_arr[i] = (a.m_arr[i]!=0) & (b.m_arr[i]!=0);
   return c;
 }
@@ -297,7 +297,7 @@ inline
 ivec<T, N> operator&& (U a, const vec_fb<T, N>& b)
 {
   ivec<T, N> c;
-  for (size_t i = 0; i < N; i++)
+  for (size_t i = 0; i < N; ++i)
     c.m_arr[i] = a ? b.m_arr[i] != 0 : 0;
   return c;
 }
@@ -309,7 +309,7 @@ inline
 ivec<T, N> operator&& (const vec_fb<T, N>& a, U b)
 {
   ivec<T, N> c;
-  for (size_t i = 0; i < N; i++)
+  for (size_t i = 0; i < N; ++i)
     c.m_arr[i] = (a.m_arr[i]!=0) & (b ? -1 : 0);
   return c;
 }
@@ -321,7 +321,7 @@ inline
 ivec<T, N> operator|| (const vec_fb<T, N>& a, const vec_fb<T, N>& b)
 {
   ivec<T, N> c;
-  for (size_t i = 0; i < N; i++)
+  for (size_t i = 0; i < N; ++i)
     c.m_arr[i] = (a.m_arr[i]!=0) | (b.m_arr[i]!=0);
   return c;
 }
@@ -416,7 +416,7 @@ vbroadcast(VEC& v, T x)
   // This may look inefficient, but the loop goes away when we
   // compile with optimization.
   constexpr size_t N = CxxUtils::vec_size<VEC>();
-  for (size_t i = 0; i < N; i++) {
+  for (size_t i = 0; i < N; ++i) {
     v[i] = x;
   }
 #else
@@ -461,7 +461,7 @@ vselect(VEC& dst, const VEC& a, const VEC& b, const mask_type_t<VEC>& mask)
 {
 #if !HAVE_VECTOR_TERNARY_OPERATOR || WANT_VECTOR_FALLBACK
   constexpr size_t N = vec_size<VEC>();
-  for (size_t i = 0; i < N; i++) {
+  for (size_t i = 0; i < N; ++i) {
     dst[i] = mask[i] ? a[i] : b[i];
   }
 #else
@@ -479,7 +479,7 @@ vmin(VEC& dst, const VEC& a, const VEC& b)
 {
 #if !HAVE_VECTOR_TERNARY_OPERATOR || WANT_VECTOR_FALLBACK
   constexpr size_t N = vec_size<VEC>();
-  for (size_t i = 0; i < N; i++) {
+  for (size_t i = 0; i < N; ++i) {
     dst[i] = a[i] < b[i] ? a[i] : b[i];
   }
 #else
@@ -497,7 +497,7 @@ vmax(VEC& dst, const VEC& a, const VEC& b)
 {
 #if !HAVE_VECTOR_TERNARY_OPERATOR || WANT_VECTOR_FALLBACK
   constexpr size_t N = vec_size<VEC>();
-  for (size_t i = 0; i < N; i++) {
+  for (size_t i = 0; i < N; ++i) {
     dst[i] = a[i] > b[i] ? a[i] : b[i];
   }
 #else
-- 
GitLab


From 9e9f084fea025ee2bf7f0a3b3fdbd17fea217013 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Thu, 17 Dec 2020 00:45:26 +0100
Subject: [PATCH 137/225] MuonGeoModel: Fix memory leaks.

Fix a couple leaks of GeoModel objects.
---
 MuonSpectrometer/MuonGeoModel/src/MultiLayer.cxx | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/MuonSpectrometer/MuonGeoModel/src/MultiLayer.cxx b/MuonSpectrometer/MuonGeoModel/src/MultiLayer.cxx
index 514e8861de3b..aac677b75844 100755
--- a/MuonSpectrometer/MuonGeoModel/src/MultiLayer.cxx
+++ b/MuonSpectrometer/MuonGeoModel/src/MultiLayer.cxx
@@ -321,6 +321,7 @@ GeoFullPhysVol* MultiLayer::build()
   double tL = longWidth/2.0 - (tubePitch/2.)*TrdDwoverL;
   stube = new GeoTube(0.0, tubePitch/2., tL);
   stube = & ( (*stube) << GeoTrf::RotateX3D(90.*Gaudi::Units::deg) );
+  stube->ref();
   const GeoShape* stubewithcut = nullptr;
   if (cutoutNsteps > 1 && !m_nonCutoutXSteps.size()) { // adaption of tube cuts only needed for cutouts along amdb-y
     double toptubelength = cutoutTubeLength[cutoutNsteps-1];
@@ -331,8 +332,6 @@ GeoFullPhysVol* MultiLayer::build()
 
   GeoShape* sbox = new GeoTrd(mdtthickness, mdtthickness, longWidth,
                               longWidth, tubePitch/2.);
-  GeoShape* sboxf = new GeoTrd(mdtthickness, mdtthickness, longWidth,
-                                longWidth, tubePitch/4.+1*Gaudi::Units::mm);
   slay = &(slay->subtract( (*sbox)<<GeoTrf::Translate3D(0.,0.,length/2.)));
 
   for (int i = 0; i < nrOfLayers; i++) {
@@ -371,6 +370,8 @@ GeoFullPhysVol* MultiLayer::build()
     }
   } // Loop over layers
 
+  stube->unref();
+
   const GeoMaterial* mlay = getMaterialManager()->getMaterial("std::Air");
   GeoLogVol* llay = new GeoLogVol(logVolName, slay, mlay);
   GeoFullPhysVol* play = new GeoFullPhysVol(llay);
@@ -389,6 +390,8 @@ GeoFullPhysVol* MultiLayer::build()
       sfoam = new GeoTrd(foamthicknesslow/2.-eps, foamthicknesslow/2.-eps,
                          width/2.-eps, longWidth/2.-eps, length/2.);
     }
+    GeoShape* sboxf = new GeoTrd(mdtthickness, mdtthickness, longWidth,
+                                 longWidth, tubePitch/4.+1*Gaudi::Units::mm);
     sfoam = &(sfoam->subtract( (*sboxf)<<GeoTrf::Translate3D(0.,0.,length/2.-tubePitch/4.)));
     mfoam = getMaterialManager()->getMaterial("muo::Foam");
     lfoam = new GeoLogVol("MultiLayerFoam", sfoam, mfoam);
@@ -401,6 +404,8 @@ GeoFullPhysVol* MultiLayer::build()
       sfoam = new GeoTrd(foamthicknessup/2.-eps, foamthicknessup/2.-eps,
                          width/2.-eps, longWidth/2.-eps, length/2.);
     }
+    GeoShape* sboxf = new GeoTrd(mdtthickness, mdtthickness, longWidth,
+                                 longWidth, tubePitch/4.+1*Gaudi::Units::mm);
     sfoam = &(sfoam->subtract( (*sboxf)<<GeoTrf::Translate3D(0.,0.,length/2.-tubePitch/4.)));
     mfoam = getMaterialManager()->getMaterial("muo::Foam");
     lfoam = new GeoLogVol("MultiLayerFoam", sfoam, mfoam);
-- 
GitLab


From ba2a72b7d5b58065875f89a1ba7c25f925828379 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Thu, 17 Dec 2020 03:19:47 +0100
Subject: [PATCH 138/225] CaloRingerTools: Fix memory leak.

Add forgotten call to checkRelease(); needed to free memory.
---
 .../CaloRingerTools/src/CaloRingerElectronsReader.cxx          | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/Reconstruction/RecoTools/CaloRingerTools/src/CaloRingerElectronsReader.cxx b/Reconstruction/RecoTools/CaloRingerTools/src/CaloRingerElectronsReader.cxx
index 947d70a098b5..fad621635042 100644
--- a/Reconstruction/RecoTools/CaloRingerTools/src/CaloRingerElectronsReader.cxx
+++ b/Reconstruction/RecoTools/CaloRingerTools/src/CaloRingerElectronsReader.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017, 2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2017, 2019, 2020 CERN for the benefit of the ATLAS collaboration
 */
 
 // $Id: CaloRingerElectronsReader.cxx 786306 2016-11-24 13:40:42Z wsfreund $
@@ -121,6 +121,7 @@ StatusCode CaloRingerElectronsReader::execute()
       m_clRingsBuilderElectronFctor->operator()( electron );
     }
 
+    m_clRingsBuilderElectronFctor->checkRelease();
   }
 
   StatusCode sc;
-- 
GitLab


From 0125803d4b39b824fa23fda902ad44d2bbd9d837 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Thu, 17 Dec 2020 03:22:42 +0100
Subject: [PATCH 139/225] JetRec: Fix memory leak.

PseudoJetContainer needs to delete the objects in m_emptyExtractors.
---
 .../Jet/JetRec/JetRec/PseudoJetContainer.h           |  4 +++-
 .../Jet/JetRec/Root/PseudoJetContainer.cxx           | 12 ++++++++++--
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/Reconstruction/Jet/JetRec/JetRec/PseudoJetContainer.h b/Reconstruction/Jet/JetRec/JetRec/PseudoJetContainer.h
index 94eacde59755..b4b47d1ef4fe 100644
--- a/Reconstruction/Jet/JetRec/JetRec/PseudoJetContainer.h
+++ b/Reconstruction/Jet/JetRec/JetRec/PseudoJetContainer.h
@@ -6,7 +6,7 @@
 #define PseudoJetContainer_H
 
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 
@@ -55,6 +55,8 @@ public:
                      const std::vector<PseudoJet> & vecPJ,
                      bool debug=false);
 
+  ~PseudoJetContainer();
+
   // fill xAOD jet with constit&ghosts extracted from final PSeudoJet
   bool extractConstituents(xAOD::Jet&, const std::vector<PseudoJet>&) const;
   bool extractConstituents(xAOD::Jet& jet, const PseudoJet &finalPJ) const;
diff --git a/Reconstruction/Jet/JetRec/Root/PseudoJetContainer.cxx b/Reconstruction/Jet/JetRec/Root/PseudoJetContainer.cxx
index 449796aacf56..104ede8af881 100644
--- a/Reconstruction/Jet/JetRec/Root/PseudoJetContainer.cxx
+++ b/Reconstruction/Jet/JetRec/Root/PseudoJetContainer.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 // PseudoJetContainer.cxx
@@ -44,6 +44,14 @@ PseudoJetContainer::PseudoJetContainer(const IConstituentExtractor* c,
 }
 
 
+PseudoJetContainer::~PseudoJetContainer()
+{
+  for (const IConstituentExtractor* e : m_emptyExtractors) {
+    delete e;
+  }
+}
+
+
 bool
 PseudoJetContainer::extractConstituents(xAOD::Jet& jet, 
                                         const std::vector<PseudoJet>& inConstits) const
@@ -137,7 +145,7 @@ void PseudoJetContainer::append(const PseudoJetContainer* other) {
                    pj.set_user_index(pj.user_index() + offset);return pj;}
                  );
 
-  for(auto e : other->m_emptyExtractors){m_emptyExtractors.insert(e);}
+  for(auto e : other->m_emptyExtractors){m_emptyExtractors.insert(e->clone());}
 
   if (m_debug){checkInvariants("append()");}
 }
-- 
GitLab


From a1dba213ab9ac18d2bbbdf46abd1d0842c617c69 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Thu, 17 Dec 2020 04:03:06 +0100
Subject: [PATCH 140/225] ByteStreamCnvSvc: Fix memory leak.

Leaked AttributeListSpecification.
---
 Event/ByteStreamCnvSvc/src/EventSelectorByteStream.cxx | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/Event/ByteStreamCnvSvc/src/EventSelectorByteStream.cxx b/Event/ByteStreamCnvSvc/src/EventSelectorByteStream.cxx
index bc20c5f82e7b..a86f46bb8b86 100644
--- a/Event/ByteStreamCnvSvc/src/EventSelectorByteStream.cxx
+++ b/Event/ByteStreamCnvSvc/src/EventSelectorByteStream.cxx
@@ -736,9 +736,8 @@ StatusCode EventSelectorByteStream::recordAttributeListImpl(lock_t& lock) const
       }
    }
 
-   // build spec and the new attr list
-   coral::AttributeListSpecification* spec = new coral::AttributeListSpecification(); // the newly created attribute list owns the spec
-   auto attrList = std::make_unique<AthenaAttributeList>(*spec);
+   // build the new attr list
+   auto attrList = std::make_unique<AthenaAttributeList>();
 
    // fill the attr list
    ATH_CHECK(fillAttributeListImpl(attrList.get(), "", false, lock));
-- 
GitLab


From 14e596d38155a88040bc29667e22a62c84228487 Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Tue, 8 Dec 2020 10:21:51 -0500
Subject: [PATCH 141/225] TrigBphysHypo: Fix gcc11 warning.

Misleading indentation.
---
 .../TrigHypothesis/TrigBphysHypo/src/TrigL2BMuMuHypo.cxx    | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigL2BMuMuHypo.cxx b/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigL2BMuMuHypo.cxx
index 3e0924144c6d..42d6965921e1 100644
--- a/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigL2BMuMuHypo.cxx
+++ b/Trigger/TrigHypothesis/TrigBphysHypo/src/TrigL2BMuMuHypo.cxx
@@ -1,7 +1,7 @@
 // -*- C++ -*-
 
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 /**************************************************************************
@@ -232,6 +232,6 @@ HLT::ErrorCode TrigL2BMuMuHypo::hltExecute(const HLT::TriggerElement* outputTE,
   // store result
   if(attachFeature(outputTE, xBits.release(),"passbits") != HLT::OK)
       ATH_MSG_ERROR("Could not store TrigPassBits! ");
-      ATH_MSG_DEBUG("End of hltExecute, passMass, passChi2, pass= " <<  PassedBsMass << "  " << PassedChi2Cut << "  " << pass);
-      return HLT::OK;
+  ATH_MSG_DEBUG("End of hltExecute, passMass, passChi2, pass= " <<  PassedBsMass << "  " << PassedChi2Cut << "  " << pass);
+  return HLT::OK;
 }
-- 
GitLab


From 737878ac37184aa9ded77435c014dc69ae8f9ec3 Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Tue, 8 Dec 2020 12:41:21 -0500
Subject: [PATCH 142/225] TrigEgammaHypo: Fix gcc11 warning.

Null pointer dereference.  (Looks like missing parentheses.)
---
 .../TrigEgammaHypo/src/TrigL2CaloLayersHypo.cxx               | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigL2CaloLayersHypo.cxx b/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigL2CaloLayersHypo.cxx
index b01143a0c35d..8d918d83bb1a 100755
--- a/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigL2CaloLayersHypo.cxx
+++ b/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigL2CaloLayersHypo.cxx
@@ -1,7 +1,7 @@
 // -*- C++ -*-
 
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 /**************************************************************************
@@ -155,7 +155,7 @@ HLT::ErrorCode TrigL2CaloLayersHypo::hltExecute(const HLT::TriggerElement* outpu
   const xAOD::TrigEMCluster* pClus = vectorOfClusters.front();
   m_preSampFrac=m_preSamp=m_monEta=m_monPhi=m_Energy=-9999.0;
 
-  if ( !pClus && (pClus->energy()>0.1) && (fabsf(pClus->eta())<2.1) ) {
+  if ( ! ( pClus && (pClus->energy()>0.1) && (fabsf(pClus->eta())<2.1) ) ) {
     msg() << MSG::WARNING << "No EM cluster in RoI" << endmsg;
     return HLT::OK;
   }
-- 
GitLab


From 753c771c85b4f0a5f8fc95e89425a280195029cf Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Tue, 8 Dec 2020 09:57:45 -0500
Subject: [PATCH 143/225] TrigTauHypo: Fix gcc11 warnings.

Comment out unused variable param_at_calo.
(Not removed because it's referenced from existing commented-out code.)
Fixes warnings about null pointer dereferences.
---
 .../TrigTauHypo/src/EFHadCalibHypo.cxx             | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/Trigger/TrigHypothesis/TrigTauHypo/src/EFHadCalibHypo.cxx b/Trigger/TrigHypothesis/TrigTauHypo/src/EFHadCalibHypo.cxx
index cf9d4cba82b0..fef8a085f172 100644
--- a/Trigger/TrigHypothesis/TrigTauHypo/src/EFHadCalibHypo.cxx
+++ b/Trigger/TrigHypothesis/TrigTauHypo/src/EFHadCalibHypo.cxx
@@ -276,7 +276,7 @@ HLT::ErrorCode EFHadCalibHypo::hltExecute(const HLT::TriggerElement* inputTE, bo
 	  // Count only tracks with a certain pT:
 	  if( fabs( (*trackIter2)->pt()) < m_maxPtInIso ) continue;
 
-	  const Trk::TrackParameters * param_at_calo = 0;
+	  //const Trk::TrackParameters * param_at_calo = 0;
 
 	  if( msgLvl() <= MSG::VERBOSE ){ 
 	    msg() << MSG::VERBOSE << "Extrapolating track to calo." << endmsg;
@@ -339,13 +339,13 @@ HLT::ErrorCode EFHadCalibHypo::hltExecute(const HLT::TriggerElement* inputTE, bo
 	      countTracksOnDeltaR++;
 	    }
 
-	  if( msgLvl() <= MSG::VERBOSE )
-	    msg() << MSG::VERBOSE << "Extrapolated "
-		  << "eta = " << param_at_calo->position().eta() << " and "
-		  << "phi = " << param_at_calo->position().phi() 
-		  << ", dR = " << dr << endmsg;
+	  //if( msgLvl() <= MSG::VERBOSE )
+	  //  msg() << MSG::VERBOSE << "Extrapolated "
+	  //	  << "eta = " << param_at_calo->position().eta() << " and "
+	  //	  << "phi = " << param_at_calo->position().phi() 
+	  //	  << ", dR = " << dr << endmsg;
 
-	  delete param_at_calo;
+	  //delete param_at_calo;
 	}
 
       if( msgLvl() <= MSG::INFO )
-- 
GitLab


From bfa8f3fbbfa32c2f0f5623b0b9f1da7749e5986e Mon Sep 17 00:00:00 2001
From: yoyamagu <yohei.yamaguchi@cern.ch>
Date: Fri, 18 Dec 2020 14:10:34 +0900
Subject: [PATCH 144/225] remove dynamic variables from L2StandAloneMuon

---
 Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun2.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun2.py b/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun2.py
index 49fc8d4055ec..06dcff8641de 100644
--- a/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun2.py
+++ b/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun2.py
@@ -137,7 +137,7 @@ RemoveEgammaIsoVariables = ".-"+identifier.join(UnusedEgammaIsoVariables)
 
 # Add Dynamic Var
 identifierAdd = "."
-l2saVariableToAdd = ['mdtHitId','cscHitResolution']
+l2saVariableToAdd = []
 addL2saVars = "." + identifierAdd.join(l2saVariableToAdd)
 
 # temporary functionality to discover version of EDM
-- 
GitLab


From 6eea7eb77df080f8092303a83d10fcae39247567 Mon Sep 17 00:00:00 2001
From: Attila Krasznahorkay <attila.krasznahorkay@cern.ch>
Date: Fri, 18 Dec 2020 08:30:27 +0000
Subject: [PATCH 145/225] Updated AthAnalysis/version.txt

---
 Projects/AthAnalysis/version.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Projects/AthAnalysis/version.txt b/Projects/AthAnalysis/version.txt
index d4b369b4e5d8..16085fbb4e04 100644
--- a/Projects/AthAnalysis/version.txt
+++ b/Projects/AthAnalysis/version.txt
@@ -1 +1 @@
-22.2.4
+22.2.6
-- 
GitLab


From d3c331d96df96302c6f6536b7c40cae76ee46903 Mon Sep 17 00:00:00 2001
From: Aaron James Armbruster <aaron.james.armbruster@cern.ch>
Date: Fri, 18 Dec 2020 11:24:58 +0000
Subject: [PATCH 146/225] migrate EDM changes from 21.3

---
 Event/xAOD/xAODTrigger/CMakeLists.txt         |   2 +-
 Event/xAOD/xAODTrigger/Root/MuonRoI_v1.cxx    |  83 +++--
 .../xAODTrigger/versions/MuonRoI_v1.h         |   2 +
 Projects/AnalysisBase/package_filters.txt     |   1 +
 Projects/AthAnalysis/package_filters.txt      |   1 +
 .../Digitization/share/LVL1Digitization.py    |   9 +-
 .../TrigConfMuctpi/CMakeLists.txt             |   1 +
 .../share/TrigT1CTMonitoringJobOptions.py     |   9 +-
 ...MonitoringJobOptions_forRecExCommission.py |   9 +-
 .../TrigT1CTMonitoring/src/BSMonitoring.cxx   |  23 +-
 Trigger/TrigT1/TrigT1CTP/src/CTPUtil.cxx      |   7 +
 Trigger/TrigT1/TrigT1CTP/src/CTPUtil.h        |   1 +
 .../TrigT1/TrigT1Interfaces/CMakeLists.txt    |   4 +-
 .../TrigT1Interfaces}/ITrigT1MuonRecRoiTool.h |   2 +-
 .../TrigT1Interfaces/Lvl1MuCTPIInputPhase1.h  |  13 +-
 .../Lvl1MuSectorLogicDataPhase1.h             |   3 +
 .../TrigT1Interfaces/MuCTPICTP.h              |   9 +-
 .../TrigT1Interfaces}/TrigT1MuonRecRoiData.h  |   0
 .../src/ITrigT1MuonRecRoiTool.cxx             |   2 +-
 .../src/Lvl1MuCTPIInputPhase1.cxx             |  20 +-
 .../src/Lvl1MuSectorLogicDataPhase1.cxx       |   4 +
 .../TrigT1/TrigT1Interfaces/src/MuCTPICTP.cxx |   9 +-
 .../src/TrigT1MuonRecRoiData.cxx              |   2 +-
 .../TrigT1/TrigT1MuctpiBits/CMakeLists.txt    |  10 +
 .../TrigT1MuctpiBits/MuCTPI_Bits.h            | 133 +++++++
 .../TrigT1/TrigT1MuctpiPhase1/CMakeLists.txt  |   7 +-
 .../TrigT1MuctpiPhase1/MUCTPI_AthTool.h       |  27 +-
 .../TrigT1MuctpiPhase1/MuonSectorProcessor.h  |  11 +-
 .../TrigT1MuctpiPhase1/SimController.h        |   9 +-
 .../TrigT1MuctpiPhase1/TriggerProcessor.h     |  19 +-
 .../python/TrigT1MuctpiPhase1Config.py        |  45 +--
 .../TrigT1MuctpiPhase1/src/MUCTPI_AthTool.cxx |  82 +++--
 .../src/MuonSectorProcessor.cxx               | 270 ++++++++++++++-
 .../TrigT1MuctpiPhase1/src/SimController.cxx  |  37 +-
 .../src/TriggerProcessor.cxx                  | 326 ++++++++++++------
 .../TrigT1MuonRecRoiTool/CMakeLists.txt       |  11 +-
 .../python/TrigT1MuonRecRoiToolConfig.py      |  16 +
 .../src/TrigT1RPCRecRoiTool.h                 |   2 +-
 .../src/TrigT1TGCRecRoiTool.h                 |   2 +-
 Trigger/TrigT1/TrigT1Result/CMakeLists.txt    |   2 +-
 .../TrigT1Result/TrigT1Result/MuCTPI_RDO.h    |  89 +----
 .../TrigT1Result/TrigT1Result/selection.xml   |   2 +-
 .../TrigT1/TrigT1Result/src/MuCTPIResult.cxx  |   8 +-
 Trigger/TrigT1/TrigT1Result/src/MuCTPIRoI.cxx |   2 +-
 .../src/MuCTPI_DataWord_Decoder.cxx           |   5 +-
 .../TriggerJobOpts/python/HLTTriggerGetter.py |  10 +-
 .../python/Lvl1SimulationConfig.py            |  14 +-
 .../python/Lvl1TriggerGetter.py               |  19 +-
 .../TriggerJobOpts/python/Modifiers.py        |  17 +-
 49 files changed, 960 insertions(+), 431 deletions(-)
 rename Trigger/TrigT1/{TrigT1MuonRecRoiTool/TrigT1MuonRecRoiTool => TrigT1Interfaces/TrigT1Interfaces}/ITrigT1MuonRecRoiTool.h (98%)
 rename Trigger/TrigT1/{TrigT1MuonRecRoiTool/TrigT1MuonRecRoiTool => TrigT1Interfaces/TrigT1Interfaces}/TrigT1MuonRecRoiData.h (100%)
 rename Trigger/TrigT1/{TrigT1MuonRecRoiTool => TrigT1Interfaces}/src/ITrigT1MuonRecRoiTool.cxx (98%)
 rename Trigger/TrigT1/{TrigT1MuonRecRoiTool => TrigT1Interfaces}/src/TrigT1MuonRecRoiData.cxx (96%)
 create mode 100644 Trigger/TrigT1/TrigT1MuctpiBits/CMakeLists.txt
 create mode 100755 Trigger/TrigT1/TrigT1MuctpiBits/TrigT1MuctpiBits/MuCTPI_Bits.h
 create mode 100644 Trigger/TrigT1/TrigT1MuonRecRoiTool/python/TrigT1MuonRecRoiToolConfig.py

diff --git a/Event/xAOD/xAODTrigger/CMakeLists.txt b/Event/xAOD/xAODTrigger/CMakeLists.txt
index d17cde620896..65c91c4d1c95 100644
--- a/Event/xAOD/xAODTrigger/CMakeLists.txt
+++ b/Event/xAOD/xAODTrigger/CMakeLists.txt
@@ -17,7 +17,7 @@ atlas_add_library( xAODTrigger
    xAODTrigger/*.h xAODTrigger/versions/*.h xAODTrigger/versions/*.icc
    Root/*.cxx
    PUBLIC_HEADERS xAODTrigger
-   LINK_LIBRARIES AthContainers AthLinks xAODCore xAODBase TrigNavStructure CxxUtils
+   LINK_LIBRARIES AthContainers AthLinks xAODCore xAODBase TrigNavStructure CxxUtils TrigT1MuctpiBits
    ${extra_libs} )
 
 atlas_add_xaod_smart_pointer_dicts(
diff --git a/Event/xAOD/xAODTrigger/Root/MuonRoI_v1.cxx b/Event/xAOD/xAODTrigger/Root/MuonRoI_v1.cxx
index 6982f6fa6e07..604203161879 100644
--- a/Event/xAOD/xAODTrigger/Root/MuonRoI_v1.cxx
+++ b/Event/xAOD/xAODTrigger/Root/MuonRoI_v1.cxx
@@ -10,6 +10,9 @@
 // Local include(s):
 #include "xAODTrigger/versions/MuonRoI_v1.h"
 
+// get bitsmasks from common definition source:
+#include "TrigT1MuctpiBits/MuCTPI_Bits.h"
+
 namespace xAOD{
 
    MuonRoI_v1::MuonRoI_v1()
@@ -70,7 +73,8 @@ namespace xAOD{
    ///
    int MuonRoI_v1::getThrNumber() const {
 
-      return ( ( roiWord() >> 11 ) & 0x7 );
+     if (isRun3()) return ( ( roiWord() >> RUN3_CAND_PT_SHIFT ) & RUN3_CAND_PT_MASK );
+     else return ( ( roiWord() >> CAND_PT_SHIFT ) & CAND_PT_MASK );
    }
 
    /// A muon's spacial location is identified from the sector number and the
@@ -82,15 +86,26 @@ namespace xAOD{
    ///
    int MuonRoI_v1::getRoI() const {
 
-      if( this->getSource() == Forward ) {
-         return ( ( roiWord() >> 2 ) & 0x3f );
-      } else if( this->getSource() == Endcap ) {
-         return ( ( roiWord() >> 2 ) & 0xff );
-      } else if( this->getSource() == Barrel ) {
-         return ( ( roiWord() >> 2 ) & 0x1f );
-      }
-
-      return 0;
+     if (isRun3()) {
+       if( this->getSource() == Forward ) {
+	 return ( ( roiWord() >> RUN3_ROI_SHIFT ) & FORWARD_ROI_MASK );
+       } else if( this->getSource() == Endcap ) {
+	 return ( ( roiWord() >> RUN3_ROI_SHIFT ) & ENDCAP_ROI_MASK );
+       } else if( this->getSource() == Barrel ) {
+	 return ( ( roiWord() >> RUN3_ROI_SHIFT ) & BARREL_ROI_MASK );
+       }
+     }
+     else
+     {
+       if( this->getSource() == Forward ) {
+	 return ( ( roiWord() >> ROI_SHIFT ) & FORWARD_ROI_MASK );
+       } else if( this->getSource() == Endcap ) {
+	 return ( ( roiWord() >> ROI_SHIFT ) & ENDCAP_ROI_MASK );
+       } else if( this->getSource() == Barrel ) {
+	 return ( ( roiWord() >> ROI_SHIFT ) & BARREL_ROI_MASK );
+       }
+     }
+     return 0;
    }
 
    /// The sector address is an 8-bit identifier of the sector. For its detailed
@@ -105,7 +120,8 @@ namespace xAOD{
    ///
    int MuonRoI_v1::getSectorAddress() const {
 
-      return ( ( roiWord() >> 14 ) & 0xff );
+     if (isRun3()) return ( ( roiWord() >> RUN3_CAND_SECTOR_ADDRESS_SHIFT ) & CAND_SECTOR_ADDRESS_MASK );
+     else return ( ( roiWord() >> CAND_SECTOR_ADDRESS_SHIFT ) & CAND_SECTOR_ADDRESS_MASK );
    }
 
    /// Each muon trigger sector can only send information about a maximum of
@@ -114,9 +130,11 @@ namespace xAOD{
    /// assigned to it in its sector. If it's <code>false</code>, it was the
    /// <i>second candidate</i> in its sector.
    ///
+   /// actually v1 only ... 
    bool MuonRoI_v1::isFirstCandidate() const {
 
-      return ( ( roiWord() >> 22 ) & 0x1 );
+     if (isRun3()) return true; // undefined in run3, return default true
+     else return ( ( roiWord() >> CAND_HIGHEST_PT_SHIFT ) & CAND_HIGHEST_PT_MASK );
    }
 
    /// One RoI (one part of the trigger sector) can only send information about
@@ -126,7 +144,10 @@ namespace xAOD{
    ///
    bool MuonRoI_v1::isMoreCandInRoI() const {
 
-      return ( ( roiWord() >> 1 ) & 0x1 );
+     if (isRun3()) {
+       if (getSource() == Barrel) return ( ( roiWord() >> RUN3_ROI_OVERFLOW_SHIFT ) & ROI_OVERFLOW_MASK );
+       else return false; // Endcap + Fwd have no flag for this
+     } else return ( ( roiWord() >> ROI_OVERFLOW_SHIFT ) & ROI_OVERFLOW_MASK );
    }
 
    /// This flag is set to <code>true</code> if the sector that this muon
@@ -136,7 +157,8 @@ namespace xAOD{
    ///
    bool MuonRoI_v1::isMoreCandInSector() const {
 
-      return ( roiWord() & 0x1 );
+     if (isRun3()) return ( ( roiWord() >> RUN3_CAND_OVERFLOW_SHIFT ) & CAND_OVERFLOW_MASK );
+     else return ( ( roiWord() >> CAND_OVERFLOW_SHIFT ) & CAND_OVERFLOW_MASK );
    }
 
    /// The function decodes the sector type encoded in the 8-bit sector address
@@ -147,9 +169,10 @@ namespace xAOD{
    ///
    MuonRoI_v1::RoISource MuonRoI_v1::getSource() const {
 
-      if( this->getSectorAddress() & 0x80 ) {
+     //same mask for run2 and run3
+     if( this->getSectorAddress() & ENDCAP_ADDRESS_MASK ) {
          return Endcap;
-      } else if( this->getSectorAddress() & 0x40 ) {
+     } else if( this->getSectorAddress() & FORWARD_ADDRESS_MASK ) {
          return Forward;
       } else {
          return Barrel;
@@ -164,7 +187,8 @@ namespace xAOD{
    ///
    MuonRoI_v1::Hemisphere MuonRoI_v1::getHemisphere() const {
 
-      if( this->getSectorAddress() & 0x1 ) {
+     //same mask for run2 and run3
+     if( this->getSectorAddress() & SECTOR_HEMISPHERE_MASK ) {
          return Positive;
       } else {
          return Negative;
@@ -181,10 +205,18 @@ namespace xAOD{
 
       if( getSource() == Barrel ) return Undef;
 
-      if( roiWord() & 0x8000000 ) {
-         return Pos;
+      if (isRun3()) {
+	if( ( roiWord() >> RUN3_CAND_TGC_CHARGE_SIGN_SHIFT) & 0x1 ) {
+	  return Pos;
+	} else {
+	  return Neg;
+	}
       } else {
-         return Neg;
+	if( ( roiWord() >> CAND_TGC_CHARGE_SIGN_SHIFT) & 0x1 ) {
+	  return Pos;
+	} else {
+	  return Neg;
+	}
       }
    }
 
@@ -194,7 +226,16 @@ namespace xAOD{
    ///
    bool MuonRoI_v1::isVetoed() const {
 
-      return ( roiWord() & 0x10000000 );
+     if (isRun3()) return ( ( roiWord() >> RUN3_CAND_VETO_SHIFT) & 0x1 );
+     else return ( ( roiWord() >> CAND_VETO_SHIFT) & 0x1 );
+   }
+
+   /// An extra bit is added at the end of the RoI word for run3 candidates
+   /// in the EDM for technical purposes to distinguish whether we want to use
+   /// the run2 or run3 bitmasks in decoding the word
+   bool MuonRoI_v1::isRun3() const {
+
+      return ( roiWord() >> 31 & 0x1 );
    }
 
    //
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/versions/MuonRoI_v1.h b/Event/xAOD/xAODTrigger/xAODTrigger/versions/MuonRoI_v1.h
index 0976fec9c85f..d017a9ec9230 100644
--- a/Event/xAOD/xAODTrigger/xAODTrigger/versions/MuonRoI_v1.h
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/versions/MuonRoI_v1.h
@@ -111,6 +111,8 @@ namespace xAOD {
       Charge getCharge() const;
       /// Returns the veto flag for the candidate
       bool isVetoed() const;
+      /// Returns extra flag at end of RoI word indicating that it's in Run3 format
+      bool isRun3() const;
 
       /// @}
 
diff --git a/Projects/AnalysisBase/package_filters.txt b/Projects/AnalysisBase/package_filters.txt
index b83b59bc01c3..042da7766479 100644
--- a/Projects/AnalysisBase/package_filters.txt
+++ b/Projects/AnalysisBase/package_filters.txt
@@ -125,6 +125,7 @@
 + Trigger/TrigEvent/TrigRoiConversion
 + Trigger/TrigEvent/TrigSteeringEvent
 + Trigger/TrigSteer/TrigCompositeUtils
++ Trigger/TrigT1/TrigT1MuctpiBits
 #+ Trigger/TrigValidation/TrigAnalysisTest
 
 #
diff --git a/Projects/AthAnalysis/package_filters.txt b/Projects/AthAnalysis/package_filters.txt
index dee4753b679e..ec30b4691749 100644
--- a/Projects/AthAnalysis/package_filters.txt
+++ b/Projects/AthAnalysis/package_filters.txt
@@ -128,6 +128,7 @@
 + Trigger/TrigEvent/TrigRoiConversion
 + Trigger/TrigEvent/TrigSteeringEvent
 + Trigger/TrigSteer/TrigCompositeUtils
++ Trigger/TrigT1/TrigT1MuctpiBits
 + Trigger/TrigValidation/TrigAnalysisTest
 #+ Trigger/TriggerSimulation/TrigBtagEmulationTool
 #+ Reconstruction/RecoTools/IsolationTool
diff --git a/Simulation/Digitization/share/LVL1Digitization.py b/Simulation/Digitization/share/LVL1Digitization.py
index 08b7003db7c4..92f0ce869753 100755
--- a/Simulation/Digitization/share/LVL1Digitization.py
+++ b/Simulation/Digitization/share/LVL1Digitization.py
@@ -114,8 +114,13 @@ if DetFlags.digitize.LVL1_on():
     # TrigT1Muctpi Algos
     #--------------------------------------------------------------
     if DetFlags.simulateLVL1.RPC_on() or DetFlags.simulateLVL1.TGC_on():
-        from TrigT1Muctpi.TrigT1MuctpiConfig import L1Muctpi
-        topSequence += L1Muctpi()
+        from AthenaConfiguration.AllConfigFlags import ConfigFlags
+        if ConfigFlags.Trigger.enableL1Phase1:
+            from TrigT1MuctpiPhase1.TrigT1MuctpiPhase1Config import L1MuctpiPhase1
+            topSequence += L1MuctpiPhase1()
+        else:
+            from TrigT1Muctpi.TrigT1MuctpiConfig import L1Muctpi
+            topSequence += L1Muctpi()
 
     #-------------------------------------------------------
     # TrigT1CaloSim Algos
diff --git a/Trigger/TrigConfiguration/TrigConfMuctpi/CMakeLists.txt b/Trigger/TrigConfiguration/TrigConfMuctpi/CMakeLists.txt
index 9fb13604754f..c45939b247f5 100644
--- a/Trigger/TrigConfiguration/TrigConfMuctpi/CMakeLists.txt
+++ b/Trigger/TrigConfiguration/TrigConfMuctpi/CMakeLists.txt
@@ -23,3 +23,4 @@ atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
 atlas_install_scripts( scripts/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
 atlas_install_xmls( data/*.dtd )
 
+
diff --git a/Trigger/TrigT1/TrigT1CTMonitoring/share/TrigT1CTMonitoringJobOptions.py b/Trigger/TrigT1/TrigT1CTMonitoring/share/TrigT1CTMonitoringJobOptions.py
index 00ff054f95a8..db46dee51cd8 100644
--- a/Trigger/TrigT1/TrigT1CTMonitoring/share/TrigT1CTMonitoringJobOptions.py
+++ b/Trigger/TrigT1/TrigT1CTMonitoring/share/TrigT1CTMonitoringJobOptions.py
@@ -200,8 +200,13 @@ elif RunSimOnData:
     #rederive MuCTPI inputs to CTP from muon RDO
     #writes this to the usual MuCTPICTP storegate location
 
-    from TrigT1Muctpi.TrigT1MuctpiConfig import L1Muctpi_on_Data
-    topSequence += L1Muctpi_on_Data()
+    from AthenaConfiguration.AllConfigFlags import ConfigFlags
+    if ConfigFlags.Trigger.enableL1Phase1:
+        from TrigT1MuctpiPhase1.TrigT1MuctpiPhase1Config import L1MuctpiPhase1
+        topSequence += L1MuctpiPhase1_on_Data()
+    else:
+        from TrigT1Muctpi.TrigT1MuctpiConfig import L1Muctpi
+        topSequence += L1Muctpi_on_Data()
     
     from TrigT1CTMonitoring.TrigT1CTMonitoringConf import TrigT1CTMonitoring__DeriveSimulationInputs as DeriveSimulationInputs
  
diff --git a/Trigger/TrigT1/TrigT1CTMonitoring/share/TrigT1CTMonitoringJobOptions_forRecExCommission.py b/Trigger/TrigT1/TrigT1CTMonitoring/share/TrigT1CTMonitoringJobOptions_forRecExCommission.py
index c5ad2d9d3969..cebacd448a39 100644
--- a/Trigger/TrigT1/TrigT1CTMonitoring/share/TrigT1CTMonitoringJobOptions_forRecExCommission.py
+++ b/Trigger/TrigT1/TrigT1CTMonitoring/share/TrigT1CTMonitoringJobOptions_forRecExCommission.py
@@ -184,8 +184,13 @@ if not athenaCommonFlags.isOnline() and jp.ConcurrencyFlags.NumThreads() == 0:
         #svcMgr.DSConfigSvc.readLVL1Thr=True
         #svcMgr.DSConfigSvc.readLVL1BG=True
 
-        from TrigT1Muctpi.TrigT1MuctpiConfig import L1Muctpi_on_Data
-        topSequence += L1Muctpi_on_Data()
+        from AthenaConfiguration.AllConfigFlags import ConfigFlags
+        if ConfigFlags.Trigger.enableL1Phase1:
+            from TrigT1MuctpiPhase1.TrigT1MuctpiPhase1Config import L1MuctpiPhase1_on_Data
+            topSequence += L1MuctpiPhase1_on_Data()
+        else:
+            from TrigT1Muctpi.TrigT1MuctpiConfig import L1Muctpi_on_Data
+            topSequence += L1Muctpi_on_Data()
 
         from TrigT1CTMonitoring.TrigT1CTMonitoringConf import TrigT1CTMonitoring__DeriveSimulationInputs as DeriveSimulationInputs
         topSequence += DeriveSimulationInputs(do_MuCTPI_input=True,
diff --git a/Trigger/TrigT1/TrigT1CTMonitoring/src/BSMonitoring.cxx b/Trigger/TrigT1/TrigT1CTMonitoring/src/BSMonitoring.cxx
index 8fa5384ec267..2cc5dc070c64 100644
--- a/Trigger/TrigT1/TrigT1CTMonitoring/src/BSMonitoring.cxx
+++ b/Trigger/TrigT1/TrigT1CTMonitoring/src/BSMonitoring.cxx
@@ -802,11 +802,11 @@ doMuctpi(const DataHandle<MuCTPI_RDO> theMuCTPI_RDO, const DataHandle<MuCTPI_RIO
 		<< "-Pt" << dataWord.getPt();
     } 
 
-    
+    /*
     if (dataWord.getBCID() == multWord.getBCID()) {
       // Fill the muctpi map for later comparision to RPC and TGC
       muctpiCandidates.insert ( std::pair<std::string,MuCTPI_DataWord_Decoder>(keystring.str(),dataWord) );
- 
+    
      //Use only candidates from the same BCID for overlap histograms
       if (dataWord.getOverlapBits()) {
 	if (dataWord.getSectorLocation() == MuCTPI_RDO::ENDCAP) {
@@ -825,6 +825,7 @@ doMuctpi(const DataHandle<MuCTPI_RDO> theMuCTPI_RDO, const DataHandle<MuCTPI_RIO
 	}
       }
     }
+*/
   }
 
   for ( int y = 0; y < 96; y++ ) {
@@ -866,7 +867,7 @@ doMuctpi(const DataHandle<MuCTPI_RDO> theMuCTPI_RDO, const DataHandle<MuCTPI_RIO
    * BCIDs 
    */
   uint16_t mictpBcid = multWord.getBCID();
-  uint16_t candidateBcid = 0;
+  //uint16_t candidateBcid = 0;
   uint16_t headerBcid =
     (theMuCTPI_RIO) ? theMuCTPI_RIO->getHeaderBCID() : 0;
   bcidMictpHeader->Fill(mictpBcid - (headerBcid & 7));
@@ -896,7 +897,7 @@ doMuctpi(const DataHandle<MuCTPI_RDO> theMuCTPI_RDO, const DataHandle<MuCTPI_RIO
       forwardRoiSectorIDAll->Fill(dataWord.getSectorID()+24*dataWord.getHemisphere(), dataWord.getRoiNumber());
     }
 
-    candidateBcid = dataWord.getBCID();
+/*    candidateBcid = dataWord.getBCID();
 
     int candbcdiff = candidateBcid - mictpBcid;	
     if (candbcdiff > 3) candbcdiff -= 8; 
@@ -911,9 +912,10 @@ doMuctpi(const DataHandle<MuCTPI_RDO> theMuCTPI_RDO, const DataHandle<MuCTPI_RIO
       errorPerLumiBlock->Fill(m_currentLumiBlock);
     }
     else errorSummary->Fill(8,0);
-    
+*/  
     //Use only non-vetoed candidates from the same BCID for multiplicity calculation
-    if ( (dataWord.getBCID() == multWord.getBCID()) && !dataWord.getVetoed() ) {
+    if ( //(dataWord.getBCID() == multWord.getBCID()) && 
+	 !dataWord.getVetoed() ) {
       uint16_t candPt = dataWord.getPt();
       pt->Fill(candPt);
       if (0 < candPt && candPt <= MuCTPI_RDO::MULT_THRESH_NUM) {
@@ -1066,7 +1068,7 @@ doMuctpi(const DataHandle<MuCTPI_RDO> theMuCTPI_RDO, const DataHandle<MuCTPI_RIO
     int rpcnum = rpcCandidates.count(it_mui->first); 
     if (tgcnum > 0 || rpcnum > 0 ) {
       ATH_MSG(DEBUG) << "MuCTPI to RPC/TGC match found: MuCTPI key/ MuCTPI BCID / #TGC matches / #RPC matches: "
-		     << it_mui->first << " / " << it_mui->second.getBCID() << " / " 
+		     << it_mui->first << " / " << /*it_mui->second.getBCID() <<*/ " / " 
 		     << tgcnum << " / " << rpcnum << endmsg;
     } else {
       if ( (it_mui->first).substr(0,2) == "BA" )  { 
@@ -1089,7 +1091,7 @@ doMuctpi(const DataHandle<MuCTPI_RDO> theMuCTPI_RDO, const DataHandle<MuCTPI_RIO
 			 << (it_mui->first).substr(0,2) << endmsg;
       }
       ATH_MSG(WARNING) << "No Muctpi to RPC/TGC match found: MuCTPI key / MuCTPI BCID: " 
-		       << it_mui->first  << " / " << it_mui->second.getBCID() << endmsg;
+		       << it_mui->first  << " / " << /*it_mui->second.getBCID() <<*/ endmsg;
     }
   }
 
@@ -1707,8 +1709,9 @@ doMuonRoI(const DataHandle<MuCTPI_RDO> theMuCTPI_RDO,
 	    if (dataWord.getSectorLocation() == MuCTPI_RDO::BARREL)
 	      sectorID=dataWord.getSectorID(1);
 	    
-	    if ((dataWord.getBCID() == theMuCTPI_RIO->getBCID())
-		&& (sectorID == secID)
+	    if (//(dataWord.getBCID() == theMuCTPI_RIO->getBCID())
+		//&& 
+		(sectorID == secID)
 		&& (dataWord.getRoiNumber() == roInum)
 		&& (dataWord.getSectorLocation() == sysID)
 		&& (dataWord.getHemisphere() == hemisphere)) {
diff --git a/Trigger/TrigT1/TrigT1CTP/src/CTPUtil.cxx b/Trigger/TrigT1/TrigT1CTP/src/CTPUtil.cxx
index 8ccdae03b793..4f2f93bd06e3 100644
--- a/Trigger/TrigT1/TrigT1CTP/src/CTPUtil.cxx
+++ b/Trigger/TrigT1/TrigT1CTP/src/CTPUtil.cxx
@@ -67,6 +67,13 @@ namespace LVL1CTP {
 
    }
 
+   int CTPUtil::getMult( const std::vector<unsigned int>& words, unsigned int startbit, unsigned int endbit ) {
+      std::bitset<256> bits = convertToBitset(words);
+      std::bitset<256> mask = pow( 2, endbit - startbit + 1 ) - 1;
+      bits >>= startbit;
+      return static_cast<int>((bits&mask).to_ulong());
+   }
+
    unsigned int CTPUtil::getMultTopo( uint64_t word, unsigned int cableStart, unsigned int cableEnd, unsigned int clock ) {
 
       unsigned int mult = 0;
diff --git a/Trigger/TrigT1/TrigT1CTP/src/CTPUtil.h b/Trigger/TrigT1/TrigT1CTP/src/CTPUtil.h
index c666b2db66cb..14495854268c 100644
--- a/Trigger/TrigT1/TrigT1CTP/src/CTPUtil.h
+++ b/Trigger/TrigT1/TrigT1CTP/src/CTPUtil.h
@@ -50,6 +50,7 @@ namespace LVL1CTP {
 
       //! extract multiplicities using new trigger configuration interface
       static int getMult( uint64_t word, unsigned int startbit, unsigned int endbit );
+      static int getMult( const std::vector<unsigned int>& words, unsigned int startbit, unsigned int endbit );
 
       //! extract multiplicities from Topo words, were the encoding is different
       static unsigned int getMultTopo( uint64_t word, unsigned int startbit, unsigned int endbit, unsigned int clock );
diff --git a/Trigger/TrigT1/TrigT1Interfaces/CMakeLists.txt b/Trigger/TrigT1/TrigT1Interfaces/CMakeLists.txt
index e7b9dd1baab4..a2c9c39cb23c 100644
--- a/Trigger/TrigT1/TrigT1Interfaces/CMakeLists.txt
+++ b/Trigger/TrigT1/TrigT1Interfaces/CMakeLists.txt
@@ -12,8 +12,8 @@ atlas_add_library( TrigT1Interfaces
                    src/*.cxx
                    PUBLIC_HEADERS TrigT1Interfaces
                    INCLUDE_DIRS ${XERCESC_INCLUDE_DIRS} ${TDAQ-COMMON_INCLUDE_DIRS}
-                   LINK_LIBRARIES ${TDAQ-COMMON_LIBRARIES} ${XERCESC_LIBRARIES} AthContainers AthenaBaseComps AthenaKernel GaudiKernel
-                   PRIVATE_LINK_LIBRARIES TrigConfL1Data )
+                   LINK_LIBRARIES ${TDAQ-COMMON_LIBRARIES} ${XERCESC_LIBRARIES} AthContainers AthenaBaseComps AthenaKernel GaudiKernel TrigT1MuctpiBits
+                   PRIVATE_LINK_LIBRARIES TrigConfL1Data)
 
 atlas_add_dictionary( TrigT1InterfacesDict
                       TrigT1Interfaces/TrigT1InterfacesDict.h
diff --git a/Trigger/TrigT1/TrigT1MuonRecRoiTool/TrigT1MuonRecRoiTool/ITrigT1MuonRecRoiTool.h b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/ITrigT1MuonRecRoiTool.h
similarity index 98%
rename from Trigger/TrigT1/TrigT1MuonRecRoiTool/TrigT1MuonRecRoiTool/ITrigT1MuonRecRoiTool.h
rename to Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/ITrigT1MuonRecRoiTool.h
index b706f35fe18e..e2c9ddd1a280 100644
--- a/Trigger/TrigT1/TrigT1MuonRecRoiTool/TrigT1MuonRecRoiTool/ITrigT1MuonRecRoiTool.h
+++ b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/ITrigT1MuonRecRoiTool.h
@@ -6,7 +6,7 @@
 #define ITRIGT1MUONRECROITOOL_H
 
 #include "GaudiKernel/IAlgTool.h"
-#include "TrigT1MuonRecRoiTool/TrigT1MuonRecRoiData.h"
+#include "TrigT1MuonRecRoiData.h"
 
 namespace LVL1 {
 
diff --git a/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/Lvl1MuCTPIInputPhase1.h b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/Lvl1MuCTPIInputPhase1.h
index d67fce5fd8a5..b25aa0904ffb 100644
--- a/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/Lvl1MuCTPIInputPhase1.h
+++ b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/Lvl1MuCTPIInputPhase1.h
@@ -68,10 +68,14 @@ namespace LVL1MUONIF {
 
 
       const Lvl1MuSectorLogicDataPhase1& getSectorLogicData( size_t systemAddress,
-                                                       size_t subSystemAddress,
-                                                       size_t sectorAddress,
-						       int    bcid=0        ) const;
-
+							     size_t subSystemAddress,
+							     size_t sectorAddress,
+							     int    bcid=0        ) const;
+      std::shared_ptr<Lvl1MuSectorLogicDataPhase1> getSectorLogicDataPtr( size_t systemAddress,
+									  size_t subSystemAddress,
+									  size_t sectorAddress,
+									  int    bcid=0        );
+      
       void setSectorLogicData( const Lvl1MuSectorLogicDataPhase1& data,
                                size_t systemAddress,
                                size_t subSystemAddress,
@@ -126,7 +130,6 @@ namespace LVL1MUONIF {
      typedef std::vector<std::shared_ptr <Lvl1MuSectorLogicDataPhase1> > Lvl1MuVect;
      typedef std::pair<int, Lvl1MuVect>  Lvl1MuVectWithBC; 
      std::vector<Lvl1MuVectWithBC> m_data[ NumberOfMuonSystem ];
-
    }; // class Lvl1MuCTPIInputPhase1
    
    inline size_t Lvl1MuCTPIInputPhase1::idBarrelSystem() { return Barrel; }
diff --git a/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/Lvl1MuSectorLogicDataPhase1.h b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/Lvl1MuSectorLogicDataPhase1.h
index 4e1b7ed66eba..7e0299962235 100644
--- a/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/Lvl1MuSectorLogicDataPhase1.h
+++ b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/Lvl1MuSectorLogicDataPhase1.h
@@ -54,6 +54,7 @@ namespace LVL1MUONIF {
       int goodmf( size_t id) const { return m_goodmf[ id ]; }
       int innercoin( size_t id) const { return m_innercoin[ id ]; }
       int bw2or3( size_t id) const { return m_bw2or3[ id ]; }
+      int veto( size_t id) const {return m_veto[ id ]; } // veto candidate for multiplicity counting due to overlap removal
 
       void set2candidatesInSector() { m_2candidatesInSector = true; }
       void clear2candidatesInSector() { m_2candidatesInSector = false;}
@@ -67,6 +68,7 @@ namespace LVL1MUONIF {
       void goodmf( size_t id, int value) {m_goodmf[ id ] = value; }
       void innercoin( size_t id, int value) {m_innercoin[ id ] = value; }
       void bw2or3( size_t id, int value) {m_bw2or3[ id ] = value; }
+      void veto( size_t id, int value) {m_veto[ id ] = value; }
 
       void clear();
 
@@ -95,6 +97,7 @@ namespace LVL1MUONIF {
       std::vector<int> m_goodmf; //[m_ncand]
       std::vector<int> m_innercoin; //[m_ncand]
       std::vector<int> m_bw2or3; //[m_ncand]
+      std::vector<int> m_veto; //[m_ncand]
 
    }; // class Lvl1MuSectorLogicDataPhase1
 
diff --git a/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/MuCTPICTP.h b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/MuCTPICTP.h
index a1e82a74728a..46314d5ae2a3 100644
--- a/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/MuCTPICTP.h
+++ b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/MuCTPICTP.h
@@ -1,10 +1,12 @@
 // Dear emacs, this is -*- c++ -*-
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 #ifndef TRIGT1INTERFACES_MUCTPICTP_H
 #define TRIGT1INTERFACES_MUCTPICTP_H
 
+#include <vector>
+
 namespace LVL1 {
 
    /**
@@ -23,16 +25,17 @@ namespace LVL1 {
    public:
       /* constructor and destructor */
       MuCTPICTP( unsigned int word = 0 );
+      MuCTPICTP( std::vector<unsigned int> word);
       ~MuCTPICTP();
 
       /**
        * Return the muon data i.e. <code>(xxxxx|thr6|thr5|thr4|thr3|thr2|thr1)</code>
        */
-      unsigned int muCTPIWord() const;
+      std::vector<unsigned int> muCTPIWord() const;
 
    private:
       /// The only data member
-      const unsigned int m_MuCTPICTPWord;
+     std::vector<unsigned int> m_MuCTPICTPWord;
 
    }; // class MuCTPICTP
 
diff --git a/Trigger/TrigT1/TrigT1MuonRecRoiTool/TrigT1MuonRecRoiTool/TrigT1MuonRecRoiData.h b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/TrigT1MuonRecRoiData.h
similarity index 100%
rename from Trigger/TrigT1/TrigT1MuonRecRoiTool/TrigT1MuonRecRoiTool/TrigT1MuonRecRoiData.h
rename to Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/TrigT1MuonRecRoiData.h
diff --git a/Trigger/TrigT1/TrigT1MuonRecRoiTool/src/ITrigT1MuonRecRoiTool.cxx b/Trigger/TrigT1/TrigT1Interfaces/src/ITrigT1MuonRecRoiTool.cxx
similarity index 98%
rename from Trigger/TrigT1/TrigT1MuonRecRoiTool/src/ITrigT1MuonRecRoiTool.cxx
rename to Trigger/TrigT1/TrigT1Interfaces/src/ITrigT1MuonRecRoiTool.cxx
index a5e4762ec7ed..3d22cf0b28ce 100644
--- a/Trigger/TrigT1/TrigT1MuonRecRoiTool/src/ITrigT1MuonRecRoiTool.cxx
+++ b/Trigger/TrigT1/TrigT1Interfaces/src/ITrigT1MuonRecRoiTool.cxx
@@ -2,7 +2,7 @@
   Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
-#include "TrigT1MuonRecRoiTool/ITrigT1MuonRecRoiTool.h"
+#include "TrigT1Interfaces/ITrigT1MuonRecRoiTool.h"
 
 namespace LVL1{
 
diff --git a/Trigger/TrigT1/TrigT1Interfaces/src/Lvl1MuCTPIInputPhase1.cxx b/Trigger/TrigT1/TrigT1Interfaces/src/Lvl1MuCTPIInputPhase1.cxx
index b93409ace6c4..2ae2ab1eba79 100644
--- a/Trigger/TrigT1/TrigT1Interfaces/src/Lvl1MuCTPIInputPhase1.cxx
+++ b/Trigger/TrigT1/TrigT1Interfaces/src/Lvl1MuCTPIInputPhase1.cxx
@@ -44,10 +44,9 @@ namespace LVL1MUONIF {
 
   /////////////
   const Lvl1MuSectorLogicDataPhase1& Lvl1MuCTPIInputPhase1::getSectorLogicData( size_t systemAddress,
-								    size_t subSystemAddress,
-								    size_t sectorAddress,
-								    int    bcid             ) const {
-
+										size_t subSystemAddress,
+										size_t sectorAddress,
+										int    bcid             ) const {
     static const Lvl1MuBarrelSectorLogicDataPhase1 dummy;
     for( size_t ip=0; ip<m_data[systemAddress].size(); ip++){
       int bc=((m_data[systemAddress]).at(ip)).first;
@@ -58,6 +57,19 @@ namespace LVL1MUONIF {
     return dummy;
   }
 
+  /////////////
+  std::shared_ptr<Lvl1MuSectorLogicDataPhase1> Lvl1MuCTPIInputPhase1::getSectorLogicDataPtr( size_t systemAddress,
+											     size_t subSystemAddress,
+											     size_t sectorAddress,
+											     int    bcid             ) {
+    for( size_t ip=0; ip<m_data[systemAddress].size(); ip++){
+      int bc=((m_data[systemAddress]).at(ip)).first;
+      if (bc != bcid) continue;
+      return m_data[systemAddress].at(ip).second.at(getSystemIndex(systemAddress,subSystemAddress,sectorAddress));
+    }
+    return nullptr;
+  }
+
   /////////////
   void Lvl1MuCTPIInputPhase1::setSectorLogicData( const Lvl1MuSectorLogicDataPhase1& data,
 					    size_t systemAddress,
diff --git a/Trigger/TrigT1/TrigT1Interfaces/src/Lvl1MuSectorLogicDataPhase1.cxx b/Trigger/TrigT1/TrigT1Interfaces/src/Lvl1MuSectorLogicDataPhase1.cxx
index c9d982207685..58a1078fbde7 100644
--- a/Trigger/TrigT1/TrigT1Interfaces/src/Lvl1MuSectorLogicDataPhase1.cxx
+++ b/Trigger/TrigT1/TrigT1Interfaces/src/Lvl1MuSectorLogicDataPhase1.cxx
@@ -28,6 +28,7 @@ namespace LVL1MUONIF {
     m_goodmf.clear();
     m_innercoin.clear();
     m_bw2or3.clear();
+    m_veto.clear();
   }
 
   void Lvl1MuSectorLogicDataPhase1::initialize()
@@ -44,6 +45,7 @@ namespace LVL1MUONIF {
       m_goodmf.push_back(-1);
       m_innercoin.push_back(-1);
       m_bw2or3.push_back(-1);
+      m_veto.push_back(0);
     }
   }
 
@@ -66,6 +68,7 @@ namespace LVL1MUONIF {
         m_goodmf[ i ] = right.m_goodmf[ i ];
         m_innercoin[ i ] = right.m_innercoin[ i ];
         m_bw2or3[ i ] = right.m_bw2or3[ i ];
+        m_veto[ i ] = right.m_veto[ i ];
       }
     }
     return *this;
@@ -90,6 +93,7 @@ namespace LVL1MUONIF {
       m_goodmf[ i ] = -1;
       m_innercoin[ i ] = -1;
       m_bw2or3[ i ] = -1;
+      m_veto[ i ] = 0;
     }
   }
 
diff --git a/Trigger/TrigT1/TrigT1Interfaces/src/MuCTPICTP.cxx b/Trigger/TrigT1/TrigT1Interfaces/src/MuCTPICTP.cxx
index 094f9e987e87..5731aaf03438 100644
--- a/Trigger/TrigT1/TrigT1Interfaces/src/MuCTPICTP.cxx
+++ b/Trigger/TrigT1/TrigT1Interfaces/src/MuCTPICTP.cxx
@@ -7,15 +7,20 @@
 namespace LVL1 {
 
   MuCTPICTP::MuCTPICTP( unsigned int word )
-    : m_MuCTPICTPWord( word ) {
+  {
+    m_MuCTPICTPWord.push_back(word);
+  }
 
+  MuCTPICTP::MuCTPICTP( std::vector<unsigned int> word )
+    : m_MuCTPICTPWord(word)
+  {
   }
 
   MuCTPICTP::~MuCTPICTP() {
 
   }
 
-  unsigned int MuCTPICTP::muCTPIWord() const {
+  std::vector<unsigned int> MuCTPICTP::muCTPIWord() const {
     return m_MuCTPICTPWord;
   }
 
diff --git a/Trigger/TrigT1/TrigT1MuonRecRoiTool/src/TrigT1MuonRecRoiData.cxx b/Trigger/TrigT1/TrigT1Interfaces/src/TrigT1MuonRecRoiData.cxx
similarity index 96%
rename from Trigger/TrigT1/TrigT1MuonRecRoiTool/src/TrigT1MuonRecRoiData.cxx
rename to Trigger/TrigT1/TrigT1Interfaces/src/TrigT1MuonRecRoiData.cxx
index 9e701535b27c..2db017756b02 100644
--- a/Trigger/TrigT1/TrigT1MuonRecRoiTool/src/TrigT1MuonRecRoiData.cxx
+++ b/Trigger/TrigT1/TrigT1Interfaces/src/TrigT1MuonRecRoiData.cxx
@@ -2,7 +2,7 @@
   Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
-#include "TrigT1MuonRecRoiTool/TrigT1MuonRecRoiData.h"
+#include "TrigT1Interfaces/TrigT1MuonRecRoiData.h"
 #include <math.h>  /* M_PI */
 
 namespace LVL1{
diff --git a/Trigger/TrigT1/TrigT1MuctpiBits/CMakeLists.txt b/Trigger/TrigT1/TrigT1MuctpiBits/CMakeLists.txt
new file mode 100644
index 000000000000..6203d37d5397
--- /dev/null
+++ b/Trigger/TrigT1/TrigT1MuctpiBits/CMakeLists.txt
@@ -0,0 +1,10 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
+# Declare the package name.
+atlas_subdir( TrigT1MuctpiBits )
+
+# Component(s) in the package.
+atlas_add_library( TrigT1MuctpiBits
+                   TrigT1MuctpiBits/*.h
+		   INTERFACE
+		   PUBLIC_HEADERS TrigT1MuctpiBits )
diff --git a/Trigger/TrigT1/TrigT1MuctpiBits/TrigT1MuctpiBits/MuCTPI_Bits.h b/Trigger/TrigT1/TrigT1MuctpiBits/TrigT1MuctpiBits/MuCTPI_Bits.h
new file mode 100755
index 000000000000..c5cb9436a02f
--- /dev/null
+++ b/Trigger/TrigT1/TrigT1MuctpiBits/TrigT1MuctpiBits/MuCTPI_Bits.h
@@ -0,0 +1,133 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TRIGT1RESULT_MUCTPI_BITS_H
+#define TRIGT1RESULT_MUCTPI_BITS_H
+
+  /// Binary 111 representing the maximal multiplicity value for a given threshold
+   static constexpr uint32_t MULT_VAL = 7;
+  /// Number of multiplicity bits reserved per threshold
+   static constexpr uint32_t MULT_BITS = 3;
+  /// Defining the number of p<sub>T</sub> thresholds in the system
+   static constexpr uint32_t RUN3_MULT_THRESH_NUM = 32;
+   static constexpr uint32_t MULT_THRESH_NUM = 6;
+  /// Telling that the 3-bit BCID comes at "position 7" in the multiplicity word
+   static constexpr uint32_t RUN3_MULT_BCID_POS = 26;
+   static constexpr uint32_t MULT_BCID_POS = 7;
+
+  /// Mask for the bit showing if more than two muon candidates were in the trigger sector
+   static constexpr uint32_t CAND_OVERFLOW_MASK = 0x1;
+  /// Position of the candidate overflow mask
+   static constexpr uint32_t RUN3_CAND_OVERFLOW_SHIFT = 17;
+   static constexpr uint32_t CAND_OVERFLOW_SHIFT = 0;
+
+  /// Mask for the bit showing if more than one muon candidates were in the sector RoI
+   static constexpr uint32_t ROI_OVERFLOW_MASK = 0x1;
+  /// Position of the RoI overflow mask
+   static constexpr uint32_t RUN3_ROI_OVERFLOW_SHIFT = 13;
+   static constexpr uint32_t ROI_OVERFLOW_SHIFT = 1;
+
+  /// Mask for the full potential ROI word from the data words
+   static constexpr uint32_t ROI_MASK = 0xff; /// new in v2
+  /// Mask for extracting the RoI for barrel candidates from the data words
+   static constexpr uint32_t BARREL_ROI_MASK = 0x1f;
+  /// Mask for extracting the RoI for endcap candidates from the data words
+   static constexpr uint32_t ENDCAP_ROI_MASK = 0xff;
+  /// Mask for extracting the RoI for forward candidates from the data words
+   static constexpr uint32_t FORWARD_ROI_MASK = 0x3f;
+  /// Position of the RoI bits in the data word
+   static constexpr uint32_t RUN3_ROI_SHIFT = 0;
+   static constexpr uint32_t ROI_SHIFT = 2;
+
+//===== Need to double check that the run3 positions are correct for the OL flags=====
+  /// Mask for extracting the overlap bits for barrel candidates from the data words
+   static constexpr uint32_t RUN3_BARREL_OL_MASK = 0x1; // only the phi ovl is used in the run3 format
+   static constexpr uint32_t BARREL_OL_MASK = 0x3;
+  /// Position of the overlap bits in barrel data words
+   static constexpr uint32_t RUN3_BARREL_OL_SHIFT = 12; // this is now part of the 4 "candidate flags" bits
+   static constexpr uint32_t BARREL_OL_SHIFT = 9;
+  /// Mask for extracting the overlap bits for endcap candidates from the data words
+   static constexpr uint32_t ENDCAP_OL_MASK = 0x1;
+  /// Position of the overlap bits in endcap data words
+   //static constexpr uint32_t RUN3_ENDCAP_OL_SHIFT = 8; // 10-2 = 8 // not used in run3 format
+   static constexpr uint32_t ENDCAP_OL_SHIFT = 10;
+
+  /// Mask for extracting the p<sub>T</sub> threshold passed by the candidate from the data word
+   static constexpr uint32_t RUN3_CAND_PT_MASK = 0xf;
+   static constexpr uint32_t CAND_PT_MASK = 0x7;
+  /// Position of the p<sub>T</sub> threshold bits in the data words
+   static constexpr uint32_t RUN3_CAND_PT_SHIFT = 8;
+   static constexpr uint32_t CAND_PT_SHIFT = 11;
+
+/// gone in v2
+//These aren't part of the LVL2 word in run 2, but part of the DAQ word
+  /// Mask for extracting the last 3 bits of the BCID of the muon candidate from the data word
+   static constexpr uint32_t CAND_BCID_MASK = 0x7;
+  /// Position of the BCID bits in the data words
+   static constexpr uint32_t CAND_BCID_SHIFT = 14;
+
+  /// Mask for extracting the address of the muon candidate from the data word
+  /// This is the mask and shift for the full sector address, including the hemisphere as the least significant bit
+   static constexpr uint32_t CAND_SECTOR_ADDRESS_MASK = 0xff;
+  /// Mask for the bit showing which hemisphere the candidate came from.(1: positive; 0: negative)
+   static constexpr uint32_t SECTOR_HEMISPHERE_MASK = 0x1;
+  /// Position of the muon candidate's address in the data word
+   static constexpr uint32_t RUN3_CAND_SECTOR_ADDRESS_SHIFT = 21;
+   static constexpr uint32_t CAND_SECTOR_ADDRESS_SHIFT = 14;//17; 17 is for the DAQ word, not LVL2
+
+//====The shift doesn't correspond to the mask here (the mask corresponds to the SECTOR_ADDRESS_SHIFT above) === 
+  /// Bit in the candidate's address turned on for endcap candidates
+   static constexpr uint32_t ENDCAP_ADDRESS_MASK = 0x80;
+  /// Bit in the candidate's address turned on for forward candidates
+   static constexpr uint32_t FORWARD_ADDRESS_MASK = 0x40;
+   /// Mask for both forward and endcap bits
+   static constexpr uint32_t SUBSYS_ADDRESS_MASK = 0xc0;
+/// Position in the data word of the subsystem bits
+   static constexpr uint32_t RUN3_SUBSYS_ADDRESS_SHIFT = 27;
+   static constexpr uint32_t SUBSYS_ADDRESS_SHIFT = 20;
+
+  /// Mask for extracting the sector ID for endcap candidates from the data word
+   static constexpr uint32_t ENDCAP_SECTORID_MASK = 0x3f;
+  /// Mask for extracting the sector ID for forward candidates from the data word
+   static constexpr uint32_t FORWARD_SECTORID_MASK = 0x1f;
+  /// Mask for extracting the sector ID for barrel candidates from the data word
+   static constexpr uint32_t BARREL_SECTORID_MASK = 0x1f;
+  /// Position of the sector ID itself, which is one bit left of the full sector address
+   static constexpr uint32_t RUN3_CAND_SECTORID_SHIFT = 22;
+   static constexpr uint32_t CAND_SECTORID_SHIFT = 15;
+
+/// gone in v2
+  /// Mask for extracting the bit from the data word showing whether the candidate had the highest p<sub>T</sub> in the sector
+   static constexpr uint32_t CAND_HIGHEST_PT_MASK = 0x1;
+  /// Position of the "highest p<sub>T</sub>" bit
+   static constexpr uint32_t CAND_HIGHEST_PT_SHIFT = 22;
+
+/// gone in v2
+//These aren't part of the LVL2 word in run 2, but part of the DAQ word
+  /// Mask for extracting the bit from the data word showing if the muon candidate was sent to the RoIB
+   static constexpr uint32_t CAND_SENT_ROI_MASK = 0x1;
+  /// Position of the "candidate sent to RoIB" bit.
+   static constexpr uint32_t CAND_SENT_ROI_SHIFT = 26;
+
+  /// Position of the bit turned on for the multiplicity words that distinguishes them from the data words
+   static constexpr uint32_t RUN3_MULT_WORD_FLAG_SHIFT = 31; // is 31 correct? - check with Stefan
+   static constexpr uint32_t MULT_WORD_FLAG_SHIFT = 29;
+
+  /// Position of the bit specifying the candidate's sign
+   static constexpr uint32_t RUN3_CAND_TGC_CHARGE_SIGN_SHIFT = 12;
+   static constexpr uint32_t CAND_TGC_CHARGE_SIGN_SHIFT = 27;
+  /// Position of the bit specifying 3-station coincidence from the big wheel
+   static constexpr uint32_t RUN3_CAND_TGC_BW2OR3_SHIFT = 13;
+  /// Position of the bit specifying coincidence with inner detectors
+   static constexpr uint32_t RUN3_CAND_TGC_INNERCOIN_SHIFT = 14;
+  /// Position of the bit specifying if RoI is in a good b-field region (1=good, 0=bad)
+   static constexpr uint32_t RUN3_CAND_TGC_GOODMF_SHIFT = 15;
+
+  /// Position of the bit specifying if a candidate was vetoed in the multiplicity sum
+   static constexpr uint32_t RUN3_CAND_VETO_SHIFT = 16;
+   static constexpr uint32_t CAND_VETO_SHIFT = 28;
+
+#endif 
diff --git a/Trigger/TrigT1/TrigT1MuctpiPhase1/CMakeLists.txt b/Trigger/TrigT1/TrigT1MuctpiPhase1/CMakeLists.txt
index b6d5d0e6957b..02d2d0637b34 100644
--- a/Trigger/TrigT1/TrigT1MuctpiPhase1/CMakeLists.txt
+++ b/Trigger/TrigT1/TrigT1MuctpiPhase1/CMakeLists.txt
@@ -11,7 +11,12 @@ atlas_add_component( TrigT1MuctpiPhase1
                      src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${Boost_INCLUDE_DIRS}
-                     LINK_LIBRARIES AnalysisTriggerEvent AthenaBaseComps CxxUtils GaudiKernel PathResolver StoreGateLib TrigConfInterfaces TrigConfL1Data TrigConfMuctpi TrigT1Interfaces TrigT1Result xAODTrigger )
+                     LINK_LIBRARIES AnalysisTriggerEvent 
+		     AthenaBaseComps CxxUtils GaudiKernel 
+		     PathResolver StoreGateLib TrigConfInterfaces 
+		     TrigConfData TrigConfL1Data TrigConfMuctpi 
+		     TrigT1Interfaces TrigT1Result
+		     xAODTrigger )
 
 # Install files from the package:
 atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
diff --git a/Trigger/TrigT1/TrigT1MuctpiPhase1/TrigT1MuctpiPhase1/MUCTPI_AthTool.h b/Trigger/TrigT1/TrigT1MuctpiPhase1/TrigT1MuctpiPhase1/MUCTPI_AthTool.h
index 37cd244926c5..2135de4d7ff0 100644
--- a/Trigger/TrigT1/TrigT1MuctpiPhase1/TrigT1MuctpiPhase1/MUCTPI_AthTool.h
+++ b/Trigger/TrigT1/TrigT1MuctpiPhase1/TrigT1MuctpiPhase1/MUCTPI_AthTool.h
@@ -16,26 +16,15 @@ class description
 #include "TrigT1Interfaces/MuCTPICTP.h"
 #include "TrigT1Interfaces/MuCTPIL1Topo.h"
 
-#include "TrigT1Result/MuCTPI_RDO.h"
 #include "xAODTrigger/MuonRoIContainer.h"
 
-#include "TrigT1MuctpiPhase1/Configuration.h"
-
-#include "TrigConfInterfaces/ILVL1ConfigSvc.h"
-
-//#include "TrigConfL1Data/Run3MuonTriggerThreshold.h"
-#include "TrigConfL1Data/TriggerThresholdValue.h"
-#include "TrigConfL1Data/L1DataDef.h"
-#include "TrigConfL1Data/L1DataBaseclass.h"
-
 #include "AthenaBaseComps/AthAlgTool.h"
 #include "GaudiKernel/IIncidentListener.h"
 #include "GaudiKernel/ToolHandle.h"
 #include "StoreGate/DataHandle.h"
 
-namespace TrigConf {
-   class ILVL1ConfigSvc;
-   class TriggerThreshold;
+namespace LVL1 {
+  class ITrigT1MuonRecRoiTool;
 }
 
 namespace LVL1MUCTPIPHASE1 {
@@ -54,6 +43,7 @@ namespace LVL1MUCTPIPHASE1 {
 
     virtual void handle(const Incident&) override;
     virtual StatusCode initialize() override;
+    virtual StatusCode start() override;
     virtual StatusCode execute() override;
 
     virtual StatusCode fillMuCTPIL1Topo(LVL1::MuCTPIL1Topo& l1topoCandidates, int bcidOffset) const override;
@@ -85,8 +75,7 @@ namespace LVL1MUCTPIPHASE1 {
 
     SG::ReadHandleKey<LVL1MUONIF::Lvl1MuCTPIInputPhase1> m_muctpiPhase1KeyRPC{this, "MuctpiPhase1LocationRPC", "L1MuctpiStoreRPC", "Location of muctpiPhase1 for Rpc"};
     SG::ReadHandleKey<LVL1MUONIF::Lvl1MuCTPIInputPhase1> m_muctpiPhase1KeyTGC{this, "MuctpiPhase1LocationTGC", "L1MuctpiStoreTGC", "Location of muctpiPhase1 for Tgc"};
-    SG::ReadHandleKey<MuCTPI_RDO> m_MuCTPI_RDOReadKey{this, "MUCTPI_RDOReadKey", "MUCTPI_RDO", "Location of MuCTPI_RDO"};
-    SG::WriteHandleKey<MuCTPI_RDO> m_MuCTPI_RDOWriteKey{this, "MUCTPI_RDOWriteKey", "MUCTPI_RDO", "Location of MuCTPI_RDO"};
+    SG::WriteHandleKey<LVL1::MuCTPICTP> m_MuCTPICTPWriteKey{this, "MuCTPICTPLocation", "MuCTPICTP", "Location of MuCTPICTP"};
     SG::WriteHandleKey<xAOD::MuonRoIContainer> m_MuCTPI_xAODWriteKey{this, "MUCTPI_xAODLocation", "LVL1MuonRoIs", "Location of xAOD::MuonRoIContainer"};
     SG::WriteHandleKey<LVL1::MuCTPIL1Topo> m_MuCTPIL1TopoKey;
     SG::WriteHandleKey<LVL1::MuCTPIL1Topo> m_MuCTPIL1TopoKey_m2;
@@ -94,6 +83,8 @@ namespace LVL1MUCTPIPHASE1 {
     SG::WriteHandleKey<LVL1::MuCTPIL1Topo> m_MuCTPIL1TopoKey_p1;
     SG::WriteHandleKey<LVL1::MuCTPIL1Topo> m_MuCTPIL1TopoKey_p2;
 
+
+
     // These properties control how the multiplicity summation happens:
     std::string m_multiplicityStrategyName;
     std::string m_multiplicityXMLFile;
@@ -116,8 +107,12 @@ namespace LVL1MUCTPIPHASE1 {
     static const std::string m_DEFAULT_roibLocation;
     static const std::string m_DEFAULT_geometryXMLFile;
     
-    ServiceHandle< TrigConf::ILVL1ConfigSvc > m_configSvc;
+    ServiceHandle<StoreGateSvc> m_detStore { this, "DetectorStore", "StoreGateSvc/DetectorStore", "Detector store to get the menu" };
+
     SimController* m_theMuctpi;
+    ToolHandle<LVL1::ITrigT1MuonRecRoiTool> m_rpcTool;
+    ToolHandle<LVL1::ITrigT1MuonRecRoiTool> m_tgcTool;
+
 
     /// Function pointer to the execute function we want to use:
     StatusCode ( LVL1MUCTPIPHASE1::MUCTPI_AthTool::*m_executeFunction )( void );
diff --git a/Trigger/TrigT1/TrigT1MuctpiPhase1/TrigT1MuctpiPhase1/MuonSectorProcessor.h b/Trigger/TrigT1/TrigT1MuctpiPhase1/TrigT1MuctpiPhase1/MuonSectorProcessor.h
index 97f675dba836..6090650ae489 100644
--- a/Trigger/TrigT1/TrigT1MuctpiPhase1/TrigT1MuctpiPhase1/MuonSectorProcessor.h
+++ b/Trigger/TrigT1/TrigT1MuctpiPhase1/TrigT1MuctpiPhase1/MuonSectorProcessor.h
@@ -20,6 +20,8 @@ namespace LVL1 {
 }
 
 namespace LVL1MUCTPIPHASE1 {
+  class OverlapHelper;
+
   class ROIObject
   {
   public:
@@ -38,12 +40,13 @@ namespace LVL1MUCTPIPHASE1 {
     
   public:
     
-    MuonSectorProcessor(int subSystem);
+    MuonSectorProcessor(bool side /*1=A,0=C*/);
     ~MuonSectorProcessor();
     
-    void configure(const std::string& xmlName);
+    void configureTopo(const std::string& xmlName);
+    void configureOverlapRemoval(const std::string& lutFile);
     void setInput(LVL1MUONIF::Lvl1MuCTPIInputPhase1* input);
-    void removeOverlap();
+    void runOverlapRemoval();
     void makeTriggerObjectSelections();
     void makeL1TopoData();
     LVL1::MuCTPIL1Topo getL1TopoData(int bcidOffset);
@@ -54,6 +57,8 @@ namespace LVL1MUCTPIPHASE1 {
     LVL1MUONIF::Lvl1MuCTPIInputPhase1* m_muctpiInput;
     LVL1::MuCTPIL1Topo* m_l1topo;
     std::map<std::string, std::map<unsigned int, ROIObject> > m_roiConfig;
+    OverlapHelper* m_overlapHelper;
+    bool m_side;
   };
 }
 
diff --git a/Trigger/TrigT1/TrigT1MuctpiPhase1/TrigT1MuctpiPhase1/SimController.h b/Trigger/TrigT1/TrigT1MuctpiPhase1/TrigT1MuctpiPhase1/SimController.h
index fb2628291302..aedc20152c2b 100644
--- a/Trigger/TrigT1/TrigT1MuctpiPhase1/TrigT1MuctpiPhase1/SimController.h
+++ b/Trigger/TrigT1/TrigT1MuctpiPhase1/TrigT1MuctpiPhase1/SimController.h
@@ -34,18 +34,13 @@ namespace LVL1MUCTPIPHASE1 {
     SimController();
     ~SimController();
 
-    void configureMSP(const std::string& xmlName);
+    void configureTopo(const std::string& geoFile);
+    void configureOverlapRemoval(const std::string& lutFile);
 
     void processData(LVL1MUONIF::Lvl1MuCTPIInputPhase1* input, int bcid=0);
     void setConfiguration( const Configuration& conf );
 
-    const std::vector<unsigned int>& getCTPData();
     LVL1::MuCTPIL1Topo getL1TopoData(int bcidOffset);
-    const std::vector<unsigned int>& getDAQData();
-    std::list< unsigned int > getRoIBData();
-
-    bool hasBarrelCandidate();
-    bool hasEndcapCandidate();
 
     TriggerProcessor* getTriggerProcessor();
 
diff --git a/Trigger/TrigT1/TrigT1MuctpiPhase1/TrigT1MuctpiPhase1/TriggerProcessor.h b/Trigger/TrigT1/TrigT1MuctpiPhase1/TrigT1MuctpiPhase1/TriggerProcessor.h
index 984f9acea26e..3a440d57e7eb 100644
--- a/Trigger/TrigT1/TrigT1MuctpiPhase1/TrigT1MuctpiPhase1/TriggerProcessor.h
+++ b/Trigger/TrigT1/TrigT1MuctpiPhase1/TrigT1MuctpiPhase1/TriggerProcessor.h
@@ -8,9 +8,12 @@
 
 #include <vector>
 #include <list>
+#include <map>
+#include <string>
+#include <utility>
 
 namespace TrigConf {
-  class TriggerThreshold;
+  class L1Menu;
 }
 
 namespace LVL1MUONIF {
@@ -27,20 +30,26 @@ namespace LVL1MUCTPIPHASE1 {
     TriggerProcessor();
     ~TriggerProcessor();
 
-    void setThresholds(const std::vector<TrigConf::TriggerThreshold*>& thresholds);
+    void setMenu(const TrigConf::L1Menu* l1menu);
     void mergeInputs(std::vector<LVL1MUONIF::Lvl1MuCTPIInputPhase1*> inputs);
     void computeMultiplicities(int bcid);
     void makeTopoSelections();
     const std::vector<unsigned int>& getCTPData();
-    const std::vector<unsigned int>& getDAQData();
+
+    //subsystem - daq word pairs
+    const std::vector<std::pair<int, unsigned int> >& getDAQData();
 
   private:
 
+    std::vector<std::string> parseString(std::string str, std::string sep);
+
     std::vector<unsigned int> m_ctp_words;
-    std::vector<unsigned int> m_daq_data;
+    std::vector<std::pair<int, unsigned int> > m_daq_data;
 
     LVL1MUONIF::Lvl1MuCTPIInputPhase1* m_mergedInputs;
-    std::vector<TrigConf::TriggerThreshold*> m_thresholds;
+    const TrigConf::L1Menu* m_l1menu;
+
+    std::map<std::string, std::vector<std::vector<std::string> > > m_parsed_tgcFlags;
   };
 }
 
diff --git a/Trigger/TrigT1/TrigT1MuctpiPhase1/python/TrigT1MuctpiPhase1Config.py b/Trigger/TrigT1/TrigT1MuctpiPhase1/python/TrigT1MuctpiPhase1Config.py
index b83cd57f1113..f7e450941308 100644
--- a/Trigger/TrigT1/TrigT1MuctpiPhase1/python/TrigT1MuctpiPhase1Config.py
+++ b/Trigger/TrigT1/TrigT1MuctpiPhase1/python/TrigT1MuctpiPhase1Config.py
@@ -62,7 +62,7 @@ class L1MuctpiPhase1_on_Data( DefaultL1MuctpiPhase1 ):
     self.RoIOutputLocID = "not_used_1"
     self.CTPOutputLocID = "/Run/L1MuCTPItoCTPLocation"
     self.OverlapStrategyName = "LUT"
-    self.LUTXMLFile = "TrigConfMuctpi/data10_7TeV.periodI.physics_Muons.MuCTPI_LUT.NoBEOverlaps_composedEF.v002_modifiedBB_crc_3385316356.xml"
+    self.LUTXMLFile = "TrigConfMuctpi/overlapRun3_20201214.xml"
     self.IsData=1
     self.FlaggingMode = False
 
@@ -106,45 +106,18 @@ class DefaultL1MuctpiPhase1Tool( LVL1MUCTPIPHASE1__MUCTPI_AthTool ):
     # Set properties of the LUT overlap handling:
     self.OverlapStrategyName = "LUT"
     self.DumpLUT = False
-    self.LUTXMLFile = "UNDEFINED"
-    self.RunPeriod = "UNDEFINED"
     self.FlaggingMode = False
     self.MultiplicityStrategyName = "INCLUSIVE"
     self.GeometryXMLFile = "TrigConfMuctpi/L1MuonGeometry_20200629.xml"
 
     # Decide which LUT to use, based on which run we are simulating:
-    from AtlasGeoModel.CommonGMJobProperties import CommonGeometryFlags as commonGeoFlags
-    from AtlasGeoModel.InDetGMJobProperties import InDetGeometryFlags as geoFlags
-    if ( commonGeoFlags.Run() == "RUN1" ) or ( ( commonGeoFlags.Run() == "UNDEFINED" ) and
-                                               ( geoFlags.isIBL() is False ) ):
-      self.LUTXMLFile = "TrigConfMuctpi/data10_7TeV.periodI.physics_Muons.MuCTPI_LUT.NoBEOverlaps_composedEF.v002.xml"
-      self.RunPeriod = "RUN1"
-      logger.info( "Configuring MuCTPI simulation with Run 1 configuration file:" )
-      logger.info( "  TrigConfMuctpi/data10_7TeV.periodI.physics_Muons.MuCTPI_LUT.NoBEOverlaps_composedEF.v002.xml" )
-      logger.info( "  with a RunPeriod=RUN1" )
-    elif ( commonGeoFlags.Run() == "RUN2" ) or ( ( commonGeoFlags.Run() == "UNDEFINED" ) and
-                                                 ( geoFlags.isIBL() is True ) ):
-      self.LUTXMLFile = "TrigConfMuctpi/data10_7TeV.periodI.physics_Muons.MuCTPI_LUT.NoBEOverlaps_composedEF.v002_modifiedBB.xml"
-      self.RunPeriod = "RUN2"
-      logger.info( "Configuring MuCTPI simulation with Run 2 configuration file:" )
-      logger.info( "  TrigConfMuctpi/data10_7TeV.periodI.physics_Muons.MuCTPI_LUT.NoBEOverlaps_composedEF.v002_modifiedBB.xml" )
-      logger.info( "  with a RunPeriod=RUN2" )
-    else:
-      self.LUTXMLFile = "TrigConfMuctpi/data10_7TeV.periodI.physics_Muons.MuCTPI_LUT.NoBEOverlaps_composedEF.v002_modifiedBB.xml"
-      self.RunPeriod = "RUN2"
-      logger.warning( "Couldn't determine which run to simulate, using Run 2 configuration file:" )
-      logger.warning( "  TrigConfMuctpi/data10_7TeV.periodI.physics_Muons.MuCTPI_LUT.NoBEOverlaps_composedEF.v002_modifiedBB.xml" )
-      logger.warning( "  with a RunPeriod=RUN2" )
-
-      pass
-
-
-    # Turn on the NIM output creation by default:
-    self.DoNIMOutput = True
-    # The bit settings were extracted from here:
-    #   https://savannah.cern.ch/bugs/?90300#comment14
-    self.NIMBarrelBit = 29
-    self.NIMEndcapBit = 30
+    #from AtlasGeoModel.CommonGMJobProperties import CommonGeometryFlags as commonGeoFlags
+    #from AtlasGeoModel.InDetGMJobProperties import InDetGeometryFlags as geoFlags
+    self.LUTXMLFile = "TrigConfMuctpi/overlapRun3_20201214.xml"
+    self.RunPeriod  = "RUN3"
+    logger.info( "Configuring MuCTPI simulation with " + self.RunPeriod +" configuration file:" )
+    logger.info( "  "+self.LUTXMLFile )
+    logger.info( "  with a RunPeriod=" + self.RunPeriod )
 
 
 class L1MuctpiPhase1Tool( DefaultL1MuctpiPhase1Tool ):
@@ -194,7 +167,7 @@ class L1MuctpiPhase1Tool_on_Data( DefaultL1MuctpiPhase1Tool ):
     self.RoIOutputLocID = "not_used_1"
     self.CTPOutputLocID = "/Run/L1MuCTPItoCTPLocation"
     self.OverlapStrategyName = "LUT"
-    self.LUTXMLFile = "TrigConfMuctpi/data10_7TeV.periodI.physics_Muons.MuCTPI_LUT.NoBEOverlaps_composedEF.v002_modifiedBB_crc_3385316356.xml"
+    self.LUTXMLFile = "TrigConfMuctpi/overlapRun3_20201214.xml"
     self.IsData=1
     self.FlaggingMode = False
 
diff --git a/Trigger/TrigT1/TrigT1MuctpiPhase1/src/MUCTPI_AthTool.cxx b/Trigger/TrigT1/TrigT1MuctpiPhase1/src/MUCTPI_AthTool.cxx
index 569cfea8c2ff..b29da504279b 100644
--- a/Trigger/TrigT1/TrigT1MuctpiPhase1/src/MUCTPI_AthTool.cxx
+++ b/Trigger/TrigT1/TrigT1MuctpiPhase1/src/MUCTPI_AthTool.cxx
@@ -14,11 +14,7 @@
 // Headers from external packages.
 
 // The new trigger configuration
-#include "TrigConfInterfaces/ILVL1ConfigSvc.h"
-#include "TrigConfL1Data/Muctpi.h"
-#include "TrigConfL1Data/ThresholdConfig.h"
-#include "TrigConfL1Data/TriggerThreshold.h"
-#include "TrigConfL1Data/L1DataDef.h"
+#include "TrigConfData/L1Menu.h"
 
 // Interfaces used by the simulation
 #include "TrigT1Interfaces/MuCTPICTP.h"
@@ -28,10 +24,10 @@
 #include "TrigT1Interfaces/Lvl1MuCTPIInputPhase1.h"
 #include "TrigT1Interfaces/MuCTPIL1Topo.h"
 
-#include "TrigT1Result/MuCTPI_RDO.h"
 #include "TrigT1Result/MuCTPIRoI.h"
 #include "xAODTrigger/MuonRoI.h"
 #include "xAODTrigger/MuonRoIAuxContainer.h"
+#include "TrigT1Interfaces/ITrigT1MuonRecRoiTool.h"
 
 #include "AnalysisTriggerEvent/LVL1_ROI.h"
 
@@ -54,9 +50,9 @@ namespace LVL1MUCTPIPHASE1 {
     :
     base_class(type, name, parent),
     m_MuCTPIL1TopoKey(LVL1MUCTPI::DEFAULT_MuonL1TopoLocation),
-    m_MuCTPIL1TopoKey_p1(""),
-    m_configSvc( "TrigConf::TrigConfigSvc/TrigConfigSvc", name ),
-    m_theMuctpi(new SimController())
+    m_theMuctpi(new SimController()),
+    m_rpcTool("LVL1::TrigT1RPCRecRoiTool/LVL1__TrigT1RPCRecRoiTool"),
+    m_tgcTool("LVL1::TrigT1TGCRecRoiTool/LVL1__TrigT1TGCRecRoiTool")
   {
     
     // Init message
@@ -64,9 +60,6 @@ namespace LVL1MUCTPIPHASE1 {
     ATH_MSG_INFO( "Constructor for Phase1 MUCTPI_AthTool."  );
     ATH_MSG_INFO( "=======================================" );
 
-    // Declare the service handles as properties:
-    declareProperty( "LVL1ConfigSvc", m_configSvc, "LVL1 Config Service" );
-
     // Declare the properties of the overlap treatment:
     declareProperty( "OverlapStrategyName", m_overlapStrategyName = "NULL" );
     declareProperty( "LUTXMLFile", m_lutXMLFile = "" );
@@ -91,6 +84,9 @@ namespace LVL1MUCTPIPHASE1 {
     declareProperty( "TGCLocID", m_tgcLocId = m_DEFAULT_L1MuctpiStoreLocationTGC );
     declareProperty( "RPCLocID", m_rpcLocId = m_DEFAULT_L1MuctpiStoreLocationRPC );
    
+    // Declare the MuonRecRoiTools
+    declareProperty( "RPCRecRoiTool", m_rpcTool, "Tool to get the eta/phi coordinates in the RPC");
+    declareProperty( "TGCRecRoiTool", m_tgcTool, "Tool to get the eta/phi coordinates in the TGC");
   }
   
   MUCTPI_AthTool::~MUCTPI_AthTool()
@@ -140,15 +136,10 @@ namespace LVL1MUCTPIPHASE1 {
       return StatusCode::FAILURE;
 
     }
-    ATH_MSG_INFO( "Retrieving trigger config service" << m_configSvc );
-    CHECK(m_configSvc.retrieve());
 
     //initialize MSP ROI configuration
     const std::string fullFileName = PathResolverFindCalibFile( m_geometryXMLFile );
-    m_theMuctpi->configureMSP(fullFileName);
-
-    m_theMuctpi->getTriggerProcessor()->setThresholds(m_configSvc->thresholdConfig()->getThresholdVector(TrigConf::L1DataDef::MUON));
-    //m_theMuctpi->getTriggerProcessor()->setThresholds(m_configSvc->muctpiConfig()->thresholds()); // maybe better to switch to this once new config is implemented
+    m_theMuctpi->configureTopo(fullFileName);
 
     //                                                                                                                                                                                        
     // Set up the overlap handling of the simulation:                                                                                                                                         
@@ -157,12 +148,10 @@ namespace LVL1MUCTPIPHASE1 {
     if( m_overlapStrategyName == "NULL" ) {
 
       ATH_MSG_DEBUG( "Setting overlap strategy: \"NULL\"" );
-      //m_theMuctpi->setOverlapStrategy( NO_OVERLAP ); // overlap removal to be implemented later
 
     } else if( m_overlapStrategyName == "LUT" ) {
 
       ATH_MSG_DEBUG( "Setting overlap strategy: \"LUT\"" );
-      //m_theMuctpi->setOverlapStrategy( LUT_OVERLAP ); // overlap removal to be implemented later
 
       if( m_flagMode ) {
 	ATH_MSG_INFO( "Using 'flagging mode' in the overlap handling" );
@@ -171,8 +160,8 @@ namespace LVL1MUCTPIPHASE1 {
       ATH_MSG_INFO( "XML LUT file defined in jobO: " << m_lutXMLFile << " with a RunPeriod=" << m_runPeriod );
       const std::string fullFileName = PathResolverFindCalibFile( m_lutXMLFile );
       ATH_MSG_DEBUG( "Full path to XML LUT file: " << fullFileName );
-      //CHECK( m_theMuctpi->initializeLUTOverlapStrategy( fullFileName, m_flagMode,
-      //                                                        m_dumpLut, m_runPeriod ) ); // overlap removal to be implemented later
+
+      m_theMuctpi->configureOverlapRemoval(fullFileName);
 
     } else {
 
@@ -188,8 +177,7 @@ namespace LVL1MUCTPIPHASE1 {
     //Initialize Read/WriteHandleKeys
     ATH_CHECK(m_muctpiPhase1KeyRPC.initialize());
     ATH_CHECK(m_muctpiPhase1KeyTGC.initialize());
-    ATH_CHECK(m_MuCTPI_RDOReadKey.initialize(m_inputSource == "RDO"));
-    ATH_CHECK(m_MuCTPI_RDOWriteKey.initialize(m_inputSource != "RDO"));
+    ATH_CHECK(m_MuCTPICTPWriteKey.initialize());
     ATH_CHECK(m_MuCTPI_xAODWriteKey.initialize());
     ATH_CHECK(m_MuCTPIL1TopoKey.initialize());
 
@@ -202,11 +190,26 @@ namespace LVL1MUCTPIPHASE1 {
     m_MuCTPIL1TopoKey_p2 = m_MuCTPIL1TopoKey.key()+std::to_string(2);
     ATH_CHECK(m_MuCTPIL1TopoKey_p2.initialize());
 
+    CHECK( m_rpcTool.retrieve() );
+    CHECK( m_tgcTool.retrieve() );
 
     return StatusCode::SUCCESS;
   }
 
+  StatusCode MUCTPI_AthTool::start()
+  {
+    ATH_MSG_INFO( "=======================================" );
+    ATH_MSG_INFO( "Start for Phase1 MUCTPI_AthTool"  );
+    ATH_MSG_INFO( "=======================================" );
+
 
+    ATH_MSG_INFO( "initialize(): use L1 trigger menu from detector store" );
+    const TrigConf::L1Menu * l1menu = nullptr;
+    ATH_CHECK( m_detStore->retrieve(l1menu) ); 
+    m_theMuctpi->getTriggerProcessor()->setMenu(l1menu);
+
+    return StatusCode::SUCCESS;
+  }
 
   //----------------------------------------------
   // execute() method called once per event
@@ -394,15 +397,12 @@ namespace LVL1MUCTPIPHASE1 {
     /// the standart processing is done for the central slice, with no Bcid offset
     if (bcidOffset == 0 ) {
       // store CTP result in interface object and put to StoreGate
-      std::vector<unsigned int> ctpData = m_theMuctpi->getCTPData();
-    //TEMPORARILY REMOVED UNTIL MUCTPICTP UPDATED TO VECTOR!
-      //LVL1::MuCTPICTP* theCTPResult = new LVL1::MuCTPICTP( ctpData );
-      //CHECK( evtStore()->record( theCTPResult, m_ctpOutputLocId ) );
-      //ATH_MSG_DEBUG( "CTP word recorded to StoreGate with key: "
-      //               << m_ctpOutputLocId );
+      const std::vector<unsigned int>& ctpData = m_theMuctpi->getTriggerProcessor()->getCTPData();
 
-      // create MuCTPI RDO
-      const std::vector<unsigned int>& daqData = m_theMuctpi->getDAQData();
+      LVL1::MuCTPICTP* theCTPResult = new LVL1::MuCTPICTP( ctpData );
+      SG::WriteHandle<LVL1::MuCTPICTP> wh_muctpi_ctp(m_MuCTPICTPWriteKey);
+      ATH_CHECK(wh_muctpi_ctp.record(std::make_unique<LVL1::MuCTPICTP>(*theCTPResult)));
+      ATH_MSG_DEBUG( "CTP word recorded to StoreGate" );
 
       // size check
       // check that the multiplicity was properly filled
@@ -413,23 +413,21 @@ namespace LVL1MUCTPIPHASE1 {
 	return StatusCode::FAILURE;
       }
 
-      // data word
-      std::vector<unsigned int> dataWords= daqData;
-
       // create MuCTPI RDO
-      auto muCTPI_RDO = std::make_unique< MuCTPI_RDO >( std::move(ctpData), std::move(dataWords) );
-      SG::WriteHandle<MuCTPI_RDO> wh_muctpi_rdo(m_MuCTPI_RDOWriteKey);
-      ATH_CHECK(wh_muctpi_rdo.record(std::move(muCTPI_RDO)));
-      ATH_MSG_DEBUG( "MuCTPI_RDO object recorded to StoreGate");
+      const std::vector<std::pair<int, unsigned int> >& daqData = m_theMuctpi->getTriggerProcessor()->getDAQData();
 
       // create MuCTPI xAOD
       auto xAODRoIs = SG::makeHandle(m_MuCTPI_xAODWriteKey);
       ATH_CHECK(xAODRoIs.record(std::make_unique<xAOD::MuonRoIContainer>(), std::make_unique<xAOD::MuonRoIAuxContainer>()));
       ATH_MSG_DEBUG("Recorded MuonRoIContainer with key " << m_MuCTPI_xAODWriteKey.key());
-      for (const unsigned int word : daqData) {
+      for (std::pair<int, unsigned int> word : daqData) {
         xAODRoIs->push_back(new xAOD::MuonRoI);
-        // RB: dummy values just to have the objects for downstream code development
-        xAODRoIs->back()->initialize(word, 99, 99, "DummyThreshold", 99);
+
+	LVL1::TrigT1MuonRecRoiData roiData;
+	if (word.first == 0) roiData = m_rpcTool->roiData(word.second); // barrel
+	else roiData = m_tgcTool->roiData(word.second); // endcap/forward
+
+        xAODRoIs->back()->initialize(word.second, roiData.eta(), roiData.phi(), "DummyThreshold", 99);
       }
 
       // get outputs for L1Topo and store into Storegate
diff --git a/Trigger/TrigT1/TrigT1MuctpiPhase1/src/MuonSectorProcessor.cxx b/Trigger/TrigT1/TrigT1MuctpiPhase1/src/MuonSectorProcessor.cxx
index 09342a8a8103..d1e9ee101cd5 100644
--- a/Trigger/TrigT1/TrigT1MuctpiPhase1/src/MuonSectorProcessor.cxx
+++ b/Trigger/TrigT1/TrigT1MuctpiPhase1/src/MuonSectorProcessor.cxx
@@ -5,7 +5,6 @@
 // First the corresponding header.
 #include "TrigT1MuctpiPhase1/MuonSectorProcessor.h"
 
-
 // The headers from other ATLAS packages,
 // from most to least dependent.
 #include "TrigT1Interfaces/Lvl1MuCTPIInputPhase1.h"
@@ -20,24 +19,222 @@
 // System headers.
 #include <string>
 #include <sstream>
+#include <iostream>
+#include <map>
+#include <set>
+#include <array>
+#include <vector>
+
 
 using boost::property_tree::ptree;
 
-namespace LVL1MUCTPIPHASE1 {
-  MuonSectorProcessor::MuonSectorProcessor(int /*subSystem*/)
+namespace LVL1MUCTPIPHASE1 { 
+  struct SectorNumberConverter {
+    
+    std::pair<int,int> barrel_global2local(int sector){
+      auto inoct_sector = ((sector + 2) % 4);
+      auto mioct_number = ((sector + 2) / 4) % 8;
+      return std::make_pair(inoct_sector,mioct_number);
+    }
+    
+    int barrel_local2global(int number,int mioct){
+      return ((30 + 4 * mioct)  + number) % 32;
+    }
+    
+    std::pair<int,int>  endcap_global2local(int sector){
+      auto inoct_sector = ((sector + 1) % 6);
+      auto mioct_number = ((sector + 1) / 6) % 8;
+      return std::make_pair(inoct_sector,mioct_number);
+      
+    }
+    
+    int endcap_local2global(int number,int mioct){
+      return ((47 + 6 * mioct)  + number) % 48;
+    }
+    std::pair<int,int> forward_global2local(int sector){
+      auto inoct_sector = (sector % 3);
+      auto mioct_number = (sector / 3) % 8;
+      return std::make_pair(inoct_sector,mioct_number);
+      
+    }
+    
+    int forward_local2global(int number,int mioct){
+      return ((0 + 3 * mioct)  + number) % 24;
+    }
+  };
+
+  struct OverlapHelper
+  {
+    int active_side = -1;
+    std::string sub_left="";
+    std::string sub_right="";
+    int sec_left = -1;
+    int sec_right = -1;
+    std::map<int,std::set<std::string> > global_pairs;
+    
+    std::array<std::map<std::string,std::vector<std::string>>,2> lhs_index;
+    std::array<std::map<std::string,std::vector<std::string>>,2> rhs_index;
+    
+    std::string make_key(std::string prefix, int global_sec, int roi){
+      prefix += std::to_string(global_sec) + "_" + std::to_string(roi);
+      return prefix;
+    }
+    
+    std::string make_pair(std::string lhs, std::string rhs){
+      return lhs + ":" + rhs;
+    }
+
+
+    void create_indices(){
+      for(auto side_regions : global_pairs ){
+	for(auto region : side_regions.second){
+	  auto split = region.find(':');
+	  auto left = region.substr(0,split);
+	  auto right = region.substr(split+1,std::string::npos);
+	  lhs_index[side_regions.first][left].push_back(right);
+	  rhs_index[side_regions.first][right].push_back(left);
+	}
+      }
+    }
+    
+    std::vector<std::string> get_lhs_keys(std::string dettype, int roi, int sector){
+      std::vector<std::string>  r;
+      r.push_back(dettype + std::to_string(sector) + "_" + std::to_string(roi));
+      return r;   
+    }
+    
+    std::vector<std::string> get_rhs_keys(std::string dettype, int roi, int sector){
+      std::vector<std::string>  r;
+      r.push_back(dettype + std::to_string(sector) + "_" + std::to_string(roi));
+      return r;   
+    }
+    
+    std::vector<std::string> relevant_regions(int side, const std::string& dettype, int roi, int sector){
+      std::vector<std::string>  r;
+      for(auto key : get_lhs_keys(dettype,roi,sector)){
+	auto x = lhs_index[side].find(key);
+	if(x != lhs_index[side].end()){
+	  for(auto rr : lhs_index[side][key]){
+	    r.push_back(make_pair(key,rr));
+	  }
+	}
+      }
+      for(auto key : get_rhs_keys(dettype,roi,sector)){
+	auto x = rhs_index[side].find(key);
+	if(x != rhs_index[side].end()){
+	  for(auto rr : rhs_index[side][key]){
+	    r.push_back(make_pair(rr,key));
+	  }
+	}
+      }
+      return r;
+    }
+
+    void configure(const std::string& lutFile)
+    {
+      ptree inputTree;
+      read_xml(lutFile, inputTree);
+      
+      boost::property_tree::ptree topEle = inputTree.get_child("MUCTPI_LUT");
+      
+      // iterate through elements of the XML
+      for(const boost::property_tree::ptree::value_type &x: topEle) {
+	
+	std::string topElementName = x.first;
+	ptree lut = x.second;
+	
+	
+	if (topElementName != "LUT") continue;
+
+	std::string SectorId1 = MuctpiXMLHelper::getAttribute(lut,"SectorId1");
+	std::string SectorId2 = MuctpiXMLHelper::getAttribute(lut,"SectorId2");
+	
+	unsigned left_mod = 32;
+	unsigned right_mod = 32;
+	if (SectorId1[0] == 'E') left_mod = 48;
+	if (SectorId1[0] == 'F') left_mod = 24;
+	if (SectorId2[0] == 'E') right_mod = 48;
+	if (SectorId2[0] == 'F') right_mod = 24;
+	
+	std::string snum_left = std::string(1,SectorId1[1])+std::string(1,SectorId1[2]);
+	sub_left = std::string(1,SectorId1[0]);
+	sec_left = std::stoi(snum_left) % left_mod;
+	
+	std::string snum_right = std::string(1,SectorId2[1])+std::string(1,SectorId2[2]);
+	sub_right = std::string(1,SectorId2[0]);
+	sec_right = std::stoi(snum_right) % right_mod;
+	
+	std::string side = MuctpiXMLHelper::getAttribute(lut,"Side");
+	if (side == "C") active_side = 0;
+	else active_side = 1;
+	
+	for(const boost::property_tree::ptree::value_type &z: lut) {
+	  std::string menuElementName = z.first;
+	  ptree ele = z.second;
+	  
+	  if (std::string("BBElement").compare(menuElementName) == 0){
+	    auto roi1 = MuctpiXMLHelper::getIntAttribute(ele, "RoI1");
+	    auto roi2 = MuctpiXMLHelper::getIntAttribute(ele, "RoI2");
+	    auto lhs_key = make_key("B",sec_left,roi1);
+	    auto rhs_key = make_key("B",sec_right,roi2);
+	    auto region = make_pair(lhs_key,rhs_key);
+	    global_pairs[active_side].insert(region);
+	  }
+	  else if (std::string("BEElement").compare(menuElementName) == 0){
+	    auto roi1 = MuctpiXMLHelper::getIntAttribute(ele, "BRoI");
+	    auto roi2 = MuctpiXMLHelper::getIntAttribute(ele, "ERoI");
+	    auto lhs_key = make_key("B",sec_left,roi1);
+	    auto rhs_key = make_key("E",sec_right,roi2);
+	    auto region = make_pair(lhs_key,rhs_key);
+	    global_pairs[active_side].insert(region);
+	  }
+	  else if (std::string("EEElement").compare(menuElementName) == 0){
+	    auto roi1 = MuctpiXMLHelper::getIntAttribute(ele, "RoI1");
+	    auto roi2 = MuctpiXMLHelper::getIntAttribute(ele, "RoI2");
+	    auto lhs_key = make_key("E",sec_left,roi1);
+	    auto rhs_key = make_key("E",sec_right,roi2);
+	    auto region = make_pair(lhs_key,rhs_key);
+	    global_pairs[active_side].insert(region);
+	  }
+	  else if (std::string("EFElement").compare(menuElementName) == 0){
+	    auto roi1 = MuctpiXMLHelper::getIntAttribute(ele, "ERoI");
+	    auto roi2 = MuctpiXMLHelper::getIntAttribute(ele, "FRoI");
+	    auto lhs_key = make_key("E",sec_left,roi1);
+	    auto rhs_key = make_key("F",sec_right,roi2);
+	    auto region = make_pair(lhs_key,rhs_key);
+	    global_pairs[active_side].insert(region);
+	  }
+	  else if (std::string("FFElement").compare(menuElementName) == 0){
+	    auto roi1 = MuctpiXMLHelper::getIntAttribute(ele, "RoI1");
+	    auto roi2 = MuctpiXMLHelper::getIntAttribute(ele, "RoI2");
+	    auto lhs_key = make_key("F",sec_left,roi1);
+	    auto rhs_key = make_key("F",sec_right,roi2);
+	    auto region = make_pair(lhs_key,rhs_key);
+	    global_pairs[active_side].insert(region);
+	  }
+	}
+      }
+      create_indices();
+    }
+  };
+  
+
+  MuonSectorProcessor::MuonSectorProcessor(bool side)
     :
     m_muctpiInput(nullptr),
-    m_l1topo(nullptr)
+    m_l1topo(nullptr),
+    m_overlapHelper(new OverlapHelper),
+    m_side(side)
   {
     
   }
   
   MuonSectorProcessor::~MuonSectorProcessor()
   {
-    
+    delete m_overlapHelper;
   }
 
-  void MuonSectorProcessor::configure(const std::string& xmlName)
+  void MuonSectorProcessor::configureTopo(const std::string& xmlName)
   {
     ptree inputTree;
     read_xml(xmlName, inputTree);
@@ -79,15 +276,66 @@ namespace LVL1MUCTPIPHASE1 {
       }
     }
   }
+
+  void MuonSectorProcessor::configureOverlapRemoval(const std::string& lutFile)
+  {
+    m_overlapHelper->configure(lutFile);
+  }
   
   void MuonSectorProcessor::setInput(LVL1MUONIF::Lvl1MuCTPIInputPhase1* input)
   {
     m_muctpiInput=input;
   }
   
-  void MuonSectorProcessor::removeOverlap()
+  void MuonSectorProcessor::runOverlapRemoval()
   {
+    std::map<std::string,std::vector<std::pair<std::shared_ptr<LVL1MUONIF::Lvl1MuSectorLogicDataPhase1>, unsigned> > > buckets;
+
+    for (size_t isys=0;isys<LVL1MUONIF::Lvl1MuCTPIInputPhase1::numberOfSystems();isys++)
+    {
+      // Sectors per system
+      LVL1MUONIF::Lvl1MuCTPIInputPhase1::MuonSystem system = static_cast<LVL1MUONIF::Lvl1MuCTPIInputPhase1::MuonSystem>(isys);
+      for (size_t isec=0;isec<LVL1MUONIF::Lvl1MuCTPIInputPhase1::numberOfSector(system);isec++)
+      {
+	// A+C sides
+	for (size_t isub=0;isub<2;isub++)
+	{
+	  if (isub != size_t(m_side)) continue;
+	  unsigned int bcid=0;//temporary
+
+	  //get a pointer to this since we'll need to modify the 'veto' flag of the SL data
+	  std::shared_ptr<LVL1MUONIF::Lvl1MuSectorLogicDataPhase1> sectorData = m_muctpiInput->getSectorLogicDataPtr(isys, isub, isec, bcid);
+	  if (!sectorData) continue;
+	  
+	  for (unsigned int icand=0;icand<LVL1MUONIF::NCAND[isys];icand++)
+	  {
+	    //build the sector name
+	    std::string sectorName="";
+	    if (isys == 0) sectorName="B";
+	    else if (isys == 1) sectorName="E";
+	    else if (isys == 2) sectorName="F";
+	    
+	    int roiID = sectorData->roi(icand);
+	    if (roiID < 0) continue;
+	    int ptword = sectorData->pt(icand);
+	    if (ptword < 0) continue;
+
+	    for(auto rr : m_overlapHelper->relevant_regions(m_side,sectorName,roiID,isec))
+	    {
+	      buckets[rr].push_back(std::make_pair(sectorData, icand));
+	    }
+	  }
+	}
+      }
+    }
 
+    for(auto candidate_vector : buckets){ // loop over candidates in OL region pair
+      //for each candidate above the first, mark them as overlapping
+      for (unsigned i=1;i<candidate_vector.second.size();i++)
+      {
+	candidate_vector.second[i].first->veto(candidate_vector.second[i].second, 1);
+      }
+    }
   }
   
   void MuonSectorProcessor::makeTriggerObjectSelections()
@@ -109,6 +357,7 @@ namespace LVL1MUCTPIPHASE1 {
 	// A+C sides
 	for (size_t isub=0;isub<2;isub++)
 	{
+	  if (isub != size_t(m_side)) continue;
 	  unsigned int bcid=0;//temporary
 	  const LVL1MUONIF::Lvl1MuSectorLogicDataPhase1* sectorData = &m_muctpiInput->getSectorLogicData(isys, isub, isec, bcid);
 	  if (!sectorData)
@@ -124,7 +373,7 @@ namespace LVL1MUCTPIPHASE1 {
 	    else if (isys == 1) sectorName<<"E";
 	    else if (isys == 2) sectorName<<"F";
 	    
-	    LVL1MUONIF::Lvl1MuCTPIInputPhase1::MuonSubSystem side = static_cast<LVL1MUONIF::Lvl1MuCTPIInputPhase1::MuonSubSystem>(isec);
+	    LVL1MUONIF::Lvl1MuCTPIInputPhase1::MuonSubSystem side = static_cast<LVL1MUONIF::Lvl1MuCTPIInputPhase1::MuonSubSystem>(isub);
 	    if (isys == 0)
 	    {
 	      int sectorNumber=isec;
@@ -149,6 +398,8 @@ namespace LVL1MUCTPIPHASE1 {
 
 	    int roiID = sectorData->roi(icand);
 	    if (roiID < 0) continue;
+	    int ptword = sectorData->pt(icand);
+	    if (ptword < 0) continue;
 
 	    //find the ROI object
 	    std::map<unsigned int, ROIObject>::iterator roiItr = secItr->second.find(roiID);
@@ -159,7 +410,6 @@ namespace LVL1MUCTPIPHASE1 {
 
 	    
 
-	    //unsigned int bcid=0;
 	    unsigned int ptThresholdID=0;
 	    unsigned int ptL1TopoCode=0;
 	    unsigned int ptValue=0;
@@ -203,6 +453,6 @@ namespace LVL1MUCTPIPHASE1 {
   LVL1::MuCTPIL1Topo MuonSectorProcessor::getL1TopoData(int bcidOffset)
   {
     if (bcidOffset > -5 && bcidOffset < 5) return *m_l1topo;
-    return LVL1::MuCTPIL1Topo(); // return junk for now but fix this when we have an established procedure for handling bcid offsets
+    return LVL1::MuCTPIL1Topo();
   }
 }
diff --git a/Trigger/TrigT1/TrigT1MuctpiPhase1/src/SimController.cxx b/Trigger/TrigT1/TrigT1MuctpiPhase1/src/SimController.cxx
index 8695dcfd3b45..506eeff9aaac 100644
--- a/Trigger/TrigT1/TrigT1MuctpiPhase1/src/SimController.cxx
+++ b/Trigger/TrigT1/TrigT1MuctpiPhase1/src/SimController.cxx
@@ -35,9 +35,14 @@ namespace LVL1MUCTPIPHASE1 {
     delete m_triggerProcessor;
   }
 
-  void SimController::configureMSP(const std::string& xmlFile)
+  void SimController::configureTopo(const std::string& geoFile)
   {
-    for (int i=0;i<(int)m_muonSectorProcessors.size();i++) m_muonSectorProcessors[i]->configure(xmlFile);
+    for (int i=0;i<(int)m_muonSectorProcessors.size();i++) m_muonSectorProcessors[i]->configureTopo(geoFile);
+  }
+
+  void SimController::configureOverlapRemoval(const std::string& lutFile)
+  {
+    for (int i=0;i<(int)m_muonSectorProcessors.size();i++) m_muonSectorProcessors[i]->configureOverlapRemoval(lutFile);
   }
 
   // set Configuration                                                                                                                                      
@@ -65,7 +70,7 @@ namespace LVL1MUCTPIPHASE1 {
     for (int i=0;i<nMSP;i++)
     {
       m_muonSectorProcessors[i]->setInput(input);
-      m_muonSectorProcessors[i]->removeOverlap();
+      m_muonSectorProcessors[i]->runOverlapRemoval();
       m_muonSectorProcessors[i]->makeTriggerObjectSelections();
       m_muonSectorProcessors[i]->makeL1TopoData();
       processedInputs.push_back(m_muonSectorProcessors[i]->getOutput());
@@ -78,11 +83,6 @@ namespace LVL1MUCTPIPHASE1 {
     m_triggerProcessor->makeTopoSelections();
   }
 
-  const std::vector<uint32_t>& SimController::getCTPData()
-  {
-    return m_triggerProcessor->getCTPData();
-  }
-  
   LVL1::MuCTPIL1Topo SimController::getL1TopoData(int bcidOffset)
   {
     LVL1::MuCTPIL1Topo l1topo;
@@ -94,27 +94,6 @@ namespace LVL1MUCTPIPHASE1 {
     return l1topo;
   }
 
-  const std::vector<unsigned int>& SimController::getDAQData()
-  {
-    return m_triggerProcessor->getDAQData();
-  }
-
-  std::list<unsigned int> SimController::getRoIBData()
-  {
-    std::list<unsigned int> dummy;
-    return dummy;
-  }
-
-  bool SimController::hasBarrelCandidate()
-  {
-    return false;
-  }
-
-  bool SimController::hasEndcapCandidate()
-  {
-    return false;
-  }
-
   TriggerProcessor* SimController::getTriggerProcessor()
   {
     return m_triggerProcessor;
diff --git a/Trigger/TrigT1/TrigT1MuctpiPhase1/src/TriggerProcessor.cxx b/Trigger/TrigT1/TrigT1MuctpiPhase1/src/TriggerProcessor.cxx
index 648d7ee90886..3aa3a4c5cd7c 100644
--- a/Trigger/TrigT1/TrigT1MuctpiPhase1/src/TriggerProcessor.cxx
+++ b/Trigger/TrigT1/TrigT1MuctpiPhase1/src/TriggerProcessor.cxx
@@ -1,5 +1,5 @@
-/*                                                                                                                      
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration                                               
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 // First the corresponding header.
@@ -12,17 +12,22 @@
 #include "TrigT1Interfaces/Lvl1MuSectorLogicConstantsPhase1.h"
 #include "TrigT1Result/MuCTPI_RDO.h"
 #include "TrigT1MuctpiPhase1/Configuration.h"
-#include "TrigConfL1Data/TriggerThreshold.h"
+#include "TrigConfData/L1ThrExtraInfo.h"
+#include "TrigConfData/L1Threshold.h"
+#include "TrigConfData/L1Menu.h"
 
 // Headers from external packages.
 #include <math.h>
+#include <bitset>
+#include <sstream>
 
 // System headers.
 
 namespace LVL1MUCTPIPHASE1 {
   TriggerProcessor::TriggerProcessor()
     :
-    m_mergedInputs(new LVL1MUONIF::Lvl1MuCTPIInputPhase1())
+    m_mergedInputs(new LVL1MUONIF::Lvl1MuCTPIInputPhase1()),
+    m_l1menu(nullptr)
   {
     
   }
@@ -33,9 +38,9 @@ namespace LVL1MUCTPIPHASE1 {
   }
 
 
-  void TriggerProcessor::setThresholds(const std::vector<TrigConf::TriggerThreshold*>& thresholds)
+  void TriggerProcessor::setMenu(const TrigConf::L1Menu* l1menu)
   {
-    m_thresholds = thresholds;
+    m_l1menu = l1menu;
   }
   
   void TriggerProcessor::mergeInputs(std::vector<LVL1MUONIF::Lvl1MuCTPIInputPhase1*> inputs)
@@ -51,8 +56,9 @@ namespace LVL1MUCTPIPHASE1 {
     m_daq_data.clear();
 
     //initialize the vector to hold the threshold multiplicities
-    int nThresholds = m_thresholds.size();
-    std::vector<int> multiplicities(nThresholds, 0);
+    const std::vector<std::shared_ptr<TrigConf::L1Threshold> >* thresholds = &m_l1menu->thresholds("MU");
+    int nThresholds = thresholds->size();
+    std::vector<int> multiplicities(nThresholds,0);
 
 
     // Barrel + EC + Fwd
@@ -73,48 +79,25 @@ namespace LVL1MUCTPIPHASE1 {
 	  {
 	    int thresh = sectorData->pt(icand);
 	    if (thresh == -1) continue; // no candidate
+	    int roiID = sectorData->roi(icand);
+	    if (roiID < 0) continue;
 
-	    //loop over each muon threshold and see if this candidate satisfies it
-/*This will be migrated later along with the changes needed in the TrigConfL1Data package
-	    for (int ithresh=0;ithresh<nThresholds;ithresh++)
-	    {
-	      const TrigConf::TriggerThreshold* thr = m_thresholds[ithresh];
-	      const TrigConf::Run3MuonTriggerThreshold* muthr = thr->run3MuonTriggerThreshold();
-	      bool passed=false;
-	      if (isys == LVL1MUONIF::Lvl1MuCTPIInputPhase1::idBarrelSystem())
-	      {
-		if ((int)muthr->rpcThr()+1 >= thresh) passed=true;
-	      }
-	      else
-	      {
-		if ((int)muthr->tgcThr()+1 >= thresh) passed=true;
-	      }
-	      if (passed) multiplicities[ithresh]++;
-	    }
-*/
-
-	    //build the daq word here
+	    // Build the DAQ word
 	    uint32_t daq_word=0;
+
+	    // Some definitions that are different between subsystems
 	    uint32_t ROI_MASK=0;
-	    uint32_t OL_MASK=0;
-	    uint32_t OL_SHIFT=0;
 	    uint32_t SECTOR_MASK = 0;
-	    uint32_t SECTORID_SHIFT = MuCTPI_RDO::CAND_SECTOR_ADDRESS_SHIFT+1;
-	    uint32_t SUBSYS_SHIFT = MuCTPI_RDO::CAND_SECTOR_ADDRESS_SHIFT+6;
 	    uint32_t SUBSYS_MASK = 0x3;
 	    uint32_t SUBSYS_ID = 0; // default for barrel
 	    if (isys == 0) 
 	    {
 	      ROI_MASK = MuCTPI_RDO::BARREL_ROI_MASK;
-	      OL_MASK = MuCTPI_RDO::BARREL_OL_MASK;
-	      OL_SHIFT = MuCTPI_RDO::BARREL_OL_SHIFT;
 	      SECTOR_MASK = MuCTPI_RDO::BARREL_SECTORID_MASK;
 	    }
 	    else if (isys == 1) 
 	    {
 	      ROI_MASK = MuCTPI_RDO::ENDCAP_ROI_MASK;
-	      OL_MASK = MuCTPI_RDO::ENDCAP_OL_MASK;
-	      OL_SHIFT = MuCTPI_RDO::ENDCAP_OL_SHIFT;
 	      SECTOR_MASK = MuCTPI_RDO::ENDCAP_SECTORID_MASK;
 	      SUBSYS_ID = 2; // not a typo!
 	    }
@@ -124,89 +107,183 @@ namespace LVL1MUCTPIPHASE1 {
 	      SECTOR_MASK = MuCTPI_RDO::FORWARD_SECTORID_MASK;
 	      SUBSYS_ID = 1; // not a typo!
 	    }
+
 	    //General formula for each subword:
 	    //daq_word |= (subword & MuCTPI_RDO::MASK) << MuCTPI_RDO::SHIFT
-	    daq_word |= (sectorData->is2candidatesInSector() & MuCTPI_RDO::CAND_OVERFLOW_MASK) << MuCTPI_RDO::CAND_OVERFLOW_SHIFT;
-	    daq_word |= (sectorData->is2candidates(icand)    & MuCTPI_RDO::ROI_OVERFLOW_MASK)  << MuCTPI_RDO::ROI_OVERFLOW_SHIFT;
-	    daq_word |= (sectorData->roi(icand)              & ROI_MASK)                       << MuCTPI_RDO::ROI_SHIFT;
-	    daq_word |= (sectorData->ovl(icand)              & OL_MASK)                        << OL_SHIFT;
-	    daq_word |= (thresh                              & MuCTPI_RDO::CAND_PT_MASK)       << MuCTPI_RDO::CAND_PT_SHIFT;
-	    //	    daq_word |= (sectorData->bcid()                  & MuCTPI_RDO::CAND_BCID_MASK)     << MuCTPI_RDO::CAND_BCID_SHIFT; // bcid not included in this word (yet?)
-
-	    //set the address information
-	    daq_word |= (isub      & MuCTPI_RDO::SECTOR_HEMISPHERE_MASK) << MuCTPI_RDO::CAND_SECTOR_ADDRESS_SHIFT;
-	    daq_word |= (isec      & SECTOR_MASK)                        << SECTORID_SHIFT;
-	    daq_word |= (SUBSYS_ID & SUBSYS_MASK)                        << SUBSYS_SHIFT;
 	    
-	    //there are other items that are less important. let's ignore them for the moment
-	    m_daq_data.push_back(daq_word);
+	    //ROI word
+	    daq_word |= (sectorData->roi(icand)              & ROI_MASK)                       << MuCTPI_RDO::RUN3_ROI_SHIFT;
+
+	    //PT word
+	    daq_word |= (thresh                              & MuCTPI_RDO::CAND_PT_MASK)       << MuCTPI_RDO::RUN3_CAND_PT_SHIFT;
+
+	    //CANDIDIATE FLAGS
+	    if (isys == 0) 
+	    {
+	      daq_word |= (sectorData->ovl(icand)              & MuCTPI_RDO::RUN3_BARREL_OL_MASK) << MuCTPI_RDO::RUN3_BARREL_OL_SHIFT;
+	      daq_word |= (sectorData->is2candidates(icand)    & MuCTPI_RDO::ROI_OVERFLOW_MASK)   << MuCTPI_RDO::RUN3_ROI_OVERFLOW_SHIFT;
+	    }
+	    else
+	    {
+	      daq_word |= (sectorData->charge(icand)           & 0x1) << MuCTPI_RDO::RUN3_CAND_TGC_CHARGE_SIGN_SHIFT;
+	      daq_word |= (sectorData->bw2or3(icand)           & 0x1) << MuCTPI_RDO::RUN3_CAND_TGC_BW2OR3_SHIFT;
+	      daq_word |= (sectorData->innercoin(icand)        & 0x1) << MuCTPI_RDO::RUN3_CAND_TGC_INNERCOIN_SHIFT;
+	      daq_word |= (sectorData->goodmf(icand)           & 0x1) << MuCTPI_RDO::RUN3_CAND_TGC_GOODMF_SHIFT;
+	    }
+
+	    //CANDIDATE VETO FLAG
+	    daq_word |= (sectorData->veto(icand)             & 0x1)                            << MuCTPI_RDO::RUN3_CAND_VETO_SHIFT;
+
+	    //SECTOR FLAGS
+	    daq_word |= (sectorData->is2candidatesInSector() & MuCTPI_RDO::CAND_OVERFLOW_MASK) << MuCTPI_RDO::RUN3_CAND_OVERFLOW_SHIFT;
+
+	    //SECTOR ADDRESS
+	    daq_word |= (isub      & MuCTPI_RDO::SECTOR_HEMISPHERE_MASK)   << MuCTPI_RDO::RUN3_CAND_SECTOR_ADDRESS_SHIFT;
+	    daq_word |= (isec      & SECTOR_MASK)                          << MuCTPI_RDO::RUN3_CAND_SECTORID_SHIFT;
+	    daq_word |= (SUBSYS_ID & SUBSYS_MASK)                          << MuCTPI_RDO::RUN3_SUBSYS_ADDRESS_SHIFT;
+
+
+	    // Add extra bit in front to flag that this is a RUN3 RoI
+	    daq_word |= 0x1 << 31;
+
+	    m_daq_data.push_back(std::make_pair(SUBSYS_ID, daq_word));
+
+
+	    //
+	    // Perform multiplicity counting
+	    //
+
+	    //if this candidate has been flagged as overlapping, stop here and don't count it in the multiplicity
+	    if (sectorData->veto(icand)) continue;
+
+	    //loop over each muon threshold and see if this candidate satisfies it.
+	    //if so, increment the multiplicity of this threshold
+	    for (int ithresh=0;ithresh<nThresholds;ithresh++)
+	    {
+	      const TrigConf::L1Threshold_MU* thr = (const TrigConf::L1Threshold_MU*)(*thresholds)[ithresh].get();
+	      bool passed=false;
+	      if (isys == LVL1MUONIF::Lvl1MuCTPIInputPhase1::idBarrelSystem())
+	      {
+		if (thr->region().find("ALL") == std::string::npos &&
+		    thr->region().find("BA") == std::string::npos) continue;
+		
+		//veto this candidate from this multiplicity if it's part of the excluded ROI list
+		std::string rpcExclROIList = thr->rpcExclROIList();
+		if (rpcExclROIList != "")
+		{
+		  const std::map<std::string, std::vector<unsigned int> >* exclList = &m_l1menu->thrExtraInfo().MU().exclusionList(rpcExclROIList);
+		  if (exclList->size() != 0)
+		  {
+		    std::stringstream sectorName;
+		    sectorName<<"B";
+		    int sectorNumber=isec;
+		    LVL1MUONIF::Lvl1MuCTPIInputPhase1::MuonSubSystem side = static_cast<LVL1MUONIF::Lvl1MuCTPIInputPhase1::MuonSubSystem>(isec);
+		    if (side == LVL1MUONIF::Lvl1MuCTPIInputPhase1::idSideC()) sectorNumber += 32;
+		    if (sectorNumber < 10) sectorName << "0";
+		    sectorName << sectorNumber;
+		    
+		    auto exclROIs = exclList->find(sectorName.str());
+		    if (exclROIs != exclList->end())
+		    {
+		      bool found = false;
+		      for (auto roi_itr=exclROIs->second.begin();roi_itr!=exclROIs->second.end();roi_itr++)
+		      {
+			if (int(*roi_itr) == sectorData->roi(icand))
+			{
+			  found=true;
+			  break;
+			}
+		      }
+		      if (found) continue;
+		    }
+		  }
+		}
+
+		if ((int)thr->idxBarrel()+1 >= thresh) passed=true;
+	      }
+	      else 
+	      {
+		if (isys == LVL1MUONIF::Lvl1MuCTPIInputPhase1::idEndcapSystem())
+		{
+		  if (thr->region().find("ALL") == std::string::npos &&
+		      thr->region().find("EC") == std::string::npos) continue;
+		  if ((int)thr->idxEndcap()+1 >= thresh) passed=true;
+		}
+		else
+		{
+		  if (thr->region().find("ALL") == std::string::npos &&
+		      thr->region().find("FW") == std::string::npos) continue;
+		  if ((int)thr->idxForward()+1 >= thresh) passed=true;
+		}
+
+		//check tgc quality flags
+		bool F = sectorData->bw2or3(icand);
+		bool C = sectorData->innercoin(icand);
+		bool H = sectorData->goodmf(icand);
+
+		//parse the logic of the quality flag into a 2D vector, where outer layer contains the logic |'s and inner layer contains the logical &'s.
+		//save the 2D vector in a map so we don't have to parse it each time we want to check the flags.
+		std::string tgcFlags = thr->tgcFlags();
+		if (m_parsed_tgcFlags.find(tgcFlags) == m_parsed_tgcFlags.end())
+		{
+		  std::vector<std::string> vec_ors = parseString(tgcFlags, "|");
+		  std::vector<std::vector<std::string> > vec_flags;
+		  for (unsigned ior=0;ior<vec_ors.size();ior++)
+		  {
+		    vec_flags.push_back(parseString(vec_ors[ior],"&"));
+		  }
+		  m_parsed_tgcFlags[tgcFlags] = vec_flags;
+		}
+	      
+		//check the quality based on the flags.
+		//loop over outer layer of "ors" and 'or' the results
+		bool passedFlags = false;
+		const std::vector<std::vector<std::string> >* vec_flags = &m_parsed_tgcFlags[tgcFlags];
+		for (auto or_itr = vec_flags->begin();or_itr!=vec_flags->end();or_itr++)
+		{
+		  //loop over the inner layer of "ands" and 'and' the results
+		  bool passedAnd = true;
+		  for (auto and_itr = or_itr->begin();and_itr!=or_itr->end();and_itr++)
+		  {
+		    if (*and_itr == "F") passedAnd = passedAnd && F;
+		    else if (*and_itr == "C") passedAnd = passedAnd && C;
+		    else if (*and_itr == "H") passedAnd = passedAnd && H;
+		  }
+		  passedFlags = passedFlags || passedAnd;
+		}
+	      
+		if (!passedFlags) continue;
+	      }
+	      
+	      if (passed) multiplicities[ithresh]++;
+	    }
 	  }
 	}
       }
     }
-  
-    //build the CTP words
-    unsigned int current_ctp_word=0;
-    int pos=0;
-    int word_size = sizeof(current_ctp_word)*8;
+
+    //build the CTP words with bitset:
+    //first build the bitset that contains the full word
+    std::bitset<256> full_ctp_word = 0;
+    unsigned pos = 0;
     for (int i=0;i<nThresholds;i++)
     {
-      //buffer to add at the word at the end of the block, if necessary
-      unsigned int word_to_add=0;
-      bool add_word=false; // need this in case the word needs to be added but its empty
-
-      //truncate the thresholds if they're over the number of specified bits
-      int nbits = m_thresholds[i]->bitnum();
-      int maxsize = std::pow(2,nbits)-1;
-      if (multiplicities[i] > maxsize) multiplicities[i] = maxsize; 
-
-      //assign the individual multiplicity word to the CTP word
-      if (pos+nbits <= word_size) 
-      {
-	//assign the word
-	current_ctp_word |= multiplicities[i] << pos;
-
-	//add it to the word list if its full (or we're at the end of the threshold list) and reset
-	if (pos+nbits == word_size || i == nThresholds-1)
-	{
-	  word_to_add=current_ctp_word;
-	  add_word=true;
-	  pos=0;
-	}
-	else
-	{
-	  //increment the position
-	  pos += nbits;
-	}
-      }
-      else
-      {//handle cases where the individual multiplicity word is split between two 32-bit words
-	//truncate the multiplicity by the remaining length
-	int remaining_length = word_size-pos;
-	int mask = 0;
-	for (int j=0;j<remaining_length;j++) mask |= 0x1 << j;
-	int mult_trunc = multiplicities[i] & mask;
-
-	//add this to the current word
-	current_ctp_word |= mult_trunc << pos;
-
-	//add the current word to the CTP word list
-	word_to_add=current_ctp_word;
-	add_word=true;
-
-	//reset the current word and add the remainder to the new word
-	current_ctp_word = multiplicities[i] >> remaining_length;
-
-	//recalculate the position
-	pos += nbits;
-	pos -= word_size;
-      }
+      auto & triggerline = m_l1menu->connector("MuCTPiOpt0").triggerLine((*thresholds)[i]->name());
+      unsigned nbits = triggerline.endbit() - triggerline.startbit() + 1;
+      std::bitset<256> mult = (multiplicities[i] << pos);
+      full_ctp_word |= mult;
+      pos += nbits;
+    }
 
-      //add the word if its not empty, or if we're at the end of the loop;
-      if (add_word || i == nThresholds-1) 
-      {
-	m_ctp_words.push_back(word_to_add);
-      }
+    //divide up into a vector of 32-bit unsigned ints
+    std::bitset<256> u32i_mask = 0xffffffff;
+    unsigned n32_ints = pos/32;
+    if (pos % 32 != 0) n32_ints += 1;
+    for (unsigned i=0;i<n32_ints;i++)
+    {
+      unsigned int word = static_cast<unsigned int>((full_ctp_word & u32i_mask).to_ulong());
+      m_ctp_words.push_back(word);
+      full_ctp_word >>= 32;
     }
   }
   
@@ -222,8 +299,37 @@ namespace LVL1MUCTPIPHASE1 {
   }
 
 
-  const std::vector<unsigned int>& TriggerProcessor::getDAQData()
+  const std::vector<std::pair<int, unsigned int> >& TriggerProcessor::getDAQData()
   {
     return m_daq_data;
   }
+
+  std::vector<std::string> TriggerProcessor::parseString(std::string str, std::string sep)
+  {
+    std::vector<std::string> parsed;
+    int pos = 0;
+    bool first = true;
+    if (str.size() == 0) return parsed;
+    if (str.find(sep) == std::string::npos)
+    {
+      parsed.push_back(str);
+      return parsed;
+    }
+    while (true)
+    {
+      int newPos = str.find(sep, pos);
+      if (str.find(sep, pos) == std::string::npos)
+      {
+	if (!first) parsed.push_back(str.substr(pos, newPos-pos));
+	break;
+      }
+      std::string sub = str.substr(pos, newPos-pos);
+      parsed.push_back(sub);
+      pos = newPos+1;
+      first = false;
+    }
+    return parsed;
+  }
+
 }
+
diff --git a/Trigger/TrigT1/TrigT1MuonRecRoiTool/CMakeLists.txt b/Trigger/TrigT1/TrigT1MuonRecRoiTool/CMakeLists.txt
index 169d388e76c6..27558362b041 100644
--- a/Trigger/TrigT1/TrigT1MuonRecRoiTool/CMakeLists.txt
+++ b/Trigger/TrigT1/TrigT1MuonRecRoiTool/CMakeLists.txt
@@ -3,13 +3,10 @@
 # Declare the package name:
 atlas_subdir( TrigT1MuonRecRoiTool )
 
-# Component(s) in the package:
-atlas_add_library( TrigT1MuonRecRoiToolLib
-                   src/*.cxx
-                   PUBLIC_HEADERS TrigT1MuonRecRoiTool
-                   LINK_LIBRARIES AthenaKernel GaudiKernel MuonIdHelpersLib MuonReadoutGeometry TGCcablingInterfaceLib RPCcablingInterfaceLib RPC_CondCablingLib )
-
 atlas_add_component( TrigT1MuonRecRoiTool
+                     src/*.cxx 
                      src/components/*.cxx
-                     LINK_LIBRARIES TrigT1MuonRecRoiToolLib )
+                     LINK_LIBRARIES AthenaKernel GaudiKernel TrigT1Interfaces MuonIdHelpersLib MuonReadoutGeometry TGCcablingInterfaceLib RPCcablingInterfaceLib RPC_CondCablingLib )
 
+# Install files from the package:
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
diff --git a/Trigger/TrigT1/TrigT1MuonRecRoiTool/python/TrigT1MuonRecRoiToolConfig.py b/Trigger/TrigT1/TrigT1MuonRecRoiTool/python/TrigT1MuonRecRoiToolConfig.py
new file mode 100644
index 000000000000..80696cbaa960
--- /dev/null
+++ b/Trigger/TrigT1/TrigT1MuonRecRoiTool/python/TrigT1MuonRecRoiToolConfig.py
@@ -0,0 +1,16 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
+
+# Local (generated) configurable(s):
+from TrigT1MuonRecRoiTool.TrigT1MuonRecRoiToolConf import LVL1__TrigT1RPCRecRoiTool
+from TrigT1MuonRecRoiTool.TrigT1MuonRecRoiToolConf import LVL1__TrigT1TGCRecRoiTool
+
+def getRun3RPCRecRoiTool(name = "RPCRecRoiTool"):
+    tool = LVL1__TrigT1RPCRecRoiTool(name)
+    tool.UseRun3Config=True
+    return tool
+
+def getRun3TGCRecRoiTool(name = "TGCRecRoiTool"):
+    tool = LVL1__TrigT1TGCRecRoiTool(name)
+    tool.UseRun3Config=True
+    return tool
diff --git a/Trigger/TrigT1/TrigT1MuonRecRoiTool/src/TrigT1RPCRecRoiTool.h b/Trigger/TrigT1/TrigT1MuonRecRoiTool/src/TrigT1RPCRecRoiTool.h
index 0becbc352a4b..aa128bddcef1 100644
--- a/Trigger/TrigT1/TrigT1MuonRecRoiTool/src/TrigT1RPCRecRoiTool.h
+++ b/Trigger/TrigT1/TrigT1MuonRecRoiTool/src/TrigT1RPCRecRoiTool.h
@@ -5,7 +5,7 @@
 #ifndef TRIGT1RPCRECROITOOL_H
 #define TRIGT1RPCRECROITOOL_H
 
-#include "TrigT1MuonRecRoiTool/ITrigT1MuonRecRoiTool.h"
+#include "TrigT1Interfaces/ITrigT1MuonRecRoiTool.h"
 #include "AthenaBaseComps/AthAlgTool.h"
 
 namespace Muon{
diff --git a/Trigger/TrigT1/TrigT1MuonRecRoiTool/src/TrigT1TGCRecRoiTool.h b/Trigger/TrigT1/TrigT1MuonRecRoiTool/src/TrigT1TGCRecRoiTool.h
index 7a30990d09c5..6cf6077fb54b 100644
--- a/Trigger/TrigT1/TrigT1MuonRecRoiTool/src/TrigT1TGCRecRoiTool.h
+++ b/Trigger/TrigT1/TrigT1MuonRecRoiTool/src/TrigT1TGCRecRoiTool.h
@@ -5,7 +5,7 @@
 #ifndef TRIGT1TGCRECROITOOL_H
 #define TRIGT1TGCRECROITOOL_H
 
-#include "TrigT1MuonRecRoiTool/ITrigT1MuonRecRoiTool.h"
+#include "TrigT1Interfaces/ITrigT1MuonRecRoiTool.h"
 #include "AthenaBaseComps/AthAlgTool.h"
 
 class TGCIdBase;
diff --git a/Trigger/TrigT1/TrigT1Result/CMakeLists.txt b/Trigger/TrigT1/TrigT1Result/CMakeLists.txt
index 971d822fa801..e538f9a9105d 100644
--- a/Trigger/TrigT1/TrigT1Result/CMakeLists.txt
+++ b/Trigger/TrigT1/TrigT1Result/CMakeLists.txt
@@ -11,7 +11,7 @@ atlas_add_library( TrigT1Result
                    src/*.cxx
                    PUBLIC_HEADERS TrigT1Result
                    INCLUDE_DIRS ${TDAQ-COMMON_INCLUDE_DIRS}
-                   LINK_LIBRARIES ${TDAQ-COMMON_LIBRARIES} AthenaKernel L1TopoRDO TrigT1Interfaces
+                   LINK_LIBRARIES ${TDAQ-COMMON_LIBRARIES} AthenaKernel L1TopoRDO TrigT1Interfaces TrigT1MuctpiBits
                    PRIVATE_LINK_LIBRARIES GaudiKernel )
 
 atlas_add_dictionary( TrigT1ResultDict
diff --git a/Trigger/TrigT1/TrigT1Result/TrigT1Result/MuCTPI_RDO.h b/Trigger/TrigT1/TrigT1Result/TrigT1Result/MuCTPI_RDO.h
index d671081166fa..25ee090f678b 100755
--- a/Trigger/TrigT1/TrigT1Result/TrigT1Result/MuCTPI_RDO.h
+++ b/Trigger/TrigT1/TrigT1Result/TrigT1Result/MuCTPI_RDO.h
@@ -1,7 +1,7 @@
 // Dear emacs, this is -*- c++ -*-
 
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGT1RESULT_MUCTPI_RDO_H
@@ -44,6 +44,7 @@ public:
   /// Enumeration defining the different sources for the muon candidates
   enum SectorLocation { BARREL = 0, ENDCAP = 1, FORWARD = 2 };
 
+
   /// "Intermediate" constructor
   /**
    * This constructor is tipically used for filling the object with information
@@ -140,90 +141,8 @@ public:
   const std::vector< uint32_t >& dataWord() const {
     return m_dataWord;
   }
-
-  /// Binary 111 representing the maximal multiplicity value for a given threshold
-  static constexpr uint32_t MULT_VAL = 7;
-  /// Number of multiplicity bits reserved per threshold
-  static constexpr uint32_t MULT_BITS = 3;
-  /// Defining the number of p<sub>T</sub> thresholds in the system
-  static constexpr uint32_t MULT_THRESH_NUM = 6;
-  /// Telling that the 3-bit BCID comes at "position 7" in the multiplicity word
-  static constexpr uint32_t MULT_BCID_POS = 7;
-
-  /// Weird mask for the bit showing if more than two muon candidates were in the trigger sector
-  static constexpr uint32_t CAND_OVERFLOW_MASK = 0x1;
-  /// Position of the candidate overflow mask
-  static constexpr uint32_t CAND_OVERFLOW_SHIFT = 0;
-  /// Weird mask for the bit showing if more than one muon candidates were in the sector RoI
-  static constexpr uint32_t ROI_OVERFLOW_MASK = 0x1;
-  /// Position of the RoI overflow mask
-  static constexpr uint32_t ROI_OVERFLOW_SHIFT = 1;
-
-  /// Bit in the candidate's address turned on for endcap candidates
-  static constexpr uint32_t ENDCAP_ADDRESS_MASK = 0x80;
-  /// Bit in the candidate's address turned on for forward candidates
-  static constexpr uint32_t FORWARD_ADDRESS_MASK = 0x40;
-
-  /// Mask for extracting the sector ID for endcap candidates from the data word
-  static constexpr uint32_t ENDCAP_SECTORID_MASK = 0x3f;
-  /// Mask for extracting the sector ID for forward candidates from the data word
-  static constexpr uint32_t FORWARD_SECTORID_MASK = 0x1f;
-  /// Mask for extracting the sector ID for barrel candidates from the data word
-  static constexpr uint32_t BARREL_SECTORID_MASK = 0x1f;
-  /// Mask for the bit showing which hemisphere the candidate came from.(1: positive; 0: negative)
-  static constexpr uint32_t SECTOR_HEMISPHERE_MASK = 0x1;
-
-  /// Mask for extracting the RoI for barrel candidates from the data words
-  static constexpr uint32_t BARREL_ROI_MASK = 0x1f;
-  /// Mask for extracting the RoI for endcap candidates from the data words
-  static constexpr uint32_t ENDCAP_ROI_MASK = 0xff;
-  /// Mask for extracting the RoI for forward candidates from the data words
-  static constexpr uint32_t FORWARD_ROI_MASK = 0x3f;
-  /// Position of the RoI bits in the data word
-  static constexpr uint32_t ROI_SHIFT = 2;
-
-  /// Mask for extracting the overlap bits for barrel candidates from the data words
-  static constexpr uint32_t BARREL_OL_MASK = 0x3;
-  /// Position of the overlap bits in barrel data words
-  static constexpr uint32_t BARREL_OL_SHIFT = 9;
-  /// Mask for extracting the overlap bits for endcap candidates from the data words
-  static constexpr uint32_t ENDCAP_OL_MASK = 0x1;
-  /// Position of the overlap bits in endcap data words
-  static constexpr uint32_t ENDCAP_OL_SHIFT = 10;
-
-  /// Mask for extracting the p<sub>T</sub> threshold passed by the candidate from the data word
-  static constexpr uint32_t CAND_PT_MASK = 0x7;
-  /// Position of the p<sub>T</sub> threshold bits in the data words
-  static constexpr uint32_t CAND_PT_SHIFT = 11;
-
-  /// Mask for extracting the last 3 bits of the BCID of the muon candidate from the data word
-  static constexpr uint32_t CAND_BCID_MASK = 0x7;
-  /// Position of the BCID bits in the data words
-  static constexpr uint32_t CAND_BCID_SHIFT = 14;
-
-  /// Mask for extracting the address of the muon candidate from the data word
-  static constexpr uint32_t CAND_SECTOR_ADDRESS_MASK = 0xff;
-  /// Position of the muon candidate's address in the data word
-  static constexpr uint32_t CAND_SECTOR_ADDRESS_SHIFT = 17;
-
-  /// Mask for extracting the bit from the data word showing whether the candidate had the highest p<sub>T</sub> in the sector
-  static constexpr uint32_t CAND_HIGHEST_PT_MASK = 0x1;
-  /// Position of the "highest p<sub>T</sub>" bit
-  static constexpr uint32_t CAND_HIGHEST_PT_SHIFT = 25;
-
-  /// Mask for extracting the bit from the data word showing if the muon candidate was sent to the RoIB
-  static constexpr uint32_t CAND_SENT_ROI_MASK = 0x1;
-  /// Position of the "candidate sent to RoIB" bit.
-  static constexpr uint32_t CAND_SENT_ROI_SHIFT = 26;
-
-  /// Position of the bit turned on for the multiplicity words that distinguishes them from the data words
-  static constexpr uint32_t MULT_WORD_FLAG_SHIFT = 29;
-
-  /// Position of the bit specifying the candidate's sign
-  static constexpr uint32_t CAND_TGC_CHARGE_SIGN_SHIFT = 27;
-
-  /// Position of the bit specifying if a candidate was vetoed in the multiplicity sum
-  static constexpr uint32_t CAND_VETO_SHIFT = 28;
+  
+#include<TrigT1MuctpiBits/MuCTPI_Bits.h>
 
 private:
   /// Variable storing the multiplicity word(s) sent to the CTP
diff --git a/Trigger/TrigT1/TrigT1Result/TrigT1Result/selection.xml b/Trigger/TrigT1/TrigT1Result/TrigT1Result/selection.xml
index ea78cd901842..7245c3e8a686 100755
--- a/Trigger/TrigT1/TrigT1Result/TrigT1Result/selection.xml
+++ b/Trigger/TrigT1/TrigT1Result/TrigT1Result/selection.xml
@@ -1,7 +1,7 @@
 <lcgdict>
 
   <!-- MuCTPI RDO -->
-  <class name="MuCTPI_RDO" id="5BE3FA7E-CC70-4842-A095-CA046164764D" />
+  <!--class name="MuCTPI_RDO" id="5BE3FA7E-CC70-4842-A095-CA046164764D" /-->
 
   <!-- CTP RDO -->
   <class name="CTP_RDO" id="56C714CC-DC17-4927-B413-9151C82792BB" />
diff --git a/Trigger/TrigT1/TrigT1Result/src/MuCTPIResult.cxx b/Trigger/TrigT1/TrigT1Result/src/MuCTPIResult.cxx
index 2b4e380dffab..4d6669d2677d 100755
--- a/Trigger/TrigT1/TrigT1Result/src/MuCTPIResult.cxx
+++ b/Trigger/TrigT1/TrigT1Result/src/MuCTPIResult.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 
@@ -121,8 +121,8 @@ namespace ROIB {
       s << " " << roIVec()[i].getRoiOverflow();
       if (longFormat) s << std::setw(12) << "\n RoI number:";
       s << " " << roIVec()[i].getRoiNumber();
-      if (longFormat) s << std::setw(12) << "\n IsHighestPt:";
-      s << " " << roIVec()[i].getCandidateIsHighestPt();
+      //if (longFormat) s << std::setw(12) << "\n IsHighestPt:";
+      //s << " " << roIVec()[i].getCandidateIsHighestPt();
       if (longFormat) s << std::setw(12) << "\n Overlap:";
       s << " " << roIVec()[i].getOverlapBits();
       s << "] ";
@@ -185,7 +185,7 @@ namespace ROIB {
       log << MSG::DEBUG << "Sector overflow         :  " << it->getSectorOverflow() << endmsg;
       log << MSG::DEBUG << "RoI overflow            :  " << it->getRoiOverflow() << endmsg;
       log << MSG::DEBUG << "RoI number              :  " << it->getRoiNumber() << endmsg;
-      log << MSG::DEBUG << "IsHighestPt             :  " << it->getCandidateIsHighestPt() << endmsg;
+      //log << MSG::DEBUG << "IsHighestPt             :  " << it->getCandidateIsHighestPt() << endmsg;
       log << MSG::DEBUG << "Overlap                 :  " << it->getOverlapBits() << endmsg;
 
     }
diff --git a/Trigger/TrigT1/TrigT1Result/src/MuCTPIRoI.cxx b/Trigger/TrigT1/TrigT1Result/src/MuCTPIRoI.cxx
index 4a68f823a2b5..2ccfb817977f 100755
--- a/Trigger/TrigT1/TrigT1Result/src/MuCTPIRoI.cxx
+++ b/Trigger/TrigT1/TrigT1Result/src/MuCTPIRoI.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 
diff --git a/Trigger/TrigT1/TrigT1Result/src/MuCTPI_DataWord_Decoder.cxx b/Trigger/TrigT1/TrigT1Result/src/MuCTPI_DataWord_Decoder.cxx
index 751d959aef58..a795fd3b5b61 100755
--- a/Trigger/TrigT1/TrigT1Result/src/MuCTPI_DataWord_Decoder.cxx
+++ b/Trigger/TrigT1/TrigT1Result/src/MuCTPI_DataWord_Decoder.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 
@@ -150,6 +150,7 @@ uint16_t MuCTPI_DataWord_Decoder::getPt() const {
 /**
  * @return 3-bit BCID fragment saved with the candidate
  */
+
 uint16_t MuCTPI_DataWord_Decoder::getBCID() const {
   return ((m_dataWord >> MuCTPI_RDO::CAND_BCID_SHIFT) &
 	  MuCTPI_RDO::CAND_BCID_MASK);
@@ -158,6 +159,7 @@ uint16_t MuCTPI_DataWord_Decoder::getBCID() const {
 /**
  * @return flag showing whether the candidate had the highest p<sub>T</sub> in its sector
  */
+
 uint16_t MuCTPI_DataWord_Decoder::getCandidateIsHighestPt() const {
   return ((m_dataWord >> MuCTPI_RDO::CAND_HIGHEST_PT_SHIFT) &
 	  MuCTPI_RDO::CAND_HIGHEST_PT_MASK);
@@ -166,6 +168,7 @@ uint16_t MuCTPI_DataWord_Decoder::getCandidateIsHighestPt() const {
 /**
  * @return flag showing whether the candidate was sent to the RoIB
  */
+
 uint16_t MuCTPI_DataWord_Decoder::getSentRoi() const {
   return ((m_dataWord >> MuCTPI_RDO::CAND_SENT_ROI_SHIFT) &
 	  MuCTPI_RDO::CAND_SENT_ROI_MASK);
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/HLTTriggerGetter.py b/Trigger/TriggerCommon/TriggerJobOpts/python/HLTTriggerGetter.py
index 3ff97c437a6b..991c6be2ca25 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/python/HLTTriggerGetter.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/HLTTriggerGetter.py
@@ -195,10 +195,14 @@ class HLTSimulationGetter(Configured):
             if hasattr(TrigSteer_HLT.LvlTopoConverter, 'MuonInputProvider'):
 
                 try: # this is temporary until TrigT1Muctpi-00-06-29 is in the release
-                    from TrigT1Muctpi.TrigT1MuctpiConfig import L1MuctpiTool
+                    from AthenaConfiguration.AllConfigFlags import ConfigFlags
+                    if ConfigFlags.Trigger.enableL1Phase1:
+                        from TrigT1MuctpiPhase1.TrigT1MuctpiPhase1Config import L1MuctpiPhase1Tool as l1MuctpiTool
+                    else:
+                        from TrigT1Muctpi.TrigT1MuctpiConfig import L1MuctpiTool as l1MuctpiTool
                     from AthenaCommon.AppMgr import ToolSvc
-                    ToolSvc += L1MuctpiTool()
-                    TrigSteer_HLT.LvlTopoConverter.MuonInputProvider.MuctpiSimTool = L1MuctpiTool()
+                    ToolSvc += l1MuctpiTool()
+                    TrigSteer_HLT.LvlTopoConverter.MuonInputProvider.MuctpiSimTool = l1MuctpiTool()
                 except ImportError:
                     pass
 
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/Lvl1SimulationConfig.py b/Trigger/TriggerCommon/TriggerJobOpts/python/Lvl1SimulationConfig.py
index 614fc8765886..7c7902129052 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/python/Lvl1SimulationConfig.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/Lvl1SimulationConfig.py
@@ -130,6 +130,16 @@ def Lvl1SimulationSequence( flags = None ):
         ToolSvc += L1MuctpiPhase1Tool("MUCTPI_AthTool")
         ToolSvc.MUCTPI_AthTool.LVL1ConfigSvc = svcMgr.LVL1ConfigSvc
 
+        #Add the RecRoiTools
+        from TrigT1MuonRecRoiTool.TrigT1MuonRecRoiToolConfig import getRun3RPCRecRoiTool
+        from TrigT1MuonRecRoiTool.TrigT1MuonRecRoiToolConfig import getRun3TGCRecRoiTool
+        ToolSvc += getRun3RPCRecRoiTool("RPCRecRoiTool")
+        ToolSvc += getRun3TGCRecRoiTool("TGCRecRoiTool")
+
+        ToolSvc.MUCTPI_AthTool.RPCRecRoiTool = ToolSvc.RPCRecRoiTool
+        ToolSvc.MUCTPI_AthTool.TGCRecRoiTool = ToolSvc.TGCRecRoiTool
+
+        #Add the LVL1 config service to the MUCTPI algorithm
         muctpi = L1MuctpiPhase1()
         muctpi.LVL1ConfigSvc = svcMgr.LVL1ConfigSvc
 
@@ -148,7 +158,7 @@ def Lvl1SimulationSequence( flags = None ):
     from MuonRecExample import MuonAlignConfig # noqa: F401
 
     l1MuonSim = seqAND("l1MuonSim", [
-        
+
         MuonRdoToMuonDigit( "MuonRdoToMuonDigit",
                             MuonRdoToMuonDigitTool = ToolSvc.MuonRdoToMuonDigitTool),
 
@@ -158,7 +168,7 @@ def Lvl1SimulationSequence( flags = None ):
                   RPCbytestream     = False,
                   RPCbytestreamFile = "",
                   RPCDigitContainer = "RPC_DIGITS_L1"),
-        
+
         # based on Trigger/TrigT1/TrigT1TGC/python/TrigT1TGCConfig.py
         # interesting is that this JO sets inexisting properties, commented out below
         LVL1TGCTrigger__LVL1TGCTrigger("LVL1TGCTrigger",
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/Lvl1TriggerGetter.py b/Trigger/TriggerCommon/TriggerJobOpts/python/Lvl1TriggerGetter.py
index 5f5e2a9bf884..217100317d65 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/python/Lvl1TriggerGetter.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/Lvl1TriggerGetter.py
@@ -100,8 +100,13 @@ class Lvl1SimulationGetter (Configured):
                 import TrigT1TGCRecRoiSvc.TrigT1TGCRecRoiConfig   # noqa: F401
                 import TrigT1RPCsteering.TrigT1RPCsteeringConfig  # noqa: F401
                 import TrigT1TGC.TrigT1TGCConfig                  # noqa: F401
-                from TrigT1Muctpi.TrigT1MuctpiConfig import L1Muctpi                
-                topSequence += L1Muctpi()
+                from AthenaConfiguration.AllConfigFlags import ConfigFlags
+                if ConfigFlags.Trigger.enableL1Phase1:
+                    from TrigT1MuctpiPhase1.TrigT1MuctpiPhase1Config import L1MuctpiPhase1
+                    topSequence += L1MuctpiPhase1()
+                else:
+                    from TrigT1Muctpi.TrigT1MuctpiConfig import L1Muctpi
+                    topSequence += L1Muctpi()
 
             if TriggerFlags.doBcm():
                 from TrigT1BCM.TrigT1BCMConf import LVL1__TrigT1BCM
@@ -167,10 +172,14 @@ class Lvl1SimulationGetter (Configured):
                 topSequence += L1TopoSimulation()
 
                 try: # this is temporary until TrigT1Muctpi-00-06-29 is in the release
-                    from TrigT1Muctpi.TrigT1MuctpiConfig import L1MuctpiTool
+                    from AthenaConfiguration.AllConfigFlags import ConfigFlags
+                    if ConfigFlags.Trigger.enableL1Phase1:
+                        from TrigT1MuctpiPhase1.TrigT1MuctpiPhase1Config import L1MuctpiPhase1Tool as l1MuctpiTool
+                    else:
+                        from TrigT1Muctpi.TrigT1MuctpiConfig import L1MuctpiTool as l1MuctpiTool
                     from AthenaCommon.AppMgr import ToolSvc
-                    ToolSvc += L1MuctpiTool()
-                    topSequence.L1TopoSimulation.MuonInputProvider.MuctpiSimTool = L1MuctpiTool()
+                    ToolSvc += l1MuctpiTool()
+                    topSequence.L1TopoSimulation.MuonInputProvider.MuctpiSimTool = l1MuctpiTool()
                 except ImportError:
                     pass
 
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/Modifiers.py b/Trigger/TriggerCommon/TriggerJobOpts/python/Modifiers.py
index 5727d0bb3bcd..3c5cc3f12863 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/python/Modifiers.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/Modifiers.py
@@ -658,7 +658,11 @@ class rerunLVL1(_modifier):
 
         #rederive MuCTPI inputs to CTP from muon RDO
         #writes this to the usual MuCTPICTP storegate location
-        from TrigT1Muctpi.TrigT1MuctpiConfig import L1Muctpi_on_RDO
+        from AthenaConfiguration.AllConfigFlags import ConfigFlags
+        if ConfigFlags.Trigger.enableL1Phase1:
+            from TrigT1MuctpiPhase1.TrigT1MuctpiPhase1Config import L1MuctpiPhase1_on_RDO as L1Muctpi_on_RDO
+        else:
+            from TrigT1Muctpi.TrigT1MuctpiConfig import L1Muctpi_on_RDO
         topSequence += L1Muctpi_on_RDO()
         topSequence.L1Muctpi_on_RDO.CTPOutputLocID = "L1MuCTPItoCTPLocation"
         topSequence.L1Muctpi_on_RDO.RoIOutputLocID = "L1MuCTPItoRoIBLocation"
@@ -670,7 +674,10 @@ class rerunLVL1(_modifier):
             topSequence += L1TopoSimulation()
             log.info( "adding L1TopoSimulation() to topSequence" )
 
-            from TrigT1Muctpi.TrigT1MuctpiConfig import L1MuctpiTool
+            if ConfigFlags.Trigger.enableL1Phase1:
+                from TrigT1MuctpiPhase1.TrigT1MuctpiPhase1Config import L1MuctpiPhase1Tool as L1MuctpiTool
+            else:
+                from TrigT1Muctpi.TrigT1MuctpiConfig import L1MuctpiTool
             from AthenaCommon.AppMgr import ToolSvc
             ToolSvc += L1MuctpiTool()
             topSequence.L1TopoSimulation.MuonInputProvider.MuctpiSimTool = L1MuctpiTool()
@@ -754,7 +761,11 @@ class rerunDMLVL1(_modifier):
          #Run MuCTPI simulation (before or after importing DeriveSim??)
          #rederive MuCTPI inputs to CTP from muon RDO
          #writes this to the usual MuCTPICTP storegate location
-         from TrigT1Muctpi.TrigT1MuctpiConfig import L1Muctpi_on_RDO
+         from AthenaConfiguration.AllConfigFlags import ConfigFlags
+         if ConfigFlags.Trigger.enableL1Phase1:
+             from TrigT1MuctpiPhase1.TrigT1MuctpiPhase1Config import L1MuctpiPhase1_on_RDO as L1Muctpi_on_RDO
+         else:
+             from TrigT1Muctpi.TrigT1MuctpiConfig import L1MuctpiPhase1_on_RDO as L1Muctpi_on_RDO
          topSequence += L1Muctpi_on_RDO()
          topSequence.L1Muctpi_on_RDO.CTPOutputLocID = "L1MuCTPItoCTPLocation"
          topSequence.L1Muctpi_on_RDO.RoIOutputLocID = "L1MuCTPItoRoIBLocation"
-- 
GitLab


From 5826b639940b2ec3c552476deb63ea615ea89f57 Mon Sep 17 00:00:00 2001
From: Christina Nelson <christina.nelson@cern.ch>
Date: Fri, 18 Dec 2020 11:43:50 +0000
Subject: [PATCH 147/225] Nightly art jetrec

---
 .../Jet/JetValidation/test/test_jet.sh        | 22 +++++++-
 .../JetValidation/test/test_jet_noPtCut.sh    | 50 +++++++++++++++++++
 .../Jet/JetValidation/test/test_met.sh        | 50 +++++++++++++++++++
 3 files changed, 120 insertions(+), 2 deletions(-)
 create mode 100755 Reconstruction/Jet/JetValidation/test/test_jet_noPtCut.sh
 create mode 100755 Reconstruction/Jet/JetValidation/test/test_met.sh

diff --git a/Reconstruction/Jet/JetValidation/test/test_jet.sh b/Reconstruction/Jet/JetValidation/test/test_jet.sh
index e564d623c95f..9df2eb1d6820 100755
--- a/Reconstruction/Jet/JetValidation/test/test_jet.sh
+++ b/Reconstruction/Jet/JetValidation/test/test_jet.sh
@@ -2,7 +2,10 @@
 # art-description: ART test job HITS to AOD
 # art-type: grid
 # art-include: master/Athena
+# art-memory: 4096
 # art-output: *.root
+# art-output: dcube
+# art-html: dcube
 
 ART_PATH="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/"
 ART_FILE="mc16_13TeV.410470.PhPy8EG_A14_ttbar_hdamp258p75_nonallhad.simul.HITS.e6337_s3126/HITS.12860054._032508.pool.root.1"
@@ -25,8 +28,23 @@ Reco_tf.py \
     --inputHITSFile=${HITSFile} \
     --outputAODFile=${ART_AOD} \
     --outputNTUP_PHYSVALFile ${ART_Validation} \
-    --validationFlags noExample \
+    --valid=True \
+    --validationFlags 'doInDet,doJet' \
     --autoConfiguration everything \
     --preExec 'from RecExConfig.RecFlags import rec;rec.doTrigger=False'
 
-echo "art-result: $? Reco"
+rc=$?
+echo "art-result: $rc Reco"
+
+rc2=-9999
+if [ ${rc} -eq 0 ]
+then
+  # Histogram comparison with DCube
+  $ATLAS_LOCAL_ROOT/dcube/current/DCubeClient/python/dcube.py \
+     -p -x dcube \
+     -c /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/JetValidation/DCUBE/jet.xml \
+     -r /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/JetValidation/reference/nightly_jet.PHYSVAL.root \
+     nightly_jet.PHYSVAL.root
+  rc2=$?
+fi
+echo "art-result: ${rc2} plot"
diff --git a/Reconstruction/Jet/JetValidation/test/test_jet_noPtCut.sh b/Reconstruction/Jet/JetValidation/test/test_jet_noPtCut.sh
new file mode 100755
index 000000000000..9be572f487cd
--- /dev/null
+++ b/Reconstruction/Jet/JetValidation/test/test_jet_noPtCut.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+# art-description: ART test job HITS to AOD
+# art-type: grid
+# art-include: master/Athena
+# art-memory: 4096
+# art-output: *.root
+# art-output: dcube
+# art-html: dcube
+
+ART_PATH="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/"
+ART_FILE="mc16_13TeV.410470.PhPy8EG_A14_ttbar_hdamp258p75_nonallhad.simul.HITS.e6337_s3126/HITS.12860054._032508.pool.root.1"
+HITSFile="${ART_PATH}${ART_FILE}"
+echo "Input HITS file for    : ${HITSFile}"
+
+Nevents=3000
+echo "Number of test events  : ${Nevents}"
+
+ART_AOD="nightly_jet_noPtCut.AOD.pool.root"
+echo "Output AOD file        : ${ART_AOD}"
+
+ART_Validation="nightly_jet_noPtCut.PHYSVAL.root"
+echo "Output Validation file : ${ART_Validation}"
+
+echo "Submitting Reconstruction ..."
+
+Reco_tf.py \
+    --maxEvents -1 \
+    --inputHITSFile=${HITSFile} \
+    --outputAODFile=${ART_AOD} \
+    --outputNTUP_PHYSVALFile ${ART_Validation} \
+    --valid=True \
+    --validationFlags 'doInDet,doJet' \
+    --autoConfiguration everything \
+    --preExec 'from RecExConfig.RecFlags import rec;rec.doTrigger=False; from JetRec.JetRecFlags import jetFlags; jetFlags.useCalibJetThreshold.set_Value_and_Lock(False)'
+
+rc=$?
+echo "art-result: $rc Reco"
+
+rc2=-9999
+if [ ${rc} -eq 0 ]
+then
+  # Histogram comparison with DCube
+  $ATLAS_LOCAL_ROOT/dcube/current/DCubeClient/python/dcube.py \
+      -p -x dcube \
+      -c /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/JetValidation/DCUBE/jet.xml \
+      -r /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/JetValidation/reference/nightly_jet_noPtCut.PHYSVAL.root \
+      nightly_jet_noPtCut.PHYSVAL.root
+  rc2=$?
+fi
+echo "art-result: ${rc2} plot"
diff --git a/Reconstruction/Jet/JetValidation/test/test_met.sh b/Reconstruction/Jet/JetValidation/test/test_met.sh
new file mode 100755
index 000000000000..d6b768fe9e18
--- /dev/null
+++ b/Reconstruction/Jet/JetValidation/test/test_met.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+# art-description: ART test job HITS to AOD
+# art-type: grid
+# art-include: master/Athena
+# art-memory: 4096
+# art-output: *.root
+# art-output: dcube
+# art-html: dcube
+
+ART_PATH="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/"
+ART_FILE="mc16_13TeV.410470.PhPy8EG_A14_ttbar_hdamp258p75_nonallhad.simul.HITS.e6337_s3126/HITS.12860054._032508.pool.root.1"
+HITSFile="${ART_PATH}${ART_FILE}"
+echo "Input HITS file for    : ${HITSFile}"
+
+Nevents=3000
+echo "Number of test events  : ${Nevents}"
+
+ART_AOD="nightly_met.AOD.pool.root"
+echo "Output AOD file        : ${ART_AOD}"
+
+ART_Validation="nightly_met.PHYSVAL.root"
+echo "Output Validation file : ${ART_Validation}"
+
+echo "Submitting Reconstruction ..."
+
+Reco_tf.py \
+    --maxEvents -1 \
+    --inputHITSFile=${HITSFile} \
+    --outputAODFile=${ART_AOD} \
+    --outputNTUP_PHYSVALFile ${ART_Validation} \
+    --valid=True \
+    --validationFlags 'doInDet,doMET' \
+    --autoConfiguration everything \
+    --preExec 'from RecExConfig.RecFlags import rec;rec.doTrigger=False'
+
+rc=$?
+echo "art-result: $rc Reco"
+
+rc2=-9999
+if [ ${rc} -eq 0 ]
+then
+  # Histogram comparison with DCube
+  $ATLAS_LOCAL_ROOT/dcube/current/DCubeClient/python/dcube.py \
+     -p -x dcube \
+     -c /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/JetValidation/DCUBE/met.xml \
+     -r /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/JetValidation/reference/nightly_met.PHYSVAL.root \
+     nightly_met.PHYSVAL.root
+  rc2=$?
+fi
+echo "art-result: ${rc2} plot"
-- 
GitLab


From e55a202652301309452e65207b1bc5563b0d903e Mon Sep 17 00:00:00 2001
From: Matthew Thomas Anthony <matthew.thomas.anthony@cern.ch>
Date: Fri, 18 Dec 2020 11:44:17 +0000
Subject: [PATCH 148/225] Add Flow Elements to Run 3 PFlow configuration

---
 Reconstruction/eflowRec/python/PFCfg.py       | 75 ++++++++++++-------
 .../eflowRec/python/PFRun3Config.py           |  4 +
 2 files changed, 53 insertions(+), 26 deletions(-)

diff --git a/Reconstruction/eflowRec/python/PFCfg.py b/Reconstruction/eflowRec/python/PFCfg.py
index 38fa939422b5..626bc28f946f 100644
--- a/Reconstruction/eflowRec/python/PFCfg.py
+++ b/Reconstruction/eflowRec/python/PFCfg.py
@@ -2,23 +2,23 @@
 from AthenaConfiguration.ComponentFactory import CompFactory
 
 def PFTrackSelectorAlgCfg(inputFlags,algName,useCaching=True):
-    PFTrackSelector=CompFactory.PFTrackSelector
-    PFTrackSelector=PFTrackSelector(algName)
+    PFTrackSelectorFactory=CompFactory.PFTrackSelector
+    PFTrackSelector=PFTrackSelectorFactory(algName)
 
     from TrkConfig.AtlasExtrapolatorConfig import AtlasExtrapolatorCfg    
-    Trk__ParticleCaloExtensionTool=CompFactory.Trk.ParticleCaloExtensionTool
+    Trk__ParticleCaloExtensionToolFactory=CompFactory.Trk.ParticleCaloExtensionTool
     result = AtlasExtrapolatorCfg(inputFlags)
-    pcExtensionTool = Trk__ParticleCaloExtensionTool(Extrapolator = result.popPrivateTools())
+    pcExtensionTool = Trk__ParticleCaloExtensionToolFactory(Extrapolator = result.popPrivateTools())
 
     eflowTrackCaloExtensionTool=CompFactory.eflowTrackCaloExtensionTool
     TrackCaloExtensionTool=eflowTrackCaloExtensionTool(TrackCaloExtensionTool=pcExtensionTool)
-    if False is useCaching:
+    if (not useCaching):
       TrackCaloExtensionTool.PFParticleCache = ""
 
     PFTrackSelector.trackExtrapolatorTool = TrackCaloExtensionTool
 
-    InDet__InDetTrackSelectionTool=CompFactory.InDet.InDetTrackSelectionTool
-    TrackSelectionTool = InDet__InDetTrackSelectionTool("PFTrackSelectionTool")
+    InDet__InDetTrackSelectionToolFactory=CompFactory.InDet.InDetTrackSelectionTool
+    TrackSelectionTool = InDet__InDetTrackSelectionToolFactory("PFTrackSelectionTool")
 
     TrackSelectionTool.CutLevel = "TightPrimary"
     TrackSelectionTool.minPt = 500.0 
@@ -31,8 +31,8 @@ def PFTrackSelectorAlgCfg(inputFlags,algName,useCaching=True):
 
 def getPFClusterSelectorTool(clustersin,calclustersin,algName):
 
-    PFClusterSelectorTool = CompFactory.PFClusterSelectorTool
-    PFClusterSelectorTool = PFClusterSelectorTool(algName)
+    PFClusterSelectorToolFactory = CompFactory.PFClusterSelectorTool
+    PFClusterSelectorTool = PFClusterSelectorToolFactory(algName)
     if clustersin:
         PFClusterSelectorTool.clustersName = clustersin
     if calclustersin:
@@ -50,19 +50,19 @@ def getPFTrackClusterMatchingTool(inputFlags,matchCut,distanceType,clusterPositi
 
 
 def getPFCellLevelSubtractionTool(inputFlags,toolName):
-    PFCellLevelSubtractionTool = CompFactory.PFCellLevelSubtractionTool
-    PFCellLevelSubtractionTool = PFCellLevelSubtractionTool(toolName)
+    PFCellLevelSubtractionToolFactory = CompFactory.PFCellLevelSubtractionTool
+    PFCellLevelSubtractionTool = PFCellLevelSubtractionToolFactory(toolName)
     
     eflowCellEOverPTool_mc12_JetETMiss = CompFactory.eflowCellEOverPTool_mc12_JetETMiss
     PFCellLevelSubtractionTool.eflowCellEOverPTool = eflowCellEOverPTool_mc12_JetETMiss()
 
-    if(True is inputFlags.PF.EOverPMode):
+    if(inputFlags.PF.EOverPMode):
         PFCellLevelSubtractionTool.CalcEOverP = True
         PFCellLevelSubtractionTool.nMatchesInCellLevelSubtraction = -1
     else:
         PFCellLevelSubtractionTool.nMatchesInCellLevelSubtraction = 1
 
-    if(True is inputFlags.PF.EOverPMode):
+    if(inputFlags.PF.EOverPMode):
         PFCellLevelSubtractionTool.PFTrackClusterMatchingTool = getPFTrackClusterMatchingTool(inputFlags,0.2,"EtaPhiSquareDistance","PlainEtaPhi","CalObjBldMatchingTool")
     else:
         PFCellLevelSubtractionTool.PFTrackClusterMatchingTool = getPFTrackClusterMatchingTool(inputFlags,1.64,"EtaPhiSquareSignificance","GeomCenterEtaPhi","CalObjBldMatchingTool")
@@ -72,8 +72,8 @@ def getPFCellLevelSubtractionTool(inputFlags,toolName):
     return PFCellLevelSubtractionTool
 
 def getPFRecoverSplitShowersTool(inputFlags,toolName):
-    PFRecoverSplitShowersTool = CompFactory.PFRecoverSplitShowersTool
-    PFRecoverSplitShowersTool = PFRecoverSplitShowersTool(toolName)
+    PFRecoverSplitShowersToolFactory = CompFactory.PFRecoverSplitShowersTool
+    PFRecoverSplitShowersTool = PFRecoverSplitShowersToolFactory(toolName)
 
     eflowCellEOverPTool_mc12_JetETMiss = CompFactory.eflowCellEOverPTool_mc12_JetETMiss
     PFRecoverSplitShowersTool.eflowCellEOverPTool = eflowCellEOverPTool_mc12_JetETMiss("eflowCellEOverPTool_mc12_JetETMiss_Recover")
@@ -85,8 +85,8 @@ def getPFRecoverSplitShowersTool(inputFlags,toolName):
     return PFRecoverSplitShowersTool
 
 def getPFMomentCalculatorTool(inputFlags, momentsToCalculateList):
-    PFMomentCalculatorTool = CompFactory.PFMomentCalculatorTool
-    PFMomentCalculatorTool = PFMomentCalculatorTool("PFMomentCalculatorTool")
+    PFMomentCalculatorToolFactory = CompFactory.PFMomentCalculatorTool
+    PFMomentCalculatorTool = PFMomentCalculatorToolFactory("PFMomentCalculatorTool")
 
     from CaloRec.CaloTopoClusterConfig import getTopoMoments
     PFClusterMomentsMaker = getTopoMoments(inputFlags)
@@ -97,7 +97,7 @@ def getPFMomentCalculatorTool(inputFlags, momentsToCalculateList):
     PFClusterCollectionTool = CompFactory.PFClusterCollectionTool
     PFMomentCalculatorTool.PFClusterCollectionTool = PFClusterCollectionTool("PFClusterCollectionTool")
 
-    if(True is inputFlags.PF.useCalibHitTruthClusterMoments):
+    if(inputFlags.PF.useCalibHitTruthClusterMoments):
         PFMomentCalculatorTool.UseCalibHitTruth=True
         from CaloRec.CaloTopoClusterConfig import getTopoCalibMoments
         PFMomentCalculatorTool.CaloCalibClusterMomentsMaker2 = getTopoCalibMoments(inputFlags)
@@ -123,26 +123,49 @@ def getPFLCCalibTool(inputFlags):
     return PFLCCalibTool
 
 def getChargedPFOCreatorAlgorithm(inputFlags,chargedPFOOutputName):
-    PFOChargedCreatorAlgorithm = CompFactory.PFOChargedCreatorAlgorithm
-    PFOChargedCreatorAlgorithm = PFOChargedCreatorAlgorithm("PFOChargedCreatorAlgorithm")
+    PFOChargedCreatorAlgorithmFactory = CompFactory.PFOChargedCreatorAlgorithm
+    PFOChargedCreatorAlgorithm = PFOChargedCreatorAlgorithmFactory("PFOChargedCreatorAlgorithm")
     if chargedPFOOutputName:
         PFOChargedCreatorAlgorithm.PFOOutputName = chargedPFOOutputName
-    if(True is inputFlags.PF.EOverPMode):
+    if(inputFlags.PF.EOverPMode):
         PFOChargedCreatorAlgorithm.PFOOutputName="EOverPChargedParticleFlowObjects"
 
     return PFOChargedCreatorAlgorithm
 
 def getNeutralPFOCreatorAlgorithm(inputFlags,neutralPFOOutputName):
-
-    PFONeutralCreatorAlgorithm = CompFactory.PFONeutralCreatorAlgorithm
-    PFONeutralCreatorAlgorithm =  PFONeutralCreatorAlgorithm("PFONeutralCreatorAlgorithm")
+    PFONeutralCreatorAlgorithmFactory = CompFactory.PFONeutralCreatorAlgorithm
+    PFONeutralCreatorAlgorithm =  PFONeutralCreatorAlgorithmFactory("PFONeutralCreatorAlgorithm")
     if neutralPFOOutputName:
         PFONeutralCreatorAlgorithm.PFOOutputName = neutralPFOOutputName
-    if(True is inputFlags.PF.EOverPMode):
+    if(inputFlags.PF.EOverPMode):
         PFONeutralCreatorAlgorithm.PFOOutputName="EOverPNeutralParticleFlowObjects"
-    if(True is inputFlags.PF.useCalibHitTruthClusterMoments and True is inputFlags.PF.addClusterMoments):
+    if(inputFlags.PF.useCalibHitTruthClusterMoments and inputFlags.PF.addClusterMoments):
         PFONeutralCreatorAlgorithm.UseCalibHitTruth=True
 
     PFONeutralCreatorAlgorithm.DoClusterMoments=inputFlags.PF.addClusterMoments
         
     return PFONeutralCreatorAlgorithm
+
+def getChargedFlowElementCreatorAlgorithm(inputFlags,chargedFlowElementOutputName):    
+    FlowElementChargedCreatorAlgorithmFactory = CompFactory.PFChargedFlowElementCreatorAlgorithm
+    FlowElementChargedCreatorAlgorithm = FlowElementChargedCreatorAlgorithmFactory("PFChargedFlowElementCreatorAlgorithm")
+    if chargedFlowElementOutputName:
+        FlowElementChargedCreatorAlgorithm.FlowElementOutputName=chargedFlowElementOutputName
+    if(inputFlags.PF.EOverPMode):
+        FlowElementChargedCreatorAlgorithm.FlowElementOutputName="EOverPChargedFlowElements"
+
+    return FlowElementChargedCreatorAlgorithm
+
+def getNeutralFlowElementCreatorAlgorithm(inputFlags,neutralFlowElementOutputName):
+    FlowElementNeutralCreatorAlgorithmFactory = CompFactory.PFNeutralFlowElementCreatorAlgorithm
+    FlowElementNeutralCreatorAlgorithm = FlowElementNeutralCreatorAlgorithmFactory("PFNeutralFlowElementCreatorAlgorithm")
+    if neutralFlowElementOutputName:
+        FlowElementNeutralCreatorAlgorithm.FlowElementOutputName=neutralFlowElementOutputName
+    if(inputFlags.PF.EOverPMode):
+        FlowElementNeutralCreatorAlgorithm.FlowElementOutputName="EOverPNeutralFlowElements"
+    if(inputFlags.PF.useCalibHitTruthClusterMoments and inputFlags.PF.addClusterMoments):
+        FlowElementNeutralCreatorAlgorithm.useCalibHitTruth=True
+
+
+    return FlowElementNeutralCreatorAlgorithm
+            
diff --git a/Reconstruction/eflowRec/python/PFRun3Config.py b/Reconstruction/eflowRec/python/PFRun3Config.py
index 3c08b024c150..f6202fe273c6 100644
--- a/Reconstruction/eflowRec/python/PFRun3Config.py
+++ b/Reconstruction/eflowRec/python/PFRun3Config.py
@@ -128,6 +128,10 @@ def PFCfg(inputFlags,**kwargs):
     result.addEventAlgo(getChargedPFOCreatorAlgorithm(inputFlags,""))
     result.addEventAlgo(getNeutralPFOCreatorAlgorithm(inputFlags,""))
 
+    from eflowRec.PFCfg import getChargedFlowElementCreatorAlgorithm,getNeutralFlowElementCreatorAlgorithm
+    result.addEventAlgo(getChargedFlowElementCreatorAlgorithm(inputFlags,""))
+    result.addEventAlgo(getNeutralFlowElementCreatorAlgorithm(inputFlags,""))
+
     return result
 
 if __name__=="__main__":
-- 
GitLab


From dccda59ddba590d6a307f1f0b52831fd32f5a246 Mon Sep 17 00:00:00 2001
From: Andrii Verbytskyi <andrii.verbytskyi@cern.ch>
Date: Fri, 18 Dec 2020 12:02:55 +0000
Subject: [PATCH 149/225] HepMC3 nightlies branch fixes 16122020 part 1

---
 Generators/AtlasHepMC/AtlasHepMC/GenVertex.h  |  1 +
 .../HitAnalysis/src/TruthHitAnalysis.cxx      | 39 ++++++++++--------
 .../src/DecayInFlyTruthTrajectoryBuilder.cxx  | 36 +++++++++--------
 .../src/ElasticTruthTrajectoryBuilder.cxx     | 40 ++++++++++---------
 4 files changed, 64 insertions(+), 52 deletions(-)

diff --git a/Generators/AtlasHepMC/AtlasHepMC/GenVertex.h b/Generators/AtlasHepMC/AtlasHepMC/GenVertex.h
index 02220ccc846d..78c21f3fddf9 100644
--- a/Generators/AtlasHepMC/AtlasHepMC/GenVertex.h
+++ b/Generators/AtlasHepMC/AtlasHepMC/GenVertex.h
@@ -55,6 +55,7 @@ inline void line(std::ostream& os,const GenVertex& v) {v.print(os);}
 inline void line(std::ostream& os,const GenVertex* v) {v->print(os);}
 }
 inline int barcode(ConstGenVertexPtr p) { return p->barcode();}
+inline int barcode(const GenVertex p) { return p.barcode();}
 inline void* raw_pointer(GenVertexPtr p) { return p;}
 inline const void* raw_pointer(ConstGenVertexPtr p) { return p;}
 inline std::ostream& operator<<( std::ostream& os, const GenVertex* v ) { if (v) return os<<(*v); else return os;}
diff --git a/Simulation/Tools/HitAnalysis/src/TruthHitAnalysis.cxx b/Simulation/Tools/HitAnalysis/src/TruthHitAnalysis.cxx
index 278d1b99adbf..350c9c07ac0f 100755
--- a/Simulation/Tools/HitAnalysis/src/TruthHitAnalysis.cxx
+++ b/Simulation/Tools/HitAnalysis/src/TruthHitAnalysis.cxx
@@ -249,11 +249,16 @@ StatusCode TruthHitAnalysis::execute() {
     if (currentGenEventIter != mcCollection->end()) {
       int nvtx = 0;
       int nvtx_sec=0;
-      for (HepMC::GenEvent::vertex_const_iterator vtx=(*currentGenEventIter)->vertices_begin(); vtx!=(*currentGenEventIter)->vertices_end(); ++vtx) {
-	double x = (*vtx)->position().x();
-	double y = (*vtx)->position().y();
-	double z = (*vtx)->position().z();
-	double r = sqrt(x*x+y*y);
+#ifdef HEPMC3
+    for (auto vtx: (*currentGenEventIter)->vertices()) {
+#else
+    for (HepMC::GenEvent::vertex_const_iterator vtxit=(*currentGenEventIter)->vertices_begin(); vtxit!=(*currentGenEventIter)->vertices_end(); ++vtxit) {
+    auto vtx=*vtxit;
+#endif
+	double x = vtx->position().x();
+	double y = vtx->position().y();
+	double z = vtx->position().z();
+	double r = std::sqrt(x*x+y*y);
 	m_h_vtx_x->Fill(x);
 	m_h_vtx_y->Fill(y);
 	m_h_vtx_r->Fill(r);
@@ -284,9 +289,9 @@ StatusCode TruthHitAnalysis::execute() {
 
       int npart_prim=0; 
       int npart_sec=0;
-      HepMC::GenEvent::particle_const_iterator currentGenParticleIter;
-      for (currentGenParticleIter=(*currentGenEventIter)->particles_begin(); currentGenParticleIter!=(*currentGenEventIter)->particles_end(); ++currentGenParticleIter) {
-	const HepMC::FourVector mom = (*currentGenParticleIter)->momentum();
+
+      for (auto currentGenParticle: *(*currentGenEventIter)) {
+	const HepMC::FourVector mom = currentGenParticle->momentum();
 
 	m_h_truth_px->Fill(mom.x());
 	m_h_truth_py->Fill(mom.y());
@@ -294,27 +299,27 @@ StatusCode TruthHitAnalysis::execute() {
 	m_h_truth_pt->Fill(mom.perp());
 	m_h_truth_eta->Fill(mom.eta());
 	m_h_truth_phi->Fill(mom.phi());
-	m_h_barcode->Fill((*currentGenParticleIter)->barcode());
-	m_h_part_status->Fill((*currentGenParticleIter)->status());
+	m_h_barcode->Fill(HepMC::barcode(currentGenParticle));
+	m_h_part_status->Fill(currentGenParticle->status());
 	m_truth_px->push_back(mom.x());
 	m_truth_py->push_back(mom.y());
 	m_truth_pz->push_back(mom.z());
 	m_truth_pt->push_back(mom.perp());
 	m_truth_eta->push_back(mom.eta());
 	m_truth_phi->push_back(mom.phi());
-	m_barcode->push_back((*currentGenParticleIter)->barcode());		
-	m_status->push_back((*currentGenParticleIter)->status());
+	m_barcode->push_back(HepMC::barcode(currentGenParticle));		
+	m_status->push_back(currentGenParticle->status());
 	
-	int pdg = (*currentGenParticleIter)->pdg_id();
+	int pdg = currentGenParticle->pdg_id();
 	m_pdgid->push_back(pdg);
 	
-	if ((*currentGenParticleIter)->barcode() < 200000) {
+	if (HepMC::barcode(currentGenParticle) < 200000) {
 	  m_h_part_pdgid->Fill(pdg);
-	  m_h_part_p->Fill(mom.rho());
+	  m_h_part_p->Fill(std::sqrt(mom.x()*mom.x()+mom.y()*mom.y()+mom.z()*mom.z()));
 	  m_h_part_eta->Fill(mom.eta());
 	  m_h_part_phi->Fill(mom.phi());
 	  ++npart_prim; 
-	  if ((*currentGenParticleIter)->barcode() < 10000) {
+	  if (HepMC::barcode(currentGenParticle) < 10000) {
 	    m_h_n_generations->Fill(0);
 	  }
 	  else {
@@ -324,7 +329,7 @@ StatusCode TruthHitAnalysis::execute() {
 	else {
 	  m_h_part_pdgid_sec->Fill(pdg);
 	  ++npart_sec;
-	  const int gen = (*currentGenParticleIter)->barcode()/1000000 + 2;
+	  const int gen = HepMC::barcode(currentGenParticle)/1000000 + 2;
 	  m_h_n_generations->Fill(gen);    
 	}
       } // End iteration over particles
diff --git a/Tracking/TrkTools/TrkTruthCreatorTools/src/DecayInFlyTruthTrajectoryBuilder.cxx b/Tracking/TrkTools/TrkTruthCreatorTools/src/DecayInFlyTruthTrajectoryBuilder.cxx
index 1a77376c8404..9e25de02879f 100644
--- a/Tracking/TrkTools/TrkTruthCreatorTools/src/DecayInFlyTruthTrajectoryBuilder.cxx
+++ b/Tracking/TrkTools/TrkTruthCreatorTools/src/DecayInFlyTruthTrajectoryBuilder.cxx
@@ -36,17 +36,17 @@ StatusCode DecayInFlyTruthTrajectoryBuilder::initialize() {
 
 //================================================================
 void DecayInFlyTruthTrajectoryBuilder::
-buildTruthTrajectory(TruthTrajectory *result, const HepMC::GenParticle *input) const
+buildTruthTrajectory(TruthTrajectory *result, HepMC::ConstGenParticlePtr input) const
 {
   result->clear();
   if(input) {
-    const HepMC::GenParticle *next(nullptr);
-    const HepMC::GenParticle *current = input;
+    HepMC::ConstGenParticlePtr  next{nullptr};
+    HepMC::ConstGenParticlePtr  current = input;
 
     // Extend trajectory outwards.  The last particle should go at [0]
     // in the TruthTrajectory, so we need to use a tmp storage while
     // traversing the structure.
-    std::stack<const HepMC::GenParticle*> tmp;
+    std::stack<HepMC::ConstGenParticlePtr> tmp;
     while( (next = getDaughter(current)) ) {
       tmp.push(current = next);
     }
@@ -69,15 +69,20 @@ buildTruthTrajectory(TruthTrajectory *result, const HepMC::GenParticle *input) c
 
 //================================================================
 DecayInFlyTruthTrajectoryBuilder::MotherDaughter
-DecayInFlyTruthTrajectoryBuilder::truthTrajectoryCuts(const HepMC::GenVertex *vtx) const
+DecayInFlyTruthTrajectoryBuilder::truthTrajectoryCuts(HepMC::ConstGenVertexPtr vtx) const
 {
-  const HepMC::GenParticle *mother(nullptr);
-  const HepMC::GenParticle *daughter(nullptr);
-  
+  HepMC::GenParticlePtr mother{nullptr};
+  HepMC::GenParticlePtr daughter{nullptr};
   // only truth vertices with 1 incoming particle
+#ifdef HEPMC3
+  if(vtx && (vtx->particles_in().size() == 1)) {
+
+    mother = vtx->particles_in().front();
+#else 
   if(vtx && (vtx->particles_in_size() == 1)) {
 
     mother = *vtx->particles_in_const_begin();
+#endif    
     // Allow status code 1 and 2.  E.g. a pion that produced a long track can decay  outside of InDet and have status==2.
     if( mother && (mother->status() < 3) ) {
     
@@ -92,11 +97,8 @@ DecayInFlyTruthTrajectoryBuilder::truthTrajectoryCuts(const HepMC::GenVertex *vt
       if (vtx->particles_out_size() <= 2) {
 
 	int num_passed_cuts = 0;
-	const HepMC::GenParticle *passed_cuts(nullptr);
-	for(HepMC::GenVertex::particles_in_const_iterator it = vtx->particles_out_const_begin();
-	    it != vtx->particles_out_const_end(); ++it) {
-	
-	  const HepMC::GenParticle *candidate = *it;
+	HepMC::GenParticlePtr passed_cuts{nullptr};
+	for(HepMC::GenParticlePtr candidate: *vtx){
 	  if(candidate->pdg_id() == mother->pdg_id()) {
 
 	    if(passed_cuts && (mother->pdg_id() == 11)) { // second negative electron is a special case
@@ -128,9 +130,9 @@ DecayInFlyTruthTrajectoryBuilder::truthTrajectoryCuts(const HepMC::GenVertex *vt
 }
 
 //================================================================
-const HepMC::GenParticle* DecayInFlyTruthTrajectoryBuilder::getDaughter(const HepMC::GenParticle* mother) const {
+HepMC::ConstGenParticlePtr DecayInFlyTruthTrajectoryBuilder::getDaughter(HepMC::ConstGenParticlePtr mother) const {
 
-  const HepMC::GenParticle *daughter = nullptr;
+  HepMC::ConstGenParticlePtr daughter{nullptr};
   
   if(mother) {
 
@@ -145,9 +147,9 @@ const HepMC::GenParticle* DecayInFlyTruthTrajectoryBuilder::getDaughter(const He
 }
 
 //================================================================
-const HepMC::GenParticle* DecayInFlyTruthTrajectoryBuilder::getMother(const HepMC::GenParticle* daughter) const {
+HepMC::ConstGenParticlePtr DecayInFlyTruthTrajectoryBuilder::getMother(HepMC::ConstGenParticlePtr daughter) const {
 
-  const HepMC::GenParticle *mother = nullptr;
+  HepMC::ConstGenParticlePtr mother{nullptr};
 
   if(daughter) {
 
diff --git a/Tracking/TrkTools/TrkTruthCreatorTools/src/ElasticTruthTrajectoryBuilder.cxx b/Tracking/TrkTools/TrkTruthCreatorTools/src/ElasticTruthTrajectoryBuilder.cxx
index be2b26513633..5a76927964de 100644
--- a/Tracking/TrkTools/TrkTruthCreatorTools/src/ElasticTruthTrajectoryBuilder.cxx
+++ b/Tracking/TrkTools/TrkTruthCreatorTools/src/ElasticTruthTrajectoryBuilder.cxx
@@ -36,17 +36,17 @@ StatusCode ElasticTruthTrajectoryBuilder::initialize() {
 
 //================================================================
 void ElasticTruthTrajectoryBuilder::
-buildTruthTrajectory(TruthTrajectory *result, const HepMC::GenParticle *input) const
+buildTruthTrajectory(TruthTrajectory *result, HepMC::ConstGenParticlePtr input) const
 {
 	result->clear();
 	if(input) {
-		const HepMC::GenParticle *next(nullptr);
-		const HepMC::GenParticle *current = input;
+		HepMC::ConstGenParticlePtr next(nullptr);
+		HepMC::ConstGenParticlePtr current = input;
 
 		// Extend trajectory outwards.  The last particle should go at [0]
 		// in the TruthTrajectory, so we need to use a tmp storage while
 		// traversing the structure.
-		std::stack<const HepMC::GenParticle*> tmp;
+		std::stack<HepMC::ConstGenParticlePtr> tmp;
 		while( (next = getDaughter(current)) ) {
 			tmp.push(current = next);
 		}
@@ -69,15 +69,19 @@ buildTruthTrajectory(TruthTrajectory *result, const HepMC::GenParticle *input) c
 
 //================================================================
 ElasticTruthTrajectoryBuilder::MotherDaughter
-	ElasticTruthTrajectoryBuilder::truthTrajectoryCuts(const HepMC::GenVertex *vtx) const
+	ElasticTruthTrajectoryBuilder::truthTrajectoryCuts(HepMC::ConstGenVertexPtr vtx) const
 {
-	const HepMC::GenParticle *mother(nullptr);
-	const HepMC::GenParticle *daughter(nullptr);
-
+	HepMC::ConstGenParticlePtr mother{nullptr};
+	HepMC::ConstGenParticlePtr daughter{nullptr};
 	// only truth vertices with 1 incoming particle
+#ifdef HEPMC3
+	if(vtx && (vtx->particles_in().size() == 1)) {
+		mother = vtx->particles_in().front();
+#else
 	if(vtx && (vtx->particles_in_size() == 1)) {
 
 		mother = *vtx->particles_in_const_begin();
+#endif
 		// Allow status code 1 and 2.  E.g. a pion that produced a long track can decay  outside of InDet and have status==2.
 		if( mother && (mother->status() < 3) ) {
 
@@ -89,14 +93,14 @@ ElasticTruthTrajectoryBuilder::MotherDaughter
 			// is that with the higher energy (NOT pt).
 			// 
 			// allow 1 outgoing to cover possible vertexes from interaction in detector material
+#ifdef HEPMC3
+			if (vtx->particles_out().size() <= 2) {
+#else
 			if (vtx->particles_out_size() <= 2) {
-
+#endif
 				int num_passed_cuts = 0;
-				const HepMC::GenParticle *passed_cuts(nullptr);
-				for(HepMC::GenVertex::particles_in_const_iterator it = vtx->particles_out_const_begin();
-				it != vtx->particles_out_const_end(); ++it) {
-
-					const HepMC::GenParticle *candidate = *it;
+				HepMC::ConstGenParticlePtr passed_cuts{nullptr};
+				for(auto candidate: *vtx) {
 					if(candidate->pdg_id() == mother->pdg_id()) {
 
 						if(passed_cuts && (mother->pdg_id() == 11)) { // second negative electron is a special case
@@ -122,9 +126,9 @@ ElasticTruthTrajectoryBuilder::MotherDaughter
 }
 
 //================================================================
-const HepMC::GenParticle* ElasticTruthTrajectoryBuilder::getDaughter(const HepMC::GenParticle* mother) const {
+HepMC::ConstGenParticlePtr ElasticTruthTrajectoryBuilder::getDaughter(HepMC::ConstGenParticlePtr mother) const {
 
-	const HepMC::GenParticle *daughter = nullptr;
+	HepMC::ConstGenParticlePtr daughter{nullptr};
 
 	if(mother) {
 
@@ -139,9 +143,9 @@ const HepMC::GenParticle* ElasticTruthTrajectoryBuilder::getDaughter(const HepMC
 }
 
 //================================================================
-const HepMC::GenParticle* ElasticTruthTrajectoryBuilder::getMother(const HepMC::GenParticle* daughter) const {
+HepMC::ConstGenParticlePtr ElasticTruthTrajectoryBuilder::getMother(HepMC::ConstGenParticlePtr daughter) const {
 
-	const HepMC::GenParticle *mother = nullptr;
+	HepMC::ConstGenParticlePtr mother{nullptr};
 
 	if(daughter) {
 
-- 
GitLab


From ca2760e6264419179a458f66e94b37df83296958 Mon Sep 17 00:00:00 2001
From: Tomasz Bold <tomasz.bold@gmail.com>
Date: Fri, 18 Dec 2020 12:32:02 +0000
Subject: [PATCH 150/225] Small fixes and renaming in min bias algs & config

---
 .../python/TrackCountMonitoringMT.py          |   8 +-
 .../TrigMinBias/src/TrackCountHypoAlgMT.cxx   | 114 ++++++-----
 .../TrigMinBias/src/TrackCountHypoAlgMT.h     |  14 +-
 .../TrigMinBias/src/TrackCountHypoTool.cxx    |  66 ++++---
 .../TrigMinBias/src/TrackCountHypoTool.h      |  10 +-
 .../MinBias/MinBiasMenuSequences.py           | 187 +++++++-----------
 6 files changed, 190 insertions(+), 209 deletions(-)

diff --git a/Trigger/TrigAlgorithms/TrigMinBias/python/TrackCountMonitoringMT.py b/Trigger/TrigAlgorithms/TrigMinBias/python/TrackCountMonitoringMT.py
index 9972a81fb3f8..207b77f89780 100644
--- a/Trigger/TrigAlgorithms/TrigMinBias/python/TrackCountMonitoringMT.py
+++ b/Trigger/TrigAlgorithms/TrigMinBias/python/TrackCountMonitoringMT.py
@@ -2,9 +2,11 @@
 def TrackCountMonitoring():
     from AthenaMonitoringKernel.GenericMonitoringTool import GenericMonitoringTool
     monTool = GenericMonitoringTool('MonTool')
-    monTool.defineHistogram('ntrks', path='EXPERT', type='TH1I', title='ntrks',xbins=100, xmin=-0.5, xmax=4999.5)
+    monTool.defineHistogram('ntrks', path='EXPERT', type='TH1I', title='ntrks', xbins=100, xmin=-0.5, xmax=4999.5)
     from TrigMinBias.TrigMinBiasConf import TrackCountHypoAlgMT
     alg=TrackCountHypoAlgMT()
-    for i in range(len(alg.min_pt)):
-        monTool.defineHistogram('counts_minpTcutIndex_{}_maxZ0cutIndex_{}'.format(i,i), path='EXPERT', type='TH1I', title='counts for min pT and max z0 cut',xbins=100, xmin=-0.5, xmax=4999.5)
+    for i in range(len(alg.minPt)):
+        monTool.defineHistogram('countsForSelection{}'.format(i),
+                                path='EXPERT', type='TH1I', title='counts for min pT and max z0 cut',
+                                xbins=100, xmin=-0.5, xmax=4999.5)
     return monTool
diff --git a/Trigger/TrigAlgorithms/TrigMinBias/src/TrackCountHypoAlgMT.cxx b/Trigger/TrigAlgorithms/TrigMinBias/src/TrackCountHypoAlgMT.cxx
index 171a55ba8dd8..1cebee7f19e3 100644
--- a/Trigger/TrigAlgorithms/TrigMinBias/src/TrackCountHypoAlgMT.cxx
+++ b/Trigger/TrigAlgorithms/TrigMinBias/src/TrackCountHypoAlgMT.cxx
@@ -8,19 +8,18 @@ Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 #include "AthViews/ViewHelper.h"
 
 using TrigCompositeUtils::createAndStore;
-using TrigCompositeUtils::DecisionContainer;
 using TrigCompositeUtils::DecisionAuxContainer;
+using TrigCompositeUtils::DecisionContainer;
 using TrigCompositeUtils::DecisionIDContainer;
 using TrigCompositeUtils::decisionIDs;
-using TrigCompositeUtils::newDecisionIn;
-using TrigCompositeUtils::linkToPrevious;
-using TrigCompositeUtils::viewString;
 using TrigCompositeUtils::featureString;
 using TrigCompositeUtils::findLink;
 using TrigCompositeUtils::LinkInfo;
+using TrigCompositeUtils::linkToPrevious;
+using TrigCompositeUtils::newDecisionIn;
+using TrigCompositeUtils::viewString;
 
-TrackCountHypoAlgMT::TrackCountHypoAlgMT(const std::string& name, ISvcLocator* pSvcLocator) :
-::HypoBase(name, pSvcLocator)
+TrackCountHypoAlgMT::TrackCountHypoAlgMT(const std::string &name, ISvcLocator *pSvcLocator) : ::HypoBase(name, pSvcLocator)
 {
 }
 
@@ -29,103 +28,114 @@ StatusCode TrackCountHypoAlgMT::initialize()
   ATH_CHECK(m_tracksKey.initialize());
   ATH_CHECK(m_trackCountKey.initialize());
   renounce(m_tracksKey);
-  ATH_CHECK(m_min_pt.size()==m_max_z0.size());
+  ATH_CHECK(m_minPt.size() == m_maxZ0.size());
 
-  if (m_tracksKey.key() == "Undefined" || m_trackCountKey.key() == "Undefined") {
-    ATH_MSG_ERROR("either track Key name or track count key name is undefined " );
+  if (m_tracksKey.key() == "Undefined" || m_trackCountKey.key() == "Undefined")
+  {
+    ATH_MSG_ERROR("either track Key name or track count key name is undefined ");
     return StatusCode::FAILURE;
   }
 
   ATH_CHECK(m_hypoTools.retrieve());
-  if (!m_monTool.empty()) ATH_CHECK(m_monTool.retrieve());
+  if (!m_monTool.empty())
+    ATH_CHECK(m_monTool.retrieve());
 
   return StatusCode::SUCCESS;
 }
 
-StatusCode TrackCountHypoAlgMT::execute(const EventContext& context) const
+StatusCode TrackCountHypoAlgMT::execute(const EventContext &context) const
 {
-  ATH_MSG_DEBUG ( "Executing " << name() << "..." );
-  auto previousDecisionsHandle = SG::makeHandle( decisionInput(), context );
+  ATH_MSG_DEBUG("Executing " << name() << "...");
+  auto previousDecisionsHandle = SG::makeHandle(decisionInput(), context);
 
-  if( not previousDecisionsHandle.isValid() ) {//implicit
-    ATH_MSG_DEBUG( "No implicit RH for previous decisions "<<  decisionInput().key()<<": is this expected?" );
+  if (not previousDecisionsHandle.isValid())
+  { //implicit
+    ATH_MSG_DEBUG("No implicit RH for previous decisions " << decisionInput().key() << ": is this expected?");
     return StatusCode::SUCCESS;
   }
 
-  if (previousDecisionsHandle->size() == 0) {
-    ATH_MSG_DEBUG( "No previous decision, nothing to do.");
+  if (previousDecisionsHandle->size() == 0)
+  {
+    ATH_MSG_DEBUG("No previous decision, nothing to do.");
     return StatusCode::SUCCESS;
-  } else if (previousDecisionsHandle->size() > 1) {
-    ATH_MSG_ERROR("Found " << previousDecisionsHandle->size() <<" previous decisions.");
+  }
+  else if (previousDecisionsHandle->size() > 1)
+  {
+    ATH_MSG_ERROR("Found " << previousDecisionsHandle->size() << " previous decisions.");
     return StatusCode::FAILURE;
   }
 
-  ATH_MSG_DEBUG( "Running with "<< previousDecisionsHandle->size() <<" implicit ReadHandles for previous decisions");
+  ATH_MSG_DEBUG("Running with " << previousDecisionsHandle->size() << " implicit ReadHandles for previous decisions");
 
+  const auto viewTrk = (previousDecisionsHandle->at(0))->objectLink<ViewContainer>(viewString());
+  ATH_CHECK(viewTrk.isValid());
+  auto tracksHandle = ViewHelper::makeHandle(*viewTrk, m_tracksKey, context);
+  ATH_CHECK(tracksHandle.isValid());
+  ATH_MSG_DEBUG("spacepoint handle size: " << tracksHandle->size() << "...");
 
-  const auto viewTrk = (previousDecisionsHandle->at(0))->objectLink<ViewContainer>( viewString() );
-  ATH_CHECK( viewTrk.isValid() );
-  auto tracksHandle = ViewHelper::makeHandle( *viewTrk, m_tracksKey, context );
-  ATH_CHECK( tracksHandle.isValid() );
-  ATH_MSG_DEBUG ( "spacepoint handle size: " << tracksHandle->size() << "..." );
+  int ntrks = tracksHandle->size();
+  ATH_MSG_DEBUG("Successfully retrieved track container of size" << ntrks);
 
-  int ntrks=tracksHandle->size();
-  ATH_MSG_DEBUG ("Successfully retrieved track container of size" <<ntrks);
-
-  std::vector<int> counts(m_min_pt.size());
-  for (const auto  trackPtr: *tracksHandle){
-    const Trk::Perigee& aMeasPer = trackPtr->perigeeParameters();
+  std::vector<int> counts(m_minPt.size());
+  for (const auto trackPtr : *tracksHandle)
+  {
+    const Trk::Perigee &aMeasPer = trackPtr->perigeeParameters();
     const double pT = aMeasPer.pT();
     const double z0 = aMeasPer.parameters()[Trk::z0];
 
-    for (long unsigned int i=0;i<m_min_pt.size();i++){
-      if(pT >= m_min_pt[i] && std::fabs(z0) < m_max_z0[i]) counts[i]++;
+    for (long unsigned int i = 0; i < m_minPt.size(); i++)
+    {
+      if (pT >= m_minPt[i] && std::fabs(z0) < m_maxZ0[i])
+        counts[i]++;
     }
   }
-  for (long unsigned int i=0;i<m_min_pt.size();i++){
-    ATH_MSG_DEBUG( "Number of tracks found with pT cut= "<<m_min_pt[i] << " MeV =" <<"and z0 cut= "<<m_max_z0[i] <<  counts[i] );
+  for (long unsigned int i = 0; i < m_minPt.size(); i++)
+  {
+    ATH_MSG_DEBUG("Number of tracks found with pT cut= " << m_minPt[i] << " MeV ="
+                                                         << "and z0 cut= " << m_maxZ0[i] << counts[i]);
   }
 
   // Recording Data
-  auto trackCountContainer = std::make_unique< xAOD::TrigCompositeContainer>();
-  auto trackCountContainerAux = std::make_unique< xAOD::TrigCompositeAuxContainer>();
+  auto trackCountContainer = std::make_unique<xAOD::TrigCompositeContainer>();
+  auto trackCountContainerAux = std::make_unique<xAOD::TrigCompositeAuxContainer>();
   trackCountContainer->setStore(trackCountContainerAux.get());
 
-  xAOD::TrigComposite * trackCount = new xAOD::TrigComposite();
+  xAOD::TrigComposite *trackCount = new xAOD::TrigComposite();
   trackCountContainer->push_back(trackCount);
   trackCount->setDetail("ntrks", ntrks);
-  trackCount->setDetail("pTcuts", static_cast<std::vector<float>>(m_min_pt));
-  trackCount->setDetail("z0cuts", static_cast<std::vector<float>>(m_max_z0));
+  trackCount->setDetail("pTcuts", static_cast<std::vector<float>>(m_minPt));
+  trackCount->setDetail("z0cuts", static_cast<std::vector<float>>(m_maxZ0));
   trackCount->setDetail("counts", counts);
 
   // TODO revisit
 
-  auto mon_ntrks = Monitored::Scalar<int>("ntrks",ntrks);
-  Monitored::Group(m_monTool,mon_ntrks);
-  for(long unsigned int i=0;i<counts.size();i++){
-    auto mon_counts = Monitored::Scalar<int>("counts"+std::to_string(i),counts[i]);
-    Monitored::Group(m_monTool,mon_counts);
+  auto mon_ntrks = Monitored::Scalar<int>("ntrks", ntrks);
+  Monitored::Group(m_monTool, mon_ntrks);
+  for (long unsigned int i = 0; i < counts.size(); i++)
+  {
+    auto mon_counts = Monitored::Scalar<int>("counts" + std::to_string(i), counts[i]);
+    Monitored::Group(m_monTool, mon_counts);
   }
 
-  SG::WriteHandle<DecisionContainer> outputHandle = createAndStore(decisionOutput(), context );
+  SG::WriteHandle<DecisionContainer> outputHandle = createAndStore(decisionOutput(), context);
   auto decisions = outputHandle.ptr();
 
-  auto d = newDecisionIn( decisions);
-  linkToPrevious( d, decisionInput().key(), 0 );
+  auto d = newDecisionIn(decisions);
+  linkToPrevious(d, decisionInput().key(), 0);
 
   TrigCompositeUtils::DecisionIDContainer prev;
-  TrigCompositeUtils::decisionIDs( previousDecisionsHandle->at(0), prev );
+  TrigCompositeUtils::decisionIDs(previousDecisionsHandle->at(0), prev);
 
   TrackCountHypoTool::TrkCountsInfo trkinfo{d, trackCount, prev};
 
-  for(auto &tool:m_hypoTools)
+  for (auto &tool : m_hypoTools)
   {
     ATH_CHECK(tool->decide(trkinfo));
   }
 
   SG::WriteHandle<xAOD::TrigCompositeContainer> trackCountHandle(m_trackCountKey, context);
-  ATH_CHECK(trackCountHandle.record( std::move( trackCountContainer ), std::move( trackCountContainerAux ) ) );
-  d->setObjectLink( featureString(), ElementLink<xAOD::TrigCompositeContainer>( m_trackCountKey.key(), 0) );
+  ATH_CHECK(trackCountHandle.record(std::move(trackCountContainer), std::move(trackCountContainerAux)));
+  d->setObjectLink(featureString(), ElementLink<xAOD::TrigCompositeContainer>(m_trackCountKey.key(), 0));
   //ATH_CHECK( hypoBaseOutputProcessing(outputHandle) );
   return StatusCode::SUCCESS;
 }
diff --git a/Trigger/TrigAlgorithms/TrigMinBias/src/TrackCountHypoAlgMT.h b/Trigger/TrigAlgorithms/TrigMinBias/src/TrackCountHypoAlgMT.h
index 715c4de3e655..6c1c91eba2b1 100644
--- a/Trigger/TrigAlgorithms/TrigMinBias/src/TrackCountHypoAlgMT.h
+++ b/Trigger/TrigAlgorithms/TrigMinBias/src/TrackCountHypoAlgMT.h
@@ -27,12 +27,12 @@ public:
 
 private:
   TrackCountHypoAlgMT();
-  ToolHandleArray< TrackCountHypoTool > m_hypoTools {this, "HypoTools", {},"Tools that perform actual selection"};
-  SG::ReadHandleKey<xAOD::TrackParticleContainer> m_tracksKey{this,"tracksKey","Undefined",""};
-  SG::WriteHandleKey<xAOD::TrigCompositeContainer> m_trackCountKey{this,"trackCountKey","Undefined",""};
-  Gaudi::Property<std::vector<float>> m_min_pt{this, "min_pt",{0.1,0.2,4.0,5.0}, "Accept events with momentum higher than this limit"};
-  Gaudi::Property<std::vector<float>> m_max_z0{this, "max_z0",{100,401,200,300}, "Accept events with absolute value of vertex position lower \
-  than this limit in mm; this vector has to be of the same size as min_pT vector, repetition of cut values are allowed if that makes the number of elements the same"};
-  ToolHandle<GenericMonitoringTool> m_monTool{this,"MonTool","","Monitoring tool"};
+  ToolHandleArray< TrackCountHypoTool > m_hypoTools {this, "HypoTools", {}, "Tools that perform actual selection"};
+  SG::ReadHandleKey<xAOD::TrackParticleContainer> m_tracksKey{this, "tracksKey", "Undefined", ""};
+  SG::WriteHandleKey<xAOD::TrigCompositeContainer> m_trackCountKey{this, "trackCountKey", "Undefined", ""};
+  Gaudi::Property<std::vector<float>> m_minPt{this, "minPt", {0.1,0.2,4.0,5.0}, "Accept events with momentum higher than this limit"};
+  Gaudi::Property<std::vector<float>> m_maxZ0{this, "maxZ0", {100,401,200,300}, "Accept events with absolute value of vertex position lower \
+      than this limit in mm; this vector has to be of the same size as minPt vector, repetition of cut values are allowed if that makes the number of elements the same"};
+  ToolHandle<GenericMonitoringTool> m_monTool{this,"MonTool", "", "Monitoring tool"};
 };
 #endif // TRIGT2MINBIAS_TRACKCOUNTHYPOALGMT_H
diff --git a/Trigger/TrigAlgorithms/TrigMinBias/src/TrackCountHypoTool.cxx b/Trigger/TrigAlgorithms/TrigMinBias/src/TrackCountHypoTool.cxx
index 7b1616eb9278..83c4fa7f761b 100644
--- a/Trigger/TrigAlgorithms/TrigMinBias/src/TrackCountHypoTool.cxx
+++ b/Trigger/TrigAlgorithms/TrigMinBias/src/TrackCountHypoTool.cxx
@@ -3,7 +3,6 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
-
 #include "TrigCompositeUtils/HLTIdentifier.h"
 #include "AthenaMonitoringKernel/Monitored.h"
 
@@ -11,19 +10,26 @@ Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 using namespace TrigCompositeUtils;
 
-TrackCountHypoTool::TrackCountHypoTool( const std::string& type,const std::string& name,const IInterface* parent )
-: AthAlgTool( type, name, parent ),
-m_decisionId( HLT::Identifier::fromToolName( name ) ) {}
+TrackCountHypoTool::TrackCountHypoTool(const std::string &type, const std::string &name, const IInterface *parent)
+	: AthAlgTool(type, name, parent),
+	  m_decisionId(HLT::Identifier::fromToolName(name)) {}
 
-StatusCode TrackCountHypoTool::initialize()  {
+StatusCode TrackCountHypoTool::initialize()
+{
 	return StatusCode::SUCCESS;
 }
 
-StatusCode TrackCountHypoTool::decide(  TrkCountsInfo& trkinfo )  const {
-	if ( trkinfo.previousDecisionIDs.count( m_decisionId.numeric() ) == 0 ) {
+StatusCode TrackCountHypoTool::decide(TrkCountsInfo &trkinfo) const
+{
+	if (trkinfo.previousDecisionIDs.count(m_decisionId.numeric()) == 0)
+	{
 		ATH_MSG_DEBUG("Already rejected");
 		return StatusCode::SUCCESS;
 	}
+	if ( m_acceptAll ) {		
+		addDecisionID(m_decisionId.numeric(), trkinfo.decision);
+		ATH_MSG_DEBUG("REGTEST event accepted because of acceptAll");
+	}
 
 	std::vector<int> counts;
 
@@ -34,35 +40,35 @@ StatusCode TrackCountHypoTool::decide(  TrkCountsInfo& trkinfo )  const {
 	trkinfo.counts->getDetail<std::vector<float>>("z0cuts", z0cuts);
 	float countForConfiguredPtThreshold{};
 	bool found{false};
-	for ( size_t i = 0; i < counts.size(); ++i ) {
-		 if ( std::abs( pTcuts[i] - m_min_pt ) < 0.001 && std::abs( z0cuts[i] - m_max_z0 ) < 0.001 ) {
+	for (size_t i = 0; i < counts.size(); ++i)
+	{
+		if (std::abs(pTcuts[i] - m_minPt) < 0.001 && std::abs(z0cuts[i] - m_maxZ0) < 0.001)
+		{
 			found = true;
 			countForConfiguredPtThreshold = counts[i];
-		 }
+		}
 	}
-	if (!found ) {
-		ATH_MSG_ERROR ("Unable to find tracks count for requested pT threshold " << m_min_pt << " need to fix hypo tool configuratio or add new threshold in tracks counting");
-	  for ( size_t i = 0; i < counts.size(); ++i ) {
-	    ATH_MSG_ERROR( "Count of tracks of pT above " << pTcuts[i]  << " is available");
-	  }
-	  return StatusCode::FAILURE;
+
+	if (!found)
+	{
+		ATH_MSG_ERROR("Unable to find tracks count for requested pT threshold " << m_minPt << " need to fix hypo tool configuration or add new threshold in tracks counting");
+		for (size_t i = 0; i < counts.size(); ++i)
+		{
+			ATH_MSG_ERROR("Count of tracks of pT above " << pTcuts[i] << " and z0 requirement "  << z0cuts[i] << " that are available");
+		}
+		return StatusCode::FAILURE;
 	}
-	else{
-		ATH_MSG_DEBUG ("REGTEST found "<<countForConfiguredPtThreshold <<" tracks for "<<m_min_pt);
+	else
+	{
+		ATH_MSG_DEBUG("REGTEST found " << countForConfiguredPtThreshold << " tracks for " << m_minPt);
 	}
-	std::vector<bool> decisionCuts({
-		(m_required_ntrks != -1 ? m_required_ntrks <= countForConfiguredPtThreshold  :  (bool)m_logicAnd),
-		(m_max_required_ntrks != -1 ? m_max_required_ntrks > countForConfiguredPtThreshold : (bool)m_logicAnd)
-	});
+	
+	const bool minTrkPassed = (m_minNtrks == -1) or (countForConfiguredPtThreshold > m_minNtrks);
+	const bool maxTrkPassed = (m_maxNtrks == -1) or (countForConfiguredPtThreshold < m_maxNtrks);
 
-	if(m_logicAnd && !std::all_of(decisionCuts.begin(),decisionCuts.end(),[](bool k ){return k; }) ){
-
-		return StatusCode::SUCCESS;
-	}else if(m_logicAnd==false && !std::any_of(decisionCuts.begin(),decisionCuts.end(),[](bool k ){return k; }) ){
-		return StatusCode::SUCCESS;
-	}else{
-		addDecisionID( m_decisionId.numeric(), trkinfo.decision );
-		ATH_MSG_DEBUG ("REGTEST event accepted");
+	if ( minTrkPassed and maxTrkPassed ) {		
+		addDecisionID(m_decisionId.numeric(), trkinfo.decision);
+		ATH_MSG_DEBUG("REGTEST event accepted");
 	}
 	return StatusCode::SUCCESS;
 }
diff --git a/Trigger/TrigAlgorithms/TrigMinBias/src/TrackCountHypoTool.h b/Trigger/TrigAlgorithms/TrigMinBias/src/TrackCountHypoTool.h
index 4c0347dca06f..f62a1800900b 100644
--- a/Trigger/TrigAlgorithms/TrigMinBias/src/TrackCountHypoTool.h
+++ b/Trigger/TrigAlgorithms/TrigMinBias/src/TrackCountHypoTool.h
@@ -31,13 +31,11 @@ public:
   private:
 
     HLT::Identifier m_decisionId;
-    Gaudi::Property<float> m_min_pt{this, "min_pt",0.1, "Accept events with momentum higher than this limit in MeV"};
-    Gaudi::Property<float> m_max_z0{this, "max_z0",100, "Accept events with absolute value of vertex lower than this limit in mm"};
-    Gaudi::Property<float> m_required_ntrks{this, "required_ntrks", 1, "Accept events with minimum of this number of tracks"};
-    Gaudi::Property<float> m_max_required_ntrks{this, "max_required_ntrks", -1, "Accept events with maximum of this number of tracks"};
+    Gaudi::Property<float> m_minPt{this, "minPt",0.1, "Accept events with momentum higher than this limit in MeV"};
+    Gaudi::Property<float> m_maxZ0{this, "maxZ0",100, "Accept events with absolute value of vertex lower than this limit in mm"};
+    Gaudi::Property<float> m_minNtrks{this, "minNtrks", 1, "Accept events with minimum of this number of tracks, -1 means this cut is disabled"};
+    Gaudi::Property<float> m_maxNtrks{this, "maxNtrks", -1, "Accept events with maximum of this number of tracks, -1 means this cut is disabled"};
     Gaudi::Property<bool> m_acceptAll{this, "acceptAll", false, "Accept all events"};
-    Gaudi::Property<bool> m_cutMinAndMax{this, "cutMinAndMax", false, "take events within the given higher and lower limt/cut"};
-    Gaudi::Property<bool> m_logicAnd{this, "TriggerTypeAnd", true, "And/Or Logic"};
   };
 
   #endif //> !TRIGT2MINBIAS_TRACKCOUNTHYPOTOOL_H
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/MinBias/MinBiasMenuSequences.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/MinBias/MinBiasMenuSequences.py
index 1f3adb4398ed..a23cf16951fa 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/MinBias/MinBiasMenuSequences.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/MinBias/MinBiasMenuSequences.py
@@ -15,156 +15,121 @@ from TrigInDetConfig.ConfigSettings import getInDetTrigConfig
 ########
 # to move into TrigMinBiasHypoConfigMT?
 
-def SPCountHypoToolGen(chainDict):        
+def SPCountHypoToolGen(chainDict):
     from TrigT2MinBias.TrigT2MinBiasConf import SPCountHypoTool
     hypo = SPCountHypoTool(chainDict["chainName"])
     if "hmt" in chainDict["chainName"]:
-        hypo.totNumSctSP = int( chainDict["chainParts"][0]["hypoL2Info"].strip("sp") )
+        hypo.totNumSctSP = int(chainDict["chainParts"][0]["hypoL2Info"].strip("sp"))
     if "mb_sptrk" in chainDict["chainName"]:
-        hypo.totNumPixSP  = 2
-        hypo.totNumSctSP  = 3
+        hypo.totNumPixSP = 2
+        hypo.totNumSctSP = 3
             # will set here thresholds
     return hypo
 
 
 
 def TrackCountHypoToolGen(chainDict):
-    from TrigMinBias.TrigMinBiasConf import  TrackCountHypoTool
+    from TrigMinBias.TrigMinBiasConf import TrackCountHypoTool
     hypo = TrackCountHypoTool(chainDict["chainName"])
     if "hmt" in chainDict["chainName"]:
-        hypo.required_ntrks = int( chainDict["chainParts"][0]["hypoEFInfo"].strip("trk") )
+        hypo.minNtrks = int(chainDict["chainParts"][0]["hypoEFInfo"].strip("trk"))
     if "mb_sptrk" in chainDict["chainName"]:
-        hypo.min_pt  = 0.2
-        hypo.max_z0  = 401
+        hypo.minPt = 0.2
+        hypo.maxZ0 = 401
         # will set here cuts
     return hypo
 
 
 ### Now the sequences
 
-# These are obsoletee and can probably be deleted. Leeft here commented as need feedback fomr experts
-
-## def minbiasSpacePointMenuSequence():
-##     # menu components
-##     # retrieve the reco seuqnece
-##     from TriggerMenuMT.HLTMenuConfig.MinBias.MinBiasSPRecoSequences import minbiasSpacePointAthSequence
-##     ( minbiasSpacePointSequence, InputMakerAlg, sequenceOut) = RecoFragmentsPool.retrieve(minbiasSpacePointAthSequence,ConfigFlags)
+def MinBiasSPSequence():
+    spAlgsList = []
+    from TrigT2MinBias.TrigT2MinBiasConf import TrigCountSpacePointsMT, SPCountHypoAlgMT
 
-##     #hypo
-##     mbHypoAlg = MbCountHypoAlgMT("MinBiasHypoAlg_sp")
-##     mbHypoAlg.MinBiasContainerKey=sequenceOut
+    spInputMakerAlg = EventViewCreatorAlgorithm("IM_SPEventViewCreator")
+    spInputMakerAlg.ViewFallThrough = True
+    spInputMakerAlg.RoITool = ViewCreatorInitialROITool()
+    spInputMakerAlg.InViewRoIs = "InputRoI"
+    spInputMakerAlg.Views = "SPView"
+
+    idTrigConfig = getInDetTrigConfig('minBias')
+    idAlgs, verifier = makeInDetAlgs(config=idTrigConfig, 
+                                     rois=spInputMakerAlg.InViewRoIs, 
+                                     viewVerifier='SPViewDataVerifier')
+    verifier.DataObjects += [('TrigRoiDescriptorCollection', 'StoreGateSvc+InputRoI'),
+                             ('SCT_ID', 'DetectorStore+SCT_ID'),
+                             ('PixelID', 'DetectorStore+PixelID'),
+                             ('TagInfo', 'DetectorStore+ProcessingTags')]
 
-##     return  MenuSequence( Sequence    = minbiasSpacePointSequence,
-##                           Maker       = InputMakerAlg,
-##                           Hypo        = mbHypoAlg,
-##                           HypoToolGen = TrigMinBiasHypoToolFromDict )
+    # Make sure required objects are still available at whole-event level
+    from AthenaCommon.AlgSequence import AlgSequence
+    topSequence = AlgSequence()
+    topSequence.SGInputLoader.Load += [('SCT_ID', 'DetectorStore+SCT_ID'),
+                                       ('PixelID', 'DetectorStore+PixelID'),
+                                       ('TagInfo', 'DetectorStore+ProcessingTags')]
 
+    spAlgsList = idAlgs[:-2]
 
-## #obsolete?
-## def minbiasTrackMenuSequence():
-##     # menu components
-##     # retrieve the reco seuqnece
-##     from TriggerMenuMT.HLTMenuConfig.MinBias.MinBiasTrkRecoSequences import minbiasTrackAthSequence
-##     (minbiasTrackSequence, InputMakerAlg, sequenceOut) = RecoFragmentsPool.retrieve(minbiasTrackAthSequence,ConfigFlags)
+    spCount = TrigCountSpacePointsMT()
+    spCount.SpacePointsKey = recordable("HLT_SpacePointCounts")
 
-##     #hypo
-##     mbHypoAlg = MbCountHypoAlgMT("MinBiasHypoAlg_trk")
-##     mbHypoAlg.MinBiasContainerKey=sequenceOut
+    from TrigT2MinBias.TrigT2MinBiasMonitoringMT import SpCountMonitoring
+    spCount.MonTool = SpCountMonitoring()
 
-##     return  MenuSequence( Sequence    = minbiasTrackSequence,
-##                           Maker       = InputMakerAlg,
-##                           Hypo        = mbHypoAlg,
-##                           HypoToolGen = TrigMinBiasHypoToolFromDict )
+    spRecoSeq = parOR("spRecoSeq", spAlgsList + [spCount])
+    spSequence = seqAND("spSequence", [spInputMakerAlg, spRecoSeq])
+    spInputMakerAlg.ViewNodeName = spRecoSeq.name()
 
 
-# NEW:
-def MinBiasSPSequence():
-    SpList = []
-    from TrigT2MinBias.TrigT2MinBiasConf import TrigCountSpacePointsMT, SPCountHypoAlgMT
+    spCountHypo =SPCountHypoAlgMT()
+    spCountHypo.SpacePointsKey=recordable("HLT_SpacePointCounts")
 
-    SPInputMakerAlg = EventViewCreatorAlgorithm("IM_SPEventViewCreator")
-    SPInputMakerAlg.ViewFallThrough = True
-    SPInputMakerAlg.RoITool = ViewCreatorInitialROITool()
-    SPInputMakerAlg.InViewRoIs = "InputRoI"
-    SPInputMakerAlg.Views = "SPView"
-
-    IDTrigConfig = getInDetTrigConfig( 'minBias' )
-    idAlgs, verifier = makeInDetAlgs(  config = IDTrigConfig, rois=SPInputMakerAlg.InViewRoIs, viewVerifier='SPViewDataVerifier' )
-    verifier.DataObjects += [( 'TrigRoiDescriptorCollection' , 'StoreGateSvc+InputRoI' ),
-                                 ( 'SCT_ID' , 'DetectorStore+SCT_ID' ),
-                                 ( 'PixelID' , 'DetectorStore+PixelID' ),
-                                 ( 'TagInfo' , 'DetectorStore+ProcessingTags' )]
-
-    # Make sure required objects are still available at whole-event level
-    from AthenaCommon.AlgSequence import AlgSequence
-    topSequence = AlgSequence()
-    topSequence.SGInputLoader.Load += [( 'SCT_ID' , 'DetectorStore+SCT_ID' ),
-                                           ( 'PixelID' , 'DetectorStore+PixelID' ),
-                                           ( 'TagInfo' , 'DetectorStore+ProcessingTags' )]
-    
-    SpList = idAlgs[:-2]
-    
-    SpCount=TrigCountSpacePointsMT()
-    SpCount.SpacePointsKey=recordable("HLT_SpacePointCounts")
-    
-    from TrigT2MinBias.TrigT2MinBiasMonitoringMT import SpCountMonitoring
-    SpCount.MonTool = SpCountMonitoring()
-    
-    SPrecoSeq = parOR("SPrecoSeq", SpList + [ SpCount ])
-    SPSequence = seqAND("SPSequence", [SPInputMakerAlg, SPrecoSeq])
-    SPInputMakerAlg.ViewNodeName = SPrecoSeq.name()
-    
-    
-    SpCountHypo =SPCountHypoAlgMT()
-    SpCountHypo.SpacePointsKey=recordable("HLT_SpacePointCounts")
-    
-    return MenuSequence( Sequence   = SPSequence,
-                        Maker       = SPInputMakerAlg,
-                        Hypo        = SpCountHypo,
+    return MenuSequence(Sequence    = spSequence,
+                        Maker       = spInputMakerAlg,
+                        Hypo        = spCountHypo,
                         HypoToolGen = SPCountHypoToolGen )
 
 
 def MinBiasTrkSequence():
         from TrigMinBias.TrigMinBiasConf import TrackCountHypoAlgMT
 
-        TrkInputMakerAlg = EventViewCreatorAlgorithm("IM_TrkEventViewCreator")
-        TrkInputMakerAlg.ViewFallThrough = True
-        TrkInputMakerAlg.RoITool = ViewCreatorInitialROITool()
-        TrkInputMakerAlg.InViewRoIs = "InputRoI" # contract with the consumer
-        TrkInputMakerAlg.Views = "TrkView"
-        TrkInputMakerAlg.RequireParentView = True
-        TrkInputMakerAlg.ViewNodeName = "TrkCountHypoAlgMTNode"
-
-        # prepare algorithms to run in views, first, inform scheduler that input data is available in parent view (has to be done by hand)
-        IDTrigConfig = getInDetTrigConfig( 'minBias' )
-        idAlgs, verifier = makeInDetAlgs( config = IDTrigConfig, rois=TrkInputMakerAlg.InViewRoIs, viewVerifier='TrkrecoSeqDataVerifier')
-        verifier.DataObjects += [( 'TrigRoiDescriptorCollection' , 'StoreGateSvc+InputRoI' ),
-                                 ( 'IDCInDetBSErrContainer' , 'StoreGateSvc+SCT_FlaggedCondData_TRIG' ),
-                                 ( 'InDet::SCT_ClusterContainer' , 'StoreGateSvc+SCT_TrigClusters' ),
-                                 ( 'SpacePointContainer' , 'StoreGateSvc+SCT_TrigSpacePoints' ),
-                                 ( 'InDet::PixelClusterContainer' , 'StoreGateSvc+PixelTrigClusters' ),
-                                 ( 'SpacePointContainer' , 'StoreGateSvc+PixelTrigSpacePoints' )]
+        trkInputMakerAlg = EventViewCreatorAlgorithm("IM_TrkEventViewCreator")
+        trkInputMakerAlg.ViewFallThrough = True
+        trkInputMakerAlg.RoITool = ViewCreatorInitialROITool()
+        trkInputMakerAlg.InViewRoIs = "InputRoI" # contract with the consumer
+        trkInputMakerAlg.Views = "TrkView"
+        trkInputMakerAlg.RequireParentView = True
+        trkInputMakerAlg.ViewNodeName = "TrkCountHypoAlgMTNode"
+
+        # prepare algorithms to run in views, first,
+        # inform scheduler that input data is available in parent view (has to be done by hand)
+        idTrigConfig = getInDetTrigConfig('minBias')
+        idAlgs, verifier = makeInDetAlgs(config=idTrigConfig, rois=trkInputMakerAlg.InViewRoIs, viewVerifier='TrkrecoSeqDataVerifier')
+        verifier.DataObjects += [('TrigRoiDescriptorCollection', 'StoreGateSvc+InputRoI'),
+                                 ('IDCInDetBSErrContainer', 'StoreGateSvc+SCT_FlaggedCondData_TRIG'),
+                                 ('InDet::SCT_ClusterContainer', 'StoreGateSvc+SCT_TrigClusters'),
+                                 ('SpacePointContainer', 'StoreGateSvc+SCT_TrigSpacePoints'),
+                                 ('InDet::PixelClusterContainer', 'StoreGateSvc+PixelTrigClusters'),
+                                 ('SpacePointContainer', 'StoreGateSvc+PixelTrigSpacePoints')]
 
         if globalflags.InputFormat.is_bytestream():
-          verifier.DataObjects += [( 'IDCInDetBSErrContainer' , 'StoreGateSvc+PixelByteStreamErrs' ),
-                                   ( 'IDCInDetBSErrContainer' , 'StoreGateSvc+SCT_ByteStreamErrs' )]
+          verifier.DataObjects += [('IDCInDetBSErrContainer', 'StoreGateSvc+PixelByteStreamErrs'),
+                                   ('IDCInDetBSErrContainer', 'StoreGateSvc+SCT_ByteStreamErrs')]
 
 
-        TrkList = idAlgs[-2:] # FTF and Track to xAOD::TrackParticle conversion alg
-        TrackCountHypo=TrackCountHypoAlgMT()
-        TrackCountHypo.trackCountKey=recordable("HLT_TrackCount")
-        TrackCountHypo.tracksKey=recordable("HLT_IDTrack_MinBias_FTF")
+        trkList = idAlgs[-2:] # FTF and Track to xAOD::TrackParticle conversion alg
+        trackCountHypo = TrackCountHypoAlgMT()
+        trackCountHypo.trackCountKey = recordable("HLT_TrackCount")
+        trackCountHypo.tracksKey = recordable("HLT_IDTrack_MinBias_FTF")
 
         from TrigMinBias.TrackCountMonitoringMT import TrackCountMonitoring
-        TrackCountHypo.MonTool = TrackCountMonitoring()
-
-        TrkrecoSeq = parOR("TrkrecoSeq", [verifier]+TrkList)
-        TrkSequence = seqAND("TrkSequence", [TrkInputMakerAlg, TrkrecoSeq])
-        TrkInputMakerAlg.ViewNodeName = TrkrecoSeq.name()
-
-        return MenuSequence( Sequence   = TrkSequence,
-                            Maker       = TrkInputMakerAlg,
-                            Hypo        = TrackCountHypo,
-                            HypoToolGen = TrackCountHypoToolGen )
+        trackCountHypo.MonTool = TrackCountMonitoring()
 
+        trkRecoSeq = parOR("TrkrecoSeq", [verifier]+trkList)
+        trkSequence = seqAND("TrkSequence", [trkInputMakerAlg, trkRecoSeq])
+        trkInputMakerAlg.ViewNodeName = trkRecoSeq.name()
 
+        return MenuSequence(Sequence    = trkSequence,
+                            Maker       = trkInputMakerAlg,
+                            Hypo        = trackCountHypo,
+                            HypoToolGen = TrackCountHypoToolGen)
-- 
GitLab


From 85e4929d32ff7ee86380b7767ab3f7078fafe920 Mon Sep 17 00:00:00 2001
From: Tim Adye <tim.adye@cern.ch>
Date: Fri, 18 Dec 2020 12:52:24 +0000
Subject: [PATCH 151/225] TrigValSteering: improve dry_run logging

---
 .../TrigValTools/python/TrigValSteering/CheckSteps.py           | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/CheckSteps.py b/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/CheckSteps.py
index f65e1d943e70..1ebe02cdf9ac 100644
--- a/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/CheckSteps.py
+++ b/Trigger/TrigValidation/TrigValTools/python/TrigValSteering/CheckSteps.py
@@ -107,7 +107,7 @@ class InputDependentStep(Step):
                 self.report_result()
             return self.result, '# (internal) {} -> failed'.format(self.name)
 
-        if not os.path.isfile(self.input_file):
+        if not dry_run and not os.path.isfile(self.input_file):
             self.log.debug('Skipping %s because %s does not exist',
                            self.name, self.input_file)
             self.result = 0
-- 
GitLab


From 465fdf7ef80f9ae0e7d53a29e3316373c7fb6e6a Mon Sep 17 00:00:00 2001
From: Tim Adye <tim.adye@cern.ch>
Date: Fri, 18 Dec 2020 12:52:47 +0000
Subject: [PATCH 152/225] rename old ART steering files to _old, and new ones
 to replace them. Only 3 tests have new steering, so the rest still need to be
 added

---
 .../share/TIDAdata-run3-larged0-el.dat        |  27 ++++
 .../share/TIDAdata-run3-larged0.dat           |  27 ++++
 .../TIDAdata-run3-offline-larged0-el.dat      |  27 ++++
 .../share/TIDAdata-run3-offline-larged0.dat   |  27 ++++
 .../TrigInDetValidation/CMakeLists.txt        |   2 +-
 .../python/TrigInDetArtSteps.py               | 153 +++++++++---------
 ...NewArtSteps.py => TrigInDetOldArtSteps.py} | 148 +++++++++--------
 .../share/TrigInDetValidation_Base.py         | 104 ++++--------
 ...Base.py => TrigInDetValidation_OldBase.py} |  87 +++++++---
 .../test/test_trigID_all_ttbar_pu40.py        |  20 ++-
 .../test/test_trigID_all_ttbar_pu40_new.py    |  53 ------
 .../test/test_trigID_all_ttbar_pu40_old.py    |   2 +-
 .../test/test_trigID_all_ttbar_pu80.py        | 117 +++-----------
 .../test/test_trigID_all_ttbar_pu80_old.py    | 127 +++++++++++++++
 .../test/test_trigID_all_ttbar_pu80_short.py  | 117 +++-----------
 .../test_trigID_all_ttbar_pu80_short_old.py   | 127 +++++++++++++++
 .../test/test_trigID_all_ttbar_pu80_st.py     | 118 +++-----------
 .../test/test_trigID_all_ttbar_pu80_st_old.py | 128 +++++++++++++++
 .../test/test_trigID_bjet_nopps_pu40.py       |   9 +-
 .../test/test_trigID_bjet_nopps_pu40_old.py   |  45 ++++++
 .../test/test_trigID_bjet_pu40.py             |   9 +-
 .../test/test_trigID_bjet_pu40_old.py         |  40 +++++
 .../test/test_trigID_el_jpsiee_pu40.py        | 112 +++----------
 .../test/test_trigID_el_jpsiee_pu40_old.py    | 125 ++++++++++++++
 .../test/test_trigID_el_singlee_7-80.py       | 118 +++-----------
 .../test_trigID_el_singlee_7-80_larged0.py    | 118 +++-----------
 ...test_trigID_el_singlee_7-80_larged0_old.py | 125 ++++++++++++++
 .../test_trigID_el_singlee_7-80_larged0_pu.py | 118 +++-----------
 ...t_trigID_el_singlee_7-80_larged0_pu_old.py | 125 ++++++++++++++
 .../test/test_trigID_el_singlee_7-80_old.py   | 125 ++++++++++++++
 .../test/test_trigID_el_singlee_7-80_pu40.py  | 118 +++-----------
 .../test_trigID_el_singlee_7-80_pu40_old.py   | 125 ++++++++++++++
 .../test/test_trigID_el_zee_pu40.py           | 118 +++-----------
 .../test/test_trigID_el_zee_pu40_old.py       | 125 ++++++++++++++
 .../test/test_trigID_el_zee_pu40_short.py     | 118 +++-----------
 .../test/test_trigID_el_zee_pu40_short_old.py | 125 ++++++++++++++
 .../test/test_trigID_el_zee_pu40_st.py        | 118 +++-----------
 .../test/test_trigID_el_zee_pu40_st_old.py    | 125 ++++++++++++++
 .../test/test_trigID_fsjet_ml_pu40.py         |  10 +-
 .../test/test_trigID_fsjet_ml_pu40_old.py     |  45 ++++++
 .../test/test_trigID_fsjet_nopps_pu40.py      |  11 +-
 .../test/test_trigID_fsjet_pu40.py            |  11 +-
 .../test/test_trigID_fsjet_pu40_new.py        |  51 ------
 .../test/test_trigID_fsjet_pu40_old.py        |  43 +++++
 .../test/test_trigID_fsjet_pu40_st.py         |  10 +-
 .../test/test_trigID_fsjet_pu40_st_old.py     |  43 +++++
 .../test/test_trigID_minbias.py               |   7 +-
 .../test/test_trigID_minbias_old.py           |  44 +++++
 .../test/test_trigID_mu_bphys.py              | 101 ++----------
 ..._mt-old.py => test_trigID_mu_bphys_old.py} |  37 ++---
 .../test/test_trigID_mu_singlemu_larged0.py   | 111 +++----------
 .../test_trigID_mu_singlemu_larged0_old.py    | 125 ++++++++++++++
 .../test_trigID_mu_singlemu_larged0_pu.py     | 109 +++----------
 .../test_trigID_mu_singlemu_larged0_pu_old.py | 125 ++++++++++++++
 .../test/test_trigID_mu_zmumu_pu40.py         |  16 +-
 .../test/test_trigID_mu_zmumu_pu40_build.py   |  67 ++------
 .../test_trigID_mu_zmumu_pu40_build_old.py    |  70 ++++++++
 .../test/test_trigID_mu_zmumu_pu40_old.py     |  46 ++++++
 .../test/test_trigID_mu_zmumu_pu40_short.py   |  16 +-
 .../test_trigID_mu_zmumu_pu40_short_old.py    |  46 ++++++
 .../test/test_trigID_mu_zmumu_pu40_st.py      |  16 +-
 .../test/test_trigID_mu_zmumu_pu40_st_old.py  |  46 ++++++
 .../test/test_trigID_tau_ztautau_pu46.py      |  79 ++-------
 .../test/test_trigID_tau_ztautau_pu46_new.py  |  45 ------
 .../test/test_trigID_tau_ztautau_pu46_old.py  |  94 +++++++++++
 .../test/test_trigID_tau_ztautau_pu46_st.py   |  79 ++-------
 .../test_trigID_tau_ztautau_pu46_st_old.py    |  94 +++++++++++
 67 files changed, 3094 insertions(+), 1955 deletions(-)
 create mode 100755 Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-larged0-el.dat
 create mode 100755 Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-larged0.dat
 create mode 100755 Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-offline-larged0-el.dat
 create mode 100755 Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-offline-larged0.dat
 rename Trigger/TrigValidation/TrigInDetValidation/python/{TrigInDetNewArtSteps.py => TrigInDetOldArtSteps.py} (70%)
 mode change 100755 => 100644 Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_Base.py
 rename Trigger/TrigValidation/TrigInDetValidation/share/{TrigInDetValidation_NewBase.py => TrigInDetValidation_OldBase.py} (53%)
 mode change 100755 => 100644
 delete mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40_new.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_short_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_st_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_bjet_nopps_pu40_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_bjet_pu40_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_jpsiee_pu40_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_larged0_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_larged0_pu_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_pu40_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_short_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_st_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_ml_pu40_old.py
 delete mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40_new.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40_st_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_minbias_old.py
 rename Trigger/TrigValidation/TrigInDetValidation/test/{test_trigID_mu_zmumu_pu40_mt-old.py => test_trigID_mu_bphys_old.py} (74%)
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_singlemu_larged0_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_singlemu_larged0_pu_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_build_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_short_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_st_old.py
 delete mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_new.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_old.py
 create mode 100755 Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_st_old.py

diff --git a/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-larged0-el.dat b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-larged0-el.dat
new file mode 100755
index 000000000000..c74433b5c089
--- /dev/null
+++ b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-larged0-el.dat
@@ -0,0 +1,27 @@
+// emacs: this is -*- c++ -*-
+
+#define LARGED0_EL
+
+#include "TIDAdata_cuts.dat"
+
+refChain = "Truth";
+//refChain = "Offline";
+//refChain = "Electrons";
+//refChain = "Muons";
+//refChain = "Taus";
+
+
+MinVertices = 0;
+
+
+#include "TIDAdata-chains-run3.dat"
+
+
+InitialiseFirstEvent = 1;
+
+outputFile = "data-output.root";
+DataFiles = { "TrkNtuple-0000.root"};
+//DataSets = {"./"}
+
+
+#include "TIDAbeam.dat"
diff --git a/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-larged0.dat b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-larged0.dat
new file mode 100755
index 000000000000..73a3c6bf8fa1
--- /dev/null
+++ b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-larged0.dat
@@ -0,0 +1,27 @@
+// emacs: this is -*- c++ -*-
+
+#define LARGED0
+
+#include "TIDAdata_cuts.dat"
+
+refChain = "Truth";
+//refChain = "Offline";
+//refChain = "Electrons";
+//refChain = "Muons";
+//refChain = "Taus";
+
+
+MinVertices = 0;
+
+
+#include "TIDAdata-chains-run3.dat"
+
+
+InitialiseFirstEvent = 1;
+
+outputFile = "data-output.root";
+DataFiles = { "TrkNtuple-0000.root"};
+//DataSets = {"./"}
+
+
+#include "TIDAbeam.dat"
diff --git a/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-offline-larged0-el.dat b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-offline-larged0-el.dat
new file mode 100755
index 000000000000..a9ea6505453b
--- /dev/null
+++ b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-offline-larged0-el.dat
@@ -0,0 +1,27 @@
+// emacs: this is -*- c++ -*-
+
+#define LARGED0_EL
+
+#include "TIDAdata_cuts-offline.dat"
+
+//refChain = "Truth";
+refChain = "Offline";
+//refChain = "Electrons";
+//refChain = "Muons";
+//refChain = "Taus";
+
+
+MinVertices = 0;
+
+
+#include "TIDAdata-chains-run3.dat"
+
+
+InitialiseFirstEvent = 1;
+
+outputFile = "data-output.root";
+DataFiles = { "TrkNtuple-0000.root"};
+//DataSets = {"./"}
+
+
+#include "TIDAbeam.dat"
diff --git a/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-offline-larged0.dat b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-offline-larged0.dat
new file mode 100755
index 000000000000..2669ca8c7e8b
--- /dev/null
+++ b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-run3-offline-larged0.dat
@@ -0,0 +1,27 @@
+// emacs: this is -*- c++ -*-
+
+#define LARGED0
+
+#include "TIDAdata_cuts-offline.dat"
+
+//refChain = "Truth";
+refChain = "Offline";
+//refChain = "Electrons";
+//refChain = "Muons";
+//refChain = "Taus";
+
+
+MinVertices = 0;
+
+
+#include "TIDAdata-chains-run3.dat"
+
+
+InitialiseFirstEvent = 1;
+
+outputFile = "data-output.root";
+DataFiles = { "TrkNtuple-0000.root"};
+//DataSets = {"./"}
+
+
+#include "TIDAbeam.dat"
diff --git a/Trigger/TrigValidation/TrigInDetValidation/CMakeLists.txt b/Trigger/TrigValidation/TrigInDetValidation/CMakeLists.txt
index 0afca4f193c9..5fa71b2c2ec4 100644
--- a/Trigger/TrigValidation/TrigInDetValidation/CMakeLists.txt
+++ b/Trigger/TrigValidation/TrigInDetValidation/CMakeLists.txt
@@ -17,5 +17,5 @@ atlas_install_scripts( scripts/TIDA*.py test/test*.py POST_BUILD_CMD ${ATLAS_FLA
 # Unit test for python test scripts:
 atlas_add_test( TrigValSteeringUT
                 SCRIPT trigvalsteering-unit-tester.py ${CMAKE_CURRENT_SOURCE_DIR}/test
-                PROPERTIES TIMEOUT 300
+                PROPERTIES TIMEOUT 1200
                 POST_EXEC_SCRIPT nopost.sh )
diff --git a/Trigger/TrigValidation/TrigInDetValidation/python/TrigInDetArtSteps.py b/Trigger/TrigValidation/TrigInDetValidation/python/TrigInDetArtSteps.py
index ac024978f592..ab13d80eba21 100644
--- a/Trigger/TrigValidation/TrigInDetValidation/python/TrigInDetArtSteps.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/python/TrigInDetArtSteps.py
@@ -35,6 +35,7 @@ class TrigInDetReco(ExecStep):
         self.slices = []
         self.preexec_trig = ' '
         self.postinclude_trig = postinclude_file
+        self.release = 'latest'
         self.preexec_reco =  ';'.join([
             'from RecExConfig.RecFlags import rec',
             'rec.doForwardDet=False',
@@ -59,8 +60,9 @@ class TrigInDetReco(ExecStep):
         ])
         self.postexec_trig = "from AthenaCommon.AppMgr import ServiceMgr; ServiceMgr.AthenaPoolCnvSvc.MaxFileSizes=['tmp.RDO_TRIG=100000000000']"
 
+
         self.postexec_reco = "from AthenaCommon.AppMgr import ServiceMgr; ServiceMgr.AthenaPoolCnvSvc.MaxFileSizes=['tmp.ESD=100000000000']"
-        self.args = '--outputAODFile=AOD.pool.root --steering="doRDO_TRIG" --asetup "RAWtoESD:Athena,22.0.20" "ESDtoAOD:Athena,22.0.20" '
+        self.args = '--outputAODFile=AOD.pool.root --steering="doRDO_TRIG"'
 
 
     def configure(self, test):
@@ -100,6 +102,25 @@ class TrigInDetReco(ExecStep):
         chains += ']'
         self.preexec_trig = 'doEmptyMenu=True;'+flags+'selectChains='+chains
 
+        if (self.release == 'current'):
+            print( "Using current release for offline Reco steps  " )
+        else:
+            # get the current atlas base release, and the previous base release
+            import os
+            DVERSION=os.getenv('Athena_VERSION')
+            if (self.release == 'latest'):
+                if ( DVERSION is None ) :
+                    AVERSION = "22.0.20"
+                else:
+                    BASE=DVERSION[:5]
+                    SUB=int(DVERSION[5:])
+                    SUB -= 1
+                    AVERSION=BASE+str(SUB)
+            else:
+                AVERSION = self.release
+            self.args += ' --asetup "RAWtoESD:Athena,'+AVERSION+'" "ESDtoAOD:Athena,'+AVERSION+'" '
+            print( "remapping athena base release version for offline Reco steps: ", DVERSION, " -> ", AVERSION )
+
 
         self.args += ' --preExec "RDOtoRDOTrigger:{:s};" "all:{:s};" "RAWtoESD:{:s};" "ESDtoAOD:{:s};"'.format(
             self.preexec_trig, self.preexec_all, self.preexec_reco, self.preexec_aod)
@@ -126,31 +147,52 @@ class TrigInDetAna(AthenaCheckerStep):
 # Additional post-processing steps
 ##################################################
 
-class TrigInDetdictStep(Step):
+class TrigInDetRdictStep(Step):
     '''
     Execute TIDArdict for TrkNtuple files.
     '''
-    def __init__(self, name='TrigInDetdict', reference='Truth' ):
-        super(TrigInDetdictStep, self).__init__(name)
-        self.args=' '
+    def __init__(self, name='TrigInDetdict', args=None, testbin='Test_bin.dat'):
+        super(TrigInDetRdictStep, self).__init__(name)
+        self.args=args + "  -b " + testbin + " "
         self.auto_report_result = True
         self.required = True
-        self.reference = reference
         self.executable = 'TIDArdict'
 
     def configure(self, test):
-        os.system( 'get_files -data TIDAbeam.dat' )
-        os.system( 'get_files -data Test_bin.dat' )
-        os.system( 'get_files -data TIDAdata-chains-run3.dat' )
-        os.system( 'get_files -data TIDAhisto-panel.dat' )
-        os.system( 'get_files -data TIDAdata-run3.dat' )
-        os.system( 'get_files -data TIDAdata_cuts.dat' )
-        os.system( 'get_files -data TIDAdata-run3-offline.dat' )
-        os.system( 'get_files -data TIDAdata_cuts-offline.dat' )
-        os.system( 'get_files -jo   TIDAml_extensions.py' ) 
-        super(TrigInDetdictStep, self).configure(test)
-
-
+        os.system( 'get_files -data TIDAbeam.dat &> /dev/null' )
+        os.system( 'get_files -data Test_bin.dat &> /dev/null' )
+        os.system( 'get_files -data Test_bin_larged0.dat &> /dev/null' )
+        os.system( 'get_files -data TIDAdata-chains-run3.dat &> /dev/null' )
+        os.system( 'get_files -data TIDAhisto-panel.dat &> /dev/null' )
+        os.system( 'get_files -data TIDAhisto-panel-vtx.dat &> /dev/null' )
+        os.system( 'get_files -data TIDAhistos-vtx.dat &> /dev/null' )
+        os.system( 'get_files -data TIDAdata-run3.dat &> /dev/null' )
+        os.system( 'get_files -data TIDAdata-run3-larged0.dat &> /dev/null' )
+        os.system( 'get_files -data TIDAdata-run3-larged0-el.dat &> /dev/null' )
+        os.system( 'get_files -data TIDAdata_cuts.dat &> /dev/null' )
+        os.system( 'get_files -data TIDAdata-run3-offline.dat &> /dev/null' )
+        os.system( 'get_files -data TIDAdata-run3-offline-larged0.dat &> /dev/null' )
+        os.system( 'get_files -data TIDAdata-run3-offline-larged0-el.dat &> /dev/null' )
+        os.system( 'get_files -data TIDAdata-run3-offline-vtx.dat &> /dev/null' )
+        os.system( 'get_files -data TIDAdata_cuts-offline.dat &> /dev/null' )
+        os.system( 'get_files -jo   TIDAml_extensions.py &> /dev/null' )
+        super(TrigInDetRdictStep, self).configure(test)
+
+
+def json_chains( slice ) : 
+    json_file     = 'TrigInDetValidation/comparitor.json'
+    json_fullpath = FindFile(json_file, os.environ['DATAPATH'].split(os.pathsep), os.R_OK)
+
+    if not json_fullpath:
+        print('Failed to determine full path for input JSON %s', json_file)
+        return None
+        
+    with open(json_fullpath) as f:
+        data = json.load(f)
+       
+    chainmap = data[slice]
+
+    return chainmap['chains']
 
 
 
@@ -158,76 +200,25 @@ class TrigInDetCompStep(RefComparisonStep):
     '''
     Execute TIDAcomparitor for data.root files.
     '''
-    def __init__( self, name='TrigInDetComp', level='', slice='', input_file='data-hists.root', type='truth', lowpt=False ):
+    def __init__( self, name='TrigInDetComp', slice=None, args=None, file=None, reference=None ):
         super(TrigInDetCompStep, self).__init__(name)
-
-        self.input_file = input_file
-        # self.output_dir = 'HLT-plots'
-        self.output_dir = ''
-
-        if level == '' : 
-            raise Exception( 'no level specified' )
-
-        if slice == '' : 
-            raise Exception( 'no slice specified' )
-
-        self.level  = level
-        self.slice  = slice
-        self.lowpt  = lowpt
-        self.type   = type
-        self.chains = ' '
-        self.args   = ' --oldrms -c TIDAhisto-panel.dat '
-        self.test   = ' '
+        if reference is None :
+            self.reference  = file # do we need this any more ??? 
+            self.args  = args + " " + file + "  " + file + " --noref --oldrms "
+        else:
+            self.reference = reference
+            self.args  = args + " " + file + "  " + reference + " --oldrms "
+        self.slice = slice 
         self.auto_report_result = True
         self.required   = True
+
         self.executable = 'TIDAcomparitor'
     
 
     def configure(self, test):
-
-        json_file     = 'TrigInDetValidation/comparitor.json'
-        json_fullpath = FindFile(json_file, os.environ['DATAPATH'].split(os.pathsep), os.R_OK)
-
-        if not json_fullpath:
-            print('Failed to determine full path for input JSON %s', json_file)
-            return None
-
-        with open(json_fullpath) as f:
-            data = json.load(f)
-
-        self.output_dir = 'HLT'+self.level+'-plots'
-
-        flag = self.level+self.slice
-
-        if (self.lowpt):
-            self.output_dir = self.output_dir+'-lowpt'    
-            flag = flag+'Lowpt'
-            
-        data_object = data[flag]
-
-        self.chains = data_object['chains']
-
-        # what is all this doing ? does it need to be so complicated ?
-
-        if (self.test=='ttbar'):
-            self.output_dir = self.output_dir+"-"+self.slice
-
-        if (self.type == 'offline'):
-            self.output_dir = self.output_dir+'-offline'    
-            self.input_file = 'data-hists-offline.root'
-
-        self.args += self.input_file + ' ' 
-
-        if (self.reference is None):
-            # if no reference found, use input file as reference - athout it doesn't matter - could use --noref
-            self.args += self.input_file + ' ' 
-        else:
-            self.args += self.ref_file + ' ' 
-
-        self.args += self.chains + ' -d ' + self.output_dir
-
-        print( "TIDAComparitor " + self.args ) 
-
+        self.chains = json_chains( self.slice )
+        self.args += " " + self.chains
+        print( "\033[0;32mTIDAcomparitor "+self.args+" \033[0m" )
         super(TrigInDetCompStep, self).configure(test)
 
 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/python/TrigInDetNewArtSteps.py b/Trigger/TrigValidation/TrigInDetValidation/python/TrigInDetOldArtSteps.py
similarity index 70%
rename from Trigger/TrigValidation/TrigInDetValidation/python/TrigInDetNewArtSteps.py
rename to Trigger/TrigValidation/TrigInDetValidation/python/TrigInDetOldArtSteps.py
index 9be14b5c66a8..ac024978f592 100644
--- a/Trigger/TrigValidation/TrigInDetValidation/python/TrigInDetNewArtSteps.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/python/TrigInDetOldArtSteps.py
@@ -35,7 +35,6 @@ class TrigInDetReco(ExecStep):
         self.slices = []
         self.preexec_trig = ' '
         self.postinclude_trig = postinclude_file
-        self.release = 'latest'
         self.preexec_reco =  ';'.join([
             'from RecExConfig.RecFlags import rec',
             'rec.doForwardDet=False',
@@ -60,9 +59,8 @@ class TrigInDetReco(ExecStep):
         ])
         self.postexec_trig = "from AthenaCommon.AppMgr import ServiceMgr; ServiceMgr.AthenaPoolCnvSvc.MaxFileSizes=['tmp.RDO_TRIG=100000000000']"
 
-
         self.postexec_reco = "from AthenaCommon.AppMgr import ServiceMgr; ServiceMgr.AthenaPoolCnvSvc.MaxFileSizes=['tmp.ESD=100000000000']"
-        self.args = '--outputAODFile=AOD.pool.root --steering="doRDO_TRIG"'
+        self.args = '--outputAODFile=AOD.pool.root --steering="doRDO_TRIG" --asetup "RAWtoESD:Athena,22.0.20" "ESDtoAOD:Athena,22.0.20" '
 
 
     def configure(self, test):
@@ -102,25 +100,6 @@ class TrigInDetReco(ExecStep):
         chains += ']'
         self.preexec_trig = 'doEmptyMenu=True;'+flags+'selectChains='+chains
 
-        if (self.release == 'current'):
-            print( "Using current release for offline Reco steps  " )
-        else:
-            # get the current atlas base release, and the previous base release
-            import os
-            DVERSION=os.getenv('Athena_VERSION')
-            if (self.release == 'latest'):
-                if ( DVERSION is None ) :
-                    AVERSION = "22.0.20"
-                else:
-                    BASE=DVERSION[:5]
-                    SUB=int(DVERSION[5:])
-                    SUB -= 1
-                    AVERSION=BASE+str(SUB)
-            else:
-                AVERSION = self.release
-            self.args += ' --asetup "RAWtoESD:Athena,'+AVERSION+'" "ESDtoAOD:Athena,'+AVERSION+'" '
-            print( "remapping athena base release version for offline Reco steps: ", DVERSION, " -> ", AVERSION )
-
 
         self.args += ' --preExec "RDOtoRDOTrigger:{:s};" "all:{:s};" "RAWtoESD:{:s};" "ESDtoAOD:{:s};"'.format(
             self.preexec_trig, self.preexec_all, self.preexec_reco, self.preexec_aod)
@@ -147,47 +126,31 @@ class TrigInDetAna(AthenaCheckerStep):
 # Additional post-processing steps
 ##################################################
 
-class TrigInDetRdictStep(Step):
+class TrigInDetdictStep(Step):
     '''
     Execute TIDArdict for TrkNtuple files.
     '''
-    def __init__(self, name='TrigInDetdict', args=None ):
-        super(TrigInDetRdictStep, self).__init__(name)
-        self.args=args + "  -b Test_bin.dat "
+    def __init__(self, name='TrigInDetdict', reference='Truth' ):
+        super(TrigInDetdictStep, self).__init__(name)
+        self.args=' '
         self.auto_report_result = True
         self.required = True
+        self.reference = reference
         self.executable = 'TIDArdict'
 
     def configure(self, test):
-        os.system( 'get_files -data TIDAbeam.dat &> /dev/null' )
-        os.system( 'get_files -data Test_bin.dat &> /dev/null' )
-        os.system( 'get_files -data TIDAdata-chains-run3.dat &> /dev/null' )
-        os.system( 'get_files -data TIDAhisto-panel.dat &> /dev/null' )
-        os.system( 'get_files -data TIDAhisto-panel-vtx.dat &> /dev/null' )
-        os.system( 'get_files -data TIDAhistos-vtx.dat &> /dev/null' )
-        os.system( 'get_files -data TIDAdata-run3.dat &> /dev/null' )
-        os.system( 'get_files -data TIDAdata_cuts.dat &> /dev/null' )
-        os.system( 'get_files -data TIDAdata-run3-offline.dat &> /dev/null' )
-        os.system( 'get_files -data TIDAdata-run3-offline-vtx.dat &> /dev/null' )
-        os.system( 'get_files -data TIDAdata_cuts-offline.dat &> /dev/null' )
-        os.system( 'get_files -jo   TIDAml_extensions.py &> /dev/null' )
-        super(TrigInDetRdictStep, self).configure(test)
-
-
-def json_chains( slice ) : 
-    json_file     = 'TrigInDetValidation/comparitor.json'
-    json_fullpath = FindFile(json_file, os.environ['DATAPATH'].split(os.pathsep), os.R_OK)
-
-    if not json_fullpath:
-        print('Failed to determine full path for input JSON %s', json_file)
-        return None
-        
-    with open(json_fullpath) as f:
-        data = json.load(f)
-       
-    chainmap = data[slice]
-
-    return chainmap['chains']
+        os.system( 'get_files -data TIDAbeam.dat' )
+        os.system( 'get_files -data Test_bin.dat' )
+        os.system( 'get_files -data TIDAdata-chains-run3.dat' )
+        os.system( 'get_files -data TIDAhisto-panel.dat' )
+        os.system( 'get_files -data TIDAdata-run3.dat' )
+        os.system( 'get_files -data TIDAdata_cuts.dat' )
+        os.system( 'get_files -data TIDAdata-run3-offline.dat' )
+        os.system( 'get_files -data TIDAdata_cuts-offline.dat' )
+        os.system( 'get_files -jo   TIDAml_extensions.py' ) 
+        super(TrigInDetdictStep, self).configure(test)
+
+
 
 
 
@@ -195,25 +158,76 @@ class TrigInDetCompStep(RefComparisonStep):
     '''
     Execute TIDAcomparitor for data.root files.
     '''
-    def __init__( self, name='TrigInDetComp', slice=None, args=None, file=None, reference=None ):
+    def __init__( self, name='TrigInDetComp', level='', slice='', input_file='data-hists.root', type='truth', lowpt=False ):
         super(TrigInDetCompStep, self).__init__(name)
-        if reference is None :
-            self.reference  = file # do we need this any more ??? 
-            self.args  = args + " " + file + "  " + file + " --noref --oldrms "
-        else:
-            self.reference = reference
-            self.args  = args + " " + file + "  " + reference + " --oldrms "
-        self.slice = slice 
+
+        self.input_file = input_file
+        # self.output_dir = 'HLT-plots'
+        self.output_dir = ''
+
+        if level == '' : 
+            raise Exception( 'no level specified' )
+
+        if slice == '' : 
+            raise Exception( 'no slice specified' )
+
+        self.level  = level
+        self.slice  = slice
+        self.lowpt  = lowpt
+        self.type   = type
+        self.chains = ' '
+        self.args   = ' --oldrms -c TIDAhisto-panel.dat '
+        self.test   = ' '
         self.auto_report_result = True
         self.required   = True
-
         self.executable = 'TIDAcomparitor'
     
 
     def configure(self, test):
-        self.chains = json_chains( self.slice )
-        self.args += " " + self.chains
-        print( "\033[0;32mTIDAcomparitor "+self.args+" \033[0m" )
+
+        json_file     = 'TrigInDetValidation/comparitor.json'
+        json_fullpath = FindFile(json_file, os.environ['DATAPATH'].split(os.pathsep), os.R_OK)
+
+        if not json_fullpath:
+            print('Failed to determine full path for input JSON %s', json_file)
+            return None
+
+        with open(json_fullpath) as f:
+            data = json.load(f)
+
+        self.output_dir = 'HLT'+self.level+'-plots'
+
+        flag = self.level+self.slice
+
+        if (self.lowpt):
+            self.output_dir = self.output_dir+'-lowpt'    
+            flag = flag+'Lowpt'
+            
+        data_object = data[flag]
+
+        self.chains = data_object['chains']
+
+        # what is all this doing ? does it need to be so complicated ?
+
+        if (self.test=='ttbar'):
+            self.output_dir = self.output_dir+"-"+self.slice
+
+        if (self.type == 'offline'):
+            self.output_dir = self.output_dir+'-offline'    
+            self.input_file = 'data-hists-offline.root'
+
+        self.args += self.input_file + ' ' 
+
+        if (self.reference is None):
+            # if no reference found, use input file as reference - athout it doesn't matter - could use --noref
+            self.args += self.input_file + ' ' 
+        else:
+            self.args += self.ref_file + ' ' 
+
+        self.args += self.chains + ' -d ' + self.output_dir
+
+        print( "TIDAComparitor " + self.args ) 
+
         super(TrigInDetCompStep, self).configure(test)
 
 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_Base.py b/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_Base.py
old mode 100755
new mode 100644
index 77bc6865110a..41efe587db3d
--- a/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_Base.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_Base.py
@@ -1,9 +1,6 @@
 ###  #!/usr/bin/env python
 
-
-
 # Slices = ['fsjet']
-# RunEF  = False
 # Events = 10
 # Threads = 1
 # Slots = 1
@@ -13,13 +10,13 @@
 import re
 
 from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetRdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
 
 
 import sys,getopt
 
 try:
-    opts, args = getopt.getopt(sys.argv[1:],"lcxpn:",["local","config"])
+    opts, args = getopt.getopt(sys.argv[1:],"lcxptn:",["local","config"])
 except getopt.GetoptError:
     print("Usage:  ")
     print("-l(--local)    run locally with input file from art eos grid-input")
@@ -27,24 +24,20 @@ except getopt.GetoptError:
     print("-p             run post-processing, even if -x is set")
     print("-n  N          run only on N events per job")
     print("-c(--config)   run with config_only and print to a pkl file")
+    print("-t             test steering, dry run for all steps")
     print("")
-
+    sys.exit(1)
 
 Events_local  = 0
 local         = False
 exclude       = False
 postproc      = False
 testconfig    = False
-lowpt_local   = []
-
+dry_run       = False
 
-try: GridFiles
-except NameError: GridFiles=False
 
-if GridFiles==True :
-    use_gridfiles = True
-else:
-    use_gridfiles = False
+if "Art_type"  not in locals(): Art_type = 'grid'
+if "GridFiles" not in locals(): GridFiles=False
 
 for opt,arg in opts:
     if opt in ("-l", "--local"):
@@ -57,6 +50,8 @@ for opt,arg in opts:
         Events_local=arg
     if opt in ("-c", "--config"):
         testconfig = True
+    if opt=="-t":
+        dry_run=True
 
 
 if 'postinclude_file' in dir() :
@@ -70,19 +65,14 @@ rdo2aod.slices            = Slices
 rdo2aod.threads           = Threads
 rdo2aod.concurrent_events = Slots 
 rdo2aod.config_only       = testconfig
-
-if "Lowpt" in locals() : 
-    if isinstance( Lowpt, list ) : 
-        lowpt_local = Lowpt
-    else : 
-        lowpt_local = [ Lowpt ]
-else : 
-    lowpt_local = [ False ]
+if 'Release' in dir():
+    rdo2aod.release           = Release
 
 
 if "Args" not in locals() : 
     Args = " "
 
+
 # allow command line to override programed number of events to process
 
 if Events_local != 0 : 
@@ -95,7 +85,7 @@ rdo2aod.perfmon = False
 rdo2aod.timeout = 18*3600
 rdo2aod.input   = Input    # defined in TrigValTools/share/TrigValInputs.json  
 
-if use_gridfiles: 
+if GridFiles:
     if local:
 #   rdo2aod.input = 'Single_el_larged0'    # defined in TrigValTools/share/TrigValInputs.json  
        rdo2aod.input = Input   # should match definition in TrigValTools/share/TrigValInputs.json  
@@ -108,7 +98,9 @@ if use_gridfiles:
 # Run athena analysis to produce TrkNtuple
 
 test = Test.Test()
-test.art_type = 'grid'
+test.art_type = Art_type
+if dry_run:
+    test.dry_run = True
 if (not exclude):
     test.exec_steps = [rdo2aod]
     test.exec_steps.append(TrigInDetAna())
@@ -116,62 +108,20 @@ if (not exclude):
 
 # Run TIDArdict
 
-# first make sure that we have a proper list ..
-if isinstance( TrackReference, str ):
-    TrackReference = [ TrackReference ]
-
-for ref in TrackReference : 
-
-    hist_file = 'data-hists.root'
-    ext       = ''
-
-    if   ( ref == 'Truth' ) :
-        args = 'TIDAdata-run3.dat  -b Test_bin.dat -o ' + hist_file + Args
-    elif ( ref == 'Offline' ) :
-        # if more than one reefrence ...
-        if len(TrackReference)>1 : 
-            hist_file = 'data-hists-offline.root'
-            ext       = 'offline'
-        args = 'TIDAdata-run3-offline.dat -r Offline  -b Test_bin.dat -o ' + hist_file
-    else :
-        # here actually we should allow functionality 
-        # to use different pdgid truth or offline as
-        # a reference:
-        # presumably we run offline muons etc as well 
-        # now in the transform
-        raise Exception( 'unknown reference: ', ref )
-
-    if ((not exclude) or postproc ):
-        rdict = TrigInDetdictStep( name=ref, reference=ref )
-        rdict.args = args
-        print( "\033[0;32m TIDArdict "+args+" \033[0m" )
 
+if ((not exclude) or postproc ):
+    for job in Jobs :
+        if len(job) >= 3:
+            rdict = TrigInDetRdictStep( name=job[0], args=job[1], testbin=job[2] )
+        else:
+            rdict = TrigInDetRdictStep( name=job[0], args=job[1] )
+        print( "\n\033[0;32m TIDArdict "+job[1]+" \033[0m" )
         test.check_steps.append(rdict)
        
-    # Now the comparitor steps
-    # here, the compararitor must know the name of the root file to process
-    # we set it in the comparitor job, using the "offline" extension
-    # this isn't ideal, since we set the hist file in this code also 
-    # so really we should pass it in consistently, and the options 
-    # for the directory names should be unrelated 
-    
-    for slice in Slices :
-        for _lowpt in lowpt_local :
-            
-            stagetag = slice+ext
-            if _lowpt :
-                stagetag += "-lowpt"
-                
-            print( "stagetag "+stagetag )
-                
-            comp1=TrigInDetCompStep( 'Comp_L2'+stagetag, 'L2', slice, type=ext, lowpt=_lowpt )
-            test.check_steps.append(comp1)
-            
-            if ( RunEF ) : 
-                comp2=TrigInDetCompStep( 'Comp_EF'+stagetag, 'EF', slice, type=ext, lowpt=_lowpt )
-                test.check_steps.append(comp2)
-
-
+        
+for _slice in Comp :
+    compstep = TrigInDetCompStep( name=_slice[0], slice=_slice[1], file=_slice[2], args=_slice[3] ) 
+    test.check_steps.append(compstep)
 
 # CPU cost steps
 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_NewBase.py b/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_OldBase.py
old mode 100755
new mode 100644
similarity index 53%
rename from Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_NewBase.py
rename to Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_OldBase.py
index d2de1c9dfbb7..4353425c43af
--- a/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_NewBase.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/share/TrigInDetValidation_OldBase.py
@@ -1,5 +1,7 @@
 ###  #!/usr/bin/env python
 
+
+
 # Slices = ['fsjet']
 # RunEF  = False
 # Events = 10
@@ -10,14 +12,8 @@
 
 import re
 
-from TrigValTools.TrigValSteering import Test
-from TrigValTools.TrigValSteering import CheckSteps
-
-from TrigInDetValidation.TrigInDetNewArtSteps import TrigInDetReco
-from TrigInDetValidation.TrigInDetNewArtSteps import TrigInDetAna
-from TrigInDetValidation.TrigInDetNewArtSteps import TrigInDetRdictStep
-from TrigInDetValidation.TrigInDetNewArtSteps import TrigInDetCompStep
-from TrigInDetValidation.TrigInDetNewArtSteps import TrigInDetCpuCostStep
+from TrigValTools.TrigValSteering import Test, CheckSteps
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
 
 
 import sys,getopt
@@ -32,13 +28,14 @@ except getopt.GetoptError:
     print("-n  N          run only on N events per job")
     print("-c(--config)   run with config_only and print to a pkl file")
     print("")
-    sys.exit(1)
+
 
 Events_local  = 0
 local         = False
 exclude       = False
 postproc      = False
 testconfig    = False
+lowpt_local   = []
 
 
 try: GridFiles
@@ -73,14 +70,19 @@ rdo2aod.slices            = Slices
 rdo2aod.threads           = Threads
 rdo2aod.concurrent_events = Slots 
 rdo2aod.config_only       = testconfig
-if 'Release' in dir():
-    rdo2aod.release           = Release
+
+if "Lowpt" in locals() : 
+    if isinstance( Lowpt, list ) : 
+        lowpt_local = Lowpt
+    else : 
+        lowpt_local = [ Lowpt ]
+else : 
+    lowpt_local = [ False ]
 
 
 if "Args" not in locals() : 
     Args = " "
 
-
 # allow command line to override programed number of events to process
 
 if Events_local != 0 : 
@@ -114,17 +116,62 @@ if (not exclude):
 
 # Run TIDArdict
 
+# first make sure that we have a proper list ..
+if isinstance( TrackReference, str ):
+    TrackReference = [ TrackReference ]
+
+for ref in TrackReference : 
+
+    hist_file = 'data-hists.root'
+    ext       = ''
+
+    if   ( ref == 'Truth' ) :
+        args = 'TIDAdata-run3.dat  -b Test_bin.dat -o ' + hist_file + Args
+    elif ( ref == 'Offline' ) :
+        # if more than one reefrence ...
+        if len(TrackReference)>1 : 
+            hist_file = 'data-hists-offline.root'
+            ext       = 'offline'
+        args = 'TIDAdata-run3-offline.dat -r Offline  -b Test_bin.dat -o ' + hist_file
+    else :
+        # here actually we should allow functionality 
+        # to use different pdgid truth or offline as
+        # a reference:
+        # presumably we run offline muons etc as well 
+        # now in the transform
+        raise Exception( 'unknown reference: ', ref )
+
+    if ((not exclude) or postproc ):
+        rdict = TrigInDetdictStep( name=ref, reference=ref )
+        rdict.args = args
+        print( "\033[0;32m TIDArdict "+args+" \033[0m" )
 
-if ((not exclude) or postproc ):
-    for job in Jobs : 
-        rdict = TrigInDetRdictStep( name=job[0], args=job[1] )
-        print( "\n\033[0;32m TIDArdict "+job[1]+" \033[0m" )
         test.check_steps.append(rdict)
        
-        
-for _slice in Comp :
-    compstep = TrigInDetCompStep( name=_slice[0], slice=_slice[1], file=_slice[2], args=_slice[3] ) 
-    test.check_steps.append(compstep)
+    # Now the comparitor steps
+    # here, the compararitor must know the name of the root file to process
+    # we set it in the comparitor job, using the "offline" extension
+    # this isn't ideal, since we set the hist file in this code also 
+    # so really we should pass it in consistently, and the options 
+    # for the directory names should be unrelated 
+    
+    for slice in Slices :
+        for _lowpt in lowpt_local :
+            
+            stagetag = slice+ext
+            if _lowpt :
+                stagetag += "-lowpt"
+                
+            print( "stagetag "+stagetag )
+                
+            comp1=TrigInDetCompStep( 'Comp_L2'+stagetag, 'L2', slice, type=ext, lowpt=_lowpt )
+            test.check_steps.append(comp1)
+            
+            if ( RunEF ) : 
+                comp2=TrigInDetCompStep( 'Comp_EF'+stagetag, 'EF', slice, type=ext, lowpt=_lowpt )
+                test.check_steps.append(comp2)
+
+
 
 # CPU cost steps
 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40.py
index a426a5d76046..54421eb0d9fc 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40.py
@@ -25,16 +25,28 @@
 # art-output: *.dat 
 
 
-Slices  = ['muon','electron','tau','bjet']
-RunEF   = False
-Events  = 4000 
+Slices  = ['muon','electron','tau','bjet','fsjet']
+Events  = 4000
 Threads = 8 
 Slots   = 8
 Input   = 'ttbar_ID'    # defined in TrigValTools/share/TrigValInputs.json  
 
-TrackReference = [ 'Offline' ]
+Jobs = [ ( "Offline",     " TIDAdata-run3-offline.dat      -r Offline -o data-hists-offline.root" ),
+         ( "OfflineVtx",  " TIDAdata-run3-offline-vtx.dat  -r Offline -o data-hists-offline-vtx.root" ) ]
 
+Comp = [ ( "L2muon",       "L2muon",      "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-muon " ),
+         ( "L2electron",   "L2electron",  "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-electron " ),
+         ( "L2tau",        "L2tau",       "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-tau " ),
+         ( "L2bjet",       "L2bjet",      "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-bjet " ),   
+         ( "FSjetoffline", "L2fsjet",     "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-FS " ),
+         ( "FSvtx",        "L2fsjetvtx",  "data-hists-offline-vtx.root",  " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtx     --ncols 3" ),
+         ( "FSvtxall",     "L2fsjetvtx",  "data-hists-offline.root",      " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtxall  --ncols 3" ), 
 
+         ( "EFmuon",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-muon " ),
+         ( "EFelectron",   "EFelectron",  "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-electron " ),
+         ( "EFtau",        "EFtau",       "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-tau " ),
+         ( "EFbjet",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-bjet " ) ]
+   
 from AthenaCommon.Include import include 
 include("TrigInDetValidation/TrigInDetValidation_Base.py")
 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40_new.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40_new.py
deleted file mode 100755
index a510619a4395..000000000000
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40_new.py
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/env python
-
-# art-description: art job for all_ttbar_pu40_new
-# art-type: grid
-# art-include: master/Athena
-# art-athena-mt: 8
-# art-memory: 4096
-# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
-# art-output: *.txt
-# art-output: *.log
-# art-output: log.*
-# art-output: *.out
-# art-output: *.err
-# art-output: *.log.tar.gz
-# art-output: *.new
-# art-output: *.json
-# art-output: *.root
-# art-output: *.check*
-# art-output: HLT*
-# art-output: times*
-# art-output: cost-perCall
-# art-output: cost-perEvent
-# art-output: cost-perCall-chain
-# art-output: cost-perEvent-chain
-# art-output: *.dat 
-
-
-Slices  = ['muon','electron','tau','bjet','fsjet']
-RunEF   = False
-Events  = 4000
-Threads = 8 
-Slots   = 8
-Input   = 'ttbar_ID'    # defined in TrigValTools/share/TrigValInputs.json  
-
-Jobs = [ ( "Offline",     " TIDAdata-run3-offline.dat      -o data-hists-offline.root" ),
-         ( "OfflineVtx",  " TIDAdata-run3-offline-vtx.dat  -o data-hists-offline-vtx.root" ) ]
-
-Comp = [ ( "L2muon",       "L2muon",      "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-muon " ),
-         ( "L2electron",   "L2electron",  "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-electron " ),
-         ( "L2tau",        "L2tau",       "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-tau " ),
-         ( "L2bjet",       "L2bjet",      "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-bjet " ),   
-         ( "FSjetoffline", "L2fsjet",     "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-FS " ),
-         ( "FSvtx",        "L2fsjetvtx",  "data-hists-offline-vtx.root",  " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtx     --ncols 3" ),
-         ( "FSvtxall",     "L2fsjetvtx",  "data-hists-offline.root",      " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtxall  --ncols 3" ), 
-
-         ( "EFmuon",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-muon " ),
-         ( "EFelectron",   "EFelectron",  "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-electron " ),
-         ( "EFtau",        "EFtau",       "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-tau " ),
-         ( "EFbjet",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-bjet " ) ]
-   
-from AthenaCommon.Include import include 
-include("TrigInDetValidation/TrigInDetValidation_NewBase.py")
-
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40_old.py
index def488af358b..c35d261d368d 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40_old.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40_old.py
@@ -27,7 +27,7 @@
 
 
 from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
 
 
 import sys,getopt
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80.py
index bc4dd8c7eaa0..8a755103d53d 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80.py
@@ -3,7 +3,6 @@
 # art-description: art job for all_ttbar_pu80
 # art-type: grid
 # art-include: master/Athena
-# art-input-nfiles: 3
 # art-athena-mt: 8
 # art-memory: 4096
 # art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
@@ -26,102 +25,28 @@
 # art-output: *.dat 
 
 
-from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+Slices  = ['muon','electron','tau','bjet','fsjet']
+Events  = 4000
+Threads = 8 
+Slots   = 8
+Input   = 'ttbar_pu80'    # defined in TrigValTools/share/TrigValInputs.json  
 
+Jobs = [ ( "Offline",     " TIDAdata-run3-offline.dat      -r Offline -o data-hists-offline.root" ),
+         ( "OfflineVtx",  " TIDAdata-run3-offline-vtx.dat  -r Offline -o data-hists-offline-vtx.root" ) ]
 
-import sys,getopt
+Comp = [ ( "L2muon",       "L2muon",      "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-muon " ),
+         ( "L2electron",   "L2electron",  "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-electron " ),
+         ( "L2tau",        "L2tau",       "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-tau " ),
+         ( "L2bjet",       "L2bjet",      "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-bjet " ),   
+         ( "FSjetoffline", "L2fsjet",     "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-FS " ),
+         ( "FSvtx",        "L2fsjetvtx",  "data-hists-offline-vtx.root",  " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtx     --ncols 3" ),
+         ( "FSvtxall",     "L2fsjetvtx",  "data-hists-offline.root",      " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtxall  --ncols 3" ), 
 
-try:
-    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
-except getopt.GetoptError:
-    print("Usage:  ")
-    print("-l(--local)    run locally with input file from art eos grid-input")
-    print("-x             don't run athena or post post-processing, only plotting")
-    print("-p             run post-processing, even if -x is set")
+         ( "EFmuon",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-muon " ),
+         ( "EFelectron",   "EFelectron",  "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-electron " ),
+         ( "EFtau",        "EFtau",       "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-tau " ),
+         ( "EFbjet",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-bjet " ) ]
+   
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
 
-
-local=False
-exclude=False
-postproc=False
-for opt,arg in opts:
-    if opt in ("-l", "--local"):
-        local=True
-    if opt=="-x":
-        exclude=True
-    if opt=="-p":
-        postproc=True
-
-
-rdo2aod = TrigInDetReco()
-rdo2aod.slices = ['muon','electron','tau','bjet']
-rdo2aod.max_events = 4000 
-rdo2aod.threads = 8 
-rdo2aod.concurrent_events = 8
-rdo2aod.perfmon = False
-rdo2aod.timeout = 18*3600
-rdo2aod.input = 'ttbar_pu80'   # defined in TrigValTools/share/TrigValInputs.json  
-
-
-test = Test.Test()
-test.art_type = 'grid'
-if (not exclude):
-    test.exec_steps = [rdo2aod]
-    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
-    test.check_steps = CheckSteps.default_check_steps(test)
-
-# Run Tidardict
-if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep()
-    rdict.args='TIDAdata-run3-offline.dat -r Offline -f data-hists.root -b Test_bin.dat '
-    test.check_steps.append(rdict)
-
- 
-# Now the comparitor steps
-comp=TrigInDetCompStep('Comp_L2muon','L2','muon')
-comp.test='ttbar'
-test.check_steps.append(comp)
- 
- 
-comp2=TrigInDetCompStep('Comp_EFmuon','EF','muon')
-comp2.test='ttbar'
-test.check_steps.append(comp2)
-
-
-comp3=TrigInDetCompStep('Comp_L2bjet','L2','bjet')
-comp3.test='ttbar'
-test.check_steps.append(comp3)
-
-comp4=TrigInDetCompStep('Comp_EFbjet','EF','bjet')
-comp4.test='ttbar'
-test.check_steps.append(comp4)
-
-comp5=TrigInDetCompStep('Comp_L2tau','L2','tau')
-comp5.test='ttbar'
-test.check_steps.append(comp5)
-
-comp6=TrigInDetCompStep('Comp_EFtau','EF','tau')
-comp6.test='ttbar'
-test.check_steps.append(comp6)
-
-comp7=TrigInDetCompStep('Comp_L2ele','L2','electron')
-comp7.test='ttbar'
-test.check_steps.append(comp7)
-
-comp8=TrigInDetCompStep('Comp_EFele','EF','electron')
-comp8.test='ttbar'
-test.check_steps.append(comp8)
-
-comp9=TrigInDetCompStep('Comp_L2FS','L2','FS')
-comp9.test='ttbar'
-test.check_steps.append(comp9)
-
-# CPU cost steps
-cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
-test.check_steps.append(cpucost)
-
-cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
-test.check_steps.append(cpucost2)
-
-import sys
-sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_old.py
new file mode 100755
index 000000000000..63ce3daf22f0
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_old.py
@@ -0,0 +1,127 @@
+#!/usr/bin/env python
+
+# art-description: art job for all_ttbar_pu80
+# art-type: grid
+# art-include: master/Athena
+# art-input-nfiles: 3
+# art-athena-mt: 8
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+from TrigValTools.TrigValSteering import Test, CheckSteps
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+
+
+import sys,getopt
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
+except getopt.GetoptError:
+    print("Usage:  ")
+    print("-l(--local)    run locally with input file from art eos grid-input")
+    print("-x             don't run athena or post post-processing, only plotting")
+    print("-p             run post-processing, even if -x is set")
+
+
+local=False
+exclude=False
+postproc=False
+for opt,arg in opts:
+    if opt in ("-l", "--local"):
+        local=True
+    if opt=="-x":
+        exclude=True
+    if opt=="-p":
+        postproc=True
+
+
+rdo2aod = TrigInDetReco()
+rdo2aod.slices = ['muon','electron','tau','bjet']
+rdo2aod.max_events = 4000 
+rdo2aod.threads = 8 
+rdo2aod.concurrent_events = 8
+rdo2aod.perfmon = False
+rdo2aod.timeout = 18*3600
+rdo2aod.input = 'ttbar_pu80'   # defined in TrigValTools/share/TrigValInputs.json  
+
+
+test = Test.Test()
+test.art_type = 'grid'
+if (not exclude):
+    test.exec_steps = [rdo2aod]
+    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
+    test.check_steps = CheckSteps.default_check_steps(test)
+
+# Run Tidardict
+if ((not exclude) or postproc ):
+    rdict = TrigInDetdictStep()
+    rdict.args='TIDAdata-run3-offline.dat -r Offline -f data-hists.root -b Test_bin.dat '
+    test.check_steps.append(rdict)
+
+ 
+# Now the comparitor steps
+comp=TrigInDetCompStep('Comp_L2muon','L2','muon')
+comp.test='ttbar'
+test.check_steps.append(comp)
+ 
+ 
+comp2=TrigInDetCompStep('Comp_EFmuon','EF','muon')
+comp2.test='ttbar'
+test.check_steps.append(comp2)
+
+
+comp3=TrigInDetCompStep('Comp_L2bjet','L2','bjet')
+comp3.test='ttbar'
+test.check_steps.append(comp3)
+
+comp4=TrigInDetCompStep('Comp_EFbjet','EF','bjet')
+comp4.test='ttbar'
+test.check_steps.append(comp4)
+
+comp5=TrigInDetCompStep('Comp_L2tau','L2','tau')
+comp5.test='ttbar'
+test.check_steps.append(comp5)
+
+comp6=TrigInDetCompStep('Comp_EFtau','EF','tau')
+comp6.test='ttbar'
+test.check_steps.append(comp6)
+
+comp7=TrigInDetCompStep('Comp_L2ele','L2','electron')
+comp7.test='ttbar'
+test.check_steps.append(comp7)
+
+comp8=TrigInDetCompStep('Comp_EFele','EF','electron')
+comp8.test='ttbar'
+test.check_steps.append(comp8)
+
+comp9=TrigInDetCompStep('Comp_L2FS','L2','FS')
+comp9.test='ttbar'
+test.check_steps.append(comp9)
+
+# CPU cost steps
+cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
+test.check_steps.append(cpucost)
+
+cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
+test.check_steps.append(cpucost2)
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_short.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_short.py
index d012c8797220..b1f1181b7bd4 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_short.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_short.py
@@ -3,7 +3,6 @@
 # art-description: art job for all_ttbar_pu80_short
 # art-type: grid
 # art-include: master/Athena
-# art-input-nfiles: 3
 # art-athena-mt: 8
 # art-memory: 4096
 # art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
@@ -26,102 +25,28 @@
 # art-output: *.dat 
 
 
-from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+Slices  = ['muon','electron','tau','bjet','fsjet']
+Events  = 1000
+Threads = 8 
+Slots   = 8
+Input   = 'ttbar_pu80'    # defined in TrigValTools/share/TrigValInputs.json  
 
+Jobs = [ ( "Offline",     " TIDAdata-run3-offline.dat      -r Offline -o data-hists-offline.root" ),
+         ( "OfflineVtx",  " TIDAdata-run3-offline-vtx.dat  -r Offline -o data-hists-offline-vtx.root" ) ]
 
-import sys,getopt
+Comp = [ ( "L2muon",       "L2muon",      "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-muon " ),
+         ( "L2electron",   "L2electron",  "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-electron " ),
+         ( "L2tau",        "L2tau",       "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-tau " ),
+         ( "L2bjet",       "L2bjet",      "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-bjet " ),   
+         ( "FSjetoffline", "L2fsjet",     "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-FS " ),
+         ( "FSvtx",        "L2fsjetvtx",  "data-hists-offline-vtx.root",  " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtx     --ncols 3" ),
+         ( "FSvtxall",     "L2fsjetvtx",  "data-hists-offline.root",      " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtxall  --ncols 3" ), 
 
-try:
-    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
-except getopt.GetoptError:
-    print("Usage:  ")
-    print("-l(--local)    run locally with input file from art eos grid-input")
-    print("-x             don't run athena or post post-processing, only plotting")
-    print("-p             run post-processing, even if -x is set")
+         ( "EFmuon",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-muon " ),
+         ( "EFelectron",   "EFelectron",  "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-electron " ),
+         ( "EFtau",        "EFtau",       "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-tau " ),
+         ( "EFbjet",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-bjet " ) ]
+   
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
 
-
-local=False
-exclude=False
-postproc=False
-for opt,arg in opts:
-    if opt in ("-l", "--local"):
-        local=True
-    if opt=="-x":
-        exclude=True
-    if opt=="-p":
-        postproc=True
-
-
-rdo2aod = TrigInDetReco()
-rdo2aod.slices = ['muon','electron','tau','bjet']
-rdo2aod.max_events = 1000 
-rdo2aod.threads = 8 
-rdo2aod.concurrent_events = 8
-rdo2aod.perfmon = False
-rdo2aod.timeout = 18*3600
-rdo2aod.input = 'ttbar_pu80'   # defined in TrigValTools/share/TrigValInputs.json  
-
-
-test = Test.Test()
-test.art_type = 'grid'
-if (not exclude):
-    test.exec_steps = [rdo2aod]
-    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
-    test.check_steps = CheckSteps.default_check_steps(test)
-
-# Run Tidardict
-if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep()
-    rdict.args='TIDAdata-run3-offline.dat -r Offline -f data-hists.root -b Test_bin.dat '
-    test.check_steps.append(rdict)
-
- 
-# Now the comparitor steps
-comp=TrigInDetCompStep('Comp_L2muon','L2','muon')
-comp.test='ttbar'
-test.check_steps.append(comp)
- 
- 
-comp2=TrigInDetCompStep('Comp_EFmuon','EF','muon')
-comp2.test='ttbar'
-test.check_steps.append(comp2)
-
-
-comp3=TrigInDetCompStep('Comp_L2bjet','L2','bjet')
-comp3.test='ttbar'
-test.check_steps.append(comp3)
-
-comp4=TrigInDetCompStep('Comp_EFbjet','EF','bjet')
-comp4.test='ttbar'
-test.check_steps.append(comp4)
-
-comp5=TrigInDetCompStep('Comp_L2tau','L2','tau')
-comp5.test='ttbar'
-test.check_steps.append(comp5)
-
-comp6=TrigInDetCompStep('Comp_EFtau','EF','tau')
-comp6.test='ttbar'
-test.check_steps.append(comp6)
-
-comp7=TrigInDetCompStep('Comp_L2ele','L2','electron')
-comp7.test='ttbar'
-test.check_steps.append(comp7)
-
-comp8=TrigInDetCompStep('Comp_EFele','EF','electron')
-comp8.test='ttbar'
-test.check_steps.append(comp8)
-
-comp9=TrigInDetCompStep('Comp_L2FS','L2','FS')
-comp9.test='ttbar'
-test.check_steps.append(comp9)
-
-# CPU cost steps
-cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
-test.check_steps.append(cpucost)
-
-cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
-test.check_steps.append(cpucost2)
-
-import sys
-sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_short_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_short_old.py
new file mode 100755
index 000000000000..83941ab6bf6a
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_short_old.py
@@ -0,0 +1,127 @@
+#!/usr/bin/env python
+
+# art-description: art job for all_ttbar_pu80_short
+# art-type: grid
+# art-include: master/Athena
+# art-input-nfiles: 3
+# art-athena-mt: 8
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+from TrigValTools.TrigValSteering import Test, CheckSteps
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+
+
+import sys,getopt
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
+except getopt.GetoptError:
+    print("Usage:  ")
+    print("-l(--local)    run locally with input file from art eos grid-input")
+    print("-x             don't run athena or post post-processing, only plotting")
+    print("-p             run post-processing, even if -x is set")
+
+
+local=False
+exclude=False
+postproc=False
+for opt,arg in opts:
+    if opt in ("-l", "--local"):
+        local=True
+    if opt=="-x":
+        exclude=True
+    if opt=="-p":
+        postproc=True
+
+
+rdo2aod = TrigInDetReco()
+rdo2aod.slices = ['muon','electron','tau','bjet']
+rdo2aod.max_events = 1000 
+rdo2aod.threads = 8 
+rdo2aod.concurrent_events = 8
+rdo2aod.perfmon = False
+rdo2aod.timeout = 18*3600
+rdo2aod.input = 'ttbar_pu80'   # defined in TrigValTools/share/TrigValInputs.json  
+
+
+test = Test.Test()
+test.art_type = 'grid'
+if (not exclude):
+    test.exec_steps = [rdo2aod]
+    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
+    test.check_steps = CheckSteps.default_check_steps(test)
+
+# Run Tidardict
+if ((not exclude) or postproc ):
+    rdict = TrigInDetdictStep()
+    rdict.args='TIDAdata-run3-offline.dat -r Offline -f data-hists.root -b Test_bin.dat '
+    test.check_steps.append(rdict)
+
+ 
+# Now the comparitor steps
+comp=TrigInDetCompStep('Comp_L2muon','L2','muon')
+comp.test='ttbar'
+test.check_steps.append(comp)
+ 
+ 
+comp2=TrigInDetCompStep('Comp_EFmuon','EF','muon')
+comp2.test='ttbar'
+test.check_steps.append(comp2)
+
+
+comp3=TrigInDetCompStep('Comp_L2bjet','L2','bjet')
+comp3.test='ttbar'
+test.check_steps.append(comp3)
+
+comp4=TrigInDetCompStep('Comp_EFbjet','EF','bjet')
+comp4.test='ttbar'
+test.check_steps.append(comp4)
+
+comp5=TrigInDetCompStep('Comp_L2tau','L2','tau')
+comp5.test='ttbar'
+test.check_steps.append(comp5)
+
+comp6=TrigInDetCompStep('Comp_EFtau','EF','tau')
+comp6.test='ttbar'
+test.check_steps.append(comp6)
+
+comp7=TrigInDetCompStep('Comp_L2ele','L2','electron')
+comp7.test='ttbar'
+test.check_steps.append(comp7)
+
+comp8=TrigInDetCompStep('Comp_EFele','EF','electron')
+comp8.test='ttbar'
+test.check_steps.append(comp8)
+
+comp9=TrigInDetCompStep('Comp_L2FS','L2','FS')
+comp9.test='ttbar'
+test.check_steps.append(comp9)
+
+# CPU cost steps
+cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
+test.check_steps.append(cpucost)
+
+cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
+test.check_steps.append(cpucost2)
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_st.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_st.py
index b54945e9f25f..ad18d67f9c52 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_st.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_st.py
@@ -3,7 +3,6 @@
 # art-description: art job for all_ttbar_pu80_st
 # art-type: grid
 # art-include: master/Athena
-# art-input-nfiles: 3
 # art-athena-mt: 4
 # art-memory: 4096
 # art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
@@ -26,103 +25,28 @@
 # art-output: *.dat 
 
 
-from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+Slices  = ['muon','electron','tau','bjet','fsjet']
+Events  = 1000
+Threads = 1
+Slots   = 1
+Input   = 'ttbar_pu80'    # defined in TrigValTools/share/TrigValInputs.json  
 
+Jobs = [ ( "Offline",     " TIDAdata-run3-offline.dat      -r Offline -o data-hists-offline.root" ),
+         ( "OfflineVtx",  " TIDAdata-run3-offline-vtx.dat  -r Offline -o data-hists-offline-vtx.root" ) ]
 
-import sys,getopt
+Comp = [ ( "L2muon",       "L2muon",      "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-muon " ),
+         ( "L2electron",   "L2electron",  "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-electron " ),
+         ( "L2tau",        "L2tau",       "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-tau " ),
+         ( "L2bjet",       "L2bjet",      "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-bjet " ),   
+         ( "FSjetoffline", "L2fsjet",     "data-hists-offline.root",      " -c TIDAhisto-panel.dat  -d HLTL2-plots-FS " ),
+         ( "FSvtx",        "L2fsjetvtx",  "data-hists-offline-vtx.root",  " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtx     --ncols 3" ),
+         ( "FSvtxall",     "L2fsjetvtx",  "data-hists-offline.root",      " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtxall  --ncols 3" ), 
 
-try:
-    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
-except getopt.GetoptError:
-    print("Usage:  ")
-    print("-l(--local)    run locally with input file from art eos grid-input")
-    print("-x             don't run athena or post post-processing, only plotting")
-    print("-p             run post-processing, even if -x is set")
+         ( "EFmuon",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-muon " ),
+         ( "EFelectron",   "EFelectron",  "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-electron " ),
+         ( "EFtau",        "EFtau",       "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-tau " ),
+         ( "EFbjet",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-bjet " ) ]
+   
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
 
-
-local=False
-exclude=False
-postproc=False
-for opt,arg in opts:
-    if opt in ("-l", "--local"):
-        local=True
-    if opt=="-x":
-        exclude=True
-    if opt=="-p":
-        postproc=True
-
-
-rdo2aod = TrigInDetReco()
-rdo2aod.slices = ['muon','electron','tau','bjet']
-rdo2aod.max_events = 1000 
-rdo2aod.threads = 1 
-rdo2aod.concurrent_events = 1 
-rdo2aod.perfmon = False
-rdo2aod.timeout = 18*3600
-rdo2aod.input = 'ttbar_pu80'   # defined in TrigValTools/share/TrigValInputs.json  
-
-
-test = Test.Test()
-test.art_type = 'grid'
-if (not exclude):
-    test.exec_steps = [rdo2aod]
-    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
-    test.check_steps = CheckSteps.default_check_steps(test)
-
-# Run Tidardict
-if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep()
-    rdict.args='TIDAdata-run3-offline.dat -r Offline -f data-hists.root -b Test_bin.dat '
-    test.check_steps.append(rdict)
-
- 
-# Now the comparitor steps
-comp=TrigInDetCompStep('Comp_L2muon','L2','muon')
-comp.test='ttbar'
-test.check_steps.append(comp)
- 
- 
-comp2=TrigInDetCompStep('Comp_EFmuon','EF','muon')
-comp2.test='ttbar'
-test.check_steps.append(comp2)
-
-
-comp3=TrigInDetCompStep('Comp_L2bjet','L2','bjet')
-comp3.test='ttbar'
-test.check_steps.append(comp3)
-
-comp4=TrigInDetCompStep('Comp_EFbjet','EF','bjet')
-comp4.test='ttbar'
-test.check_steps.append(comp4)
-
-comp5=TrigInDetCompStep('Comp_L2tau','L2','tau')
-comp5.test='ttbar'
-test.check_steps.append(comp5)
-
-comp6=TrigInDetCompStep('Comp_EFtau','EF','tau')
-comp6.test='ttbar'
-test.check_steps.append(comp6)
-
-comp7=TrigInDetCompStep('Comp_L2ele','L2','electron')
-comp7.test='ttbar'
-test.check_steps.append(comp7)
-
-comp8=TrigInDetCompStep('Comp_EFele','EF','electron')
-comp8.test='ttbar'
-test.check_steps.append(comp8)
-
-comp9=TrigInDetCompStep('Comp_L2FS','L2','FS')
-comp9.test='ttbar'
-test.check_steps.append(comp9)
-
-# CPU cost steps
-cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
-test.check_steps.append(cpucost)
-
-cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
-test.check_steps.append(cpucost2)
-
-
-import sys
-sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_st_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_st_old.py
new file mode 100755
index 000000000000..357cde750984
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_st_old.py
@@ -0,0 +1,128 @@
+#!/usr/bin/env python
+
+# art-description: art job for all_ttbar_pu80_st
+# art-type: grid
+# art-include: master/Athena
+# art-input-nfiles: 3
+# art-athena-mt: 4
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+from TrigValTools.TrigValSteering import Test, CheckSteps
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+
+
+import sys,getopt
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
+except getopt.GetoptError:
+    print("Usage:  ")
+    print("-l(--local)    run locally with input file from art eos grid-input")
+    print("-x             don't run athena or post post-processing, only plotting")
+    print("-p             run post-processing, even if -x is set")
+
+
+local=False
+exclude=False
+postproc=False
+for opt,arg in opts:
+    if opt in ("-l", "--local"):
+        local=True
+    if opt=="-x":
+        exclude=True
+    if opt=="-p":
+        postproc=True
+
+
+rdo2aod = TrigInDetReco()
+rdo2aod.slices = ['muon','electron','tau','bjet']
+rdo2aod.max_events = 1000 
+rdo2aod.threads = 1 
+rdo2aod.concurrent_events = 1 
+rdo2aod.perfmon = False
+rdo2aod.timeout = 18*3600
+rdo2aod.input = 'ttbar_pu80'   # defined in TrigValTools/share/TrigValInputs.json  
+
+
+test = Test.Test()
+test.art_type = 'grid'
+if (not exclude):
+    test.exec_steps = [rdo2aod]
+    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
+    test.check_steps = CheckSteps.default_check_steps(test)
+
+# Run Tidardict
+if ((not exclude) or postproc ):
+    rdict = TrigInDetdictStep()
+    rdict.args='TIDAdata-run3-offline.dat -r Offline -f data-hists.root -b Test_bin.dat '
+    test.check_steps.append(rdict)
+
+ 
+# Now the comparitor steps
+comp=TrigInDetCompStep('Comp_L2muon','L2','muon')
+comp.test='ttbar'
+test.check_steps.append(comp)
+ 
+ 
+comp2=TrigInDetCompStep('Comp_EFmuon','EF','muon')
+comp2.test='ttbar'
+test.check_steps.append(comp2)
+
+
+comp3=TrigInDetCompStep('Comp_L2bjet','L2','bjet')
+comp3.test='ttbar'
+test.check_steps.append(comp3)
+
+comp4=TrigInDetCompStep('Comp_EFbjet','EF','bjet')
+comp4.test='ttbar'
+test.check_steps.append(comp4)
+
+comp5=TrigInDetCompStep('Comp_L2tau','L2','tau')
+comp5.test='ttbar'
+test.check_steps.append(comp5)
+
+comp6=TrigInDetCompStep('Comp_EFtau','EF','tau')
+comp6.test='ttbar'
+test.check_steps.append(comp6)
+
+comp7=TrigInDetCompStep('Comp_L2ele','L2','electron')
+comp7.test='ttbar'
+test.check_steps.append(comp7)
+
+comp8=TrigInDetCompStep('Comp_EFele','EF','electron')
+comp8.test='ttbar'
+test.check_steps.append(comp8)
+
+comp9=TrigInDetCompStep('Comp_L2FS','L2','FS')
+comp9.test='ttbar'
+test.check_steps.append(comp9)
+
+# CPU cost steps
+cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
+test.check_steps.append(cpucost)
+
+cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
+test.check_steps.append(cpucost2)
+
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_bjet_nopps_pu40.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_bjet_nopps_pu40.py
index 850c9adf65f4..d881c3ff9b55 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_bjet_nopps_pu40.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_bjet_nopps_pu40.py
@@ -30,14 +30,19 @@ os.system("echo 'ftf = findAlgorithm(topSequence, \"TrigFastTrackFinder__jet\")'
 os.system("echo 'ftf.TripletDoPPS=False' >> dopps.py")
 
 Slices = ['bjet']
-RunEF   = True
 Events  = 4000
 Threads = 8 
 Slots   = 8
 postinclude_file = 'dopps.py'
 Input = 'ttbar_ID'    # defined in TrigValTools/share/TrigValInputs.json  
 
-TrackReference = [ 'Truth', 'Offline' ]
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                    -o data-hists.root" ),
+         ( "Offline",     " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ) ]
+
+Comp = [ ( "L2bjet",              "L2bjet",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "L2bjetoffline",       "L2bjet",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "EFbjet",              "EFbjet",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "EFbjetoffline",       "EFbjet",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ) ]
 
 
 from AthenaCommon.Include import include 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_bjet_nopps_pu40_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_bjet_nopps_pu40_old.py
new file mode 100755
index 000000000000..f014eae0bec7
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_bjet_nopps_pu40_old.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python
+
+# art-description: art job for bjet_pu40_mt
+# art-type: grid
+# art-include: master/Athena
+# art-input-nfiles: 3
+# art-athena-mt: 4
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+import os
+os.system("echo 'ftf = findAlgorithm(topSequence, \"TrigFastTrackFinder__jet\")' > dopps.py")
+os.system("echo 'ftf.TripletDoPPS=False' >> dopps.py")
+
+Slices = ['bjet']
+RunEF   = True
+Events  = 4000
+Threads = 8 
+Slots   = 8
+postinclude_file = 'dopps.py'
+Input = 'ttbar_ID'    # defined in TrigValTools/share/TrigValInputs.json  
+
+TrackReference = [ 'Truth', 'Offline' ]
+
+
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_OldBase.py")
+
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_bjet_pu40.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_bjet_pu40.py
index 3a9b964b4f79..a99b3d6d885f 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_bjet_pu40.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_bjet_pu40.py
@@ -26,13 +26,18 @@
 # art-output: *.dat 
 
 Slices = ['bjet']
-RunEF   = True
 Events  = 4000
 Threads = 8 
 Slots   = 8
 Input = 'ttbar_ID'    # defined in TrigValTools/share/TrigValInputs.json  
 
-TrackReference = [ 'Truth', 'Offline' ]
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                    -o data-hists.root" ),
+         ( "Offline",     " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ) ]
+
+Comp = [ ( "L2bjet",              "L2bjet",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "L2bjetoffline",       "L2bjet",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "EFbjet",              "EFbjet",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "EFbjetoffline",       "EFbjet",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ) ]
 
 
 from AthenaCommon.Include import include 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_bjet_pu40_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_bjet_pu40_old.py
new file mode 100755
index 000000000000..3aa3e95ad34f
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_bjet_pu40_old.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python
+
+# art-description: art job for bjet_pu40_mt
+# art-type: grid
+# art-include: master/Athena
+# art-input-nfiles: 3
+# art-athena-mt: 4
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+Slices = ['bjet']
+RunEF   = True
+Events  = 4000
+Threads = 8 
+Slots   = 8
+Input = 'ttbar_ID'    # defined in TrigValTools/share/TrigValInputs.json  
+
+TrackReference = [ 'Truth', 'Offline' ]
+
+
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_OldBase.py")
+
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_jpsiee_pu40.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_jpsiee_pu40.py
index bc85b4326011..9c022553168e 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_jpsiee_pu40.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_jpsiee_pu40.py
@@ -5,7 +5,7 @@
 # art-include: master/Athena
 # art-input: mc15_13TeV.129190.Pythia8_AU2CTEQ6L1_ppToJpsie3e3.recon.RDO.e3802_s2608_s2183_r7042
 # art-input-nfiles: 16
-# art-athena-mt: 8
+# art-athena-mt: 4
 # art-memory: 4096
 # art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
 # art-output: *.txt
@@ -27,99 +27,25 @@
 # art-output: *.dat 
 
 
-from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+Slices  = ['electron']
+Events  = 8000
+Threads = 8 
+Slots   = 8
+Input   = 'Jpsiee_pu40'    # defined in TrigValTools/share/TrigValInputs.json
+GridFiles=True
 
-import sys,getopt
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                    -o data-hists.root -p 11" ),
+         ( "Offline",     " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ) ]
 
-try:
-    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
-except getopt.GetoptError:
-    print("Usage:  ")
-    print("-l(--local)    run locally with input file from art eos grid-input")
-    print("-x             don't run athena or post post-processing, only plotting")
-    print("-p             run post-processing, even if -x is set")
+Comp = [ ( "L2ele",              "L2electron",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "L2ele-lowpt",        "L2electronLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt " ),
+         ( "L2eleoffline",       "L2electron",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "L2eleoffline-lowpt", "L2electronLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt-offline " ),
+         ( "EFele",              "EFelectron",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "EFele-lowpt",        "EFelectronLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt " ),
+         ( "EFeleoffline",       "EFelectron",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ),
+         ( "EFeleoffline-lowpt", "EFelectronLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt-offline " ) ]
 
 
-local=False
-exclude=False
-postproc=False
-for opt,arg in opts:
-    if opt in ("-l", "--local"):
-        local=True
-    if opt=="-x":
-        exclude=True
-    if opt=="-p":
-        postproc=True
-
-
-rdo2aod = TrigInDetReco()
-rdo2aod.slices = ['electron']
-rdo2aod.max_events = 8000 
-rdo2aod.threads = 8
-rdo2aod.concurrent_events = 8
-rdo2aod.perfmon = False
-rdo2aod.timeout = 18*3600
-if local:
-    rdo2aod.input = 'Jpsiee_pu40'     # defined in TrigValTools/share/TrigValInputs.json  
-else:
-    rdo2aod.input = ''
-    rdo2aod.args += '--inputRDOFile=$ArtInFile '
-
-
-test = Test.Test()
-test.art_type = 'grid'
-if (not exclude):
-    test.exec_steps = [rdo2aod]
-    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
-    test.check_steps = CheckSteps.default_check_steps(test)
-
- 
-# Run Tidardict
-if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep()
-    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 11 -b Test_bin.dat '
-    test.check_steps.append(rdict)
-    rdict2 = TrigInDetdictStep('TrigInDetDict2')
-    rdict2.args='TIDAdata-run3-offline.dat -r Offline  -f data-hists-offline.root -b Test_bin.dat '
-    test.check_steps.append(rdict2)
-
- 
-# Now the comparitor steps
-comp=TrigInDetCompStep('Comp_L2ele','L2','electron')
-test.check_steps.append(comp)
-  
-comp2=TrigInDetCompStep('Comp_EFele','EF','electron')
-test.check_steps.append(comp2)
-
-comp3=TrigInDetCompStep('Comp_L2eleLowpt','L2','electron',lowpt=True)
-test.check_steps.append(comp3)
-
-comp4=TrigInDetCompStep('Comp_EFeleLowpt','EF','electron',lowpt=True)
-test.check_steps.append(comp4)
-
-comp5=TrigInDetCompStep('Comp_L2ele_off','L2','electron')
-comp5.type = 'offline'
-test.check_steps.append(comp5)
-  
-comp6=TrigInDetCompStep('Comp_EFele_off','EF','electron')
-comp6.type = 'offline'
-test.check_steps.append(comp6)
-
-comp7=TrigInDetCompStep('Comp_L2eleLowpt_off','L2','electron',lowpt=True)
-comp7.type = 'offline'
-test.check_steps.append(comp7)
-
-comp8=TrigInDetCompStep('Comp_EFeleLowpt_off','EF','electron',lowpt=True)
-comp8.type = 'offline'
-test.check_steps.append(comp8)
-
-# CPU cost steps
-cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
-test.check_steps.append(cpucost)
-
-cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
-test.check_steps.append(cpucost2)
-
-import sys
-sys.exit(test.run())
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_jpsiee_pu40_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_jpsiee_pu40_old.py
new file mode 100755
index 000000000000..3995c8d3cec0
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_jpsiee_pu40_old.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python
+
+# art-description: art job for el_Jpsiee_pu40
+# art-type: grid
+# art-include: master/Athena
+# art-input: mc15_13TeV.129190.Pythia8_AU2CTEQ6L1_ppToJpsie3e3.recon.RDO.e3802_s2608_s2183_r7042
+# art-input-nfiles: 16
+# art-athena-mt: 8
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+from TrigValTools.TrigValSteering import Test, CheckSteps
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+
+import sys,getopt
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
+except getopt.GetoptError:
+    print("Usage:  ")
+    print("-l(--local)    run locally with input file from art eos grid-input")
+    print("-x             don't run athena or post post-processing, only plotting")
+    print("-p             run post-processing, even if -x is set")
+
+
+local=False
+exclude=False
+postproc=False
+for opt,arg in opts:
+    if opt in ("-l", "--local"):
+        local=True
+    if opt=="-x":
+        exclude=True
+    if opt=="-p":
+        postproc=True
+
+
+rdo2aod = TrigInDetReco()
+rdo2aod.slices = ['electron']
+rdo2aod.max_events = 8000 
+rdo2aod.threads = 8
+rdo2aod.concurrent_events = 8
+rdo2aod.perfmon = False
+rdo2aod.timeout = 18*3600
+if local:
+    rdo2aod.input = 'Jpsiee_pu40'     # defined in TrigValTools/share/TrigValInputs.json  
+else:
+    rdo2aod.input = ''
+    rdo2aod.args += '--inputRDOFile=$ArtInFile '
+
+
+test = Test.Test()
+test.art_type = 'grid'
+if (not exclude):
+    test.exec_steps = [rdo2aod]
+    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
+    test.check_steps = CheckSteps.default_check_steps(test)
+
+ 
+# Run Tidardict
+if ((not exclude) or postproc ):
+    rdict = TrigInDetdictStep()
+    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 11 -b Test_bin.dat '
+    test.check_steps.append(rdict)
+    rdict2 = TrigInDetdictStep('TrigInDetDict2')
+    rdict2.args='TIDAdata-run3-offline.dat -r Offline  -f data-hists-offline.root -b Test_bin.dat '
+    test.check_steps.append(rdict2)
+
+ 
+# Now the comparitor steps
+comp=TrigInDetCompStep('Comp_L2ele','L2','electron')
+test.check_steps.append(comp)
+  
+comp2=TrigInDetCompStep('Comp_EFele','EF','electron')
+test.check_steps.append(comp2)
+
+comp3=TrigInDetCompStep('Comp_L2eleLowpt','L2','electron',lowpt=True)
+test.check_steps.append(comp3)
+
+comp4=TrigInDetCompStep('Comp_EFeleLowpt','EF','electron',lowpt=True)
+test.check_steps.append(comp4)
+
+comp5=TrigInDetCompStep('Comp_L2ele_off','L2','electron')
+comp5.type = 'offline'
+test.check_steps.append(comp5)
+  
+comp6=TrigInDetCompStep('Comp_EFele_off','EF','electron')
+comp6.type = 'offline'
+test.check_steps.append(comp6)
+
+comp7=TrigInDetCompStep('Comp_L2eleLowpt_off','L2','electron',lowpt=True)
+comp7.type = 'offline'
+test.check_steps.append(comp7)
+
+comp8=TrigInDetCompStep('Comp_EFeleLowpt_off','EF','electron',lowpt=True)
+comp8.type = 'offline'
+test.check_steps.append(comp8)
+
+# CPU cost steps
+cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
+test.check_steps.append(cpucost)
+
+cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
+test.check_steps.append(cpucost2)
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80.py
index b29f913f599a..7e39bc2265ad 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80.py
@@ -27,99 +27,25 @@
 # art-output: *.dat 
 
 
-from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
-
-import sys,getopt
-
-try:
-    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
-except getopt.GetoptError:
-    print("Usage:  ")
-    print("-l(--local)    run locally with input file from art eos grid-input")
-    print("-x             don't run athena or post post-processing, only plotting")
-    print("-p             run post-processing, even if -x is set")
-
-
-local=False
-exclude=False
-postproc=False
-for opt,arg in opts:
-    if opt in ("-l", "--local"):
-        local=True
-    if opt=="-x":
-        exclude=True
-    if opt=="-p":
-        postproc=True
-
-
-rdo2aod = TrigInDetReco()
-rdo2aod.slices = ['electron']
-rdo2aod.max_events = 20000 
-rdo2aod.threads = 8
-rdo2aod.concurrent_events = 8
-rdo2aod.perfmon = False
-rdo2aod.timeout = 18*3600
-if local:
-    rdo2aod.input = 'Single_el'     # defined in TrigValTools/share/TrigValInputs.json  
-else:
-    rdo2aod.input = ''
-    rdo2aod.args += '--inputRDOFile=$ArtInFile '
-
-
-test = Test.Test()
-test.art_type = 'grid'
-if (not exclude):
-    test.exec_steps = [rdo2aod]
-    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
-    test.check_steps = CheckSteps.default_check_steps(test)
-
- 
-# Run Tidardict
-if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep()
-    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 11 -b Test_bin.dat '
-    test.check_steps.append(rdict)
-    rdict2 = TrigInDetdictStep('TrigInDetDict2')
-    rdict2.args='TIDAdata-run3-offline.dat -r Offline  -f data-hists-offline.root -b Test_bin.dat '
-    test.check_steps.append(rdict2)
-
- 
-# Now the comparitor steps
-comp=TrigInDetCompStep('Comp_L2ele','L2','electron')
-test.check_steps.append(comp)
-  
-comp2=TrigInDetCompStep('Comp_EFele','EF','electron')
-test.check_steps.append(comp2)
-
-comp3=TrigInDetCompStep('Comp_L2eleLowpt','L2','electron',lowpt=True)
-test.check_steps.append(comp3)
-
-comp4=TrigInDetCompStep('Comp_EFeleLowpt','EF','electron',lowpt=True)
-test.check_steps.append(comp4)
-
-comp5=TrigInDetCompStep('Comp_L2ele_off','L2','electron')
-comp5.type = 'offline'
-test.check_steps.append(comp5)
-  
-comp6=TrigInDetCompStep('Comp_EFele_off','EF','electron')
-comp6.type = 'offline'
-test.check_steps.append(comp6)
-
-comp7=TrigInDetCompStep('Comp_L2eleLowpt_off','L2','electron',lowpt=True)
-comp7.type = 'offline'
-test.check_steps.append(comp7)
-
-comp8=TrigInDetCompStep('Comp_EFeleLowpt_off','EF','electron',lowpt=True)
-comp8.type = 'offline'
-test.check_steps.append(comp8)
-
-# CPU cost steps
-cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
-test.check_steps.append(cpucost)
-
-cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
-test.check_steps.append(cpucost2)
-
-import sys
-sys.exit(test.run())
+Slices  = ['electron']
+Events  = 20000 
+Threads = 8 
+Slots   = 8
+Input   = 'Single_el'    # defined in TrigValTools/share/TrigValInputs.json
+GridFiles=True
+
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                    -o data-hists.root -p 11" ),
+         ( "Offline",     " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ) ]
+
+Comp = [ ( "L2ele",              "L2electron",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "L2ele-lowpt",        "L2electronLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt " ),
+         ( "L2eleoffline",       "L2electron",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "L2eleoffline-lowpt", "L2electronLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt-offline " ),
+         ( "EFele",              "EFelectron",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "EFele-lowpt",        "EFelectronLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt " ),
+         ( "EFeleoffline",       "EFelectron",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ),
+         ( "EFeleoffline-lowpt", "EFelectronLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt-offline " ) ]
+
+
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_larged0.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_larged0.py
index c24833679155..c6b34f1ae1a7 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_larged0.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_larged0.py
@@ -27,99 +27,25 @@
 # art-output: *.dat 
 
 
-from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
-
-import sys,getopt
-
-try:
-    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
-except getopt.GetoptError:
-    print("Usage:  ")
-    print("-l(--local)    run locally with input file from art eos grid-input")
-    print("-x             don't run athena or post post-processing, only plotting")
-    print("-p             run post-processing, even if -x is set")
-
-
-local=False
-exclude=False
-postproc=False
-for opt,arg in opts:
-    if opt in ("-l", "--local"):
-        local=True
-    if opt=="-x":
-        exclude=True
-    if opt=="-p":
-        postproc=True
-
-
-rdo2aod = TrigInDetReco()
-rdo2aod.slices = ['electron']
-rdo2aod.max_events = 20000 
-rdo2aod.threads = 8
-rdo2aod.concurrent_events = 8
-rdo2aod.perfmon = False
-rdo2aod.timeout = 18*3600
-if local:
-    rdo2aod.input = 'Single_el_larged0'    # defined in TrigValTools/share/TrigValInputs.json  
-else:
-    rdo2aod.input = ''
-    rdo2aod.args += '--inputRDOFile=$ArtInFile '
-
-
-test = Test.Test()
-test.art_type = 'grid'
-if (not exclude):
-    test.exec_steps = [rdo2aod]
-    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
-    test.check_steps = CheckSteps.default_check_steps(test)
-
- 
-# Run Tidardict
-if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep()
-    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 11 -b Test_bin.dat '
-    test.check_steps.append(rdict)
-    rdict2 = TrigInDetdictStep('TrigInDetDict2')
-    rdict2.args='TIDAdata-run3-offline.dat -r Offline  -f data-hists-offline.root -b Test_bin.dat '
-    test.check_steps.append(rdict2)
-
- 
-# Now the comparitor steps
-comp=TrigInDetCompStep('Comp_L2ele','L2','electron')
-test.check_steps.append(comp)
-  
-comp2=TrigInDetCompStep('Comp_EFele','EF','electron')
-test.check_steps.append(comp2)
-
-comp3=TrigInDetCompStep('Comp_L2eleLowpt','L2','electron',lowpt=True)
-test.check_steps.append(comp3)
-
-comp4=TrigInDetCompStep('Comp_EFeleLowpt','EF','electron',lowpt=True)
-test.check_steps.append(comp4)
-
-comp5=TrigInDetCompStep('Comp_L2ele_off','L2','electron')
-comp5.type = 'offline'
-test.check_steps.append(comp5)
-  
-comp6=TrigInDetCompStep('Comp_EFele_off','EF','electron')
-comp6.type = 'offline'
-test.check_steps.append(comp6)
-
-comp7=TrigInDetCompStep('Comp_L2eleLowpt_off','L2','electron',lowpt=True)
-comp7.type = 'offline'
-test.check_steps.append(comp7)
-
-comp8=TrigInDetCompStep('Comp_EFeleLowpt_off','EF','electron',lowpt=True)
-comp8.type = 'offline'
-test.check_steps.append(comp8)
-
-# CPU cost steps
-cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
-test.check_steps.append(cpucost)
-
-cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
-test.check_steps.append(cpucost2)
-
-import sys
-sys.exit(test.run())
+Slices  = ['electron']
+Events  = 20000 
+Threads = 8 
+Slots   = 8
+Input   = 'Single_el_larged0'    # defined in TrigValTools/share/TrigValInputs.json
+GridFiles=True
+
+Jobs = [ ( "Truth",       " TIDAdata-run3-larged0-el.dat                    -o data-hists.root -p 11",   "Test_bin_larged0.dat" ),
+         ( "Offline",     " TIDAdata-run3-offline-larged0-el.dat -r Offline -o data-hists-offline.root", "Test_bin_larged0.dat" ) ]
+
+Comp = [ ( "L2ele",              "L2electron",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "L2ele-lowpt",        "L2electronLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt " ),
+         ( "L2eleoffline",       "L2electron",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "L2eleoffline-lowpt", "L2electronLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt-offline " ),
+         ( "EFele",              "EFelectron",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "EFele-lowpt",        "EFelectronLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt " ),
+         ( "EFeleoffline",       "EFelectron",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ),
+         ( "EFeleoffline-lowpt", "EFelectronLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt-offline " ) ]
+
+
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_larged0_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_larged0_old.py
new file mode 100755
index 000000000000..976ed85fa7dc
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_larged0_old.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python
+
+# art-description: art job for el_singlee_7-80_larged0
+# art-type: grid
+# art-include: master/Athena
+# art-input: mc15_13TeV.159053.ParticleGenerator_e_Et7to80_vertxy20.recon.RDO.e3603_s2726_r7728
+# art-input-nfiles: 10
+# art-athena-mt: 8
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+from TrigValTools.TrigValSteering import Test, CheckSteps
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+
+import sys,getopt
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
+except getopt.GetoptError:
+    print("Usage:  ")
+    print("-l(--local)    run locally with input file from art eos grid-input")
+    print("-x             don't run athena or post post-processing, only plotting")
+    print("-p             run post-processing, even if -x is set")
+
+
+local=False
+exclude=False
+postproc=False
+for opt,arg in opts:
+    if opt in ("-l", "--local"):
+        local=True
+    if opt=="-x":
+        exclude=True
+    if opt=="-p":
+        postproc=True
+
+
+rdo2aod = TrigInDetReco()
+rdo2aod.slices = ['electron']
+rdo2aod.max_events = 20000 
+rdo2aod.threads = 8
+rdo2aod.concurrent_events = 8
+rdo2aod.perfmon = False
+rdo2aod.timeout = 18*3600
+if local:
+    rdo2aod.input = 'Single_el_larged0'    # defined in TrigValTools/share/TrigValInputs.json  
+else:
+    rdo2aod.input = ''
+    rdo2aod.args += '--inputRDOFile=$ArtInFile '
+
+
+test = Test.Test()
+test.art_type = 'grid'
+if (not exclude):
+    test.exec_steps = [rdo2aod]
+    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
+    test.check_steps = CheckSteps.default_check_steps(test)
+
+ 
+# Run Tidardict
+if ((not exclude) or postproc ):
+    rdict = TrigInDetdictStep()
+    rdict.args='TIDAdata-run3-larged0-el.dat -f data-hists.root -p 11 -b Test_bin_larged0.dat '
+    test.check_steps.append(rdict)
+    rdict2 = TrigInDetdictStep('TrigInDetDict2')
+    rdict2.args='TIDAdata-run3-offline-larged0-el.dat -r Offline  -f data-hists-offline.root -b Test_bin_larged0.dat '
+    test.check_steps.append(rdict2)
+
+ 
+# Now the comparitor steps
+comp=TrigInDetCompStep('Comp_L2ele','L2','electron')
+test.check_steps.append(comp)
+  
+comp2=TrigInDetCompStep('Comp_EFele','EF','electron')
+test.check_steps.append(comp2)
+
+comp3=TrigInDetCompStep('Comp_L2eleLowpt','L2','electron',lowpt=True)
+test.check_steps.append(comp3)
+
+comp4=TrigInDetCompStep('Comp_EFeleLowpt','EF','electron',lowpt=True)
+test.check_steps.append(comp4)
+
+comp5=TrigInDetCompStep('Comp_L2ele_off','L2','electron')
+comp5.type = 'offline'
+test.check_steps.append(comp5)
+  
+comp6=TrigInDetCompStep('Comp_EFele_off','EF','electron')
+comp6.type = 'offline'
+test.check_steps.append(comp6)
+
+comp7=TrigInDetCompStep('Comp_L2eleLowpt_off','L2','electron',lowpt=True)
+comp7.type = 'offline'
+test.check_steps.append(comp7)
+
+comp8=TrigInDetCompStep('Comp_EFeleLowpt_off','EF','electron',lowpt=True)
+comp8.type = 'offline'
+test.check_steps.append(comp8)
+
+# CPU cost steps
+cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
+test.check_steps.append(cpucost)
+
+cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
+test.check_steps.append(cpucost2)
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_larged0_pu.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_larged0_pu.py
index 3b730c992d56..4d139d865c7e 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_larged0_pu.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_larged0_pu.py
@@ -27,99 +27,25 @@
 # art-output: *.dat 
 
 
-from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
-
-import sys,getopt
-
-try:
-    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
-except getopt.GetoptError:
-    print("Usage:  ")
-    print("-l(--local)    run locally with input file from art eos grid-input")
-    print("-x             don't run athena or post post-processing, only plotting")
-    print("-p             run post-processing, even if -x is set")
-
-
-local=False
-exclude=False
-postproc=False
-for opt,arg in opts:
-    if opt in ("-l", "--local"):
-        local=True
-    if opt=="-x":
-        exclude=True
-    if opt=="-p":
-        postproc=True
-
-
-rdo2aod = TrigInDetReco()
-rdo2aod.slices = ['electron']
-rdo2aod.max_events = 20000 
-rdo2aod.threads = 8
-rdo2aod.concurrent_events = 8
-rdo2aod.perfmon = False
-rdo2aod.timeout = 18*3600
-if local:
-    rdo2aod.input = 'Single_el_larged0_pu'    # defined in TrigValTools/share/TrigValInputs.json  
-else:
-    rdo2aod.input = ''
-    rdo2aod.args += '--inputRDOFile=$ArtInFile '
-
-
-test = Test.Test()
-test.art_type = 'grid'
-if (not exclude):
-    test.exec_steps = [rdo2aod]
-    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
-    test.check_steps = CheckSteps.default_check_steps(test)
-
- 
-# Run Tidardict
-if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep()
-    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 11 -b Test_bin.dat '
-    test.check_steps.append(rdict)
-    rdict2 = TrigInDetdictStep('TrigInDetDict2')
-    rdict2.args='TIDAdata-run3-offline.dat -r Offline  -f data-hists-offline.root -b Test_bin.dat '
-    test.check_steps.append(rdict2)
-
- 
-# Now the comparitor steps
-comp=TrigInDetCompStep('Comp_L2ele','L2','electron')
-test.check_steps.append(comp)
-  
-comp2=TrigInDetCompStep('Comp_EFele','EF','electron')
-test.check_steps.append(comp2)
-
-comp3=TrigInDetCompStep('Comp_L2eleLowpt','L2','electron',lowpt=True)
-test.check_steps.append(comp3)
-
-comp4=TrigInDetCompStep('Comp_EFeleLowpt','EF','electron',lowpt=True)
-test.check_steps.append(comp4)
-
-comp5=TrigInDetCompStep('Comp_L2ele_off','L2','electron')
-comp5.type = 'offline'
-test.check_steps.append(comp5)
-  
-comp6=TrigInDetCompStep('Comp_EFele_off','EF','electron')
-comp6.type = 'offline'
-test.check_steps.append(comp6)
-
-comp7=TrigInDetCompStep('Comp_L2eleLowpt_off','L2','electron',lowpt=True)
-comp7.type = 'offline'
-test.check_steps.append(comp7)
-
-comp8=TrigInDetCompStep('Comp_EFeleLowpt_off','EF','electron',lowpt=True)
-comp8.type = 'offline'
-test.check_steps.append(comp8)
-
-# CPU cost steps
-cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
-test.check_steps.append(cpucost)
-
-cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
-test.check_steps.append(cpucost2)
-
-import sys
-sys.exit(test.run())
+Slices  = ['electron']
+Events  = 20000 
+Threads = 8 
+Slots   = 8
+Input   = 'Single_el_larged0_pu'    # defined in TrigValTools/share/TrigValInputs.json
+GridFiles=True
+
+Jobs = [ ( "Truth",       " TIDAdata-run3-larged0-el.dat                    -o data-hists.root -p 11",   "Test_bin_larged0.dat" ),
+         ( "Offline",     " TIDAdata-run3-offline-larged0-el.dat -r Offline -o data-hists-offline.root", "Test_bin_larged0.dat" ) ]
+
+Comp = [ ( "L2ele",              "L2electron",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "L2ele-lowpt",        "L2electronLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt " ),
+         ( "L2eleoffline",       "L2electron",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "L2eleoffline-lowpt", "L2electronLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt-offline " ),
+         ( "EFele",              "EFelectron",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "EFele-lowpt",        "EFelectronLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt " ),
+         ( "EFeleoffline",       "EFelectron",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ),
+         ( "EFeleoffline-lowpt", "EFelectronLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt-offline " ) ]
+
+
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_larged0_pu_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_larged0_pu_old.py
new file mode 100755
index 000000000000..ed1cd1d3eb80
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_larged0_pu_old.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python
+
+# art-description: art job for el_singlee_7-80_larged0_pu
+# art-type: grid
+# art-include: master/Athena
+# art-input: mc15_13TeV.159053.ParticleGenerator_e_Et7to80_vertxy20.recon.RDO.e3603_s2726_r7772
+# art-input-nfiles: 10
+# art-athena-mt: 8
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+from TrigValTools.TrigValSteering import Test, CheckSteps
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+
+import sys,getopt
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
+except getopt.GetoptError:
+    print("Usage:  ")
+    print("-l(--local)    run locally with input file from art eos grid-input")
+    print("-x             don't run athena or post post-processing, only plotting")
+    print("-p             run post-processing, even if -x is set")
+
+
+local=False
+exclude=False
+postproc=False
+for opt,arg in opts:
+    if opt in ("-l", "--local"):
+        local=True
+    if opt=="-x":
+        exclude=True
+    if opt=="-p":
+        postproc=True
+
+
+rdo2aod = TrigInDetReco()
+rdo2aod.slices = ['electron']
+rdo2aod.max_events = 20000 
+rdo2aod.threads = 8
+rdo2aod.concurrent_events = 8
+rdo2aod.perfmon = False
+rdo2aod.timeout = 18*3600
+if local:
+    rdo2aod.input = 'Single_el_larged0_pu'    # defined in TrigValTools/share/TrigValInputs.json  
+else:
+    rdo2aod.input = ''
+    rdo2aod.args += '--inputRDOFile=$ArtInFile '
+
+
+test = Test.Test()
+test.art_type = 'grid'
+if (not exclude):
+    test.exec_steps = [rdo2aod]
+    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
+    test.check_steps = CheckSteps.default_check_steps(test)
+
+ 
+# Run Tidardict
+if ((not exclude) or postproc ):
+    rdict = TrigInDetdictStep()
+    rdict.args='TIDAdata-run3-larged0-el.dat -f data-hists.root -p 11 -b Test_bin_larged0.dat '
+    test.check_steps.append(rdict)
+    rdict2 = TrigInDetdictStep('TrigInDetDict2')
+    rdict2.args='TIDAdata-run3-offline-larged0-el.dat -r Offline  -f data-hists-offline.root -b Test_bin_larged0.dat '
+    test.check_steps.append(rdict2)
+
+ 
+# Now the comparitor steps
+comp=TrigInDetCompStep('Comp_L2ele','L2','electron')
+test.check_steps.append(comp)
+  
+comp2=TrigInDetCompStep('Comp_EFele','EF','electron')
+test.check_steps.append(comp2)
+
+comp3=TrigInDetCompStep('Comp_L2eleLowpt','L2','electron',lowpt=True)
+test.check_steps.append(comp3)
+
+comp4=TrigInDetCompStep('Comp_EFeleLowpt','EF','electron',lowpt=True)
+test.check_steps.append(comp4)
+
+comp5=TrigInDetCompStep('Comp_L2ele_off','L2','electron')
+comp5.type = 'offline'
+test.check_steps.append(comp5)
+  
+comp6=TrigInDetCompStep('Comp_EFele_off','EF','electron')
+comp6.type = 'offline'
+test.check_steps.append(comp6)
+
+comp7=TrigInDetCompStep('Comp_L2eleLowpt_off','L2','electron',lowpt=True)
+comp7.type = 'offline'
+test.check_steps.append(comp7)
+
+comp8=TrigInDetCompStep('Comp_EFeleLowpt_off','EF','electron',lowpt=True)
+comp8.type = 'offline'
+test.check_steps.append(comp8)
+
+# CPU cost steps
+cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
+test.check_steps.append(cpucost)
+
+cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
+test.check_steps.append(cpucost2)
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_old.py
new file mode 100755
index 000000000000..50bf73e3b531
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_old.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python
+
+# art-description: art job for el_singlee_7-80
+# art-type: grid
+# art-include: master/Athena
+# art-input: mc15_13TeV.159010.ParticleGenerator_e_Et7to80.recon.RDO.e1948_s2726_r7728
+# art-input-nfiles: 10
+# art-athena-mt: 8
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+from TrigValTools.TrigValSteering import Test, CheckSteps
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+
+import sys,getopt
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
+except getopt.GetoptError:
+    print("Usage:  ")
+    print("-l(--local)    run locally with input file from art eos grid-input")
+    print("-x             don't run athena or post post-processing, only plotting")
+    print("-p             run post-processing, even if -x is set")
+
+
+local=False
+exclude=False
+postproc=False
+for opt,arg in opts:
+    if opt in ("-l", "--local"):
+        local=True
+    if opt=="-x":
+        exclude=True
+    if opt=="-p":
+        postproc=True
+
+
+rdo2aod = TrigInDetReco()
+rdo2aod.slices = ['electron']
+rdo2aod.max_events = 20000 
+rdo2aod.threads = 8
+rdo2aod.concurrent_events = 8
+rdo2aod.perfmon = False
+rdo2aod.timeout = 18*3600
+if local:
+    rdo2aod.input = 'Single_el'     # defined in TrigValTools/share/TrigValInputs.json  
+else:
+    rdo2aod.input = ''
+    rdo2aod.args += '--inputRDOFile=$ArtInFile '
+
+
+test = Test.Test()
+test.art_type = 'grid'
+if (not exclude):
+    test.exec_steps = [rdo2aod]
+    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
+    test.check_steps = CheckSteps.default_check_steps(test)
+
+ 
+# Run Tidardict
+if ((not exclude) or postproc ):
+    rdict = TrigInDetdictStep()
+    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 11 -b Test_bin.dat '
+    test.check_steps.append(rdict)
+    rdict2 = TrigInDetdictStep('TrigInDetDict2')
+    rdict2.args='TIDAdata-run3-offline.dat -r Offline  -f data-hists-offline.root -b Test_bin.dat '
+    test.check_steps.append(rdict2)
+
+ 
+# Now the comparitor steps
+comp=TrigInDetCompStep('Comp_L2ele','L2','electron')
+test.check_steps.append(comp)
+  
+comp2=TrigInDetCompStep('Comp_EFele','EF','electron')
+test.check_steps.append(comp2)
+
+comp3=TrigInDetCompStep('Comp_L2eleLowpt','L2','electron',lowpt=True)
+test.check_steps.append(comp3)
+
+comp4=TrigInDetCompStep('Comp_EFeleLowpt','EF','electron',lowpt=True)
+test.check_steps.append(comp4)
+
+comp5=TrigInDetCompStep('Comp_L2ele_off','L2','electron')
+comp5.type = 'offline'
+test.check_steps.append(comp5)
+  
+comp6=TrigInDetCompStep('Comp_EFele_off','EF','electron')
+comp6.type = 'offline'
+test.check_steps.append(comp6)
+
+comp7=TrigInDetCompStep('Comp_L2eleLowpt_off','L2','electron',lowpt=True)
+comp7.type = 'offline'
+test.check_steps.append(comp7)
+
+comp8=TrigInDetCompStep('Comp_EFeleLowpt_off','EF','electron',lowpt=True)
+comp8.type = 'offline'
+test.check_steps.append(comp8)
+
+# CPU cost steps
+cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
+test.check_steps.append(cpucost)
+
+cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
+test.check_steps.append(cpucost2)
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_pu40.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_pu40.py
index 6cfc807a53d3..8a942ade8f29 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_pu40.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_pu40.py
@@ -27,99 +27,25 @@
 # art-output: *.dat 
 
 
-from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
-
-import sys,getopt
-
-try:
-    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
-except getopt.GetoptError:
-    print("Usage:  ")
-    print("-l(--local)    run locally with input file from art eos grid-input")
-    print("-x             don't run athena or post post-processing, only plotting")
-    print("-p             run post-processing, even if -x is set")
-
-
-local=False
-exclude=False
-postproc=False
-for opt,arg in opts:
-    if opt in ("-l", "--local"):
-        local=True
-    if opt=="-x":
-        exclude=True
-    if opt=="-p":
-        postproc=True
-
-
-rdo2aod = TrigInDetReco()
-rdo2aod.slices = ['electron']
-rdo2aod.max_events = 20000 
-rdo2aod.threads = 8
-rdo2aod.concurrent_events = 8
-rdo2aod.perfmon = False
-rdo2aod.timeout = 18*3600
-if local:
-    rdo2aod.input = 'Single_el_pu'    # defined in TrigValTools/share/TrigValInputs.json  
-else:
-    rdo2aod.input = ''
-    rdo2aod.args += '--inputRDOFile=$ArtInFile '
-
-
-test = Test.Test()
-test.art_type = 'grid'
-if (not exclude):
-    test.exec_steps = [rdo2aod]
-    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
-    test.check_steps = CheckSteps.default_check_steps(test)
-
- 
-# Run Tidardict
-if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep()
-    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 11 -b Test_bin.dat '
-    test.check_steps.append(rdict)
-    rdict2 = TrigInDetdictStep('TrigInDetDict2')
-    rdict2.args='TIDAdata-run3-offline.dat -r Offline  -f data-hists-offline.root -b Test_bin.dat '
-    test.check_steps.append(rdict2)
-
- 
-# Now the comparitor steps
-comp=TrigInDetCompStep('Comp_L2ele','L2','electron')
-test.check_steps.append(comp)
-  
-comp2=TrigInDetCompStep('Comp_EFele','EF','electron')
-test.check_steps.append(comp2)
-
-comp3=TrigInDetCompStep('Comp_L2eleLowpt','L2','electron',lowpt=True)
-test.check_steps.append(comp3)
-
-comp4=TrigInDetCompStep('Comp_EFeleLowpt','EF','electron',lowpt=True)
-test.check_steps.append(comp4)
-
-comp5=TrigInDetCompStep('Comp_L2ele_off','L2','electron')
-comp5.type = 'offline'
-test.check_steps.append(comp5)
-  
-comp6=TrigInDetCompStep('Comp_EFele_off','EF','electron')
-comp6.type = 'offline'
-test.check_steps.append(comp6)
-
-comp7=TrigInDetCompStep('Comp_L2eleLowpt_off','L2','electron',lowpt=True)
-comp7.type = 'offline'
-test.check_steps.append(comp7)
-
-comp8=TrigInDetCompStep('Comp_EFeleLowpt_off','EF','electron',lowpt=True)
-comp8.type = 'offline'
-test.check_steps.append(comp8)
-
-# CPU cost steps
-cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
-test.check_steps.append(cpucost)
-
-cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
-test.check_steps.append(cpucost2)
-
-import sys
-sys.exit(test.run())
+Slices  = ['electron']
+Events  = 20000 
+Threads = 8 
+Slots   = 8
+Input   = 'Single_el_pu'    # defined in TrigValTools/share/TrigValInputs.json
+GridFiles=True
+
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                    -o data-hists.root -p 11" ),
+         ( "Offline",     " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ) ]
+
+Comp = [ ( "L2ele",              "L2electron",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "L2ele-lowpt",        "L2electronLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt " ),
+         ( "L2eleoffline",       "L2electron",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "L2eleoffline-lowpt", "L2electronLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt-offline " ),
+         ( "EFele",              "EFelectron",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "EFele-lowpt",        "EFelectronLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt " ),
+         ( "EFeleoffline",       "EFelectron",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ),
+         ( "EFeleoffline-lowpt", "EFelectronLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt-offline " ) ]
+
+
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_pu40_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_pu40_old.py
new file mode 100755
index 000000000000..f9da6ad43467
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_singlee_7-80_pu40_old.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python
+
+# art-description: art job for el_singlee_7-80_pu40
+# art-type: grid
+# art-include: master/Athena
+# art-input: mc15_13TeV.159010.ParticleGenerator_e_Et7to80.recon.RDO.e1948_s2726_r7728
+# art-input-nfiles: 10
+# art-athena-mt: 8
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+from TrigValTools.TrigValSteering import Test, CheckSteps
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+
+import sys,getopt
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
+except getopt.GetoptError:
+    print("Usage:  ")
+    print("-l(--local)    run locally with input file from art eos grid-input")
+    print("-x             don't run athena or post post-processing, only plotting")
+    print("-p             run post-processing, even if -x is set")
+
+
+local=False
+exclude=False
+postproc=False
+for opt,arg in opts:
+    if opt in ("-l", "--local"):
+        local=True
+    if opt=="-x":
+        exclude=True
+    if opt=="-p":
+        postproc=True
+
+
+rdo2aod = TrigInDetReco()
+rdo2aod.slices = ['electron']
+rdo2aod.max_events = 20000 
+rdo2aod.threads = 8
+rdo2aod.concurrent_events = 8
+rdo2aod.perfmon = False
+rdo2aod.timeout = 18*3600
+if local:
+    rdo2aod.input = 'Single_el_pu'    # defined in TrigValTools/share/TrigValInputs.json  
+else:
+    rdo2aod.input = ''
+    rdo2aod.args += '--inputRDOFile=$ArtInFile '
+
+
+test = Test.Test()
+test.art_type = 'grid'
+if (not exclude):
+    test.exec_steps = [rdo2aod]
+    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
+    test.check_steps = CheckSteps.default_check_steps(test)
+
+ 
+# Run Tidardict
+if ((not exclude) or postproc ):
+    rdict = TrigInDetdictStep()
+    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 11 -b Test_bin.dat '
+    test.check_steps.append(rdict)
+    rdict2 = TrigInDetdictStep('TrigInDetDict2')
+    rdict2.args='TIDAdata-run3-offline.dat -r Offline  -f data-hists-offline.root -b Test_bin.dat '
+    test.check_steps.append(rdict2)
+
+ 
+# Now the comparitor steps
+comp=TrigInDetCompStep('Comp_L2ele','L2','electron')
+test.check_steps.append(comp)
+  
+comp2=TrigInDetCompStep('Comp_EFele','EF','electron')
+test.check_steps.append(comp2)
+
+comp3=TrigInDetCompStep('Comp_L2eleLowpt','L2','electron',lowpt=True)
+test.check_steps.append(comp3)
+
+comp4=TrigInDetCompStep('Comp_EFeleLowpt','EF','electron',lowpt=True)
+test.check_steps.append(comp4)
+
+comp5=TrigInDetCompStep('Comp_L2ele_off','L2','electron')
+comp5.type = 'offline'
+test.check_steps.append(comp5)
+  
+comp6=TrigInDetCompStep('Comp_EFele_off','EF','electron')
+comp6.type = 'offline'
+test.check_steps.append(comp6)
+
+comp7=TrigInDetCompStep('Comp_L2eleLowpt_off','L2','electron',lowpt=True)
+comp7.type = 'offline'
+test.check_steps.append(comp7)
+
+comp8=TrigInDetCompStep('Comp_EFeleLowpt_off','EF','electron',lowpt=True)
+comp8.type = 'offline'
+test.check_steps.append(comp8)
+
+# CPU cost steps
+cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
+test.check_steps.append(cpucost)
+
+cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
+test.check_steps.append(cpucost2)
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40.py
index 167ab6ca0a9e..4dadf400dbda 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40.py
@@ -27,99 +27,25 @@
 # art-output: *.dat 
 
 
-from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
-
-import sys,getopt
-
-try:
-    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
-except getopt.GetoptError:
-    print("Usage:  ")
-    print("-l(--local)    run locally with input file from art eos grid-input")
-    print("-x             don't run athena or post post-processing, only plotting")
-    print("-p             run post-processing, even if -x is set")
-
-
-local=False
-exclude=False
-postproc=False
-for opt,arg in opts:
-    if opt in ("-l", "--local"):
-        local=True
-    if opt=="-x":
-        exclude=True
-    if opt=="-p":
-        postproc=True
-
-
-rdo2aod = TrigInDetReco()
-rdo2aod.slices = ['electron']
-rdo2aod.max_events = 16000 
-rdo2aod.threads = 8
-rdo2aod.concurrent_events = 8
-rdo2aod.perfmon = False
-rdo2aod.timeout = 18*3600
-if local:
-    rdo2aod.input = 'Zee_pu40'      # defined in TrigValTools/share/TrigValInputs.json  
-else:
-    rdo2aod.input = ''
-    rdo2aod.args += '--inputRDOFile=$ArtInFile '
-
-
-test = Test.Test()
-test.art_type = 'grid'
-if (not exclude):
-    test.exec_steps = [rdo2aod]
-    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
-    test.check_steps = CheckSteps.default_check_steps(test)
-
- 
-# Run Tidardict
-if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep()
-    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 11 -b Test_bin.dat '
-    test.check_steps.append(rdict)
-    rdict2 = TrigInDetdictStep('TrigInDetDict2')
-    rdict2.args='TIDAdata-run3-offline.dat -r Offline  -f data-hists-offline.root -b Test_bin.dat '
-    test.check_steps.append(rdict2)
-
- 
-# Now the comparitor steps
-comp=TrigInDetCompStep('Comp_L2ele','L2','electron')
-test.check_steps.append(comp)
-  
-comp2=TrigInDetCompStep('Comp_EFele','EF','electron')
-test.check_steps.append(comp2)
-
-comp3=TrigInDetCompStep('Comp_L2eleLowpt','L2','electron',lowpt=True)
-test.check_steps.append(comp3)
-
-comp4=TrigInDetCompStep('Comp_EFeleLowpt','EF','electron',lowpt=True)
-test.check_steps.append(comp4)
-
-comp5=TrigInDetCompStep('Comp_L2ele_off','L2','electron')
-comp5.type = 'offline'
-test.check_steps.append(comp5)
-  
-comp6=TrigInDetCompStep('Comp_EFele_off','EF','electron')
-comp6.type = 'offline'
-test.check_steps.append(comp6)
-
-comp7=TrigInDetCompStep('Comp_L2eleLowpt_off','L2','electron',lowpt=True)
-comp7.type = 'offline'
-test.check_steps.append(comp7)
-
-comp8=TrigInDetCompStep('Comp_EFeleLowpt_off','EF','electron',lowpt=True)
-comp8.type = 'offline'
-test.check_steps.append(comp8)
-
-# CPU cost steps
-cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
-test.check_steps.append(cpucost)
-
-cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
-test.check_steps.append(cpucost2)
-
-import sys
-sys.exit(test.run())
+Slices  = ['electron']
+Events  = 16000
+Threads = 8 
+Slots   = 8
+Input   = 'Zee_pu40'    # defined in TrigValTools/share/TrigValInputs.json
+GridFiles=True
+
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                    -o data-hists.root -p 11" ),
+         ( "Offline",     " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ) ]
+
+Comp = [ ( "L2ele",              "L2electron",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "L2ele-lowpt",        "L2electronLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt " ),
+         ( "L2eleoffline",       "L2electron",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "L2eleoffline-lowpt", "L2electronLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt-offline " ),
+         ( "EFele",              "EFelectron",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "EFele-lowpt",        "EFelectronLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt " ),
+         ( "EFeleoffline",       "EFelectron",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ),
+         ( "EFeleoffline-lowpt", "EFelectronLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt-offline " ) ]
+
+
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_old.py
new file mode 100755
index 000000000000..82997b99273f
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_old.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python
+
+# art-description: art job for el_zee_pu40
+# art-type: grid
+# art-include: master/Athena
+# art-input: mc15_13TeV.361106.PowhegPythia8EvtGen_AZNLOCTEQ6L1_Zee.recon.RDO.e3601_s2665_s2183_r7191
+# art-input-nfiles: 8
+# art-athena-mt: 8
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+from TrigValTools.TrigValSteering import Test, CheckSteps
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+
+import sys,getopt
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
+except getopt.GetoptError:
+    print("Usage:  ")
+    print("-l(--local)    run locally with input file from art eos grid-input")
+    print("-x             don't run athena or post post-processing, only plotting")
+    print("-p             run post-processing, even if -x is set")
+
+
+local=False
+exclude=False
+postproc=False
+for opt,arg in opts:
+    if opt in ("-l", "--local"):
+        local=True
+    if opt=="-x":
+        exclude=True
+    if opt=="-p":
+        postproc=True
+
+
+rdo2aod = TrigInDetReco()
+rdo2aod.slices = ['electron']
+rdo2aod.max_events = 16000 
+rdo2aod.threads = 8
+rdo2aod.concurrent_events = 8
+rdo2aod.perfmon = False
+rdo2aod.timeout = 18*3600
+if local:
+    rdo2aod.input = 'Zee_pu40'      # defined in TrigValTools/share/TrigValInputs.json  
+else:
+    rdo2aod.input = ''
+    rdo2aod.args += '--inputRDOFile=$ArtInFile '
+
+
+test = Test.Test()
+test.art_type = 'grid'
+if (not exclude):
+    test.exec_steps = [rdo2aod]
+    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
+    test.check_steps = CheckSteps.default_check_steps(test)
+
+ 
+# Run Tidardict
+if ((not exclude) or postproc ):
+    rdict = TrigInDetdictStep()
+    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 11 -b Test_bin.dat '
+    test.check_steps.append(rdict)
+    rdict2 = TrigInDetdictStep('TrigInDetDict2')
+    rdict2.args='TIDAdata-run3-offline.dat -r Offline  -f data-hists-offline.root -b Test_bin.dat '
+    test.check_steps.append(rdict2)
+
+ 
+# Now the comparitor steps
+comp=TrigInDetCompStep('Comp_L2ele','L2','electron')
+test.check_steps.append(comp)
+  
+comp2=TrigInDetCompStep('Comp_EFele','EF','electron')
+test.check_steps.append(comp2)
+
+comp3=TrigInDetCompStep('Comp_L2eleLowpt','L2','electron',lowpt=True)
+test.check_steps.append(comp3)
+
+comp4=TrigInDetCompStep('Comp_EFeleLowpt','EF','electron',lowpt=True)
+test.check_steps.append(comp4)
+
+comp5=TrigInDetCompStep('Comp_L2ele_off','L2','electron')
+comp5.type = 'offline'
+test.check_steps.append(comp5)
+  
+comp6=TrigInDetCompStep('Comp_EFele_off','EF','electron')
+comp6.type = 'offline'
+test.check_steps.append(comp6)
+
+comp7=TrigInDetCompStep('Comp_L2eleLowpt_off','L2','electron',lowpt=True)
+comp7.type = 'offline'
+test.check_steps.append(comp7)
+
+comp8=TrigInDetCompStep('Comp_EFeleLowpt_off','EF','electron',lowpt=True)
+comp8.type = 'offline'
+test.check_steps.append(comp8)
+
+# CPU cost steps
+cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
+test.check_steps.append(cpucost)
+
+cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
+test.check_steps.append(cpucost2)
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_short.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_short.py
index 067583cddad6..a98d8cffc2fd 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_short.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_short.py
@@ -27,99 +27,25 @@
 # art-output: *.dat 
 
 
-from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
-
-import sys,getopt
-
-try:
-    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
-except getopt.GetoptError:
-    print("Usage:  ")
-    print("-l(--local)    run locally with input file from art eos grid-input")
-    print("-x             don't run athena or post post-processing, only plotting")
-    print("-p             run post-processing, even if -x is set")
-
-
-local=False
-exclude=False
-postproc=False
-for opt,arg in opts:
-    if opt in ("-l", "--local"):
-        local=True
-    if opt=="-x":
-        exclude=True
-    if opt=="-p":
-        postproc=True
-
-
-rdo2aod = TrigInDetReco()
-rdo2aod.slices = ['electron']
-rdo2aod.max_events = 8000 
-rdo2aod.threads = 8
-rdo2aod.concurrent_events = 8
-rdo2aod.perfmon = False
-rdo2aod.timeout = 18*3600
-if local:
-    rdo2aod.input = 'Zee_pu40'      # defined in TrigValTools/share/TrigValInputs.json  
-else:
-    rdo2aod.input = ''
-    rdo2aod.args += '--inputRDOFile=$ArtInFile '
-
-
-test = Test.Test()
-test.art_type = 'grid'
-if (not exclude):
-    test.exec_steps = [rdo2aod]
-    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
-    test.check_steps = CheckSteps.default_check_steps(test)
-
- 
-# Run Tidardict
-if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep()
-    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 11 -b Test_bin.dat '
-    test.check_steps.append(rdict)
-    rdict2 = TrigInDetdictStep('TrigInDetDict2')
-    rdict2.args='TIDAdata-run3-offline.dat -r Offline  -f data-hists-offline.root -b Test_bin.dat '
-    test.check_steps.append(rdict2)
-
- 
-# Now the comparitor steps
-comp=TrigInDetCompStep('Comp_L2ele','L2','electron')
-test.check_steps.append(comp)
-  
-comp2=TrigInDetCompStep('Comp_EFele','EF','electron')
-test.check_steps.append(comp2)
-
-comp3=TrigInDetCompStep('Comp_L2eleLowpt','L2','electron',lowpt=True)
-test.check_steps.append(comp3)
-
-comp4=TrigInDetCompStep('Comp_EFeleLowpt','EF','electron',lowpt=True)
-test.check_steps.append(comp4)
-
-comp5=TrigInDetCompStep('Comp_L2ele_off','L2','electron')
-comp5.type = 'offline'
-test.check_steps.append(comp5)
-  
-comp6=TrigInDetCompStep('Comp_EFele_off','EF','electron')
-comp6.type = 'offline'
-test.check_steps.append(comp6)
-
-comp7=TrigInDetCompStep('Comp_L2eleLowpt_off','L2','electron',lowpt=True)
-comp7.type = 'offline'
-test.check_steps.append(comp7)
-
-comp8=TrigInDetCompStep('Comp_EFeleLowpt_off','EF','electron',lowpt=True)
-comp8.type = 'offline'
-test.check_steps.append(comp8)
-
-# CPU cost steps
-cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
-test.check_steps.append(cpucost)
-
-cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
-test.check_steps.append(cpucost2)
-
-import sys
-sys.exit(test.run())
+Slices  = ['electron']
+Events  = 8000
+Threads = 8 
+Slots   = 8
+Input   = 'Zee_pu40'    # defined in TrigValTools/share/TrigValInputs.json
+GridFiles=True
+
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                    -o data-hists.root -p 11" ),
+         ( "Offline",     " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ) ]
+
+Comp = [ ( "L2ele",              "L2electron",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "L2ele-lowpt",        "L2electronLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt " ),
+         ( "L2eleoffline",       "L2electron",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "L2eleoffline-lowpt", "L2electronLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt-offline " ),
+         ( "EFele",              "EFelectron",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "EFele-lowpt",        "EFelectronLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt " ),
+         ( "EFeleoffline",       "EFelectron",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ),
+         ( "EFeleoffline-lowpt", "EFelectronLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt-offline " ) ]
+
+
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_short_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_short_old.py
new file mode 100755
index 000000000000..b7b997ecba6e
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_short_old.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python
+
+# art-description: art job for el_zee_pu40_short
+# art-type: grid
+# art-include: master/Athena
+# art-input: mc15_13TeV.361106.PowhegPythia8EvtGen_AZNLOCTEQ6L1_Zee.recon.RDO.e3601_s2665_s2183_r7191
+# art-input-nfiles: 8
+# art-athena-mt: 8
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+from TrigValTools.TrigValSteering import Test, CheckSteps
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+
+import sys,getopt
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
+except getopt.GetoptError:
+    print("Usage:  ")
+    print("-l(--local)    run locally with input file from art eos grid-input")
+    print("-x             don't run athena or post post-processing, only plotting")
+    print("-p             run post-processing, even if -x is set")
+
+
+local=False
+exclude=False
+postproc=False
+for opt,arg in opts:
+    if opt in ("-l", "--local"):
+        local=True
+    if opt=="-x":
+        exclude=True
+    if opt=="-p":
+        postproc=True
+
+
+rdo2aod = TrigInDetReco()
+rdo2aod.slices = ['electron']
+rdo2aod.max_events = 8000 
+rdo2aod.threads = 8
+rdo2aod.concurrent_events = 8
+rdo2aod.perfmon = False
+rdo2aod.timeout = 18*3600
+if local:
+    rdo2aod.input = 'Zee_pu40'      # defined in TrigValTools/share/TrigValInputs.json  
+else:
+    rdo2aod.input = ''
+    rdo2aod.args += '--inputRDOFile=$ArtInFile '
+
+
+test = Test.Test()
+test.art_type = 'grid'
+if (not exclude):
+    test.exec_steps = [rdo2aod]
+    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
+    test.check_steps = CheckSteps.default_check_steps(test)
+
+ 
+# Run Tidardict
+if ((not exclude) or postproc ):
+    rdict = TrigInDetdictStep()
+    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 11 -b Test_bin.dat '
+    test.check_steps.append(rdict)
+    rdict2 = TrigInDetdictStep('TrigInDetDict2')
+    rdict2.args='TIDAdata-run3-offline.dat -r Offline  -f data-hists-offline.root -b Test_bin.dat '
+    test.check_steps.append(rdict2)
+
+ 
+# Now the comparitor steps
+comp=TrigInDetCompStep('Comp_L2ele','L2','electron')
+test.check_steps.append(comp)
+  
+comp2=TrigInDetCompStep('Comp_EFele','EF','electron')
+test.check_steps.append(comp2)
+
+comp3=TrigInDetCompStep('Comp_L2eleLowpt','L2','electron',lowpt=True)
+test.check_steps.append(comp3)
+
+comp4=TrigInDetCompStep('Comp_EFeleLowpt','EF','electron',lowpt=True)
+test.check_steps.append(comp4)
+
+comp5=TrigInDetCompStep('Comp_L2ele_off','L2','electron')
+comp5.type = 'offline'
+test.check_steps.append(comp5)
+  
+comp6=TrigInDetCompStep('Comp_EFele_off','EF','electron')
+comp6.type = 'offline'
+test.check_steps.append(comp6)
+
+comp7=TrigInDetCompStep('Comp_L2eleLowpt_off','L2','electron',lowpt=True)
+comp7.type = 'offline'
+test.check_steps.append(comp7)
+
+comp8=TrigInDetCompStep('Comp_EFeleLowpt_off','EF','electron',lowpt=True)
+comp8.type = 'offline'
+test.check_steps.append(comp8)
+
+# CPU cost steps
+cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
+test.check_steps.append(cpucost)
+
+cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
+test.check_steps.append(cpucost2)
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_st.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_st.py
index a219260c5283..829ea474af30 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_st.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_st.py
@@ -27,99 +27,25 @@
 # art-output: *.dat 
 
 
-from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
-
-import sys,getopt
-
-try:
-    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
-except getopt.GetoptError:
-    print("Usage:  ")
-    print("-l(--local)    run locally with input file from art eos grid-input")
-    print("-x             don't run athena or post post-processing, only plotting")
-    print("-p             run post-processing, even if -x is set")
-
-
-local=False
-exclude=False
-postproc=False
-for opt,arg in opts:
-    if opt in ("-l", "--local"):
-        local=True
-    if opt=="-x":
-        exclude=True
-    if opt=="-p":
-        postproc=True
-
-
-rdo2aod = TrigInDetReco()
-rdo2aod.slices = ['electron']
-rdo2aod.max_events = 8000 
-rdo2aod.threads = 1 # TODO: change to 4
-rdo2aod.concurrent_events = 1 # TODO: change to 4
-rdo2aod.perfmon = False
-rdo2aod.timeout = 18*3600
-if local:
-    rdo2aod.input = 'Zee_pu40'      # defined in TrigValTools/share/TrigValInputs.json  
-else:
-    rdo2aod.input = ''
-    rdo2aod.args += '--inputRDOFile=$ArtInFile '
-
-
-test = Test.Test()
-test.art_type = 'grid'
-if (not exclude):
-    test.exec_steps = [rdo2aod]
-    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
-    test.check_steps = CheckSteps.default_check_steps(test)
-
- 
-# Run Tidardict
-if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep()
-    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 11 -b Test_bin.dat '
-    test.check_steps.append(rdict)
-    rdict2 = TrigInDetdictStep('TrigInDetDict2')
-    rdict2.args='TIDAdata-run3-offline.dat -r Offline  -f data-hists-offline.root -b Test_bin.dat '
-    test.check_steps.append(rdict2)
-
- 
-# Now the comparitor steps
-comp=TrigInDetCompStep('Comp_L2ele','L2','electron')
-test.check_steps.append(comp)
-  
-comp2=TrigInDetCompStep('Comp_EFele','EF','electron')
-test.check_steps.append(comp2)
-
-comp3=TrigInDetCompStep('Comp_L2eleLowpt','L2','electron',lowpt=True)
-test.check_steps.append(comp3)
-
-comp4=TrigInDetCompStep('Comp_EFeleLowpt','EF','electron',lowpt=True)
-test.check_steps.append(comp4)
-
-comp5=TrigInDetCompStep('Comp_L2ele_off','L2','electron')
-comp5.type = 'offline'
-test.check_steps.append(comp5)
-  
-comp6=TrigInDetCompStep('Comp_EFele_off','EF','electron')
-comp6.type = 'offline'
-test.check_steps.append(comp6)
-
-comp7=TrigInDetCompStep('Comp_L2eleLowpt_off','L2','electron',lowpt=True)
-comp7.type = 'offline'
-test.check_steps.append(comp7)
-
-comp8=TrigInDetCompStep('Comp_EFeleLowpt_off','EF','electron',lowpt=True)
-comp8.type = 'offline'
-test.check_steps.append(comp8)
-
-# CPU cost steps
-cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
-test.check_steps.append(cpucost)
-
-cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
-test.check_steps.append(cpucost2)
-
-import sys
-sys.exit(test.run())
+Slices  = ['electron']
+Events  = 8000
+Threads = 1 
+Slots   = 1
+Input   = 'Zee_pu40'    # defined in TrigValTools/share/TrigValInputs.json
+GridFiles=True
+
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                    -o data-hists.root -p 11" ),
+         ( "Offline",     " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ) ]
+
+Comp = [ ( "L2ele",              "L2electron",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "L2ele-lowpt",        "L2electronLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt " ),
+         ( "L2eleoffline",       "L2electron",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "L2eleoffline-lowpt", "L2electronLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt-offline " ),
+         ( "EFele",              "EFelectron",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "EFele-lowpt",        "EFelectronLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt " ),
+         ( "EFeleoffline",       "EFelectron",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ),
+         ( "EFeleoffline-lowpt", "EFelectronLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt-offline " ) ]
+
+
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_st_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_st_old.py
new file mode 100755
index 000000000000..23ec19ec16f2
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_st_old.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python
+
+# art-description: art job for el_zee_pu40_st
+# art-type: grid
+# art-include: master/Athena
+# art-input: mc15_13TeV.361106.PowhegPythia8EvtGen_AZNLOCTEQ6L1_Zee.recon.RDO.e3601_s2665_s2183_r7191
+# art-input-nfiles: 8
+# art-athena-mt: 4
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+from TrigValTools.TrigValSteering import Test, CheckSteps
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+
+import sys,getopt
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
+except getopt.GetoptError:
+    print("Usage:  ")
+    print("-l(--local)    run locally with input file from art eos grid-input")
+    print("-x             don't run athena or post post-processing, only plotting")
+    print("-p             run post-processing, even if -x is set")
+
+
+local=False
+exclude=False
+postproc=False
+for opt,arg in opts:
+    if opt in ("-l", "--local"):
+        local=True
+    if opt=="-x":
+        exclude=True
+    if opt=="-p":
+        postproc=True
+
+
+rdo2aod = TrigInDetReco()
+rdo2aod.slices = ['electron']
+rdo2aod.max_events = 8000 
+rdo2aod.threads = 1 # TODO: change to 4
+rdo2aod.concurrent_events = 1 # TODO: change to 4
+rdo2aod.perfmon = False
+rdo2aod.timeout = 18*3600
+if local:
+    rdo2aod.input = 'Zee_pu40'      # defined in TrigValTools/share/TrigValInputs.json  
+else:
+    rdo2aod.input = ''
+    rdo2aod.args += '--inputRDOFile=$ArtInFile '
+
+
+test = Test.Test()
+test.art_type = 'grid'
+if (not exclude):
+    test.exec_steps = [rdo2aod]
+    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
+    test.check_steps = CheckSteps.default_check_steps(test)
+
+ 
+# Run Tidardict
+if ((not exclude) or postproc ):
+    rdict = TrigInDetdictStep()
+    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 11 -b Test_bin.dat '
+    test.check_steps.append(rdict)
+    rdict2 = TrigInDetdictStep('TrigInDetDict2')
+    rdict2.args='TIDAdata-run3-offline.dat -r Offline  -f data-hists-offline.root -b Test_bin.dat '
+    test.check_steps.append(rdict2)
+
+ 
+# Now the comparitor steps
+comp=TrigInDetCompStep('Comp_L2ele','L2','electron')
+test.check_steps.append(comp)
+  
+comp2=TrigInDetCompStep('Comp_EFele','EF','electron')
+test.check_steps.append(comp2)
+
+comp3=TrigInDetCompStep('Comp_L2eleLowpt','L2','electron',lowpt=True)
+test.check_steps.append(comp3)
+
+comp4=TrigInDetCompStep('Comp_EFeleLowpt','EF','electron',lowpt=True)
+test.check_steps.append(comp4)
+
+comp5=TrigInDetCompStep('Comp_L2ele_off','L2','electron')
+comp5.type = 'offline'
+test.check_steps.append(comp5)
+  
+comp6=TrigInDetCompStep('Comp_EFele_off','EF','electron')
+comp6.type = 'offline'
+test.check_steps.append(comp6)
+
+comp7=TrigInDetCompStep('Comp_L2eleLowpt_off','L2','electron',lowpt=True)
+comp7.type = 'offline'
+test.check_steps.append(comp7)
+
+comp8=TrigInDetCompStep('Comp_EFeleLowpt_off','EF','electron',lowpt=True)
+comp8.type = 'offline'
+test.check_steps.append(comp8)
+
+# CPU cost steps
+cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
+test.check_steps.append(cpucost)
+
+cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
+test.check_steps.append(cpucost2)
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_ml_pu40.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_ml_pu40.py
index f2f3774b7bdc..49fd0d57815e 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_ml_pu40.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_ml_pu40.py
@@ -27,7 +27,6 @@
 
 
 Slices  = ['fsjet']
-RunEF   = False
 Events  = 2000 
 Threads = 1 
 Slots   = 1 # what about the mt: 4 art directive ? nfiles: 3 ?
@@ -35,7 +34,14 @@ Input   = 'ttbar'    # defined in TrigValTools/share/TrigValInputs.json
 
 postinclude_file = 'TIDAml_extensions.py'
 
-TrackReference = [ 'Truth', 'Offline' ]
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                        -o data-hists.root" ),
+         ( "Offline",     " TIDAdata-run3-offline.dat     -r Offline -o data-hists-offline.root" ),
+         ( "OfflineVtx",  " TIDAdata-run3-offline-vtx.dat -r Offline -o data-hists-offline-vtx.root" ) ]
+
+Comp = [ ( "FSjet",        "L2fsjet",     "data-hists.root",              " -c TIDAhisto-panel.dat      -d HLTL2-plots " ),
+         ( "FSjetoffline", "L2fsjet",     "data-hists-offline.root",      " -c TIDAhisto-panel.dat      -d HLTL2-plots-offline " ),
+         ( "FSvtx",        "L2fsjetvtx",  "data-hists-offline-vtx.root",  " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtx     --ncols 3" ),
+         ( "FSvtxall",     "L2fsjetvtx",  "data-hists-offline.root",      " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtxall  --ncols 3" ) ]
 
 
 from AthenaCommon.Include import include 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_ml_pu40_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_ml_pu40_old.py
new file mode 100755
index 000000000000..c7d0df17463a
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_ml_pu40_old.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python
+
+# art-description: art job for fsjet_ml_pu40
+# art-type: grid
+# art-include: master/Athena
+# art-input-nfiles: 3
+# art-athena-mt: 4
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+Slices  = ['fsjet']
+RunEF   = False
+Events  = 2000 
+Threads = 1 
+Slots   = 1 # what about the mt: 4 art directive ? nfiles: 3 ?
+Input   = 'ttbar'    # defined in TrigValTools/share/TrigValInputs.json  
+
+postinclude_file = 'TIDAml_extensions.py'
+
+TrackReference = [ 'Truth', 'Offline' ]
+
+
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_OldBase.py")
+
+
+ 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_nopps_pu40.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_nopps_pu40.py
index bed747938cc0..239bfe93dbb4 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_nopps_pu40.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_nopps_pu40.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 
-# art-description: art job for fsjet_pu40_new
+# art-description: art job for fsjet_nopps_pu40
 # art-type: grid
 # art-include: master/Athena
 # art-input-nfiles: 3
@@ -30,16 +30,15 @@ os.system("echo 'ftf = findAlgorithm(topSequence, \"TrigFastTrackFinder__jet\")'
 os.system("echo 'ftf.TripletDoPPS=False' >> dopps.py")
 
 Slices  = ['fsjet']
-RunEF   = False
 Events  = 2000 
 Threads = 8 
 Slots   = 8
 postinclude_file = 'dopps.py'
 Input   = 'ttbar'    # defined in TrigValTools/share/TrigValInputs.json  
 
-Jobs = [ ( "Truth",       " TIDAdata-run3.dat              -o data-hists.root" ), 
-         ( "Offline",     " TIDAdata-run3-offline.dat      -o data-hists-offline.root" ),
-         ( "OfflineVtx",  " TIDAdata-run3-offline-vtx.dat  -o data-hists-offline-vtx.root" ) ]
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                        -o data-hists.root" ), 
+         ( "Offline",     " TIDAdata-run3-offline.dat     -r Offline -o data-hists-offline.root" ),
+         ( "OfflineVtx",  " TIDAdata-run3-offline-vtx.dat -r Offline -o data-hists-offline-vtx.root" ) ]
 
 
 Comp = [ ( "FSjet",        "L2fsjet",     "data-hists.root",              " -c TIDAhisto-panel.dat      -d HLTL2-plots " ),
@@ -49,7 +48,7 @@ Comp = [ ( "FSjet",        "L2fsjet",     "data-hists.root",              " -c T
 
 
 from AthenaCommon.Include import include 
-include("TrigInDetValidation/TrigInDetValidation_NewBase.py")
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
 
 
  
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40.py
index 7906c655c024..c350cca4608f 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40.py
@@ -27,13 +27,20 @@
 
 
 Slices  = ['fsjet']
-RunEF   = False
 Events  = 2000 
 Threads = 8 
 Slots   = 8
 Input   = 'ttbar'    # defined in TrigValTools/share/TrigValInputs.json  
 
-TrackReference = [ 'Truth', 'Offline' ]
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                        -o data-hists.root" ), 
+         ( "Offline",     " TIDAdata-run3-offline.dat     -r Offline -o data-hists-offline.root" ),
+         ( "OfflineVtx",  " TIDAdata-run3-offline-vtx.dat -r Offline -o data-hists-offline-vtx.root" ) ]
+
+
+Comp = [ ( "FSjet",        "L2fsjet",     "data-hists.root",              " -c TIDAhisto-panel.dat      -d HLTL2-plots " ),
+         ( "FSjetoffline", "L2fsjet",     "data-hists-offline.root",      " -c TIDAhisto-panel.dat      -d HLTL2-plots-offline " ),
+         ( "FSvtx",        "L2fsjetvtx",  "data-hists-offline-vtx.root",  " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtx     --ncols 3" ),
+         ( "FSvtxall",     "L2fsjetvtx",  "data-hists-offline.root",      " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtxall  --ncols 3" ) ]
 
 
 from AthenaCommon.Include import include 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40_new.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40_new.py
deleted file mode 100755
index 0e0eb8d1d459..000000000000
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40_new.py
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/usr/bin/env python
-
-# art-description: art job for fsjet_pu40_new
-# art-type: grid
-# art-include: master/Athena
-# art-input-nfiles: 3
-# art-athena-mt: 8
-# art-memory: 4096
-# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
-# art-output: *.txt
-# art-output: *.log
-# art-output: log.*
-# art-output: *.out
-# art-output: *.err
-# art-output: *.log.tar.gz
-# art-output: *.new
-# art-output: *.json
-# art-output: *.root
-# art-output: *.check*
-# art-output: HLT*
-# art-output: times*
-# art-output: cost-perCall
-# art-output: cost-perEvent
-# art-output: cost-perCall-chain
-# art-output: cost-perEvent-chain
-# art-output: *.dat 
-
-
-Slices  = ['fsjet']
-RunEF   = False
-Events  = 2000 
-Threads = 8 
-Slots   = 8
-Input   = 'ttbar'    # defined in TrigValTools/share/TrigValInputs.json  
-
-Jobs = [ ( "Truth",       " TIDAdata-run3.dat              -o data-hists.root" ), 
-         ( "Offline",     " TIDAdata-run3-offline.dat      -o data-hists-offline.root" ),
-         ( "OfflineVtx",  " TIDAdata-run3-offline-vtx.dat  -o data-hists-offline-vtx.root" ) ]
-
-
-Comp = [ ( "FSjet",        "L2fsjet",     "data-hists.root",              " -c TIDAhisto-panel.dat      -d HLTL2-plots " ),
-         ( "FSjetoffline", "L2fsjet",     "data-hists-offline.root",      " -c TIDAhisto-panel.dat      -d HLTL2-plots-offline " ),
-         ( "FSvtx",        "L2fsjetvtx",  "data-hists-offline-vtx.root",  " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtx     --ncols 3" ),
-         ( "FSvtxall",     "L2fsjetvtx",  "data-hists-offline.root",      " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtxall  --ncols 3" ) ]
-
-
-from AthenaCommon.Include import include 
-include("TrigInDetValidation/TrigInDetValidation_NewBase.py")
-
-
- 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40_old.py
new file mode 100755
index 000000000000..706271f7e055
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40_old.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+
+# art-description: art job for fsjet_pu40
+# art-type: grid
+# art-include: master/Athena
+# art-input-nfiles: 3
+# art-athena-mt: 8
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+Slices  = ['fsjet']
+RunEF   = False
+Events  = 2000 
+Threads = 8 
+Slots   = 8
+Input   = 'ttbar'    # defined in TrigValTools/share/TrigValInputs.json  
+
+TrackReference = [ 'Truth', 'Offline' ]
+
+
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_OldBase.py")
+
+
+ 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40_st.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40_st.py
index bded7eec2ff5..9a0b6137f8c2 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40_st.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40_st.py
@@ -27,13 +27,19 @@
 
 
 Slices  = ['fsjet']
-RunEF   = False
 Events  = 2000 
 Threads = 1 
 Slots   = 1 # what about the mt: 4 art directive ? nfiles: 3 ?
 Input   = 'ttbar'    # defined in TrigValTools/share/TrigValInputs.json  
 
-TrackReference = [ 'Truth', 'Offline' ]
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                        -o data-hists.root" ),
+         ( "Offline",     " TIDAdata-run3-offline.dat     -r Offline -o data-hists-offline.root" ),
+         ( "OfflineVtx",  " TIDAdata-run3-offline-vtx.dat -r Offline -o data-hists-offline-vtx.root" ) ]
+
+Comp = [ ( "FSjet",        "L2fsjet",     "data-hists.root",              " -c TIDAhisto-panel.dat      -d HLTL2-plots " ),
+         ( "FSjetoffline", "L2fsjet",     "data-hists-offline.root",      " -c TIDAhisto-panel.dat      -d HLTL2-plots-offline " ),
+         ( "FSvtx",        "L2fsjetvtx",  "data-hists-offline-vtx.root",  " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtx     --ncols 3" ),
+         ( "FSvtxall",     "L2fsjetvtx",  "data-hists-offline.root",      " -c TIDAhisto-panel-vtx.dat  -d HLTL2-plots-vtxall  --ncols 3" ) ]
 
 
 from AthenaCommon.Include import include 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40_st_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40_st_old.py
new file mode 100755
index 000000000000..eaac4d29a2ba
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_fsjet_pu40_st_old.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+
+# art-description: art job for fsjet_pu40_st
+# art-type: grid
+# art-include: master/Athena
+# art-input-nfiles: 3
+# art-athena-mt: 4
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+Slices  = ['fsjet']
+RunEF   = False
+Events  = 2000 
+Threads = 1 
+Slots   = 1 # what about the mt: 4 art directive ? nfiles: 3 ?
+Input   = 'ttbar'    # defined in TrigValTools/share/TrigValInputs.json  
+
+TrackReference = [ 'Truth', 'Offline' ]
+
+
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_OldBase.py")
+
+
+ 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_minbias.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_minbias.py
index 29c48f98f889..65289fc30f95 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_minbias.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_minbias.py
@@ -28,13 +28,16 @@
 
 
 Slices  = ['minbias']
-RunEF   = False
 Events  = 8000 
 Threads = 8 
 Slots   = 8
 Input   = 'minbias'    # defined in TrigValTools/share/TrigValInputs.json  
 
-TrackReference = [ 'Truth', 'Offline' ]
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                    -o data-hists.root" ),
+         ( "Offline",     " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ) ]
+
+Comp = [ ( "L2minbias",        "L2minbias", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "L2minbiasoffline", "L2minbias", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ) ]
 
 
 from AthenaCommon.Include import include 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_minbias_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_minbias_old.py
new file mode 100755
index 000000000000..ed5c049f98d0
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_minbias_old.py
@@ -0,0 +1,44 @@
+#!/usr/bin/env python
+
+
+# art-description: art job for minbias
+# art-type: grid
+# art-include: master/Athena
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-athena-nfiles: 4
+# art-athena-mt: 8
+# art-memory: 4096
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+Slices  = ['minbias']
+RunEF   = False
+Events  = 8000 
+Threads = 8 
+Slots   = 8
+Input   = 'minbias'    # defined in TrigValTools/share/TrigValInputs.json  
+
+TrackReference = [ 'Truth', 'Offline' ]
+
+
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_OldBase.py")
+
+
+ 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_bphys.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_bphys.py
index c3fd1df819ee..932606d97b49 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_bphys.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_bphys.py
@@ -25,94 +25,27 @@
 # art-output: *.dat 
 
 
-from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+Slices  = ['muon']
+Events  = 6000 
+Threads = 8 
+Slots   = 8
+Input   = 'Bphys_JpsiPhi'    # defined in TrigValTools/share/TrigValInputs.json
 
-import sys,getopt
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                    -o data-hists.root -p 13" ),
+         ( "Offline",     " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ) ]
 
-try:
-    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
-except getopt.GetoptError:
-    print("Usage:  ")
-    print("-l(--local)    run locally with input file from art eos grid-input")
-    print("-x             don't run athena or post post-processing, only plotting")
-    print("-p             run post-processing, even if -x is set")
+Comp = [ ( "L2muon",              "L2muon",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "L2muon-lowpt",        "L2muonLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt " ),
+         ( "L2muonoffline",       "L2muon",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "L2muonoffline-lowpt", "L2muonLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt-offline " ),
+         ( "EFmuon",              "EFmuon",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "EFmuon-lowpt",        "EFmuonLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt " ),
+         ( "EFmuonoffline",       "EFmuon",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ),
+         ( "EFmuonoffline-lowpt", "EFmuonLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt-offline " ) ]
 
 
-local=False
-exclude=False
-postproc=False
-for opt,arg in opts:
-    if opt in ("-l", "--local"):
-        local=True
-    if opt=="-x":
-        exclude=True
-    if opt=="-p":
-        postproc=True
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
 
 
-rdo2aod = TrigInDetReco()
-rdo2aod.slices = ['muon']
-rdo2aod.max_events = 6000 
-rdo2aod.threads = 8
-rdo2aod.concurrent_events = 8
-rdo2aod.perfmon = False
-rdo2aod.timeout = 18*3600
-rdo2aod.input = 'Bphys_JpsiPhi'    # defined in TrigValTools/share/TrigValInputs.json  
-
-test = Test.Test()
-test.art_type = 'grid'
-if (not exclude):
-    test.exec_steps = [rdo2aod]
-    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
-    test.check_steps = CheckSteps.default_check_steps(test)
-
  
-# Run Tidardict
-if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep()
-    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 13 -b Test_bin.dat '
-    test.check_steps.append(rdict)
-    rdict2 = TrigInDetdictStep('TrigInDetDict2')
-    rdict2.args='TIDAdata-run3-offline.dat -r Offline  -f data-hists-offline.root -b Test_bin.dat '
-    test.check_steps.append(rdict2)
-
- 
-# Now the comparitor steps
-comp=TrigInDetCompStep('Comp_L2muon','L2','muon')
-test.check_steps.append(comp)
-  
-comp2=TrigInDetCompStep('Comp_EFmuon','EF','muon')
-test.check_steps.append(comp2)
-
-comp3=TrigInDetCompStep('Comp_L2muonLowpt','L2','muon',lowpt=True)
-test.check_steps.append(comp3)
-  
-comp4=TrigInDetCompStep('Comp_EFmuonLowpt','EF','muon',lowpt=True)
-test.check_steps.append(comp4)
-
-comp5=TrigInDetCompStep('Comp_L2muon_off','L2','muon')
-comp5.type = 'offline'
-test.check_steps.append(comp5)
-  
-comp6=TrigInDetCompStep('Comp_EFmuon_off','EF','muon')
-comp6.type = 'offline'
-test.check_steps.append(comp6)
-
-comp7=TrigInDetCompStep('Comp_L2muonLowpt_off','L2','muon',lowpt=True)
-comp7.type = 'offline'
-test.check_steps.append(comp7)
-  
-comp8=TrigInDetCompStep('Comp_EFmuonLowpt_off','EF','muon',lowpt=True)
-comp8.type = 'offline'
-test.check_steps.append(comp8)
-
-# CPU cost steps
-cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
-test.check_steps.append(cpucost)
-
-cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
-test.check_steps.append(cpucost2)
-
-import sys
-sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_mt-old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_bphys_old.py
similarity index 74%
rename from Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_mt-old.py
rename to Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_bphys_old.py
index 59d3c9157039..81e88a51941f 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_mt-old.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_bphys_old.py
@@ -1,11 +1,9 @@
 #!/usr/bin/env python
 
-# art-description: art job for mu_Zmumu_pu40_mt-old
+# art-description: art job for mu_bphys
 # art-type: grid
 # art-include: master/Athena
-# art-input: mc15_13TeV.361107.PowhegPythia8EvtGen_AZNLOCTEQ6L1_Zmumu.recon.RDO.e3601_s2576_s2132_r7143
-# art-input-nfiles: 4
-# art-athena-mt: 4
+# art-athena-mt: 8
 # art-memory: 4096
 # art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
 # art-output: *.txt
@@ -28,7 +26,7 @@
 
 
 from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
 
 import sys,getopt
 
@@ -55,17 +53,12 @@ for opt,arg in opts:
 
 rdo2aod = TrigInDetReco()
 rdo2aod.slices = ['muon']
-rdo2aod.max_events = 8000 
-rdo2aod.threads = 4
-rdo2aod.concurrent_events = 4
+rdo2aod.max_events = 6000 
+rdo2aod.threads = 8
+rdo2aod.concurrent_events = 8
 rdo2aod.perfmon = False
 rdo2aod.timeout = 18*3600
-if local:
-    rdo2aod.input = 'Zmumu_pu40'    # defined in TrigValTools/share/TrigValInputs.json  
-else:
-    rdo2aod.input = ''
-    rdo2aod.args += '--inputRDOFile=$ArtInFile '
-
+rdo2aod.input = 'Bphys_JpsiPhi'    # defined in TrigValTools/share/TrigValInputs.json  
 
 test = Test.Test()
 test.art_type = 'grid'
@@ -77,7 +70,7 @@ if (not exclude):
  
 # Run Tidardict
 if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep('TrigInDetDict')
+    rdict = TrigInDetdictStep()
     rdict.args='TIDAdata-run3.dat -f data-hists.root -p 13 -b Test_bin.dat '
     test.check_steps.append(rdict)
     rdict2 = TrigInDetdictStep('TrigInDetDict2')
@@ -92,18 +85,18 @@ test.check_steps.append(comp)
 comp2=TrigInDetCompStep('Comp_EFmuon','EF','muon')
 test.check_steps.append(comp2)
 
-comp3=TrigInDetCompStep('Comp_L2muon_off','L2','muon')
-comp3.type = 'offline'
+comp3=TrigInDetCompStep('Comp_L2muonLowpt','L2','muon',lowpt=True)
 test.check_steps.append(comp3)
-
-comp4=TrigInDetCompStep('Comp_EFmuon_off','EF','muon')
-comp4.type = 'offline'
+  
+comp4=TrigInDetCompStep('Comp_EFmuonLowpt','EF','muon',lowpt=True)
 test.check_steps.append(comp4)
 
-comp5=TrigInDetCompStep('Comp_L2muonLowpt','L2','muon',lowpt=True)
+comp5=TrigInDetCompStep('Comp_L2muon_off','L2','muon')
+comp5.type = 'offline'
 test.check_steps.append(comp5)
   
-comp6=TrigInDetCompStep('Comp_EFmuonLowpt','EF','muon',lowpt=True)
+comp6=TrigInDetCompStep('Comp_EFmuon_off','EF','muon')
+comp6.type = 'offline'
 test.check_steps.append(comp6)
 
 comp7=TrigInDetCompStep('Comp_L2muonLowpt_off','L2','muon',lowpt=True)
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_singlemu_larged0.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_singlemu_larged0.py
index 3fe507c6da70..79a90f3c2721 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_singlemu_larged0.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_singlemu_larged0.py
@@ -1,9 +1,9 @@
 #!/usr/bin/env python
 
-# art-description: art job for mu_singlemu_larged0_pu
+# art-description: art job for mu_singlemu_larged0
 # art-type: grid
 # art-include: master/Athena
-# art-input: mc15_13TeV.107237.ParticleGenerator_mu_Pt4to100_vertxy20.recon.RDO.e3603_s2726_r7772
+# art-input: mc15_13TeV.107237.ParticleGenerator_mu_Pt4to100_vertxy20.recon.RDO.e3603_s2726_r7728
 # art-input-nfiles: 10
 # art-athena-mt: 8
 # art-memory: 4096
@@ -27,99 +27,28 @@
 # art-output: *.dat 
 
 
-from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+Slices  = ['muon']
+Events  = 20000 
+Threads = 8 
+Slots   = 8
+Input   = 'Single_mu_larged0'    # defined in TrigValTools/share/TrigValInputs.json
+GridFiles=True
 
-import sys,getopt
+Jobs = [ ( "Truth",       " TIDAdata-run3-larged0.dat                    -o data-hists.root -p 13",   "Test_bin_larged0.dat" ),
+         ( "Offline",     " TIDAdata-run3-offline-larged0.dat -r Offline -o data-hists-offline.root", "Test_bin_larged0.dat" ) ]
 
-try:
-    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
-except getopt.GetoptError:
-    print("Usage:  ")
-    print("-l(--local)    run locally with input file from art eos grid-input")
-    print("-x             don't run athena or post post-processing, only plotting")
-    print("-p             run post-processing, even if -x is set")
+Comp = [ ( "L2muon",              "L2muon",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "L2muon-lowpt",        "L2muonLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt " ),
+         ( "L2muonoffline",       "L2muon",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "L2muonoffline-lowpt", "L2muonLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt-offline " ),
+         ( "EFmuon",              "EFmuon",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "EFmuon-lowpt",        "EFmuonLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt " ),
+         ( "EFmuonoffline",       "EFmuon",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ),
+         ( "EFmuonoffline-lowpt", "EFmuonLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt-offline " ) ]
 
 
-local=False
-exclude=False
-postproc=False
-for opt,arg in opts:
-    if opt in ("-l", "--local"):
-        local=True
-    if opt=="-x":
-        exclude=True
-    if opt=="-p":
-        postproc=True
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
 
 
-rdo2aod = TrigInDetReco()
-rdo2aod.slices = ['muon']
-rdo2aod.max_events = 20000 
-rdo2aod.threads = 8
-rdo2aod.concurrent_events = 8
-rdo2aod.perfmon = False
-rdo2aod.timeout = 18*3600
-if local:
-    rdo2aod.input = 'Single_mu_larged0_pu'    # defined in TrigValTools/share/TrigValInputs.json  
-else:
-    rdo2aod.input = ''
-    rdo2aod.args += '--inputRDOFile=$ArtInFile '
-
-
-test = Test.Test()
-test.art_type = 'grid'
-if (not exclude):
-    test.exec_steps = [rdo2aod]
-    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
-    test.check_steps = CheckSteps.default_check_steps(test)
-
  
-# Run Tidardict
-if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep()
-    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 13 -b Test_bin.dat '
-    test.check_steps.append(rdict)
-    rdict2 = TrigInDetdictStep('TrigInDetDict2')
-    rdict2.args='TIDAdata-run3-offline.dat -r Offline  -f data-hists-offline.root -b Test_bin.dat '
-    test.check_steps.append(rdict2)
-
- 
-# Now the comparitor steps
-comp=TrigInDetCompStep('Comp_L2muon','L2','muon')
-test.check_steps.append(comp)
-  
-comp2=TrigInDetCompStep('Comp_EFmuon','EF','muon')
-test.check_steps.append(comp2)
-
-comp3=TrigInDetCompStep('Comp_L2muonLowpt','L2','muon',lowpt=True)
-test.check_steps.append(comp3)
-  
-comp4=TrigInDetCompStep('Comp_EFmuonLowpt','EF','muon',lowpt=True)
-test.check_steps.append(comp4)
-
-comp5=TrigInDetCompStep('Comp_L2muon_off','L2','muon')
-comp5.type = 'offline'
-test.check_steps.append(comp5)
-  
-comp6=TrigInDetCompStep('Comp_EFmuon_off','EF','muon')
-comp6.type = 'offline'
-test.check_steps.append(comp6)
-
-comp7=TrigInDetCompStep('Comp_L2muonLowpt_off','L2','muon',lowpt=True)
-comp7.type = 'offline'
-test.check_steps.append(comp7)
-  
-comp8=TrigInDetCompStep('Comp_EFmuonLowpt_off','EF','muon',lowpt=True)
-comp8.type = 'offline'
-test.check_steps.append(comp8)
-
-# CPU cost steps
-cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
-test.check_steps.append(cpucost)
-
-cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
-test.check_steps.append(cpucost2)
-
-import sys
-sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_singlemu_larged0_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_singlemu_larged0_old.py
new file mode 100755
index 000000000000..ae3122782018
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_singlemu_larged0_old.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python
+
+# art-description: art job for mu_singlemu_larged0_pu
+# art-type: grid
+# art-include: master/Athena
+# art-input: mc15_13TeV.107237.ParticleGenerator_mu_Pt4to100_vertxy20.recon.RDO.e3603_s2726_r7772
+# art-input-nfiles: 10
+# art-athena-mt: 8
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+from TrigValTools.TrigValSteering import Test, CheckSteps
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+
+import sys,getopt
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
+except getopt.GetoptError:
+    print("Usage:  ")
+    print("-l(--local)    run locally with input file from art eos grid-input")
+    print("-x             don't run athena or post post-processing, only plotting")
+    print("-p             run post-processing, even if -x is set")
+
+
+local=False
+exclude=False
+postproc=False
+for opt,arg in opts:
+    if opt in ("-l", "--local"):
+        local=True
+    if opt=="-x":
+        exclude=True
+    if opt=="-p":
+        postproc=True
+
+
+rdo2aod = TrigInDetReco()
+rdo2aod.slices = ['muon']
+rdo2aod.max_events = 20000 
+rdo2aod.threads = 8
+rdo2aod.concurrent_events = 8
+rdo2aod.perfmon = False
+rdo2aod.timeout = 18*3600
+if local:
+    rdo2aod.input = 'Single_mu_larged0_pu'    # defined in TrigValTools/share/TrigValInputs.json  
+else:
+    rdo2aod.input = ''
+    rdo2aod.args += '--inputRDOFile=$ArtInFile '
+
+
+test = Test.Test()
+test.art_type = 'grid'
+if (not exclude):
+    test.exec_steps = [rdo2aod]
+    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
+    test.check_steps = CheckSteps.default_check_steps(test)
+
+ 
+# Run Tidardict
+if ((not exclude) or postproc ):
+    rdict = TrigInDetdictStep()
+    rdict.args='TIDAdata-run3-larged0.dat -f data-hists.root -p 13 -b Test_bin_larged0.dat '
+    test.check_steps.append(rdict)
+    rdict2 = TrigInDetdictStep('TrigInDetDict2')
+    rdict2.args='TIDAdata-run3-offline-larged0.dat -r Offline  -f data-hists-offline.root -b Test_bin_larged0.dat '
+    test.check_steps.append(rdict2)
+
+ 
+# Now the comparitor steps
+comp=TrigInDetCompStep('Comp_L2muon','L2','muon')
+test.check_steps.append(comp)
+  
+comp2=TrigInDetCompStep('Comp_EFmuon','EF','muon')
+test.check_steps.append(comp2)
+
+comp3=TrigInDetCompStep('Comp_L2muonLowpt','L2','muon',lowpt=True)
+test.check_steps.append(comp3)
+  
+comp4=TrigInDetCompStep('Comp_EFmuonLowpt','EF','muon',lowpt=True)
+test.check_steps.append(comp4)
+
+comp5=TrigInDetCompStep('Comp_L2muon_off','L2','muon')
+comp5.type = 'offline'
+test.check_steps.append(comp5)
+  
+comp6=TrigInDetCompStep('Comp_EFmuon_off','EF','muon')
+comp6.type = 'offline'
+test.check_steps.append(comp6)
+
+comp7=TrigInDetCompStep('Comp_L2muonLowpt_off','L2','muon',lowpt=True)
+comp7.type = 'offline'
+test.check_steps.append(comp7)
+  
+comp8=TrigInDetCompStep('Comp_EFmuonLowpt_off','EF','muon',lowpt=True)
+comp8.type = 'offline'
+test.check_steps.append(comp8)
+
+# CPU cost steps
+cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
+test.check_steps.append(cpucost)
+
+cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
+test.check_steps.append(cpucost2)
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_singlemu_larged0_pu.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_singlemu_larged0_pu.py
index 1f955a0f5bbc..da177d05348c 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_singlemu_larged0_pu.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_singlemu_larged0_pu.py
@@ -3,7 +3,7 @@
 # art-description: art job for mu_singlemu_larged0_pu
 # art-type: grid
 # art-include: master/Athena
-# art-input: mc15_13TeV.107237.ParticleGenerator_mu_Pt4to100_vertxy20.recon.RDO.e3603_s2726_r7728
+# art-input: mc15_13TeV.107237.ParticleGenerator_mu_Pt4to100_vertxy20.recon.RDO.e3603_s2726_r7772
 # art-input-nfiles: 10
 # art-athena-mt: 8
 # art-memory: 4096
@@ -27,99 +27,28 @@
 # art-output: *.dat 
 
 
-from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+Slices  = ['muon']
+Events  = 20000 
+Threads = 8 
+Slots   = 8
+Input   = 'Single_mu_larged0_pu'    # defined in TrigValTools/share/TrigValInputs.json
+GridFiles=True
 
-import sys,getopt
+Jobs = [ ( "Truth",       " TIDAdata-run3-larged0.dat                    -o data-hists.root -p 13",   "Test_bin_larged0.dat" ),
+         ( "Offline",     " TIDAdata-run3-offline-larged0.dat -r Offline -o data-hists-offline.root", "Test_bin_larged0.dat" ) ]
 
-try:
-    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
-except getopt.GetoptError:
-    print("Usage:  ")
-    print("-l(--local)    run locally with input file from art eos grid-input")
-    print("-x             don't run athena or post post-processing, only plotting")
-    print("-p             run post-processing, even if -x is set")
+Comp = [ ( "L2muon",              "L2muon",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "L2muon-lowpt",        "L2muonLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt " ),
+         ( "L2muonoffline",       "L2muon",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "L2muonoffline-lowpt", "L2muonLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt-offline " ),
+         ( "EFmuon",              "EFmuon",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "EFmuon-lowpt",        "EFmuonLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt " ),
+         ( "EFmuonoffline",       "EFmuon",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ),
+         ( "EFmuonoffline-lowpt", "EFmuonLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt-offline " ) ]
 
 
-local=False
-exclude=False
-postproc=False
-for opt,arg in opts:
-    if opt in ("-l", "--local"):
-        local=True
-    if opt=="-x":
-        exclude=True
-    if opt=="-p":
-        postproc=True
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
 
 
-rdo2aod = TrigInDetReco()
-rdo2aod.slices = ['muon']
-rdo2aod.max_events = 20000 
-rdo2aod.threads = 8
-rdo2aod.concurrent_events = 8
-rdo2aod.perfmon = False
-rdo2aod.timeout = 18*3600
-if local:
-    rdo2aod.input = 'Single_mu_larged0'    # defined in TrigValTools/share/TrigValInputs.json  
-else:
-    rdo2aod.input = ''
-    rdo2aod.args += '--inputRDOFile=$ArtInFile '
-
-
-test = Test.Test()
-test.art_type = 'grid'
-if (not exclude):
-    test.exec_steps = [rdo2aod]
-    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
-    test.check_steps = CheckSteps.default_check_steps(test)
-
  
-# Run Tidardict
-if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep()
-    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 13 -b Test_bin.dat '
-    test.check_steps.append(rdict)
-    rdict2 = TrigInDetdictStep('TrigInDetDict2')
-    rdict2.args='TIDAdata-run3-offline.dat -r Offline  -f data-hists-offline.root -b Test_bin.dat '
-    test.check_steps.append(rdict2)
-
- 
-# Now the comparitor steps
-comp=TrigInDetCompStep('Comp_L2muon','L2','muon')
-test.check_steps.append(comp)
-  
-comp2=TrigInDetCompStep('Comp_EFmuon','EF','muon')
-test.check_steps.append(comp2)
-
-comp3=TrigInDetCompStep('Comp_L2muonLowpt','L2','muon',lowpt=True)
-test.check_steps.append(comp3)
-  
-comp4=TrigInDetCompStep('Comp_EFmuonLowpt','EF','muon',lowpt=True)
-test.check_steps.append(comp4)
-
-comp5=TrigInDetCompStep('Comp_L2muon_off','L2','muon')
-comp5.type = 'offline'
-test.check_steps.append(comp5)
-  
-comp6=TrigInDetCompStep('Comp_EFmuon_off','EF','muon')
-comp6.type = 'offline'
-test.check_steps.append(comp6)
-
-comp7=TrigInDetCompStep('Comp_L2muonLowpt_off','L2','muon',lowpt=True)
-comp7.type = 'offline'
-test.check_steps.append(comp7)
-  
-comp8=TrigInDetCompStep('Comp_EFmuonLowpt_off','EF','muon',lowpt=True)
-comp8.type = 'offline'
-test.check_steps.append(comp8)
-
-# CPU cost steps
-cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
-test.check_steps.append(cpucost)
-
-cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
-test.check_steps.append(cpucost2)
-
-import sys
-sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_singlemu_larged0_pu_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_singlemu_larged0_pu_old.py
new file mode 100755
index 000000000000..a3cc45d3f8fd
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_singlemu_larged0_pu_old.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python
+
+# art-description: art job for mu_singlemu_larged0_pu
+# art-type: grid
+# art-include: master/Athena
+# art-input: mc15_13TeV.107237.ParticleGenerator_mu_Pt4to100_vertxy20.recon.RDO.e3603_s2726_r7728
+# art-input-nfiles: 10
+# art-athena-mt: 8
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+from TrigValTools.TrigValSteering import Test, CheckSteps
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+
+import sys,getopt
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
+except getopt.GetoptError:
+    print("Usage:  ")
+    print("-l(--local)    run locally with input file from art eos grid-input")
+    print("-x             don't run athena or post post-processing, only plotting")
+    print("-p             run post-processing, even if -x is set")
+
+
+local=False
+exclude=False
+postproc=False
+for opt,arg in opts:
+    if opt in ("-l", "--local"):
+        local=True
+    if opt=="-x":
+        exclude=True
+    if opt=="-p":
+        postproc=True
+
+
+rdo2aod = TrigInDetReco()
+rdo2aod.slices = ['muon']
+rdo2aod.max_events = 20000 
+rdo2aod.threads = 8
+rdo2aod.concurrent_events = 8
+rdo2aod.perfmon = False
+rdo2aod.timeout = 18*3600
+if local:
+    rdo2aod.input = 'Single_mu_larged0'    # defined in TrigValTools/share/TrigValInputs.json  
+else:
+    rdo2aod.input = ''
+    rdo2aod.args += '--inputRDOFile=$ArtInFile '
+
+
+test = Test.Test()
+test.art_type = 'grid'
+if (not exclude):
+    test.exec_steps = [rdo2aod]
+    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
+    test.check_steps = CheckSteps.default_check_steps(test)
+
+ 
+# Run Tidardict
+if ((not exclude) or postproc ):
+    rdict = TrigInDetdictStep()
+    rdict.args='TIDAdata-run3-larged0.dat -f data-hists.root -p 13 -b Test_bin_larged0.dat '
+    test.check_steps.append(rdict)
+    rdict2 = TrigInDetdictStep('TrigInDetDict2')
+    rdict2.args='TIDAdata-run3-offline-larged0.dat -r Offline  -f data-hists-offline.root -b Test_bin_larged0.dat '
+    test.check_steps.append(rdict2)
+
+ 
+# Now the comparitor steps
+comp=TrigInDetCompStep('Comp_L2muon','L2','muon')
+test.check_steps.append(comp)
+  
+comp2=TrigInDetCompStep('Comp_EFmuon','EF','muon')
+test.check_steps.append(comp2)
+
+comp3=TrigInDetCompStep('Comp_L2muonLowpt','L2','muon',lowpt=True)
+test.check_steps.append(comp3)
+  
+comp4=TrigInDetCompStep('Comp_EFmuonLowpt','EF','muon',lowpt=True)
+test.check_steps.append(comp4)
+
+comp5=TrigInDetCompStep('Comp_L2muon_off','L2','muon')
+comp5.type = 'offline'
+test.check_steps.append(comp5)
+  
+comp6=TrigInDetCompStep('Comp_EFmuon_off','EF','muon')
+comp6.type = 'offline'
+test.check_steps.append(comp6)
+
+comp7=TrigInDetCompStep('Comp_L2muonLowpt_off','L2','muon',lowpt=True)
+comp7.type = 'offline'
+test.check_steps.append(comp7)
+  
+comp8=TrigInDetCompStep('Comp_EFmuonLowpt_off','EF','muon',lowpt=True)
+comp8.type = 'offline'
+test.check_steps.append(comp8)
+
+# CPU cost steps
+cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
+test.check_steps.append(cpucost)
+
+cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
+test.check_steps.append(cpucost2)
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40.py
index 4e9c9c5a13d0..a89bdac87da5 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40.py
@@ -28,16 +28,24 @@
 
 
 Slices  = ['muon']
-RunEF   = True
 Events  = 8000 
 Threads = 8 
 Slots   = 8
 Input   = 'Zmumu_pu40'    # defined in TrigValTools/share/TrigValInputs.json
 GridFiles=True
 
-Args = " -p 13 "
-TrackReference = [ 'Truth', 'Offline' ]
-Lowpt          = [ False, True ] 
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                    -o data-hists.root -p 13" ),
+         ( "Offline",     " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ) ]
+
+Comp = [ ( "L2muon",              "L2muon",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "L2muon-lowpt",        "L2muonLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt " ),
+         ( "L2muonoffline",       "L2muon",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "L2muonoffline-lowpt", "L2muonLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt-offline " ),
+         ( "EFmuon",              "EFmuon",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "EFmuon-lowpt",        "EFmuonLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt " ),
+         ( "EFmuonoffline",       "EFmuon",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ),
+         ( "EFmuonoffline-lowpt", "EFmuonLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt-offline " ) ]
+
 
 from AthenaCommon.Include import include 
 include("TrigInDetValidation/TrigInDetValidation_Base.py")
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_build.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_build.py
index 93fb82a789b1..1467d3d2f4e9 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_build.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_build.py
@@ -4,67 +4,22 @@
 # art-type: build
 # art-include: master/Athena
 
-import sys,getopt
 
-try:
-    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
-except getopt.GetoptError:
-    print("Usage:  ")
-    print ("-x             don't run athena or post post-processing, only plotting")
-    print ("-p             run post-processing, even if -x is set")
+Slices  = ['muon']
+Events  = 100 
+Threads = 1 
+Slots   = 1
+Input   = 'Zmumu_pu40'    # defined in TrigValTools/share/TrigValInputs.json
+Art_type= 'build'
 
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                    -o data-hists.root -p 13" ) ]
 
-exclude=False
-postproc=False
-for opt,arg in opts:
-    if opt=="-x":
-        exclude=True
-    if opt=="-p":
-        postproc=True
+Comp = [ ( "L2muon",              "L2muon",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "EFmuon",              "EFmuon",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots " ) ]
 
-        
-from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
 
-rdo2aod = TrigInDetReco()
-rdo2aod.slices = ['muon']
-rdo2aod.max_events = 100 # TODO: 2000 events
-rdo2aod.threads = 1 # TODO: change to 4
-rdo2aod.concurrent_events = 1 # TODO: change to 4
-rdo2aod.perfmon = False
-rdo2aod.input = 'Zmumu_pu40'   # defined in TrigValTools/share/TrigValInputs.json  
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
 
 
-test = Test.Test()
-test.art_type = 'build'
-if (not exclude):
-    test.exec_steps = [rdo2aod]
-    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
-    test.check_steps = CheckSteps.default_check_steps(test)
-
- 
-# Run Tidardict
-if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep()
-    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 13 -b Test_bin.dat '
-    test.check_steps.append(rdict)
  
-
-# Now the comparitor steps
-comp=TrigInDetCompStep( 'Comp_L2muon', 'L2', 'muon' )
-comp.flag = 'L2muon'
-test.check_steps.append(comp)
-  
-comp2=TrigInDetCompStep( 'Comp_EFmuon', 'EF', 'muon' )
-comp2.flag = 'EFmuon'
-test.check_steps.append(comp2)
-
-# CPU cost steps
-cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
-test.check_steps.append(cpucost)
-
-cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
-test.check_steps.append(cpucost2)
-
-import sys
-sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_build_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_build_old.py
new file mode 100755
index 000000000000..be5e11daf870
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_build_old.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python
+
+# art-description: art job for mu_Zmumu_pu40_build
+# art-type: build
+# art-include: master/Athena
+
+import sys,getopt
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
+except getopt.GetoptError:
+    print("Usage:  ")
+    print ("-x             don't run athena or post post-processing, only plotting")
+    print ("-p             run post-processing, even if -x is set")
+
+
+exclude=False
+postproc=False
+for opt,arg in opts:
+    if opt=="-x":
+        exclude=True
+    if opt=="-p":
+        postproc=True
+
+        
+from TrigValTools.TrigValSteering import Test, CheckSteps
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+
+rdo2aod = TrigInDetReco()
+rdo2aod.slices = ['muon']
+rdo2aod.max_events = 100 # TODO: 2000 events
+rdo2aod.threads = 1 # TODO: change to 4
+rdo2aod.concurrent_events = 1 # TODO: change to 4
+rdo2aod.perfmon = False
+rdo2aod.input = 'Zmumu_pu40'   # defined in TrigValTools/share/TrigValInputs.json  
+
+
+test = Test.Test()
+test.art_type = 'build'
+if (not exclude):
+    test.exec_steps = [rdo2aod]
+    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
+    test.check_steps = CheckSteps.default_check_steps(test)
+
+ 
+# Run Tidardict
+if ((not exclude) or postproc ):
+    rdict = TrigInDetdictStep()
+    rdict.args='TIDAdata-run3.dat -f data-hists.root -p 13 -b Test_bin.dat '
+    test.check_steps.append(rdict)
+ 
+
+# Now the comparitor steps
+comp=TrigInDetCompStep( 'Comp_L2muon', 'L2', 'muon' )
+comp.flag = 'L2muon'
+test.check_steps.append(comp)
+  
+comp2=TrigInDetCompStep( 'Comp_EFmuon', 'EF', 'muon' )
+comp2.flag = 'EFmuon'
+test.check_steps.append(comp2)
+
+# CPU cost steps
+cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
+test.check_steps.append(cpucost)
+
+cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
+test.check_steps.append(cpucost2)
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_old.py
new file mode 100755
index 000000000000..39175be7de87
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_old.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python
+
+# art-description: art job for mu_Zmumu_pu40
+# art-type: grid
+# art-include: master/Athena
+# art-input: mc15_13TeV.361107.PowhegPythia8EvtGen_AZNLOCTEQ6L1_Zmumu.recon.RDO.e3601_s2576_s2132_r7143
+# art-input-nfiles: 4
+# art-athena-mt: 8
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+Slices  = ['muon']
+RunEF   = True
+Events  = 8000 
+Threads = 8 
+Slots   = 8
+Input   = 'Zmumu_pu40'    # defined in TrigValTools/share/TrigValInputs.json
+GridFiles=True
+
+Args = " -p 13 "
+TrackReference = [ 'Truth', 'Offline' ]
+Lowpt          = [ False, True ] 
+
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_OldBase.py")
+
+
+ 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_short.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_short.py
index 296bd53e6e45..6b61a0f3c1c8 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_short.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_short.py
@@ -28,16 +28,24 @@
 
 
 Slices  = ['muon']
-RunEF   = True
 Events  = 2000 
 Threads = 8 
 Slots   = 8
 Input   = 'Zmumu_pu40'    # defined in TrigValTools/share/TrigValInputs.json
 GridFiles=True
 
-Args = " -p 13 "
-TrackReference = [ 'Truth', 'Offline' ]
-Lowpt          = [ False, True ] 
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                    -o data-hists.root -p 13" ),
+         ( "Offline",     " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ) ]
+
+Comp = [ ( "L2muon",              "L2muon",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "L2muon-lowpt",        "L2muonLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt " ),
+         ( "L2muonoffline",       "L2muon",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "L2muonoffline-lowpt", "L2muonLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt-offline " ),
+         ( "EFmuon",              "EFmuon",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "EFmuon-lowpt",        "EFmuonLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt " ),
+         ( "EFmuonoffline",       "EFmuon",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ),
+         ( "EFmuonoffline-lowpt", "EFmuonLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt-offline " ) ]
+
 
 from AthenaCommon.Include import include 
 include("TrigInDetValidation/TrigInDetValidation_Base.py")
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_short_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_short_old.py
new file mode 100755
index 000000000000..73924c0f5e9a
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_short_old.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python
+
+# art-description: art job for mu_Zmumu_pu40
+# art-type: grid
+# art-include: master/Athena
+# art-input: mc15_13TeV.361107.PowhegPythia8EvtGen_AZNLOCTEQ6L1_Zmumu.recon.RDO.e3601_s2576_s2132_r7143
+# art-input-nfiles: 4
+# art-athena-mt: 8
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+Slices  = ['muon']
+RunEF   = True
+Events  = 2000 
+Threads = 8 
+Slots   = 8
+Input   = 'Zmumu_pu40'    # defined in TrigValTools/share/TrigValInputs.json
+GridFiles=True
+
+Args = " -p 13 "
+TrackReference = [ 'Truth', 'Offline' ]
+Lowpt          = [ False, True ] 
+
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_OldBase.py")
+
+
+ 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_st.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_st.py
index 6a5a726e71f4..af19f978666e 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_st.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_st.py
@@ -28,16 +28,24 @@
 
 
 Slices  = ['muon']
-RunEF   = True
 Events  = 2000 
 Threads = 1 
 Slots   = 1
 Input   = 'Zmumu_pu40'    # defined in TrigValTools/share/TrigValInputs.json
 GridFiles=True
 
-Args = " -p 13 "
-TrackReference = [ 'Truth', 'Offline' ]
-Lowpt          = [ False, True ] 
+Jobs = [ ( "Truth",       " TIDAdata-run3.dat                    -o data-hists.root -p 13" ),
+         ( "Offline",     " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ) ]
+
+Comp = [ ( "L2muon",              "L2muon",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "L2muon-lowpt",        "L2muonLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt " ),
+         ( "L2muonoffline",       "L2muon",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "L2muonoffline-lowpt", "L2muonLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTL2-plots-lowpt-offline " ),
+         ( "EFmuon",              "EFmuon",      "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "EFmuon-lowpt",        "EFmuonLowpt", "data-hists.root",         " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt " ),
+         ( "EFmuonoffline",       "EFmuon",      "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ),
+         ( "EFmuonoffline-lowpt", "EFmuonLowpt", "data-hists-offline.root", " -c TIDAhisto-panel.dat  -d HLTEF-plots-lowpt-offline " ) ]
+
 
 from AthenaCommon.Include import include 
 include("TrigInDetValidation/TrigInDetValidation_Base.py")
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_st_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_st_old.py
new file mode 100755
index 000000000000..146fda5462f1
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_mu_zmumu_pu40_st_old.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python
+
+# art-description: art job for mu_Zmumu_pu40_st
+# art-type: grid
+# art-include: master/Athena
+# art-input: mc15_13TeV.361107.PowhegPythia8EvtGen_AZNLOCTEQ6L1_Zmumu.recon.RDO.e3601_s2576_s2132_r7143
+# art-input-nfiles: 4
+# art-athena-mt: 4
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+Slices  = ['muon']
+RunEF   = True
+Events  = 2000 
+Threads = 1 
+Slots   = 1
+Input   = 'Zmumu_pu40'    # defined in TrigValTools/share/TrigValInputs.json
+GridFiles=True
+
+Args = " -p 13 "
+TrackReference = [ 'Truth', 'Offline' ]
+Lowpt          = [ False, True ] 
+
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_OldBase.py")
+
+
+ 
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46.py
index 8dbd12f05f00..d743d196d530 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 
-# art-description: art job for mu_ztautau_pu46
+# art-description: art job for tau_ztautau_pu46
 # art-type: grid
 # art-include: master/Athena
 # art-athena-mt: 8
@@ -25,70 +25,21 @@
 # art-output: *.dat 
 
 
-from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+Slices  = ['tau']
+Events  = 6000
+Threads = 8 
+Slots   = 8
+Input   = 'Ztautau_pu46'    # defined in TrigValTools/share/TrigValInputs.json  
 
-import sys,getopt
+Jobs = [ ( "Offline",  " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ),
+         ( "Truth",    " TIDAdata-run3.dat                    -o data-hists.root" ) ]
 
-try:
-    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
-except getopt.GetoptError:
-    print("Usage:  ")
-    print("-l(--local)    run locally with input file from art eos grid-input")
-    print("-x             don't run athena or post post-processing, only plotting")
-    print("-p             run post-processing, even if -x is set")
 
+Comp = [ ( "L2tau",        "L2tau",       "data-hists.root",          " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "EFtau",        "EFtau",       "data-hists.root",          " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "L2tauOff",     "L2tau",       "data-hists-offline.root",  " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "EFtauOff",     "EFtau",       "data-hists-offline.root",  " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ) ]
+   
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
 
-local=False
-exclude=False
-postproc=False
-for opt,arg in opts:
-    if opt in ("-l", "--local"):
-        local=True
-    if opt=="-x":
-        exclude=True
-    if opt=="-p":
-        postproc=True
-
-
-rdo2aod = TrigInDetReco()
-rdo2aod.slices = ['tau']
-rdo2aod.max_events = 6000 
-rdo2aod.threads = 8
-rdo2aod.concurrent_events = 8
-rdo2aod.perfmon = False
-rdo2aod.timeout = 18*3600
-rdo2aod.input = 'Ztautau_pu46'    # defined in TrigValTools/share/TrigValInputs.json  
-
-
-test = Test.Test()
-test.art_type = 'grid'
-if (not exclude):
-    test.exec_steps = [rdo2aod]
-    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
-    test.check_steps = CheckSteps.default_check_steps(test)
-
- 
-# Run Tidardict
-if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep()
-    rdict.args='TIDAdata-run3.dat -f data-hists.root -b Test_bin.dat '
-    test.check_steps.append(rdict)
-
- 
-# Now the comparitor steps
-comp=TrigInDetCompStep('Comp_L2tau','L2','tau')
-test.check_steps.append(comp)
-  
-comp2=TrigInDetCompStep('Comp_EFtau','EF','tau')
-test.check_steps.append(comp2)
-
-# CPU cost steps
-cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
-test.check_steps.append(cpucost)
-
-cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
-test.check_steps.append(cpucost2)
-
-import sys
-sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_new.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_new.py
deleted file mode 100755
index 8307c10bbeff..000000000000
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_new.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env python
-
-# art-description: art job for tau_ztautau_pu46_new
-# art-type: grid
-# art-include: master/Athena
-# art-athena-mt: 8
-# art-memory: 4096
-# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
-# art-output: *.txt
-# art-output: *.log
-# art-output: log.*
-# art-output: *.out
-# art-output: *.err
-# art-output: *.log.tar.gz
-# art-output: *.new
-# art-output: *.json
-# art-output: *.root
-# art-output: *.check*
-# art-output: HLT*
-# art-output: times*
-# art-output: cost-perCall
-# art-output: cost-perEvent
-# art-output: cost-perCall-chain
-# art-output: cost-perEvent-chain
-# art-output: *.dat 
-
-
-Slices  = ['tau']
-Events  = 6000
-Threads = 8 
-Slots   = 8
-Input   = 'Ztautau_pu46'    # defined in TrigValTools/share/TrigValInputs.json  
-
-Jobs = [ ( "Offline",  " TIDAdata-run3-offline.dat -o data-hists-offline.root" ),
-         ( "Truth",    " TIDAdata-run3.dat         -o data-hists.root" ) ]
-
-
-Comp = [ ( "L2tau",        "L2tau",       "data-hists.root",          " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
-         ( "EFtau",        "EFtau",       "data-hists.root",          " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
-         ( "L2tauOff",     "L2tau",       "data-hists-offline.root",  " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
-         ( "EFtauOff",     "EFtau",       "data-hists-offline.root",  " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ) ]
-   
-from AthenaCommon.Include import include 
-include("TrigInDetValidation/TrigInDetValidation_NewBase.py")
-
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_old.py
new file mode 100755
index 000000000000..b96643db6aef
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_old.py
@@ -0,0 +1,94 @@
+#!/usr/bin/env python
+
+# art-description: art job for mu_ztautau_pu46
+# art-type: grid
+# art-include: master/Athena
+# art-athena-mt: 8
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+from TrigValTools.TrigValSteering import Test, CheckSteps
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+
+import sys,getopt
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
+except getopt.GetoptError:
+    print("Usage:  ")
+    print("-l(--local)    run locally with input file from art eos grid-input")
+    print("-x             don't run athena or post post-processing, only plotting")
+    print("-p             run post-processing, even if -x is set")
+
+
+local=False
+exclude=False
+postproc=False
+for opt,arg in opts:
+    if opt in ("-l", "--local"):
+        local=True
+    if opt=="-x":
+        exclude=True
+    if opt=="-p":
+        postproc=True
+
+
+rdo2aod = TrigInDetReco()
+rdo2aod.slices = ['tau']
+rdo2aod.max_events = 6000 
+rdo2aod.threads = 8
+rdo2aod.concurrent_events = 8
+rdo2aod.perfmon = False
+rdo2aod.timeout = 18*3600
+rdo2aod.input = 'Ztautau_pu46'    # defined in TrigValTools/share/TrigValInputs.json  
+
+
+test = Test.Test()
+test.art_type = 'grid'
+if (not exclude):
+    test.exec_steps = [rdo2aod]
+    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
+    test.check_steps = CheckSteps.default_check_steps(test)
+
+ 
+# Run Tidardict
+if ((not exclude) or postproc ):
+    rdict = TrigInDetdictStep()
+    rdict.args='TIDAdata-run3.dat -f data-hists.root -b Test_bin.dat '
+    test.check_steps.append(rdict)
+
+ 
+# Now the comparitor steps
+comp=TrigInDetCompStep('Comp_L2tau','L2','tau')
+test.check_steps.append(comp)
+  
+comp2=TrigInDetCompStep('Comp_EFtau','EF','tau')
+test.check_steps.append(comp2)
+
+# CPU cost steps
+cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
+test.check_steps.append(cpucost)
+
+cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
+test.check_steps.append(cpucost2)
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_st.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_st.py
index c89cacfa0b7b..27f1c21df5be 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_st.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_st.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 
-# art-description: art job for mu_ztautau_pu46_st
+# art-description: art job for tau_ztautau_pu46_st
 # art-type: grid
 # art-include: master/Athena
 # art-athena-mt: 4
@@ -25,70 +25,21 @@
 # art-output: *.dat 
 
 
-from TrigValTools.TrigValSteering import Test, CheckSteps
-from TrigInDetValidation.TrigInDetArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+Slices  = ['tau']
+Events  = 6000
+Threads = 1 
+Slots   = 1
+Input   = 'Ztautau_pu46'    # defined in TrigValTools/share/TrigValInputs.json  
 
-import sys,getopt
+Jobs = [ ( "Offline",  " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ),
+         ( "Truth",    " TIDAdata-run3.dat                    -o data-hists.root" ) ]
 
-try:
-    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
-except getopt.GetoptError:
-    print("Usage:  ")
-    print("-l(--local)    run locally with input file from art eos grid-input")
-    print("-x             don't run athena or post post-processing, only plotting")
-    print("-p             run post-processing, even if -x is set")
 
+Comp = [ ( "L2tau",        "L2tau",       "data-hists.root",          " -c TIDAhisto-panel.dat  -d HLTL2-plots " ),
+         ( "EFtau",        "EFtau",       "data-hists.root",          " -c TIDAhisto-panel.dat  -d HLTEF-plots " ),
+         ( "L2tauOff",     "L2tau",       "data-hists-offline.root",  " -c TIDAhisto-panel.dat  -d HLTL2-plots-offline " ),
+         ( "EFtauOff",     "EFtau",       "data-hists-offline.root",  " -c TIDAhisto-panel.dat  -d HLTEF-plots-offline " ) ]
+   
+from AthenaCommon.Include import include 
+include("TrigInDetValidation/TrigInDetValidation_Base.py")
 
-local=False
-exclude=False
-postproc=False
-for opt,arg in opts:
-    if opt in ("-l", "--local"):
-        local=True
-    if opt=="-x":
-        exclude=True
-    if opt=="-p":
-        postproc=True
-
-
-rdo2aod = TrigInDetReco()
-rdo2aod.slices = ['tau']
-rdo2aod.max_events = 6000 
-rdo2aod.threads = 1
-rdo2aod.concurrent_events = 1
-rdo2aod.perfmon = False
-rdo2aod.timeout = 18*3600
-rdo2aod.input = 'Ztautau_pu46'    # defined in TrigValTools/share/TrigValInputs.json  
-
-
-test = Test.Test()
-test.art_type = 'grid'
-if (not exclude):
-    test.exec_steps = [rdo2aod]
-    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
-    test.check_steps = CheckSteps.default_check_steps(test)
-
- 
-# Run Tidardict
-if ((not exclude) or postproc ):
-    rdict = TrigInDetdictStep()
-    rdict.args='TIDAdata-run3.dat -f data-hists.root -b Test_bin.dat '
-    test.check_steps.append(rdict)
-
- 
-# Now the comparitor steps
-comp=TrigInDetCompStep('Comp_L2tau','L2','tau')
-test.check_steps.append(comp)
-  
-comp2=TrigInDetCompStep('Comp_EFtau','EF','tau')
-test.check_steps.append(comp2)
-
-# CPU cost steps
-cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
-test.check_steps.append(cpucost)
-
-cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
-test.check_steps.append(cpucost2)
-
-import sys
-sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_st_old.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_st_old.py
new file mode 100755
index 000000000000..2eed16f43211
--- /dev/null
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_st_old.py
@@ -0,0 +1,94 @@
+#!/usr/bin/env python
+
+# art-description: art job for mu_ztautau_pu46_st
+# art-type: grid
+# art-include: master/Athena
+# art-athena-mt: 4
+# art-memory: 4096
+# art-html: https://idtrigger-val.web.cern.ch/idtrigger-val/TIDAWeb/TIDAart/?jobdir=
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.check*
+# art-output: HLT*
+# art-output: times*
+# art-output: cost-perCall
+# art-output: cost-perEvent
+# art-output: cost-perCall-chain
+# art-output: cost-perEvent-chain
+# art-output: *.dat 
+
+
+from TrigValTools.TrigValSteering import Test, CheckSteps
+from TrigInDetValidation.TrigInDetOldArtSteps import TrigInDetReco, TrigInDetAna, TrigInDetdictStep, TrigInDetCompStep, TrigInDetCpuCostStep
+
+import sys,getopt
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:],"lxp",["local"])
+except getopt.GetoptError:
+    print("Usage:  ")
+    print("-l(--local)    run locally with input file from art eos grid-input")
+    print("-x             don't run athena or post post-processing, only plotting")
+    print("-p             run post-processing, even if -x is set")
+
+
+local=False
+exclude=False
+postproc=False
+for opt,arg in opts:
+    if opt in ("-l", "--local"):
+        local=True
+    if opt=="-x":
+        exclude=True
+    if opt=="-p":
+        postproc=True
+
+
+rdo2aod = TrigInDetReco()
+rdo2aod.slices = ['tau']
+rdo2aod.max_events = 6000 
+rdo2aod.threads = 1
+rdo2aod.concurrent_events = 1
+rdo2aod.perfmon = False
+rdo2aod.timeout = 18*3600
+rdo2aod.input = 'Ztautau_pu46'    # defined in TrigValTools/share/TrigValInputs.json  
+
+
+test = Test.Test()
+test.art_type = 'grid'
+if (not exclude):
+    test.exec_steps = [rdo2aod]
+    test.exec_steps.append(TrigInDetAna()) # Run analysis to produce TrkNtuple
+    test.check_steps = CheckSteps.default_check_steps(test)
+
+ 
+# Run Tidardict
+if ((not exclude) or postproc ):
+    rdict = TrigInDetdictStep()
+    rdict.args='TIDAdata-run3.dat -f data-hists.root -b Test_bin.dat '
+    test.check_steps.append(rdict)
+
+ 
+# Now the comparitor steps
+comp=TrigInDetCompStep('Comp_L2tau','L2','tau')
+test.check_steps.append(comp)
+  
+comp2=TrigInDetCompStep('Comp_EFtau','EF','tau')
+test.check_steps.append(comp2)
+
+# CPU cost steps
+cpucost=TrigInDetCpuCostStep('CpuCostStep1', ftf_times=False)
+test.check_steps.append(cpucost)
+
+cpucost2=TrigInDetCpuCostStep('CpuCostStep2')
+test.check_steps.append(cpucost2)
+
+import sys
+sys.exit(test.run())
-- 
GitLab


From 86b11ca77921b94729cd22d2b786a4bf53d63ae6 Mon Sep 17 00:00:00 2001
From: Nicolas Koehler <nicolas.koehler@cern.ch>
Date: Fri, 18 Dec 2020 12:55:53 +0000
Subject: [PATCH 153/225] Remove hardcoded manipulation of WriteHandle names in
 MuonCreatorAlg

---
 .../src/MooSegmentFinderAlg.cxx               | 45 +---------
 .../src/MooSegmentFinderAlg.h                 | 83 +++++++------------
 .../src/MuonSegmentFinderAlg.h                |  2 +-
 .../src/MuonCombinedInDetExtensionAlg.h       |  1 +
 .../MuonCombinedAlgs/src/MuonCreatorAlg.cxx   | 17 ++--
 .../MuonCombinedAlgs/src/MuonCreatorAlg.h     |  7 +-
 .../src/MuonCreatorTool.cxx                   |  9 +-
 .../MuonCombinedReconstructionConfig.py       |  3 +-
 .../python/MuonCombinedAlgs.py                |  7 +-
 .../python/HLTMenuConfig/Muon/MuonSetup.py    |  4 +-
 .../python/HLTMenuConfig/Muon/generateMuon.py |  2 +-
 11 files changed, 65 insertions(+), 115 deletions(-)

diff --git a/MuonSpectrometer/MuonReconstruction/MuonSegmentCombiners/MuonSegmentCombinerTools/MooSegmentCombinationFinder/src/MooSegmentFinderAlg.cxx b/MuonSpectrometer/MuonReconstruction/MuonSegmentCombiners/MuonSegmentCombinerTools/MooSegmentCombinationFinder/src/MooSegmentFinderAlg.cxx
index b63dc2e7a5a5..413b64de7ce0 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonSegmentCombiners/MuonSegmentCombinerTools/MooSegmentCombinationFinder/src/MooSegmentFinderAlg.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonSegmentCombiners/MuonSegmentCombinerTools/MooSegmentCombinationFinder/src/MooSegmentFinderAlg.cxx
@@ -6,43 +6,11 @@
 
 #include "MuonPrepRawData/MuonPrepDataContainer.h"
 #include "MuonSegment/MuonSegment.h"
-#include "MuonSegmentCombinerToolInterfaces/IMooSegmentCombinationFinder.h"
-#include "MuonSegmentMakerToolInterfaces/IMuonSegmentOverlapRemovalTool.h"
-
-MooSegmentFinderAlg::MooSegmentFinderAlg(const std::string& name, ISvcLocator* pSvcLocator)
-    : AthReentrantAlgorithm(name, pSvcLocator),
-      m_keyTgc("TGC_Measurements"),
-      m_keyTgcPriorBC("TGC_MeasurementsPriorBC"),
-      m_keyTgcNextBC("TGC_MeasurementsNextBC"),
-      m_keyRpc("RPC_Measurements"),
-      m_keyCsc("CSC_Clusters"),
-      m_keyMdt("MDT_DriftCircles"),
-      m_patternCombiLocation("MuonHoughPatternCombinations"),
-      m_segmentLocation("MooreSegments")
-{
-    declareProperty("UseRPC", m_useRpc = true);
-    declareProperty("UseTGC", m_useTgc = true);
-    declareProperty("UseTGCPriorBC", m_useTgcPriorBC = false);
-    declareProperty("UseTGCNextBC", m_useTgcNextBC = false);
-    declareProperty("UseCSC", m_useCsc = true);
-    declareProperty("UseMDT", m_useMdt = true);
-
-    declareProperty("doTGCClust", m_doTGCClust = false);
-    declareProperty("doRPCClust", m_doRPCClust = false);
-    declareProperty("doClusterTruth", m_doClusterTruth = false);
-
-    declareProperty("CscPrepDataContainer", m_keyCsc);
-    declareProperty("MdtPrepDataContainer", m_keyMdt);
-    declareProperty("RpcPrepDataContainer", m_keyRpc);
-    declareProperty("TgcPrepDataContainer", m_keyTgc);
-    declareProperty("TgcPrepDataContainerPriorBC", m_keyTgcPriorBC);
-    declareProperty("TgcPrepDataContainerNextBC", m_keyTgcNextBC);
-
-    declareProperty("MuonPatternCombinationLocation", m_patternCombiLocation);
-    declareProperty("MuonSegmentOutputLocation", m_segmentLocation);
-}
 
-MooSegmentFinderAlg::~MooSegmentFinderAlg() {}
+
+MooSegmentFinderAlg::MooSegmentFinderAlg(const std::string& name, ISvcLocator* pSvcLocator) :
+  AthReentrantAlgorithm(name, pSvcLocator) {
+}
 
 StatusCode
 MooSegmentFinderAlg::initialize()
@@ -143,8 +111,3 @@ MooSegmentFinderAlg::execute(const EventContext& ctx) const
     return StatusCode::SUCCESS;
 }  // execute
 
-StatusCode
-MooSegmentFinderAlg::finalize()
-{
-    return StatusCode::SUCCESS;
-}
diff --git a/MuonSpectrometer/MuonReconstruction/MuonSegmentCombiners/MuonSegmentCombinerTools/MooSegmentCombinationFinder/src/MooSegmentFinderAlg.h b/MuonSpectrometer/MuonReconstruction/MuonSegmentCombiners/MuonSegmentCombinerTools/MooSegmentCombinationFinder/src/MooSegmentFinderAlg.h
index 7973fac205df..7706d5c6862d 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonSegmentCombiners/MuonSegmentCombinerTools/MooSegmentCombinationFinder/src/MooSegmentFinderAlg.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonSegmentCombiners/MuonSegmentCombinerTools/MooSegmentCombinationFinder/src/MooSegmentFinderAlg.h
@@ -7,6 +7,9 @@
 
 #include "AthenaBaseComps/AthReentrantAlgorithm.h"
 #include "GaudiKernel/ToolHandle.h"
+#include "StoreGate/WriteHandleKey.h"
+#include "StoreGate/ReadHandleKey.h"
+
 #include "MuonPattern/MuonPatternCombinationCollection.h"
 #include "MuonPrepRawData/CscPrepDataCollection.h"
 #include "MuonPrepRawData/MdtPrepDataCollection.h"
@@ -18,23 +21,17 @@
 #include "MuonSegmentMakerToolInterfaces/IMuonClusterSegmentFinder.h"
 #include "TrkSegment/SegmentCollection.h"
 #include "TrkTruthData/PRD_MultiTruthCollection.h"
-
-class MsgStream;
-
-namespace Muon {
-class IMooSegmentCombinationFinder;
-class IMuonSegmentOverlapRemovalTool;
-}  // namespace Muon
+#include "MuonSegmentCombinerToolInterfaces/IMooSegmentCombinationFinder.h"
+#include "MuonSegmentMakerToolInterfaces/IMuonSegmentOverlapRemovalTool.h"
 
 class MooSegmentFinderAlg : public AthReentrantAlgorithm {
   public:
     MooSegmentFinderAlg(const std::string& name, ISvcLocator* pSvcLocator);
 
-    virtual ~MooSegmentFinderAlg();
+    virtual ~MooSegmentFinderAlg()=default;
 
     virtual StatusCode initialize() override;
     virtual StatusCode execute(const EventContext& ctx) const override;
-    virtual StatusCode finalize() override;
 
   private:
     template <class T, class Y>
@@ -44,52 +41,36 @@ class MooSegmentFinderAlg : public AthReentrantAlgorithm {
     Trk::SegmentCollection* extractSegmentCollection(const MuonSegmentCombinationCollection& segmentCombinations) const;
 
     /** selection flags for all four technologies */
-    bool m_useTgc;
-    bool m_useTgcPriorBC;
-    bool m_useTgcNextBC;
-    bool m_useRpc;
-    bool m_useCsc;
-    bool m_useMdt;
+    Gaudi::Property<bool> m_useTgc{this,"UseTGC",true};
+    Gaudi::Property<bool> m_useTgcPriorBC{this,"UseTGCPriorBC",false};
+    Gaudi::Property<bool> m_useTgcNextBC{this,"UseTGCNextBC",false};
+    Gaudi::Property<bool> m_useRpc{this,"UseRPC",true};
+    Gaudi::Property<bool> m_useCsc{this,"UseCSC",true};
+    Gaudi::Property<bool> m_useMdt{this,"UseMDT",true};
 
     /** selection flags for cluster based segment finding */
-    bool m_doTGCClust;
-    bool m_doRPCClust;
-    bool m_doClusterTruth;
+    Gaudi::Property<bool> m_doTGCClust{this,"doTGCClust",false};
+    Gaudi::Property<bool> m_doRPCClust{this,"doRPCClust",false};
+    Gaudi::Property<bool> m_doClusterTruth{this,"doClusterTruth",false};
 
     /** storegate location of the MuonPrepDataContainer for all four technologies */
-    SG::ReadHandleKey<Muon::TgcPrepDataContainer> m_keyTgc;
-    SG::ReadHandleKey<Muon::TgcPrepDataContainer> m_keyTgcPriorBC;
-    SG::ReadHandleKey<Muon::TgcPrepDataContainer> m_keyTgcNextBC;
-    SG::ReadHandleKey<Muon::RpcPrepDataContainer> m_keyRpc;
-    SG::ReadHandleKey<Muon::CscPrepDataContainer> m_keyCsc;
-    SG::ReadHandleKey<Muon::MdtPrepDataContainer> m_keyMdt;
-
-    SG::ReadHandleKey<PRD_MultiTruthCollection> m_tgcTruth{this, "TGCTruth", "TGC_TruthMap",
-                                                           "TGC PRD Multi-truth Collection"};
-    SG::ReadHandleKey<PRD_MultiTruthCollection> m_rpcTruth{this, "RPCTruth", "RPC_TruthMap",
-                                                           "RPC PRD Multi-truth Collection"};
-
-    SG::WriteHandleKey<MuonPatternCombinationCollection> m_patternCombiLocation;
-    SG::WriteHandleKey<Trk::SegmentCollection>           m_segmentLocation;
-    SG::WriteHandleKey<Muon::HoughDataPerSectorVec>      m_houghDataPerSectorVecKey{
-        this, "Key_MuonLayerHoughToolHoughDataPerSectorVec", "HoughDataPerSectorVec", "HoughDataPerSectorVec key"};
-
-    ToolHandle<Muon::IMooSegmentCombinationFinder> m_segmentFinder{
-        this,
-        "SegmentFinder",
-        "Muon::MooSegmentCombinationFinder/MooSegmentCombinationFinder",
-    };  //<! pointer to the segment finder
-    ToolHandle<Muon::IMuonClusterSegmentFinder> m_clusterSegMaker{
-        this,
-        "MuonClusterSegmentFinderTool",
-        "Muon::MuonClusterSegmentFinder/MuonClusterSegmentFinder",
-    };
-    ToolHandle<Muon::IMuonSegmentOverlapRemovalTool> m_overlapRemovalTool{
-        this,
-        "SegmentOverlapRemovalTool",
-        "Muon::MuonSegmentOverlapRemovalTool/MuonSegmentOverlapRemovalTool",
-        "tool to removal overlaps in segment combinations",
-    };
+    SG::ReadHandleKey<Muon::TgcPrepDataContainer> m_keyTgc{this,"TgcPrepDataContainer","TGC_Measurements"};
+    SG::ReadHandleKey<Muon::TgcPrepDataContainer> m_keyTgcPriorBC{this,"TgcPrepDataContainerPriorBC","TGC_MeasurementsPriorBC"};
+    SG::ReadHandleKey<Muon::TgcPrepDataContainer> m_keyTgcNextBC{this,"TgcPrepDataContainerNextBC","TGC_MeasurementsNextBC"};
+    SG::ReadHandleKey<Muon::RpcPrepDataContainer> m_keyRpc{this,"RpcPrepDataContainer","RPC_Measurements"};
+    SG::ReadHandleKey<Muon::CscPrepDataContainer> m_keyCsc{this,"CscPrepDataContainer","CSC_Clusters"};
+    SG::ReadHandleKey<Muon::MdtPrepDataContainer> m_keyMdt{this,"MdtPrepDataContainer","MDT_DriftCircles"};
+
+    SG::ReadHandleKey<PRD_MultiTruthCollection> m_tgcTruth{this,"TGCTruth","TGC_TruthMap","TGC PRD Multi-truth Collection"};
+    SG::ReadHandleKey<PRD_MultiTruthCollection> m_rpcTruth{this,"RPCTruth","RPC_TruthMap","RPC PRD Multi-truth Collection"};
+
+    SG::WriteHandleKey<MuonPatternCombinationCollection> m_patternCombiLocation{this,"MuonPatternCombinationLocation","MuonHoughPatternCombinations"};
+    SG::WriteHandleKey<Trk::SegmentCollection> m_segmentLocation{this,"MuonSegmentOutputLocation","MooreSegments"};
+    SG::WriteHandleKey<Muon::HoughDataPerSectorVec> m_houghDataPerSectorVecKey{this,"Key_MuonLayerHoughToolHoughDataPerSectorVec","HoughDataPerSectorVec","HoughDataPerSectorVec key"};
+
+    ToolHandle<Muon::IMooSegmentCombinationFinder> m_segmentFinder{this,"SegmentFinder","Muon::MooSegmentCombinationFinder/MooSegmentCombinationFinder","pointer to the segment finder"};
+    ToolHandle<Muon::IMuonClusterSegmentFinder> m_clusterSegMaker{this,"MuonClusterSegmentFinderTool","Muon::MuonClusterSegmentFinder/MuonClusterSegmentFinder"};
+    ToolHandle<Muon::IMuonSegmentOverlapRemovalTool> m_overlapRemovalTool{this,"SegmentOverlapRemovalTool","Muon::MuonSegmentOverlapRemovalTool/MuonSegmentOverlapRemovalTool","tool to removal overlaps in segment combinations"};
 };
 
 template <class T, class Y>
diff --git a/MuonSpectrometer/MuonReconstruction/MuonSegmentCombiners/MuonSegmentCombinerTools/MooSegmentCombinationFinder/src/MuonSegmentFinderAlg.h b/MuonSpectrometer/MuonReconstruction/MuonSegmentCombiners/MuonSegmentCombinerTools/MooSegmentCombinationFinder/src/MuonSegmentFinderAlg.h
index 846365764702..9d974f2d0fcb 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonSegmentCombiners/MuonSegmentCombinerTools/MooSegmentCombinationFinder/src/MuonSegmentFinderAlg.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonSegmentCombiners/MuonSegmentCombinerTools/MooSegmentCombinationFinder/src/MuonSegmentFinderAlg.h
@@ -106,7 +106,7 @@ class MuonSegmentFinderAlg : public AthReentrantAlgorithm {
         "Csc4dSegmentMaker/Csc4dSegmentMaker",
     };
 
-
+    // the following Trk::SegmentCollection MuonSegments are sttandard MuonSegments, the MuGirl segments are stored in MuonCreatorAlg.h
     SG::WriteHandleKey<Trk::SegmentCollection> m_segmentCollectionKey{
         this,
         "SegmentCollectionName",
diff --git a/Reconstruction/MuonIdentification/MuonCombinedAlgs/src/MuonCombinedInDetExtensionAlg.h b/Reconstruction/MuonIdentification/MuonCombinedAlgs/src/MuonCombinedInDetExtensionAlg.h
index aace58bb052c..dbebf2928022 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedAlgs/src/MuonCombinedInDetExtensionAlg.h
+++ b/Reconstruction/MuonIdentification/MuonCombinedAlgs/src/MuonCombinedInDetExtensionAlg.h
@@ -92,6 +92,7 @@ class MuonCombinedInDetExtensionAlg : public AthAlgorithm {
         "MuGirlMETracks",
         "ME track collection",
     };
+    // these are the MuGirl segments inputs
     SG::WriteHandleKey<Trk::SegmentCollection> m_segments{
         this,
         "SegmentCollection",
diff --git a/Reconstruction/MuonIdentification/MuonCombinedAlgs/src/MuonCreatorAlg.cxx b/Reconstruction/MuonIdentification/MuonCombinedAlgs/src/MuonCreatorAlg.cxx
index e66d0fdc6aaf..e442f3ba5e53 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedAlgs/src/MuonCreatorAlg.cxx
+++ b/Reconstruction/MuonIdentification/MuonCombinedAlgs/src/MuonCreatorAlg.cxx
@@ -16,9 +16,14 @@
 #include "xAODMuon/SlowMuonAuxContainer.h"
 #include "xAODCaloEvent/CaloClusterContainer.h"
 #include "xAODCaloEvent/CaloClusterAuxContainer.h"
+#include "GaudiKernel/SystemOfUnits.h"
 
 #include <vector>
 
+namespace {
+  static constexpr const double MeVtoGeV = 1/Gaudi::Units::GeV;
+}
+
 MuonCreatorAlg::MuonCreatorAlg(const std::string& name, ISvcLocator* pSvcLocator):
   AthAlgorithm(name,pSvcLocator) {
 }
@@ -33,8 +38,6 @@ StatusCode MuonCreatorAlg::initialize()
   ATH_CHECK(m_muonCandidateCollectionName.initialize(!m_buildSlowMuon));
   //Can't use a flag in intialize for an array of keys
   if(!m_doSA) ATH_CHECK(m_tagMaps.initialize());
-  m_segTrkContainerName = "Trk"+m_segContainerName.key();
-  m_segContainerName = "xaod"+m_segContainerName.key();
   ATH_CHECK(m_segContainerName.initialize());
   ATH_CHECK(m_segTrkContainerName.initialize());
   m_combinedTrkCollectionName = m_combinedCollectionName.key()+"Tracks";
@@ -176,26 +179,26 @@ StatusCode MuonCreatorAlg::execute()
   //---------------------------------------------------------------------------------------------------------------------//
 
   // Only run monitoring for online algorithms
-  if ( not m_monTool.name().empty() ) {
+  if (!m_monTool.name().empty()) {
     // Monitoring histograms and variables
     auto muon_n     = Monitored::Scalar<int>("muon_n", wh_muons->size());
-    auto muon_pt    = Monitored::Collection("muon_pt",    *(wh_muons.ptr()),  [](auto const& mu) {return mu->pt()/1000.0;}); // converted to GeV
+    auto muon_pt    = Monitored::Collection("muon_pt",    *(wh_muons.ptr()),  [](auto const& mu) {return mu->pt()*MeVtoGeV;}); // converted to GeV
     auto muon_eta   = Monitored::Collection("muon_eta",   *(wh_muons.ptr()),  &xAOD::Muon_v1::eta);
     auto muon_phi   = Monitored::Collection("muon_phi",   *(wh_muons.ptr()),  &xAOD::Muon_v1::phi);
 
     auto satrks_n     = Monitored::Scalar<int>("satrks_n", wh_extrtp->size());
-    auto satrks_pt  = Monitored::Collection("satrks_pt",  *(wh_extrtp.ptr()), [](auto const& satrk) {return satrk->pt()/1000.0;}); // converted to GeV
+    auto satrks_pt  = Monitored::Collection("satrks_pt",  *(wh_extrtp.ptr()), [](auto const& satrk) {return satrk->pt()*MeVtoGeV;}); // converted to GeV
     auto satrks_eta = Monitored::Collection("satrks_eta", *(wh_extrtp.ptr()), &xAOD::TrackParticle_v1::eta);
     auto satrks_phi = Monitored::Collection("satrks_phi", *(wh_extrtp.ptr()), &xAOD::TrackParticle_v1::phi);
 
     auto cbtrks_n   = Monitored::Scalar<int>("cbtrks_n", wh_combtp->size());    
-    auto cbtrks_pt  = Monitored::Collection("cbtrks_pt",  *(wh_combtp.ptr()), [](auto const& cbtrk) {return cbtrk->pt()/1000.0;}); // converted to GeV
+    auto cbtrks_pt  = Monitored::Collection("cbtrks_pt",  *(wh_combtp.ptr()), [](auto const& cbtrk) {return cbtrk->pt()*MeVtoGeV;}); // converted to GeV
     auto cbtrks_eta = Monitored::Collection("cbtrks_eta", *(wh_combtp.ptr()), &xAOD::TrackParticle_v1::eta);
     auto cbtrks_phi = Monitored::Collection("cbtrks_phi", *(wh_combtp.ptr()), &xAOD::TrackParticle_v1::phi);
 
     if (!m_doSA) {
       auto idtrks_n   = Monitored::Scalar<int>("idtrks_n", indetCandidateCollection->size());
-      auto idtrks_pt  = Monitored::Collection("idtrks_pt", *indetCandidateCollection, [](auto const& idtrk) {return idtrk->indetTrackParticle().pt()/1000.0;});
+      auto idtrks_pt  = Monitored::Collection("idtrks_pt", *indetCandidateCollection, [](auto const& idtrk) {return idtrk->indetTrackParticle().pt()*MeVtoGeV;});
       auto idtrks_eta = Monitored::Collection("idtrks_eta", *indetCandidateCollection, [](auto const& idtrk) {return idtrk->indetTrackParticle().eta();});
       auto idtrks_phi = Monitored::Collection("idtrks_phi", *indetCandidateCollection, [](auto const& idtrk) {return idtrk->indetTrackParticle().phi();});
       auto monitorIt = Monitored::Group(m_monTool, muon_n, muon_pt, muon_eta, muon_phi, satrks_n, satrks_pt, satrks_eta, satrks_phi, cbtrks_n, cbtrks_pt,
diff --git a/Reconstruction/MuonIdentification/MuonCombinedAlgs/src/MuonCreatorAlg.h b/Reconstruction/MuonIdentification/MuonCombinedAlgs/src/MuonCreatorAlg.h
index 23f8b75dd562..754f58f9aa67 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedAlgs/src/MuonCreatorAlg.h
+++ b/Reconstruction/MuonIdentification/MuonCombinedAlgs/src/MuonCreatorAlg.h
@@ -52,8 +52,11 @@ class MuonCreatorAlg : public AthAlgorithm
   SG::ReadHandleKey<InDetCandidateCollection> m_indetCandidateCollectionName{this,"InDetCandidateLocation","InDetCandidates","ID candidates"};
   SG::ReadHandleKey<MuonCandidateCollection> m_muonCandidateCollectionName{this,"MuonCandidateLocation","MuonCandidates","Muon candidates"};
   SG::ReadHandleKeyArray<MuonCombined::InDetCandidateToTagMap> m_tagMaps{this,"TagMaps",{"muidcoTagMap","stacoTagMap","muGirlTagMap","caloTagMap","segmentTagMap"},"ID candidate to tag maps"};
-  SG::WriteHandleKey<xAOD::MuonSegmentContainer> m_segContainerName{this, "SegmentContainerName", "MuonSegments", "Segments"};
-  SG::WriteHandleKey<Trk::SegmentCollection> m_segTrkContainerName{this,"TrackSegmentContainerName","MuonSegments","Track segments"};
+  SG::WriteHandleKey<xAOD::MuonSegmentContainer> m_segContainerName{this, "SegmentContainerName", "xaodMuonSegments", "Segments"};
+
+  // the following Trk::SegmentCollection MuonSegments are MuGirl segments, the standard MuonSegments are store in MuonSegmentFinderAlg.h
+  SG::WriteHandleKey<Trk::SegmentCollection> m_segTrkContainerName{this,"TrackSegmentContainerName","TrkMuonSegments","Track segments"};
+
   SG::WriteHandleKey<xAOD::CaloClusterContainer> m_clusterContainerName{this, "ClusterContainerName", "MuonClusterCollection", "Clusters"};
   SG::WriteHandleKey<CaloClusterCellLinkContainer> m_clusterContainerLinkName{this,"CaloClusterCellLinkName","MuonClusterCollection","Cluster links"};
 
diff --git a/Reconstruction/MuonIdentification/MuonCombinedBaseTools/src/MuonCreatorTool.cxx b/Reconstruction/MuonIdentification/MuonCombinedBaseTools/src/MuonCreatorTool.cxx
index fff7d67d497b..0a5c02b700c5 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedBaseTools/src/MuonCreatorTool.cxx
+++ b/Reconstruction/MuonIdentification/MuonCombinedBaseTools/src/MuonCreatorTool.cxx
@@ -738,7 +738,7 @@ namespace MuonCombined {
           muon.setTrackParticleLink(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle, link );
         }
         else ATH_MSG_WARNING("Creating of MuGirl TrackParticle Link failed");
-      }     
+      }
     }
 
     if (outputData.xaodSegmentContainer){
@@ -746,10 +746,7 @@ namespace MuonCombined {
 
       std::vector< ElementLink< xAOD::MuonSegmentContainer > > segments;
       for( const auto& segLink : tag->segments() ){ 
-	
-        ElementLink<xAOD::MuonSegmentContainer> link = createMuonSegmentElementLink(segLink,
-                                                                                    *outputData.xaodSegmentContainer,
-										    outputData.muonSegmentCollection);
+        ElementLink<xAOD::MuonSegmentContainer> link = createMuonSegmentElementLink(segLink, *outputData.xaodSegmentContainer, outputData.muonSegmentCollection);
         if( link.isValid() ) {
           //link.toPersistent();
           segments.push_back(link);
@@ -758,7 +755,7 @@ namespace MuonCombined {
         else ATH_MSG_WARNING("Creating of MuGirl segment Link failed");         
       }
       muon.setMuonSegmentLinks(segments);
-    }  
+    }
     ATH_MSG_DEBUG("Done Adding MuGirl Muon  " << tag->author() << " type " << tag->type());    
   }
 
diff --git a/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedReconstructionConfig.py b/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedReconstructionConfig.py
index 36ddf5317f33..3ba9de7e4146 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedReconstructionConfig.py
+++ b/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedReconstructionConfig.py
@@ -255,7 +255,8 @@ def StauCreatorAlgCfg(flags, name="StauCreatorAlg", **kwargs ):
     kwargs.setdefault("ExtrapolatedLocation","ExtrapolatedStau")
     kwargs.setdefault("MSOnlyExtrapolatedLocation","MSOnlyExtrapolatedStau")
     kwargs.setdefault("MuonCandidateLocation","")
-    kwargs.setdefault("SegmentContainerName","StauSegments")
+    kwargs.setdefault("SegmentContainerName","xaodStauSegments")
+    kwargs.setdefault("TrackSegmentContainerName","TrkStauSegments")
     kwargs.setdefault("BuildSlowMuon",1)
     kwargs.setdefault("ClusterContainerName", "SlowMuonClusterCollection")
     kwargs.setdefault("TagMaps",["stauTagMap"])
diff --git a/Reconstruction/MuonIdentification/MuonCombinedRecExample/python/MuonCombinedAlgs.py b/Reconstruction/MuonIdentification/MuonCombinedRecExample/python/MuonCombinedAlgs.py
index 2035e3bf58a6..3baeb10f2c1e 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedRecExample/python/MuonCombinedAlgs.py
+++ b/Reconstruction/MuonIdentification/MuonCombinedRecExample/python/MuonCombinedAlgs.py
@@ -199,8 +199,8 @@ def MuonCreatorAlg_LRT( name="MuonCreatorAlg_LRT",**kwargs ):
     kwargs.setdefault("ExtrapolatedLocation", "ExtraPolated"+MuonCbKeys.FinalMuonsLargeD0())
     kwargs.setdefault("MSOnlyExtrapolatedLocation", "MSOnlyExtraPolated"+MuonCbKeys.FinalMuonsLargeD0())
     kwargs.setdefault("CombinedLocation", "Combined"+MuonCbKeys.FinalMuonsLargeD0())
-    kwargs.setdefault("SegmentContainerName", "MuonSegments_LRT")
-    kwargs.setdefault("TrackSegmentContainerName", "TrackMuonSegments_LRT")
+    kwargs.setdefault("SegmentContainerName", "xaodMuonSegments_LRT")
+    kwargs.setdefault("TrackSegmentContainerName", "TrkMuonSegments_LRT")
     kwargs.setdefault("BuildSlowMuon", False)
     kwargs.setdefault("MakeClusters", False)
     kwargs.setdefault("ClusterContainerName", "")
@@ -216,7 +216,8 @@ def StauCreatorAlg( name="StauCreatorAlg", **kwargs ):
     kwargs.setdefault("ExtrapolatedLocation","ExtrapolatedStau")
     kwargs.setdefault("MSOnlyExtrapolatedLocation","MSOnlyExtrapolatedStau")
     kwargs.setdefault("MuonCandidateLocation","")
-    kwargs.setdefault("SegmentContainerName","StauSegments")
+    kwargs.setdefault("SegmentContainerName","xaodStauSegments")
+    kwargs.setdefault("TrackSegmentContainerName","TrkStauSegments")
     kwargs.setdefault("BuildSlowMuon",1)
     kwargs.setdefault("ClusterContainerName", "SlowMuonClusterCollection")
     kwargs.setdefault("TagMaps",["stauTagMap"])
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py
index ffae34767d60..b3de9157559c 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py
@@ -785,7 +785,7 @@ def muEFCBRecoSequence( RoIs, name ):
     cbMuonName = muNamesFS.EFCBName
 
   themuoncbcreatoralg = MuonCreatorAlg("TrigMuonCreatorAlgCB_"+name, MuonCandidateLocation=candidatesName, TagMaps=["muidcoTagMap"], InDetCandidateLocation="InDetCandidates_"+name,
-                                       MuonContainerLocation = cbMuonName, SegmentContainerName = "CBSegments", ExtrapolatedLocation = "CBExtrapolatedMuons",
+                                       MuonContainerLocation = cbMuonName, SegmentContainerName = "xaodCBSegments", TrackSegmentContainerName = "TrkCBSegments", ExtrapolatedLocation = "CBExtrapolatedMuons",
                                        MSOnlyExtrapolatedLocation = "CBMSonlyExtrapolatedMuons", CombinedLocation = "HLT_CBCombinedMuon_"+name,
                                        MonTool = MuonCreatorAlgMonitoring("MuonCreatorAlgCB_"+name))
 
@@ -921,7 +921,7 @@ def muEFInsideOutRecoSequence(RoIs, name):
   else:
     theInsideOutRecoAlg = MuonInsideOutRecoAlg("TrigMuonInsideOutRecoAlg_"+name,InDetCandidateLocation="InDetCandidates_"+name)
     insideoutcreatoralg = MuonCreatorAlg("TrigMuonCreatorAlgInsideOut_"+name, TagMaps=["muGirlTagMap"],InDetCandidateLocation="InDetCandidates_"+name,
-                                         MuonContainerLocation = cbMuonName, SegmentContainerName = "InsideOutCBSegments", ExtrapolatedLocation = "InsideOutCBExtrapolatedMuons",
+                                         MuonContainerLocation = cbMuonName, SegmentContainerName = "xaodInsideOutCBSegments", TrackSegmentContainerName = "TrkInsideOutCBSegments", ExtrapolatedLocation = "InsideOutCBExtrapolatedMuons",
                                          MSOnlyExtrapolatedLocation = "InsideOutCBMSOnlyExtrapolatedMuons", CombinedLocation = "InsideOutCBCombinedMuon", MonTool = MuonCreatorAlgMonitoring("MuonCreatorAlgInsideOut_"+name))
 
   efAlgs.append(theInsideOutRecoAlg)
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/generateMuon.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/generateMuon.py
index cce859909024..747038c4ec9e 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/generateMuon.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/generateMuon.py
@@ -377,7 +377,7 @@ def generateChains( flags, chainDict ):
         recoCB.mergeReco(muonCombCfg)
 
         muonCreatorCBCfg = MuonCreatorAlgCfg(muonflags, name="TrigMuonCreatorAlgCB_RoI", MuonCandidateLocation="MuonCandidates", TagMaps=["muidcoTagMap"], 
-                                            InDetCandidateLocation="InDetCandidates_RoI", MuonContainerLocation = "MuonsCB", SegmentContainerName = "CBSegments", 
+                                            InDetCandidateLocation="InDetCandidates_RoI", MuonContainerLocation = "MuonsCB", SegmentContainerName = "xaodCBSegments", TrackSegmentContainerName = "TrkCBSegments",
                                             ExtrapolatedLocation = "CBExtrapolatedMuons", MSOnlyExtrapolatedLocation = "CBMSonlyExtrapolatedMuons", CombinedLocation = "HLT_CBCombinedMuon_RoI")
         recoCB.mergeReco(muonCreatorCBCfg)
 
-- 
GitLab


From 61f8398517c37ab43564d9b9de739c607c11a26a Mon Sep 17 00:00:00 2001
From: Christos Anastopoulos <christos.anastopoulos@cern.ch>
Date: Fri, 18 Dec 2020 13:05:57 +0000
Subject: [PATCH 154/225] Distance Solution : Move inline methods to .icc ,
 default ctor,dtor,copy,move

---
 .../TrkSurfaces/DistanceSolution.h            | 86 +++++--------------
 .../TrkSurfaces/DistanceSolution.icc          | 69 +++++++++++++++
 .../TrkSurfaces/src/DistanceSolution.cxx      | 28 ------
 3 files changed, 91 insertions(+), 92 deletions(-)
 create mode 100644 Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.icc
 delete mode 100644 Tracking/TrkDetDescr/TrkSurfaces/src/DistanceSolution.cxx

diff --git a/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.h b/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.h
index 60ee6ea87fed..d38c5f9e7714 100644
--- a/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.h
+++ b/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.h
@@ -9,9 +9,7 @@
 #ifndef TRKSURFACES_DISTANCESOLUTION_H
 #define TRKSURFACES_DISTANCESOLUTION_H
 
-// STD
-#include <iostream>
-#include <math.h>
+#include <cmath>
 
 namespace Trk {
 
@@ -26,14 +24,19 @@ namespace Trk {
 class DistanceSolution
 {
 public:
-  /**Default Constructor*/
-  DistanceSolution();
-
-  /**Constructor*/
-  DistanceSolution(int num, double current = 0., bool signedDist = false, double first = 0., double second = 0.);
-
-  /**Destructor*/
-  virtual ~DistanceSolution() = default;
+  DistanceSolution() = default;
+  DistanceSolution(const DistanceSolution&) = default;
+  DistanceSolution(DistanceSolution&&) = default;
+  DistanceSolution& operator=(const DistanceSolution&) = default;
+  DistanceSolution& operator=(DistanceSolution&&) = default;
+  ~DistanceSolution() = default;
+
+   /**Constructor*/
+  DistanceSolution(int num,
+                   double current = 0.,
+                   bool signedDist = false,
+                   double first = 0.,
+                   double second = 0.);
 
   // methods to access solutions
   /** Number of intersection solutions*/
@@ -42,7 +45,8 @@ public:
   /** Distance to first intersection solution along direction*/
   double first() const;
 
-  /** Distance to second intersection solution along direction (for a cylinder surface)*/
+  /** Distance to second intersection solution along direction (for a cylinder
+   * surface)*/
   double second() const;
 
   /** Absolute Distance to closest solution */
@@ -51,14 +55,15 @@ public:
   /** Distance to point of closest approach along direction*/
   double toPointOfClosestApproach() const;
 
-  /** Current distance to surface (spatial), signed (along/opposite to surface normal) if input argument true (absolute
-   * value by default)*/
+  /** Current distance to surface (spatial), signed (along/opposite to surface
+   * normal) if input argument true (absolute value by default)*/
   double currentDistance(bool signedDist = false) const;
 
-  /** This method indicates availability of signed current distance (false for Perigee and StraighLineSurface) */
+  /** This method indicates availability of signed current distance (false for
+   * Perigee and StraighLineSurface) */
   bool signedDistance() const;
 
-protected:
+private:
   int m_num;
   double m_first;
   double m_second;
@@ -66,54 +71,7 @@ protected:
   bool m_signedDist;
 };
 
-inline int
-DistanceSolution::numberOfSolutions() const
-{
-  return m_num;
-}
-
-inline double
-DistanceSolution::first() const
-{
-  return m_first;
-}
-
-inline double
-DistanceSolution::second() const
-{
-  return m_second;
-}
-
-inline double
-DistanceSolution::absClosest() const
-{
-  if (m_num > 1)
-    return (m_first * m_first < m_second * m_second) ? fabs(m_first) : fabs(m_second);
-  else
-    return fabs(m_first);
-}
-
-inline double
-DistanceSolution::toPointOfClosestApproach() const
-{
-  return m_first;
-}
-
-inline double
-DistanceSolution::currentDistance(bool signedDist) const
-{
-  if (signedDist)
-    return m_current;
-  else
-    return fabs(m_current);
-}
-
-inline bool
-DistanceSolution::signedDistance() const
-{
-  return m_signedDist;
-}
-
 } // end of namespace
 
+#include "TrkSurfaces/DistanceSolution.icc"
 #endif // TRKSURFACES_DISTANCESOLUTION_H
diff --git a/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.icc b/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.icc
new file mode 100644
index 000000000000..15ef7e32d23a
--- /dev/null
+++ b/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.icc
@@ -0,0 +1,69 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+namespace Trk {
+inline DistanceSolution::DistanceSolution(int num,
+                                          double current,
+                                          bool signedDist,
+                                          double first,
+                                          double second)
+  : m_num(num)
+  , m_first(first)
+  , m_second(second)
+  , m_current(current)
+  , m_signedDist(signedDist)
+{}
+
+inline int
+DistanceSolution::numberOfSolutions() const
+{
+  return m_num;
+}
+
+inline double
+DistanceSolution::first() const
+{
+  return m_first;
+}
+
+inline double
+DistanceSolution::second() const
+{
+  return m_second;
+}
+
+inline double
+DistanceSolution::absClosest() const
+{
+  if (m_num > 1) {
+    return (m_first * m_first < m_second * m_second) ? std::abs(m_first)
+                                                     : std::abs(m_second);
+  } else {
+    return std::abs(m_first);
+  }
+}
+
+inline double
+DistanceSolution::toPointOfClosestApproach() const
+{
+  return m_first;
+}
+
+inline double
+DistanceSolution::currentDistance(bool signedDist) const
+{
+  if (signedDist) {
+    return m_current;
+  } else {
+    return std::abs(m_current);
+  }
+}
+
+inline bool
+DistanceSolution::signedDistance() const
+{
+  return m_signedDist;
+}
+
+} // end of namespace
+
diff --git a/Tracking/TrkDetDescr/TrkSurfaces/src/DistanceSolution.cxx b/Tracking/TrkDetDescr/TrkSurfaces/src/DistanceSolution.cxx
deleted file mode 100644
index a7d7a4cdf548..000000000000
--- a/Tracking/TrkDetDescr/TrkSurfaces/src/DistanceSolution.cxx
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
-*/
-
-///////////////////////////////////////////////////////////////////
-// DistanceSolution.cxx, (c) ATLAS Detector Software
-///////////////////////////////////////////////////////////////////
-
-// Trk
-#include "TrkSurfaces/DistanceSolution.h"
-
-// default constructor
-Trk::DistanceSolution::DistanceSolution()
-  : m_num()
-  , m_first()
-  , m_second()
-  , m_current()
-  , m_signedDist()
-{}
-
-// constructor
-Trk::DistanceSolution::DistanceSolution(int num, double current, bool signedDist, double first, double second)
-  : m_num(num)
-  , m_first(first)
-  , m_second(second)
-  , m_current(current)
-  , m_signedDist(signedDist)
-{}
-- 
GitLab


From 3b8863d3376e205f91fcff71e50ce76c7b9e1f53 Mon Sep 17 00:00:00 2001
From: Oliver Majersky <oliver.majersky@cern.ch>
Date: Fri, 18 Dec 2020 15:11:30 +0100
Subject: [PATCH 155/225] Re-enable calibration and selection for large-R jets.

---
 .../Root/TopObjectSelection.cxx               |  3 +-
 .../Root/JetObjectCollectionMaker.cxx         | 28 +++++++++++--------
 2 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopObjectSelectionTools/Root/TopObjectSelection.cxx b/PhysicsAnalysis/TopPhys/xAOD/TopObjectSelectionTools/Root/TopObjectSelection.cxx
index 2430e825e7a9..784e2854a250 100644
--- a/PhysicsAnalysis/TopPhys/xAOD/TopObjectSelectionTools/Root/TopObjectSelection.cxx
+++ b/PhysicsAnalysis/TopPhys/xAOD/TopObjectSelectionTools/Root/TopObjectSelection.cxx
@@ -523,8 +523,7 @@ namespace top {
                  "TopObjectSelection::applySelectionPreOverlapRemovalLargeRJets() failed to retrieve large R jets");
 
       for (auto jetPtr : *jets) {
-        //char decoration = m_largeJetSelection->passSelection(*jetPtr);
-        char decoration = '0';
+        char decoration = m_largeJetSelection->passSelection(*jetPtr);
         jetPtr->auxdecor<char>(m_passPreORSelection) = decoration;
         jetPtr->auxdecor<char>(m_ORToolDecoration) = decoration * 2;
         if (m_doLooseCuts) {
diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/Root/JetObjectCollectionMaker.cxx b/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/Root/JetObjectCollectionMaker.cxx
index 244d7303f591..ac997ed1b6ec 100644
--- a/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/Root/JetObjectCollectionMaker.cxx
+++ b/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/Root/JetObjectCollectionMaker.cxx
@@ -249,17 +249,15 @@ namespace top {
     if (m_config->jetSubstructureName() == "SubjetMaker") m_jetSubstructure.reset(new top::SubjetMaker);
 
     ///-- Large R jet truth labeling --///
-//    m_jetTruthLabelingTool = nullptr;
-//    if (m_config->isMC() && m_config->useLargeRJets()) {
-//      m_jetTruthLabelingTool = std::unique_ptr<JetTruthLabelingTool>(new JetTruthLabelingTool("JetTruthLabeling"));
-//      // For DAOD_PHYS we need to pass few more arguments as it uses TRUTH3
-//      if (m_config->getDerivationStream() == "PHYS") {
-//        top::check(m_jetTruthLabelingTool->setProperty("UseTRUTH3", true), "Failed to set UseTRUTH3 for m_jetTruthLabelingTool");
-//        top::check(m_jetTruthLabelingTool->setProperty("TruthBosonContainerName", "TruthBoson"), "Failed to set truth container name for m_jetTruthLabelingTool");
-//        top::check(m_jetTruthLabelingTool->setProperty("TruthTopQuarkContainerName", "TruthTop"), "Failed to set truth container name for m_jetTruthLabelingTool");
-//      }
-//      top::check(m_jetTruthLabelingTool->initialize(), "Failed to initialize m_jetTruthLabelingTool");
-//    }
+    m_jetTruthLabelingTool = nullptr;
+    if (m_config->isMC() && m_config->useLargeRJets()) {
+      m_jetTruthLabelingTool = std::unique_ptr<JetTruthLabelingTool>(new JetTruthLabelingTool("JetTruthLabeling"));
+      // For DAOD_PHYS we need to pass few more arguments as it uses TRUTH3
+      top::check(m_jetTruthLabelingTool->setProperty("UseTRUTH3", true), "Failed to set UseTRUTH3 for m_jetTruthLabelingTool");
+      top::check(m_jetTruthLabelingTool->setProperty("TruthBosonContainerName", "TruthBoson"), "Failed to set truth container name for m_jetTruthLabelingTool");
+      top::check(m_jetTruthLabelingTool->setProperty("TruthTopQuarkContainerName", "TruthTop"), "Failed to set truth container name for m_jetTruthLabelingTool");
+      top::check(m_jetTruthLabelingTool->initialize(), "Failed to initialize m_jetTruthLabelingTool");
+   }
 
     // set the systematics list
     m_config->systematicsJets(specifiedSystematics());
@@ -383,7 +381,13 @@ namespace top {
 
     ///-- Apply calibration --///
     ///-- Calibrate jet container --///
-    top::check(m_jetCalibrationTool->applyCalibration(*(shallow_xaod_copy.first)), "Failed to applyCalibration");
+    if (isLargeR) {
+      top::check(m_jetCalibrationToolLargeR->applyCalibration(*(shallow_xaod_copy.first)),
+          "Failed to do applyCalibration on large-R jets");
+    } else {
+      top::check(m_jetCalibrationTool->applyCalibration(*(shallow_xaod_copy.first)),
+          "Failed to do applyCalibration on small-R jets");
+    }
 
     ///-- Loop over the xAOD Container --///
     for (const auto jet : *(shallow_xaod_copy.first)) {
-- 
GitLab


From 541d832338f182b7b92fbeeb3f14635edf4d5a6d Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Mon, 7 Dec 2020 22:47:19 -0500
Subject: [PATCH 156/225] AthenaKernel: Fix a typo in comments.

Fix a typo in comments.
---
 Control/AthenaKernel/AthenaKernel/RCUUpdater.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Control/AthenaKernel/AthenaKernel/RCUUpdater.h b/Control/AthenaKernel/AthenaKernel/RCUUpdater.h
index 52ad28d0b300..1f36834bc0a1 100644
--- a/Control/AthenaKernel/AthenaKernel/RCUUpdater.h
+++ b/Control/AthenaKernel/AthenaKernel/RCUUpdater.h
@@ -1,6 +1,6 @@
 // This file's extension implies that it's C, but it's really -*- C++ -*-.
 /*
- * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration.
+ * Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration.
  */
 // $Id$
 /**
@@ -81,7 +81,7 @@ public:
    * @param p The object to delete.
    *
    * The object @c p will be queued for deletion once a grace period
-   * has passed for all slots.  In contrast to using @c updater,
+   * has passed for all slots.  In contrast to using @c update,
    * this does not change the current object.  It also does not mark
    * the current slot as having completed the grace period (so this can
    * be called by a thread running outside of a slot context).
-- 
GitLab


From fe7907bcc1980dd7b1bee93863d938f5533c327a Mon Sep 17 00:00:00 2001
From: Jonathan Bossio <jonathan.bossio@cern.ch>
Date: Fri, 18 Dec 2020 14:43:19 +0000
Subject: [PATCH 157/225] Simplify conf of offline MT jet trigger monitoring

---
 .../python/TrigJetMonitorAlgorithm.py         | 162 +++++++-----------
 1 file changed, 64 insertions(+), 98 deletions(-)

diff --git a/Trigger/TrigMonitoring/TrigJetMonitoring/python/TrigJetMonitorAlgorithm.py b/Trigger/TrigMonitoring/TrigJetMonitoring/python/TrigJetMonitorAlgorithm.py
index 8dbad0384928..a4c69b02dfdc 100644
--- a/Trigger/TrigMonitoring/TrigJetMonitoring/python/TrigJetMonitorAlgorithm.py
+++ b/Trigger/TrigMonitoring/TrigJetMonitoring/python/TrigJetMonitorAlgorithm.py
@@ -35,82 +35,54 @@ Chain2L1JetCollDict = { # set L1 jet collection name for L1 jet chains
 # HLT jet collections and chains to monitor
 ############################################
 
-Chain2JetCollDict  = dict() # set HLT jet collection for AT and legacy master HLT jet chains
-JetCollections     = dict() # List of HLT jet collections for AT and legacy master
-TurnOnCurves       = dict() # List reference chains and offline jet collections to be used for producing turn-on curves
-JetColls2Match     = dict()
+Chains2Monitor  = dict() # set HLT jet collection, reference chain and offline jet collection for turn-on curves, for AT and legacy master HLT jet chains
+JetCollections  = dict() # List of HLT jet collections for AT and legacy master (stating which should be matched and to which offline jet collection
 
 # AthenaMT
-JetCollections['MT'] = [
-  'HLT_AntiKt4EMTopoJets_subjesIS',                   # default small-R EM
-  'HLT_AntiKt10JetRCJets_subjesIS',                   # a10r
-  'HLT_AntiKt10LCTopoJets_subjes',                    # a10
-  'HLT_AntiKt10LCTopoTrimmedPtFrac4SmallR20Jets_jes', # a10t
-  'HLT_AntiKt4EMPFlowJets_subjesIS_ftf',              # pflow w/o calo+track GSC
-  'HLT_AntiKt4EMPFlowJets_subjesgscIS_ftf',           # pflow w/ calo+track GSC
-  'HLT_AntiKt4EMPFlowJets_subresjesgscIS_ftf',        # pflow w/ residual + calo+track GSC
-  'HLT_AntiKt4EMPFlowJets_nojcalib_ftf',              # pflow nojcalib
-  'HLT_AntiKt4EMPFlowCSSKJets_nojcalib_ftf',          # pflow cssk nojcalib
-]
-Chain2JetCollDict['MT'] = {
-  'HLT_j420_L1J100'                        : 'HLT_AntiKt4EMTopoJets_subjesIS',
-  'HLT_j260_320eta490_L1J75_31ETA49'       : 'HLT_AntiKt4EMTopoJets_subjesIS',
-  'HLT_5j70_0eta240_L14J20'                : 'HLT_AntiKt4EMTopoJets_subjesIS',
-  'HLT_3j200_L1J100'                       : 'HLT_AntiKt4EMTopoJets_subjesIS',
-  'HLT_j460_a10r_L1J100'                   : 'HLT_AntiKt10JetRCJets_subjesIS',
-  'HLT_j460_a10_lcw_subjes_L1J100'         : 'HLT_AntiKt10LCTopoJets_subjes',
-  'HLT_j460_a10t_lcw_jes_L1J100'           : 'HLT_AntiKt10LCTopoTrimmedPtFrac4SmallR20Jets_jes',
-  'HLT_2j330_a10t_lcw_jes_35smcINF_L1J100' : 'HLT_AntiKt10LCTopoTrimmedPtFrac4SmallR20Jets_jes',
-  'HLT_j45_pf_ftf_L1J15'                   : 'HLT_AntiKt4EMPFlowJets_subjesIS_ftf',
-  'HLT_j45_pf_subjesgscIS_ftf_L1J15'       : 'HLT_AntiKt4EMPFlowJets_subjesgscIS_ftf',
-  'HLT_j85_pf_ftf_L1J20'                   : 'HLT_AntiKt4EMPFlowJets_subjesIS_ftf',
-  'HLT_j45_pf_nojcalib_ftf_L1J15'          : 'HLT_AntiKt4EMPFlowJets_nojcalib_ftf',
-  'HLT_j45_csskpf_nojcalib_ftf_L1J15'      : 'HLT_AntiKt4EMPFlowCSSKJets_nojcalib_ftf',
-  'HLT_10j40_pf_subresjesgscIS_ftf_L14J15' : 'HLT_AntiKt4EMPFlowJets_subresjesgscIS_ftf',
-}
-TurnOnCurves['MT'] = { # ref chain, offline jet coll
-  'HLT_j420_L1J100'                        : ['HLT_j85_L1J20','AntiKt4EMTopoJets'],
-  'HLT_3j200_L1J100'                       : ['HLT_j85_L1J20','AntiKt4EMTopoJets'],
-  'HLT_j460_a10r_L1J100'                   : ['HLT_j85_L1J20','AntiKt4EMTopoJets'],
-  'HLT_j460_a10_lcw_subjes_L1J100'         : ['HLT_j85_L1J20','AntiKt4EMTopoJets'],
-  'HLT_j460_a10t_lcw_jes_L1J100'           : ['HLT_j85_L1J20','AntiKt4EMTopoJets'],
-  'HLT_2j330_a10t_lcw_jes_35smcINF_L1J100' : ['HLT_j85_L1J20','AntiKt4EMTopoJets'],
-  'HLT_j85_pf_ftf_L1J20'                   : ['HLT_j45_pf_ftf_L1J15','AntiKt4EMPFlowJets'],
+JetCollections['MT'] = {
+  'HLT_AntiKt4EMTopoJets_subjesIS'                   : { 'MatchTo' : 'AntiKt4EMPFlowJets' }, # default small-R EM
+  'HLT_AntiKt10JetRCJets_subjesIS'                   : { 'MatchTo' : 'NONE' },               # a10r
+  'HLT_AntiKt10LCTopoJets_subjes'                    : { 'MatchTo' : 'NONE' },               # a10
+  'HLT_AntiKt10LCTopoTrimmedPtFrac4SmallR20Jets_jes' : { 'MatchTo' : 'NONE' },               # a10t
+  'HLT_AntiKt4EMPFlowJets_subjesIS_ftf'              : { 'MatchTo' : 'AntiKt4EMPFlowJets' }, # pflow w/o calo+track GSC
+  'HLT_AntiKt4EMPFlowJets_subjesgscIS_ftf'           : { 'MatchTo' : 'AntiKt4EMPFlowJets' }, # pflow w/ calo+track GSC
+  'HLT_AntiKt4EMPFlowJets_subresjesgscIS_ftf'        : { 'MatchTo' : 'AntiKt4EMPFlowJets' }, # pflow w/ residual + calo+track GSC
+  'HLT_AntiKt4EMPFlowJets_nojcalib_ftf'              : { 'MatchTo' : 'NONE' },               # pflow nojcalib
+  'HLT_AntiKt4EMPFlowCSSKJets_nojcalib_ftf'          : { 'MatchTo' : 'NONE' },               # pflow cssk nojcalib
 }
-JetColls2Match['MT'] = {
-  'HLT_AntiKt4EMTopoJets_subjesIS'            : 'AntiKt4EMPFlowJets',
-  'HLT_AntiKt4EMPFlowJets_subjesIS_ftf'       : 'AntiKt4EMPFlowJets',
-  'HLT_AntiKt4EMPFlowJets_subjesgscIS_ftf'    : 'AntiKt4EMPFlowJets',
-  'HLT_AntiKt4EMPFlowJets_subresjesgscIS_ftf' : 'AntiKt4EMPFlowJets',
+Chains2Monitor['MT'] = {
+  'HLT_j420_L1J100'                        : { 'HLTColl' : 'HLT_AntiKt4EMTopoJets_subjesIS',                   'RefChain' : 'HLT_j85_L1J20',        'OfflineColl' : 'AntiKt4EMTopoJets' },
+  'HLT_j260_320eta490_L1J75_31ETA49'       : { 'HLTColl' : 'HLT_AntiKt4EMTopoJets_subjesIS',                   'RefChain' : 'NONE',                 'OfflineColl' : 'NONE' },
+  'HLT_5j70_0eta240_L14J20'                : { 'HLTColl' : 'HLT_AntiKt4EMTopoJets_subjesIS',                   'RefChain' : 'NONE',                 'OfflineColl' : 'NONE' },
+  'HLT_3j200_L1J100'                       : { 'HLTColl' : 'HLT_AntiKt4EMTopoJets_subjesIS',                   'RefChain' : 'HLT_j85_L1J20',        'OfflineColl' : 'AntiKt4EMTopoJets' },
+  'HLT_j460_a10r_L1J100'                   : { 'HLTColl' : 'HLT_AntiKt10JetRCJets_subjesIS',                   'RefChain' : 'HLT_j85_L1J20',        'OfflineColl' : 'AntiKt4EMTopoJets' },
+  'HLT_j460_a10_lcw_subjes_L1J100'         : { 'HLTColl' : 'HLT_AntiKt10LCTopoJets_subjes',                    'RefChain' : 'HLT_j85_L1J20',        'OfflineColl' : 'AntiKt4EMTopoJets' },
+  'HLT_j460_a10t_lcw_jes_L1J100'           : { 'HLTColl' : 'HLT_AntiKt10LCTopoTrimmedPtFrac4SmallR20Jets_jes', 'RefChain' : 'HLT_j85_L1J20',        'OfflineColl' : 'AntiKt4EMTopoJets' },
+  'HLT_2j330_a10t_lcw_jes_35smcINF_L1J100' : { 'HLTColl' : 'HLT_AntiKt10LCTopoTrimmedPtFrac4SmallR20Jets_jes', 'RefChain' : 'HLT_j85_L1J20',        'OfflineColl' : 'AntiKt4EMTopoJets' },
+  'HLT_j45_pf_ftf_L1J15'                   : { 'HLTColl' : 'HLT_AntiKt4EMPFlowJets_subjesIS_ftf',              'RefChain' : 'NONE',                 'OfflineColl' : 'NONE' },
+  'HLT_j45_pf_subjesgscIS_ftf_L1J15'       : { 'HLTColl' : 'HLT_AntiKt4EMPFlowJets_subjesgscIS_ftf',           'RefChain' : 'NONE',                 'OfflineColl' : 'NONE' },
+  'HLT_j85_pf_ftf_L1J20'                   : { 'HLTColl' : 'HLT_AntiKt4EMPFlowJets_subjesIS_ftf',              'RefChain' : 'HLT_j45_pf_ftf_L1J15', 'OfflineColl' : 'AntiKt4EMPFlowJets' },
+  'HLT_j45_pf_nojcalib_ftf_L1J15'          : { 'HLTColl' : 'HLT_AntiKt4EMPFlowJets_nojcalib_ftf',              'RefChain' : 'NONE',                 'OfflineColl' : 'NONE' },
+  'HLT_j45_csskpf_nojcalib_ftf_L1J15'      : { 'HLTColl' : 'HLT_AntiKt4EMPFlowCSSKJets_nojcalib_ftf',          'RefChain' : 'NONE',                 'OfflineColl' : 'NONE' },
+  'HLT_10j40_pf_subresjesgscIS_ftf_L14J15' : { 'HLTColl' : 'HLT_AntiKt4EMPFlowJets_subresjesgscIS_ftf',        'RefChain' : 'NONE',                 'OfflineColl' : 'NONE' },
 }
 
 # Legacy
-JetCollections['Legacy'] = [
-  'HLT_xAOD__JetContainer_a4tcemsubjesISFS',    # default small-R
-  'HLT_xAOD__JetContainer_a10r_tcemsubjesISFS', # a10r
-  'HLT_xAOD__JetContainer_a10tclcwsubjesFS',    # a10
-  'HLT_xAOD__JetContainer_a10ttclcwjesFS',      # a10t
-]
-Chain2JetCollDict['Legacy'] = {
-  'HLT_j420'                               : 'HLT_xAOD__JetContainer_a4tcemsubjesISFS',
-  'HLT_j260_320eta490'                     : 'HLT_xAOD__JetContainer_a4tcemsubjesISFS',
-  'HLT_j460_a10r_L1J100'                   : 'HLT_xAOD__JetContainer_a10r_tcemsubjesISFS',
-  'HLT_j460_a10_lcw_subjes_L1J100'         : 'HLT_xAOD__JetContainer_a10tclcwsubjesFS',
-  'HLT_j460_a10t_lcw_jes_L1J100'           : 'HLT_xAOD__JetContainer_a10ttclcwjesFS',
-  'HLT_2j330_a10t_lcw_jes_35smcINF_L1J100' : 'HLT_xAOD__JetContainer_a10ttclcwjesFS',
-  'HLT_5j70_0eta240'                       : 'HLT_xAOD__JetContainer_a4tcemsubjesISFS',
-  'HLT_3j200'                              : 'HLT_xAOD__JetContainer_a4tcemsubjesISFS',
-}
-TurnOnCurves['Legacy'] = { # ref chain, offline jet coll
-  'HLT_j420'                               : ['HLT_j175','AntiKt4EMTopoJets'],
-  'HLT_j260_320eta490'                     : ['HLT_j45_320eta490','AntiKt4EMTopoJets'],
-  'HLT_j460_a10r_L1J100'                   : ['HLT_j175','AntiKt4EMTopoJets'],
-  'HLT_j460_a10_lcw_subjes_L1J100'         : ['HLT_j175','AntiKt4EMTopoJets'],
-  'HLT_j460_a10t_lcw_jes_L1J100'           : ['HLT_j175','AntiKt4EMTopoJets'],
-  'HLT_2j330_a10t_lcw_jes_35smcINF_L1J100' : ['HLT_j175','AntiKt4EMTopoJets'],
-  'HLT_3j200'                              : ['HLT_j175','AntiKt4EMTopoJets'],
+JetCollections['Legacy'] = {
+  'HLT_xAOD__JetContainer_a4tcemsubjesISFS'    : { 'MatchTo' : 'NONE' }, # default small-R
+  'HLT_xAOD__JetContainer_a10r_tcemsubjesISFS' : { 'MatchTo' : 'NONE' }, # a10r
+  'HLT_xAOD__JetContainer_a10tclcwsubjesFS'    : { 'MatchTo' : 'NONE' }, # a10
+  'HLT_xAOD__JetContainer_a10ttclcwjesFS'      : { 'MatchTo' : 'NONE' }, # a10t
 }
-JetColls2Match['Legacy'] = {
+Chains2Monitor['Legacy'] = {
+  'HLT_j420'                               : { 'HLTColl' : 'HLT_xAOD__JetContainer_a4tcemsubjesISFS',    'RefChain' : 'HLT_j175',          'OfflineColl' : 'AntiKt4EMTopoJets' },
+  'HLT_j260_320eta490'                     : { 'HLTColl' : 'HLT_xAOD__JetContainer_a4tcemsubjesISFS',    'RefChain' : 'HLT_j45_320eta490', 'OfflineColl' : 'AntiKt4EMTopoJets' },
+  'HLT_j460_a10r_L1J100'                   : { 'HLTColl' : 'HLT_xAOD__JetContainer_a10r_tcemsubjesISFS', 'RefChain' : 'HLT_j175',          'OfflineColl' : 'AntiKt4EMTopoJets' },
+  'HLT_j460_a10_lcw_subjes_L1J100'         : { 'HLTColl' : 'HLT_xAOD__JetContainer_a10tclcwsubjesFS',    'RefChain' : 'HLT_j175',          'OfflineColl' : 'AntiKt4EMTopoJets' },
+  'HLT_j460_a10t_lcw_jes_L1J100'           : { 'HLTColl' : 'HLT_xAOD__JetContainer_a10ttclcwjesFS',      'RefChain' : 'HLT_j175',          'OfflineColl' : 'AntiKt4EMTopoJets' },
+  'HLT_2j330_a10t_lcw_jes_35smcINF_L1J100' : { 'HLTColl' : 'HLT_xAOD__JetContainer_a10ttclcwjesFS',      'RefChain' : 'HLT_j175',          'OfflineColl' : 'AntiKt4EMTopoJets' },
+  'HLT_5j70_0eta240'                       : { 'HLTColl' : 'HLT_xAOD__JetContainer_a4tcemsubjesISFS',    'RefChain' : 'NONE',              'OfflineColl' : 'NONE' },
+  'HLT_3j200'                              : { 'HLTColl' : 'HLT_xAOD__JetContainer_a4tcemsubjesISFS',    'RefChain' : 'HLT_j175',          'OfflineColl' : 'AntiKt4EMTopoJets' },
 }
 
 #########################################################
@@ -187,11 +159,12 @@ def TrigJetMonConfig(inputFlags):
   from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
   cfg = ComponentAccumulator()
 
-  # Match HLT to offline jets
-  for j1,j2 in JetColls2Match[InputType].items():
-    name = 'Matching_{}_{}'.format(j1,j2)
-    alg = CompFactory.JetMatcherAlg(name, JetContainerName1=j1,JetContainerName2=j2)
-    cfg.addEventAlgo(alg)
+  # Match HLT jets to offline jets
+  for hltColl,collDict in JetCollections[InputType].items():
+    if collDict['MatchTo'] != 'NONE':
+      name = 'Matching_{}_{}'.format(hltColl,collDict['MatchTo'])
+      alg = CompFactory.JetMatcherAlg(name, JetContainerName1=hltColl,JetContainerName2=collDict['MatchTo'])
+      cfg.addEventAlgo(alg)
 
   # The following class will make a sequence, configure algorithms, and link
   # them to GenericMonitoringTools
@@ -221,7 +194,8 @@ def TrigJetMonConfig(inputFlags):
     monitorConf.toAlg(helper)
 
   # Loop over HLT jet chains
-  for chain,jetcoll in Chain2JetCollDict[InputType].items():
+  for chain,chainDict in Chains2Monitor[InputType].items():
+    jetcoll = chainDict['HLTColl']
     # kinematic plots
     if AthenaMT:
       chainMonitorConfT = jetChainMonitoringConfig(inputFlags,jetcoll,chain,AthenaMT,True)
@@ -229,13 +203,8 @@ def TrigJetMonConfig(inputFlags):
     chainMonitorConfF = jetChainMonitoringConfig(inputFlags,jetcoll,chain,AthenaMT,False)
     chainMonitorConfF.toAlg(helper)
     # efficiency plots
-    refChain       = 'NONE'
-    offlineJetColl = 'NONE'
-    if chain in TurnOnCurves[InputType]:
-      refChain       = TurnOnCurves[InputType][chain][0]
-      offlineJetColl = TurnOnCurves[InputType][chain][1]
-    if offlineJetColl != 'NONE' and refChain != 'NONE':
-      effMonitorConf = jetEfficiencyMonitoringConfig(inputFlags,jetcoll,offlineJetColl,chain,refChain,AthenaMT)
+    if chainDict['RefChain'] != 'NONE' and chainDict['OfflineColl'] != 'NONE':
+      effMonitorConf = jetEfficiencyMonitoringConfig(inputFlags,jetcoll,chainDict['OfflineColl'],chain,chainDict['RefChain'],AthenaMT)
       effMonitorConf.toAlg(helper)
 
   cfg.merge(helper.result())
@@ -334,7 +303,7 @@ def jetMonitoringConfig(inputFlags,jetcoll,athenaMT):
        print('bottomlevel = '+str(conf.bottomLevelDir))
        group = monhelper.addGroup(parentAlg, conf.Group, conf.topLevelDir+'/'+conf.bottomLevelDir+'/NoTriggerSelection/')
        # define the histogram
-       group.defineHistogram('ptdiff',title='title', type="TH1F", path='MatchedJets_{}'.format(JetColls2Match[InputType][jetcoll]), xbins=100 , xmin=-100000, xmax=100000. ,)
+       group.defineHistogram('ptdiff',title='title', type="TH1F", path='MatchedJets_{}'.format(JetCollections[InputType][jetcoll]['MatchTo']), xbins=100 , xmin=-100000, xmax=100000. ,)
 
    # Declare a configuration dictionnary for a JetContainer
    if isOnline:
@@ -352,8 +321,8 @@ def jetMonitoringConfig(inputFlags,jetcoll,athenaMT):
      else:
        for hist in ExtraLargeROnlineHists: conf.appendHistos(hist)
      # Add matched jets plots
-     if jetcoll in JetColls2Match[InputType]:
-       matchedJetColl = JetColls2Match[InputType][jetcoll]
+     if JetCollections[InputType][jetcoll]['MatchTo'] != 'NONE':
+       matchedJetColl = JetCollections[InputType][jetcoll]['MatchTo']
        name           = 'jetMatched_{}_{}'.format(jetcoll,matchedJetColl)
        jetmatchKey    = '{}.matched_{}'.format(jetcoll,matchedJetColl)
        jetptdiffKey   = '{}.ptdiff_{}'.format(jetcoll,matchedJetColl)
@@ -598,11 +567,12 @@ if __name__=='__main__':
   helper = AthMonitorCfgHelper(ConfigFlags,'TrigJetMonitorAlgorithm')
   cfg.merge(helper.result()) # merge it to add the sequence needed to add matchers
 
-  # Match HLT to offline jets
-  for j1,j2 in JetColls2Match[InputType].items():
-    name = 'Matching_{}_{}'.format(j1,j2)
-    alg = CompFactory.JetMatcherAlg(name, JetContainerName1=j1,JetContainerName2=j2)
-    cfg.addEventAlgo(alg,sequenceName='AthMonSeq_TrigJetMonitorAlgorithm') # Add matchers to monitoring alg sequence
+  # Match HLT jets to offline jets
+  for hltColl,collDict in JetCollections[InputType].items():
+    if collDict['MatchTo'] != 'NONE':
+      name = 'Matching_{}_{}'.format(hltColl,collDict['MatchTo'])
+      alg = CompFactory.JetMatcherAlg(name, JetContainerName1=hltColl,JetContainerName2=collDict['MatchTo'])
+      cfg.addEventAlgo(alg,sequenceName='AthMonSeq_TrigJetMonitorAlgorithm') # Add matchers to monitoring alg sequence
 
   # Loop over L1 jet collectoins
   for jetcoll in L1JetCollections:
@@ -627,7 +597,8 @@ if __name__=='__main__':
     monitorConf.toAlg(helper)
 
   # Loop over HLT jet chains
-  for chain,jetcoll in Chain2JetCollDict[InputType].items():
+  for chain,chainDict in Chains2Monitor[InputType].items():
+    jetcoll = chainDict['HLTColl']
     # kinematic plots
     if AthenaMT:
       chainMonitorConfT = jetChainMonitoringConfig(ConfigFlags,jetcoll,chain,AthenaMT,True)
@@ -635,13 +606,8 @@ if __name__=='__main__':
     chainMonitorConfF = jetChainMonitoringConfig(ConfigFlags,jetcoll,chain,AthenaMT,False)
     chainMonitorConfF.toAlg(helper)
     # efficiency plots
-    refChain       = 'NONE'
-    offlineJetColl = 'NONE'
-    if chain in TurnOnCurves[InputType]:
-      refChain       = TurnOnCurves[InputType][chain][0]
-      offlineJetColl = TurnOnCurves[InputType][chain][1]
-    if offlineJetColl != 'NONE' and refChain != 'NONE':
-      effMonitorConf = jetEfficiencyMonitoringConfig(ConfigFlags,jetcoll,offlineJetColl,chain,refChain,AthenaMT)
+    if chainDict['RefChain'] != 'NONE' and chainDict['OfflineColl'] != 'NONE':
+      effMonitorConf = jetEfficiencyMonitoringConfig(ConfigFlags,jetcoll,chainDict['OfflineColl'],chain,chainDict['RefChain'],AthenaMT)
       effMonitorConf.toAlg(helper)
 
   cfg.merge(helper.result())
-- 
GitLab


From 6f704809e9d7d2218de45599fe2e04333cc8dc2d Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Fri, 18 Dec 2020 15:58:20 +0100
Subject: [PATCH 158/225] TrigT2CaloCommon: delete unused TrigDataAccessATLFAST

---
 .../src/TrigDataAccessATLFAST.cxx             | 636 ------------------
 .../src/TrigDataAccessATLFAST.h               | 335 ---------
 .../components/TrigT2CaloCommon_entries.cxx   |   2 -
 3 files changed, 973 deletions(-)
 delete mode 100644 Trigger/TrigAlgorithms/TrigT2CaloCommon/src/TrigDataAccessATLFAST.cxx
 delete mode 100644 Trigger/TrigAlgorithms/TrigT2CaloCommon/src/TrigDataAccessATLFAST.h

diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCommon/src/TrigDataAccessATLFAST.cxx b/Trigger/TrigAlgorithms/TrigT2CaloCommon/src/TrigDataAccessATLFAST.cxx
deleted file mode 100644
index a237fa318f8b..000000000000
--- a/Trigger/TrigAlgorithms/TrigT2CaloCommon/src/TrigDataAccessATLFAST.cxx
+++ /dev/null
@@ -1,636 +0,0 @@
-/*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-*/
-
-
-// ********************************************************************
-//
-// NAME:     TrigDataAccessATLFAST.cxx
-// PACKAGE:  Trigger/TrigAlgorithms/TrigT2CaloCommon
-//
-// AUTHOR:   Denis Oliveira Damazio
-//
-// REFERENCES: This will provide infrastructure for the Tools
-//		to perform their algorithms
-//
-// ********************************************************************
-
-#include "GaudiKernel/MsgStream.h"
-
-#include "CaloIdentifier/LArEM_ID.h"
-#include "LArRecEvent/LArCell.h"
-#include "LArRecEvent/LArFebEnergyCollection.h"
-
-#include "CaloIdentifier/LArEM_ID.h"
-#include "CaloEvent/CaloCluster.h"
-#include "CaloGeoHelpers/CaloSampling.h"
-
-#include "LArRawUtils/LArRoI_Map.h"
-#include "IRegionSelector/IRegSelSvc.h"
-
-#include "TrigDataAccessATLFAST.h"
-
-#include "AthenaPoolUtilities/AthenaAttributeList.h"
-
-#include "TrigSteeringEvent/TrigRoiDescriptor.h"
-
-// Event Incident to get EventInfo
-#include "GaudiKernel/IIncidentSvc.h"
-#include "EventInfo/EventInfo.h"
-#include "EventInfo/EventID.h"
-
-ATLAS_NO_CHECK_FILE_THREAD_SAFETY;  // legacy trigger code
-
-// Initialize method for all tools
-// Retrieval of all Tools to be used during run
-StatusCode TrigDataAccessATLFAST::initialize()
-{
-
-        ATH_MSG_DEBUG("in initialize() by TrigDataAccessATLFAST");
-
-	// Some tools are necessary for the Algorithm to run
-	// The RegionSelector is being retrieved here
-        if( (m_pRegionSelector.retrieve()).isFailure() ) {
-	  ATH_MSG_FATAL("Unable to retrieve RegionSelector Service");
-	  return StatusCode::FAILURE;
-	}
-
-	// Reserve vectors space to avoid online memory allocation
-	// Limits to be studied
-	m_rIds.reserve(30);
-	m_vrodid32.reserve(30);
-	m_tile.push_back(0);
-// Event handling
-	IIncidentSvc* p_incSvc;
-	if ( service("IncidentSvc",p_incSvc, true).isFailure() ) {
-	  ATH_MSG_ERROR("Unable to get the IncidentSvc");
-	}else{
-	p_incSvc->addListener(this, "BeginEvent",100);
-	}
-	// Method not called yet
-	m_iov_called=false;
-	// Register function for the detector store
-        const DataHandle<AthenaAttributeList> febrodmap;
-	if ( detStore()->regFcn(&ITrigDataAccess::beginRunHandle,
-		(ITrigDataAccess*)this,
-				 febrodmap, "/LAR/Identifier/FebRodMap", true).isFailure() ) { //FIXME hardcoded database folder name
-	  ATH_MSG_ERROR(" Can't regFnc with Condition ");
-	  return StatusCode::FAILURE;
-        }
-	// Just to the Missing Et slice
-        if ( m_usefullcoll ) {
-	IRegSelSvc* regSelSvc = &(*m_pRegionSelector);
-	if ( detStore()->regFcn(&IRegSelSvc::handle,
-		regSelSvc,
-		&ITrigDataAccess::beginRunHandle_RegSelSvc,
-		(ITrigDataAccess*)this,true).isFailure() ) {
-	  ATH_MSG_ERROR(" Can't regFnc with Condition");
-	  return StatusCode::FAILURE;
-	}
-          m_rIdsem0.reserve(12288);
-          m_rIdsem1.reserve(300);
-          m_rIdsem2.reserve(300);
-          m_rIdsem3.reserve(300);
-          m_rIdshec.reserve(4352);
-          m_rIdshec0.reserve(300);
-          m_rIdshec1.reserve(300);
-          m_rIdshec2.reserve(300);
-          m_rIdsfcalhad0.reserve(256);
-          m_rIdsfcalhad1.reserve(128);
-          m_rIdsfcalem0.reserve(300);
-          m_rIdstile.reserve(300);
-          m_vrodid32lar.reserve(300);
-          m_vrodid32em.reserve(724);
-          m_vrodid32hec.reserve(72);
-          m_vrodid32hec0.reserve(24);
-          m_vrodid32hec1.reserve(24);
-          m_vrodid32hec2.reserve(24);
-          m_vrodid32fcalem.reserve(8);
-          m_vrodid32fcalhad.reserve(6);
-          m_vrodid32tile.reserve(300);
-	} // end of m_usefullcoll
-
-	return StatusCode::SUCCESS;
-} // End of initialize
-
-StatusCode TrigDataAccessATLFAST::beginRunHandle(IOVSVC_CALLBACK_ARGS){
-	// The ByteStreamCnv (Through LArTT_Selector needs a map of the
-	// RoIs, being retrieved here
-	if(toolSvc()->retrieveTool("LArRoI_Map",m_roiMap).isFailure()) {
-	  ATH_MSG_FATAL("Could not find LArRoI_Map");
-	  return StatusCode::FAILURE;
-	} // End of if LArRoI_Map
-
-#ifdef DOBYTESTREAMCNV
-        //m_datablock.reserve(350);
-	m_larcell = new LArCellCont();
-	if ( (m_larcell->initialize()).isFailure() ){
-	  ATH_MSG_FATAL("Could not init larcell");
-        }
-        m_sel= new LArTT_Selector<LArCellCont>(m_roiMap,m_larcell);
-        if(m_usefullcoll){
-          m_selem = new LArTT_Selector<LArCellCont>(m_roiMap,m_larcell);
-          m_selhec = new LArTT_Selector<LArCellCont>(m_roiMap,m_larcell);
-          m_selfcalhad = new LArTT_Selector<LArCellCont>(m_roiMap,m_larcell);
-          m_selfcalem = new LArTT_Selector<LArCellCont>(m_roiMap,m_larcell);
-        }
-	m_tilecell = new TileCellCont();
-        if ( (m_tilecell->initialize()).isFailure() ){
-	  ATH_MSG_FATAL("Could not init tilecell");
-        }
-        //m_febcoll = new LArFebEnergyCollection();
-	if(m_usefullcoll){
-	  ATH_MSG_DEBUG("Preparing the full collections");
-          if ( m_rIdsem0.size() != 0 ) m_rIdsem0.clear();
-          if ( m_rIdsem1.size() != 0 ) m_rIdsem1.clear();
-          if ( m_rIdsem2.size() != 0 ) m_rIdsem2.clear();
-          if ( m_rIdsem3.size() != 0 ) m_rIdsem3.clear();
-          if ( m_rIdshec.size() != 0 ) m_rIdshec.clear();
-          if ( m_rIdshec0.size() != 0 ) m_rIdshec0.clear();
-          if ( m_rIdshec1.size() != 0 ) m_rIdshec1.clear();
-          if ( m_rIdsfcalhad0.size() != 0 ) m_rIdsfcalhad0.clear();
-          if ( m_rIdsfcalhad1.size() != 0 ) m_rIdsfcalhad1.clear();
-          if ( m_rIdsfcalem0.size() != 0 ) m_rIdsfcalem0.clear();
-          if ( m_rIdstile.size() != 0 ) m_rIdstile.clear();
-	} // End of m_usefullcoll
-#endif
-	m_iov_called=true;
-	return StatusCode::SUCCESS;
-}
-
-
-
-StatusCode TrigDataAccessATLFAST::beginRunHandle_RegSelSvc(IOVSVC_CALLBACK_ARGS){
-	  if(m_usefullcoll){
-	    ATH_MSG_DEBUG("Finalizing Preparation of full collections");
-	  //	  TrigRoiDescriptor tmproi( 0, -4.8, 4.8, 0, -M_PI, M_PI, 0, 0, 0 );
-	  TrigRoiDescriptor tmproi( true );  /// give it true during the constructor, you get a full scan RoI
-
-	  //          const double mineta = -4.8;
-	  //          const double maxeta = 4.8;
-	  //          const double minphi = -M_PI;
-	  //          const double maxphi = M_PI;
-	  //           // TTEM 
-	  //           m_pRegionSelector->DetROBIDListUint(TTEM,-1,mineta,maxeta,minphi,maxphi,m_vrodid32em);
-	  //           // TTHEC
-	  //           m_pRegionSelector->DetROBIDListUint(TTHEC,0,mineta,maxeta,minphi,maxphi,m_vrodid32hec0);
-	  //           m_pRegionSelector->DetROBIDListUint(TTHEC,1,mineta,maxeta,minphi,maxphi,m_vrodid32hec1);
-	  //           m_pRegionSelector->DetROBIDListUint(TTHEC,2,mineta,maxeta,minphi,maxphi,m_vrodid32hec2);
-	  //           // FCALHAD
-	  //           m_pRegionSelector->DetROBIDListUint(FCALHAD,-1,mineta,maxeta,minphi,maxphi,m_vrodid32fcalhad);
-	  //           m_pRegionSelector->DetROBIDListUint(FCALEM,-1,mineta,maxeta,minphi,maxphi,m_vrodid32fcalem);
-	  //           // TILE
-	  //           m_pRegionSelector->DetROBIDListUint(TILE,mineta,maxeta,minphi,maxphi,m_vrodid32tile);
-	  //           m_vrodid32lar.insert(m_vrodid32lar.end(),m_vrodid32em.begin(),m_vrodid32em.end());
-	  //           m_vrodid32hec.insert(m_vrodid32hec.end(),m_vrodid32hec0.begin(),m_vrodid32hec0.end());
-	  //           m_vrodid32lar.insert(m_vrodid32lar.end(),m_vrodid32fcalhad.begin(),m_vrodid32fcalhad.end());
-	  //           m_vrodid32lar.insert(m_vrodid32lar.end(),m_vrodid32fcalem.begin(),m_vrodid32fcalem.end());
-	  //           m_vrodid32lar.insert(m_vrodid32lar.end(),m_vrodid32hec.begin(),m_vrodid32hec.end());
-	  //           m_pRegionSelector->DetHashIDList(TTEM,0,mineta,maxeta,minphi,maxphi,&m_rIdsem0);
-	  //           m_pRegionSelector->DetHashIDList(TTEM,1,mineta,maxeta,minphi,maxphi,&m_rIdsem1);
-	  //           m_pRegionSelector->DetHashIDList(TTEM,2,mineta,maxeta,minphi,maxphi,&m_rIdsem2);
-	  //           m_pRegionSelector->DetHashIDList(TTEM,3,mineta,maxeta,minphi,maxphi,&m_rIdsem3);
-	  //           m_pRegionSelector->DetHashIDList(TTHEC,0,mineta,maxeta,minphi,maxphi,&m_rIdshec0);
-	  //           m_pRegionSelector->DetHashIDList(TTHEC,1,mineta,maxeta,minphi,maxphi,&m_rIdshec1);
-	  //           m_pRegionSelector->DetHashIDList(TTHEC,2,mineta,maxeta,minphi,maxphi,&m_rIdshec2);
-	  //           m_pRegionSelector->DetHashIDList(FCALHAD,0,mineta,maxeta,minphi,maxphi,&m_rIdsfcalhad0);
-	  //           m_pRegionSelector->DetHashIDList(FCALHAD,1,mineta,maxeta,minphi,maxphi,&m_rIdsfcalhad1);
-	  //           m_pRegionSelector->DetHashIDList(FCALEM,0,mineta,maxeta,minphi,maxphi,&m_rIdsfcalem0);
-	  //           m_pRegionSelector->DetHashIDList(TILE,mineta,maxeta,minphi,maxphi,&m_rIdstile);
-	  
-
-	  m_pRegionSelector->DetROBIDListUint(TTEM,-1, tmproi, m_vrodid32em);
-          // TTHEC
-          m_pRegionSelector->DetROBIDListUint(TTHEC,0, tmproi, m_vrodid32hec0);
-          m_pRegionSelector->DetROBIDListUint(TTHEC,1, tmproi, m_vrodid32hec1);
-          m_pRegionSelector->DetROBIDListUint(TTHEC,2, tmproi, m_vrodid32hec2);
-          // FCALHAD
-          m_pRegionSelector->DetROBIDListUint(FCALHAD,-1, tmproi, m_vrodid32fcalhad);
-          m_pRegionSelector->DetROBIDListUint(FCALEM,-1,  tmproi, m_vrodid32fcalem);
-          // TILE
-          m_pRegionSelector->DetROBIDListUint(TILE, tmproi, m_vrodid32tile);
-          m_vrodid32lar.insert(m_vrodid32lar.end(),m_vrodid32em.begin(),m_vrodid32em.end());
-          m_vrodid32hec.insert(m_vrodid32hec.end(),m_vrodid32hec0.begin(),m_vrodid32hec0.end());
-	  m_vrodid32lar.insert(m_vrodid32lar.end(),m_vrodid32fcalhad.begin(),m_vrodid32fcalhad.end());
-          m_vrodid32lar.insert(m_vrodid32lar.end(),m_vrodid32fcalem.begin(),m_vrodid32fcalem.end());
-          m_vrodid32lar.insert(m_vrodid32lar.end(),m_vrodid32hec.begin(),m_vrodid32hec.end());
-          m_pRegionSelector->DetHashIDList(TTEM,0, tmproi, m_rIdsem0);
-          m_pRegionSelector->DetHashIDList(TTEM,1, tmproi, m_rIdsem1);
-          m_pRegionSelector->DetHashIDList(TTEM,2, tmproi, m_rIdsem2);
-          m_pRegionSelector->DetHashIDList(TTEM,3, tmproi, m_rIdsem3);
-          m_pRegionSelector->DetHashIDList(TTHEC,0, tmproi, m_rIdshec0);
-          m_pRegionSelector->DetHashIDList(TTHEC,1, tmproi, m_rIdshec1);
-          m_pRegionSelector->DetHashIDList(TTHEC,2, tmproi, m_rIdshec2);
-          m_pRegionSelector->DetHashIDList(FCALHAD,0, tmproi, m_rIdsfcalhad0);
-          m_pRegionSelector->DetHashIDList(FCALHAD,1, tmproi, m_rIdsfcalhad1);
-	  m_pRegionSelector->DetHashIDList(FCALEM,0, tmproi, m_rIdsfcalem0);
-          m_pRegionSelector->DetHashIDList(TILE, tmproi,  m_rIdstile);
-      
-
-          // TTEM 
-          m_rIdsem0.insert(m_rIdsem0.end(),m_rIdsem1.begin(),m_rIdsem1.end());
-          m_rIdsem0.insert(m_rIdsem0.end(),m_rIdsem2.begin(),m_rIdsem2.end());
-          m_rIdsem0.insert(m_rIdsem0.end(),m_rIdsem3.begin(),m_rIdsem3.end());
-          // TTHEC
-          m_rIdshec.insert(m_rIdshec.end(),m_rIdshec0.begin(),m_rIdshec0.end());
-          m_rIdshec.insert(m_rIdshec.end(),m_rIdshec1.begin(),m_rIdshec1.end());
-          m_rIdshec.insert(m_rIdshec.end(),m_rIdshec2.begin(),m_rIdshec2.end());
-          // FCALHAD
-          m_rIdsfcalhad0.insert(m_rIdsfcalhad0.end(),m_rIdsfcalhad1.begin(),m_rIdsfcalhad1.end());
-
-          m_selem->setRoIs(m_rIdsem0);
-          m_selhec->setRoIs(m_rIdshec);
-          m_selfcalhad->setRoIs(m_rIdsfcalhad0);
-          m_selfcalem->setRoIs(m_rIdsfcalem0);
-	} // End of m_usefullcoll
-	return StatusCode::SUCCESS;
-}
-
-// Finalize method for all tools
-StatusCode TrigDataAccessATLFAST::finalize(){
-        if (msgLvl(MSG::DEBUG)) {
-          ATH_MSG_INFO( "in finalize() by TrigDataAccess" );
-	}
-#ifdef DOBYTESTREAMCNV
-	if ( m_iov_called ){
-        if ( (m_larcell->finalize()).isFailure() ){
-	  ATH_MSG_FATAL("Could not finish larcell");
-        }
-        delete m_larcell;
-        if ( (m_tilecell->finalize()).isFailure() ){
-	  ATH_MSG_FATAL("Could not finish tilecell");
-        }
-        delete m_tilecell;
-        delete m_sel;
-	if(m_usefullcoll){
-         delete m_selem;
-         delete m_selhec;
-         delete m_selfcalhad;
-         delete m_selfcalem;
-	}
-	}
-#endif
-	return StatusCode::SUCCESS;
-
-} // End of finalize
-
-// This should be run to provide ByteStreamCnv with rodid's to
-// look up for. addROBData only works in athenaMT
-void TrigDataAccessATLFAST::RegionSelectorRobID (const int sampling,
-						 const IRoiDescriptor& roi,
-						 const DETID detid, bool /*fetchROBs*/) {
-        // Clears up m_vrodid32
-        if ( m_vrodid32.size() != 0 ) m_vrodid32.clear();
-        if ( detid != TILE ){
-	  m_pRegionSelector->DetROBIDListUint(detid,sampling, roi, m_vrodid32);
-        }
-        else { // TILE does not need sample
-	  m_pRegionSelector->DetROBIDListUint(detid, roi, m_vrodid32);
-        }
-	if (msgLvl(MSG::DEBUG)) {
-          ATH_MSG_DEBUG( "m_vrodid32.size() = " << m_vrodid32.size() );
-	  for(unsigned int i = 0 ; i < m_vrodid32.size() ; i++)
-            ATH_MSG_DEBUG( "m_vrodid32[" << i << "]=" << m_vrodid32[i] );
-	}
-}  // End of RegionSelectorRobID
-
-
-// This code should load m_listID with Detectors ID
-// Should this return a flag in case of failure?
-void TrigDataAccessATLFAST::RegionSelectorListID (const int sampling,
-						  const IRoiDescriptor& roi, const DETID detid) {
-        // Clears up m_rIds
-        if ( m_rIds.size() != 0 ) m_rIds.clear();
-  
-        if ( detid != TILE ){
-	  m_pRegionSelector->DetHashIDList(detid,sampling, roi, m_rIds);
-	}
-        else{ // TILE does not need sample
-	  m_pRegionSelector->DetHashIDList(detid, roi, m_rIds);					   
-	}
-	
-	if (msgLvl(MSG::DEBUG)) {
-          ATH_MSG_DEBUG( "m_rIds.size() = " << m_rIds.size() );
-	  for(unsigned int i = 0; i < m_rIds.size() ; i++)
-            ATH_MSG_DEBUG( "m_rIds[" << i << "]=" << m_rIds[i] );
-	}	
-} // End of RegionSelectorListID
-
-
-
-
-
-// This method should load all the infrastructure for the offline
-// Collection of cells. The iterators m_iBegin, m_iEnd and m_it
-// will have the cells Collection to be used by the Algorithm
-StatusCode TrigDataAccessATLFAST::LoadCollections (
-		LArTT_Selector<LArCellCont>::const_iterator& Begin,
-		LArTT_Selector<LArCellCont>::const_iterator& End,
-		const unsigned int /*sample*/, bool /*prepare*/) {
-        if (msgLvl(MSG::DEBUG)) {
-          ATH_MSG_DEBUG( "m_rIds.size() in LoadColl = " << m_rIds.size() );
-	  for(unsigned int i = 0 ; i < m_rIds.size() ; i++)
-            ATH_MSG_DEBUG( "m_rIds[" << i << "]=" << m_rIds[i] );
-	}
-
-	Begin=End;
-
-	const DataHandle<CaloCellContainer> cells;
-	if (evtStore()->retrieve(cells,"AllCalo").isFailure()) {
-	  ATH_MSG_ERROR("Could not find AllCalo container");
-	  return StatusCode::FAILURE;
-        } // End of if StoreGateSvc
-
-        int rodidx = 0;
-        for (size_t i = 0; i < m_vrodid32.size(); ++i){
-		// Find the collection to fill
-		const std::vector<LArCellCollection*>::const_iterator it =
-			(m_larcell->find(m_vrodid32[rodidx]));
-/*
-        	LArCellCollection* col =
-			*(m_larcell->find(m_vrodid32[rodidx]));
-*/
-		if ( it != m_larcell->end() ) { // Alread decoded collection
-		LArCellCollection *col = *it;
-		// Fills from the container
-		fillColl(cells,*col);
-        	// if (col->size() == 0) return StatusCode::FAILURE;
-		}
-		rodidx++;
-
-  	} // End of for through RobFrags
-
-        // These iterators can be used by every Tool
-        m_sel->setRoIs(m_rIds);
-        Begin = m_sel->begin();
-        End   = m_sel->end();
-	if (msgLvl(MSG::DEBUG)) {
-	  LArTT_Selector<LArCellCont>::const_iterator it;
-	  for ( it=Begin; it != End; ++it ){
-            ATH_MSG_DEBUG( "Eta: " << (*it)->eta()
-                           << "; Phi: " << (*it)->phi() <<
-                           "; Energy: " << (*it)->energy() );
-	  } // End of for printout cells
-	}
-	return StatusCode::SUCCESS;
-} // End of method
-StatusCode TrigDataAccessATLFAST::LoadCollections (
-                TileCellCollection::const_iterator& Begin,
-                TileCellCollection::const_iterator& End,
-                const unsigned int sample, bool /*prepare*/){
-
-	const DataHandle<CaloCellContainer> cells;
-	if (evtStore()->retrieve(cells,"AllCalo").isFailure()) {
-	  ATH_MSG_ERROR("Could not find AllCalo container");
-	  return StatusCode::FAILURE;
-        } // End of if StoreGateSvc
-
-	int i = sample;
-	Begin=End;
-	//for (size_t i = 0; i < m_listID.size(); ++i){
-		m_tile[0] = m_tilecell->find_rod(m_rIds[i]);
-		// Find the collection to fill
-                TileCellCollection* col = NULL;
-		col = *(m_tilecell->find(m_rIds[i]));
-		if ( col != NULL ) {
-		fillColl(cells,*col);
-                Begin = col->begin();
-                End = col->end();
-		}
-
-        //} // End of for through RobFrags
-
-	if (msgLvl(MSG::DEBUG)) {
-	  TileCellCollection::const_iterator itt = Begin;
-	  for (itt=Begin;itt!=End;++itt){
-            ATH_MSG_DEBUG( "Eta: " << (*itt)->eta()
-                           << "; Phi: " << (*itt)->phi() <<
-                           "; Energy: " << (*itt)->energy() << 
-                           "; Hash Id: " << (*itt)->caloDDE()->calo_hash() );
-	  } // End of for printout cells
-	}
-        return StatusCode::SUCCESS;
-
-} // End of LoadCollections
-
-// This method does not make sense for ATLFAST
-StatusCode TrigDataAccessATLFAST::LoadCollections (
-                LArFebEnergyCollection::const_iterator& /*Begin*/,
-                LArFebEnergyCollection::const_iterator& /*End*/,
-                const unsigned int /*sample*/, bool /*prepare*/){
-
-/*
-	m_robFrags.clear();
-        m_robDataProvider->getROBData(m_vrodid32,m_robFrags);
-
-        //int rodidx = 0;
-	LArFebEnergyCollection* m_febcoll;
-        m_febcoll = new LArFebEnergyCollection();
-        for (size_t i = 0; i < m_robFrags.size(); ++i){
-                m_lardecoder->check_valid(m_robFrags[i],msg());
-                //m_datablock.clear();
-                // Get Rod Data and size of fragment
-                const uint32_t* roddata1 = 0;
-                m_robFrags[i]->rod_data(roddata1);
-                size_t roddatasize = m_robFrags[i]->rod_ndata();
-                if (roddatasize < 3) {
-                        ATH_MSG_FATAL( "Error reading bytestream"<<
-                           "event: Empty ROD block (less than 3 words)" );
-                        return StatusCode::FAILURE;
-                } // End of if small size
-                m_lardecoder->setRobFrag(m_robFrags[i]);
-                m_lardecoder->fillCollectionHLTFeb(roddata1,roddatasize,*m_febcoll);
-                // if (col->size() == 0) return StatusCode::FAILURE;
-
-        } // End of for through RobFrags
-        // These iterators can be used by every Tool
-        Begin = m_febcoll->begin();
-        End   = m_febcoll->end();
-
-#ifndef NDEBUG
-        for(LArFebEnergyCollection::const_iterator it = Begin; 
-              it!=End; ++it){
-              ATH_MSG_DEBUG( " Feb ID = " << (*it)->getFebId() 
-                       << " Feb Ex = " << (*it)->getFebEx()
-                       << " Feb Ey = " << (*it)->getFebEy() 
-                       << " Feb Ez = " << (*it)->getFebEz() );
-        }
-#endif
-*/
-        return StatusCode::SUCCESS;
-
-} // End of LoadCollections
-
-StatusCode TrigDataAccessATLFAST::LoadFullCollections (
-                LArTT_Selector<LArCellCont>::const_iterator& Begin,
-                LArTT_Selector<LArCellCont>::const_iterator& End,
-                const DETID /*detid*/, bool /*prepare*/) {
-
-        if (msgLvl(MSG::DEBUG)) {
-          ATH_MSG_DEBUG( "m_rIds.size() in LoadColl = " << m_rIds.size() );
-	  for(unsigned int i = 0 ; i < m_rIds.size() ; i++)
-            ATH_MSG_DEBUG( "m_rIds[" << i << "]=" << m_rIds[i] );
-	}
-
-        Begin=End;
-
-        const DataHandle<CaloCellContainer> cells;
-        if (evtStore()->retrieve(cells,"AllCalo").isFailure()) {
-	  ATH_MSG_ERROR("Could not find AllCalo container");
-	  return StatusCode::FAILURE;
-        } // End of if StoreGateSvc
-
-        int rodidx = 0;
-        for (size_t i = 0; i < m_vrodid32lar.size(); ++i){
-           const std::vector<LArCellCollection*>::const_iterator it =
-                   (m_larcell->find(m_vrodid32lar[rodidx]));
-          if (it != m_larcell->end() ) {
-              LArCellCollection *col = *it;
-              fillColl(cells,*col);
-          }
-                rodidx++;
-        } // End of for through RobFrags
-
-
-	if (msgLvl(MSG::DEBUG)) {
-	  int i=0;
-	  LArTT_Selector<LArCellCont>::const_iterator it;
-	  for ( it=Begin; it != End; ++it ){
-            ATH_MSG_DEBUG( "Eta: " << (*it)->eta()
-                           << "; Phi: " << (*it)->phi() <<
-                           "; Energy: " << (*it)->energy() );
-	    i++;
-	  } // End of for printout cells
-	}
-        return StatusCode::SUCCESS;
-} // End of method
-StatusCode TrigDataAccessATLFAST::LoadFullCollections (
-                TileCellCollection::const_iterator& Begin,
-                TileCellCollection::const_iterator& End,
-                const unsigned int sample, bool /*prepare*/){
-
-        const DataHandle<CaloCellContainer> cells;
-        if (evtStore()->retrieve(cells,"AllCalo").isFailure()) {
-	  ATH_MSG_ERROR("Could not find AllCalo container");
-	    return StatusCode::FAILURE;
-        } // End of if StoreGateSvc
-
-
-        int i = sample;
-        Begin=End;
-                m_tile[0] = m_tilecell->find_rod(m_rIdstile[i]);
-                // Find the collection to fill
-                TileCellCollection* col = NULL;
-                col = *(m_tilecell->find(m_rIdstile[i]));
-                if( col!=NULL){
-                  fillColl(cells,*col);
-                  Begin = col->begin();
-                  End = col->end();
-                }
-
-	if (msgLvl(MSG::DEBUG)) {
-	  TileCellCollection::const_iterator itt = Begin;
-	  for (itt=Begin;itt!=End;++itt){
-            ATH_MSG_DEBUG( "Eta: " << (*itt)->eta()
-                           << "; Phi: " << (*itt)->phi() <<
-                           "; Energy: " << (*itt)->energy() <<
-                           "; Hash Id: " << (*itt)->caloDDE()->calo_hash() );
-	  } // End of for printout cells
-	}
-        return StatusCode::SUCCESS;
-
-} // End of LoadCollections
-
-// The following method does not make sense to ATLFAST
-StatusCode TrigDataAccessATLFAST::LoadFullCollections (
-                LArFebEnergyCollection::const_iterator& /*Begin*/,
-                LArFebEnergyCollection::const_iterator& /*End*/,
-                const DETID /*detid*/, bool /*prepare*/){
-
-
-/*
-	m_robFrags.clear();
-        switch (detid) {
-           case TTEM:
-             m_robDataProvider->getROBData(m_vrodid32em,m_robFrags);
-             break;
-           case TTHEC:
-             m_robDataProvider->getROBData(m_vrodid32hec0,m_robFrags);
-             break;
-           case FCALEM:
-             m_robDataProvider->getROBData(m_vrodid32fcalem,m_robFrags);
-             break;
-           case FCALHAD:
-             m_robDataProvider->getROBData(m_vrodid32fcalhad,m_robFrags);
-             break;
-           default:
-             break;
-        }
-
-        LArFebEnergyCollection* m_febcoll;
-        m_febcoll = new LArFebEnergyCollection();
-
-        for( size_t i=0; i< m_robFrags.size(); ++i){
-                m_lardecoder->check_valid(m_robFrags[i],msg());
-                const uint32_t* roddata1 = 0;
-                m_robFrags[i]->rod_data(roddata1);
-                size_t roddatasize = m_robFrags[i]->rod_ndata();
-                if(roddatasize < 3) {
-                       ATH_MSG_FATAL( "Error reading bytestream " <<
-                                  "event: Empty ROD block (less than 3 words)" );
-                       return StatusCode::FAILURE;
-                }
-                m_lardecoder->setRobFrag(m_robFrags[i]);
-                m_lardecoder->fillCollectionHLTFeb(roddata1,roddatasize,*m_febcoll);
-        }
-
-        Begin = m_febcoll->begin();
-        End = m_febcoll->end();
-        std::cout << "This is the detectorID = " << detid << std::endl;
-        std::cout << "This is the febcoll size = " << m_febcoll->size() << std::endl;
-
-#ifndef NDEBUG
-        for(LArFebEnergyCollection::const_iterator it = Begin;
-              it!=End; ++it){
-              ATH_MSG_DEBUG( " Feb ID = " << (*it)->getFebId()
-                       << " Feb Ex = " << (*it)->getFebEx()
-                       << " Feb Ey = " << (*it)->getFebEy()
-                       << " Feb Ez = " << (*it)->getFebEz() );
-        }
-#endif
-*/
-        return StatusCode::SUCCESS;
-
-} // End of LoadFullCollections
-
-// The following method does not make sense to ATLFAST
-StatusCode TrigDataAccessATLFAST::LoadFullCollections (
-                TileL2Container::const_iterator& /*Begin*/,
-                TileL2Container::const_iterator& /*End*/){
-        return StatusCode::SUCCESS;
-
-} // End of LoadFullCollections
-
-// handle events (beginEvent only) to prepare containers
-void TrigDataAccessATLFAST::handle(const Incident & inc ) {
-  m_larcell->eventNumber(inc.context().eventID().event_number());
-}
-
-template<class T>
-void TrigDataAccessATLFAST::fillColl(const DataHandle<CaloCellContainer>& input, T& output){
-	typedef typename T::iterator IT;
-	IT it,end;
-	it=  output.begin();
-	end= output.end();
-	for( ; it!= end; ++it ) {
-		if ( (*it)->caloDDE() != NULL ) {
-		  IdentifierHash id = (*it)->caloDDE()->calo_hash();
-		  const CaloCell* cell = NULL;
-		  cell = input->findCell(id);
-		  if ( cell != NULL ) (*it)->setEnergy(cell->energy()+1.0);
-		}
-	}
-}
-
-
-
diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCommon/src/TrigDataAccessATLFAST.h b/Trigger/TrigAlgorithms/TrigT2CaloCommon/src/TrigDataAccessATLFAST.h
deleted file mode 100644
index 2b68f8b2fc52..000000000000
--- a/Trigger/TrigAlgorithms/TrigT2CaloCommon/src/TrigDataAccessATLFAST.h
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-*/
-
-/********************************************************************
- 
- NAME:     TrigDataAccessATLFAST.h
- PACKAGE:  Trigger/TrigAlgorithms/TrigT2CaloCommon
- 
- AUTHOR:   Denis Oliveira Damazio
-
- PURPOSE:  Tool designed to perform data access to
-           Calorimeter cells. It does not perform
-           ByteStream conversion. Just uses the ATLFast
-	   CaloCellContainer AllCalo. It is, however,
-           driven by Region of Interest (in eta/phi)
-           definition.
- *******************************************************************/
-
-#ifndef TRIGT2CALOCOMMONATLFAST_TRIGDATAACCESS_H 
-#define TRIGT2CALOCOMMONATLFAST_TRIGDATAACCESS_H
-
-#include "GaudiKernel/IAlgTool.h"
-#include "AthenaBaseComps/AthAlgTool.h"
-#include "GaudiKernel/IProperty.h"
-#include "GaudiKernel/ToolHandle.h"
-#include "GaudiKernel/ServiceHandle.h"
-
-#include "StoreGate/DataHandle.h"
-#include "CaloIdentifier/CaloIdManager.h"
-#include "TrigTimeAlgs/TrigTimerSvc.h"
-
-#include "TrigT2CaloCommon/ITrigDataAccess.h"
-#include "Identifier/IdentifierHash.h"
-
-#include "LArRecEvent/LArCellCollection.h"
-#include "LArRecEvent/LArFebEnergyCollection.h"
-
-#include "TileEvent/TileCell.h"
-
-#include "ByteStreamCnvSvcBase/IROBDataProviderSvc.h"
-#include "LArByteStream/LArRodDecoder.h"
-#include "TileByteStream/TileROD_Decoder.h"
-
-#include "TrigT2CaloCommon/T2GeometryTool.h"
-#include "TrigT2CaloCommon/T2Calibration.h"
-#include "CaloGeoHelpers/CaloSampling.h"
-#include "eformat/old/util.h"
-
-#include "GaudiKernel/IIncidentListener.h"
-#include "GaudiKernel/Incident.h"
-
-#include "TrigSteeringEvent/TrigRoiDescriptor.h"
-
-#include "CxxUtils/phihelper.h"
-
-#include "CxxUtils/checker_macros.h"
-ATLAS_NO_CHECK_FILE_THREAD_SAFETY;  // legacy trigger code
-
-class IRegSelSvc;
-// class ITrigRegionSelector;
-class LArRoI_Map;
-class IROBDataProviderSvc;
-class T2CaloConfig;
-
-/** Class that provides access to data for
-    Calorimeter LVL2 Algorithms */
-class TrigDataAccessATLFAST: virtual public ITrigDataAccess, public AthAlgTool,
-	virtual public IIncidentListener {
-  public:
-    /** Real Constructor */
-    TrigDataAccessATLFAST(const std::string & type, const std::string & name,
-                 const IInterface* parent) : AthAlgTool(type,name,parent),
-		 m_pRegionSelector("RegSelSvc/RegSelSvc","TrigDataAccess"){
-	declareInterface<ITrigDataAccess>(this); 
-	declareProperty("RegSelSvc",m_pRegionSelector,"Region Selector Service access");
-	// New property for MET slice
-        declareProperty("loadFullCollections",  m_usefullcoll=false);
-    }
-    /** Destructor */
-    virtual ~TrigDataAccessATLFAST() { }
-
-
-    /** The same function should initialize all internal Tools
-    */
-    StatusCode initialize();
-    /** Finalize */
-    StatusCode finalize();
-    /** handle to init a new event */
-    void handle (const Incident& );
-    /** begin run handle for conditions */
-    StatusCode beginRunHandle(IOVSVC_CALLBACK_ARGS);
-    /** begin run handle for conditions and RegSelSvc */
-    StatusCode beginRunHandle_RegSelSvc(IOVSVC_CALLBACK_ARGS);
-
-    /** Expose list of ROBs */
-
-    void ROBList( const IRoiDescriptor& /* roi */,
-		  std::vector<uint32_t>& /*vec*/){ }
-
-    /// obsolete
-    void ROBList( const double /* etamin */, const double /*etamax*/,
-		  const double /*phimin*/, const double /*phimax*/,
-		  std::vector<uint32_t>& /*vec*/){ }
-
-
-  protected:
-    // methods for tools
-    // The two methods below could be united in a single one
-    // They load this class with the list of ROBs to be looked after
-    // By default TTEM is requested but TTHEC and TILE may also be used.
-
-    void RegionSelectorListID (const int sampling, const IRoiDescriptor& roi,
-			       const DETID detid=TTEM);    
-   
-    void RegionSelectorRobID (const int sampling,  const IRoiDescriptor& roi,
-			      const DETID detid=TTEM, bool fetchROBs = true);
-    
-    /** 
-        * @brief Region Selector Input. Prepare internal tables
-        * with online/offline Identifiers used in ByteStream
-        * Conversion and data iterators (to Calorimeter Cells).
-        * @param[in] sampling layer (not used for TileCal).
-        * @param[in] IRoiDescriptor for Region of Interest definition.
-        * @param[in] DETID which can be TTEM (default), TTHEC, TILE.
-         */
-    virtual inline void RegionSelector(const int sampling, const IRoiDescriptor& roi, const DETID detid=TTEM){
-      RegionSelectorListID(sampling, roi, detid);
-      RegionSelectorRobID (sampling, roi, detid);
-    };
-
-    
-    /// obsolete
-
-    /** 
-        * @brief Region Selector Input. Prepare internal tables
-        * with online/offline Identifiers used in ByteStream
-        * Conversion and data iterators (to Calorimeter Cells).
-        * @param[in] sampling layer (not used for TileCal).
-        * @param[in] etamin/etamax for Region of Interest definition.
-        * @param[in] phimin/phimax for Region of Interest definition.
-        * @param[in] DETID which can be TTEM (default), TTHEC, TILE.
-         */
-    void RegionSelectorListID (const int sampling, 
-			       const double etamin, const double etamax, 
-			       const double phimin, const double phimax,
-			       const DETID detid=TTEM) { 
-      TrigRoiDescriptor roi( 0.5*(etamin+etamax), etamin, etamax, CxxUtils::phiMean(phimin,phimax), phimin, phimax);
-      RegionSelectorListID(sampling, roi, detid);
-    }
-    
-    void RegionSelectorRobID (const int sampling, const double etamin,
-			      const double etamax, const double phimin, const double phimax,
-			      const DETID detid=TTEM, bool /* fetchROBs*/ = true) { 
-      TrigRoiDescriptor roi( 0.5*(etamin+etamax), etamin, etamax, CxxUtils::phiMean(phimin,phimax), phimin, phimax);
-      RegionSelectorRobID(sampling, roi, detid);
-    }
-
-    /// obsolete methods ///
-    virtual inline void RegionSelector(const int sampling, 
-				       const double etamin, const double etamax, 
-				       const double phimin, const double phimax,
-				       const DETID detid=TTEM){
-      TrigRoiDescriptor roi( 0.5*(etamin+etamax), etamin, etamax, CxxUtils::phiMean(phimin,phimax), phimin, phimax);
-      RegionSelector(sampling, roi, detid);
-    };
-	
-       /** 
-        * @brief LoadCollections fetches data via ROBDataProvider
-        * and really provides ByteStream Conversion by calling 
-        * detector specific (LAr or Tile) ByteStream Conversion
-        * Tools within RoI as defined in the above method.
-        * @param[out] LArTT_Selector<LArCellCont> outputs
-        *       begin, end interator to LArCells.
-        * @param[in] sample (deprecated) maintained for compatibility.
-        * @param[in] prepare if container should be prepared or
-        *       considered as already existing (multilayer HEC or Tile
-        *       access).
-        */
-    StatusCode LoadCollections (
-	LArTT_Selector<LArCellCont>::const_iterator&,
-	LArTT_Selector<LArCellCont>::const_iterator&,
-	const unsigned int sample = 0, bool prepare=true );
-	/** 
-        * @brief LoadCollections fetches data via ROBDataProvider
-        * and really provides ByteStream Conversion by calling 
-        * detector specific (LAr or Tile) ByteStream Conversion
-        * Tools within RoI as defined in the above method.
-        * @param[out] TileCellCollection::const_iterator outputs
-        *       begin, end interator to TileCells.
-        * @param[in] sample (deprecated) maintained for compatibility.
-        * @param[in] prepare if container should be prepared or
-        *       considered as already existing (multilayer HEC or Tile
-        *       access).
-        */
-    StatusCode LoadCollections (
-	TileCellCollection::const_iterator&,
-	TileCellCollection::const_iterator&,
-	const unsigned int sample = 0, bool prepare=true);
-        /** MBTS collection */
-    StatusCode LoadMBTS(TileCellCollection::const_iterator&,
-                TileCellCollection::const_iterator&){
-	return StatusCode::SUCCESS; }
-        /** Load Zdc Collection */
-    StatusCode LoadZdcCollection(ZdcRawChannelCollection::const_iterator&,
-                ZdcRawChannelCollection::const_iterator&){
-	return StatusCode::SUCCESS; }
-
-	/** 
-        * @brief LoadCollections fetches data via ROBDataProvider
-        * and really provides ByteStream Conversion by calling 
-        * detector specific (LAr or Tile) ByteStream Conversion
-        * Tools within RoI as defined in the above method.
-        * @param[out] LArFebEnergyCollection::const_iterator outputs
-        *       begin, end interator to LArFebEnergy Collections.
-        * @param[in] sample (deprecated) maintained for compatibility.
-        * @param[in] prepare if container should be prepared or
-        *       considered as already existing (multilayer HEC or Tile
-        *       access).
-        */
-    StatusCode LoadCollections (
-	LArFebEnergyCollection::const_iterator&,
-	LArFebEnergyCollection::const_iterator&,
-	const unsigned int sample = 0, bool prepare=true);
-        /** 
-        * @brief Loads the full collection for the missing et computation
-        */
-    StatusCode LoadFullCollections (
-        LArTT_Selector<LArCellCont>::const_iterator&,
-        LArTT_Selector<LArCellCont>::const_iterator&,
-        DETID detid, bool prepare=true );
-        /** 
-        * @brief Loads the full collection for the missing et computation
-        */
-    StatusCode LoadFullCollections (
-        TileCellCollection::const_iterator&,
-        TileCellCollection::const_iterator&,
-        const unsigned int sample = 0, bool prepare=true );
-        /** 
-        * @brief Loads the full collection for the missing et computation
-        */
-
-    StatusCode LoadFullCollections (
-        LArFebEnergyCollection::const_iterator&,
-        LArFebEnergyCollection::const_iterator&,
-        DETID detid, bool prepare=true );
-        /**
-        * @brief Loads the full collection for the missing et computation
-        */
-    StatusCode LoadFullCollections (
-                TileL2Container::const_iterator& Begin,
-                TileL2Container::const_iterator& End);
-        /**
-        * @brief Loads the full collection fast
-        */
-    StatusCode LoadFullCollections (
-                CaloCellContainer::const_iterator&,
-                CaloCellContainer::const_iterator&){
-                return StatusCode::SUCCESS; }
-	/** Number of Tile Calorimeter modules found in
-        * the Region of Interest */
-    unsigned int TileContSize ( void ) { return m_rIds.size(); } 
-	/** Number of Tile Calorimeter modules found in
-        * the Region of Interest MET case -> All Calo*/
-    unsigned int TileFullContSize ( void ) { return m_rIdstile.size(); }
-	/** Error reporting */
-	uint32_t report_error ( void ) { return 0x0; }
-    
-    /** RegSelSvc handle */
-    ServiceHandle<IRegSelSvc>         m_pRegionSelector;
-    /** LArRoI_Map used by LArTT_Selector */
-    const LArRoI_Map*            m_roiMap;           
-
-	/** iterators to LArCells type depending on
-	access way (IDC or Cont) */
-	LArTT_Selector<LArCellCont>* m_sel;
-        LArTT_Selector<LArCellCont>* m_sellarfull;
-        LArTT_Selector<LArCellCont>* m_selem;
-        LArTT_Selector<LArCellCont>* m_selhec;
-        LArTT_Selector<LArCellCont>* m_selfcalhad;
-        LArTT_Selector<LArCellCont>* m_selfcalem;
-	/** LArCellCont pointer - has collections of LArCells */
-	LArCellCont* m_larcell;
-	/** TileCellCont pointer - has collections of TileCells */
-	TileCellCont* m_tilecell;
-	/** Input DataBlock to pre-allocate memory space for
-	ROBFragment to be decoded */
-	//std::vector<uint32_t> m_datablock;
-//        LArFebEnergyCollection* m_febcoll;
-
-
-    // Objects that the Tools should not worry about
-  private:
-        /** method to fill collection with container information */
-        template<class T>
-        void fillColl(const DataHandle<CaloCellContainer>& input, T& output);
-        /** fill vector with all RodIds and Hash Id's in initialize */
-        bool m_usefullcoll;
-	/** List of Hash Id's to be fetched for a given RoI. */
-	std::vector<IdentifierHash> m_rIds;
-        std::vector<IdentifierHash> m_rIdsem0;
-        std::vector<IdentifierHash> m_rIdsem1;
-        std::vector<IdentifierHash> m_rIdsem2;
-        std::vector<IdentifierHash> m_rIdsem3;
-        std::vector<IdentifierHash> m_rIdshec;
-        std::vector<IdentifierHash> m_rIdshec0;
-        std::vector<IdentifierHash> m_rIdshec1;
-        std::vector<IdentifierHash> m_rIdshec2;
-        std::vector<IdentifierHash> m_rIdsfcalhad0;
-        std::vector<IdentifierHash> m_rIdsfcalhad1;
-        std::vector<IdentifierHash> m_rIdsfcalem0;
-        std::vector<IdentifierHash> m_rIdstile;
-	/** List of RodIds to be fetched for a given RoI. */
-	std::vector<uint32_t> m_vrodid32;
-        std::vector<uint32_t> m_vrodid32lar;
-        std::vector<uint32_t> m_vrodid32em;
-        std::vector<uint32_t> m_vrodid32hec;
-        std::vector<uint32_t> m_vrodid32hec0;
-        std::vector<uint32_t> m_vrodid32hec1;
-        std::vector<uint32_t> m_vrodid32hec2;
-        std::vector<uint32_t> m_vrodid32fcalem;
-        std::vector<uint32_t> m_vrodid32fcalhad;
-        std::vector<uint32_t> m_vrodid32tile;
-	/** List of Detector ID (needed for London Schema - TileCal)
-	    elements for offline like data organization (module
-	    ID for TileCal, TTsample ID for LAr).
-	*/
-	std::vector<int> m_listID;
-	/** space for Tile Calorimeter Identifier */
-	std::vector<unsigned int> m_tile;
-	/** check whether iov method was called */
-	bool m_iov_called;
-};
-
-#endif
diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCommon/src/components/TrigT2CaloCommon_entries.cxx b/Trigger/TrigAlgorithms/TrigT2CaloCommon/src/components/TrigT2CaloCommon_entries.cxx
index 21f494b12ab0..c7c1a055c1dd 100644
--- a/Trigger/TrigAlgorithms/TrigT2CaloCommon/src/components/TrigT2CaloCommon_entries.cxx
+++ b/Trigger/TrigAlgorithms/TrigT2CaloCommon/src/components/TrigT2CaloCommon_entries.cxx
@@ -1,13 +1,11 @@
 #include "TrigT2CaloCommon/T2GeometryTool.h"
 #include "../TrigDataAccess.h"
-#include "../TrigDataAccessATLFAST.h"
 #include "../TrigCaloDataAccessSvc.h"
 #include "../TestCaloDataAccess.h"
 #include "../CompareCells.h"
 
 DECLARE_COMPONENT( T2GeometryTool )
 DECLARE_COMPONENT( TrigDataAccess )
-DECLARE_COMPONENT( TrigDataAccessATLFAST )
 DECLARE_COMPONENT( TrigCaloDataAccessSvc)
 DECLARE_COMPONENT( TestCaloDataAccess )
 DECLARE_COMPONENT( CompareCells )
-- 
GitLab


From b4573703ca96ff1c5245f108c7196173c08a4314 Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Fri, 18 Dec 2020 16:27:02 +0100
Subject: [PATCH 159/225] TrigT2CaloEgamma: remove unused RegSelSvc handle

---
 .../TrigT2CaloEgamma/src/T2CaloEgammaReFastAlgo.cxx         | 6 ++----
 .../TrigT2CaloEgamma/src/T2CaloEgammaReFastAlgo.h           | 5 +----
 2 files changed, 3 insertions(+), 8 deletions(-)

diff --git a/Trigger/TrigAlgorithms/TrigT2CaloEgamma/src/T2CaloEgammaReFastAlgo.cxx b/Trigger/TrigAlgorithms/TrigT2CaloEgamma/src/T2CaloEgammaReFastAlgo.cxx
index eb09ae61f467..e92b6df15cd3 100644
--- a/Trigger/TrigAlgorithms/TrigT2CaloEgamma/src/T2CaloEgammaReFastAlgo.cxx
+++ b/Trigger/TrigAlgorithms/TrigT2CaloEgamma/src/T2CaloEgammaReFastAlgo.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 /*
@@ -25,14 +25,12 @@
 class ISvcLocator;
 
 T2CaloEgammaReFastAlgo::T2CaloEgammaReFastAlgo(const std::string& name, ISvcLocator* pSvcLocator) :
-    AthReentrantAlgorithm(name, pSvcLocator),
-    m_regionSelector("RegSelSvc", name)
+    AthReentrantAlgorithm(name, pSvcLocator)
 {}
 
 StatusCode T2CaloEgammaReFastAlgo::initialize()
 {
   m_emAlgTools.retrieve().ignore();
-  ATH_CHECK(m_regionSelector.retrieve());
   ATH_CHECK(m_clusterContainerKey.initialize());
   ATH_CHECK(m_roiCollectionKey.initialize());
   ATH_CHECK( m_bcidAvgKey.initialize() );
diff --git a/Trigger/TrigAlgorithms/TrigT2CaloEgamma/src/T2CaloEgammaReFastAlgo.h b/Trigger/TrigAlgorithms/TrigT2CaloEgamma/src/T2CaloEgammaReFastAlgo.h
index e0691b9ff219..962ae5af0f5a 100644
--- a/Trigger/TrigAlgorithms/TrigT2CaloEgamma/src/T2CaloEgammaReFastAlgo.h
+++ b/Trigger/TrigAlgorithms/TrigT2CaloEgamma/src/T2CaloEgammaReFastAlgo.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 /**
@@ -19,7 +19,6 @@
 #include "GaudiKernel/ServiceHandle.h"
 #include "GaudiKernel/ToolHandle.h"
 #include "AthenaBaseComps/AthReentrantAlgorithm.h"
-#include "IRegionSelector/IRegSelSvc.h"
 #include "StoreGate/ReadHandleKey.h"
 #include "StoreGate/WriteHandleKey.h"
 #include "CaloEvent/CaloBCIDAverage.h"
@@ -47,8 +46,6 @@ class T2CaloEgammaReFastAlgo : public AthReentrantAlgorithm {
     // float calculateZ0(const float etaLayer1, const float etaLayer2);
   
   private:
-    ServiceHandle<IRegSelSvc> m_regionSelector;
-  
     // Properties:
     Gaudi::Property<float> m_l1eta{this, "L1ForceEta", -10.0, "Forced LVL1 eta"};
     Gaudi::Property<float> m_l1phi{this, "L1ForcePhi", -10.0, "Forced LVL1 phi"};
-- 
GitLab


From 0f4248b98150087a868a577561cbb858b0f2e9ed Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Fri, 18 Dec 2020 16:30:36 +0100
Subject: [PATCH 160/225] TrigPartialEventBuilding: remove unused IRegSelSvc
 include

---
 .../TrigPartialEventBuilding/src/RoIPEBInfoWriterTool.h        | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/Trigger/TrigAlgorithms/TrigPartialEventBuilding/src/RoIPEBInfoWriterTool.h b/Trigger/TrigAlgorithms/TrigPartialEventBuilding/src/RoIPEBInfoWriterTool.h
index 66ed0062b6c5..073a1e3b4fcf 100644
--- a/Trigger/TrigAlgorithms/TrigPartialEventBuilding/src/RoIPEBInfoWriterTool.h
+++ b/Trigger/TrigAlgorithms/TrigPartialEventBuilding/src/RoIPEBInfoWriterTool.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TrigPartialEventBuilding_RoIPEBInfoWriterTool_h
@@ -7,7 +7,6 @@
 
 #include "TrigPartialEventBuilding/PEBInfoWriterToolBase.h"
 #include "IRegionSelector/RegSelEnums.h"
-#include "IRegionSelector/IRegSelSvc.h"
 #include "IRegionSelector/IRegSelTool.h"
 
 /** @class RoIPEBInfoWriterTool
-- 
GitLab


From ded1f6beb246b608f88179e07bf147d0eaf559cb Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Fri, 18 Dec 2020 16:31:01 +0100
Subject: [PATCH 161/225] TRT_TrigTrackSegmentsFinder: remove unused IRegSelSvc
 include

---
 .../src/components/TRT_TrigTrackSegmentsFinder_entries.cxx       | 1 -
 1 file changed, 1 deletion(-)

diff --git a/InnerDetector/InDetTrigRecAlgs/TRT_TrigTrackSegmentsFinder/src/components/TRT_TrigTrackSegmentsFinder_entries.cxx b/InnerDetector/InDetTrigRecAlgs/TRT_TrigTrackSegmentsFinder/src/components/TRT_TrigTrackSegmentsFinder_entries.cxx
index b1d7b62ed071..9149a6dd83cb 100644
--- a/InnerDetector/InDetTrigRecAlgs/TRT_TrigTrackSegmentsFinder/src/components/TRT_TrigTrackSegmentsFinder_entries.cxx
+++ b/InnerDetector/InDetTrigRecAlgs/TRT_TrigTrackSegmentsFinder/src/components/TRT_TrigTrackSegmentsFinder_entries.cxx
@@ -1,5 +1,4 @@
 #include "TRT_TrigTrackSegmentsFinder/TRT_TrigTrackSegmentsFinder.h"
-#include "IRegionSelector/IRegSelSvc.h"
 
 using namespace InDet;
 
-- 
GitLab


From e68bae9df29fe9752c9c918686cf30d05c344996 Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Fri, 18 Dec 2020 16:31:24 +0100
Subject: [PATCH 162/225] SiTrigSPSeededTrackFinder: remove unused IRegSelSvc
 include

Also move other interface includes to main header file.
---
 .../SiTrigSPSeededTrackFinder.h                      | 12 ++++--------
 .../components/SiTrigSPSeededTrackFinder_entries.cxx |  5 -----
 2 files changed, 4 insertions(+), 13 deletions(-)

diff --git a/InnerDetector/InDetTrigRecAlgs/SiTrigSPSeededTrackFinder/SiTrigSPSeededTrackFinder/SiTrigSPSeededTrackFinder.h b/InnerDetector/InDetTrigRecAlgs/SiTrigSPSeededTrackFinder/SiTrigSPSeededTrackFinder/SiTrigSPSeededTrackFinder.h
index 2ce82cb6394b..ac36a7e433c7 100755
--- a/InnerDetector/InDetTrigRecAlgs/SiTrigSPSeededTrackFinder/SiTrigSPSeededTrackFinder/SiTrigSPSeededTrackFinder.h
+++ b/InnerDetector/InDetTrigRecAlgs/SiTrigSPSeededTrackFinder/SiTrigSPSeededTrackFinder/SiTrigSPSeededTrackFinder.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 /////////////////////////////////////////////////////////////////////////////
@@ -33,18 +33,14 @@
 
 //!< Trigger specific stuff
 #include "TrigInterfaces/FexAlgo.h"
-
 #include "TrkEventUtils/PRDtoTrackMap.h"
+#include "InDetRecToolInterfaces/ISiSpacePointsSeedMaker.h"
+#include "InDetRecToolInterfaces/ISiZvertexMaker.h"
+#include "InDetRecToolInterfaces/ISiTrackMaker.h"
 
 //forward declarations
 class TrigTimer;
 
-namespace InDet {
-  class ISiSpacePointsSeedMaker;
-  class ISiZvertexMaker;
-  class ISiTrackMaker;
-}
-
 namespace InDet {
   
   //!< Class-algorithm for track finding in Pixels and SCT
diff --git a/InnerDetector/InDetTrigRecAlgs/SiTrigSPSeededTrackFinder/src/components/SiTrigSPSeededTrackFinder_entries.cxx b/InnerDetector/InDetTrigRecAlgs/SiTrigSPSeededTrackFinder/src/components/SiTrigSPSeededTrackFinder_entries.cxx
index 1e4aa94a9b86..81479d68bfd2 100644
--- a/InnerDetector/InDetTrigRecAlgs/SiTrigSPSeededTrackFinder/src/components/SiTrigSPSeededTrackFinder_entries.cxx
+++ b/InnerDetector/InDetTrigRecAlgs/SiTrigSPSeededTrackFinder/src/components/SiTrigSPSeededTrackFinder_entries.cxx
@@ -1,10 +1,5 @@
 #include "SiTrigSPSeededTrackFinder/SiTrigSPSeededTrackFinder.h"
 
-#include "InDetRecToolInterfaces/ISiSpacePointsSeedMaker.h"
-#include "InDetRecToolInterfaces/ISiZvertexMaker.h" 
-#include "InDetRecToolInterfaces/ISiTrackMaker.h" 
-#include "IRegionSelector/IRegSelSvc.h"
-
 using namespace InDet;
 
 DECLARE_COMPONENT( SiTrigSPSeededTrackFinder )
-- 
GitLab


From 86039641276ac8850ed35521cff69720c1d6109b Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Fri, 18 Dec 2020 16:33:04 +0100
Subject: [PATCH 163/225] iPatRecExample: remove commented RegSelSvc code

---
 .../iPat/iPatRecExample/share/iPatRec_jobOptions.py       | 8 --------
 1 file changed, 8 deletions(-)

diff --git a/Reconstruction/iPat/iPatRecExample/share/iPatRec_jobOptions.py b/Reconstruction/iPat/iPatRecExample/share/iPatRec_jobOptions.py
index d65f219d642c..5465f4a2cf49 100755
--- a/Reconstruction/iPat/iPatRecExample/share/iPatRec_jobOptions.py
+++ b/Reconstruction/iPat/iPatRecExample/share/iPatRec_jobOptions.py
@@ -89,14 +89,6 @@ if DetFlags.detdescr.ID_on() and (DetFlags.haveRIO.pixel_on() or DetFlags.haveRI
     ToolSvc += TrackFollower(name = 'TrackFollower',
                              TRT_Recon = "TRT_Recon/TRT_Recon")
     
-    # include the RegionSelector service
-    if DetFlags.haveRIO.TRT_on():
-        from AthenaCommon.AppMgr import ServiceMgr
-        # from RegionSelector.RegSelSvcDefault import RegSelSvcDefault
-        # iPatRegSelSvc  = RegSelSvcDefault()
-        # iPatRegSelSvc.enableTRT = True
-        # ServiceMgr += iPatRegSelSvc
-
     # -------------------------------------------------------------
     # Algorithm Private Options: iPatRec
     # -------------------------------------------------------------
-- 
GitLab


From 8650f40ee3d0129c1155cb2bf2ec7d18ce786b9a Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Fri, 18 Dec 2020 16:37:53 +0100
Subject: [PATCH 164/225] TriggerJobOpts: delete RegSelSvc related Modifiers

---
 .../TriggerJobOpts/python/Modifiers.py        | 42 +------------------
 1 file changed, 1 insertion(+), 41 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/Modifiers.py b/Trigger/TriggerCommon/TriggerJobOpts/python/Modifiers.py
index 3c5cc3f12863..9c3462731bdb 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/python/Modifiers.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/Modifiers.py
@@ -494,33 +494,8 @@ class optimizeChainOrder(_modifier):
             topSequence.TrigSteer_HLT.ExecutionOrderStrategy.order=[ 'name:.+beamspot.+',
                                                                     'name:.+j.+',
                                                                     'name:.+2tau.+',
-                                                                    'name:.+tau.+'  ]
-
-class disablePixels(_modifier):
-    """
-    Turns off pixels in region selector
-    """
-    def postSetup(self):
-        svcMgr.RegSelSvc.enablePixel=False
-
-class disableSCTBarrel(_modifier):
-    """
-    Turns off SCT Barrel in region selector and badly mapped ROB
-    """
-    def postSetup(self):
-        svcMgr.RegSelSvc.DeleteSiRobList=range(0x210000,0x21000a+1)+range(0x210100,0x21010a+1)+range(0x220000,0x22000a+1)+range(0x220100,0x22010a+1)+[0x240005]
-
-class disableIBL(_modifier):
-    """
-    Turn off IBL from readout
-    """
-
-    def postSetup(self):
-        import TrigInDetValidation.InDetModules as IDM
-        pixel_barrel_layer1_hashes = IDM.getHashes(IDM.getLayer(IDM.getBarrel(IDM.Pixel),0))
-        svcMgr.RegSelSvc.DeletePixelHashList=pixel_barrel_layer1_hashes
-        svcMgr.ROBDataProviderSvc.ignoreROB=[1310848, 1310849, 1310850, 1310851, 1310899, 1310944, 1310913, 1310946, 1310929, 1310912, 1310914, 1310736, 1310737, 1310738, 1310739, 1310752, 1310753, 1310754, 1310755, 1310883, 1310897, 1310930, 1310896, 1310898, 1310768, 1310769, 1310770, 1310771, 1310784, 1310785, 1310786, 1310787, 1310867, 1310931, 1310881, 1310880, 1310882, 1310800, 1310801, 1310802, 1310803, 1310816, 1310817, 1310818, 1310819, 1310915, 1310865, 1310864, 1310945, 1310928, 1310866, 1310832, 1310833, 1310834, 1310835, 1310947]
 
+                                                                    'name:.+tau.+'  ]
 class disableIBLInTracking(_modifier):
     """
     Turn off IBL in tracking algorithms (data still available for PEB etc)
@@ -1395,21 +1370,6 @@ class LumiFromSqlite(_modifier):
                 folders += [f]
         svcMgr.IOVDbSvc.Folders = folders
 
-class LumiRegionZmax168(_modifier):
-    """
-    decrease the size (equivalent of 3*sigma_z) of luminous region for ID tracking to 168 mm
-    """
-    def preSetup(self):
-        from InDetTrigRecExample.ConfiguredNewTrackingTrigCuts import L2IDTrackingCuts
-        from AthenaCommon.SystemOfUnits import mm
-        L2IDTrackingCuts.setRegSelZmax(168* mm)
-
-    def postSetup(self):
-        from AthenaCommon.AlgSequence import AlgSequence
-        topSequence = AlgSequence()
-        RegSelSvc=topSequence.allConfigurables.get("RegSelSvcDefault")
-        from AthenaCommon.SystemOfUnits import mm
-        RegSelSvc.DeltaZ = 168* mm
 
 class useDynamicAlignFolders(_modifier):
     """
-- 
GitLab


From 43f9fd59668ab002b2900e52c760bf60b507d246 Mon Sep 17 00:00:00 2001
From: Oleh Kivernyk <oleh.kivernyk@cern.ch>
Date: Fri, 18 Dec 2020 16:53:03 +0100
Subject: [PATCH 165/225] Adding default photon efficiency correction map file
 from Rel21.7

---
 .../Root/AsgPhotonEfficiencyCorrectionTool.cxx                  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/PhysicsAnalysis/ElectronPhotonID/PhotonEfficiencyCorrection/Root/AsgPhotonEfficiencyCorrectionTool.cxx b/PhysicsAnalysis/ElectronPhotonID/PhotonEfficiencyCorrection/Root/AsgPhotonEfficiencyCorrectionTool.cxx
index 23923003e442..a3178fe0f472 100644
--- a/PhysicsAnalysis/ElectronPhotonID/PhotonEfficiencyCorrection/Root/AsgPhotonEfficiencyCorrectionTool.cxx
+++ b/PhysicsAnalysis/ElectronPhotonID/PhotonEfficiencyCorrection/Root/AsgPhotonEfficiencyCorrectionTool.cxx
@@ -64,7 +64,7 @@ AsgPhotonEfficiencyCorrectionTool::AsgPhotonEfficiencyCorrectionTool( std::strin
   declareProperty( "CorrectionFileNameUnconv", m_corrFileNameUnconv="",
                    "File that stores the correction factors for simulation for unconverted photons");
 				   
-  declareProperty("MapFilePath", m_mapFile = "" ,
+  declareProperty("MapFilePath", m_mapFile = "PhotonEfficiencyCorrection/2015_2018/rel21.2/Summer2020_Rec_v1/map1.txt",
                   "Full path to the map file");  
 				  
   declareProperty( "ForceDataType", m_dataTypeOverwrite=-1,
-- 
GitLab


From 2024d0944e082b494661223749f7c707aa7f1807 Mon Sep 17 00:00:00 2001
From: Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
Date: Fri, 18 Dec 2020 17:19:09 +0100
Subject: [PATCH 166/225] Moved the import of the geometry modules into the
 TPCnvTest(...) function.

Thereby avoiding having to escape importing errors on every import attempt.
---
 .../python/TPCnvTestConfig.py                 | 35 ++++---------------
 1 file changed, 7 insertions(+), 28 deletions(-)

diff --git a/Database/AthenaPOOL/AthenaPoolUtilities/python/TPCnvTestConfig.py b/Database/AthenaPOOL/AthenaPoolUtilities/python/TPCnvTestConfig.py
index 8b2556970110..5d7f3d6df640 100644
--- a/Database/AthenaPOOL/AthenaPoolUtilities/python/TPCnvTestConfig.py
+++ b/Database/AthenaPOOL/AthenaPoolUtilities/python/TPCnvTestConfig.py
@@ -8,34 +8,6 @@ from AthenaConfiguration.MainServicesConfig import MainServicesCfg
 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
 from IOVDbSvc.IOVDbSvcConfig import IOVDbSvcCfg
 from AthenaPoolUtilities.DumperConfig import Dumper, find_file
-try:
-    from AtlasGeoModel.GeoModelConfig import GeoModelCfg
-except ImportError:
-    pass
-try:
-    from PixelGeoModel.PixelGeoModelConfig import PixelGeometryCfg
-except ImportError:
-    pass
-try:
-    from SCT_GeoModel.SCT_GeoModelConfig import SCT_GeometryCfg
-except ImportError:
-    pass
-try:
-    from TRT_GeoModel.TRT_GeoModelConfig import TRT_GeometryCfg
-except ImportError:
-    pass
-try:
-    from LArGeoAlgsNV.LArGMConfig import LArGMCfg
-except ImportError:
-    pass
-try:
-    from TileGeoModel.TileGMConfig import TileGMCfg
-except ImportError:
-    pass
-try:
-    from MuonConfig.MuonGeometryConfig import MuonGeoModelCfg
-except ImportError:
-    pass
 #from AtlasGeoModel.ForDetGeoModelConfig import ForDetGeometryCfg
 Configurable.configurableRun3Behavior = True
 
@@ -83,24 +55,31 @@ def TPCnvTest(infile, keys, useGeoModelSvc=False, useIOVDbSvc=False, doPixel=Fal
     EventCnvSuperTool = None
     if useGeoModelSvc:
         if ConfigFlags.Detector.GeometryPixel:
+            from PixelGeoModel.PixelGeoModelConfig import PixelGeometryCfg
             acc.merge(PixelGeometryCfg(ConfigFlags))
             useGeoModelSvc = True
         if ConfigFlags.Detector.GeometrySCT:
+            from SCT_GeoModel.SCT_GeoModelConfig import SCT_GeometryCfg
             acc.merge(SCT_GeometryCfg(ConfigFlags))
             useGeoModelSvc = True
         if ConfigFlags.Detector.GeometryTRT:
+            from TRT_GeoModel.TRT_GeoModelConfig import TRT_GeometryCfg
             acc.merge(TRT_GeometryCfg(ConfigFlags))
             useGeoModelSvc = True
         if ConfigFlags.Detector.GeometryLAr:
+            from LArGeoAlgsNV.LArGMConfig import LArGMCfg
             acc.merge(LArGMCfg(ConfigFlags))
             useGeoModelSvc = True
         if ConfigFlags.Detector.GeometryTile:
+            from TileGeoModel.TileGMConfig import TileGMCfg
             acc.merge(TileGMCfg(ConfigFlags))
             useGeoModelSvc = True
         if ConfigFlags.Detector.GeometryMuon:
+            from MuonConfig.MuonGeometryConfig import MuonGeoModelCfg
             acc.merge(MuonGeoModelCfg(ConfigFlags))
             useGeoModelSvc = True
         #acc.merge(ForDetGeometryCfg(ConfigFlags))
+        from AtlasGeoModel.GeoModelConfig import GeoModelCfg
         acc.merge(GeoModelCfg(ConfigFlags))
         acc.getService("GeoModelSvc").IgnoreTagDifference = True
         if doTracks:
-- 
GitLab


From 2904e609e744365d044903dc80438b0d46dea245 Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Fri, 18 Dec 2020 17:23:06 +0100
Subject: [PATCH 167/225] EventUtils: Delete unused ParticleSortingAlg/Tool

`IJobOptionsSvc` is deprecated and this code is not used anywhere.
---
 .../EventUtils/src/ParticleSortingAlg.cxx     | 158 ---------
 .../EventUtils/src/ParticleSortingAlg.h       | 149 --------
 .../EventUtils/src/ParticleSortingTool.cxx    | 318 ------------------
 .../EventUtils/src/ParticleSortingTool.h      | 183 ----------
 .../src/components/EventUtils_entries.cxx     |   4 -
 5 files changed, 812 deletions(-)
 delete mode 100644 PhysicsAnalysis/AnalysisCommon/EventUtils/src/ParticleSortingAlg.cxx
 delete mode 100644 PhysicsAnalysis/AnalysisCommon/EventUtils/src/ParticleSortingAlg.h
 delete mode 100644 PhysicsAnalysis/AnalysisCommon/EventUtils/src/ParticleSortingTool.cxx
 delete mode 100644 PhysicsAnalysis/AnalysisCommon/EventUtils/src/ParticleSortingTool.h

diff --git a/PhysicsAnalysis/AnalysisCommon/EventUtils/src/ParticleSortingAlg.cxx b/PhysicsAnalysis/AnalysisCommon/EventUtils/src/ParticleSortingAlg.cxx
deleted file mode 100644
index f5ad85275d7f..000000000000
--- a/PhysicsAnalysis/AnalysisCommon/EventUtils/src/ParticleSortingAlg.cxx
+++ /dev/null
@@ -1,158 +0,0 @@
-///////////////////////// -*- C++ -*- /////////////////////////////
-
-/*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-*/
-
-// ParticleSortingAlg.cxx
-// Implementation file for class ParticleSortingAlg
-// Author: Karsten Koeneke <karsten.koeneke@cern.ch>
-///////////////////////////////////////////////////////////////////
-
-// EventUtils includes
-#include "ParticleSortingAlg.h"
-
-// FrameWork includes
-#include "Gaudi/Property.h"
-#include "GaudiKernel/IJobOptionsSvc.h"
-#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
-
-///////////////////////////////////////////////////////////////////
-// Public methods:
-///////////////////////////////////////////////////////////////////
-
-// Constructors
-////////////////
-ParticleSortingAlg::ParticleSortingAlg( const std::string& name,
-                                        ISvcLocator* pSvcLocator ) :
-  ::AthAlgorithm( name, pSvcLocator ),
-  m_jos("JobOptionsSvc", name),
-  m_tool("ParticleSortingTool/ParticleSortingTool", this),
-  m_inCollKey(""),
-  m_setInCollKey(false),
-  m_outCollKey(""),
-  m_setOutCollKey(false),
-  m_sortVar("pt"),
-  m_setSortVar(false),
-  m_sortDescending(true),
-  m_setSortDescending(false),
-  m_nEventsProcessed(0)
-{
-  declareProperty("JobOptionsSvc",   m_jos, "The JobOptionService instance.");
-
-  declareProperty("SortingTool",        m_tool, "The private ParticleSortingTool" );
-
-  declareProperty("InputContainer",  m_inCollKey="",   "Input container name" );
-  m_inCollKey.declareUpdateHandler( &ParticleSortingAlg::setupInputContainer, this );
-
-  declareProperty("OutputContainer", m_outCollKey="",
-                  "The name of the output container (with SG::VIEW_ELEMENTS) with the sorted copy of input objects" );
-  m_outCollKey.declareUpdateHandler( &ParticleSortingAlg::setupOutputContainer, this );
-
-  declareProperty("SortVariable",    m_sortVar="pt",
-                  "Define by what parameter to sort (default: 'pt'; allowed: 'pt', 'eta', 'phi', 'm', 'e', 'rapidity')" );
-  m_sortVar.declareUpdateHandler( &ParticleSortingAlg::setupSortVar, this );
-
-  declareProperty("SortDescending",   m_sortDescending=true,
-                  "Define if the container should be sorted in a descending order (default=true)" );
-  m_sortDescending.declareUpdateHandler( &ParticleSortingAlg::setupSortDescending, this );
-}
-
-
-
-// Destructor
-///////////////
-ParticleSortingAlg::~ParticleSortingAlg()
-{}
-
-
-
-// Athena Algorithm's Hooks
-////////////////////////////
-StatusCode ParticleSortingAlg::initialize()
-{
-  ATH_MSG_DEBUG ("Initializing " << name() << "...");
-
-  // Print out the used configuration
-  ATH_MSG_DEBUG ( " using = " << m_jos );
-  ATH_MSG_DEBUG ( " using = " << m_tool );
-  ATH_MSG_DEBUG ( " using = " << m_inCollKey );
-  ATH_MSG_DEBUG ( " using = " << m_outCollKey );
-  ATH_MSG_DEBUG ( " using = " << m_sortVar );
-  ATH_MSG_DEBUG ( " using = " << m_sortDescending );
-
-
-  // Initialize the counters to zero
-  m_nEventsProcessed = 0 ;
-
-
-  // Get the JobOptionService
-  // We will use this to set the properties of our private skimming tool
-  // from the properties of this algorithm.
-  ATH_MSG_VERBOSE( "Getting the JobOptionService");
-  ATH_CHECK( m_jos.retrieve() );
-
-  // Get the full name of the private skimTool
-  ATH_MSG_VERBOSE( "Getting the full name of the tool");
-  const std::string& fullToolName = this->name() + "." + m_tool.name();
-  ATH_MSG_DEBUG( "Got the full name of the tool: " << fullToolName );
-
-  // Now, set all properties of the private skimTool that were acutally configured
-  if (m_setInCollKey) {
-    ATH_MSG_DEBUG( "Setting property" << m_inCollKey
-                   << " of private tool with name: '" << fullToolName << "'" );
-    ATH_CHECK( m_jos->addPropertyToCatalogue (fullToolName,m_inCollKey) );
-  }
-  if (m_setOutCollKey) {
-    ATH_MSG_DEBUG( "Setting property" << m_outCollKey
-                   << " of private tool with name: '" << fullToolName << "'" );
-    ATH_CHECK( m_jos->addPropertyToCatalogue (fullToolName,m_outCollKey) );
-  }
-  if (m_setSortVar) {
-    ATH_MSG_DEBUG( "Setting property" << m_sortVar
-                   << " of private tool with name: '" << fullToolName << "'" );
-    ATH_CHECK( m_jos->addPropertyToCatalogue (fullToolName,m_sortVar) );
-  }
-  if (m_setSortDescending) {
-    ATH_MSG_DEBUG( "Setting property" << m_sortDescending
-                   << " of private tool with name: '" << fullToolName << "'" );
-    ATH_CHECK( m_jos->addPropertyToCatalogue (fullToolName,m_sortDescending) );
-  }
-  ATH_MSG_DEBUG( "Done setting properties of the tool");
-
-  // Get the skimming tool
-  ATH_CHECK( m_tool.retrieve() );
-
-  ATH_MSG_DEBUG ( "==> done with initialize " << name() << "..." );
-
-  return StatusCode::SUCCESS;
-}
-
-
-
-StatusCode ParticleSortingAlg::finalize()
-{
-  ATH_MSG_DEBUG ("Finalizing " << name() << "...");
-
-  // Release all tools and services
-  ATH_CHECK( m_jos.release() );
-  ATH_CHECK( m_tool.release() );
-
-  return StatusCode::SUCCESS;
-}
-
-
-
-StatusCode ParticleSortingAlg::execute()
-{
-  // Increase the event counter
-  ++m_nEventsProcessed;
-
-  // Simple status message at the beginning of each event execute,
-  ATH_MSG_DEBUG ( "==> execute " << name() << " on " << m_nEventsProcessed << ". event..." );
-
-  // Call the tool
-  ATH_CHECK( m_tool->addBranches() );
-
-  return StatusCode::SUCCESS;
-}
diff --git a/PhysicsAnalysis/AnalysisCommon/EventUtils/src/ParticleSortingAlg.h b/PhysicsAnalysis/AnalysisCommon/EventUtils/src/ParticleSortingAlg.h
deleted file mode 100644
index 763f04c952ca..000000000000
--- a/PhysicsAnalysis/AnalysisCommon/EventUtils/src/ParticleSortingAlg.h
+++ /dev/null
@@ -1,149 +0,0 @@
-///////////////////////// -*- C++ -*- /////////////////////////////
-
-/*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-*/
-
-// ParticleSortingAlg.h
-// Header file for class ParticleSortingAlg
-// Author: Karsten Koeneke <karsten.koeneke@cern.ch>
-///////////////////////////////////////////////////////////////////
-#ifndef EVENTUTILS_PARTICLESORTINGALG_H
-#define EVENTUTILS_PARTICLESORTINGALG_H 1
-
-// FrameWork includes
-#include "GaudiKernel/ToolHandle.h"
-#include "GaudiKernel/ServiceHandle.h"
-#include "AthenaBaseComps/AthAlgorithm.h"
-
-// STL includes
-#include <string>
-
-// Forward declarations
-class IJobOptionsSvc;
-namespace DerivationFramework {
-  class IAugmentationTool;
-}
-
-class ParticleSortingAlg
-  : public ::AthAlgorithm
-{
-
-  ///////////////////////////////////////////////////////////////////
-  // Public methods:
-  ///////////////////////////////////////////////////////////////////
- public:
-
-  // Copy constructor:
-
-  /// Constructor with parameters:
-  ParticleSortingAlg( const std::string& name, ISvcLocator* pSvcLocator );
-
-  /// Destructor:
-  virtual ~ParticleSortingAlg();
-
-  /// Athena algorithm's initalize hook
-  virtual StatusCode  initialize();
-
-  /// Athena algorithm's execute hook
-  virtual StatusCode  execute();
-
-  /// Athena algorithm's finalize hook
-  virtual StatusCode  finalize();
-
-
-private:
-  // The update handlers
-
-  /// This internal method will realize if a user sets the 'InputContainer' property
-  void setupInputContainer( Gaudi::Details::PropertyBase& /*prop*/ );
-
-  /// This internal method will realize if a user sets the 'OutputContainer' property
-  void setupOutputContainer( Gaudi::Details::PropertyBase& /*prop*/ );
-
-  /// This internal method will realize if a user sets the 'SortVariable' property
-  void setupSortVar( Gaudi::Details::PropertyBase& /*prop*/ );
-
-  /// This internal method will realize if a user sets the 'SortDeceding' property
-  void setupSortDescending( Gaudi::Details::PropertyBase& /*prop*/ );
-
-
-
-  ///////////////////////////////////////////////////////////////////
-  // Private data:
-  ///////////////////////////////////////////////////////////////////
- private:
-  /// The job options service (will be used to forward this algs properties to
-  /// the private tool)
-  ServiceHandle<IJobOptionsSvc> m_jos;
-
-  /// The ToolHandle to the private ParticleSortingTool
-  ToolHandle<DerivationFramework::IAugmentationTool> m_tool;
-
-  /// Input container name
-  StringProperty m_inCollKey;
-
-  /// This boolean is true if the user sets the 'InputContainer' property
-  bool m_setInCollKey;
-
-
-  /// The name of the output container (with SG::VIEW_ELEMENTS) with the sorted copy of input objects
-  StringProperty m_outCollKey;
-
-  /// This boolean is true if the user sets the 'OutputContainer' property
-  bool m_setOutCollKey;
-
-
-  /// Define by what parameter to sort (default: 'pt')
-  StringProperty m_sortVar;
-
-  /// This boolean is true if the user sets the 'SortVariable' property
-  bool m_setSortVar;
-
-
-  /// Define if the container should be sorted in a descending order (default=true)
-  BooleanProperty m_sortDescending;
-
-  /// This boolean is true if the user sets the 'SortDescending' property
-  bool m_setSortDescending;
-
-
-  /// Internal event counter
-  unsigned long m_nEventsProcessed;
-
-};
-
-
-
-///////////////////////////////////////////////////////////////////
-// Inline methods:
-///////////////////////////////////////////////////////////////////
-
-/// This internal method will realize if a user sets the 'InputContainer' property
-inline void ParticleSortingAlg::setupInputContainer( Gaudi::Details::PropertyBase& /*prop*/ ) {
-  m_setInCollKey = true;
-  return;
-}
-
-/// This internal method will realize if a user sets the 'OutputContainer' property
-inline void ParticleSortingAlg::setupOutputContainer( Gaudi::Details::PropertyBase& /*prop*/ ) {
-  m_setOutCollKey = true;
-  return;
-}
-
-/// This internal method will realize if a user sets the 'SortVariable' property
-inline void ParticleSortingAlg::setupSortVar( Gaudi::Details::PropertyBase& /*prop*/ )
-{
-  m_setSortVar = true;
-  return;
-}
-
-/// This internal method will realize if a user sets the 'SortDeceding' property
-inline void ParticleSortingAlg::setupSortDescending( Gaudi::Details::PropertyBase& /*prop*/ )
-{
-  m_setSortDescending = true;
-  return;
-}
-
-
-#endif //> !EVENTUTILS_PARTICLESORTINGALG_H
diff --git a/PhysicsAnalysis/AnalysisCommon/EventUtils/src/ParticleSortingTool.cxx b/PhysicsAnalysis/AnalysisCommon/EventUtils/src/ParticleSortingTool.cxx
deleted file mode 100644
index 876c7e005d22..000000000000
--- a/PhysicsAnalysis/AnalysisCommon/EventUtils/src/ParticleSortingTool.cxx
+++ /dev/null
@@ -1,318 +0,0 @@
-///////////////////////// -*- C++ -*- /////////////////////////////
-
-/*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-*/
-
-// ParticleSortingTool.cxx
-// Implementation file for class ParticleSortingTool
-// Author: Karsten Koeneke <karsten.koeneke@cern.ch>
-///////////////////////////////////////////////////////////////////
-
-// EventUtils includes
-#include "ParticleSortingTool.h"
-
-// EDM includes
-#include "xAODBase/IParticle.h"
-#include "xAODBase/IParticleContainer.h"
-#include "xAODMuon/MuonContainer.h"
-#include "xAODJet/JetContainer.h"
-#include "xAODEgamma/ElectronContainer.h"
-#include "xAODEgamma/PhotonContainer.h"
-#include "xAODTau/TauJetContainer.h"
-#include "xAODPFlow/PFOContainer.h"
-#include "xAODTracking/NeutralParticleContainer.h"
-#include "xAODTracking/TrackParticleContainer.h"
-#include "xAODTruth/TruthParticleContainer.h"
-#include "xAODParticleEvent/CompositeParticleContainer.h"
-#include "xAODParticleEvent/ParticleContainer.h"
-#include "xAODCaloEvent/CaloClusterContainer.h"
-#include "AthContainers/ConstDataVector.h"
-
-// Constructors
-////////////////
-ParticleSortingTool::ParticleSortingTool( const std::string& type,
-                                          const std::string& name,
-                                          const IInterface* parent ) :
-  ::AthAlgTool  ( type, name, parent ),
-  m_inCollKey(""),
-  m_outCollKey(""),
-  m_sortVar("pt"),
-  m_sortDescending(true),
-  m_contID(0),
-  m_sortID(0),
-  m_nEventsProcessed(0)
-{
-  declareInterface< DerivationFramework::IAugmentationTool >(this);
-
-  declareProperty("InputContainer",  m_inCollKey="",   "Input container name" );
-
-  declareProperty("OutputContainer", m_outCollKey="",
-                  "The name of the output container (with SG::VIEW_ELEMENTS) with the sorted copy of input objects" );
-
-  declareProperty("SortVariable",    m_sortVar="pt",
-                  "Define by what parameter to sort (default: 'pt'; allowed: 'pt', 'eta', 'phi', 'm', 'e', 'rapidity')" );
-
-  declareProperty("SortDescending",   m_sortDescending=true,
-                  "Define if the container should be sorted in a descending order (default=true)" );
-}
-
-
-// Destructor
-///////////////
-ParticleSortingTool::~ParticleSortingTool()
-{}
-
-
-
-// Athena algtool's Hooks
-////////////////////////////
-StatusCode ParticleSortingTool::initialize()
-{
-  ATH_MSG_DEBUG ("Initializing " << name() << "...");
-
-  // Print out the used configuration
-  ATH_MSG_DEBUG ( " using = " << m_inCollKey );
-  ATH_MSG_DEBUG ( " using = " << m_outCollKey );
-
-  // initialize the counters
-  m_contID           = 0;
-  m_sortID           = 0;
-  m_nEventsProcessed = 0;
-
-  // Figure out how to sort
-  if ( m_sortVar.value() == "pt" )            { m_sortID = 1; }
-  else if ( m_sortVar.value() == "eta" )      { m_sortID = 2; }
-  else if ( m_sortVar.value() == "phi" )      { m_sortID = 3; }
-  else if ( m_sortVar.value() == "m" )        { m_sortID = 4; }
-  else if ( m_sortVar.value() == "e" )        { m_sortID = 5; }
-  else if ( m_sortVar.value() == "rapidity" ) { m_sortID = 6; }
-  else {
-    ATH_MSG_INFO("Didn't find a valid value for SortVariable=" << m_sortVar.value() << "."
-                 << " Assuming it's an auxdata member");
-    m_sortID = 7;
-  }
-  if ( m_sortDescending.value() ) { m_sortID *= -1; }
-
-  return StatusCode::SUCCESS;
-}
-
-
-
-
-StatusCode ParticleSortingTool::finalize()
-{
-  ATH_MSG_DEBUG ("Finalizing " << name() << "...");
-
-  return StatusCode::SUCCESS;
-}
-
-
-
-// Declare a short pre-processor macro to deal with the different container types
-#define COPY_AND_SORT_CONTAINER( CONTAINERTYPE )                                       \
-else if ( evtStore()->contains<CONTAINERTYPE>( m_inCollKey.value() ) ) {               \
-  ATH_MSG_DEBUG("Trying to copy, sort, and record container of type "#CONTAINERTYPE ); \
-  const CONTAINERTYPE* inCont;                                                         \
-  ATH_CHECK( evtStore()->retrieve( inCont, m_inCollKey.value() ) );                    \
-  CONTAINERTYPE* outCont = new CONTAINERTYPE( SG::VIEW_ELEMENTS );                     \
-  *outCont = *inCont;                                                                  \
-  ATH_CHECK( evtStore()->record ( outCont, m_outCollKey.value() ) );                   \
-  ATH_CHECK( this->doSort(outCont) );                                                  \
-}
-
-
-// Declare a short pre-processor macro to deal with the different container types
-#define OVERWRITE_AND_SORT_CONTAINER( CONTAINERTYPE )                                                \
-else if ( evtStore()->contains<CONTAINERTYPE>( m_inCollKey.value() ) ) {                             \
-  ATH_MSG_DEBUG("Trying to copy, sort, and overwrite container of type "#CONTAINERTYPE );            \
-  const CONTAINERTYPE* inCont;                                                                       \
-  ATH_CHECK( evtStore()->retrieve( inCont, m_inCollKey.value() ) );                                  \
-  ConstDataVector<CONTAINERTYPE>* outCont = new ConstDataVector<CONTAINERTYPE>( SG::VIEW_ELEMENTS ); \
-  for ( const CONTAINERTYPE::base_value_type* inPart : *inCont ){                                    \
-    outCont->push_back(inPart);                                                                      \
-  }                                                                                                  \
-  ATH_CHECK( evtStore()->overwrite( outCont, m_inCollKey.value() ) );                                \
-  ATH_CHECK( this->doSortConst<CONTAINERTYPE>(outCont) );                                            \
-}
-
-
-
-StatusCode ParticleSortingTool::addBranches() const
-{
-  // Increase the event counter
-  ++m_nEventsProcessed;
-
-  // Simple status message at the beginning of each event execute,
-  ATH_MSG_DEBUG ( "==> addBranches " << name() << " on " << m_nEventsProcessed << ". event..." );
-
-  if ( m_outCollKey.value().empty() ) {
-    // Try to get the input container as non-const
-    ATH_MSG_DEBUG("Got an empty 'OutputCollection' property. "
-                  << "Trying to retrieve a non-const version of the 'InputContainer'...");
-    xAOD::IParticleContainer* inCont = evtStore()->tryRetrieve<xAOD::IParticleContainer>( m_inCollKey.value() );
-    if (inCont){ ATH_CHECK( this->doSort(inCont) ); }
-    else {
-      ATH_MSG_DEBUG("We couldn't retrieve a non-const version of the input container... try const.");
-      const xAOD::IParticleContainer* inCont2 = nullptr;
-      ATH_CHECK( evtStore()->retrieve( inCont2, m_inCollKey.value()) );
-      // Now, do the copy and sorting and overwriting of all known container types
-      if (false) {
-      }
-      OVERWRITE_AND_SORT_CONTAINER(xAOD::MuonContainer)
-      OVERWRITE_AND_SORT_CONTAINER(xAOD::ElectronContainer)
-      OVERWRITE_AND_SORT_CONTAINER(xAOD::PhotonContainer)
-      OVERWRITE_AND_SORT_CONTAINER(xAOD::TauJetContainer)
-      OVERWRITE_AND_SORT_CONTAINER(xAOD::JetContainer)
-      OVERWRITE_AND_SORT_CONTAINER(xAOD::PFOContainer)
-      OVERWRITE_AND_SORT_CONTAINER(xAOD::NeutralParticleContainer)
-      OVERWRITE_AND_SORT_CONTAINER(xAOD::TrackParticleContainer)
-      OVERWRITE_AND_SORT_CONTAINER(xAOD::TruthParticleContainer)
-      OVERWRITE_AND_SORT_CONTAINER(xAOD::CompositeParticleContainer)
-      OVERWRITE_AND_SORT_CONTAINER(xAOD::ParticleContainer)
-      OVERWRITE_AND_SORT_CONTAINER(xAOD::CaloClusterContainer)
-      else {
-        ATH_MSG_ERROR("Couln't find the provided intput container in store gate for later overwriting");
-        return StatusCode::FAILURE;
-      }
-    }
-  }
-  else {
-    ATH_MSG_DEBUG("Got a non-empty 'OutputCollection' property. "
-                  << "Trying to retrieve a const version of the 'InputContainer'...");
-
-    // Now, do the copy and sorting of all known container types
-    if (false) {
-    }
-    COPY_AND_SORT_CONTAINER(xAOD::MuonContainer)
-    COPY_AND_SORT_CONTAINER(xAOD::ElectronContainer)
-    COPY_AND_SORT_CONTAINER(xAOD::PhotonContainer)
-    COPY_AND_SORT_CONTAINER(xAOD::TauJetContainer)
-    COPY_AND_SORT_CONTAINER(xAOD::JetContainer)
-    COPY_AND_SORT_CONTAINER(xAOD::PFOContainer)
-    COPY_AND_SORT_CONTAINER(xAOD::NeutralParticleContainer)
-    COPY_AND_SORT_CONTAINER(xAOD::TrackParticleContainer)
-    COPY_AND_SORT_CONTAINER(xAOD::TruthParticleContainer)
-    COPY_AND_SORT_CONTAINER(xAOD::CompositeParticleContainer)
-    COPY_AND_SORT_CONTAINER(xAOD::ParticleContainer)
-    COPY_AND_SORT_CONTAINER(xAOD::CaloClusterContainer)
-    else {
-      ATH_MSG_ERROR("Couln't find the provided intput container in store gate");
-      return StatusCode::FAILURE;
-    }
-
-  }
-
-  return StatusCode::SUCCESS;
-}
-
-
-
-StatusCode ParticleSortingTool::doSort( xAOD::IParticleContainer* cont ) const
-{
-  if ( !cont ) {
-    ATH_MSG_ERROR("No container to be sorted");
-    return StatusCode::FAILURE;
-  }
-  // Actually do the sorting, using a C++11 lambda function construct
-  // to be able to use the member function here
-  if ( std::abs(m_sortID) == 1 ) {
-    cont->sort( [this](const xAOD::IParticle* a, const xAOD::IParticle* b) {
-                  return this->comparePt(a,b);
-                } );
-  }
-  else if ( std::abs(m_sortID) == 2 ) {
-    cont->sort( [this](const xAOD::IParticle* a, const xAOD::IParticle* b) {
-                  return this->compareEta(a,b);
-                } );
-  }
-  else if ( std::abs(m_sortID) == 3 ) {
-    cont->sort( [this](const xAOD::IParticle* a, const xAOD::IParticle* b) {
-                  return this->comparePhi(a,b);
-                } );
-  }
-  else if ( std::abs(m_sortID) == 4 ) {
-    cont->sort( [this](const xAOD::IParticle* a, const xAOD::IParticle* b) {
-                  return this->compareMass(a,b);
-                } );
-  }
-  else if ( std::abs(m_sortID) == 5 ) {
-    cont->sort( [this](const xAOD::IParticle* a, const xAOD::IParticle* b) {
-                  return this->compareEnergy(a,b);
-                } );
-  }
-  else if ( std::abs(m_sortID) == 6 ) {
-    cont->sort( [this](const xAOD::IParticle* a, const xAOD::IParticle* b) {
-                  return this->compareRapidity(a,b);
-                } );
-  }
-  else if ( std::abs(m_sortID) == 7 ) {
-    cont->sort( [this](const xAOD::IParticle* a, const xAOD::IParticle* b) {
-                  return this->compareAuxData(a,b);
-                } );
-  }
-
-  return StatusCode::SUCCESS;
-}
-
-
-bool ParticleSortingTool::comparePt( const xAOD::IParticle* partA,
-                                     const xAOD::IParticle* partB ) const
-{
-  const double a = partA->pt();
-  const double b = partB->pt();
-  return this->compareDouble(a,b);
-}
-
-
-bool ParticleSortingTool::compareEta( const xAOD::IParticle* partA,
-                                      const xAOD::IParticle* partB ) const
-{
-  const double a = partA->eta();
-  const double b = partB->eta();
-  return this->compareDouble(a,b);
-}
-
-
-bool ParticleSortingTool::comparePhi( const xAOD::IParticle* partA,
-                                      const xAOD::IParticle* partB ) const
-{
-  const double a = partA->phi();
-  const double b = partB->phi();
-  return this->compareDouble(a,b);
-}
-
-
-bool ParticleSortingTool::compareMass( const xAOD::IParticle* partA,
-                                       const xAOD::IParticle* partB ) const
-{
-  const double a = partA->m();
-  const double b = partB->m();
-  return this->compareDouble(a,b);
-}
-
-
-bool ParticleSortingTool::compareEnergy( const xAOD::IParticle* partA,
-                                         const xAOD::IParticle* partB ) const
-{
-  const double a = partA->e();
-  const double b = partB->e();
-  return this->compareDouble(a,b);
-}
-
-
-bool ParticleSortingTool::compareRapidity( const xAOD::IParticle* partA,
-                                           const xAOD::IParticle* partB ) const
-{
-  const double a = partA->rapidity();
-  const double b = partB->rapidity();
-  return this->compareDouble(a,b);
-}
-
-bool ParticleSortingTool::compareAuxData( const xAOD::IParticle* partA,
-                                       const xAOD::IParticle* partB ) const
-{
-  const double a = partA->auxdata<float>( this->m_sortVar.value() );
-  const double b = partB->auxdata<float>( this->m_sortVar.value() );
-  return this->compareDouble(a,b);
-}
diff --git a/PhysicsAnalysis/AnalysisCommon/EventUtils/src/ParticleSortingTool.h b/PhysicsAnalysis/AnalysisCommon/EventUtils/src/ParticleSortingTool.h
deleted file mode 100644
index dc097711cfb2..000000000000
--- a/PhysicsAnalysis/AnalysisCommon/EventUtils/src/ParticleSortingTool.h
+++ /dev/null
@@ -1,183 +0,0 @@
-///////////////////////// -*- C++ -*- /////////////////////////////
-
-/*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-*/
-
-// ParticleSortingTool.h
-// Header file for class ParticleSortingTool
-// Author: Karsten Koeneke <karsten.koeneke@cern.ch>
-///////////////////////////////////////////////////////////////////
-#ifndef EVENTUTILS_PARTICLESORTINGTOOL_H
-#define EVENTUTILS_PARTICLESORTINGTOOL_H 1
-
-// FrameWork includes
-#include "AthenaBaseComps/AthAlgTool.h"
-#include "DerivationFrameworkInterfaces/IAugmentationTool.h"
-#include "CxxUtils/fpcompare.h"
-
-// EDM inlcudes
-#include "xAODBase/IParticle.h"
-#include "xAODBase/IParticleContainer.h"
-#include "AthContainers/ConstDataVector.h"
-
-// STL includes
-#include <vector>
-#include <string>
-#include <cmath>
-
-class ParticleSortingTool
-  : virtual public ::DerivationFramework::IAugmentationTool,
-            public ::AthAlgTool
-{
-
-  ///////////////////////////////////////////////////////////////////
-  // Public methods:
-  ///////////////////////////////////////////////////////////////////
-public:
-
-  // Copy constructor:
-
-  /// Constructor with parameters:
-  ParticleSortingTool( const std::string& type,
-                       const std::string& name,
-                       const IInterface* parent );
-
-  /// Destructor:
-  virtual ~ParticleSortingTool();
-
-  /// Athena algtool's initialize
-  virtual StatusCode  initialize() override;
-
-  /// Athena algtool's finalize
-  virtual StatusCode  finalize() override;
-
-
-  /// Implement the method from the ISkimmingTool interface
-  virtual StatusCode addBranches() const final override;
-
-
-
-// Private methods
-private:
-
-  /// Helper method that implements the call to the right sort function
-  StatusCode doSort( xAOD::IParticleContainer* cont ) const;
-
-  /// Helper method to sort a ConstDataVector
-  template<class CONTAINERTYPE>
-  StatusCode doSortConst( ConstDataVector<CONTAINERTYPE>* cont ) const;
-
-  /// The method to compare the particle's pt
-  bool comparePt( const xAOD::IParticle* partA, const xAOD::IParticle* partB ) const;
-
-  /// The method to compare the particle's eta
-  bool compareEta( const xAOD::IParticle* partA, const xAOD::IParticle* partB ) const;
-
-  /// The method to compare the particle's phi
-  bool comparePhi( const xAOD::IParticle* partA, const xAOD::IParticle* partB ) const;
-
-  /// The method to compare the particle's mass
-  bool compareMass( const xAOD::IParticle* partA, const xAOD::IParticle* partB ) const;
-
-  /// The method to compare the particle's energy
-  bool compareEnergy( const xAOD::IParticle* partA, const xAOD::IParticle* partB ) const;
-
-  /// The method to compare the particle's rapidity
-  bool compareRapidity( const xAOD::IParticle* partA, const xAOD::IParticle* partB ) const;
-
-  /// The method to compare an auxdata member of the particle
-  bool compareAuxData( const xAOD::IParticle* partA, const xAOD::IParticle* partB ) const;
-
-  /// Method to compare two doubles
-  inline bool compareDouble( double a, double b ) const;
-
-
-  ///////////////////////////////////////////////////////////////////
-  // Private data:
-  ///////////////////////////////////////////////////////////////////
-private:
-
-  /// Input container name
-  StringProperty m_inCollKey;
-
-  /// The name of the output container (with SG::VIEW_ELEMENTS) with the sorted copy of input objects
-  StringProperty m_outCollKey;
-
-  /// Define by what parameter to sort (default: 'pt')
-  StringProperty m_sortVar;
-
-  /// Define if the container should be sorted in a descending order (default=true)
-  BooleanProperty m_sortDescending;
-
-
-  /// Internal container type identifier
-  mutable unsigned int m_contID;
-
-  /// Internal identifier for the type of sorting
-  mutable int m_sortID;
-
-  /// Internal event counter
-  mutable unsigned long m_nEventsProcessed;
-
-};
-
-
-inline bool ParticleSortingTool::compareDouble( double a, double b ) const
-{
-  if ( m_sortID < 0 ) { return CxxUtils::fpcompare::greater(a,b); }
-  else { return CxxUtils::fpcompare::less(a,b); }
-}
-
-
-template<class CONTAINERTYPE>
-StatusCode ParticleSortingTool::doSortConst( ConstDataVector<CONTAINERTYPE>* cont ) const
-{
-  if ( !cont ) {
-    ATH_MSG_ERROR("No ConstDataVector to be sorted");
-    return StatusCode::FAILURE;
-  }
-  // Actually do the sorting, using a C++11 lambda function construct
-  // to be able to use the member function here
-  if ( std::abs(m_sortID) == 1 ) {
-    cont->sort( [this](const xAOD::IParticle* a, const xAOD::IParticle* b) {
-                  return this->comparePt(a,b);
-                } );
-  }
-  else if ( std::abs(m_sortID) == 2 ) {
-    cont->sort( [this](const xAOD::IParticle* a, const xAOD::IParticle* b) {
-                  return this->compareEta(a,b);
-                } );
-  }
-  else if ( std::abs(m_sortID) == 3 ) {
-    cont->sort( [this](const xAOD::IParticle* a, const xAOD::IParticle* b) {
-                  return this->comparePhi(a,b);
-                } );
-  }
-  else if ( std::abs(m_sortID) == 4 ) {
-    cont->sort( [this](const xAOD::IParticle* a, const xAOD::IParticle* b) {
-                  return this->compareMass(a,b);
-                } );
-  }
-  else if ( std::abs(m_sortID) == 5 ) {
-    cont->sort( [this](const xAOD::IParticle* a, const xAOD::IParticle* b) {
-                  return this->compareEnergy(a,b);
-                } );
-  }
-  else if ( std::abs(m_sortID) == 6 ) {
-    cont->sort( [this](const xAOD::IParticle* a, const xAOD::IParticle* b) {
-                  return this->compareRapidity(a,b);
-                } );
-  }
-  else if ( std::abs(m_sortID) == 7 ) {
-    cont->sort( [this](const xAOD::IParticle* a, const xAOD::IParticle* b) {
-                  return this->compareAuxData(a,b);
-                } );
-  }
-
-  return StatusCode::SUCCESS;
-}
-
-
-
-#endif //> !EVENTUTILS_PARTICLESORTINGTOOL_H
diff --git a/PhysicsAnalysis/AnalysisCommon/EventUtils/src/components/EventUtils_entries.cxx b/PhysicsAnalysis/AnalysisCommon/EventUtils/src/components/EventUtils_entries.cxx
index 1f217ab44bc0..557082712e44 100644
--- a/PhysicsAnalysis/AnalysisCommon/EventUtils/src/components/EventUtils_entries.cxx
+++ b/PhysicsAnalysis/AnalysisCommon/EventUtils/src/components/EventUtils_entries.cxx
@@ -1,5 +1,3 @@
-#include "../ParticleSortingTool.h"
-#include "../ParticleSortingAlg.h"
 #include "../CutTool.h"
 #include "../CutAlg.h"
 #include "../ParticleSelectionTool.h"
@@ -9,8 +7,6 @@
 #include "../TriggerSelectionAlg.h"
 #include "../EventDecisionAlg.h"
 
-DECLARE_COMPONENT( ParticleSortingTool )
-DECLARE_COMPONENT( ParticleSortingAlg )
 DECLARE_COMPONENT( CutTool )
 DECLARE_COMPONENT( CutAlg )
 DECLARE_COMPONENT( ParticleSelectionTool )
-- 
GitLab


From df502c0e325c788b090ee86444947deddd8f0d33 Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <frank.winklmeier@cern.ch>
Date: Fri, 18 Dec 2020 16:46:31 +0000
Subject: [PATCH 168/225] Revert "Merge branch
 'DistanceSolution_default_move_inline_to_icc' into 'master'"

This reverts merge request !39259
---
 .../TrkSurfaces/DistanceSolution.h            | 86 ++++++++++++++-----
 .../TrkSurfaces/DistanceSolution.icc          | 69 ---------------
 .../TrkSurfaces/src/DistanceSolution.cxx      | 28 ++++++
 3 files changed, 92 insertions(+), 91 deletions(-)
 delete mode 100644 Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.icc
 create mode 100644 Tracking/TrkDetDescr/TrkSurfaces/src/DistanceSolution.cxx

diff --git a/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.h b/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.h
index d38c5f9e7714..60ee6ea87fed 100644
--- a/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.h
+++ b/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.h
@@ -9,7 +9,9 @@
 #ifndef TRKSURFACES_DISTANCESOLUTION_H
 #define TRKSURFACES_DISTANCESOLUTION_H
 
-#include <cmath>
+// STD
+#include <iostream>
+#include <math.h>
 
 namespace Trk {
 
@@ -24,19 +26,14 @@ namespace Trk {
 class DistanceSolution
 {
 public:
-  DistanceSolution() = default;
-  DistanceSolution(const DistanceSolution&) = default;
-  DistanceSolution(DistanceSolution&&) = default;
-  DistanceSolution& operator=(const DistanceSolution&) = default;
-  DistanceSolution& operator=(DistanceSolution&&) = default;
-  ~DistanceSolution() = default;
-
-   /**Constructor*/
-  DistanceSolution(int num,
-                   double current = 0.,
-                   bool signedDist = false,
-                   double first = 0.,
-                   double second = 0.);
+  /**Default Constructor*/
+  DistanceSolution();
+
+  /**Constructor*/
+  DistanceSolution(int num, double current = 0., bool signedDist = false, double first = 0., double second = 0.);
+
+  /**Destructor*/
+  virtual ~DistanceSolution() = default;
 
   // methods to access solutions
   /** Number of intersection solutions*/
@@ -45,8 +42,7 @@ public:
   /** Distance to first intersection solution along direction*/
   double first() const;
 
-  /** Distance to second intersection solution along direction (for a cylinder
-   * surface)*/
+  /** Distance to second intersection solution along direction (for a cylinder surface)*/
   double second() const;
 
   /** Absolute Distance to closest solution */
@@ -55,15 +51,14 @@ public:
   /** Distance to point of closest approach along direction*/
   double toPointOfClosestApproach() const;
 
-  /** Current distance to surface (spatial), signed (along/opposite to surface
-   * normal) if input argument true (absolute value by default)*/
+  /** Current distance to surface (spatial), signed (along/opposite to surface normal) if input argument true (absolute
+   * value by default)*/
   double currentDistance(bool signedDist = false) const;
 
-  /** This method indicates availability of signed current distance (false for
-   * Perigee and StraighLineSurface) */
+  /** This method indicates availability of signed current distance (false for Perigee and StraighLineSurface) */
   bool signedDistance() const;
 
-private:
+protected:
   int m_num;
   double m_first;
   double m_second;
@@ -71,7 +66,54 @@ private:
   bool m_signedDist;
 };
 
+inline int
+DistanceSolution::numberOfSolutions() const
+{
+  return m_num;
+}
+
+inline double
+DistanceSolution::first() const
+{
+  return m_first;
+}
+
+inline double
+DistanceSolution::second() const
+{
+  return m_second;
+}
+
+inline double
+DistanceSolution::absClosest() const
+{
+  if (m_num > 1)
+    return (m_first * m_first < m_second * m_second) ? fabs(m_first) : fabs(m_second);
+  else
+    return fabs(m_first);
+}
+
+inline double
+DistanceSolution::toPointOfClosestApproach() const
+{
+  return m_first;
+}
+
+inline double
+DistanceSolution::currentDistance(bool signedDist) const
+{
+  if (signedDist)
+    return m_current;
+  else
+    return fabs(m_current);
+}
+
+inline bool
+DistanceSolution::signedDistance() const
+{
+  return m_signedDist;
+}
+
 } // end of namespace
 
-#include "TrkSurfaces/DistanceSolution.icc"
 #endif // TRKSURFACES_DISTANCESOLUTION_H
diff --git a/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.icc b/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.icc
deleted file mode 100644
index 15ef7e32d23a..000000000000
--- a/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.icc
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-*/
-namespace Trk {
-inline DistanceSolution::DistanceSolution(int num,
-                                          double current,
-                                          bool signedDist,
-                                          double first,
-                                          double second)
-  : m_num(num)
-  , m_first(first)
-  , m_second(second)
-  , m_current(current)
-  , m_signedDist(signedDist)
-{}
-
-inline int
-DistanceSolution::numberOfSolutions() const
-{
-  return m_num;
-}
-
-inline double
-DistanceSolution::first() const
-{
-  return m_first;
-}
-
-inline double
-DistanceSolution::second() const
-{
-  return m_second;
-}
-
-inline double
-DistanceSolution::absClosest() const
-{
-  if (m_num > 1) {
-    return (m_first * m_first < m_second * m_second) ? std::abs(m_first)
-                                                     : std::abs(m_second);
-  } else {
-    return std::abs(m_first);
-  }
-}
-
-inline double
-DistanceSolution::toPointOfClosestApproach() const
-{
-  return m_first;
-}
-
-inline double
-DistanceSolution::currentDistance(bool signedDist) const
-{
-  if (signedDist) {
-    return m_current;
-  } else {
-    return std::abs(m_current);
-  }
-}
-
-inline bool
-DistanceSolution::signedDistance() const
-{
-  return m_signedDist;
-}
-
-} // end of namespace
-
diff --git a/Tracking/TrkDetDescr/TrkSurfaces/src/DistanceSolution.cxx b/Tracking/TrkDetDescr/TrkSurfaces/src/DistanceSolution.cxx
new file mode 100644
index 000000000000..a7d7a4cdf548
--- /dev/null
+++ b/Tracking/TrkDetDescr/TrkSurfaces/src/DistanceSolution.cxx
@@ -0,0 +1,28 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+
+///////////////////////////////////////////////////////////////////
+// DistanceSolution.cxx, (c) ATLAS Detector Software
+///////////////////////////////////////////////////////////////////
+
+// Trk
+#include "TrkSurfaces/DistanceSolution.h"
+
+// default constructor
+Trk::DistanceSolution::DistanceSolution()
+  : m_num()
+  , m_first()
+  , m_second()
+  , m_current()
+  , m_signedDist()
+{}
+
+// constructor
+Trk::DistanceSolution::DistanceSolution(int num, double current, bool signedDist, double first, double second)
+  : m_num(num)
+  , m_first(first)
+  , m_second(second)
+  , m_current(current)
+  , m_signedDist(signedDist)
+{}
-- 
GitLab


From e276dc1b82fb8af7f8ba2728a605bf1446fb7090 Mon Sep 17 00:00:00 2001
From: christos <christos@cern.ch>
Date: Fri, 18 Dec 2020 18:55:18 +0100
Subject: [PATCH 169/225] Distance  solution, move inline to .icc and use
 default. Also fix SCT_Digitization to used std::log, std::sqrt

---
 .../src/SCT_SurfaceChargesGenerator.cxx       | 10 +--
 .../TrkSurfaces/DistanceSolution.h            | 86 +++++--------------
 .../TrkSurfaces/DistanceSolution.icc          | 69 +++++++++++++++
 .../TrkSurfaces/src/DistanceSolution.cxx      | 28 ------
 4 files changed, 96 insertions(+), 97 deletions(-)
 create mode 100644 Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.icc
 delete mode 100644 Tracking/TrkDetDescr/TrkSurfaces/src/DistanceSolution.cxx

diff --git a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx
index 23711b4ea8a9..adb1988e8216 100644
--- a/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx
+++ b/InnerDetector/InDetDigitization/SCT_Digitization/src/SCT_SurfaceChargesGenerator.cxx
@@ -213,13 +213,13 @@ float SCT_SurfaceChargesGenerator::driftTime(float zhit, const SiDetectorElement
         ATH_MSG_ERROR("driftTime: negative argument X for log(X) " << zhit);
       }
       return -1.0;
-    } else { 
+    } else {
       // (m_biasVoltage<m_depletionVoltage) can happen with underdepleted sensors, lose charges in that volume
       return -10.0;
     }
   }
 
-  float t_drift{log((depletionVoltage + biasVoltage) / denominator)};
+  float t_drift{std::log((depletionVoltage + biasVoltage) / denominator)};
   t_drift *= thickness * thickness / (2.0 * m_siPropertiesTool->getSiProperties(hashId).holeDriftMobility() * depletionVoltage);
   return t_drift;
 }
@@ -236,7 +236,7 @@ float SCT_SurfaceChargesGenerator::diffusionSigma(float zhit, const SiDetectorEl
   const float t{driftTime(zhit, element)}; // in ns
 
   if (t > 0.0) {
-    const float sigma{static_cast<float>(sqrt(2. * m_siPropertiesTool->getSiProperties(hashId).holeDiffusionConstant() * t))}; // in mm
+    const float sigma{static_cast<float>(std::sqrt(2. * m_siPropertiesTool->getSiProperties(hashId).holeDiffusionConstant() * t))}; // in mm
     return sigma;
   } else {
     return 0.0;
@@ -351,7 +351,7 @@ void SCT_SurfaceChargesGenerator::processSiHit(const SiDetectorElement* element,
   const float cPhi{static_cast<float>(endPos[SiHit::xPhi]) - xPhi};
   const float cDep{static_cast<float>(endPos[SiHit::xDep]) - xDep};
 
-  const float LargeStep{sqrt(cEta*cEta + cPhi*cPhi + cDep*cDep)};
+  const float LargeStep{std::sqrt(cEta*cEta + cPhi*cPhi + cDep*cDep)};
   const int numberOfSteps{static_cast<int>(LargeStep / m_smallStepLength) + 1};
   const float steps{static_cast<float>(m_numberOfCharges * numberOfSteps)};
   const float e1{static_cast<float>(phit.energyLoss() / steps)};
@@ -394,7 +394,7 @@ void SCT_SurfaceChargesGenerator::processSiHit(const SiDetectorElement* element,
   const float StepX{cEta / numberOfSteps};
   const float StepY{cPhi / numberOfSteps};
   const float StepZ{cDep / numberOfSteps};
-  
+
   // check the status of truth information for this SiHit
   // some Truth information is cut for pile up events
   const EBC_EVCOLL evColl = EBC_MAINEVCOLL;
diff --git a/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.h b/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.h
index 60ee6ea87fed..d38c5f9e7714 100644
--- a/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.h
+++ b/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.h
@@ -9,9 +9,7 @@
 #ifndef TRKSURFACES_DISTANCESOLUTION_H
 #define TRKSURFACES_DISTANCESOLUTION_H
 
-// STD
-#include <iostream>
-#include <math.h>
+#include <cmath>
 
 namespace Trk {
 
@@ -26,14 +24,19 @@ namespace Trk {
 class DistanceSolution
 {
 public:
-  /**Default Constructor*/
-  DistanceSolution();
-
-  /**Constructor*/
-  DistanceSolution(int num, double current = 0., bool signedDist = false, double first = 0., double second = 0.);
-
-  /**Destructor*/
-  virtual ~DistanceSolution() = default;
+  DistanceSolution() = default;
+  DistanceSolution(const DistanceSolution&) = default;
+  DistanceSolution(DistanceSolution&&) = default;
+  DistanceSolution& operator=(const DistanceSolution&) = default;
+  DistanceSolution& operator=(DistanceSolution&&) = default;
+  ~DistanceSolution() = default;
+
+   /**Constructor*/
+  DistanceSolution(int num,
+                   double current = 0.,
+                   bool signedDist = false,
+                   double first = 0.,
+                   double second = 0.);
 
   // methods to access solutions
   /** Number of intersection solutions*/
@@ -42,7 +45,8 @@ public:
   /** Distance to first intersection solution along direction*/
   double first() const;
 
-  /** Distance to second intersection solution along direction (for a cylinder surface)*/
+  /** Distance to second intersection solution along direction (for a cylinder
+   * surface)*/
   double second() const;
 
   /** Absolute Distance to closest solution */
@@ -51,14 +55,15 @@ public:
   /** Distance to point of closest approach along direction*/
   double toPointOfClosestApproach() const;
 
-  /** Current distance to surface (spatial), signed (along/opposite to surface normal) if input argument true (absolute
-   * value by default)*/
+  /** Current distance to surface (spatial), signed (along/opposite to surface
+   * normal) if input argument true (absolute value by default)*/
   double currentDistance(bool signedDist = false) const;
 
-  /** This method indicates availability of signed current distance (false for Perigee and StraighLineSurface) */
+  /** This method indicates availability of signed current distance (false for
+   * Perigee and StraighLineSurface) */
   bool signedDistance() const;
 
-protected:
+private:
   int m_num;
   double m_first;
   double m_second;
@@ -66,54 +71,7 @@ protected:
   bool m_signedDist;
 };
 
-inline int
-DistanceSolution::numberOfSolutions() const
-{
-  return m_num;
-}
-
-inline double
-DistanceSolution::first() const
-{
-  return m_first;
-}
-
-inline double
-DistanceSolution::second() const
-{
-  return m_second;
-}
-
-inline double
-DistanceSolution::absClosest() const
-{
-  if (m_num > 1)
-    return (m_first * m_first < m_second * m_second) ? fabs(m_first) : fabs(m_second);
-  else
-    return fabs(m_first);
-}
-
-inline double
-DistanceSolution::toPointOfClosestApproach() const
-{
-  return m_first;
-}
-
-inline double
-DistanceSolution::currentDistance(bool signedDist) const
-{
-  if (signedDist)
-    return m_current;
-  else
-    return fabs(m_current);
-}
-
-inline bool
-DistanceSolution::signedDistance() const
-{
-  return m_signedDist;
-}
-
 } // end of namespace
 
+#include "TrkSurfaces/DistanceSolution.icc"
 #endif // TRKSURFACES_DISTANCESOLUTION_H
diff --git a/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.icc b/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.icc
new file mode 100644
index 000000000000..15ef7e32d23a
--- /dev/null
+++ b/Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/DistanceSolution.icc
@@ -0,0 +1,69 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+namespace Trk {
+inline DistanceSolution::DistanceSolution(int num,
+                                          double current,
+                                          bool signedDist,
+                                          double first,
+                                          double second)
+  : m_num(num)
+  , m_first(first)
+  , m_second(second)
+  , m_current(current)
+  , m_signedDist(signedDist)
+{}
+
+inline int
+DistanceSolution::numberOfSolutions() const
+{
+  return m_num;
+}
+
+inline double
+DistanceSolution::first() const
+{
+  return m_first;
+}
+
+inline double
+DistanceSolution::second() const
+{
+  return m_second;
+}
+
+inline double
+DistanceSolution::absClosest() const
+{
+  if (m_num > 1) {
+    return (m_first * m_first < m_second * m_second) ? std::abs(m_first)
+                                                     : std::abs(m_second);
+  } else {
+    return std::abs(m_first);
+  }
+}
+
+inline double
+DistanceSolution::toPointOfClosestApproach() const
+{
+  return m_first;
+}
+
+inline double
+DistanceSolution::currentDistance(bool signedDist) const
+{
+  if (signedDist) {
+    return m_current;
+  } else {
+    return std::abs(m_current);
+  }
+}
+
+inline bool
+DistanceSolution::signedDistance() const
+{
+  return m_signedDist;
+}
+
+} // end of namespace
+
diff --git a/Tracking/TrkDetDescr/TrkSurfaces/src/DistanceSolution.cxx b/Tracking/TrkDetDescr/TrkSurfaces/src/DistanceSolution.cxx
deleted file mode 100644
index a7d7a4cdf548..000000000000
--- a/Tracking/TrkDetDescr/TrkSurfaces/src/DistanceSolution.cxx
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
-*/
-
-///////////////////////////////////////////////////////////////////
-// DistanceSolution.cxx, (c) ATLAS Detector Software
-///////////////////////////////////////////////////////////////////
-
-// Trk
-#include "TrkSurfaces/DistanceSolution.h"
-
-// default constructor
-Trk::DistanceSolution::DistanceSolution()
-  : m_num()
-  , m_first()
-  , m_second()
-  , m_current()
-  , m_signedDist()
-{}
-
-// constructor
-Trk::DistanceSolution::DistanceSolution(int num, double current, bool signedDist, double first, double second)
-  : m_num(num)
-  , m_first(first)
-  , m_second(second)
-  , m_current(current)
-  , m_signedDist(signedDist)
-{}
-- 
GitLab


From ce96956917b86df0548848191807c5ecebbcc269 Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Tue, 8 Dec 2020 15:36:10 -0500
Subject: [PATCH 170/225] MuonEfficiencyCorrections: Fix gcc11 warning.

Check result of dynamic_cast before dereferencing.
---
 .../MuonEfficiencyCorrections/Root/MuonSFTestHelper.cxx    | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/PhysicsAnalysis/MuonID/MuonIDAnalysis/MuonEfficiencyCorrections/Root/MuonSFTestHelper.cxx b/PhysicsAnalysis/MuonID/MuonIDAnalysis/MuonEfficiencyCorrections/Root/MuonSFTestHelper.cxx
index f79401d6fe90..34fb5811805a 100644
--- a/PhysicsAnalysis/MuonID/MuonIDAnalysis/MuonEfficiencyCorrections/Root/MuonSFTestHelper.cxx
+++ b/PhysicsAnalysis/MuonID/MuonIDAnalysis/MuonEfficiencyCorrections/Root/MuonSFTestHelper.cxx
@@ -86,9 +86,12 @@ namespace TestMuonSF {
     MuonSFBranches::MuonSFBranches(TTree* tree, const ToolHandle<CP::IMuonEfficiencyScaleFactors> &handle, const std::string& rel_name) :
                 MuonEffiBranches(tree),
                 m_handle(handle),
-                m_uncorrelate_sys(dynamic_cast<const CP::MuonEfficiencyScaleFactors*>(handle.operator->())->uncorrelate_sys()),
                 m_release(rel_name),
-                m_SFs() {
+                m_SFs()
+    {
+      auto mesf = dynamic_cast<const CP::MuonEfficiencyScaleFactors*>(handle.operator->());
+      if (!mesf) std::abort();
+      m_uncorrelate_sys = mesf->uncorrelate_sys();
     }
     CP::CorrectionCode MuonSFBranches::fill(const xAOD::Muon& muon) {
         /// Only the raw systematic sets have been activated
-- 
GitLab


From a4a712fe99e5d20832311db10ddea861c3ed6dfe Mon Sep 17 00:00:00 2001
From: leggett <leggett@cern.ch>
Date: Wed, 16 Dec 2020 08:36:06 -0800
Subject: [PATCH 171/225] update Gaudi version to v35r0.002

---
 Projects/AthAnalysis/build_externals.sh   | 2 +-
 Projects/AthGeneration/build_externals.sh | 2 +-
 Projects/AthSimulation/build_externals.sh | 2 +-
 Projects/Athena/build_externals.sh        | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/Projects/AthAnalysis/build_externals.sh b/Projects/AthAnalysis/build_externals.sh
index a204d1b32c07..7fe421a38b15 100755
--- a/Projects/AthAnalysis/build_externals.sh
+++ b/Projects/AthAnalysis/build_externals.sh
@@ -25,7 +25,7 @@ BUILDTYPE="RelWithDebInfo"
 FORCE=""
 CI=""
 EXTRACMAKE=(-DLCG_VERSION_NUMBER=98 -DLCG_VERSION_POSTFIX="python3_ATLAS_2"
-            -DATLAS_GAUDI_TAG="v35r0.001")
+            -DATLAS_GAUDI_TAG="v35r0.002")
 while getopts ":t:b:x:fch" opt; do
     case $opt in
         t)
diff --git a/Projects/AthGeneration/build_externals.sh b/Projects/AthGeneration/build_externals.sh
index 926cc7c91aaf..b7857649238b 100755
--- a/Projects/AthGeneration/build_externals.sh
+++ b/Projects/AthGeneration/build_externals.sh
@@ -25,7 +25,7 @@ BUILDTYPE="RelWithDebInfo"
 FORCE=""
 CI=""
 EXTRACMAKE=(-DLCG_VERSION_NUMBER=98 -DLCG_VERSION_POSTFIX="python3_ATLAS_3"
-            -DATLAS_GAUDI_TAG="v35r0.001")
+            -DATLAS_GAUDI_TAG="v35r0.002")
 while getopts ":t:b:x:fch" opt; do
     case $opt in
         t)
diff --git a/Projects/AthSimulation/build_externals.sh b/Projects/AthSimulation/build_externals.sh
index 507d9e19dd0a..ed6424280e47 100755
--- a/Projects/AthSimulation/build_externals.sh
+++ b/Projects/AthSimulation/build_externals.sh
@@ -25,7 +25,7 @@ BUILDTYPE="RelWithDebInfo"
 FORCE=""
 CI=""
 EXTRACMAKE=(-DLCG_VERSION_NUMBER=98 -DLCG_VERSION_POSTFIX="python3_ATLAS_3"
-            -DATLAS_GAUDI_TAG="v35r0.001")
+            -DATLAS_GAUDI_TAG="v35r0.002")
 while getopts ":t:b:x:fch" opt; do
     case $opt in
         t)
diff --git a/Projects/Athena/build_externals.sh b/Projects/Athena/build_externals.sh
index 8766b836971c..568ea8a80524 100755
--- a/Projects/Athena/build_externals.sh
+++ b/Projects/Athena/build_externals.sh
@@ -25,7 +25,7 @@ BUILDTYPE="RelWithDebInfo"
 FORCE=""
 CI=""
 EXTRACMAKE=(-DLCG_VERSION_NUMBER=98 -DLCG_VERSION_POSTFIX="python3_ATLAS_3"
-            -DATLAS_GAUDI_TAG="v35r0.001")
+            -DATLAS_GAUDI_TAG="v35r0.002")
 while getopts ":t:b:x:fch" opt; do
     case $opt in
         t)
-- 
GitLab


From ad324bf501f045d16aee52355bde8239639d4b65 Mon Sep 17 00:00:00 2001
From: sutt <sutt@cern.ch>
Date: Fri, 18 Dec 2020 22:20:26 +0100
Subject: [PATCH 172/225] Fix the analyses for the EF bjet tests

Basic cut and paste schoolboy error copying the bjet tests from
muon tests, and then forgetting to change the chains.

This fixes it
---
 .../TrigInDetValidation/test/test_trigID_all_ttbar_pu40.py      | 2 +-
 .../TrigInDetValidation/test/test_trigID_all_ttbar_pu80.py      | 2 +-
 .../test/test_trigID_all_ttbar_pu80_short.py                    | 2 +-
 .../TrigInDetValidation/test/test_trigID_all_ttbar_pu80_st.py   | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40.py
index 54421eb0d9fc..eb28cde6636c 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40.py
@@ -45,7 +45,7 @@ Comp = [ ( "L2muon",       "L2muon",      "data-hists-offline.root",      " -c T
          ( "EFmuon",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-muon " ),
          ( "EFelectron",   "EFelectron",  "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-electron " ),
          ( "EFtau",        "EFtau",       "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-tau " ),
-         ( "EFbjet",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-bjet " ) ]
+         ( "EFbjet",       "EFbjet",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-bjet " ) ]
    
 from AthenaCommon.Include import include 
 include("TrigInDetValidation/TrigInDetValidation_Base.py")
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80.py
index 8a755103d53d..535cb0fea32e 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80.py
@@ -45,7 +45,7 @@ Comp = [ ( "L2muon",       "L2muon",      "data-hists-offline.root",      " -c T
          ( "EFmuon",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-muon " ),
          ( "EFelectron",   "EFelectron",  "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-electron " ),
          ( "EFtau",        "EFtau",       "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-tau " ),
-         ( "EFbjet",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-bjet " ) ]
+         ( "EFbjet",       "EFbjet",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-bjet " ) ]
    
 from AthenaCommon.Include import include 
 include("TrigInDetValidation/TrigInDetValidation_Base.py")
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_short.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_short.py
index b1f1181b7bd4..cb3f5d352056 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_short.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_short.py
@@ -45,7 +45,7 @@ Comp = [ ( "L2muon",       "L2muon",      "data-hists-offline.root",      " -c T
          ( "EFmuon",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-muon " ),
          ( "EFelectron",   "EFelectron",  "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-electron " ),
          ( "EFtau",        "EFtau",       "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-tau " ),
-         ( "EFbjet",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-bjet " ) ]
+         ( "EFbjet",       "EFbjet",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-bjet " ) ]
    
 from AthenaCommon.Include import include 
 include("TrigInDetValidation/TrigInDetValidation_Base.py")
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_st.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_st.py
index ad18d67f9c52..78e80ff19b35 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_st.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu80_st.py
@@ -45,7 +45,7 @@ Comp = [ ( "L2muon",       "L2muon",      "data-hists-offline.root",      " -c T
          ( "EFmuon",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-muon " ),
          ( "EFelectron",   "EFelectron",  "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-electron " ),
          ( "EFtau",        "EFtau",       "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-tau " ),
-         ( "EFbjet",       "EFmuon",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-bjet " ) ]
+         ( "EFbjet",       "EFbjet",      "data-hists-offline.root",   " -c TIDAhisto-panel.dat  -d HLTEF-plots-bjet " ) ]
    
 from AthenaCommon.Include import include 
 include("TrigInDetValidation/TrigInDetValidation_Base.py")
-- 
GitLab


From 74d8b629aeb82d5df92dba50ffd4b3ddd0245b3d Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Tue, 8 Dec 2020 15:22:42 -0500
Subject: [PATCH 173/225] CalibrationDataInterface: Fix gcc11 warning.

Null pointer dereference.
---
 .../CalibrationDataInterface/Root/CalibrationDataContainer.cxx   | 1 +
 1 file changed, 1 insertion(+)

diff --git a/PhysicsAnalysis/JetTagging/JetTagPerformanceCalibration/CalibrationDataInterface/Root/CalibrationDataContainer.cxx b/PhysicsAnalysis/JetTagging/JetTagPerformanceCalibration/CalibrationDataInterface/Root/CalibrationDataContainer.cxx
index a4282a8e0e9b..b5b064be8c4a 100644
--- a/PhysicsAnalysis/JetTagging/JetTagPerformanceCalibration/CalibrationDataInterface/Root/CalibrationDataContainer.cxx
+++ b/PhysicsAnalysis/JetTagging/JetTagPerformanceCalibration/CalibrationDataInterface/Root/CalibrationDataContainer.cxx
@@ -880,6 +880,7 @@ CalibrationDataHistogramContainer::getInterpolatedUncertainty(TH1* hist) const
 
     // Copied from TH3::Interpolate()
 
+    yAxis = hist->GetYaxis();
     zAxis = hist->GetZaxis();
 
     Int_t ubx = xAxis->FindBin(m_vars[0]);
-- 
GitLab


From 69c2e28aeefb40d29c4cb5cb1b93f04edb81708f Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Mon, 7 Dec 2020 23:27:20 -0500
Subject: [PATCH 174/225] TrigMonitorBase: Fix compilation with gcc11.

Can't use full template-id as a ctor name with c++20.
---
 .../TrigMonitorBase/src/TrigGenericMonitoringTool.h       | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/Trigger/TrigMonitoring/TrigMonitorBase/src/TrigGenericMonitoringTool.h b/Trigger/TrigMonitoring/TrigMonitorBase/src/TrigGenericMonitoringTool.h
index 6a905fc31aca..c004d0f4f4e9 100755
--- a/Trigger/TrigMonitoring/TrigMonitorBase/src/TrigGenericMonitoringTool.h
+++ b/Trigger/TrigMonitoring/TrigMonitorBase/src/TrigGenericMonitoringTool.h
@@ -1,7 +1,7 @@
 // -*- c++ -*-
 
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGMONITORBASE_TRIGGENERICMONITORINGTOOL_H
@@ -120,9 +120,9 @@ template<class M, class P>     // Mutex and Proxy type
 class TrigGenericMonitoringTool : public TrigMonitorToolBase {
 public:
   
-  TrigGenericMonitoringTool<M,P>(const std::string & type, 
-                                 const std::string & name,
-                                 const IInterface* parent);
+  TrigGenericMonitoringTool(const std::string & type, 
+                            const std::string & name,
+                            const IInterface* parent);
   virtual ~TrigGenericMonitoringTool();
   
   virtual StatusCode bookHists();
-- 
GitLab


From 759fbbebeddc4d5877138cece5ca07d9b3a19eeb Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Tue, 8 Dec 2020 11:27:43 -0500
Subject: [PATCH 175/225] TrigT2CaloEgamma: Fix gcc11 warning.

Misleading indentation.
---
 Trigger/TrigAlgorithms/TrigT2CaloEgamma/src/RingerReFex.cxx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Trigger/TrigAlgorithms/TrigT2CaloEgamma/src/RingerReFex.cxx b/Trigger/TrigAlgorithms/TrigT2CaloEgamma/src/RingerReFex.cxx
index 5fa15c079144..f74fb7eac36e 100644
--- a/Trigger/TrigAlgorithms/TrigT2CaloEgamma/src/RingerReFex.cxx
+++ b/Trigger/TrigAlgorithms/TrigT2CaloEgamma/src/RingerReFex.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 /*******************************************************
@@ -432,7 +432,7 @@ const {
     ATH_MSG_DEBUG("RingSet number is: " << rs);  
     for(unsigned i=0;i<rset.at(rs).samples().size();i++)
       ATH_MSG_DEBUG("   Calo layer ID is : "<< rset.at(rs).samples()[i] );
-      ATH_MSG_DEBUG("search eta window: " << m_etaSearchWindowSize << " search phi window: " << m_phiSearchWindowSize);
+    ATH_MSG_DEBUG("search eta window: " << m_etaSearchWindowSize << " search phi window: " << m_phiSearchWindowSize);
     ATH_MSG_DEBUG("deta: " << m_detaRings[rs] << " dphi: " << m_dphiRings[rs]);
     ATH_MSG_DEBUG("Pattern has size equal than: " << rset.at(rs).pattern().size());
     for(unsigned i=0;i<rset.at(rs).pattern().size();++i)
-- 
GitLab


From 3297c9480456af1ceaf8478930e80e20d9b5167a Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Tue, 8 Dec 2020 14:56:29 -0500
Subject: [PATCH 176/225] TrigTauEmulation: Fix gcc11 warning.

Misleading indentation.
---
 .../TrigTauAnalysis/TrigTauEmulation/Root/Parser.cxx          | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Trigger/TrigAnalysis/TrigTauAnalysis/TrigTauEmulation/Root/Parser.cxx b/Trigger/TrigAnalysis/TrigTauAnalysis/TrigTauEmulation/Root/Parser.cxx
index e0e1fc74dbbc..cda4d7cd6bef 100644
--- a/Trigger/TrigAnalysis/TrigTauAnalysis/TrigTauEmulation/Root/Parser.cxx
+++ b/Trigger/TrigAnalysis/TrigTauAnalysis/TrigTauEmulation/Root/Parser.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 // vim: ts=2 sw=2
@@ -158,7 +158,7 @@ int Parser::get_pass_number(const std::string & item_name)
     return m_nonTOPO_items[item_name];
   else
     MY_MSG_WARNING(item_name << " is not in the map of items"); 
-    return -1;
+  return -1;
 }
 
 
-- 
GitLab


From 53292866909c68da95dd449365b8cd66fa68bb45 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Fri, 18 Dec 2020 05:05:15 +0100
Subject: [PATCH 177/225] TrkExTools: Fix memory leak.

In extrapolateStepwiseImpl, we need to delete the parameters
in cache.m_parametersOnDetElements if we don't return them.
---
 Tracking/TrkExtrapolation/TrkExTools/src/Extrapolator.cxx | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/Tracking/TrkExtrapolation/TrkExTools/src/Extrapolator.cxx b/Tracking/TrkExtrapolation/TrkExTools/src/Extrapolator.cxx
index 27073c6f4311..51abc695c50f 100755
--- a/Tracking/TrkExtrapolation/TrkExTools/src/Extrapolator.cxx
+++ b/Tracking/TrkExtrapolation/TrkExTools/src/Extrapolator.cxx
@@ -531,6 +531,9 @@ Trk::Extrapolator::extrapolateStepwiseImpl(const EventContext& ctx,
       msg << "Will not cleanup " << static_cast<const void*>(cache.m_parametersOnDetElements);
       throw std::logic_error(msg.str());
     }
+    for (const Trk::TrackParameters* p : tmp) {
+      delete p;
+    }
     tmp.clear();
   }
   return Trk::TrackParametersUVector(tmp.begin(), tmp.end());
-- 
GitLab


From db36f13d3abc58802173b20f36873a923aae8b39 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Mon, 14 Dec 2020 15:34:13 +0100
Subject: [PATCH 178/225] InDetTrackSelectorTool: Fix clang warings.

Missing override keywords.
---
 .../InDetTrackSelectorTool/InDetCosmicTrackSelectorTool.h   | 6 +++---
 .../InDetTrackSelectorTool/InDetIsoTrackSelectorTool.h      | 6 +++---
 .../InDetTrackSelectorTool/InDetTrackSelectorTool.h         | 6 +++---
 .../InDetTrackSelectorTool/InDetTrtDriftCircleCutTool.h     | 4 ++--
 4 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/InnerDetector/InDetRecTools/InDetTrackSelectorTool/InDetTrackSelectorTool/InDetCosmicTrackSelectorTool.h b/InnerDetector/InDetRecTools/InDetTrackSelectorTool/InDetTrackSelectorTool/InDetCosmicTrackSelectorTool.h
index 007d78cf7437..c9f682775b31 100644
--- a/InnerDetector/InDetRecTools/InDetTrackSelectorTool/InDetTrackSelectorTool/InDetCosmicTrackSelectorTool.h
+++ b/InnerDetector/InDetRecTools/InDetTrackSelectorTool/InDetTrackSelectorTool/InDetCosmicTrackSelectorTool.h
@@ -38,11 +38,11 @@ namespace InDet
 
     ~InDetCosmicTrackSelectorTool();
 
-    bool decision(const Trk::Track& track,const Trk::Vertex* vertex) const;
+    virtual bool decision(const Trk::Track& track,const Trk::Vertex* vertex) const override;
 
-    bool decision(const Trk::TrackParticleBase& track,const Trk::Vertex* vertex) const;
+    virtual bool decision(const Trk::TrackParticleBase& track,const Trk::Vertex* vertex) const override;
 
-    bool decision(const xAOD::TrackParticle&,const xAOD::Vertex*) const {
+    virtual bool decision(const xAOD::TrackParticle&,const xAOD::Vertex*) const  override {
       ATH_MSG_WARNING("xAOD::TrackParticle selection not implemented yet");
       return false;
     }
diff --git a/InnerDetector/InDetRecTools/InDetTrackSelectorTool/InDetTrackSelectorTool/InDetIsoTrackSelectorTool.h b/InnerDetector/InDetRecTools/InDetTrackSelectorTool/InDetTrackSelectorTool/InDetIsoTrackSelectorTool.h
index b121018457f5..0a32e5de9211 100644
--- a/InnerDetector/InDetRecTools/InDetTrackSelectorTool/InDetTrackSelectorTool/InDetIsoTrackSelectorTool.h
+++ b/InnerDetector/InDetRecTools/InDetTrackSelectorTool/InDetTrackSelectorTool/InDetIsoTrackSelectorTool.h
@@ -42,13 +42,13 @@ namespace InDet
       ~InDetIsoTrackSelectorTool();
 
       /** ESD type interface */
-      bool decision(const Trk::AtaStraightLine&, const Trk::Track& track) const;
+      virtual bool decision(const Trk::AtaStraightLine&, const Trk::Track& track) const override;
       
       /** AOD type interface */
-      bool decision(const Trk::AtaStraightLine&, const Trk::TrackParticleBase& trackParticle) const;
+      virtual bool decision(const Trk::AtaStraightLine&, const Trk::TrackParticleBase& trackParticle) const override;
       
       /** Work-horse interface - will ignore TrackSelector */
-      bool decision(const Trk::AtaStraightLine&, const Trk::TrackParameters& trackPars) const;
+      virtual bool decision(const Trk::AtaStraightLine&, const Trk::TrackParameters& trackPars) const override;
 
     private:
       /** Robust cut window setting */
diff --git a/InnerDetector/InDetRecTools/InDetTrackSelectorTool/InDetTrackSelectorTool/InDetTrackSelectorTool.h b/InnerDetector/InDetRecTools/InDetTrackSelectorTool/InDetTrackSelectorTool/InDetTrackSelectorTool.h
index 386090734df0..c3633ad3c5a8 100644
--- a/InnerDetector/InDetRecTools/InDetTrackSelectorTool/InDetTrackSelectorTool/InDetTrackSelectorTool.h
+++ b/InnerDetector/InDetRecTools/InDetTrackSelectorTool/InDetTrackSelectorTool/InDetTrackSelectorTool.h
@@ -50,11 +50,11 @@ namespace InDet
 
       ~InDetTrackSelectorTool();
 
-      bool decision(const Trk::Track& track,const Trk::Vertex* vertex) const;
+      virtual bool decision(const Trk::Track& track,const Trk::Vertex* vertex) const override;
 
-      bool decision(const Trk::TrackParticleBase& track,const Trk::Vertex* vertex) const;
+      virtual bool decision(const Trk::TrackParticleBase& track,const Trk::Vertex* vertex) const override;
 
-      bool decision(const xAOD::TrackParticle&,const xAOD::Vertex*) const {
+      virtual bool decision(const xAOD::TrackParticle&,const xAOD::Vertex*) const override {
 	ATH_MSG_WARNING("xAOD::TrackParticle selection not implemented yet");
 	return false;
       }
diff --git a/InnerDetector/InDetRecTools/InDetTrackSelectorTool/InDetTrackSelectorTool/InDetTrtDriftCircleCutTool.h b/InnerDetector/InDetRecTools/InDetTrackSelectorTool/InDetTrackSelectorTool/InDetTrtDriftCircleCutTool.h
index e399c8e5fc54..406b0f29cdcc 100644
--- a/InnerDetector/InDetRecTools/InDetTrackSelectorTool/InDetTrackSelectorTool/InDetTrtDriftCircleCutTool.h
+++ b/InnerDetector/InDetRecTools/InDetTrackSelectorTool/InDetTrackSelectorTool/InDetTrtDriftCircleCutTool.h
@@ -30,10 +30,10 @@ namespace InDet{
       
       InDetTrtDriftCircleCutTool(const std::string& t, const std::string& n, const IInterface*  p);
       
-      ~InDetTrtDriftCircleCutTool();
+      virtual ~InDetTrtDriftCircleCutTool();
       
       /** @brief Minimum number of drift circles using the track scoring tool */
-      int minNumberDCs(const Trk::TrackParameters*) const;
+      virtual int minNumberDCs(const Trk::TrackParameters*) const override;
       
     private:
       
-- 
GitLab


From aa8cda3588def2d86301356b5ceb83a922637055 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Mon, 14 Dec 2020 15:32:56 +0100
Subject: [PATCH 179/225] InDetSecVxFinderTool: Fix clang warnings.

Missing override keywords.
---
 .../InDetSecVxFinderTool/InDetImprovedJetFitterVxFinder.h      | 2 +-
 .../InDetSecVxFinderTool/InDetJetFitterVxFinder.h              | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/InnerDetector/InDetRecTools/InDetSecVxFinderTool/InDetSecVxFinderTool/InDetImprovedJetFitterVxFinder.h b/InnerDetector/InDetRecTools/InDetSecVxFinderTool/InDetSecVxFinderTool/InDetImprovedJetFitterVxFinder.h
index ed687a57f512..6025446d5865 100755
--- a/InnerDetector/InDetRecTools/InDetSecVxFinderTool/InDetSecVxFinderTool/InDetImprovedJetFitterVxFinder.h
+++ b/InnerDetector/InDetRecTools/InDetSecVxFinderTool/InDetSecVxFinderTool/InDetImprovedJetFitterVxFinder.h
@@ -74,7 +74,7 @@ namespace InDet {
 
     virtual Trk::VxSecVertexInfo* findSecVertex(const xAOD::Vertex & primaryVertex,
 						const TLorentzVector & jetMomentum,
-						const std::vector<const xAOD::IParticle*> & inputTracks) const;
+						const std::vector<const xAOD::IParticle*> & inputTracks) const override;
 
   private:
 
diff --git a/InnerDetector/InDetRecTools/InDetSecVxFinderTool/InDetSecVxFinderTool/InDetJetFitterVxFinder.h b/InnerDetector/InDetRecTools/InDetSecVxFinderTool/InDetSecVxFinderTool/InDetJetFitterVxFinder.h
index 13cd285d3563..747166aa128c 100755
--- a/InnerDetector/InDetRecTools/InDetSecVxFinderTool/InDetSecVxFinderTool/InDetJetFitterVxFinder.h
+++ b/InnerDetector/InDetRecTools/InDetSecVxFinderTool/InDetSecVxFinderTool/InDetJetFitterVxFinder.h
@@ -62,9 +62,10 @@ namespace InDet {
 
     ~InDetJetFitterVxFinder();
 
+    virtual
     Trk::VxSecVertexInfo* findSecVertex(const xAOD::Vertex & /*primaryVertex*/,
 					const TLorentzVector & /*jetMomentum*/,
-					const std::vector<const xAOD::IParticle*> & /*inputTracks*/ ) const
+					const std::vector<const xAOD::IParticle*> & /*inputTracks*/ ) const override
     {
       /* not implemented */
       return 0;
-- 
GitLab


From 8bad7ccae73edca2e09946ab2d118c56fc04d388 Mon Sep 17 00:00:00 2001
From: Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
Date: Fri, 18 Dec 2020 17:32:51 +0100
Subject: [PATCH 180/225] Left it up to the CMake code to decide when the unit
 test should use bramspot information.

All clients will need to set this flag of EventInfoCnvAlgCfg(...) correctly
from now on, otherwise they'll get an import error if they used an incorrect
setting in one of the lightweight offline releases.
---
 Event/xAOD/xAODEventInfoCnv/CMakeLists.txt             |  8 ++++++--
 .../xAODEventInfoCnv/python/xAODEventInfoCnvConfig.py  | 10 ++--------
 Event/xAOD/xAODEventInfoCnv/test/EventInfoCnv_test.py  |  5 +++--
 3 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/Event/xAOD/xAODEventInfoCnv/CMakeLists.txt b/Event/xAOD/xAODEventInfoCnv/CMakeLists.txt
index 5a2c859b9011..04e7b723247c 100644
--- a/Event/xAOD/xAODEventInfoCnv/CMakeLists.txt
+++ b/Event/xAOD/xAODEventInfoCnv/CMakeLists.txt
@@ -22,12 +22,16 @@ atlas_install_python_modules( python/*.py
 atlas_install_joboptions( share/*.py )
 
 # Setup and run tests
+set( _extraFlags )
+if( SIMULATIONBASE OR GENERATIONBASE OR XAOD_ANALYSIS )
+   set( _extraFlags --noBeamSpot )
+endif()
 atlas_add_test( EvenInfoCnvConfigTest
-                SCRIPT test/EventInfoCnv_test.py
+                SCRIPT test/EventInfoCnv_test.py ${_extraFlags}
                 PROPERTIES TIMEOUT 300 )
 
 atlas_add_test( EvenInfoCnvConfigTestMT
-                SCRIPT test/EventInfoCnv_test.py -n 25 -t 3
+                SCRIPT test/EventInfoCnv_test.py -n 25 -t 3 ${_extraFlags}
                 PROPERTIES TIMEOUT 300 )
 
 if( NOT SIMULATIONBASE AND NOT GENERATIONBASE AND NOT XAOD_ANALYSIS )
diff --git a/Event/xAOD/xAODEventInfoCnv/python/xAODEventInfoCnvConfig.py b/Event/xAOD/xAODEventInfoCnv/python/xAODEventInfoCnvConfig.py
index ff1996d04d63..63a47365a81d 100644
--- a/Event/xAOD/xAODEventInfoCnv/python/xAODEventInfoCnvConfig.py
+++ b/Event/xAOD/xAODEventInfoCnv/python/xAODEventInfoCnvConfig.py
@@ -3,7 +3,6 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
-from AthenaCommon.Logging import logging
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
 
@@ -23,13 +22,8 @@ def EventInfoCnvAlgCfg(flags, name="EventInfoCnvAlg",
     # TODO: luminosity
 
     if not disableBeamSpot:
-        try:
-            from BeamSpotConditions.BeamSpotConditionsConfig import BeamSpotCondAlgCfg
-            acc.merge(BeamSpotCondAlgCfg(flags))
-        except ImportError:
-            log = logging.getLogger( 'EventInfoCnvAlgCfg' )
-            log.info( 'BeamSpotConditions not available, not using it' )
-            pass
+        from BeamSpotConditions.BeamSpotConditionsConfig import BeamSpotCondAlgCfg
+        acc.merge(BeamSpotCondAlgCfg(flags))
 
     xAODMaker__EventInfoCnvAlg = CompFactory.xAODMaker.EventInfoCnvAlg
     alg = xAODMaker__EventInfoCnvAlg(name, **kwargs)
diff --git a/Event/xAOD/xAODEventInfoCnv/test/EventInfoCnv_test.py b/Event/xAOD/xAODEventInfoCnv/test/EventInfoCnv_test.py
index f73ec006e4a5..6902395cab1b 100755
--- a/Event/xAOD/xAODEventInfoCnv/test/EventInfoCnv_test.py
+++ b/Event/xAOD/xAODEventInfoCnv/test/EventInfoCnv_test.py
@@ -24,6 +24,7 @@ from argparse import ArgumentParser
 parser = ArgumentParser()
 parser.add_argument("-n", "--maxEvents",  default=3, type=int, help="The number of events to run. 0 skips execution")
 parser.add_argument("-t", "--threads", default=1, type=int, help="The number of concurrent threads to run. 0 uses serial Athena.")
+parser.add_argument("-b", "--noBeamSpot", default=False, action="store_true", help="Don't try to use beamspot information in the conversion test")
 parser.add_argument("-V", "--verboseAccumulators", default=False, action="store_true", help="Print full details of the AlgSequence for each accumulator")
 args = parser.parse_args()
 
@@ -43,7 +44,7 @@ if args.threads > 0:
 ConfigFlags.lock()
 
 # Function tests
-accAlg = EventInfoCnvAlgCfg(ConfigFlags)
+accAlg = EventInfoCnvAlgCfg(ConfigFlags, disableBeamSpot=args.noBeamSpot)
 # reset to prevent errors on deletion
 accAlg.__init__()
 
@@ -52,7 +53,7 @@ acc = MainServicesCfg(ConfigFlags)
 acc.merge(PoolReadCfg(ConfigFlags))
 
 # Add event info overlay
-acc.merge(EventInfoCnvAlgCfg(ConfigFlags))
+acc.merge(EventInfoCnvAlgCfg(ConfigFlags, disableBeamSpot=args.noBeamSpot))
 
 # Add output
 acc.merge(OutputStreamCfg(ConfigFlags, "HITS"))
-- 
GitLab


From 058ae3f4ae73c4ee5194ea576655b587e9215d61 Mon Sep 17 00:00:00 2001
From: Rachid Mazini <rachid.mazini@cern.ch>
Date: Fri, 18 Dec 2020 13:16:23 +0000
Subject: [PATCH 181/225] Merge branch
 '21.0-addTFCSEnergyInterpolationHistogram' into '21.0'

21.0 add tfcs energy interpolation histogram

See merge request atlas/athena!39061

(cherry picked from commit f96b90179034c79bd332df6e8e979ba9c641ca3b)

276d333d Add TFCSEnergyInterpolationHistogram
fe5f851a Merge remote-tracking branch 'upstream/21.0' into 21.0-addTFCSEnergyInterpolationHistogram
046dbe07 Incorporate changes analogous to commit 5abe7a1f
6b8dcea4 Merge remote-tracking branch 'upstream/21.0' into 21.0-addTFCSEnergyInterpolationHistogram
7ddd1df2 Merge remote-tracking branch 'upstream/21.0' into 21.0-addTFCSEnergyInterpolationHistogram
c5f1bb7b implementing comments
7fd57998 Merge remote-tracking branch 'upstream/21.0' into 21.0-addTFCSEnergyInterpolationHistogram
958d7091 undo implementation of one comment (root macro coding standard)
---
 .../ISF_FastCaloSimEvent/CMakeLists.txt       |   1 +
 .../ISF_FastCaloSimEvent/LinkDef.h            |   2 +
 .../TFCSEnergyInterpolationHistogram.h        |  48 ++++++
 .../src/TFCSEnergyInterpolationHistogram.cxx  | 147 ++++++++++++++++++
 4 files changed, 198 insertions(+)
 create mode 100644 Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCSEnergyInterpolationHistogram.h
 create mode 100644 Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSEnergyInterpolationHistogram.cxx

diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/CMakeLists.txt b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/CMakeLists.txt
index 814e20154195..45d8d29cb4d3 100644
--- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/CMakeLists.txt
+++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/CMakeLists.txt
@@ -41,6 +41,7 @@ atlas_add_root_dictionary( ISF_FastCaloSimEvent _dictSource
                            ISF_FastCaloSimEvent/TFCSParametrization.h 
                            ISF_FastCaloSimEvent/TFCSInvisibleParametrization.h
                            ISF_FastCaloSimEvent/TFCSInitWithEkin.h
+                           ISF_FastCaloSimEvent/TFCSEnergyInterpolationHistogram.h
                            ISF_FastCaloSimEvent/TFCSEnergyInterpolationLinear.h
                            ISF_FastCaloSimEvent/TFCSEnergyInterpolationPiecewiseLinear.h
                            ISF_FastCaloSimEvent/TFCSEnergyInterpolationSpline.h
diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/LinkDef.h b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/LinkDef.h
index 03c4fe28ed56..8567ec9c6b3c 100644
--- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/LinkDef.h
+++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/LinkDef.h
@@ -26,6 +26,7 @@
 #include "ISF_FastCaloSimEvent/TFCSParametrization.h"
 #include "ISF_FastCaloSimEvent/TFCSInvisibleParametrization.h"
 #include "ISF_FastCaloSimEvent/TFCSInitWithEkin.h"
+#include "ISF_FastCaloSimEvent/TFCSEnergyInterpolationHistogram.h"
 #include "ISF_FastCaloSimEvent/TFCSEnergyInterpolationLinear.h"
 #include "ISF_FastCaloSimEvent/TFCSEnergyInterpolationPiecewiseLinear.h"
 #include "ISF_FastCaloSimEvent/TFCSEnergyInterpolationSpline.h"
@@ -295,6 +296,7 @@
 #pragma link C++ class TFCSParametrization+;
 #pragma link C++ class TFCSInvisibleParametrization+;
 #pragma link C++ class TFCSInitWithEkin+;
+#pragma link C++ class TFCSEnergyInterpolationHistogram+;
 #pragma link C++ class TFCSEnergyInterpolationLinear+;
 #pragma link C++ class TFCSEnergyInterpolationPiecewiseLinear-;
 #pragma link C++ class TFCSEnergyInterpolationSpline+;
diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCSEnergyInterpolationHistogram.h b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCSEnergyInterpolationHistogram.h
new file mode 100644
index 000000000000..a730b92e9343
--- /dev/null
+++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCSEnergyInterpolationHistogram.h
@@ -0,0 +1,48 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef ISF_FASTCALOSIMEVENT_TFCSEnergyInterpolationHistogram_h
+#define ISF_FASTCALOSIMEVENT_TFCSEnergyInterpolationHistogram_h
+
+#include "ISF_FastCaloSimEvent/TFCSParametrization.h"
+#include "TH1F.h"
+
+class TFCSEnergyInterpolationHistogram:public TFCSParametrization {
+public:
+  TFCSEnergyInterpolationHistogram(const char* name=nullptr, const char* title=nullptr);
+
+  enum FCSEnergyInitializationStatusBits {
+     kOnlyScaleEnergy = BIT(15) ///< Set this bit in the TObject bit field the simulated energy should only be scaled by the spline
+  };
+
+  bool OnlyScaleEnergy() const {return TestBit(kOnlyScaleEnergy);};
+  void set_OnlyScaleEnergy() {SetBit(kOnlyScaleEnergy);};
+  void reset_OnlyScaleEnergy() {ResetBit(kOnlyScaleEnergy);};
+
+  virtual bool is_match_Ekin_bin(int /*Ekin_bin*/) const override {return true;};
+  virtual bool is_match_calosample(int /*calosample*/) const override {return true;};
+  
+  ///Initialize interpolation from histogram
+  ///x values should be Ekin, y values should <E(reco)/Ekin(true)>
+  void InitFromHist(const TH1F& hist) {m_hist=hist;};
+
+  const TH1F& hist() const {return m_hist;};
+
+  ///Initialize simulstate with the mean reconstructed energy in the calorimater expeted from the true kinetic energy
+  virtual FCSReturnCode simulate(TFCSSimulationState& simulstate,const TFCSTruthState* truth, const TFCSExtrapolationState* extrapol) const override;
+  void Print(Option_t *option="") const override;
+
+  static void unit_test(TFCSSimulationState* simulstate=nullptr,TFCSTruthState* truth=nullptr, const TFCSExtrapolationState* extrapol=nullptr,TH1F* hist=nullptr);
+private:
+  TH1F m_hist;
+
+  ClassDefOverride(TFCSEnergyInterpolationHistogram,1)  //TFCSEnergyInterpolationHistogram
+};
+
+#if defined(__ROOTCLING__) && defined(__FastCaloSimStandAlone__)
+#pragma link C++ class TFCSEnergyInterpolationHistogram+;
+#endif
+
+#endif
+
diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSEnergyInterpolationHistogram.cxx b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSEnergyInterpolationHistogram.cxx
new file mode 100644
index 000000000000..90937730936a
--- /dev/null
+++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSEnergyInterpolationHistogram.cxx
@@ -0,0 +1,147 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "ISF_FastCaloSimEvent/TFCSEnergyInterpolationHistogram.h"
+#include "ISF_FastCaloSimEvent/TFCSSimulationState.h"
+#include "ISF_FastCaloSimEvent/TFCSTruthState.h"
+#include "ISF_FastCaloSimEvent/TFCSExtrapolationState.h"
+#include "TFile.h"
+#include "TCanvas.h"
+#include "TGraph.h"
+#include "TAxis.h"
+#include <iostream>
+#include <vector>
+
+#ifdef __FastCaloSimStandAlone__
+namespace Gaudi {
+  namespace Units {
+    constexpr double megaelectronvolt = 1.;
+    constexpr double kiloelectronvolt = 1.e-3 * megaelectronvolt;
+    constexpr double keV = kiloelectronvolt;
+  }
+}
+#else
+#include "GaudiKernel/SystemOfUnits.h"
+#endif
+
+//=============================================
+//======= TFCSEnergyInterpolation =========
+//=============================================
+
+TFCSEnergyInterpolationHistogram::TFCSEnergyInterpolationHistogram(const char* name, const char* title):TFCSParametrization(name,title)
+{
+}
+
+FCSReturnCode TFCSEnergyInterpolationHistogram::simulate(TFCSSimulationState& simulstate,const TFCSTruthState* truth, const TFCSExtrapolationState*) const
+{
+  float Emean;
+  float Einit;
+  const float Ekin=truth->Ekin();
+  if(OnlyScaleEnergy()) Einit=simulstate.E();
+  else Einit=Ekin;
+  if(Einit<m_hist.GetXaxis()->GetBinLowEdge(1)) {
+    Emean=m_hist.GetBinContent(1)*Einit;
+  } else {
+    if(Einit>m_hist.GetXaxis()->GetBinUpEdge(m_hist.GetNbinsX())) {
+      Emean=m_hist.GetBinContent(m_hist.GetNbinsX())*Einit;
+    } else {
+      Emean=m_hist.GetBinContent(m_hist.GetXaxis()->FindBin(Einit))*Einit;
+    }  
+  }  
+
+  if(OnlyScaleEnergy()) {
+    ATH_MSG_DEBUG("set E="<<Emean<<" for true Ekin="<<truth->Ekin()<<" and E="<<Einit);
+  }
+  else{
+    ATH_MSG_DEBUG("set E="<<Emean<<" for true Ekin="<<truth->Ekin());
+  }
+  simulstate.set_E(Emean);
+
+  return FCSSuccess;
+}
+
+void TFCSEnergyInterpolationHistogram::Print(Option_t *option) const
+{
+  TString opt(option);
+  bool shortprint=opt.Index("short")>=0;
+  bool longprint=msgLvl(MSG::DEBUG) || (msgLvl(MSG::INFO) && !shortprint);
+  TString optprint=opt;
+  optprint.ReplaceAll("short","");
+  TFCSParametrization::Print(option);
+
+  if(longprint) ATH_MSG_INFO(optprint <<(OnlyScaleEnergy()?"  E()*":"  Ekin()*")<<"histNbins="<<m_hist.GetNbinsX()
+                           <<" "<<m_hist.GetXaxis()->GetBinLowEdge(1)<<"<=Ekin<="<<m_hist.GetXaxis()->GetBinUpEdge(m_hist.GetNbinsX()));
+}
+
+void TFCSEnergyInterpolationHistogram::unit_test(TFCSSimulationState* simulstate,TFCSTruthState* truth, const TFCSExtrapolationState* extrapol,TH1F* hist)
+{
+  if(!simulstate) simulstate=new TFCSSimulationState();
+  if(!truth) truth=new TFCSTruthState();
+  if(!extrapol) extrapol=new TFCSExtrapolationState();
+  
+  if(!hist) {
+    hist = new TH1F("h1", "h1 title", 16, 0., 512.);
+    hist->SetBinContent( 1,0.687165);
+    hist->SetBinContent( 2,0.756837);
+    hist->SetBinContent( 3,0.836673);
+    hist->SetBinContent( 4,0.896336);
+    hist->SetBinContent( 5,0.889785);
+    hist->SetBinContent( 6,0.901266);
+    hist->SetBinContent( 7,0.888937);
+    hist->SetBinContent( 8,0.919943);
+    hist->SetBinContent( 9,0.941806);
+    hist->SetBinContent(10,0.934668);
+    hist->SetBinContent(11,0.939502);
+    hist->SetBinContent(12,0.940796);
+    hist->SetBinContent(13,0.945894);
+    hist->SetBinContent(14,0.955445);
+    hist->SetBinContent(15,0.955593);
+    hist->SetBinContent(16,0.943673);
+  }  
+  
+  TH1F* hdraw=(TH1F*)hist->Clone();
+  hdraw->SetMarkerColor(46);
+  hdraw->SetMarkerStyle(8);
+  
+  TFCSEnergyInterpolationHistogram test("testTFCSEnergyInterpolationHistogram","test TFCSEnergyInterpolationHistogram");
+  test.set_pdgid(22);
+  test.set_Ekin_nominal(0.5*(hdraw->GetXaxis()->GetBinLowEdge(1)+hdraw->GetXaxis()->GetBinUpEdge(hdraw->GetNbinsX())));
+  test.set_Ekin_min(hdraw->GetXaxis()->GetBinLowEdge(1));
+  test.set_Ekin_max(hdraw->GetXaxis()->GetBinUpEdge(hdraw->GetNbinsX()));
+  test.set_eta_nominal(0.225);
+  test.set_eta_min(0.2);
+  test.set_eta_max(0.25);
+  test.InitFromHist(*hist);
+  //test.set_OnlyScaleEnergy();
+  test.Print();
+  test.hist().Dump();
+  
+  truth->set_pdgid(22);
+  
+  TGraph* gr=new TGraph();
+  gr->SetNameTitle("testTFCSEnergyInterpolationHistogramLogX","test TFCSEnergyInterpolationHistogram");
+  gr->GetXaxis()->SetTitle("Ekin [MeV]");
+  gr->GetYaxis()->SetTitle("<E(reco)>/Ekin(true)");
+  
+  int ip=0;
+  for(float Ekin=std::max(test.Ekin_min()*0.25,0.1);Ekin<=test.Ekin_max()*4;Ekin*=1.05) {
+    //Init LorentzVector for truth. For photon Ekin=E
+    truth->SetPxPyPzE(Ekin,0,0,Ekin);
+    simulstate->set_E(Ekin);
+    if (test.simulate(*simulstate,truth,extrapol) != FCSSuccess) {
+      return;
+    }
+    gr->SetPoint(ip,Ekin,simulstate->E()/Ekin);
+    ++ip;
+  }  
+
+  //Drawing doesn't make sense inside athena and necessary libraries not linked by default
+  #if defined(__FastCaloSimStandAlone__)
+  TCanvas* c=new TCanvas(hdraw->GetName(),hdraw->GetTitle());
+  hdraw->Draw("HIST");
+  gr->Draw("same,APL");
+  c->SetLogx();
+  #endif
+}
+
-- 
GitLab


From 4399344834002ecdd64f685a539d3a7ceb69e708 Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Thu, 17 Dec 2020 10:12:09 +0100
Subject: [PATCH 182/225] build_externals.sh: fix externals hash generation

The hash used to decide if the externals have to be rebuild only
considered the first entry of `EXTRACMAKE`. All others (e.g. the new
Gaudi version argument) were ignored.
---
 Projects/AnalysisBase/build_externals.sh  | 2 +-
 Projects/AthAnalysis/build_externals.sh   | 2 +-
 Projects/AthGeneration/build_externals.sh | 2 +-
 Projects/AthSimulation/build_externals.sh | 2 +-
 Projects/Athena/build_externals.sh        | 2 +-
 5 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/Projects/AnalysisBase/build_externals.sh b/Projects/AnalysisBase/build_externals.sh
index 081074ee028a..cd54bc498a1a 100755
--- a/Projects/AnalysisBase/build_externals.sh
+++ b/Projects/AnalysisBase/build_externals.sh
@@ -85,7 +85,7 @@ fi
 # Get the version of AnalysisBase for the build.
 version=`cat ${thisdir}/version.txt`
 # Generate hash of any extra cmake arguments.
-cmakehash=`echo -n "${EXTRACMAKE}" | openssl md5 | awk '{print $2}'`
+cmakehash=`echo -n "${EXTRACMAKE[@]}" | openssl md5 | awk '{print $2}'`
 
 # Check if previous externals build can be reused:
 externals_stamp=${BUILDDIR}/build/AnalysisBaseExternals/externals-${version}-${cmakehash}.stamp
diff --git a/Projects/AthAnalysis/build_externals.sh b/Projects/AthAnalysis/build_externals.sh
index 7fe421a38b15..daf7ace342e3 100755
--- a/Projects/AthAnalysis/build_externals.sh
+++ b/Projects/AthAnalysis/build_externals.sh
@@ -91,7 +91,7 @@ fi
 # Get the version of AthAnalysis for the build.
 version=`cat ${thisdir}/version.txt`
 # Generate hash of any extra cmake arguments.
-cmakehash=`echo -n "${EXTRACMAKE}" | openssl md5 | awk '{print $2}'`
+cmakehash=`echo -n "${EXTRACMAKE[@]}" | openssl md5 | awk '{print $2}'`
 
 # Check if previous externals build can be reused:
 externals_stamp=${BUILDDIR}/build/AthAnalysisExternals/externals-${version}-${cmakehash}.stamp
diff --git a/Projects/AthGeneration/build_externals.sh b/Projects/AthGeneration/build_externals.sh
index b7857649238b..bd2ac7f08028 100755
--- a/Projects/AthGeneration/build_externals.sh
+++ b/Projects/AthGeneration/build_externals.sh
@@ -99,7 +99,7 @@ fi
 # Get the version of AthGeneration for the build.
 version=`cat ${thisdir}/version.txt`
 # Generate hash of any extra cmake arguments.
-cmakehash=`echo -n "${EXTRACMAKE}" | openssl md5 | awk '{print $2}'`
+cmakehash=`echo -n "${EXTRACMAKE[@]}" | openssl md5 | awk '{print $2}'`
 
 # Check if previous externals build can be reused:
 externals_stamp=${BUILDDIR}/build/AthGenerationExternals/externals-${version}-${cmakehash}.stamp
diff --git a/Projects/AthSimulation/build_externals.sh b/Projects/AthSimulation/build_externals.sh
index ed6424280e47..e7ce96a862f4 100755
--- a/Projects/AthSimulation/build_externals.sh
+++ b/Projects/AthSimulation/build_externals.sh
@@ -91,7 +91,7 @@ fi
 # Get the version of AthSimulation for the build.
 version=`cat ${thisdir}/version.txt`
 # Generate hash of any extra cmake arguments.
-cmakehash=`echo -n "${EXTRACMAKE}" | openssl md5 | awk '{print $2}'`
+cmakehash=`echo -n "${EXTRACMAKE[@]}" | openssl md5 | awk '{print $2}'`
 
 # Check if previous externals build can be reused:
 externals_stamp=${BUILDDIR}/build/AthSimulationExternals/externals-${version}-${cmakehash}.stamp
diff --git a/Projects/Athena/build_externals.sh b/Projects/Athena/build_externals.sh
index 568ea8a80524..32400efb469d 100755
--- a/Projects/Athena/build_externals.sh
+++ b/Projects/Athena/build_externals.sh
@@ -99,7 +99,7 @@ fi
 # Get the version of Athena for the build.
 version=`cat ${thisdir}/version.txt`
 # Generate hash of any extra cmake arguments.
-cmakehash=`echo -n "${EXTRACMAKE}" | openssl md5 | awk '{print $2}'`
+cmakehash=`echo -n "${EXTRACMAKE[@]}" | openssl md5 | awk '{print $2}'`
 
 # Check if previous externals build can be reused:
 externals_stamp=${BUILDDIR}/build/AthenaExternals/externals-${version}-${cmakehash}.stamp
-- 
GitLab


From 083dca588375610c3ccc3c973ad1dcdb8fa0b288 Mon Sep 17 00:00:00 2001
From: Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
Date: Sat, 19 Dec 2020 13:47:28 +0100
Subject: [PATCH 183/225] Updated JetVertexTaggerTool to find its default
 calibration file correctly.

---
 .../JetMomentTools/JetMomentTools/JetVertexTaggerTool.h    | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/Reconstruction/Jet/JetMomentTools/JetMomentTools/JetVertexTaggerTool.h b/Reconstruction/Jet/JetMomentTools/JetMomentTools/JetVertexTaggerTool.h
index aa52d5990dc3..2227f68e2e27 100644
--- a/Reconstruction/Jet/JetMomentTools/JetMomentTools/JetVertexTaggerTool.h
+++ b/Reconstruction/Jet/JetMomentTools/JetMomentTools/JetVertexTaggerTool.h
@@ -21,7 +21,7 @@
 /// JVFCorr: a corrected JVF calculation accounting for the number of PU tracks in the event.
 ///
 /// Calculation requires three main types of information
-///     1. Vertex container for the event (from evtStore), with respect to which the JVT track sums 
+///     1. Vertex container for the event (from evtStore), with respect to which the JVT track sums
 ///     2. Tracks associated to each of the input jet (in the jet aux store)
 ///     3. Track vertex association object (from evtStore)
 ///     4. The track container needed for PU track counting
@@ -44,7 +44,7 @@
 ///  AssociatedTracks - name for attribute holding the list of associated tracks
 ///  TrackVertexAssociation - name for the container holding the track-vertex associations
 ///  TrackSelector - tool to select tracks (none ==> no selection)
-///  JVTFileName - ROOT Filename containing JVT likelihood histogram	
+///  JVTFileName - ROOT Filename containing JVT likelihood histogram
 ///  JVTLikelihoodHistName - JVT Likelihood histogram name
 ///  JVTName - name for the 3 JVT attributes (default is "JVT")
 ///  K_JVFCorrScale - the scale factor for pileup tracks in the JVFCorr calculation (default is 0.01)
@@ -107,7 +107,7 @@ private:  // data
   // Configurable parameters
   Gaudi::Property<std::string> m_jetContainerName{this,"JetContainer", "", "SG key for the input jet container"};
   Gaudi::Property<std::string> m_jvtlikelihoodHistName{this, "JVTLikelihoodHistName", "JVTRootCore_kNN100trim_pt20to50_Likelihood", "JVT likelihood histogram name"};
-  Gaudi::Property<std::string> m_jvtfileName{this, "JVTFileName", "JVTlikelihood_20140805.root", "JVT likelihood file name"};
+  Gaudi::Property<std::string> m_jvtfileName{this, "JVTFileName", "JetMomentTools/JVTlikelihood_20140805.root", "JVT likelihood file name"};
 
   SG::ReadHandleKey<xAOD::VertexContainer> m_vertexContainer_key{this, "VertexContainer", "PrimaryVertices", "SG key for input vertex container"};
   SG::ReadDecorHandleKey<xAOD::JetContainer> m_jvfCorrKey{this, "JVFCorrName", "JVFCorr", "SG key for input JVFCorr decoration"};
@@ -123,4 +123,3 @@ private:  // data
 
 
 #endif
-
-- 
GitLab


From 462f104964a291f565b6b1b6965e97cf6cd19c54 Mon Sep 17 00:00:00 2001
From: Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
Date: Sat, 19 Dec 2020 13:59:43 +0100
Subject: [PATCH 184/225] Fixed the name of the JVT calibration file to use.

---
 .../TrigEFMissingET/src/EFMissingETFromTrackAndJets.cxx         | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromTrackAndJets.cxx b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromTrackAndJets.cxx
index 31030deee8fd..d38809bf8d7d 100644
--- a/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromTrackAndJets.cxx
+++ b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromTrackAndJets.cxx
@@ -68,7 +68,7 @@ StatusCode EFMissingETFromTrackAndJets::initialize()
     } // if timing service
 
     // JVT likelihood histogram
-    TString jvtFile = "JVTlikelihood_20140805.root";
+    TString jvtFile = "JetMomentTools/JVTlikelihood_20140805.root";
     TString jvtName = "JVTRootCore_kNN100trim_pt20to50_Likelihood";
     m_jvtLikelihood = (TH2F *) getHistogramFromFile(jvtName, jvtFile);
     if (m_jvtLikelihood == nullptr) {
-- 
GitLab


From d0aaa40252ac09d23fd8685c9473711e2d6ef5ac Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Wed, 16 Dec 2020 12:25:55 -0500
Subject: [PATCH 185/225] AthContainers: Use ConcurrentStrMap.

Use ConcurrentStrMap in AuxTypeRegistry for the string->auxid
and the string->factory maps, allowing them to be read without taking
a lock.
---
 .../AthContainers/AuxTypeRegistry.h           | 54 ++++----------
 .../AthContainers/AuxTypeRegistry.icc         |  6 +-
 .../AthContainers/Root/AuxTypeRegistry.cxx    | 74 +++++++++----------
 3 files changed, 55 insertions(+), 79 deletions(-)

diff --git a/Control/AthContainers/AthContainers/AuxTypeRegistry.h b/Control/AthContainers/AthContainers/AuxTypeRegistry.h
index 79661353a42e..62a8b883078c 100644
--- a/Control/AthContainers/AthContainers/AuxTypeRegistry.h
+++ b/Control/AthContainers/AthContainers/AuxTypeRegistry.h
@@ -1,10 +1,8 @@
 // This file's extension implies that it's C, but it's really -*- C++ -*-.
 
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
-
-// $Id: AuxTypeRegistry.h 784452 2016-11-15 21:40:41Z ssnyder $
 /**
  * @file AthContainers/AuxTypeRegistry.h
  * @author scott snyder <snyder@bnl.gov>
@@ -23,6 +21,8 @@
 #include "AthContainers/tools/AuxTypeVector.h"
 #include "AthContainers/tools/AuxTypeVectorFactory.h"
 #include "AthContainers/tools/threading.h"
+#include "CxxUtils/ConcurrentStrMap.h"
+#include "CxxUtils/SimpleUpdater.h"
 #include "CxxUtils/bitmask.h"
 #ifndef XAOD_STANDALONE
 #include "AthenaKernel/IInputRename.h"
@@ -289,7 +289,7 @@ public:
    * @brief Return the vector factory for a given vector element type.
    * @param ti The type of the vector element.
    *
-   * Returns 0 if the type is not known.
+   * Returns nullptr if the type is not known.
    * (Use @c addFactory to add new mappings.)
    */
   const IAuxTypeVectorFactory* getFactory (const std::type_info& ti) const;
@@ -393,25 +393,12 @@ private:
    * @brief Return the vector factory for a given auxid.
    * @param auxid The desired aux data item.
    *
-   * Returns 0 if the type is not known.
+   * Returns nullptr if the type is not known.
    * (Use @c addFactory to add new mappings.)
    */
   const IAuxTypeVectorFactory* getFactory (SG::auxid_t auxid) const;
 
 
-  /**
-   * @brief Return the vector factory for a given vector element type.
-   *        (external locking)
-   * @param lock The registry lock.
-   * @param ti The type of the vector element.
-   *
-   * Returns 0 if the type is not known.
-   * (Use @c addFactory to add new mappings.)
-   */
-  const IAuxTypeVectorFactory* getFactory (lock_t& lock,
-                                           const std::type_info& ti) const;
-
-
   /**
    * @brief Add a new type -> factory mapping.  (external locking)
    * @param lock The registry lock.
@@ -447,6 +434,15 @@ private:
   IAuxTypeVectorFactory* makeFactoryNull() const;
 
 
+  /**
+   * @brief Return the key used to look up an entry in m_auxids.
+   * @param name The name of the aux data item.
+   * @param clsname The name of its associated class.  May be blank.
+   */
+  static std::string makeKey (const std::string& name,
+                              const std::string& clsname);
+
+
   /// Hold information about one aux data item.
   struct typeinfo_t
   {
@@ -472,30 +468,12 @@ private:
   AthContainers_detail::concurrent_vector<typeinfo_t> m_types;
 
 
-  /// Key used for name -> auxid lookup.
-  /// First element is name, second is class name.
-  typedef std::pair<std::string, std::string> key_t;
-
-
-  /// Helper to hash the key type.
-  struct stringpair_hash
-  {
-    size_t operator() (const key_t& key) const
-    {
-      return shash (key.first) + shash (key.second);
-    }
-    std::hash<std::string> shash;
-  };
-
-
   /// Map from name -> auxid.
-  typedef std::unordered_map<key_t, SG::auxid_t, stringpair_hash>
-    id_map_t;
+  using id_map_t = CxxUtils::ConcurrentStrMap<SG::auxid_t, CxxUtils::SimpleUpdater>;
   id_map_t m_auxids;
 
   /// Map from type_info name -> IAuxTypeVectorFactory.
-  typedef std::unordered_map<std::string,
-                             const IAuxTypeVectorFactory*> ti_map_t;
+  using ti_map_t = CxxUtils::ConcurrentStrMap<const IAuxTypeVectorFactory*, CxxUtils::SimpleUpdater>;
   ti_map_t m_factories;
 
   /// Hold additional factory instances we need to delete.
diff --git a/Control/AthContainers/AthContainers/AuxTypeRegistry.icc b/Control/AthContainers/AthContainers/AuxTypeRegistry.icc
index f888377cebba..386ca1b5dd2f 100644
--- a/Control/AthContainers/AthContainers/AuxTypeRegistry.icc
+++ b/Control/AthContainers/AthContainers/AuxTypeRegistry.icc
@@ -1,8 +1,6 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
-
-// $Id: AuxTypeRegistry.icc 602003 2014-06-16 17:07:01Z ssnyder $
 /**
  * @file AthContainers/AuxTypeRegistry.icc
  * @author scott snyder <snyder@bnl.gov>
@@ -38,7 +36,7 @@ AuxTypeRegistry::getAuxID (const std::string& name,
  * @brief Return the vector factory for a given auxid.
  * @param auxid The desired aux data item.
  *
- * Returns 0 if the type is not known.
+ * Returns nullptr if the type is not known.
  * (Use @c addFactory to add new mappings.)
  */
 inline
diff --git a/Control/AthContainers/Root/AuxTypeRegistry.cxx b/Control/AthContainers/Root/AuxTypeRegistry.cxx
index 46da2502ef06..0bf50e9e99bb 100644
--- a/Control/AthContainers/Root/AuxTypeRegistry.cxx
+++ b/Control/AthContainers/Root/AuxTypeRegistry.cxx
@@ -1,8 +1,6 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
-
-// $Id$
 /**
  * @file AthContainers/AuxTypeRegistry.cxx
  * @author scott snyder <snyder@bnl.gov>
@@ -68,9 +66,12 @@ SG::auxid_t
 AuxTypeRegistry::findAuxID( const std::string& name,
                             const std::string& clsname ) const
 {
-  lock_t lock (m_mutex);
-  key_t key (name, clsname);
-  id_map_t::const_iterator i = m_auxids.find (key);
+  // No locking needed here.
+  // The extra test here is to avoid having to copy a string
+  // in the common case where clsname is blank.
+  id_map_t::const_iterator i = m_auxids.find (clsname.empty() ?
+                                              name :
+                                              makeKey (name, clsname));
   if (i != m_auxids.end()) {
     return i->second;
   }
@@ -121,6 +122,21 @@ AuxTypeRegistry::makeVectorFromData (SG::auxid_t auxid,
 }
 
 
+/**
+ * @brief Return the key used to look up an entry in m_auxids.
+ * @param name The name of the aux data item.
+ * @param clsname The name of its associated class.  May be blank.
+ */
+std::string AuxTypeRegistry::makeKey (const std::string& name,
+                                      const std::string& clsname)
+{
+  if (clsname.empty()) {
+    return name;
+  }
+  return clsname + "::" + name;
+}
+
+
 
 /**
  * @brief Return the name of an aux data item.
@@ -294,34 +310,16 @@ void AuxTypeRegistry::clear (SG::auxid_t auxid, void* dst, size_t dst_index)
  * @brief Return the vector factory for a given vector element type.
  * @param ti The type of the vector element.
  *
- * Returns 0 if the type is not known.
+ * Returns nullptr if the type is not known.
  * (Use @c addFactory to add new mappings.)
  */
 const IAuxTypeVectorFactory*
 AuxTypeRegistry::getFactory (const std::type_info& ti) const
-{
-  lock_t lock (m_mutex);
-  return getFactory (lock, ti);
-}
-
-
-/**
- * @brief Return the vector factory for a given vector element type.
- *        (external locking)
- * @param lock The registry lock.
- * @param ti The type of the vector element.
- *
- * Returns 0 if the type is not known.
- * (Use @c addFactory to add new mappings.)
- */
-const IAuxTypeVectorFactory*
-AuxTypeRegistry::getFactory (lock_t& /*lock*/,
-                             const std::type_info& ti) const
 {
   ti_map_t::const_iterator it = m_factories.find (ti.name());
   if (it != m_factories.end())
     return it->second;
-  return 0;
+  return nullptr;
 }
 
 
@@ -358,7 +356,7 @@ void AuxTypeRegistry::addFactory (lock_t& /*lock*/,
                                   const std::type_info& ti,
                                   IAuxTypeVectorFactory* factory)
 {
-  ti_map_t::iterator it = m_factories.find (ti.name());
+  ti_map_t::const_iterator it = m_factories.find (ti.name());
   if (it != m_factories.end()) {
     if (it->second->isDynamic() && !factory->isDynamic()) {
       // Replacing a dynamic factory with a non-dynamic one.
@@ -366,13 +364,13 @@ void AuxTypeRegistry::addFactory (lock_t& /*lock*/,
       // Instead, push it on a vector to remember it so we can delete
       // it later.
       m_oldFactories.push_back (it->second);
-      it->second = factory;
+      m_factories.insert_or_assign (ti.name(), factory);
     }
     else
       delete factory;
   }
   else
-    m_factories[ti.name()] = factory;
+    m_factories.insert_or_assign (ti.name(), factory);
 }
 
 
@@ -382,6 +380,8 @@ void AuxTypeRegistry::addFactory (lock_t& /*lock*/,
  * Populates the type -> factory mappings for standard C++ types.
  */
 AuxTypeRegistry::AuxTypeRegistry()
+  : m_auxids (id_map_t::Updater_t()),
+    m_factories (ti_map_t::Updater_t())
 {
   m_types.reserve (auxid_set_size_hint);
 
@@ -419,7 +419,7 @@ AuxTypeRegistry::AuxTypeRegistry()
  */
 AuxTypeRegistry::~AuxTypeRegistry()
 {
-  for (ti_map_t::value_type& p : m_factories)
+  for (auto& p : m_factories)
     delete p.second;
   for (const IAuxTypeVectorFactory* p : m_oldFactories)
     delete p;
@@ -453,9 +453,9 @@ AuxTypeRegistry::findAuxID (const std::string& name,
                             const std::type_info& ti,
                             IAuxTypeVectorFactory* (AuxTypeRegistry::*makeFactory) () const)
 {
-  lock_t lock (m_mutex);
-  key_t key (name, clsname);
-  id_map_t::iterator i = m_auxids.find (key);
+  lock_t lock (m_mutex);  // May be able to relax this lock.
+  std::string key = makeKey (name, clsname);
+  id_map_t::const_iterator i = m_auxids.find (key);
   if (i != m_auxids.end()) {
     typeinfo_t& m = m_types[i->second];
 
@@ -479,7 +479,7 @@ AuxTypeRegistry::findAuxID (const std::string& name,
         IAuxTypeVectorFactory* fac2 = (*this.*makeFactory)();
         if (fac2) {
           addFactory (lock, ti, fac2);
-          m.m_factory = getFactory (lock, ti);
+          m.m_factory = getFactory (ti);
         }
       }
       return i->second;
@@ -490,12 +490,12 @@ AuxTypeRegistry::findAuxID (const std::string& name,
     // fall through, get a new auxid and real type info
     // new auxid needed so a new data vector is created in the AuxStore
   }
-  const IAuxTypeVectorFactory* fac = getFactory (lock, ti);
+  const IAuxTypeVectorFactory* fac = getFactory (ti);
   if (!fac || fac->isDynamic()) {
     IAuxTypeVectorFactory* fac2 = (*this.*makeFactory)();
     if (fac2) {
       addFactory (lock, ti, fac2);
-      fac = getFactory (lock, ti);
+      fac = getFactory (ti);
     }
   }
   if (!fac) return null_auxid;
@@ -508,7 +508,7 @@ AuxTypeRegistry::findAuxID (const std::string& name,
   t.m_factory = fac;
   t.m_flags = flags;
   AthContainers_detail::fence_seq_cst();
-  m_auxids[key] = auxid;
+  m_auxids.insert_or_assign (key, auxid);
 
   return auxid;
 }
-- 
GitLab


From ff00aca8ad883619fdb69701315d7669525d1580 Mon Sep 17 00:00:00 2001
From: Dan Guest <daniel.hay.guest@cern.ch>
Date: Sat, 19 Dec 2020 16:11:23 +0000
Subject: [PATCH 186/225] ATLASRECTS-5201: DL1 double -> float encore

---
 .../JetTagging/FlavorTagDiscriminants/Root/HbbTag.cxx         | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/HbbTag.cxx b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/HbbTag.cxx
index 1f3b1a95c823..b521064476b2 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/HbbTag.cxx
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/HbbTag.cxx
@@ -161,9 +161,9 @@ namespace {
         return {hk::eta, j.eta()};
       };
     } else {
-      // for now we assume everything we read from b-tagging is a double,
+      // for now we assume everything we read from b-tagging is a float,
       // this is only true for DL1 scores.
-      return BTagPairGetter<double>(key);
+      return BTagPairGetter<float>(key);
     }
   }
 
-- 
GitLab


From ede21980b73df73248198b643b69e05606e5045f Mon Sep 17 00:00:00 2001
From: Andrii Verbytskyi <andrii.verbytskyi@cern.ch>
Date: Sat, 19 Dec 2020 16:12:30 +0000
Subject: [PATCH 187/225] Hepmc3 nightly fixes 17122020 part 2

---
 Generators/Pythia8_i/src/Pythia8_i.cxx | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/Generators/Pythia8_i/src/Pythia8_i.cxx b/Generators/Pythia8_i/src/Pythia8_i.cxx
index 3b4206af8779..b54fbea36b22 100644
--- a/Generators/Pythia8_i/src/Pythia8_i.cxx
+++ b/Generators/Pythia8_i/src/Pythia8_i.cxx
@@ -606,6 +606,26 @@ StatusCode Pythia8_i::genFinalize(){
 ////////////////////////////////////////////////////////////////////////////////
 void Pythia8_i::addLHEToHepMC(HepMC::GenEvent *evt){
 
+#ifdef HEPMC3
+  HepMC::GenEvent *procEvent = new HepMC::GenEvent();
+
+  // Adding the LHE event to the HepMC results in undecayed partons in the event record.
+  // Pythia's HepMC converter throws up undecayed partons, so we ignore that
+  // (expected) exception this time
+  m_pythiaToHepMC.fill_next_event(m_pythia->process, procEvent, evt->event_number(), &m_pythia->info, &m_pythia->settings);
+
+  for(auto  p: *procEvent){
+    p->set_status(1003);
+  }
+
+  //This code and the HepMC2 version below assume a correct input, e.g. beams[0]->end_vertex() exists.
+  for(auto  v: procEvent->vertices()) v->set_status(1);
+  auto beams=evt->beams();
+  auto procBeams=procEvent->beams();
+  if(beams[0]->momentum().pz() * procBeams[0]->momentum().pz() < 0.) std::swap(procBeams[0],procBeams[1]);
+  for (auto p: procBeams[0]->end_vertex()->particles_out())  beams[0]->end_vertex()->add_particle_out(p);
+  for (auto p: procBeams[1]->end_vertex()->particles_out())  beams[1]->end_vertex()->add_particle_out(p);
+#else
   HepMC::GenEvent *procEvent = new HepMC::GenEvent(evt->momentum_unit(), evt->length_unit());
 
   // Adding the LHE event to the HepMC results in undecayed partons in the event record.
@@ -668,6 +688,7 @@ void Pythia8_i::addLHEToHepMC(HepMC::GenEvent *evt){
     vit = vtxCopies.find((*p)->end_vertex());
     if(vit != vtxCopies.end()) vit->second->add_particle_in(pCopy);
   }
+#endif
 
   return;
 }
-- 
GitLab


From 6d2d38f65ecc5307e1ebfa90d21642f42bc48b8c Mon Sep 17 00:00:00 2001
From: Giancarlo Panizzo <giancarlo.panizzo@cern.ch>
Date: Sun, 20 Dec 2020 09:37:02 +0000
Subject: [PATCH 188/225] Fix problems with ART tests in master, r 22

---
 Generators/Pythia8_i/src/Pythia8_i.cxx | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/Generators/Pythia8_i/src/Pythia8_i.cxx b/Generators/Pythia8_i/src/Pythia8_i.cxx
index 3b4206af8779..6ff590bcda8a 100644
--- a/Generators/Pythia8_i/src/Pythia8_i.cxx
+++ b/Generators/Pythia8_i/src/Pythia8_i.cxx
@@ -76,7 +76,7 @@ m_failureCount(0),
 m_procPtr(0),
 m_userHooksPtrs(),
 m_doLHE3Weights(false),
-m_athenaTool("IPythia8Custom")
+m_athenaTool("")
 {
   declareProperty("Commands", m_commands);
   declareProperty("CollisionEnergy", m_collisionEnergy = 14000.0);
@@ -191,7 +191,7 @@ StatusCode Pythia8_i::genInitialize() {
     m_pythia->settings.addWord(param.first, param.second);
   }
 
-  if(m_athenaTool.typeAndName() != "IPythia8Custom"){
+  if( ! m_athenaTool.empty() ){
     if(m_athenaTool.retrieve().isFailure()){
       ATH_MSG_ERROR("Unable to retrieve Athena Tool for custom Pythia processing");
       return StatusCode::FAILURE;
@@ -202,7 +202,6 @@ StatusCode Pythia8_i::genInitialize() {
     }
   }
 
-
   // Now apply the settings from the JO
   for(const std::string &cmd : m_commands){
 
@@ -386,7 +385,8 @@ StatusCode Pythia8_i::callGenerator(){
     }
   }
 
-  if(m_athenaTool.typeAndName() != "IPythia8Custom"){
+  ATH_MSG_DEBUG("Now checking with Tool.empty() second time");
+  if( ! m_athenaTool.empty() ){
       StatusCode stat = m_athenaTool->ModifyPythiaEvent(*m_pythia);
       if(stat != StatusCode::SUCCESS) returnCode = stat;
   }
@@ -570,7 +570,7 @@ StatusCode Pythia8_i::genFinalize(){
     std::cout << "Using FxFx cross section recipe: xs = "<< m_sigmaTotal << " / " << 1e9*info.nTried() << std::endl;
   }
 
-  if(m_athenaTool.typeAndName() != "IPythia8Custom"){
+  if( ! m_athenaTool.empty()){
     double xsmod = m_athenaTool->CrossSectionScaleFactor();
     ATH_MSG_DEBUG("Multiplying cross-section by Pythia Modifier tool factor " << xsmod );
     xs *= xsmod;
-- 
GitLab


From 8ad4844fbee60d522acece11d6c2c5caaa80af41 Mon Sep 17 00:00:00 2001
From: Joerg Stelzer <joerg.stelzer@cern.ch>
Date: Sun, 20 Dec 2020 19:04:43 +0100
Subject: [PATCH 189/225] Fix once-per-job memory leak in CTP simulation

---
 Trigger/TrigT1/TrigT1CTP/src/ResultBuilder.cxx | 11 +++++++----
 Trigger/TrigT1/TrigT1CTP/src/ResultBuilder.h   |  4 ++--
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/Trigger/TrigT1/TrigT1CTP/src/ResultBuilder.cxx b/Trigger/TrigT1/TrigT1CTP/src/ResultBuilder.cxx
index 890651d88094..78a8f419f534 100644
--- a/Trigger/TrigT1/TrigT1CTP/src/ResultBuilder.cxx
+++ b/Trigger/TrigT1/TrigT1CTP/src/ResultBuilder.cxx
@@ -38,6 +38,9 @@ LVL1CTP::ResultBuilder::ResultBuilder( const std::string& type,
 
 LVL1CTP::ResultBuilder::~ResultBuilder() {
    delete m_ctpDataFormat;
+   for(auto & x : m_internalTrigger) {
+      delete x.second;
+   }
 }
 
 
@@ -78,10 +81,10 @@ LVL1CTP::ResultBuilder::createTriggerConfigMaps(const ConfigSource & cfgSrc) con
       }
 
       // build map of name to ctp thresholds
-      m_thrConfigMap = new ThresholdMap( cfgSrc.l1menu() );
+      m_thrConfigMap = std::make_unique<ThresholdMap>( cfgSrc.l1menu() );
 
       // build map of name to ctp items
-      m_itemConfigMap = new ItemMap( cfgSrc.l1menu() );
+      m_itemConfigMap = std::make_unique<ItemMap>( cfgSrc.l1menu() );
 
    } else if( cfgSrc.ctpConfig() != nullptr ) {
 
@@ -102,9 +105,9 @@ LVL1CTP::ResultBuilder::createTriggerConfigMaps(const ConfigSource & cfgSrc) con
          m_internalTrigger[ rndm->name() ] = rndm;
       }
 
-      m_thrConfigMap = new ThresholdMap( cfgSrc.ctpConfig()->menu().thresholdVector());
+      m_thrConfigMap = std::make_unique<ThresholdMap>( cfgSrc.ctpConfig()->menu().thresholdVector());
 
-      m_itemConfigMap = new ItemMap( cfgSrc.ctpConfig()->menu().itemVector(), 
+      m_itemConfigMap = std::make_unique<ItemMap>( cfgSrc.ctpConfig()->menu().itemVector(),
                                      cfgSrc.ctpConfig()->prescaleSet() );
    } else {
       ATH_MSG_FATAL("No L1 trigger menu was provided");
diff --git a/Trigger/TrigT1/TrigT1CTP/src/ResultBuilder.h b/Trigger/TrigT1/TrigT1CTP/src/ResultBuilder.h
index a211285f9b04..3694457bd1e8 100644
--- a/Trigger/TrigT1/TrigT1CTP/src/ResultBuilder.h
+++ b/Trigger/TrigT1/TrigT1CTP/src/ResultBuilder.h
@@ -95,8 +95,8 @@ namespace LVL1CTP {
       std::vector<std::string> firedItems(const std::vector<uint32_t>& triggerWords) const;
 
       // configuration information
-      mutable ThresholdMap*         m_thrConfigMap ATLAS_THREAD_SAFE { nullptr };    //!< Map between threshold objects and their CTP-internal description
-      mutable ItemMap*              m_itemConfigMap ATLAS_THREAD_SAFE { nullptr };   //!< Map between item objects and their CTP-internal description
+      mutable std::unique_ptr<ThresholdMap>         m_thrConfigMap ATLAS_THREAD_SAFE { nullptr };    //!< Map between threshold objects and their CTP-internal description
+      mutable std::unique_ptr<ItemMap>              m_itemConfigMap ATLAS_THREAD_SAFE { nullptr };   //!< Map between item objects and their CTP-internal description
       mutable InternalTriggerMap    m_internalTrigger ATLAS_THREAD_SAFE;             //!< internal triggers BGRP and RNDM
       unsigned int                  m_ctpVersionNumber { 4 };      //!< CTP data format version (4 in most of Run 2 and in Run 3) 
       CTPdataformatVersion*         m_ctpDataFormat { nullptr };   //!< CTP data format details
-- 
GitLab


From 52f33de9f81ecedeaa89628cde77b13e1c7d47d4 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Sat, 19 Dec 2020 16:45:59 +0100
Subject: [PATCH 190/225] JetTagCalibration: Trying to fix memory leak.

In JetTagCalibCondAlg, make sure that the TObjArray we read owns its elements.
---
 .../JetTagging/JetTagCalibration/src/JetTagCalibCondAlg.cxx    | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/PhysicsAnalysis/JetTagging/JetTagCalibration/src/JetTagCalibCondAlg.cxx b/PhysicsAnalysis/JetTagging/JetTagCalibration/src/JetTagCalibCondAlg.cxx
index d355ea90553d..c44cbab6be97 100644
--- a/PhysicsAnalysis/JetTagging/JetTagCalibration/src/JetTagCalibCondAlg.cxx
+++ b/PhysicsAnalysis/JetTagging/JetTagCalibration/src/JetTagCalibCondAlg.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 /*
  *   */
@@ -560,6 +560,7 @@ namespace Analysis {
                 TObjArray * toa = dynamic_cast<TObjArray*>(hPointer.get());
                 if (toa) {
                   ATH_MSG_DEBUG("#BTAG# The TObjArray to build the input variables of BDT for " << tagger<< " is valid");
+                  toa->SetOwner (true);
                   std::vector<std::string> inputVars; inputVars.clear();
                   std::string commaSepVars="";
                   TObjString *tos= nullptr;
-- 
GitLab


From 2f938d9d987e9c1fb82874abd2e02be8fc513275 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Thu, 17 Dec 2020 00:26:07 +0100
Subject: [PATCH 191/225] TileTrackingGeometry: Fix leaks.

Fix leaks of Trk::Material objects.
---
 .../TileTrackingGeometry/CMakeLists.txt       |  2 +-
 .../TileTrackingGeometry/TileVolumeBuilder.h  |  8 +++
 .../src/TileVolumeBuilder.cxx                 | 54 +++++++++++--------
 3 files changed, 41 insertions(+), 23 deletions(-)

diff --git a/TileCalorimeter/TileTrackingGeometry/CMakeLists.txt b/TileCalorimeter/TileTrackingGeometry/CMakeLists.txt
index fc4d3393492d..1f77414b14b7 100644
--- a/TileCalorimeter/TileTrackingGeometry/CMakeLists.txt
+++ b/TileCalorimeter/TileTrackingGeometry/CMakeLists.txt
@@ -11,7 +11,7 @@ atlas_add_component( TileTrackingGeometry
                      src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${GEOMODELCORE_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${GEOMODELCORE_LIBRARIES} AthenaBaseComps GaudiKernel TrkDetDescrInterfaces CaloDetDescrLib StoreGateLib TileDetDescr TrkDetDescrGeoModelCnv TrkDetDescrUtils TrkGeometry TrkSurfaces TrkVolumes CaloTrackingGeometryLib )
+                     LINK_LIBRARIES ${GEOMODELCORE_LIBRARIES} AthenaBaseComps GaudiKernel TrkDetDescrInterfaces CaloDetDescrLib StoreGateLib TileDetDescr TrkDetDescrGeoModelCnv TrkDetDescrUtils TrkGeometry TrkSurfaces TrkVolumes CaloTrackingGeometryLib CxxUtils )
 
 # Install files from the package:
 atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
diff --git a/TileCalorimeter/TileTrackingGeometry/TileTrackingGeometry/TileVolumeBuilder.h b/TileCalorimeter/TileTrackingGeometry/TileTrackingGeometry/TileVolumeBuilder.h
index 863678fc4fda..bd3a93c594e1 100755
--- a/TileCalorimeter/TileTrackingGeometry/TileTrackingGeometry/TileVolumeBuilder.h
+++ b/TileCalorimeter/TileTrackingGeometry/TileTrackingGeometry/TileVolumeBuilder.h
@@ -12,11 +12,15 @@
 // Gaudi
 #include "AthenaBaseComps/AthAlgTool.h"
 #include "GaudiKernel/ToolHandle.h"
+#include "CxxUtils/checker_macros.h"
 // Trk
 #include "TrkDetDescrInterfaces/ITrackingVolumeBuilder.h"
 #include "CaloTrackingGeometry/ICaloSurfaceBuilder.h"
+#include "TrkGeometry/Material.h"
 // STL
 #include <vector>
+#include <memory>
+#include <mutex>
 
 class TileDetDescrManager;
 class CaloDetDescrManager;
@@ -70,6 +74,8 @@ namespace Tile {
       void printInfo(GeoPVConstLink pv) const;
       void printChildren(GeoPVConstLink pv, int igen, Amg::Transform3D trIn) const;
 
+      void throwIntoGarbage (std::unique_ptr<Trk::Material> mat) const;
+
       const TileDetDescrManager*                        m_tileMgr;                        //!< Calo DetDescrMgr
       std::string                                       m_tileMgrLocation;                //!< Location of the CaloDetDescrMgr
        
@@ -84,6 +90,8 @@ namespace Tile {
       
       bool                             m_forceSymmetry;              //!< forces volume symmetry between negative/positive part
 
+      mutable std::mutex m_garbageMutex;
+      mutable std::vector<std::unique_ptr<Trk::Material> > m_garbage ATLAS_THREAD_SAFE;
   };
   
 } // end of namespace
diff --git a/TileCalorimeter/TileTrackingGeometry/src/TileVolumeBuilder.cxx b/TileCalorimeter/TileTrackingGeometry/src/TileVolumeBuilder.cxx
index ca6732cc16d8..6e09f563e3a7 100755
--- a/TileCalorimeter/TileTrackingGeometry/src/TileVolumeBuilder.cxx
+++ b/TileCalorimeter/TileTrackingGeometry/src/TileVolumeBuilder.cxx
@@ -185,8 +185,8 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking
   std::vector<std::pair<const Trk::Surface*,const Trk::Surface*> > exitSurf  = m_surfBuilder->exitSurfaces();
   
   // averaged material properties 
-  const Trk::Material* barrelProperties = new Trk::Material(22.7, 212., 45.8, 21.4, 0.0062);
-  const Trk::Material* extendedBarrelProperties = new Trk::Material(22.7, 210., 45.8, 21.4, 0.0062);
+  auto barrelProperties = std::make_unique<Trk::Material>(22.7, 212., 45.8, 21.4, 0.0062);
+  auto extendedBarrelProperties = std::make_unique<Trk::Material>(22.7, 210., 45.8, 21.4, 0.0062);
   // material properties with layer encoding - to be defined later 
   const Trk::BinnedMaterial* barrelMaterialBinned = 0;
   const Trk::BinnedMaterial* extendedMaterialBinned = 0;
@@ -201,10 +201,10 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking
   // layer material can be adjusted here
   std::vector<Trk::IdentifiedMaterial> matTB; 
   int baseID = Trk::GeometrySignature(Trk::Calo)*1000 + 12;
-  matTB.emplace_back(barrelProperties,0);
-  matTB.emplace_back(barrelProperties,baseID);
-  matTB.emplace_back(barrelProperties,baseID+1);
-  matTB.emplace_back(barrelProperties,baseID+2);
+  matTB.emplace_back(barrelProperties.get(),0);
+  matTB.emplace_back(barrelProperties.get(),baseID);
+  matTB.emplace_back(barrelProperties.get(),baseID+1);
+  matTB.emplace_back(barrelProperties.get(),baseID+2);
   
   // material index 
   std::vector<size_t> ltb{0,1,2,3};
@@ -212,10 +212,10 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking
   // layer material can be adjusted here
   std::vector<Trk::IdentifiedMaterial> matETB; 
   baseID = Trk::GeometrySignature(Trk::Calo)*1000 + 18;
-  matETB.emplace_back(extendedBarrelProperties,0);
-  matETB.emplace_back(extendedBarrelProperties,baseID);
-  matETB.emplace_back(extendedBarrelProperties,baseID+1);
-  matETB.emplace_back(extendedBarrelProperties,baseID+2);
+  matETB.emplace_back(extendedBarrelProperties.get(),0);
+  matETB.emplace_back(extendedBarrelProperties.get(),baseID);
+  matETB.emplace_back(extendedBarrelProperties.get(),baseID+1);
+  matETB.emplace_back(extendedBarrelProperties.get(),baseID+2);
 
   // layer material can be adjusted here
   //Trk::MaterialProperties barrelFingerGapProperties = Trk::MaterialProperties(1., 130./0.35, 0.003*pow(0.35,3),30.);
@@ -292,7 +292,7 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking
 	    steps.push_back(depth);
 	    Trk::BinUtility* rBU = new Trk::BinUtility(steps, Trk::open, Trk::binR);
 	    
-	    barrelMaterialBinned = new Trk::BinnedMaterial(barrelProperties,rBU,ltb,matTB);
+	    barrelMaterialBinned = new Trk::BinnedMaterial(barrelProperties.get(),rBU,ltb,matTB);
             
 	    tileBarrel = new Trk::AlignableTrackingVolume(0,align,                          
 							  tileBarrelBounds,
@@ -356,7 +356,7 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking
 	    steps.push_back(tileExtendedBounds->outerRadius());
 	    Trk::BinUtility* eBU = new Trk::BinUtility(steps, Trk::open, Trk::binR);
 	    
-	    extendedMaterialBinned = new Trk::BinnedMaterial(extendedBarrelProperties,eBU,ltb,matETB);
+	    extendedMaterialBinned = new Trk::BinnedMaterial(extendedBarrelProperties.get(),eBU,ltb,matETB);
 	    
 	    tileExtendedTrackingVolume = new Trk::AlignableTrackingVolume(new Amg::Transform3D(Amg::Translation3D(childPosition)),
 									  align,
@@ -381,7 +381,7 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking
 	      steps.push_back(tileExtendedBounds->outerRadius());
 	      Trk::BinUtility* eBU = new Trk::BinUtility(steps, Trk::open, Trk::binR);
 	      
-	      extendedMaterialBinned = new Trk::BinnedMaterial(extendedBarrelProperties,eBU,ltb,matETB);
+	      extendedMaterialBinned = new Trk::BinnedMaterial(extendedBarrelProperties.get(),eBU,ltb,matETB);
 	      
 	      tileExtendedTrackingVolume = new Trk::AlignableTrackingVolume(new Amg::Transform3D(Amg::Translation3D(childPosition)),
 									    align,
@@ -441,9 +441,9 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking
   std::vector<Trk::IdentifiedMaterial> matITC;
   // layer material can be adjusted here
   baseID = Trk::GeometrySignature(Trk::Calo)*1000;
-  matITC.emplace_back(barrelProperties,baseID+15);
-  matITC.emplace_back(barrelProperties,baseID+16);
-  matITC.emplace_back(barrelProperties,baseID+17);
+  matITC.emplace_back(barrelProperties.get(),baseID+15);
+  matITC.emplace_back(barrelProperties.get(),baseID+16);
+  matITC.emplace_back(barrelProperties.get(),baseID+17);
 
   // ITCPlug1
   double p1Z = 0.5*(plug1Z-plug1hZ+tileExtZ);
@@ -462,8 +462,8 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking
   std::vector<float> bpsteps{float(plug1R), float(tileBarrelBounds->outerRadius())};
   Trk::BinUtility* rBU = new Trk::BinUtility(bpsteps, Trk::open, Trk::binR);
   Trk::BinUtility* rBUc = rBU->clone();
-  const Trk::BinnedMaterial* plug1MatPos = new Trk::BinnedMaterial(barrelProperties,rBU,dummylay,matITC);
-  const Trk::BinnedMaterial* plug1MatNeg = new Trk::BinnedMaterial(barrelProperties,rBUc,dummylay,matITC);
+  const Trk::BinnedMaterial* plug1MatPos = new Trk::BinnedMaterial(barrelProperties.get(),rBU,dummylay,matITC);
+  const Trk::BinnedMaterial* plug1MatNeg = new Trk::BinnedMaterial(barrelProperties.get(),rBUc,dummylay,matITC);
 
   Amg::Transform3D* align=0;      
 
@@ -497,8 +497,8 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking
   std::vector<float> p2steps{float(plug2R), float(plug1R)};
   Trk::BinUtility* p2BU = new Trk::BinUtility(p2steps, Trk::open, Trk::binR);
   Trk::BinUtility* p2BUc = p2BU->clone();
-  const Trk::BinnedMaterial* plug2MatPos = new Trk::BinnedMaterial(barrelProperties,p2BU,p2lay,matITC);
-  const Trk::BinnedMaterial* plug2MatNeg = new Trk::BinnedMaterial(barrelProperties,p2BUc,p2lay,matITC);
+  const Trk::BinnedMaterial* plug2MatPos = new Trk::BinnedMaterial(barrelProperties.get(),p2BU,p2lay,matITC);
+  const Trk::BinnedMaterial* plug2MatNeg = new Trk::BinnedMaterial(barrelProperties.get(),p2BUc,p2lay,matITC);
       
   Trk::AlignableTrackingVolume* itcPlug2Pos = new Trk::AlignableTrackingVolume(itcP2PosTransform, align,
 									       itcPlug2Bounds,
@@ -530,7 +530,7 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking
   std::vector<size_t> glay(1,2);
   std::vector<float> gsteps{float(gapi-gapBounds->halflengthZ()), float(gapi+gapBounds->halflengthZ())};
   Trk::BinUtility* gp = new Trk::BinUtility(gsteps, Trk::open, Trk::binZ);
-  const Trk::BinnedMaterial* gpMat = new Trk::BinnedMaterial(barrelProperties,gp,glay,matITC);
+  const Trk::BinnedMaterial* gpMat = new Trk::BinnedMaterial(barrelProperties.get(),gp,glay,matITC);
       
   Trk::AlignableTrackingVolume* gapPos = new Trk::AlignableTrackingVolume(gapPosTransform, align,
 									  gapBounds,
@@ -540,7 +540,7 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking
 
   std::vector<float> nsteps{float(-gapi-gapBounds->halflengthZ()), float(-gapi+gapBounds->halflengthZ())};
   Trk::BinUtility* gn = new Trk::BinUtility(nsteps, Trk::open, Trk::binZ);
-  const Trk::BinnedMaterial* gnMat = new Trk::BinnedMaterial(barrelProperties,gn,glay,matITC);
+  const Trk::BinnedMaterial* gnMat = new Trk::BinnedMaterial(barrelProperties.get(),gn,glay,matITC);
       
   Trk::AlignableTrackingVolume* gapNeg = new Trk::AlignableTrackingVolume(gapNegTransform, align,
 									  gapBounds->clone(),
@@ -795,6 +795,9 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking
     printCheckResult(msg(MSG::DEBUG), tileGirder);
   } // end of detailed output
 
+  throwIntoGarbage (std::move (barrelProperties));
+  throwIntoGarbage (std::move (extendedBarrelProperties));
+
   return tileTrackingVolumes;
 }
 
@@ -857,3 +860,10 @@ void Tile::TileVolumeBuilder::printChildren(const PVConstLink pv,int igen, Amg::
   }  
    
 }
+
+
+void Tile::TileVolumeBuilder::throwIntoGarbage (std::unique_ptr<Trk::Material> mat) const
+{
+  std::scoped_lock lock (m_garbageMutex);
+  m_garbage.push_back (std::move (mat));
+}
-- 
GitLab


From 38a6b8aa96575bb89af116f9425808c56a068c52 Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Tue, 8 Dec 2020 15:47:05 -0500
Subject: [PATCH 192/225] ElectronPhotonShowerShapeFudgeTool: cmake fix

Typo in ROOT library name.
---
 .../ElectronPhotonShowerShapeFudgeTool/CMakeLists.txt           | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonShowerShapeFudgeTool/CMakeLists.txt b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonShowerShapeFudgeTool/CMakeLists.txt
index ca06985255b7..1498568361a3 100644
--- a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonShowerShapeFudgeTool/CMakeLists.txt
+++ b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonShowerShapeFudgeTool/CMakeLists.txt
@@ -4,7 +4,7 @@
 atlas_subdir( ElectronPhotonShowerShapeFudgeTool )
 
 # External dependencies:
-find_package( ROOT COMPONENTS Core MathCore Hist Graph RIO )
+find_package( ROOT COMPONENTS Core MathCore Hist Graf RIO )
 
 # Component(s) in the package:
 atlas_add_library( ElectronPhotonShowerShapeFudgeToolLib
-- 
GitLab


From 723b782af198f69e382d77b110a80a692988eadd Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Tue, 8 Dec 2020 16:55:34 -0500
Subject: [PATCH 193/225] DerivationFrameworkMuons: cmake fix

The src/compoents/* files should go into only the component library.
---
 .../DerivationFramework/DerivationFrameworkMuons/CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkMuons/CMakeLists.txt b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkMuons/CMakeLists.txt
index 1cff0de860dc..fbe51bc9e84a 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkMuons/CMakeLists.txt
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkMuons/CMakeLists.txt
@@ -9,7 +9,7 @@ find_package( ROOT COMPONENTS Core MathCore )
 # Component(s) in the package:
 #the library is used by the MCP software https://gitlab.cern.ch/atlas-mcp/MuonPerformanceAnalysis
 atlas_add_library( DerivationFrameworkMuonsLib
-   DerivationFrameworkMuons/*.h src/*.cxx src/components/*.cxx
+   DerivationFrameworkMuons/*.h src/*.cxx
    PUBLIC_HEADERS DerivationFrameworkMuons
    INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
    LINK_LIBRARIES ${ROOT_LIBRARIES} AsgTools AthContainers AthenaBaseComps AthenaKernel CaloEvent CaloGeoHelpers DerivationFrameworkInterfaces ExpressionEvaluationLib FourMomUtils GaudiKernel ICaloTrkMuIdTools InDetTrackSelectionToolLib MCTruthClassifierLib RecoToolInterfaces TrigDecisionToolLib TrigMuonMatchingLib TrkExInterfaces TrkParameters TrkSurfaces muonEvent xAODBase xAODCaloEvent xAODEventInfo xAODJet xAODMuon xAODPrimitives xAODTracking xAODTruth )
-- 
GitLab


From 11f47745be4f4fa31c1bfa585bf600f7aee0486d Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Tue, 8 Dec 2020 16:07:38 -0500
Subject: [PATCH 194/225] xAODBTaggingEfficiency: Fix gcc11 warning.

Usused typedef.
---
 .../xAODBTaggingEfficiency/Root/BTaggingTruthTaggingTool.cxx     | 1 -
 1 file changed, 1 deletion(-)

diff --git a/PhysicsAnalysis/JetTagging/JetTagPerformanceCalibration/xAODBTaggingEfficiency/Root/BTaggingTruthTaggingTool.cxx b/PhysicsAnalysis/JetTagging/JetTagPerformanceCalibration/xAODBTaggingEfficiency/Root/BTaggingTruthTaggingTool.cxx
index 3f728ee3f1a8..3d864fa7a1fc 100644
--- a/PhysicsAnalysis/JetTagging/JetTagPerformanceCalibration/xAODBTaggingEfficiency/Root/BTaggingTruthTaggingTool.cxx
+++ b/PhysicsAnalysis/JetTagging/JetTagPerformanceCalibration/xAODBTaggingEfficiency/Root/BTaggingTruthTaggingTool.cxx
@@ -1126,7 +1126,6 @@ StatusCode BTaggingTruthTaggingTool::getDirectTaggedJets(TRFinfo &trfinf,std::ve
 
 
 double BTaggingTruthTaggingTool::getEvtSF(TRFinfo &trfinf,int sys){
-  ANA_CHECK_SET_TYPE (StatusCode);
   double SF = 1.;
   std::vector<bool> is_tagged;
   ANA_CHECK_THROW( getDirectTaggedJets(trfinf,is_tagged) );
-- 
GitLab


From 2f81a69201baf272ade8a688590ac791387b0d93 Mon Sep 17 00:00:00 2001
From: fdelrio <fdelrio@cern.ch>
Date: Mon, 21 Dec 2020 09:27:52 +0100
Subject: [PATCH 195/225] Added cleaning variables for RScan jets

---
 .../python/AntiKt2LCTopoJetsCPContent.py                        | 2 +-
 .../python/AntiKt6LCTopoJetsCPContent.py                        | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/python/AntiKt2LCTopoJetsCPContent.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/python/AntiKt2LCTopoJetsCPContent.py
index 0cfdc2899869..a297308e6338 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/python/AntiKt2LCTopoJetsCPContent.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/python/AntiKt2LCTopoJetsCPContent.py
@@ -4,7 +4,7 @@ AntiKt2LCTopoJetsCPContent = [
 "Kt4LCTopoOriginEventShape",
 "Kt4LCTopoOriginEventShapeAux.Density",
 "AntiKt2LCTopoJets",
-"AntiKt2LCTopoJetsAux.pt.eta.phi.m.JetConstitScaleMomentum_pt.JetConstitScaleMomentum_eta.JetConstitScaleMomentum_phi.JetConstitScaleMomentum_m.NumTrkPt500.SumPtTrkPt500.EnergyPerSampling.ActiveArea4vec_eta.ActiveArea4vec_m.ActiveArea4vec_phi.ActiveArea4vec_pt.DetectorEta.DetectorY.FracSamplingMax.FracSamplingMaxIndex.GhostTrack.Jvt.JVFCorr.JvtRpt.NumTrkPt1000.TrackWidthPt1000.GhostMuonSegmentCount.PartonTruthLabelID.ConeTruthLabelID.HadronConeExclExtendedTruthLabelID.HadronConeExclTruthLabelID.TrueFlavor.Timing",
+"AntiKt2LCTopoJetsAux.pt.eta.phi.m.JetConstitScaleMomentum_pt.JetConstitScaleMomentum_eta.JetConstitScaleMomentum_phi.JetConstitScaleMomentum_m.NumTrkPt500.SumPtTrkPt500.EnergyPerSampling.ActiveArea4vec_eta.ActiveArea4vec_m.ActiveArea4vec_phi.ActiveArea4vec_pt.DetectorEta.DetectorY.FracSamplingMax.FracSamplingMaxIndex.GhostTrack.Jvt.JVFCorr.JvtRpt.NumTrkPt1000.TrackWidthPt1000.GhostMuonSegmentCount.PartonTruthLabelID.ConeTruthLabelID.HadronConeExclExtendedTruthLabelID.HadronConeExclTruthLabelID.TrueFlavor.Timing.EMFrac.HECFrac.AverageLArQF.NegativeE.LArQuality.HECQuality",
 "MET_Track",
 "MET_TrackAux.name.mpx.mpy",
 "PrimaryVertices",
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/python/AntiKt6LCTopoJetsCPContent.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/python/AntiKt6LCTopoJetsCPContent.py
index c88b609afbe6..1dd1e51247f3 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/python/AntiKt6LCTopoJetsCPContent.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkJetEtMiss/python/AntiKt6LCTopoJetsCPContent.py
@@ -4,7 +4,7 @@ AntiKt6LCTopoJetsCPContent = [
 "Kt4LCTopoOriginEventShape",
 "Kt4LCTopoOriginEventShapeAux.Density",
 "AntiKt6LCTopoJets",
-"AntiKt6LCTopoJetsAux.pt.eta.phi.m.JetConstitScaleMomentum_pt.JetConstitScaleMomentum_eta.JetConstitScaleMomentum_phi.JetConstitScaleMomentum_m.NumTrkPt500.SumPtTrkPt500.EnergyPerSampling.ActiveArea4vec_eta.ActiveArea4vec_m.ActiveArea4vec_phi.ActiveArea4vec_pt.DetectorEta.DetectorY.FracSamplingMax.FracSamplingMaxIndex.GhostTrack.Jvt.JVFCorr.JvtRpt.NumTrkPt1000.TrackWidthPt1000.GhostMuonSegmentCount.PartonTruthLabelID.ConeTruthLabelID.HadronConeExclExtendedTruthLabelID.HadronConeExclTruthLabelID.TrueFlavor.Timing",
+"AntiKt6LCTopoJetsAux.pt.eta.phi.m.JetConstitScaleMomentum_pt.JetConstitScaleMomentum_eta.JetConstitScaleMomentum_phi.JetConstitScaleMomentum_m.NumTrkPt500.SumPtTrkPt500.EnergyPerSampling.ActiveArea4vec_eta.ActiveArea4vec_m.ActiveArea4vec_phi.ActiveArea4vec_pt.DetectorEta.DetectorY.FracSamplingMax.FracSamplingMaxIndex.GhostTrack.Jvt.JVFCorr.JvtRpt.NumTrkPt1000.TrackWidthPt1000.GhostMuonSegmentCount.PartonTruthLabelID.ConeTruthLabelID.HadronConeExclExtendedTruthLabelID.HadronConeExclTruthLabelID.TrueFlavor.Timing.EMFrac.HECFrac.AverageLArQF.NegativeE.LArQuality.HECQuality",
 "MET_Track",
 "MET_TrackAux.name.mpx.mpy",
 "PrimaryVertices",
-- 
GitLab


From 1d04b1c38dd50959c382cba64b2b133005a5da9b Mon Sep 17 00:00:00 2001
From: Alaettin Serhan Mete <alaettin.serhan.mete@cern.ch>
Date: Mon, 21 Dec 2020 08:57:10 +0000
Subject: [PATCH 196/225] PerfMonComps: Add some additional information to the
 PerfMonMTSvc output

---
 .../PerfMonComps/src/PerfMonMTSvc.cxx         | 193 +++++++++++++-----
 .../PerfMonComps/src/PerfMonMTSvc.h           |  10 +-
 .../PerfMonComps/src/PerfMonMTUtils.h         |   2 +
 3 files changed, 147 insertions(+), 58 deletions(-)

diff --git a/Control/PerformanceMonitoring/PerfMonComps/src/PerfMonMTSvc.cxx b/Control/PerformanceMonitoring/PerfMonComps/src/PerfMonMTSvc.cxx
index bd14c1b9e88c..59cafdc5ecef 100644
--- a/Control/PerformanceMonitoring/PerfMonComps/src/PerfMonMTSvc.cxx
+++ b/Control/PerformanceMonitoring/PerfMonComps/src/PerfMonMTSvc.cxx
@@ -13,10 +13,15 @@
 // PerfMonComps includes
 #include "PerfMonMTSvc.h"
 #include "PerfMonUtils.h"  // borrow from existing code
+#include "SemiDetMisc.h"   // borrow from existing code
 
 // STD includes
 #include <algorithm>
 
+// Boost includes
+#include "boost/format.hpp"
+#include "boost/filesystem.hpp"
+
 /*
  * Constructor
  */
@@ -137,7 +142,7 @@ void PerfMonMTSvc::startAud(const std::string& stepName, const std::string& comp
     if (!m_doComponentLevelMonitoring) return;
 
     // Start component auditing
-    auto ctx = Gaudi::Hive::currentContext(); 
+    auto ctx = Gaudi::Hive::currentContext();
     startCompAud(stepName, compName, ctx);
   }
 }
@@ -155,7 +160,7 @@ void PerfMonMTSvc::stopAud(const std::string& stepName, const std::string& compN
     if (!m_doComponentLevelMonitoring) return;
 
     // Stop component auditing
-    auto ctx = Gaudi::Hive::currentContext(); 
+    auto ctx = Gaudi::Hive::currentContext();
     stopCompAud(stepName, compName, ctx);
   }
 }
@@ -207,8 +212,8 @@ void PerfMonMTSvc::startCompAud(const std::string& stepName, const std::string&
   // Generate State
   PMonMT::StepComp currentState = generate_state(stepName, compName);
 
-  // Check if this is the first time calling if so create the mesurement data if not use the existing one. 
-  // Metrics are collected per slot then aggregated before reporting 
+  // Check if this is the first time calling if so create the mesurement data if not use the existing one.
+  // Metrics are collected per slot then aggregated before reporting
   data_map_t& compLevelDataMap = m_compLevelDataMapVec[ctx.valid() ? ctx.slot() : 0];
   if(compLevelDataMap.find(currentState) == compLevelDataMap.end()) {
     compLevelDataMap[currentState] = new PMonMT::MeasurementData();
@@ -312,6 +317,33 @@ bool PerfMonMTSvc::isPower(uint64_t input, uint64_t base) {
   return (input == 1);
 }
 
+/*
+ * Helper finction to estimate CPU efficiency
+ */
+int PerfMonMTSvc::getCpuEfficiency() const {
+
+  // In AthenaMT only the event-loop is executed concurrently
+  // In this metric, we scale the event-loop wall-time by
+  // the number of slots to take the concurrency into account
+  // Then we divide the total cpu-time by this number
+  // It's A metric not THE metric...
+
+  const float totalCpuTime =
+   m_snapshotData[CONFIGURE].getDeltaCPU()  +
+   m_snapshotData[INITIALIZE].getDeltaCPU() +
+   m_snapshotData[EXECUTE].getDeltaCPU()    +
+   m_snapshotData[FINALIZE].getDeltaCPU();
+
+  const float scaledWallTime =
+   m_snapshotData[CONFIGURE].getDeltaWall()  * 1. +
+   m_snapshotData[INITIALIZE].getDeltaWall() * 1. +
+   m_snapshotData[EXECUTE].getDeltaWall()    * m_numberOfSlots +
+   m_snapshotData[FINALIZE].getDeltaWall()   * 1.;
+
+  return ( scaledWallTime > 0 ? totalCpuTime / scaledWallTime * 100. : 0 );
+
+}
+
 /*
  * Report the results to the log and the JSON file
  */
@@ -345,6 +377,7 @@ void PerfMonMTSvc::report2Log() {
   // Summary and system information
   report2Log_Summary();
   report2Log_CpuInfo();
+  report2Log_EnvInfo();
 }
 
 /*
@@ -377,7 +410,7 @@ void PerfMonMTSvc::report2Log_ComponentLevel() {
   ATH_MSG_INFO("                             Component Level Monitoring                                ");
   ATH_MSG_INFO("=======================================================================================");
 
-  ATH_MSG_INFO(format("%1% %|15t|%2% %|25t|%3% %|40t|%4% %|55t|%5% %|75t|%6%") % "Step" % "Count" % "CPU Time [ms]" % 
+  ATH_MSG_INFO(format("%1% %|15t|%2% %|25t|%3% %|40t|%4% %|55t|%5% %|75t|%6%") % "Step" % "Count" % "CPU Time [ms]" %
                "Vmem [kB]" % "Malloc [kB]" % "Component");
 
   ATH_MSG_INFO("---------------------------------------------------------------------------------------");
@@ -408,7 +441,7 @@ void PerfMonMTSvc::report2Log_ComponentLevel() {
                    it.second->getCallCount() % it.second->getDeltaCPU() % it.second->getDeltaVmem() %
                    it.second->getDeltaMalloc() % it.first.compName);
     }
-    if(counter>0) { 
+    if(counter>0) {
       ATH_MSG_INFO("=======================================================================================");
     }
   }
@@ -426,8 +459,8 @@ void PerfMonMTSvc::report2Log_EventLevel_instant() const {
   long pss = m_eventLevelData.getEventLevelPss(m_eventCounter);
   long swap = m_eventLevelData.getEventLevelSwap(m_eventCounter);
 
-  ATH_MSG_INFO("Event [" << std::setw(5) << m_eventCounter << "] CPU Time: " << scaleTime(cpu_time) << 
-               ", Wall Time: " <<  scaleTime(wall_time) << ", Vmem: " << scaleMem(vmem) << 
+  ATH_MSG_INFO("Event [" << std::setw(5) << m_eventCounter << "] CPU Time: " << scaleTime(cpu_time) <<
+               ", Wall Time: " <<  scaleTime(wall_time) << ", Vmem: " << scaleMem(vmem) <<
                ", Rss: " << scaleMem(rss) << ", Pss: " << scaleMem(pss) << ", Swap: " << scaleMem(swap));
 }
 
@@ -438,8 +471,8 @@ void PerfMonMTSvc::report2Log_EventLevel() {
   using boost::format;
 
   ATH_MSG_INFO("                                Event Level Monitoring                                 ");
-  ATH_MSG_INFO("                 (Only first " << m_eventLoopMsgLimit.toString() <<
-               " measurements are explicitly printed)");
+  ATH_MSG_INFO("        (Only the first " << m_eventLoopMsgLimit.toString() <<
+               " and the last measurements are explicitly printed)");
   ATH_MSG_INFO("=======================================================================================");
 
   ATH_MSG_INFO(format("%1% %|16t|%2% %|28t|%3% %|40t|%4% %|52t|%5% %|64t|%6% %|76t|%7%") % "Event" % "CPU [s]" %
@@ -448,14 +481,19 @@ void PerfMonMTSvc::report2Log_EventLevel() {
   ATH_MSG_INFO("---------------------------------------------------------------------------------------");
 
   m_eventLoopMsgCounter = 0; // reset counter
+  unsigned long nMeasurements = m_eventLevelData.getNMeasurements();
 
   for (const auto& it : m_eventLevelData.getEventLevelData()) {
-    if(m_eventLoopMsgCounter < m_eventLoopMsgLimit) {
+    // Print
+    if(m_eventLoopMsgCounter < m_eventLoopMsgLimit || m_eventLoopMsgCounter == nMeasurements - 1) {
+      if(m_eventLoopMsgCounter > m_eventLoopMsgLimit) {
+        ATH_MSG_INFO(format("%|=87|") % "...");
+      }
       ATH_MSG_INFO(format("%1% %|16t|%2$.2f %|28t|%3$.2f %|40t|%4% %|52t|%5% %|64t|%6% %|76t|%7%") % it.first %
                    (it.second.cpu_time * 0.001) % (it.second.wall_time * 0.001) % it.second.mem_stats.at("vmem") %
                    it.second.mem_stats.at("rss") % it.second.mem_stats.at("pss") % it.second.mem_stats.at("swap"));
-      m_eventLoopMsgCounter++;
     }
+    m_eventLoopMsgCounter++;
     // Add to leak estimate
     if (it.first >= 25) {
       m_fit_vmem.addPoint(it.first, it.second.mem_stats.at("vmem"));
@@ -471,7 +509,7 @@ void PerfMonMTSvc::report2Log_EventLevel() {
 void PerfMonMTSvc::report2Log_Summary() {
   using boost::format;
 
-  ATH_MSG_INFO("                                 Snaphots Summary                                      ");
+  ATH_MSG_INFO("                                Snapshots Summary                                      ");
   ATH_MSG_INFO("=======================================================================================");
 
   ATH_MSG_INFO(format("%1% %|13t|%2% %|25t|%3% %|37t|%4% %|44t|%5% %|55t|%6% %|66t|%7% %|77t|%8%") % "Step" %
@@ -495,6 +533,7 @@ void PerfMonMTSvc::report2Log_Summary() {
                (m_snapshotData[EXECUTE].getDeltaCPU() / m_eventCounter));
   ATH_MSG_INFO(format("%1% %|35t|%2$.3f ") % "Events per second:" %
                (m_eventCounter / m_snapshotData[EXECUTE].getDeltaWall() * 1000.));
+  ATH_MSG_INFO(format("%1% %|35t|%2% ") % "CPU utilization efficiency [%]:" % getCpuEfficiency());
 
   if (m_doEventLoopMonitoring) {
     ATH_MSG_INFO("***************************************************************************************");
@@ -523,10 +562,28 @@ void PerfMonMTSvc::report2Log_CpuInfo() const {
 
   ATH_MSG_INFO(format("%1% %|34t|%2% ") % "CPU Model:" % get_cpu_model_info());
   ATH_MSG_INFO(format("%1% %|35t|%2% ") % "Number of Available Cores:" % get_cpu_core_info());
+  ATH_MSG_INFO(format("%1% %|35t|%2% ") % "Total Memory:" % scaleMem(get_memory_info()));
 
   ATH_MSG_INFO("=======================================================================================");
 }
 
+/*
+ * Report run-time enviroment information
+ */
+void PerfMonMTSvc::report2Log_EnvInfo() const {
+  using boost::format;
+  using boost::filesystem::path;
+
+  ATH_MSG_INFO("                               Environment Information                                 ");
+  ATH_MSG_INFO("=======================================================================================");
+
+  ATH_MSG_INFO(format("%1% %|35t|%2% ") % "Malloc Library:" % path(PMonSD::symb2lib("malloc")).filename().string());
+  ATH_MSG_INFO(format("%1% %|35t|%2% ") % "Math Library:" % path(PMonSD::symb2lib("atan2")).filename().string());
+
+  ATH_MSG_INFO("=======================================================================================");
+
+}
+
 /*
  * Report data to JSON
  */
@@ -569,7 +626,7 @@ void PerfMonMTSvc::report2JsonFile() {
  * Report summary data to JSON
  */
 void PerfMonMTSvc::report2JsonFile_Summary(nlohmann::json& j) const {
-  
+
   // Report snapshot level results
   for(int i=0; i < NSNAPSHOTS; i++){
 
@@ -617,29 +674,43 @@ void PerfMonMTSvc::report2JsonFile_Summary(nlohmann::json& j) const {
   // Report Sys info
   const std::string cpuModel = get_cpu_model_info();
   const int coreNum = get_cpu_core_info();
+  const long totMem = get_memory_info();
 
   j["summary"]["sysInfo"] = {{"cpuModel", cpuModel},
-                             {"coreNum", coreNum}};
+                             {"coreNum", coreNum},
+                             {"totMem", totMem}};
+
+  // Report Enviroment info
+  const std::string mallocLib = boost::filesystem::path(PMonSD::symb2lib("malloc")).filename().string();
+  const std::string mathLib = boost::filesystem::path(PMonSD::symb2lib("atan2")).filename().string();
+
+  j["summary"]["envInfo"] = {{"mallocLib", mallocLib},
+                             {"mathLib", mathLib}};
+
+  // Report CPU utilization efficiency;
+  const int cpuUtilEff = getCpuEfficiency();
+  j["summary"]["misc"] = {{"cpuUtilEff", cpuUtilEff}};
+
 }
 
 void PerfMonMTSvc::report2JsonFile_ComponentLevel(nlohmann::json& j) const {
 
   for (const auto& dataMapPerStep : m_stdoutVec_serial) {
-    
+
     for(const auto& meas : dataMapPerStep){
 
       const std::string step = meas.first.stepName;
-      const std::string component = meas.first.compName; 
+      const std::string component = meas.first.compName;
       const uint64_t count = meas.second->getCallCount();
       const double cpuTime = meas.second->getDeltaCPU();
-      const long vmem  = meas.second->getDeltaVmem(); 
+      const long vmem  = meas.second->getDeltaVmem();
       const int mall = meas.second->getDeltaMalloc();
 
       j["componentLevel"][step][component] = {{"count", count},
                                               {"cpuTime", cpuTime},
                                               {"vmem", vmem},
                                               {"malloc", mall}};
-    }    
+    }
 
   }
 
@@ -648,7 +719,7 @@ void PerfMonMTSvc::report2JsonFile_ComponentLevel(nlohmann::json& j) const {
 void PerfMonMTSvc::report2JsonFile_EventLevel(nlohmann::json& j) const {
 
   for (const auto& it : m_eventLevelData.getEventLevelData()) {
-    
+
     const uint64_t event = it.first;
     const double cpuTime = it.second.cpu_time;
     const double wallTime = it.second.wall_time;
@@ -724,7 +795,7 @@ void PerfMonMTSvc::divideData2Steps() {
 std::string PerfMonMTSvc::scaleTime(double timeMeas) const {
   // Not a huge fan of this, we should eventually unify the types
   // Just want to be explicit about what's happening
-  long ms = (long) timeMeas; 
+  long ms = (long) timeMeas;
 
   // Compute hrs and offset
   auto hrs = ms / 3600000;
@@ -739,13 +810,18 @@ std::string PerfMonMTSvc::scaleTime(double timeMeas) const {
   // Primarily care about H:M:S
   std::stringstream ss;
   ss.fill('0');
-  ss << std::setw(2) << hrs << "h" << 
-        std::setw(2) << mins << "m" << 
+  ss << std::setw(2) << hrs << "h" <<
+        std::setw(2) << mins << "m" <<
         std::setw(2) << secs << "s";
   return ss.str();
 }
 
 std::string PerfMonMTSvc::scaleMem(long memMeas) const {
+  // The memory measurements should be positive
+  // Only delta(A,B) can go negative but this method
+  // is not used for those cases, at least for now
+  if (memMeas<0) return "NA";
+
   std::ostringstream ss;
   ss << std::fixed;
   ss << std::setprecision(2);
@@ -789,43 +865,48 @@ std::string PerfMonMTSvc::scaleMem(long memMeas) const {
 /*
  * Collect some hardware information
  */
-std::string PerfMonMTSvc::get_cpu_model_info() const {
-  std::string cpu_model;
-
-  std::ifstream file("/proc/cpuinfo");
-  std::string line;
-  if (file.is_open()) {
-    std::string delimiter = ":";
-    while (getline(file, line)) {
-      std::string key = line.substr(0, line.find(delimiter));
-      if (key == "model name	") {
-        cpu_model = line.substr(line.find(delimiter) + 1, line.length());
-        break;
+std::string PerfMonMTSvc::get_info_from_file(const std::string& fileName,
+                                             const std::string& fieldName) const {
+  // Helper function to read files of type Key : Value
+  // Returns the last instance if there are multiple matches
+  // This is because we use this method to get the processor count
+  std::string result{""};
+
+  std::ifstream file{fileName};
+  std::string line{""};
+
+  while (std::getline(file, line)) {
+    if (line.empty()) continue;
+    size_t splitIdx = line.find(":");
+    if (splitIdx != std::string::npos) {
+      std::string val = line.substr(splitIdx + 1);
+      if (val.empty()) continue;
+      if (line.size() >= fieldName.size() &&
+          line.compare(0, fieldName.size(), fieldName) == 0) {
+        result = val;
       }
     }
-    file.close();
-    return cpu_model;
-  } else {
-    return "Unable to open /proc/cpuinfo";
   }
+
+  file.close();
+
+  return result;
+}
+
+std::string PerfMonMTSvc::get_cpu_model_info() const {
+  return get_info_from_file("/proc/cpuinfo","model name") +
+         get_info_from_file("/proc/cpuinfo","cache size");
 }
 
 int PerfMonMTSvc::get_cpu_core_info() const {
-  int logical_core_num = 0;
-
-  std::ifstream file("/proc/cpuinfo");
-  std::string line;
-  if (file.is_open()) {
-    std::string delimiter = ":";
-    while (getline(file, line)) {
-      std::string key = line.substr(0, line.find(delimiter));
-      if (key == "processor	") {
-        logical_core_num++;
-      }
-    }
-    file.close();
-    return logical_core_num;
-  } else {
-    return -1;
-  }
+  std::string val = get_info_from_file("/proc/cpuinfo","processor");
+  if (val.empty()) return 0;
+  return std::stoi(val) + 1;
+}
+
+long PerfMonMTSvc::get_memory_info() const {
+  std::string val = get_info_from_file("/proc/meminfo","MemTotal");
+  if (val.empty()) return 0;
+  val = val.substr(0, val.size() - 3);  // strip the trailing kB
+  return std::stol(val);
 }
diff --git a/Control/PerformanceMonitoring/PerfMonComps/src/PerfMonMTSvc.h b/Control/PerformanceMonitoring/PerfMonComps/src/PerfMonMTSvc.h
index d825d8a6a1b2..b432a7484918 100644
--- a/Control/PerformanceMonitoring/PerfMonComps/src/PerfMonMTSvc.h
+++ b/Control/PerformanceMonitoring/PerfMonComps/src/PerfMonMTSvc.h
@@ -28,8 +28,6 @@
 #include <iomanip>
 #include <nlohmann/json.hpp>
 
-#include "boost/format.hpp"
-
 // Other Libraries
 #include <algorithm>
 #include <cmath>
@@ -86,6 +84,7 @@ class PerfMonMTSvc : virtual public IPerfMonMTSvc, virtual public IIncidentListe
   void report2Log_EventLevel();
   void report2Log_Summary();  // make it const
   void report2Log_CpuInfo() const;
+  void report2Log_EnvInfo() const;
 
   /// Report to the JSON File
   void report2JsonFile();
@@ -104,8 +103,12 @@ class PerfMonMTSvc : virtual public IPerfMonMTSvc, virtual public IIncidentListe
 
   bool isCheckPoint();
 
+  /// A few helper methods to get system information
+  /// These should be carried to PerfMonMTUtils at some point
+  std::string get_info_from_file(const std::string& fileName, const std::string& fieldName) const;
   std::string get_cpu_model_info() const;
   int get_cpu_core_info() const;
+  long get_memory_info() const;
 
   PMonMT::StepComp generate_state(const std::string& stepName, const std::string& compName) const;
 
@@ -196,6 +199,9 @@ class PerfMonMTSvc : virtual public IPerfMonMTSvc, virtual public IIncidentListe
   PerfMon::LinFitSglPass m_fit_vmem;
   PerfMon::LinFitSglPass m_fit_pss;
 
+  // Estimate CPU efficiency
+  int getCpuEfficiency() const;
+
 };  // class PerfMonMTSvc
 
 #endif  // PERFMONCOMPS_PERFMONMTSVC_H
diff --git a/Control/PerformanceMonitoring/PerfMonComps/src/PerfMonMTUtils.h b/Control/PerformanceMonitoring/PerfMonComps/src/PerfMonMTUtils.h
index 2b592779bd74..26b0cdb49c07 100644
--- a/Control/PerformanceMonitoring/PerfMonComps/src/PerfMonMTUtils.h
+++ b/Control/PerformanceMonitoring/PerfMonComps/src/PerfMonMTUtils.h
@@ -191,6 +191,8 @@ struct MeasurementData {
 
   event_meas_map_t getEventLevelData() const { return m_eventLevel_delta_map; }
 
+  unsigned long getNMeasurements() const { return m_eventLevel_delta_map.size(); }
+
   double getEventLevelCpuTime(unsigned long long event_count) const {
     return m_eventLevel_delta_map.at(event_count).cpu_time;
   }
-- 
GitLab


From 527b8a5ec725c4a74ae4d503f6896eb3fa2234bc Mon Sep 17 00:00:00 2001
From: Frank Winklmeier <fwinkl@cern>
Date: Mon, 21 Dec 2020 10:18:19 +0100
Subject: [PATCH 197/225] Athena: Add dependency on Frontier_Client

The Frontier client (libfrontier_client.so) was brought in by the now
deleted `TrigConfDBConnection` package. Add this dependency explicitly
to the Athena project (as is already the case for AthGeneration).
---
 Projects/Athena/CMakeLists.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Projects/Athena/CMakeLists.txt b/Projects/Athena/CMakeLists.txt
index 7ebc708d1a56..807280b7e7cb 100644
--- a/Projects/Athena/CMakeLists.txt
+++ b/Projects/Athena/CMakeLists.txt
@@ -76,6 +76,7 @@ if( AtlasHIP_FOUND )
 endif()
 
 # Find some auxiliary packages:
+find_package( Frontier_Client )
 find_package( Doxygen )
 find_package( PNG )
 find_package( VDT )
-- 
GitLab


From 149f360fe109ecd35845d72328543d927d0a5864 Mon Sep 17 00:00:00 2001
From: MatousVozak <matous.vozak@cern.ch>
Date: Mon, 21 Dec 2020 10:47:37 +0100
Subject: [PATCH 198/225] modularise EFID in IDTrig, change i/o of
 configuration of PT algs

---
 .../TrigInDetConfig/python/EFIDTracking.py    | 605 ++++++------------
 .../TrigInDetConfig/python/InDetPT.py         |  18 +-
 .../TrigInDetConfig/python/InDetTrigCommon.py | 385 ++++++++++-
 3 files changed, 565 insertions(+), 443 deletions(-)

diff --git a/Trigger/TrigTools/TrigInDetConfig/python/EFIDTracking.py b/Trigger/TrigTools/TrigInDetConfig/python/EFIDTracking.py
index 4a87c9fe72e5..839a58ba4ab2 100644
--- a/Trigger/TrigTools/TrigInDetConfig/python/EFIDTracking.py
+++ b/Trigger/TrigTools/TrigInDetConfig/python/EFIDTracking.py
@@ -1,242 +1,144 @@
-#  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 #
-#           Setup of precision tracking
+#           Setup of offline pattern recognition tracking for ID Trigger
+#Heavily inspired by the offline version:
+#https://gitlab.cern.ch/atlas/athena/blob/master/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredNewTrackingSiPattern.py
 
 from __future__ import print_function
 
 from AthenaCommon.Include import include
 include.block("InDetTrigRecExample/EFInDetConfig.py")
 include("InDetTrigRecExample/InDetTrigRec_jobOptions.py") # this is needed to get InDetTrigFlags
-#from InDetTrigRecExample.InDetTrigFlags import InDetTrigFlags
 
 from AthenaCommon.Logging import logging 
 log = logging.getLogger("EFIDTracking")
 
-#Start using already decided naming conventions
-#TODO: remap might not be needed in the end once this is consistent with FTF configuration
-#def remap_signature( signature ):
-#   if signature == 'electron':
-#       return 'Electron'
-#   else:
-#        return signature
-
-#def makeInDetPrecisionTracking( whichSignature, verifier = False, inputFTFtracks='TrigFastTrackFinder_Tracks', outputTrackPrefixName = "HLT_ID", rois = 'EMViewRoIs' ):
-#  doTRTextension = False 
-#  ptAlgs = [] #List containing all the precision tracking algorithms hence every new added alg has to be appended to the list
-
-
-  #-----------------------------------------------------------------------------
-  #                        Naming conventions
-
-
-
-
-
-  #-----------------------------------------------------------------------------
-  #                        Verifying input data for the algorithms
-  
-  #If run in views need to check data dependancies!
-  #NOTE: this seems necessary only when PT is called from a different view than FTF otherwise causes stalls
-#  if verifier:
-#         verifier.DataObjects += [  ( 'InDet::PixelGangedClusterAmbiguities' , 'StoreGateSvc+TrigPixelClusterAmbiguitiesMap' ),
-#                                  ( 'TrackCollection' , 'StoreGateSvc+' + inputFTFtracks ) ] 
-      
-  
-  #-----------------------------------------------------------------------------
-  #                        Pattern recognition stage
-#def __init__(self, InputCollections = None, ResolvedTrackCollectionKey = None, SiSPSeededTrackCollectionKey = None , NewTrackingCuts = None, TrackCollectionKeys=[] , TrackCollectionTruthKeys=[]):
-
-#Start using already decided naming conventions
-#TODO: remap might not be needed in the end once this is consistent with FTF configuration
-#TODO unify with PT remap
-#def remap_signature( signature ):
-#   if signature == 'electron':
-#       return 'Electron'
-#   else:
-#        return signature
 
+#Create a view verifier for necessary data collections
+def get_idtrig_view_verifier(name):
+   import AthenaCommon.CfgMgr as CfgMgr
+   from AthenaCommon.GlobalFlags import globalflags
+   from .InDetTrigCollectionKeys import  TrigPixelKeys, TrigSCTKeys
+   from InDetRecExample.InDetKeys import InDetKeys
+   from TrigInDetConfig.TrigInDetConfig import InDetCacheNames
+   viewDataVerifier = CfgMgr.AthViews__ViewDataVerifier( name )
+   viewDataVerifier.DataObjects = [
+                                     ( 'InDet::SCT_ClusterContainer',   TrigSCTKeys.Clusters ),
+                                     ( 'InDet::PixelClusterContainer',  TrigPixelKeys.Clusters ), 
+                                     ( 'SpacePointContainer',           TrigSCTKeys.SpacePoints ),  
+                                     ( 'SpacePointContainer',           TrigPixelKeys.SpacePoints ),
+   #                                  ( 'SpacePointOverlapCollection',   'StoreGateSvc+OverlapSpacePoints' ), 
+   #                                  ( 'IDCInDetBSErrContainer',        'StoreGateSvc+SCT_FlaggedCondData_TRIG' ), 
+   #                                  ( 'IDCInDetBSErrContainer',        'StoreGateSvc+SCT_ByteStreamErrs' ), 
+   #                                  ( 'IDCInDetBSErrContainer',        'StoreGateSvc+PixelByteStreamErrs' ),
+   #    #( 'xAOD::EventInfo', 'StoreGateSvc+EventInfo' ) 
+                                     ]
+   
+   viewDataVerifier.DataObjects = [( 'InDet::PixelClusterContainerCache' , InDetCacheNames.Pixel_ClusterKey ),
+                                   ( 'PixelRDO_Cache' , InDetCacheNames.PixRDOCacheKey ),
+                                   ( 'InDet::SCT_ClusterContainerCache' , InDetCacheNames.SCT_ClusterKey ),
+                                   ( 'SCT_RDO_Cache' , InDetCacheNames.SCTRDOCacheKey ),
+                                   ( 'SpacePointCache' , InDetCacheNames.SpacePointCachePix ),
+                                   ( 'SpacePointCache' , InDetCacheNames.SpacePointCacheSCT ),
+                                   ( 'IDCInDetBSErrContainer_Cache' , InDetCacheNames.PixBSErrCacheKey ),
+                                   ( 'IDCInDetBSErrContainer_Cache' , InDetCacheNames.SCTBSErrCacheKey ),
+                                   ( 'IDCInDetBSErrContainer_Cache' , InDetCacheNames.SCTFlaggedCondCacheKey ),
+                                   ( 'xAOD::EventInfo' , 'StoreGateSvc+EventInfo' ),
+                                   ( 'TagInfo' , 'DetectorStore+ProcessingTags' )]
+   
+   # Load RDOs if we aren't loading bytestream
+   from AthenaCommon.AlgSequence import AlgSequence
+   topSequence = AlgSequence()
+   
+   topSequence.SGInputLoader.Load += [ ( 'TagInfo' , 'DetectorStore+ProcessingTags' ) ]
+   
+   if not globalflags.InputFormat.is_bytestream():
+     viewDataVerifier.DataObjects +=   [( 'PixelRDO_Container' , InDetKeys.PixelRDOs() ),
+                                        ( 'SCT_RDO_Container' , InDetKeys.SCT_RDOs() ),
+                                        ( 'IDCInDetBSErrContainer' , InDetKeys.PixelByteStreamErrs() ),
+                                        ( 'IDCInDetBSErrContainer' , InDetKeys.SCT_ByteStreamErrs() )]
+     topSequence.SGInputLoader.Load += [( 'PixelRDO_Container' , InDetKeys.PixelRDOs() ),
+                                        ( 'SCT_RDO_Container' , InDetKeys.SCT_RDOs() ),
+                                        ( 'IDCInDetBSErrContainer' , InDetKeys.PixelByteStreamErrs() ),
+                                        ( 'IDCInDetBSErrContainer' , InDetKeys.SCT_ByteStreamErrs() )]
+   
+   return viewDataVerifier
+
+
+#Temporary fix before we port offline cuts to trigger code, we are using offline configuration
+def remapToOffline( name ):
+   if name == 'cosmics':
+      return 'Cosmic'
+   else:
+       return name
+
+def makeInDetPatternRecognition( config, verifier = 'IDTrigViewDataVerifier'  ):
+      viewAlgs = [] #list of all algs running in this module
 
-def makeInDetPatternRecognition( whichSignature, rois = 'EMViewRoIs', InputCollections=None,  NewTrackingCuts = None ):
-      from InDetRecExample.InDetJobProperties import InDetFlags
-      #Global keys/names for collections 
-      from InDetRecExample.InDetKeys          import InDetKeys #FIXME: to be replaced with Trig keys?
-      from .InDetTrigCollectionKeys import  TrigPixelKeys, TrigSCTKeys
+      #Load necessary data
+      dataVerifier = None
+      #FIXME: Should not be necessary
+      if verifier:
+         dataVerifier = get_idtrig_view_verifier(verifier+config.name)
+         viewAlgs.append( dataVerifier )
 
-      from AthenaCommon.DetFlags import DetFlags
 
-      from AthenaCommon.AppMgr import ToolSvc
+      #FIXME: For now id setup but eventually port parameters into ConfigSetting in TrigInDetConfig pkg
+      from InDetRecExample.ConfiguredNewTrackingCuts import ConfiguredNewTrackingCuts
+      from InDetTrigRecExample.InDetTrigFlags import InDetTrigFlags
+      offName = remapToOffline( config.name )
+      trackingCuts = ConfiguredNewTrackingCuts( offName ) #FIXME: replace cosmic 
+      trackingCuts.__indetflags = InDetTrigFlags
 
-      prefix     = 'InDetTrigMT'
-      suffix =  '_%s'%whichSignature if whichSignature else '' 
-      #Final output track collection
-      #SiSPSeededTrackCollectionKey = "SiSPSeededTracks_%s"%whichSignature 
-      outEFIDTracks             = "HLT_IDTrkTrack_%s_%s"         %( whichSignature, 'EFID')
-      outEFIDTrackParticles     = "HLT_IDTrack_%s_%s"            %( whichSignature, 'EFID')
+      #TODO: to be taken from config info
+      #prefix     = 'InDetTrigMT'
+      #suffix     = '_%s'%whichSignature if whichSignature else '' 
 
+      #outEFIDTracks             = "HLT_IDTrkTrack_%s_%s"         %( whichSignature, 'EFID')
+      #outEFIDTrackParticles     = "HLT_IDTrack_%s_%s"            %( whichSignature, 'EFID')
 
 
-      viewAlgs = [] #list of all algs running in this module
-      #
       # --- decide if use the association tool
-      #
       #FIXME: Make the same decision as offline (based on the tracking cuts)?
-      #if (len(InputCollections) > 0) and (NewTrackingCuts.mode() == "LowPt" or NewTrackingCuts.mode() == "VeryLowPt" or NewTrackingCuts.mode() == "LargeD0" or NewTrackingCuts.mode() == "LowPtLargeD0" or NewTrackingCuts.mode() == "BeamGas" or NewTrackingCuts.mode() == "ForwardTracks" or NewTrackingCuts.mode() == "ForwardSLHCTracks"  or NewTrackingCuts.mode() == "Disappearing" or NewTrackingCuts.mode() == "VeryForwardSLHCTracks" or NewTrackingCuts.mode() == "SLHCConversionFinding"):
-
-      #Why not use association tool? what are the cases when not needed?
+      #Are all of these needed?
+      #if (len(InputCollections) > 0) and (trackingCuts.mode() == "LowPt" or trackingCuts.mode() == "VeryLowPt" or trackingCuts.mode() == "LargeD0" or trackingCuts.mode() == "LowPtLargeD0" or trackingCuts.mode() == "BeamGas" or trackingCuts.mode() == "ForwardTracks" or trackingCuts.mode() == "ForwardSLHCTracks"  or trackingCuts.mode() == "Disappearing" or trackingCuts.mode() == "VeryForwardSLHCTracks" or trackingCuts.mode() == "SLHCConversionFinding"):
       #usePrdAssociationTool = True
       #else:
-      usePrdAssociationTool = False
-
-
-      import InDetRecExample.TrackingCommon as TrackingCommon
+      usePrdAssociationTool = False #Keep false for now
+      #Do we actually need it?
       if usePrdAssociationTool:
+         from .InDetTrigCommon import prdAssociation_builder
          print ('Running SiSPseedTrackFinder!')
-         #FIXME: switch to naming based on tracking
+         InputCollections = None #Dummy atm
+         prdAssociation = prdAssociation_builder( InputCollections )
+         viewAlgs.append( prdAssociation )
 
-         #FIXME: If so:
-         # 1] Get a new association tool
-         #associationTool = TrackingCommon.getInDetTrigPRDtoTrackMapToolGangedPixels(),
 
-         # 2] Use the ganged pixel from here?
-         #from InDetTrigRecExample.InDetTrigConfigRecLoadTools import InDetTrigPrdAssociationTool
-
-         # 3] Create the new one as in offline tracking:
-         InDetTrigPrdAssociation = TrackingCommon.getInDetTrackPRD_Association(namePrefix     = prefix,
-                                                                               nameSuffix     = suffix,
-                                                                               TracksName     = list(InputCollections))#This is readHandle #What input collection Thought there are no tracks at this point??! 
-         # 4] if so do I use normal or ganged?
-         #from InDetAssociationTools.InDetAssociationToolsConf import InDet__InDetPRD_AssociationToolGangedPixels
-         #InDetTrigPrdAssociationl = InDet__InDetPRD_AssociationToolGangedPixels(name = "%sPrdAssociationTool%s"%(prefix,suffix),
-         #                                                                          PixelClusterAmbiguitiesMapName = TrigPixelKeys.PRDtoTrackMap )
-         viewAlgs.append( InDetTrigPrdAssociation )
+      #-----------------------------------------------------------------------------
+      #                      Track building stage
 
 
       #FIXME? use trigger flags?
+      # What are the instances when we don't need this?
       #if InDetFlags.doSiSPSeededTrackFinder():
-      doSiSPSeededTrackFinder = True
+      doSiSPSeededTrackFinder = True #True by default to test this
       if doSiSPSeededTrackFinder:
          print ('Running SiSPseedTrackFinder!')
 
-         #FIXME: Need to add different options based on the 
-         from SiSpacePointsSeedTool_xk.SiSpacePointsSeedTool_xkConf import InDet__SiSpacePointsSeedMaker_ATLxk as SiSpacePointsSeedMaker
-
-
-         InDetSiSpacePointsSeedMaker = SiSpacePointsSeedMaker (      name                   = "%sInDetSpSeedsMaker%s"%(prefix, suffix), #+NewTrackingCuts.extension(),
-                                                                     pTmin                  = NewTrackingCuts.minPT(),
-                                                                     maxdImpact             = NewTrackingCuts.maxPrimaryImpact(),
-                                                                     maxZ                   = NewTrackingCuts.maxZImpact(),
-                                                                     minZ                   = -NewTrackingCuts.maxZImpact(),
-                                                                     usePixel               = NewTrackingCuts.usePixel(),
-                                                                     SpacePointsPixelName   = TrigPixelKeys.SpacePoints,
-                                                                     # useSCT                 = NewTrackingCuts.useSCT(),
-                                                                     useSCT                 = (NewTrackingCuts.useSCT() and NewTrackingCuts.useSCTSeeding()),
-                                                                     SpacePointsSCTName     = TrigSCTKeys.SpacePoints,
-                                                                     # useOverlapSpCollection = NewTrackingCuts.useSCT(),
-                                                                     useOverlapSpCollection = (NewTrackingCuts.useSCT() and NewTrackingCuts.useSCTSeeding()),
-                                                                     SpacePointsOverlapName = InDetKeys.OverlapSpacePoints(),
-                                                                     radMax                 = NewTrackingCuts.radMax(),
-                                                                     RapidityCut            = NewTrackingCuts.maxEta())
-
-         ToolSvc += InDetSiSpacePointsSeedMaker
-         #FIXME consider specific settings here
-         #if NewTrackingCuts.mode() == "Offline" or InDetFlags.doHeavyIon() or  NewTrackingCuts.mode() == "ForwardTracks":
-         #        InDetSiSpacePointsSeedMaker.maxdImpactPPS = NewTrackingCuts.maxdImpactPPSSeeds()
-         #        InDetSiSpacePointsSeedMaker.maxdImpactSSS = NewTrackingCuts.maxdImpactSSSSeeds()
-
-         if usePrdAssociationTool:
-         #   # not all classes have that property !!!
-            InDetSiSpacePointsSeedMaker.PRDtoTrackMap      = TrigPixelKeys.PRDtoTrackMap #InDetTrigPrdAssociationTool
-
-         #if not InDetFlags.doCosmics():
-         #   InDetSiSpacePointsSeedMaker.maxRadius1         = 0.75*NewTrackingCuts.radMax()
-         #   InDetSiSpacePointsSeedMaker.maxRadius2         = NewTrackingCuts.radMax()
-         #   InDetSiSpacePointsSeedMaker.maxRadius3         = NewTrackingCuts.radMax()
-         #if NewTrackingCuts.mode() == "LowPt" or NewTrackingCuts.mode() == "VeryLowPt" or (NewTrackingCuts.mode() == "Pixel" and InDetFlags.doMinBias()):
-         #   try :
-         #      InDetSiSpacePointsSeedMaker.pTmax              = NewTrackingCuts.maxPT()
-         #   except:
-         #      pass 
-         #   InDetSiSpacePointsSeedMaker.mindRadius         = 4.0
-         #if NewTrackingCuts.mode() == "SLHC" or NewTrackingCuts.mode() == "SLHCConversionFinding":
-         #   InDetSiSpacePointsSeedMaker.minRadius1         = 0
-         #   InDetSiSpacePointsSeedMaker.minRadius2         = 0
-         #   InDetSiSpacePointsSeedMaker.minRadius3         = 0
-         #   InDetSiSpacePointsSeedMaker.maxRadius1         =1000.*Units.mm
-         #   InDetSiSpacePointsSeedMaker.maxRadius2         =1000.*Units.mm
-         #   InDetSiSpacePointsSeedMaker.maxRadius3         =1000.*Units.mm
-         #if NewTrackingCuts.mode() == "ForwardTracks" or NewTrackingCuts.mode() == "ForwardSLHCTracks" or NewTrackingCuts.mode() == "VeryForwardSLHCTracks":
-         #   InDetSiSpacePointsSeedMaker.checkEta           = True
-         #   InDetSiSpacePointsSeedMaker.etaMin             = NewTrackingCuts.minEta()
-         #   InDetSiSpacePointsSeedMaker.etaMax             = NewTrackingCuts.maxEta()
-         #   InDetSiSpacePointsSeedMaker.RapidityCut        = NewTrackingCuts.maxEta()
-         #if NewTrackingCuts.mode() == "DBM":
-         #   InDetSiSpacePointsSeedMaker.etaMin             = NewTrackingCuts.minEta()
-         #   InDetSiSpacePointsSeedMaker.etaMax             = NewTrackingCuts.maxEta()
-         #   InDetSiSpacePointsSeedMaker.useDBM = True
- 
-
-
-         #Z finder for the vtx
-         #
-         # --- Z-coordinates primary vertices finder (only for collisions)
-         #
-         if InDetFlags.useZvertexTool() and NewTrackingCuts.mode() != "DBM":
-            from SiZvertexTool_xk.SiZvertexTool_xkConf import InDet__SiZvertexMaker_xk
-            InDetZvertexMaker = InDet__SiZvertexMaker_xk(name          = '%sInDetZvertexMaker%s'%(prefix,suffix),
-                                                         Zmax          = NewTrackingCuts.maxZImpact(),
-                                                         Zmin          = -NewTrackingCuts.maxZImpact(),
-                                                         minRatio      = 0.17) # not default
-            InDetZvertexMaker.SeedMakerTool = InDetSiSpacePointsSeedMaker
-
-            if InDetFlags.doHeavyIon():
-               InDetZvertexMaker.HistSize = 2000
-               ###InDetZvertexMaker.minContent = 200 
-               InDetZvertexMaker.minContent = 30
-               
-            ToolSvc += InDetZvertexMaker
-            #if (InDetFlags.doPrintConfigurables()):
-            #   printfunc (InDetZvertexMaker)
-
-         else:
-            InDetZvertexMaker = None
-
-         #
-      #   # --- SCT and Pixel detector elements road builder
-      #   #
-         #FIXME which propagator
-         # 1] 
-         from InDetTrigRecExample.InDetTrigConfigRecLoadTools import InDetTrigPropagator
-
-         # 2] How about offline
-
-         from SiDetElementsRoadTool_xk.SiDetElementsRoadTool_xkConf import InDet__SiDetElementsRoadMaker_xk
-         InDetSiDetElementsRoadMaker = InDet__SiDetElementsRoadMaker_xk(name               = '%sInDetSiRoadMaker%s'%(prefix,suffix),#+NewTrackingCuts.extension(),
-                                                                        PropagatorTool     = InDetTrigPropagator,#InDetPatternPropagator,
-                                                                        usePixel           = NewTrackingCuts.usePixel(),
-                                                                        PixManagerLocation = InDetKeys.PixelManager(),
-                                                                        useSCT             = NewTrackingCuts.useSCT(), 
-                                                                        SCTManagerLocation = InDetKeys.SCT_Manager(), #FIXME change the name?        
-                                                                        RoadWidth          = NewTrackingCuts.RoadWidth())
-
-         ToolSvc += InDetSiDetElementsRoadMaker
-         #if (InDetFlags.doPrintConfigurables()):
-         #   printfunc (     InDetSiDetElementsRoadMaker)
-         # Condition algorithm for InDet__SiDetElementsRoadMaker_xk
+         from AthenaCommon.DetFlags import DetFlags 
+         # --- Loading Pixel, SCT conditions
          if DetFlags.haveRIO.pixel_on():
-         #FIXME:
-         #pixelOn = True
-         #if pixelOn:
-             # Condition algorithm for SiCombinatorialTrackFinder_xk
             from AthenaCommon.AlgSequence import AthSequencer
             condSeq = AthSequencer("AthCondSeq")
             if not hasattr(condSeq, "InDetSiDetElementBoundaryLinksPixelCondAlg"):
-                from SiCombinatorialTrackFinderTool_xk.SiCombinatorialTrackFinderTool_xkConf import InDet__SiDetElementBoundaryLinksCondAlg_xk
-                condSeq += InDet__SiDetElementBoundaryLinksCondAlg_xk(name     = "InDetSiDetElementBoundaryLinksPixelCondAlg",
-                                                                      ReadKey  = "PixelDetectorElementCollection",
-                                                                      WriteKey = "PixelDetElementBoundaryLinks_xk",
-                                                                      UsePixelDetectorManager = True)
+               from SiCombinatorialTrackFinderTool_xk.SiCombinatorialTrackFinderTool_xkConf import InDet__SiDetElementBoundaryLinksCondAlg_xk
+               condSeq += InDet__SiDetElementBoundaryLinksCondAlg_xk(name     = "InDetSiDetElementBoundaryLinksPixelCondAlg",
+                                                                     ReadKey  = "PixelDetectorElementCollection",
+                                                                     WriteKey = "PixelDetElementBoundaryLinks_xk",)
+
 
-         if NewTrackingCuts.useSCT():
+
+         if trackingCuts.useSCT():
             from AthenaCommon.AlgSequence import AthSequencer
             condSeq = AthSequencer("AthCondSeq")
             if not hasattr(condSeq, "InDet__SiDetElementsRoadCondAlg_xk"):
@@ -245,223 +147,88 @@ def makeInDetPatternRecognition( whichSignature, rois = 'EMViewRoIs', InputColle
 
             if not hasattr(condSeq, "InDetSiDetElementBoundaryLinksSCTCondAlg"):
                from SiCombinatorialTrackFinderTool_xk.SiCombinatorialTrackFinderTool_xkConf import InDet__SiDetElementBoundaryLinksCondAlg_xk
-               condSeq += InDet__SiDetElementBoundaryLinksCondAlg_xk(name = "InDetSiDetElementBoundaryLinksSCTCondAlg",
-                                                                     ReadKey = "SCT_DetectorElementCollection",
-                                                                     WriteKey = "SCT_DetElementBoundaryLinks_xk")
-
-
-      #   #
-      #   # --- Local track finding using sdCaloSeededSSSpace point seed
-      #   #
-      #   # @TODO ensure that PRD association map is used if usePrdAssociationTool is set
-         is_dbm = InDetFlags.doDBMstandalone() or NewTrackingCuts.extension()=='DBM'
-         rot_creator_digital = TrackingCommon.getInDetRotCreatorDigital() if not is_dbm else TrackingCommon.getInDetRotCreatorDBM()
-
-
-         from InDetTrigRecExample.InDetTrigConfigRecLoadTools import InDetTrigSCTConditionsSummaryTool, InDetTrigPatternUpdator
-
-         from SiCombinatorialTrackFinderTool_xk.SiCombinatorialTrackFinderTool_xkConf import InDet__SiCombinatorialTrackFinder_xk
-         track_finder = InDet__SiCombinatorialTrackFinder_xk(name                  = '%sInDetSiComTrackFinder%s'%(prefix,suffix),#+NewTrackingCuts.extension(),
-                                                             PropagatorTool        = InDetTrigPropagator,#InDetPatternPropagator,
-                                                             UpdatorTool           = InDetTrigPatternUpdator,#InDetPatternUpdator,
-                                                             SctSummaryTool        = InDetTrigSCTConditionsSummaryTool,
-                                                             RIOonTrackTool        = rot_creator_digital,
-                                                             usePixel              = DetFlags.haveRIO.pixel_on(),
-                                                             useSCT                = DetFlags.haveRIO.SCT_on() if not is_dbm else False,
-                                                             PixelClusterContainer = TrigPixelKeys.Clusters,#InDetKeys.PixelClusters(),
-                                                             SCT_ClusterContainer  = TrigSCTKeys.Clusters )#InDetKeys.SCT_Clusters())
-
-         ToolSvc += track_finder
-         if is_dbm :
-            track_finder.MagneticFieldMode     = "NoField"
-            track_finder.TrackQualityCut       = 9.3
-
-         
-         #track_finder.SctSummaryTool = InDetTrigSCTConditionsSummaryTool
-         #if (DetFlags.haveRIO.SCT_on()):
-         #   track_finder.SctSummaryTool = InDetSCT_ConditionsSummaryTool
-         #else:
-         #   track_finder.SctSummaryTool = None
-
-      #   ToolSvc += track_finder
-
-         useBremMode = NewTrackingCuts.mode() == "Offline" or NewTrackingCuts.mode() == "SLHC" or NewTrackingCuts.mode() == "DBM"
-         from SiTrackMakerTool_xk.SiTrackMakerTool_xkConf import InDet__SiTrackMaker_xk as SiTrackMaker
-         InDetSiTrackMaker = SiTrackMaker(name                          = '%sInDetSiTrackMaker%s'%(prefix,suffix),#+NewTrackingCuts.extension(),
-                                          useSCT                        = NewTrackingCuts.useSCT(),
-                                          usePixel                      = NewTrackingCuts.usePixel(),
-                                          RoadTool                      = InDetSiDetElementsRoadMaker,
-                                          CombinatorialTrackFinder      = track_finder,
-                                          pTmin                         = NewTrackingCuts.minPT(),
-                                          pTminBrem                     = NewTrackingCuts.minPTBrem(),
-                                          pTminSSS                      = InDetFlags.pT_SSScut(),
-                                          nClustersMin                  = NewTrackingCuts.minClusters(),
-                                          nHolesMax                     = NewTrackingCuts.nHolesMax(),
-                                          nHolesGapMax                  = NewTrackingCuts.nHolesGapMax(),
-                                          SeedsFilterLevel              = NewTrackingCuts.seedFilterLevel(),
-                                          Xi2max                        = NewTrackingCuts.Xi2max(),
-                                          Xi2maxNoAdd                   = NewTrackingCuts.Xi2maxNoAdd(),
-                                          nWeightedClustersMin          = NewTrackingCuts.nWeightedClustersMin(),
-                                          CosmicTrack                   = InDetFlags.doCosmics(),
-                                          Xi2maxMultiTracks             = NewTrackingCuts.Xi2max(), # was 3.
-                                          useSSSseedsFilter             = InDetFlags.doSSSfilter(),
-                                          doMultiTracksProd             = True,
-                                          useBremModel                  = InDetFlags.doBremRecovery() and useBremMode, # only for NewTracking the brem is debugged !!!
-                                          doCaloSeededBrem              = InDetFlags.doCaloSeededBrem(),
-                                          doHadCaloSeedSSS              = InDetFlags.doHadCaloSeededSSS(),
-                                          phiWidth                      = NewTrackingCuts.phiWidthBrem(),
-                                          etaWidth                      = NewTrackingCuts.etaWidthBrem(),
-                                          InputClusterContainerName     = InDetKeys.CaloClusterROIContainer(), # "InDetCaloClusterROIs" 
-                                          InputHadClusterContainerName  = InDetKeys.HadCaloClusterROIContainer(), # "InDetCaloClusterROIs" 
-                                          UseAssociationTool            = usePrdAssociationTool)
-
-         ToolSvc += InDetSiTrackMaker
-
-      #FIXME: do only cosmics for now, but change later
-      #   if NewTrackingCuts.mode() == "SLHC" or NewTrackingCuts.mode() == "ForwardSLHCTracks" or NewTrackingCuts.mode() == "VeryForwardSLHCTracks" :
-      #      InDetSiTrackMaker.ITKGeometry = True
-
-      #   if NewTrackingCuts.mode() == "DBM":
-      #      InDetSiTrackMaker.MagneticFieldMode = "NoField"
-      #      InDetSiTrackMaker.useBremModel = False
-      #      InDetSiTrackMaker.doMultiTracksProd = False
-      #      InDetSiTrackMaker.TrackPatternRecoInfo = 'SiSPSeededFinder'       
-      #      InDetSiTrackMaker.pTminSSS = -1
-      #      InDetSiTrackMaker.CosmicTrack = False
-      #      InDetSiTrackMaker.useSSSseedsFilter = False
-      #      InDetSiTrackMaker.doCaloSeededBrem = False
-      #      InDetSiTrackMaker.doHadCaloSeedSSS = False
-
-         #elif InDetFlags.doCosmics():
-         #  InDetSiTrackMaker.TrackPatternRecoInfo = 'SiSpacePointsSeedMaker_Cosmic'
-         InDetSiTrackMaker.TrackPatternRecoInfo = 'SiSpacePointsSeedMaker_Cosmic'
+               condSeq += InDet__SiDetElementBoundaryLinksCondAlg_xk(name     = "InDetSiDetElementBoundaryLinksSCTCondAlg",
+                                                                  ReadKey  = "SCT_DetectorElementCollection",
+                                                                  WriteKey = "SCT_DetElementBoundaryLinks_xk")
+            #-------------------------------------------------------
+
+
+         from .InDetTrigCommon import siSPSeededTrackFinder_builder, get_full_name
+         siSPSeededTrackFinder = siSPSeededTrackFinder_builder( name                  = get_full_name( 'siSPSeededTrackFinder', config.name ),
+                                                                outputTracks          = config.EFID.trkTracksEFID(), ##outEFIDTracks, 
+                                                                trackingCuts          = trackingCuts,
+                                                                usePrdAssociationTool = usePrdAssociationTool,
+                                                                nameSuffix            = config.name )
+
+         print(siSPSeededTrackFinder)
+         viewAlgs.append( siSPSeededTrackFinder )
+      #-----------------------------------------------------------------------------
+      #                      Track particle conversion algorithm (for pattern rec.)
+      #                        atm disabled but might be useful later for debugging
       #
-      #   elif InDetFlags.doHeavyIon():
-      #     InDetSiTrackMaker.TrackPatternRecoInfo = 'SiSpacePointsSeedMaker_HeavyIon'
-      #   
-      #   elif NewTrackingCuts.mode() == "LowPt":
-      #     InDetSiTrackMaker.TrackPatternRecoInfo = 'SiSpacePointsSeedMaker_LowMomentum'
-
-      #   elif NewTrackingCuts.mode() == "VeryLowPt" or (NewTrackingCuts.mode() == "Pixel" and InDetFlags.doMinBias()):
-      #     InDetSiTrackMaker.TrackPatternRecoInfo = 'SiSpacePointsSeedMaker_VeryLowMomentum'           
-
-      #   elif NewTrackingCuts.mode() == "BeamGas":
-      #     InDetSiTrackMaker.TrackPatternRecoInfo = 'SiSpacePointsSeedMaker_BeamGas'
- 
-      #   elif NewTrackingCuts.mode() == "ForwardTracks":
-      #     InDetSiTrackMaker.TrackPatternRecoInfo = 'SiSpacePointsSeedMaker_ForwardTracks'
-
-      #   elif NewTrackingCuts.mode() == "ForwardSLHCTracks":
-      #     InDetSiTrackMaker.TrackPatternRecoInfo = 'SiSpacePointsSeedMaker_ForwardSLHCTracks'
-
-      #   elif NewTrackingCuts.mode() == "VeryForwardSLHCTracks": 
-      #     InDetSiTrackMaker.TrackPatternRecoInfo = 'SiSpacePointsSeedMaker_VeryForwardSLHCTracks' 
-
-      #   elif NewTrackingCuts.mode() == "SLHCConversionFinding":
-      #     InDetSiTrackMaker.TrackPatternRecoInfo = 'SiSpacePointsSeedMaker_SLHCConversionTracks'
-
-      #   elif NewTrackingCuts.mode() == "LargeD0" or NewTrackingCuts.mode() == "LowPtLargeD0":
-      #     InDetSiTrackMaker.TrackPatternRecoInfo = 'SiSpacePointsSeedMaker_LargeD0'
-      #  
-      #   else:
-      #     InDetSiTrackMaker.TrackPatternRecoInfo = 'SiSPSeededFinder'
-      #           
-         if InDetFlags.doStoreTrackSeeds():
-              from SeedToTrackConversionTool.SeedToTrackConversionToolConf import InDet__SeedToTrackConversionTool
-              InDet_SeedToTrackConversion = InDet__SeedToTrackConversionTool(name       = "%sInDet_SeedToTrackConversion%s"%(prefix, suffix),
-                                                                             OutputName = InDetKeys.SiSPSeedSegments()+NewTrackingCuts.extension())
-              InDetSiTrackMaker.SeedToTrackConversion = InDet_SeedToTrackConversion
-              InDetSiTrackMaker.SeedSegmentsWrite = True
-
-      #   #InDetSiTrackMaker.OutputLevel = VERBOSE             
-      #   ToolSvc += InDetSiTrackMaker
-      #   if (InDetFlags.doPrintConfigurables()):
-      #      printfunc (InDetSiTrackMaker)
-      #   #
-      #   # set output track collection name
-      #  #
-      #   self.__SiTrackCollection = SiSPSeededTrackCollectionKey
-      #   #
-      #   # --- Setup Track finder using space points seeds
-      #   #
-
-         #FIXME: which summary tool to use??
-         # trackSummaryTool = TrackingCommon.getInDetTrackSummaryToolNoHoleSearch()
-         #ToolSvc += trackSummaryTool
-         from InDetTrigRecExample.InDetTrigConfigRecLoadTools import InDetTrigTrackSummaryTool
-
-
-         from SiSPSeededTrackFinder.SiSPSeededTrackFinderConf import InDet__SiSPSeededTrackFinder
-         InDetSiSPSeededTrackFinder = InDet__SiSPSeededTrackFinder(name                 = '%sInDetSiSpTrackFinder%s'%(prefix, suffix),# +NewTrackingCuts.extension(),
-                                                                    TrackTool           = InDetSiTrackMaker,
-                                                                    PRDtoTrackMap       = TrigPixelKeys.PRDtoTrackMap if usePrdAssociationTool else '',
-                                                                    SpacePointsPixelName= TrigPixelKeys.SpacePoints,
-                                                                    SpacePointsSCTName  = TrigSCTKeys.SpacePoints,
-                                                                    TrackSummaryTool    = InDetTrigTrackSummaryTool,
-                                                                    TracksLocation      = outEFIDTracks,
-                                                                    SeedsTool           = InDetSiSpacePointsSeedMaker,
-                                                                    useZvertexTool      = InDetFlags.useZvertexTool(),
-                                                                    ZvertexTool         = InDetZvertexMaker )
-
-         if NewTrackingCuts.mode() == "ForwardSLHCTracks" or NewTrackingCuts.mode() == "ForwardTracks":
-                                                                    InDetSiSPSeededTrackFinder.useNewStrategy     = False
-                                                                    InDetSiSPSeededTrackFinder.useMBTSTimeDiff    = InDetFlags.useMBTSTimeDiff()
-                                                                    InDetSiSPSeededTrackFinder.useZBoundFinding   = False
-      #    if InDetFlags.doHeavyIon() :
-      #     InDetSiSPSeededTrackFinder.FreeClustersCut = 2 #Heavy Ion optimization from Igor
-         else:
-                                                                    InDetSiSPSeededTrackFinder.useZvertexTool      = InDetFlags.useZvertexTool() and NewTrackingCuts.mode() != "DBM"
-                                                                    InDetSiSPSeededTrackFinder.useNewStrategy      = InDetFlags.useNewSiSPSeededTF() and NewTrackingCuts.mode() != "DBM"
-                                                                    InDetSiSPSeededTrackFinder.useMBTSTimeDiff     = InDetFlags.useMBTSTimeDiff()
-                                                                    InDetSiSPSeededTrackFinder.useZBoundFinding    = NewTrackingCuts.doZBoundary() and NewTrackingCuts.mode() != "DBM"   
-
-
-
-         
-         viewAlgs.append( InDetSiSPSeededTrackFinder )
-         
-         #for alg in viewAlgs:
-         #   print alg
-
-      #    if InDetFlags.doHeavyIon() :
-      #     InDetSiSPSeededTrackFinder.FreeClustersCut = 2 #Heavy Ion optimization from Igor
-
-      #   #InDetSiSPSeededTrackFinder.OutputLevel =VERBOSE 
-      #   topSequence += InDetSiSPSeededTrackFinder
-      #   if (InDetFlags.doPrintConfigurables()):
-      #      printfunc (InDetSiSPSeededTrackFinder)
-
-      #   if not InDetFlags.doSGDeletion():
-      #      if InDetFlags.doTruth():
-      #         #
-      #         # set up the truth info for this container
-      #         #
-      #         include ("InDetRecExample/ConfiguredInDetTrackTruth.py")
-      #         InDetTracksTruth = ConfiguredInDetTrackTruth(self.__SiTrackCollection,
-      #                                                      self.__SiTrackCollection+"DetailedTruth",
-      #                                                      self.__SiTrackCollection+"TruthCollection")
-      #         #
-      #         # add final output for statistics
-      #         #
-      #         TrackCollectionKeys      += [ InDetTracksTruth.Tracks() ]
-      #         TrackCollectionTruthKeys += [ InDetTracksTruth.TracksTruth() ]
-      #      else:
-      #         TrackCollectionKeys      += [ self.__SiTrackCollection ]
-      #         
-
-
-      #Convert final track collection to xAOD track particles
-      from .InDetTrigCommon import getTrackParticleCnv  
-      viewAlgs.append( getTrackParticleCnv( prefix, suffix + "_EFID", outEFIDTracks, outEFIDTrackParticles ) )
-
-
-      #print viewAlgs
-      #print 'VIEWS!', len(viewAlgs)
-      #print(len(viewAlgs))
-
-      return  viewAlgs
-
-  #-----------------------------------------------------------------------------
-  #                        Ambiguity solving stage
-      #TODO:
-
+      #from .InDetTrigCommon import trackParticleCnv_builder
+      #trackParticleCnvAlg = trackParticleCnv_builder(name                 = get_full_name( 'xAODParticleCreatorAlg',config.name + '_EFID' ), 
+      #                                               config               = config,
+      #                                               inTrackCollectionKey = config.PT.trkTracksPT(),#config.EFID.trkTracksEFID(),
+      #                                               outTrackParticlesKey = config.EFID.tracksEFID( doRecord = config.isRecordable),
+      #                                               )
+
+      #-----------------------------------------------------------------------------
+      #                      Precision algorithms
+
+      #Verifier should not be necessary when both patt. rec. and PT runs in the same view -> None
+      #Also provides particle cnv alg inside
+      precisionAlgs = makePrecisionInDetPatternRecognition(config      = config,
+                                                           inputTracks = config.EFID.trkTracksEFID(),
+                                                           verifier    = None )
+
+
+      viewAlgs += precisionAlgs
+
+
+      return  viewAlgs, dataVerifier
+
+
+#TODO: potentially  unify with makeInDetPrecisionTracking in the InDetPT.py?
+#TODO better name?
+def makePrecisionInDetPatternRecognition( config, inputTracks,verifier = None ):
+   ptAlgs = [] #List containing all the precision tracking algorithms hence every new added alg has to be appended to the list
+   
+   #-----------------------------------------------------------------------------
+   #                        Verifying input data for the algorithms
+   if verifier:
+     verifier.DataObjects += [ #( 'InDet::PixelGangedClusterAmbiguities' , 'StoreGateSvc+' + TrigPixelKeys.PixelClusterAmbiguitiesMap ),
+                               ( 'TrackCollection' , 'StoreGateSvc+' + inputTracks )]
+   
+   
+   #-----------------------------------------------------------------------------
+   #                        Ambiguity solving stage
+   from .InDetTrigCommon import ambiguityScoreAlg_builder, ambiguitySolverAlg_builder, get_full_name, get_scoremap_name
+   
+   ambiguityScoreAlg = ambiguityScoreAlg_builder( name                  = get_full_name(  core = 'TrkAmbiguityScore', suffix  = config.name ),
+                                                  config                = config,
+                                                  inputTrackCollection  = inputTracks,
+                                                  outputTrackScoreMap   = get_scoremap_name( config.name ), #Map of tracks and their scores
+                                                 )
+   ptAlgs.append( ambiguityScoreAlg )
+   
+   #FIXME: these alg internally don't expect EFID setting (but FTF), have to take into consideration
+   ambiguitySolverAlg = ambiguitySolverAlg_builder( name                  = get_full_name( core = 'TrkAmbiguitySolver', suffix = config.name ),
+                                                    config                = config,
+                                                    inputTrackScoreMap    = get_scoremap_name( config.name ), #Map of tracks and their scores, 
+                                                    outputTrackCollection = config.PT.trkTracksPT() ) #FIXME: for now keep PT but if TRT added this will ahve to become intermediate collection
+                         
+   ptAlgs.append( ambiguitySolverAlg )
+   
+   #-----------------------------------------------------------------------------
+   #                      Track particle conversion algorithm
+   from .InDetTrigCommon import trackParticleCnv_builder
+   trackParticleCnvAlg = trackParticleCnv_builder(name                 = get_full_name( 'xAODParticleCreatorAlg',config.name + '_IDTrig' ), 
+                                                  config               = config,
+                                                  inTrackCollectionKey = config.PT.trkTracksPT(),
+                                                  outTrackParticlesKey = config.PT.tracksPT( doRecord = config.isRecordable),
+                                                  )
+   
+   ptAlgs.append( trackParticleCnvAlg )
+
+   return ptAlgs
diff --git a/Trigger/TrigTools/TrigInDetConfig/python/InDetPT.py b/Trigger/TrigTools/TrigInDetConfig/python/InDetPT.py
index f5b47cfafcb5..89c583c4d709 100644
--- a/Trigger/TrigTools/TrigInDetConfig/python/InDetPT.py
+++ b/Trigger/TrigTools/TrigInDetConfig/python/InDetPT.py
@@ -91,14 +91,20 @@ def makeInDetPrecisionTracking( config = None,
 
   #-----------------------------------------------------------------------------
   #                        Ambiguity solving stage
-  from .InDetTrigCommon import ambiguityScoreAlg_builder, ambiguitySolverAlg_builder, get_full_name
+  from .InDetTrigCommon import ambiguityScoreAlg_builder, ambiguitySolverAlg_builder, get_full_name,  get_scoremap_name
   ambSolvingStageAlgs = [
-                           ambiguityScoreAlg_builder( name   = get_full_name(  core = 'TrkAmbiguityScore', suffix  = config.name ),
-                                                      config = config ),
-
-                           ambiguitySolverAlg_builder( name   = get_full_name( core = 'TrkAmbiguitySolver', suffix = config.name ),
-                                                       config = config )
+                           ambiguityScoreAlg_builder( name                  = get_full_name(  core = 'TrkAmbiguityScore', suffix  = config.name ),
+                                                      config                = config,
+                                                      inputTrackCollection  = config.FT.trkTracksFTF(),
+                                                      outputTrackScoreMap   = get_scoremap_name( config.name ), #Map of tracks and their scores
+                                                    ),
+  
+                           ambiguitySolverAlg_builder( name                  = get_full_name( core = 'TrkAmbiguitySolver', suffix = config.name ),
+                                                       config                = config,
+                                                       inputTrackScoreMap    = get_scoremap_name( config.name ), #Map of tracks and their scores, 
+                                                       outputTrackCollection = nameAmbiTrackCollection  )
                         ]
+   
 
   #Loading the alg to the sequence
   ptAlgs.extend( ambSolvingStageAlgs )
diff --git a/Trigger/TrigTools/TrigInDetConfig/python/InDetTrigCommon.py b/Trigger/TrigTools/TrigInDetConfig/python/InDetTrigCommon.py
index 3bba5355014c..f4ae49837955 100644
--- a/Trigger/TrigTools/TrigInDetConfig/python/InDetTrigCommon.py
+++ b/Trigger/TrigTools/TrigInDetConfig/python/InDetTrigCommon.py
@@ -34,7 +34,7 @@ def get_full_name( core, suffix ):
 
 #Retrieve name of the score map
 #Map of Tracks and floats (representing score of a given track)
-def get_scoredmap( suffix ):
+def get_scoremap_name( suffix ):
    return "ScoredMap{}".format(suffix)
 
 
@@ -305,25 +305,15 @@ def ambiguityProcessorTool_builder( name, config):
 
 
 from TrkAmbiguitySolver.TrkAmbiguitySolverConf import Trk__TrkAmbiguitySolver
-def ambiguitySolverAlg_builder(name, config):
+def ambiguitySolverAlg_builder(name, config, inputTrackScoreMap, outputTrackCollection):
 
-      #Get correct name for the ouput TrkTrack collection
-      def getTrackOutput():
-         #If we are also applying TRT then this collection is just intermediate
-         if config.PT.setting.doTRT:
-            return  config.PT.trkTracksAS() #"%s%sTrkTrack%s" %('HLT_ID', 'AmbSol', get_name_suffix( config.name() ))
-         #Otherwise use final collection name
-         else:
-            return  config.PT.trkTracksPT()
-
-      #-----------------------
       #Set/Get subtools
       ambiguityProcessor = ambiguityProcessorTool_builder( name   = get_full_name( 'AmbiguityProcessor', config.name),
                                                            config = config )
 
       return Trk__TrkAmbiguitySolver( name               = name,
-                                      TrackInput         = get_scoredmap( get_name_suffix(config.name )),
-                                      TrackOutput        = getTrackOutput(),
+                                      TrackInput         = inputTrackScoreMap,
+                                      TrackOutput        = outputTrackCollection,
                                       AmbiguityProcessor = ambiguityProcessor
                                     )
 
@@ -354,7 +344,7 @@ def ambiguityScoreProcessorTool_builder( name, config):
 
 
 from TrkAmbiguitySolver.TrkAmbiguitySolverConf import Trk__TrkAmbiguityScore
-def ambiguityScoreAlg_builder(name, config):
+def ambiguityScoreAlg_builder(name, config, inputTrackCollection, outputTrackScoreMap ):
       #Alg loops over provided tracks and calls subtool(TrkAmbigutyScoreProcessor) to assign scores for each one of them
 
       #-----------------------
@@ -363,10 +353,369 @@ def ambiguityScoreAlg_builder(name, config):
       #                                                               config = config )
 
       return Trk__TrkAmbiguityScore(   name                    = name,
-                                       TrackInput              = [ config.FT.trkTracksFTF()  ],
-                                       TrackOutput             = get_scoredmap( get_name_suffix( config.name ) ),
+                                       TrackInput              = [ inputTrackCollection ], #[ config.FT.trkTracksFTF()  ], 
+                                       TrackOutput             = outputTrackScoreMap,  #get_scoredmap( get_name_suffix( config.name ) ),
                                        #Disable processor, see: https://gitlab.cern.ch/atlas/athena/-/merge_requests/36431
                                        AmbiguityScoreProcessor = None, #ambiguityScoreProcessor,
-                                    )
+                                   )
+
+#-------------------------------------------------------------------------------------------------
+#                       Alg/Tools for offline pattern recognition tracking
 
+@makePublicTool
+def siSpacePointsSeedMakerTool_builder(name, trackingCuts, usePrdAssociationTool ):
+   from InDetRecExample.InDetKeys  import  InDetKeys
+   from .InDetTrigCollectionKeys   import  TrigPixelKeys, TrigSCTKeys
+   from InDetRecExample.InDetJobProperties import InDetFlags
+
+   kwargs = {}
+   kwargs = setDefaults( kwargs,
+                         pTmin                  = trackingCuts.minPT(),
+                         maxdImpact             = trackingCuts.maxPrimaryImpact(),
+                         maxZ                   = trackingCuts.maxZImpact(),
+                         minZ                   = -trackingCuts.maxZImpact(),
+                         usePixel               = trackingCuts.usePixel(),
+                         SpacePointsPixelName   = TrigPixelKeys.SpacePoints,
+                         useSCT                 = (trackingCuts.useSCT() and trackingCuts.useSCTSeeding()),
+                         SpacePointsSCTName     = TrigSCTKeys.SpacePoints,
+                         useOverlapSpCollection = (trackingCuts.useSCT() and trackingCuts.useSCTSeeding()),
+                         SpacePointsOverlapName = InDetKeys.OverlapSpacePoints(), #Switch to trigger flags?
+                         radMax                 = trackingCuts.radMax(),
+                         RapidityCut            = trackingCuts.maxEta())
+                       
+   
+   #Change/add tracking  parameters based on the different tracking mode
+   if trackingCuts.mode() == "Offline" or InDetFlags.doHeavyIon() or  trackingCuts.mode() == "ForwardTracks":
+      kwargs = setDefaults( kwargs,
+                            maxdImpactPPS = trackingCuts.maxdImpactPPSSeeds(),
+                            maxdImpactSSS = trackingCuts.maxdImpactSSSSeeds())
+   
+   if usePrdAssociationTool:
+   # not all classes have that property !!!
+      kwargs = setDefaults( kwargs,
+                            PRDtoTrackMap      = TrigPixelKeys.PRDtoTrackMap)
+
+   #FIXME: switch to TrigFlags?
+   if not InDetFlags.doCosmics():
+      kwargs = setDefaults( kwargs,
+                            maxRadius1     = 0.75*trackingCuts.radMax(),
+                            maxRadius2     = trackingCuts.radMax(),
+                            maxRadius3     = trackingCuts.radMax())
+
+   #FIXME add later if needed
+   #if trackingCuts.mode() == "LowPt" or trackingCuts.mode() == "VeryLowPt" or (trackingCuts.mode() == "Pixel" and InDetFlags.doMinBias()):
+   #   try :
+   #      InDetSiSpacePointsSeedMaker.pTmax              = trackingCuts.maxPT()
+   #   except:
+   #      pass 
+   #   InDetSiSpacePointsSeedMaker.mindRadius         = 4.0
+   #
+   #if trackingCuts.mode() == "SLHC" or trackingCuts.mode() == "SLHCConversionFinding":
+   #   InDetSiSpacePointsSeedMaker.minRadius1         = 0
+   #   InDetSiSpacePointsSeedMaker.minRadius2         = 0
+   #   InDetSiSpacePointsSeedMaker.minRadius3         = 0
+   #   InDetSiSpacePointsSeedMaker.maxRadius1         =1000.*Units.mm
+   #   InDetSiSpacePointsSeedMaker.maxRadius2         =1000.*Units.mm
+   #   InDetSiSpacePointsSeedMaker.maxRadius3         =1000.*Units.mm
+   #
+   #if trackingCuts.mode() == "ForwardTracks" or trackingCuts.mode() == "ForwardSLHCTracks" or trackingCuts.mode() == "VeryForwardSLHCTracks":
+   #   InDetSiSpacePointsSeedMaker.checkEta           = True
+   #   InDetSiSpacePointsSeedMaker.etaMin             = trackingCuts.minEta()
+   #   InDetSiSpacePointsSeedMaker.etaMax             = trackingCuts.maxEta()
+   #   InDetSiSpacePointsSeedMaker.RapidityCut        = trackingCuts.maxEta()
+   #
+   #if trackingCuts.mode() == "DBM":
+   #   InDetSiSpacePointsSeedMaker.etaMin             = trackingCuts.minEta()
+   #   InDetSiSpacePointsSeedMaker.etaMax             = trackingCuts.maxEta()
+   #   InDetSiSpacePointsSeedMaker.useDBM = True
+   
+   
+   from SiSpacePointsSeedTool_xk.SiSpacePointsSeedTool_xkConf import InDet__SiSpacePointsSeedMaker_ATLxk as SiSpacePointsSeedMaker
+   return SiSpacePointsSeedMaker ( name    =  name,
+                                   **kwargs)
+
+
+
+
+@makePublicTool
+def zVertexMakerTool_builder(name, trackingCuts, seedMakerTool ):
+   from InDetRecExample.InDetJobProperties import InDetFlags
+   
+   kwargs = {}
+   
+   #Prepare default parameter settings for the tool
+   kwargs = setDefaults( kwargs,
+                         Zmax          = trackingCuts.maxZImpact(),
+                         Zmin          = -trackingCuts.maxZImpact(),
+                         minRatio      = 0.17,
+                         SeedMakerTool = seedMakerTool )
+   
+   
+   if InDetFlags.doHeavyIon():
+      kwargs = setDefaults( kwargs,
+                            HistSize   = 2000,
+                            minContent = 30)
+   
+   from SiZvertexTool_xk.SiZvertexTool_xkConf import InDet__SiZvertexMaker_xk
+   return InDet__SiZvertexMaker_xk(name  = name,
+                                   **kwargs)
+
+   
+
+
+def prdAssociation_builder( InputCollections ):
+   import InDetRecExample.TrackingCommon as TrackingCommon
+   #FIXME: If so:
+   # 1] Get a new association tool
+   #associationTool = TrackingCommon.getInDetTrigPRDtoTrackMapToolGangedPixels(),
+   
+   # 2] Use the ganged pixel from here?
+   #from InDetTrigRecExample.InDetTrigConfigRecLoadTools import InDetTrigPrdAssociationTool
+   
+   # 3] Create the new one as in offline tracking?:
+   prefix     = 'TrigInDet'
+   suffix     = ''#NewTrackingCuts.extension()
+   return TrackingCommon.getInDetTrackPRD_Association(namePrefix   = prefix,
+                                                      nameSuffix   = suffix,
+                                                      TracksName   = list(InputCollections))#This is readHandle #What input collection Thought there are no tracks at this point??!     
+   # 4] if so do I use normal or ganged?
+   #from InDetAssociationTools.InDetAssociationToolsConf import InDet__InDetPRD_AssociationToolGangedPixels
+   #InDetTrigPrdAssociationl = InDet__InDetPRD_AssociationToolGangedPixels(name = "%sPrdAssociationTool%s"%(prefix,suffix),
+   #                                                                          PixelClusterAmbiguitiesMapName = TrigPixelKeys.PRDtoTrackMap )
+
+@makePublicTool
+def siDetectorElementRoadMakerTool_builder( name, trackingCuts ):
+   from InDetRecExample.InDetKeys  import  InDetKeys 
+   
+   #Are we happy with this propagator?
+   from SiDetElementsRoadTool_xk.SiDetElementsRoadTool_xkConf import InDet__SiDetElementsRoadMaker_xk
+   return  InDet__SiDetElementsRoadMaker_xk(name               = name,
+                                            PropagatorTool     = trigPropagator_getter(),
+                                            usePixel           = trackingCuts.usePixel(),
+                                            PixManagerLocation = InDetKeys.PixelManager(), #FIXME: InDetTrigKeys?
+                                            useSCT             = trackingCuts.useSCT(), 
+                                            SCTManagerLocation = InDetKeys.SCT_Manager(),  #FIXME InDetTrigKeys?
+                                            RoadWidth          = trackingCuts.RoadWidth())
+
+
+
+@makePublicTool
+def siCombinatorialTrackFinderTool_builder( name, trackingCuts ):
+   from .InDetTrigCollectionKeys   import TrigPixelKeys, TrigSCTKeys
+   from AthenaCommon.DetFlags      import DetFlags
+   from InDetRecExample.InDetJobProperties import InDetFlags
+   import InDetRecExample.TrackingCommon as TrackingCommon
+
+   #FIXME: quick hack to try running ID, remove later
+   DetFlags.ID_setOn()
+   
+   #Are we happy with these settings?
+   from InDetTrigRecExample.InDetTrigConfigRecLoadTools import InDetTrigSCTConditionsSummaryTool, InDetTrigPatternUpdator
+   # @TODO ensure that PRD association map is used if usePrdAssociationTool is set
+   
+   kwargs = {}
+   #Prepare default parameter settings for the tool
+   kwargs = setDefaults( kwargs,
+                         PropagatorTool        = trigPropagator_getter(),
+                         UpdatorTool           = InDetTrigPatternUpdator,
+                         SctSummaryTool        = InDetTrigSCTConditionsSummaryTool, #Any reason for this to be turned off? None,
+                         RIOonTrackTool        = TrackingCommon.getInDetRotCreatorDigital(),
+                         usePixel              = DetFlags.haveRIO.pixel_on(),
+                         useSCT                = DetFlags.haveRIO.SCT_on(),
+                         PixelClusterContainer = TrigPixelKeys.Clusters,
+                         SCT_ClusterContainer  = TrigSCTKeys.Clusters)
+   
+   #FIXME: Use TriggerFlags instead?
+   if InDetFlags.doDBMstandalone() or trackingCuts.extension() =='DBM':
+      kwargs = setDefaults( kwargs,
+                            MagneticFieldMode     = "NoField",
+                            TrackQualityCut       = 9.3,
+                            useSCT                =  False,
+                            RIOonTrackTool        = TrackingCommon.getInDetRotCreatorDBM(),
+                            )
+   
+   
+   #Add SCT condition summary if specified
+   #FIXME: Use TriggerFlags instead?
+   #if (DetFlags.haveRIO.SCT_on()):
+   #   kwargs = setDefaults( kwargs,
+   #                         SctSummaryTool = InDetTrigSCTConditionsSummaryTool )
+   
+   from SiCombinatorialTrackFinderTool_xk.SiCombinatorialTrackFinderTool_xkConf import InDet__SiCombinatorialTrackFinder_xk
+   return InDet__SiCombinatorialTrackFinder_xk(name  = name,
+                                               **kwargs)
+   
+
+@makePublicTool
+def siTrackMakerTool_builder( name, siDetElementsRoadMakerTool, trackFinderTool, trackingCuts, usePrdAssociationTool ):
+   from InDetRecExample.InDetJobProperties import InDetFlags
+   from InDetRecExample.InDetKeys          import InDetKeys 
+   
+   trackPatternRecoInfo = 'SiSPSeededFinder'
+   if InDetFlags.doCosmics():
+      trackPatternRecoInfo = 'SiSpacePointsSeedMaker_Cosmic'
+   
+   elif InDetFlags.doHeavyIon():
+     trackPatternRecoInfo = 'SiSpacePointsSeedMaker_HeavyIon'
+   
+   elif trackingCuts.mode() == "LowPt":
+     trackPatternRecoInfo = 'SiSpacePointsSeedMaker_LowMomentum'
+   
+   elif trackingCuts.mode() == "VeryLowPt" or (trackingCuts.mode() == "Pixel" and InDetFlags.doMinBias()):
+     trackPatternRecoInfo = 'SiSpacePointsSeedMaker_VeryLowMomentum'           
+   
+   elif trackingCuts.mode() == "BeamGas":
+     trackPatternRecoInfo = 'SiSpacePointsSeedMaker_BeamGas'
+   
+   elif trackingCuts.mode() == "ForwardTracks":
+     trackPatternRecoInfo = 'SiSpacePointsSeedMaker_ForwardTracks'
+   
+   elif trackingCuts.mode() == "ForwardSLHCTracks":
+     trackPatternRecoInfo = 'SiSpacePointsSeedMaker_ForwardSLHCTracks'
+   
+   elif trackingCuts.mode() == "VeryForwardSLHCTracks": 
+     trackPatternRecoInfo = 'SiSpacePointsSeedMaker_VeryForwardSLHCTracks' 
+   
+   elif trackingCuts.mode() == "SLHCConversionFinding":
+     trackPatternRecoInfo = 'SiSpacePointsSeedMaker_SLHCConversionTracks'
+   
+   elif trackingCuts.mode() == "LargeD0" or trackingCuts.mode() == "LowPtLargeD0":
+     trackPatternRecoInfo = 'SiSpacePointsSeedMaker_LargeD0'
+   
+   useBremMode = trackingCuts.mode() == "Offline" or trackingCuts.mode() == "SLHC" or trackingCuts.mode() == "DBM"
+   
+   kwargs = {}
+   #Prepare default parameter settings for the tool
+   kwargs = setDefaults( kwargs,
+                         useSCT                        = trackingCuts.useSCT(),
+                         usePixel                      = trackingCuts.usePixel(),
+                         RoadTool                      = siDetElementsRoadMakerTool,
+                         CombinatorialTrackFinder      = trackFinderTool,
+                         pTmin                         = trackingCuts.minPT(),
+                         pTminBrem                     = trackingCuts.minPTBrem(),
+                         pTminSSS                      = InDetFlags.pT_SSScut(),
+                         nClustersMin                  = trackingCuts.minClusters(),
+                         nHolesMax                     = trackingCuts.nHolesMax(),
+                         nHolesGapMax                  = trackingCuts.nHolesGapMax(),
+                         SeedsFilterLevel              = trackingCuts.seedFilterLevel(),
+                         Xi2max                        = trackingCuts.Xi2max(),
+                         Xi2maxNoAdd                   = trackingCuts.Xi2maxNoAdd(),
+                         nWeightedClustersMin          = trackingCuts.nWeightedClustersMin(),
+                         CosmicTrack                   = InDetFlags.doCosmics(),
+                         Xi2maxMultiTracks             = trackingCuts.Xi2max(), # was 3.
+                         useSSSseedsFilter             = InDetFlags.doSSSfilter(),
+                         doMultiTracksProd             = True,
+                         useBremModel                  = InDetFlags.doBremRecovery() and useBremMode, # only for NewTracking the brem is debugged !!!
+                         doCaloSeededBrem              = InDetFlags.doCaloSeededBrem(),
+                         doHadCaloSeedSSS              = InDetFlags.doHadCaloSeededSSS(),
+                         phiWidth                      = trackingCuts.phiWidthBrem(),
+                         etaWidth                      = trackingCuts.etaWidthBrem(),
+                         InputClusterContainerName     = InDetKeys.CaloClusterROIContainer(), 
+                         InputHadClusterContainerName  = InDetKeys.HadCaloClusterROIContainer(), 
+                         TrackPatternRecoInfo          = trackPatternRecoInfo,
+                         UseAssociationTool            = usePrdAssociationTool)
+   
+   
+   #Change the parameters based on the tracking cuts
+   if trackingCuts.mode() == "SLHC" or trackingCuts.mode() == "ForwardSLHCTracks" or trackingCuts.mode() == "VeryForwardSLHCTracks" :
+      kwargs = setDefaults( kwargs,
+                            ITKGeometry = True )
+   
+   if trackingCuts.mode() == "DBM":
+      kwargs = setDefaults( kwargs,
+                            MagneticFieldMode = "NoField",
+                            useBremModel = False,
+                            doMultiTracksProd = False,
+                            pTminSSS = -1,
+                            CosmicTrack = False,
+                            useSSSseedsFilter = False,
+                            doCaloSeededBrem = False,
+                            doHadCaloSeedSSS = False)
+   
+   if InDetFlags.doStoreTrackSeeds():
+      from SeedToTrackConversionTool.SeedToTrackConversionToolConf import InDet__SeedToTrackConversionTool
+      InDet_SeedToTrackConversion = InDet__SeedToTrackConversionTool(name       = "InDet_SeedToTrackConversion"+trackingCuts.extension(),
+                                                                     OutputName = InDetKeys.SiSPSeedSegments()+trackingCuts.extension())
+      kwargs = setDefaults( kwargs,
+                            SeedToTrackConversion = InDet_SeedToTrackConversion,
+                            SeedSegmentsWrite = True )
+   
+   
+   
+   from SiTrackMakerTool_xk.SiTrackMakerTool_xkConf import InDet__SiTrackMaker_xk
+   return  InDet__SiTrackMaker_xk(name = name,
+                                  **kwargs)
+
+
+
+def siSPSeededTrackFinder_builder( name, outputTracks, trackingCuts, usePrdAssociationTool, nameSuffix ):
+   from .InDetTrigCollectionKeys           import TrigPixelKeys, TrigSCTKeys
+   from InDetRecExample.InDetJobProperties import InDetFlags
+
+
+   
+   #Load subtools of the TrackFinder
+   siSpacePointsSeedMakerTool = siSpacePointsSeedMakerTool_builder(name                  = get_full_name( 'siSPSeedMaker', nameSuffix),
+                                                                   trackingCuts          = trackingCuts,
+                                                                   usePrdAssociationTool = usePrdAssociationTool )
+   
+   # --- Z-coordinates primary vertices finder (only for collisions)
+   zVertexMakerTool = None
+   #FIXME:Switch to trig flags?
+   if InDetFlags.useZvertexTool() and trackingCuts.mode() != "DBM":
+      print('Running z-vertex maker')
+      zVertexMakerTool =  zVertexMakerTool_builder(name, trackingCuts, siSpacePointsSeedMakerTool )
+   
+   # --- SCT and Pixel detector elements road builder
+   siDetectorElementRoadMaker = siDetectorElementRoadMakerTool_builder( name         = get_full_name( 'SiDetectorElementRoadMaker', nameSuffix),
+                                                                        trackingCuts = trackingCuts )
+   
+   # --- Local track finding using sdCaloSeededSSSpace point seed
+   siCombinatorialTrackFinderTool = siCombinatorialTrackFinderTool_builder( name         = get_full_name( 'SiCombinatorialTrackFinder', nameSuffix),
+                                                                            trackingCuts = trackingCuts)
+
+
+   siTrackMakerTool =  siTrackMakerTool_builder( name                       = get_full_name( 'siTrackMaker', nameSuffix),
+                                                 siDetElementsRoadMakerTool = siDetectorElementRoadMaker,
+                                                 trackFinderTool            = siCombinatorialTrackFinderTool,
+                                                 trackingCuts               = trackingCuts,
+                                                 usePrdAssociationTool      = usePrdAssociationTool)
+
+   #-----------------------------------------------------
+   #  Configure parameters
+
+   kwargs = {}
+   #Prepare default parameter settings for the tool
+   kwargs = setDefaults( kwargs,
+                         TrackTool           = siTrackMakerTool,
+                         PRDtoTrackMap       = TrigPixelKeys.PRDtoTrackMap if usePrdAssociationTool else '', #TODO: if prd is enabled this needs to be tested
+                         SpacePointsPixelName= TrigPixelKeys.SpacePoints,
+                         SpacePointsSCTName  = TrigSCTKeys.SpacePoints,
+                         TrackSummaryTool    = trackSummaryTool_getter(doTRT=False), #TODO: x-check whether we need different config
+                         TracksLocation      = outputTracks, #outEFIDTracks,
+                         SeedsTool           = siSpacePointsSeedMakerTool,
+                         ZvertexTool         = zVertexMakerTool, 
+                         useZvertexTool      = InDetFlags.useZvertexTool() and trackingCuts.mode() != "DBM",
+                         useNewStrategy      = InDetFlags.useNewSiSPSeededTF() and trackingCuts.mode() != "DBM",
+                         useMBTSTimeDiff     = InDetFlags.useMBTSTimeDiff(),
+                         useZBoundFinding    = trackingCuts.doZBoundary() and trackingCuts.mode() != "DBM" )
+   
+   
+   #Specific tracking settings 
+   if trackingCuts.mode() == "ForwardSLHCTracks" or trackingCuts.mode() == "ForwardTracks":
+      kwargs = setDefaults( kwargs,
+                            useNewStrategy     = False,
+                            useMBTSTimeDiff    = InDetFlags.useMBTSTimeDiff(),
+                            useZBoundFinding   = False,
+                            useZvertexTool     = InDetFlags.useZvertexTool() )
+   
+      if InDetFlags.doHeavyIon():
+            kwargs = setDefaults( kwargs, FreeClustersCut = 2) #Heavy Ion optimization from Igor
+
+   #-----------------------------------------------------
+
+
+   from SiSPSeededTrackFinder.SiSPSeededTrackFinderConf import InDet__SiSPSeededTrackFinder
+   return InDet__SiSPSeededTrackFinder(name = name,
+                                    **kwargs )
 
-- 
GitLab


From b9ee484626ed59115b1536fc57c0d3964122c7b7 Mon Sep 17 00:00:00 2001
From: Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
Date: Mon, 21 Dec 2020 12:44:10 +0100
Subject: [PATCH 199/225] Added explicit dependencies on "future" in a couple
 of packages.

This was needed to make AthAnalysis depend on this LCG package.
---
 Control/AthenaCommon/CMakeLists.txt        | 9 ++++++---
 Control/AthenaConfiguration/CMakeLists.txt | 3 +++
 Control/AthenaPython/CMakeLists.txt        | 1 +
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/Control/AthenaCommon/CMakeLists.txt b/Control/AthenaCommon/CMakeLists.txt
index f087ae817778..e0ffc081ed6b 100644
--- a/Control/AthenaCommon/CMakeLists.txt
+++ b/Control/AthenaCommon/CMakeLists.txt
@@ -3,6 +3,9 @@
 # Declare the package name:
 atlas_subdir( AthenaCommon )
 
+# External dependencies.
+find_package( future )
+
 # Set up specific Athena runtime environment:
 set( AthenaCommonEnvironment_DIR ${CMAKE_CURRENT_SOURCE_DIR}
    CACHE PATH "Location of AthenaCommonEnvironmentConfig.cmake" )
@@ -11,7 +14,7 @@ find_package( AthenaCommonEnvironment )
 # Install files from the package:
 atlas_install_python_modules( python/*.py python/Utils
                               POST_BUILD_CMD ${ATLAS_FLAKE8} )
-atlas_install_joboptions( share/Preparation.py share/Execution.py share/Atlas.UnixStandardJob.py test/*.py 
+atlas_install_joboptions( share/Preparation.py share/Execution.py share/Atlas.UnixStandardJob.py test/*.py
                           share/zeroJO.py share/Atlas_Gen.UnixStandardJob.py share/MemTraceInclude.py share/runbatch.py)
 atlas_install_scripts( share/athena.py share/athena_preload.sh share/chappy.py share/test_cfg_pickling.py share/ThinCAWrapper.sh)
 atlas_install_runtime(share/*.pkl)
@@ -26,14 +29,14 @@ atlas_add_test( AthAppMgrUnitTests SCRIPT test/test_AthAppMgrUnitTests.sh
 atlas_add_test( ConfigurableUnitTests SCRIPT test/test_ConfigurableUnitTests.sh
                 PROPERTIES TIMEOUT 300
                 LOG_IGNORE_PATTERN "Warning in <TFile::Init>: no StreamerInfo found|^Ran .* tests in" )
-atlas_add_test( JobOptionsUnitTests SCRIPT test/test_JobOptionsUnitTests.sh 
+atlas_add_test( JobOptionsUnitTests SCRIPT test/test_JobOptionsUnitTests.sh
                 LOG_IGNORE_PATTERN "Warning in <TFile::Init>: no StreamerInfo found|^Ran .* tests in" )
 atlas_add_test( JobPropertiesUnitTests SCRIPT test/test_JobPropertiesUnitTests.sh
                 LOG_IGNORE_PATTERN "Warning in <TFile::Init>: no StreamerInfo found|^Ran .* tests in" )
 atlas_add_test( KeyStoreUnitTests SCRIPT test/test_KeyStoreUnitTests.sh
                 LOG_IGNORE_PATTERN "Warning in <TFile::Init>: no StreamerInfo found|^Ran .* tests in|^outFileName: " )
 atlas_add_test( CFElementsTest SCRIPT python -m unittest -v AthenaCommon.CFElements
-		POST_EXEC_SCRIPT nopost.sh ) 
+		POST_EXEC_SCRIPT nopost.sh )
 
 atlas_add_test( GenerateBootstrapTest
    SCRIPT test/test_gen_bootstrap.sh
diff --git a/Control/AthenaConfiguration/CMakeLists.txt b/Control/AthenaConfiguration/CMakeLists.txt
index dc6084e7b04f..a4f11c6aec07 100644
--- a/Control/AthenaConfiguration/CMakeLists.txt
+++ b/Control/AthenaConfiguration/CMakeLists.txt
@@ -3,6 +3,9 @@
 # Declare the package name:
 atlas_subdir( AthenaConfiguration )
 
+# External dependencies.
+find_package( future )
+
 # Install files from the package:
 atlas_install_python_modules( python/*.py python/iconfTool
                               POST_BUILD_CMD ${ATLAS_FLAKE8} )
diff --git a/Control/AthenaPython/CMakeLists.txt b/Control/AthenaPython/CMakeLists.txt
index 460c29c03f83..d4d363433040 100644
--- a/Control/AthenaPython/CMakeLists.txt
+++ b/Control/AthenaPython/CMakeLists.txt
@@ -7,6 +7,7 @@ atlas_subdir( AthenaPython )
 find_package( Python COMPONENTS Development )
 find_package( ROOT COMPONENTS Core PyROOT ROOTTPython
    cppyy${Python_VERSION_MAJOR}_${Python_VERSION_MINOR} )
+find_package( future )
 
 # Component(s) in the package:
 atlas_add_library( AthenaPython
-- 
GitLab


From cbcfcc1a78e8258fecf5ed35948ac8a2302959e1 Mon Sep 17 00:00:00 2001
From: Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
Date: Mon, 21 Dec 2020 12:45:37 +0100
Subject: [PATCH 200/225] Taught the script to ignore warnings about unknown
 auxiliary variable types.

Converter tests in "mini-projects" (that do not have the full EDM
available to them) may print such warnings during the tests. Without
making the tests fail.
---
 .../AthenaPoolUtilities/share/post_tpcnvtest.sh          | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/Database/AthenaPOOL/AthenaPoolUtilities/share/post_tpcnvtest.sh b/Database/AthenaPOOL/AthenaPoolUtilities/share/post_tpcnvtest.sh
index b016ef4abbb8..ffcc54830bdb 100755
--- a/Database/AthenaPOOL/AthenaPoolUtilities/share/post_tpcnvtest.sh
+++ b/Database/AthenaPOOL/AthenaPoolUtilities/share/post_tpcnvtest.sh
@@ -1,8 +1,8 @@
 #!/bin/sh
 #/** @file post.sh
-# @brief sh script that check the return code of an executable and compares 
+# @brief sh script that check the return code of an executable and compares
 # its output with a reference (if available).
-# @param test_name 
+# @param test_name
 #
 # @author Paolo Calafiura <pcalafiura@lbl.gov> - ATLAS Collaboration.
 # $Id: post_check.sh,v 1.32 2009-05-06 18:10:12 ssnyder Exp $
@@ -248,11 +248,13 @@ PP="$PP"'|WARNING: new xAOD variables '
 # From MuonCondAlg.
 PP="$PP"'|Empty temporary A-line container'
 
+# Warnings from mini-projects, not holding all the EDM classes.
+PP="$PP"'|^RootAuxDynReader::init.*Could not find auxid for'
 
 test=$1
 if [ -z "$testStatus" ]; then
     echo "post.sh> Warning: athena exit status is not available "
-else 
+else
     # check exit status
     joblog=${test}.log
     if [ -r ${test}-SKIPPED ]; then
@@ -316,4 +318,3 @@ fi
 joblog=${test}.log
 
 exit $testStatus
-
-- 
GitLab


From 9b58009b388d32e3dc196c9571f317addc8f2b8c Mon Sep 17 00:00:00 2001
From: Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
Date: Mon, 21 Dec 2020 12:48:25 +0100
Subject: [PATCH 201/225] Made all (enabled) T/P converter tests succeed in
 AthAnalysis.

ROOT-10940 is hitting the AthAnalysis projects in this test, unlike
all the other projects weirdly enough.

At the same time also disabled some of the tests completely, as they
do not work correctly with the reduced EDM provided by AthAnalysis.
---
 .../test/xAODBTaggingAthenaPool_21.0.79_test.py           | 4 ++++
 Event/xAOD/xAODCaloEventAthenaPool/CMakeLists.txt         | 6 ++++++
 .../test/xAODCaloEventAthenaPool_20.1.7.2_test.py         | 4 ++++
 .../test/xAODCaloEventAthenaPool_21.0.79_test.py          | 4 ++++
 .../test/xAODEgammaAthenaPool_20.1.7.2_test.py            | 4 ++++
 .../test/xAODEgammaAthenaPool_21.0.79_test.py             | 4 ++++
 .../test/xAODJetAthenaPool_20.7.2.2_test.py               | 4 ++++
 .../test/xAODJetAthenaPool_21.0.79_test.py                | 4 ++++
 .../test/xAODMissingETAthenaPool_20.1.7.2_test.py         | 4 ++++
 .../test/xAODMissingETAthenaPool_21.0.79_test.py          | 4 ++++
 Event/xAOD/xAODMuonAthenaPool/CMakeLists.txt              | 6 ++++++
 .../test/xAODMuonAthenaPool_20.1.7.2_test.py              | 4 ++++
 .../test/xAODMuonAthenaPool_20.7.2.2_test.py              | 4 ++++
 .../test/xAODMuonAthenaPool_20.7.9.9_test.py              | 4 ++++
 .../test/xAODMuonAthenaPool_21.0.79_test.py               | 4 ++++
 .../test/xAODMuonAthenaPool_master-20190911_test.py       | 4 ++++
 .../test/xAODPFlowAthenaPool_21.0.79_test.py              | 4 ++++
 .../test/xAODParticleAthenaPool_21.0.79_test.py           | 4 ++++
 .../test/xAODTauAthenaPool_20.1.7.2_test.py               | 4 ++++
 .../test/xAODTauAthenaPool_20.7.2.2_test.py               | 4 ++++
 .../test/xAODTauAthenaPool_21.0.79_test.py                | 4 ++++
 Event/xAOD/xAODTrackingAthenaPool/CMakeLists.txt          | 6 ++++++
 .../test/xAODTrigCaloAthenaPool_20.0.0.3_test.py          | 4 ++++
 .../test/xAODTrigCaloAthenaPool_21.0.79_test.py           | 4 ++++
 .../test/xAODTrigEgammaAthenaPool_21.0.79_test.py         | 4 ++++
 .../test/xAODTrigMissingETAthenaPool_21.0.79_test.py      | 4 ++++
 .../test/xAODTrigMuonAthenaPool_20.1.7.2_test.py          | 4 ++++
 .../test/xAODTrigMuonAthenaPool_21.0.79_test.py           | 4 ++++
 .../test/xAODTriggerAthenaPool_20.1.7.2_test.py           | 4 ++++
 .../test/xAODTriggerAthenaPool_master-20190911_test.py    | 4 ++++
 .../test/xAODTruthAthenaPool_21.0.79_test.py              | 8 ++++++--
 31 files changed, 132 insertions(+), 2 deletions(-)

diff --git a/Event/xAOD/xAODBTaggingAthenaPool/test/xAODBTaggingAthenaPool_21.0.79_test.py b/Event/xAOD/xAODBTaggingAthenaPool/test/xAODBTaggingAthenaPool_21.0.79_test.py
index 1586a515aae1..5dbe62db82c8 100755
--- a/Event/xAOD/xAODBTaggingAthenaPool/test/xAODBTaggingAthenaPool_21.0.79_test.py
+++ b/Event/xAOD/xAODBTaggingAthenaPool/test/xAODBTaggingAthenaPool_21.0.79_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-21.0.79/AOD-21.0.79-full.pool.root'
     keys = [
         #xAOD::BTaggingAuxContainer_v1
diff --git a/Event/xAOD/xAODCaloEventAthenaPool/CMakeLists.txt b/Event/xAOD/xAODCaloEventAthenaPool/CMakeLists.txt
index c9651a361957..5901acedf5bb 100644
--- a/Event/xAOD/xAODCaloEventAthenaPool/CMakeLists.txt
+++ b/Event/xAOD/xAODCaloEventAthenaPool/CMakeLists.txt
@@ -26,6 +26,12 @@ atlas_add_poolcnv_library( xAODCaloEventAthenaPoolPoolCnv
 atlas_install_joboptions( share/*.py )
 atlas_install_scripts( test/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
 
+# In AthAnalysis xAOD::CaloCluster doesn't know about its CaloCell link. Which
+# makes the converter tests fail in that project...
+if( XAOD_ANALYSIS )
+   return()
+endif()
+
 # Set up (a) test(s) for the converter(s):
 find_package( AthenaPoolUtilitiesTest )
 
diff --git a/Event/xAOD/xAODCaloEventAthenaPool/test/xAODCaloEventAthenaPool_20.1.7.2_test.py b/Event/xAOD/xAODCaloEventAthenaPool/test/xAODCaloEventAthenaPool_20.1.7.2_test.py
index 2e4154e6f870..5d39af506619 100755
--- a/Event/xAOD/xAODCaloEventAthenaPool/test/xAODCaloEventAthenaPool_20.1.7.2_test.py
+++ b/Event/xAOD/xAODCaloEventAthenaPool/test/xAODCaloEventAthenaPool_20.1.7.2_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-20.1.7.2/AOD-20.1.7.2-full.pool.root'
     keys = [
         #xAOD::CaloCluster
diff --git a/Event/xAOD/xAODCaloEventAthenaPool/test/xAODCaloEventAthenaPool_21.0.79_test.py b/Event/xAOD/xAODCaloEventAthenaPool/test/xAODCaloEventAthenaPool_21.0.79_test.py
index 2f7e4720ba46..2bd06fe7ecc1 100755
--- a/Event/xAOD/xAODCaloEventAthenaPool/test/xAODCaloEventAthenaPool_21.0.79_test.py
+++ b/Event/xAOD/xAODCaloEventAthenaPool/test/xAODCaloEventAthenaPool_21.0.79_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-21.0.79/AOD-21.0.79-full.pool.root'
     keys = [
         #xAOD::CaloCluster
diff --git a/Event/xAOD/xAODEgammaAthenaPool/test/xAODEgammaAthenaPool_20.1.7.2_test.py b/Event/xAOD/xAODEgammaAthenaPool/test/xAODEgammaAthenaPool_20.1.7.2_test.py
index 1a002c879aa1..56410043ddac 100755
--- a/Event/xAOD/xAODEgammaAthenaPool/test/xAODEgammaAthenaPool_20.1.7.2_test.py
+++ b/Event/xAOD/xAODEgammaAthenaPool/test/xAODEgammaAthenaPool_20.1.7.2_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-20.1.7.2/AOD-20.1.7.2-full.pool.root'
     keys = [
         #xAOD::ElectronAuxContainer
diff --git a/Event/xAOD/xAODEgammaAthenaPool/test/xAODEgammaAthenaPool_21.0.79_test.py b/Event/xAOD/xAODEgammaAthenaPool/test/xAODEgammaAthenaPool_21.0.79_test.py
index 6d1e56c27f74..7321ff27d183 100755
--- a/Event/xAOD/xAODEgammaAthenaPool/test/xAODEgammaAthenaPool_21.0.79_test.py
+++ b/Event/xAOD/xAODEgammaAthenaPool/test/xAODEgammaAthenaPool_21.0.79_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-21.0.79/AOD-21.0.79-full.pool.root'
     keys = [
         #xAOD::ElectronAuxContainer_v3
diff --git a/Event/xAOD/xAODJetAthenaPool/test/xAODJetAthenaPool_20.7.2.2_test.py b/Event/xAOD/xAODJetAthenaPool/test/xAODJetAthenaPool_20.7.2.2_test.py
index ce7b77031206..3f28b32a09b6 100755
--- a/Event/xAOD/xAODJetAthenaPool/test/xAODJetAthenaPool_20.7.2.2_test.py
+++ b/Event/xAOD/xAODJetAthenaPool/test/xAODJetAthenaPool_20.7.2.2_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-20.7.2.2/AOD-20.7.2.2-full.pool.root'
     keys = [
         #xAOD::JetTrigAuxContainer_v2
diff --git a/Event/xAOD/xAODJetAthenaPool/test/xAODJetAthenaPool_21.0.79_test.py b/Event/xAOD/xAODJetAthenaPool/test/xAODJetAthenaPool_21.0.79_test.py
index 98994b79d3bd..8fe437f40e5a 100755
--- a/Event/xAOD/xAODJetAthenaPool/test/xAODJetAthenaPool_21.0.79_test.py
+++ b/Event/xAOD/xAODJetAthenaPool/test/xAODJetAthenaPool_21.0.79_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-21.0.79/AOD-21.0.79-full.pool.root'
     keys = [
         #xAOD::JetTrigAuxContainer_v2
diff --git a/Event/xAOD/xAODMissingETAthenaPool/test/xAODMissingETAthenaPool_20.1.7.2_test.py b/Event/xAOD/xAODMissingETAthenaPool/test/xAODMissingETAthenaPool_20.1.7.2_test.py
index d933826d07db..eb457c8a619c 100755
--- a/Event/xAOD/xAODMissingETAthenaPool/test/xAODMissingETAthenaPool_20.1.7.2_test.py
+++ b/Event/xAOD/xAODMissingETAthenaPool/test/xAODMissingETAthenaPool_20.1.7.2_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-20.1.7.2/AOD-20.1.7.2-full.pool.root'
     keys = [
         #xAOD::MissingETAssociationMap
diff --git a/Event/xAOD/xAODMissingETAthenaPool/test/xAODMissingETAthenaPool_21.0.79_test.py b/Event/xAOD/xAODMissingETAthenaPool/test/xAODMissingETAthenaPool_21.0.79_test.py
index f43f7b83428d..3b2e3aad5648 100755
--- a/Event/xAOD/xAODMissingETAthenaPool/test/xAODMissingETAthenaPool_21.0.79_test.py
+++ b/Event/xAOD/xAODMissingETAthenaPool/test/xAODMissingETAthenaPool_21.0.79_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-21.0.79/AOD-21.0.79-full.pool.root'
     keys = [
         #xAOD::MissingETAuxAssociationMap_v2
diff --git a/Event/xAOD/xAODMuonAthenaPool/CMakeLists.txt b/Event/xAOD/xAODMuonAthenaPool/CMakeLists.txt
index 353c84b01d8f..9c8f759fcd66 100644
--- a/Event/xAOD/xAODMuonAthenaPool/CMakeLists.txt
+++ b/Event/xAOD/xAODMuonAthenaPool/CMakeLists.txt
@@ -25,6 +25,12 @@ atlas_add_poolcnv_library( xAODMuonAthenaPoolPoolCnv
 atlas_install_joboptions( share/*.py )
 atlas_install_scripts( test/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
 
+# In AthAnalysis xAOD::Muon doesn't know about its MuonSegment link. Which
+# makes the converter tests fail in that project...
+if( XAOD_ANALYSIS )
+   return()
+endif()
+
 # Set up (a) test(s) for the converter(s):
 find_package( AthenaPoolUtilitiesTest )
 
diff --git a/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_20.1.7.2_test.py b/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_20.1.7.2_test.py
index 0b989d4954b6..d2748c20b966 100755
--- a/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_20.1.7.2_test.py
+++ b/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_20.1.7.2_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-20.1.7.2/AOD-20.1.7.2-full.pool.root'
     keys = [
         #Muons...
diff --git a/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_20.7.2.2_test.py b/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_20.7.2.2_test.py
index cc7882cc2a83..b732ce2c7a97 100755
--- a/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_20.7.2.2_test.py
+++ b/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_20.7.2.2_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-20.7.2.2/AOD-20.7.2.2-full.pool.root'
     keys = [
         #xAOD::MuonAuxContainer_v2
diff --git a/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_20.7.9.9_test.py b/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_20.7.9.9_test.py
index 35210998e699..784da1fbdb69 100755
--- a/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_20.7.9.9_test.py
+++ b/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_20.7.9.9_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-20.7.9.9/AOD-20.7.9.9-full.pool.root'
     keys = [
         #xAOD::MuonAuxContainer_v4
diff --git a/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_21.0.79_test.py b/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_21.0.79_test.py
index 742918ebc9be..95cf862fec0a 100755
--- a/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_21.0.79_test.py
+++ b/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_21.0.79_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-21.0.79/AOD-21.0.79-full.pool.root'
     keys = [
         #xAOD::MuonAuxContainer_v4
diff --git a/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_master-20190911_test.py b/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_master-20190911_test.py
index 70a4d1ae5123..81a183add39e 100755
--- a/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_master-20190911_test.py
+++ b/Event/xAOD/xAODMuonAthenaPool/test/xAODMuonAthenaPool_master-20190911_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-master-20190911/AOD-master-20190911-full.pool.root'
     keys = [
         #xAOD::MuonAuxContainer_v5
diff --git a/Event/xAOD/xAODPFlowAthenaPool/test/xAODPFlowAthenaPool_21.0.79_test.py b/Event/xAOD/xAODPFlowAthenaPool/test/xAODPFlowAthenaPool_21.0.79_test.py
index a3d3f81fa19f..3a2042e8dd8f 100755
--- a/Event/xAOD/xAODPFlowAthenaPool/test/xAODPFlowAthenaPool_21.0.79_test.py
+++ b/Event/xAOD/xAODPFlowAthenaPool/test/xAODPFlowAthenaPool_21.0.79_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-21.0.79/AOD-21.0.79-full.pool.root'
     keys = [
         #xAOD::PFOAuxContainer_v1
diff --git a/Event/xAOD/xAODParticleEventAthenaPool/test/xAODParticleAthenaPool_21.0.79_test.py b/Event/xAOD/xAODParticleEventAthenaPool/test/xAODParticleAthenaPool_21.0.79_test.py
index eaaf9cc1d31c..67fad4ce1b7c 100755
--- a/Event/xAOD/xAODParticleEventAthenaPool/test/xAODParticleAthenaPool_21.0.79_test.py
+++ b/Event/xAOD/xAODParticleEventAthenaPool/test/xAODParticleAthenaPool_21.0.79_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-21.0.79/AOD-21.0.79-full.pool.root'
     keys = [
         #xAOD::ParticleAuxContainer_v1
diff --git a/Event/xAOD/xAODTauAthenaPool/test/xAODTauAthenaPool_20.1.7.2_test.py b/Event/xAOD/xAODTauAthenaPool/test/xAODTauAthenaPool_20.1.7.2_test.py
index 8b2bbfeb0476..32ed933c6642 100755
--- a/Event/xAOD/xAODTauAthenaPool/test/xAODTauAthenaPool_20.1.7.2_test.py
+++ b/Event/xAOD/xAODTauAthenaPool/test/xAODTauAthenaPool_20.1.7.2_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-20.1.7.2/AOD-20.1.7.2-full.pool.root'
     keys = [
         #xAOD::TauJetAuxContainer
diff --git a/Event/xAOD/xAODTauAthenaPool/test/xAODTauAthenaPool_20.7.2.2_test.py b/Event/xAOD/xAODTauAthenaPool/test/xAODTauAthenaPool_20.7.2.2_test.py
index dae8e87fa0d6..1a7a0f7667c1 100755
--- a/Event/xAOD/xAODTauAthenaPool/test/xAODTauAthenaPool_20.7.2.2_test.py
+++ b/Event/xAOD/xAODTauAthenaPool/test/xAODTauAthenaPool_20.7.2.2_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-20.7.2.2/AOD-20.7.2.2-full.pool.root'
     keys = [
         #xAOD::DiTauJetAuxContainer_v1
diff --git a/Event/xAOD/xAODTauAthenaPool/test/xAODTauAthenaPool_21.0.79_test.py b/Event/xAOD/xAODTauAthenaPool/test/xAODTauAthenaPool_21.0.79_test.py
index a65bbb30733d..224831477886 100755
--- a/Event/xAOD/xAODTauAthenaPool/test/xAODTauAthenaPool_21.0.79_test.py
+++ b/Event/xAOD/xAODTauAthenaPool/test/xAODTauAthenaPool_21.0.79_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-21.0.79/AOD-21.0.79-full.pool.root'
     keys = [
         #xAOD::DiTauJetAuxContainer_v1
diff --git a/Event/xAOD/xAODTrackingAthenaPool/CMakeLists.txt b/Event/xAOD/xAODTrackingAthenaPool/CMakeLists.txt
index dd31c801fa82..de3f338d3359 100644
--- a/Event/xAOD/xAODTrackingAthenaPool/CMakeLists.txt
+++ b/Event/xAOD/xAODTrackingAthenaPool/CMakeLists.txt
@@ -37,6 +37,12 @@ atlas_add_poolcnv_library( xAODTrackingAthenaPoolPoolCnv
 atlas_install_joboptions( share/*.py )
 atlas_install_scripts( test/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
 
+# In AthAnalysis xAOD::TrackParticle doesn't know about its Trk::Track link.
+# Which makes the converter tests fail in that project...
+if( XAOD_ANALYSIS )
+   return()
+endif()
+
 # Set up (a) test(s) for the converter(s):
 find_package( AthenaPoolUtilitiesTest )
 
diff --git a/Event/xAOD/xAODTrigCaloAthenaPool/test/xAODTrigCaloAthenaPool_20.0.0.3_test.py b/Event/xAOD/xAODTrigCaloAthenaPool/test/xAODTrigCaloAthenaPool_20.0.0.3_test.py
index 91c4eb7011bb..4c854f1614d0 100755
--- a/Event/xAOD/xAODTrigCaloAthenaPool/test/xAODTrigCaloAthenaPool_20.0.0.3_test.py
+++ b/Event/xAOD/xAODTrigCaloAthenaPool/test/xAODTrigCaloAthenaPool_20.0.0.3_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-20.0.0.3/AOD-20.0.0.3-full.pool.root'
     keys = [
         #xAOD::TrigCaloClusterAuxContainer_v1
diff --git a/Event/xAOD/xAODTrigCaloAthenaPool/test/xAODTrigCaloAthenaPool_21.0.79_test.py b/Event/xAOD/xAODTrigCaloAthenaPool/test/xAODTrigCaloAthenaPool_21.0.79_test.py
index 3687da81dbee..5596c4ad8c9c 100755
--- a/Event/xAOD/xAODTrigCaloAthenaPool/test/xAODTrigCaloAthenaPool_21.0.79_test.py
+++ b/Event/xAOD/xAODTrigCaloAthenaPool/test/xAODTrigCaloAthenaPool_21.0.79_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-21.0.79/AOD-21.0.79-full.pool.root'
     keys = [
         #xAOD::CaloClusterTrigAuxContainer_v1
diff --git a/Event/xAOD/xAODTrigEgammaAthenaPool/test/xAODTrigEgammaAthenaPool_21.0.79_test.py b/Event/xAOD/xAODTrigEgammaAthenaPool/test/xAODTrigEgammaAthenaPool_21.0.79_test.py
index 7564d3e52771..8e88594ce85d 100755
--- a/Event/xAOD/xAODTrigEgammaAthenaPool/test/xAODTrigEgammaAthenaPool_21.0.79_test.py
+++ b/Event/xAOD/xAODTrigEgammaAthenaPool/test/xAODTrigEgammaAthenaPool_21.0.79_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-21.0.79/AOD-21.0.79-full.pool.root'
     keys = [
         #xAOD::ElectronTrigAuxContainer_v1
diff --git a/Event/xAOD/xAODTrigMissingETAthenaPool/test/xAODTrigMissingETAthenaPool_21.0.79_test.py b/Event/xAOD/xAODTrigMissingETAthenaPool/test/xAODTrigMissingETAthenaPool_21.0.79_test.py
index 658ee021b7ae..05e7b59a195c 100755
--- a/Event/xAOD/xAODTrigMissingETAthenaPool/test/xAODTrigMissingETAthenaPool_21.0.79_test.py
+++ b/Event/xAOD/xAODTrigMissingETAthenaPool/test/xAODTrigMissingETAthenaPool_21.0.79_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-21.0.79/AOD-21.0.79-full.pool.root'
     keys = [
         #xAOD::TrigMissingETAuxContainer_v1
diff --git a/Event/xAOD/xAODTrigMuonAthenaPool/test/xAODTrigMuonAthenaPool_20.1.7.2_test.py b/Event/xAOD/xAODTrigMuonAthenaPool/test/xAODTrigMuonAthenaPool_20.1.7.2_test.py
index a728cd133616..31b049dbc6e7 100755
--- a/Event/xAOD/xAODTrigMuonAthenaPool/test/xAODTrigMuonAthenaPool_20.1.7.2_test.py
+++ b/Event/xAOD/xAODTrigMuonAthenaPool/test/xAODTrigMuonAthenaPool_20.1.7.2_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-20.1.7.2/AOD-20.1.7.2-full.pool.root'
     keys = [
         #xAOD::L2CombinedMuonAuxContainer
diff --git a/Event/xAOD/xAODTrigMuonAthenaPool/test/xAODTrigMuonAthenaPool_21.0.79_test.py b/Event/xAOD/xAODTrigMuonAthenaPool/test/xAODTrigMuonAthenaPool_21.0.79_test.py
index 0e157b4bf1af..296f9eeb4291 100755
--- a/Event/xAOD/xAODTrigMuonAthenaPool/test/xAODTrigMuonAthenaPool_21.0.79_test.py
+++ b/Event/xAOD/xAODTrigMuonAthenaPool/test/xAODTrigMuonAthenaPool_21.0.79_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-21.0.79/AOD-21.0.79-full.pool.root'
     keys = [
         #xAOD::L2CombinedMuonAuxContainer_v1
diff --git a/Event/xAOD/xAODTriggerAthenaPool/test/xAODTriggerAthenaPool_20.1.7.2_test.py b/Event/xAOD/xAODTriggerAthenaPool/test/xAODTriggerAthenaPool_20.1.7.2_test.py
index 476752fdba8e..67e184e1ae59 100755
--- a/Event/xAOD/xAODTriggerAthenaPool/test/xAODTriggerAthenaPool_20.1.7.2_test.py
+++ b/Event/xAOD/xAODTriggerAthenaPool/test/xAODTriggerAthenaPool_20.1.7.2_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-20.1.7.2/AOD-20.1.7.2-full.pool.root'
     keys = [
         #EmTauRoI
diff --git a/Event/xAOD/xAODTriggerAthenaPool/test/xAODTriggerAthenaPool_master-20190911_test.py b/Event/xAOD/xAODTriggerAthenaPool/test/xAODTriggerAthenaPool_master-20190911_test.py
index 7f2c7e0ceb2d..ff34d84ada56 100755
--- a/Event/xAOD/xAODTriggerAthenaPool/test/xAODTriggerAthenaPool_master-20190911_test.py
+++ b/Event/xAOD/xAODTriggerAthenaPool/test/xAODTriggerAthenaPool_master-20190911_test.py
@@ -3,10 +3,14 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
     infile = 'aod/AOD-master-20190911/AOD-master-20190911-full.pool.root'
     keys = [
         #EmTauRoI_v2
diff --git a/Event/xAOD/xAODTruthAthenaPool/test/xAODTruthAthenaPool_21.0.79_test.py b/Event/xAOD/xAODTruthAthenaPool/test/xAODTruthAthenaPool_21.0.79_test.py
index 0f6816c00729..22c15e5c3052 100755
--- a/Event/xAOD/xAODTruthAthenaPool/test/xAODTruthAthenaPool_21.0.79_test.py
+++ b/Event/xAOD/xAODTruthAthenaPool/test/xAODTruthAthenaPool_21.0.79_test.py
@@ -3,11 +3,15 @@
 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 """
 
+import ROOT
 from AthenaPoolUtilities.TPCnvTestConfig import TPCnvTest
 
 if __name__ == "__main__":
-    infile = 'aod/AOD-21.0.79/AOD-21.0.79-full.pool.root'
 
+    # Force-load some dictionaries. Needed to work around ROOT-10940.
+    ROOT.xAOD.CaloCluster()
+
+    infile = 'aod/AOD-21.0.79/AOD-21.0.79-full.pool.root'
     keys = [
         #xAOD::TruthEventAuxContainer_v1
         'TruthEvents',
@@ -19,4 +23,4 @@ if __name__ == "__main__":
         'TruthVertices',
     ]
 
-    TPCnvTest(infile, keys)#, useGeoModelSvc=True, doLAr=True, doTile=True)
+    TPCnvTest(infile, keys)
-- 
GitLab


From 4f37164b43037984920210a057fe7333f79f3677 Mon Sep 17 00:00:00 2001
From: Edward Moyse <edward.moyse@cern.ch>
Date: Mon, 21 Dec 2020 12:56:06 +0000
Subject: [PATCH 202/225] Remove extraneous lines from MuonRec_jobOptions.py
 These only made sense in the separate MuonCalibConfig.py. Remove them from
 here. Fixes ATLASRECTS-5848.

---
 .../MuonRecExample/share/MuonRec_jobOptions.py                 | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/MuonSpectrometer/MuonReconstruction/MuonRecExample/share/MuonRec_jobOptions.py b/MuonSpectrometer/MuonReconstruction/MuonRecExample/share/MuonRec_jobOptions.py
index 3ff7e1613a5e..965de10bed2c 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonRecExample/share/MuonRec_jobOptions.py
+++ b/MuonSpectrometer/MuonReconstruction/MuonRecExample/share/MuonRec_jobOptions.py
@@ -193,9 +193,6 @@ elif muonRecFlags.doCalib():
     from MuonRecExample import MuonAlignConfig
     from MuonCnvExample import setupMuonCalib
     setupMuonCalib()
-else:
-    logMuon.warning("Loading %s but not setting up any MuonCalibration or Ntuple" % __name__ )
-
 
 #--------------------------------------------------------------------------
 # Evaluate tracking performance
-- 
GitLab


From cb7db94c1523ab6886093c4d6f9d094203103124 Mon Sep 17 00:00:00 2001
From: Edward Moyse <edward.moyse@cern.ch>
Date: Mon, 21 Dec 2020 12:57:25 +0000
Subject: [PATCH 203/225] Revert "Remove extraneous lines from
 MuonRec_jobOptions.py"

This reverts commit 4f37164b43037984920210a057fe7333f79f3677
---
 .../MuonRecExample/share/MuonRec_jobOptions.py                 | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/MuonSpectrometer/MuonReconstruction/MuonRecExample/share/MuonRec_jobOptions.py b/MuonSpectrometer/MuonReconstruction/MuonRecExample/share/MuonRec_jobOptions.py
index 965de10bed2c..3ff7e1613a5e 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonRecExample/share/MuonRec_jobOptions.py
+++ b/MuonSpectrometer/MuonReconstruction/MuonRecExample/share/MuonRec_jobOptions.py
@@ -193,6 +193,9 @@ elif muonRecFlags.doCalib():
     from MuonRecExample import MuonAlignConfig
     from MuonCnvExample import setupMuonCalib
     setupMuonCalib()
+else:
+    logMuon.warning("Loading %s but not setting up any MuonCalibration or Ntuple" % __name__ )
+
 
 #--------------------------------------------------------------------------
 # Evaluate tracking performance
-- 
GitLab


From c6069d9c514b97ea496ad5aa01a69f97bb15468e Mon Sep 17 00:00:00 2001
From: Edward Moyse <edward.moyse@cern.ch>
Date: Mon, 21 Dec 2020 14:02:39 +0100
Subject: [PATCH 204/225] Remove extraneous lines from MuonRec_jobOptions.py
 These only made sense in the separate MuonCalibConfig.py. Remove them from
 here. Fixes ATLASRECTS-5848.

---
 .../MuonRecExample/share/MuonRec_jobOptions.py                 | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/MuonSpectrometer/MuonReconstruction/MuonRecExample/share/MuonRec_jobOptions.py b/MuonSpectrometer/MuonReconstruction/MuonRecExample/share/MuonRec_jobOptions.py
index 3ff7e1613a5e..965de10bed2c 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonRecExample/share/MuonRec_jobOptions.py
+++ b/MuonSpectrometer/MuonReconstruction/MuonRecExample/share/MuonRec_jobOptions.py
@@ -193,9 +193,6 @@ elif muonRecFlags.doCalib():
     from MuonRecExample import MuonAlignConfig
     from MuonCnvExample import setupMuonCalib
     setupMuonCalib()
-else:
-    logMuon.warning("Loading %s but not setting up any MuonCalibration or Ntuple" % __name__ )
-
 
 #--------------------------------------------------------------------------
 # Evaluate tracking performance
-- 
GitLab


From 22089cf8abdb4bc432b8ee15a3e7a8cf6c7a26db Mon Sep 17 00:00:00 2001
From: Gabriel Facini <gabriel.facini@cern.ch>
Date: Mon, 21 Dec 2020 15:45:56 +0000
Subject: [PATCH 205/225] configuration to use correct (only) NN for Run I

---
 .../InDetExample/InDetRecExample/python/TrackingCommon.py     | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/InnerDetector/InDetExample/InDetRecExample/python/TrackingCommon.py b/InnerDetector/InDetExample/InDetRecExample/python/TrackingCommon.py
index 761913acf116..1512c01c43b2 100644
--- a/InnerDetector/InDetExample/InDetRecExample/python/TrackingCommon.py
+++ b/InnerDetector/InDetExample/InDetRecExample/python/TrackingCommon.py
@@ -325,6 +325,10 @@ def getNnClusterizationFactory(name='NnClusterizationFactory', **kwargs) :
     useTTrainedNetworks = InDetFlags.useNNTTrainedNetworks()
     from AtlasGeoModel.CommonGMJobProperties import CommonGeometryFlags as geoFlags
     do_runI = geoFlags.Run() not in ["RUN2", "RUN3"]
+
+    if do_runI and not useTTrainedNetworks:
+      log.debug("useNNTTrainedNetworks must be True for Run I. Contact CTIDE for questions.")
+      useTTrainedNetworks = True
     
     if useTTrainedNetworks :
       log.debug("Setting up TTrainedNetworks")
-- 
GitLab


From c7dfab974ccf2c57d9df23a4593b0ace8ae290c7 Mon Sep 17 00:00:00 2001
From: Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
Date: Mon, 21 Dec 2020 17:25:56 +0100
Subject: [PATCH 206/225] Removed a memory leak from MdtSegmentT0Fitter.

At the same time cleaned the CMake configuration of the package
a bit as well.
---
 .../MdtSegmentT0Fitter/CMakeLists.txt         |  18 +-
 .../src/MdtSegmentT0Fitter.cxx                | 195 +++++++++---------
 2 files changed, 104 insertions(+), 109 deletions(-)

diff --git a/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/MdtSegmentT0Fitter/CMakeLists.txt b/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/MdtSegmentT0Fitter/CMakeLists.txt
index 4dc59bec52a2..e985bf243958 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/MdtSegmentT0Fitter/CMakeLists.txt
+++ b/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/MdtSegmentT0Fitter/CMakeLists.txt
@@ -1,19 +1,15 @@
-################################################################################
-# Package: MdtSegmentT0Fitter
-################################################################################
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # Declare the package name:
 atlas_subdir( MdtSegmentT0Fitter )
 
 # External dependencies:
-find_package( ROOT COMPONENTS Minuit Core Tree MathCore Hist RIO pthread MathMore Minuit2 Matrix Physics HistPainter Rint )
+find_package( ROOT COMPONENTS Core MathCore Minuit2 )
 
 # Component(s) in the package:
 atlas_add_component( MdtSegmentT0Fitter
-                     src/*.cxx
-                     src/components/*.cxx
-                     INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaBaseComps GaudiKernel MdtCalibSvcLib TrkDriftCircleMath MdtCalibData MuonCalibToolsLib MuonReadoutGeometry MuonIdHelpersLib MuonPrepRawData MuonRIO_OnTrack MuonSegmentMakerInterfacesLib )
-
-# Install files from the package:
-atlas_install_headers( MdtSegmentT0Fitter )
+   MdtSegmentT0Fitter/*.h src/*.cxx src/components/*.cxx
+   INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
+   LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaBaseComps GaudiKernel MdtCalibSvcLib
+   TrkDriftCircleMath MdtCalibData MuonReadoutGeometry MuonPrepRawData
+   MuonRIO_OnTrack MuonSegmentMakerInterfacesLib )
diff --git a/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/MdtSegmentT0Fitter/src/MdtSegmentT0Fitter.cxx b/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/MdtSegmentT0Fitter/src/MdtSegmentT0Fitter.cxx
index 5c9ab78eaacf..e5a9311aec54 100755
--- a/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/MdtSegmentT0Fitter/src/MdtSegmentT0Fitter.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/MdtSegmentT0Fitter/src/MdtSegmentT0Fitter.cxx
@@ -57,15 +57,15 @@ namespace TrkDriftCircleMath {
       FunctionToMinimize(const int used) : m_data(),m_used(used),m_t0Error() {}
       ~FunctionToMinimize() {m_data.clear();}
       double DoEval(const double* xx) const {
-        double ang = xx[0];  
+        double ang = xx[0];
         double b = xx[1];
         double t0 = xx[2];
-        
+
         double cosin = std::cos(ang);
         double sinus = std::sin(ang);
-        
+
         double fval = 0.;
-        // Add t0 constraint 
+        // Add t0 constraint
         if (m_t0Error == WEAK_TOPO_T0ERROR ) {
          fval += xx[2]*xx[2]/(1.0 *m_t0Error*m_t0Error);
         }
@@ -79,7 +79,7 @@ namespace TrkDriftCircleMath {
           double uppercut = m_data[i].rt->tUpper();
           double lowercut = m_data[i].rt->tLower();
           // Penalty for t<lowercut and t >uppercut
-          if (t> uppercut ) { // too large 
+          if (t> uppercut ) { // too large
             fval += (t-uppercut)* (t-uppercut)*0.1;
           } else if (t < 0 ) {// too small
             fval += (t-lowercut)*(t-lowercut)*0.1;
@@ -112,7 +112,7 @@ namespace TrkDriftCircleMath {
 
   MdtSegmentT0Fitter::MdtSegmentT0Fitter(const std::string& ty,const std::string& na,const IInterface* pa)
   : AthAlgTool(ty,na,pa),
-    DCSLFitter(), 
+    DCSLFitter(),
     m_ntotalCalls(0),
     m_npassedNHits(0),
     m_npassedSelectionConsistency(0),
@@ -121,14 +121,14 @@ namespace TrkDriftCircleMath {
     m_npassedMinuitFit(0) {
     declareInterface <IDCSLFitProvider> (this);
   }
-  
+
   StatusCode MdtSegmentT0Fitter::initialize() {
     ATH_CHECK(m_calibrationDbTool.retrieve());
     return StatusCode::SUCCESS;
   }
-  
+
   StatusCode MdtSegmentT0Fitter::finalize() {
-    
+
     double scaleFactor = m_ntotalCalls != 0 ? 1./(double)m_ntotalCalls : 1.;
 
     ATH_MSG_INFO( "Summarizing fitter statistics " << "\n"
@@ -140,15 +140,15 @@ namespace TrkDriftCircleMath {
                   << " Passed Fit       " << std::setw(10) << m_npassedMinuitFit << "   " << scaleFactor*m_npassedMinuitFit  );
     return StatusCode::SUCCESS;
   }
-  
-  
+
+
   /***********************************************************************************/
   /// RT function from Craig Blocker
   /// ok for now, possibly replace with actual RT function used to calibrate run
-  
+
   constexpr double T2R_A[] = {1.184169e-1, 3.32382e-2, 4.179808e-4, -5.012896e-6, 2.61497e-8, -7.800677e-11, 1.407393e-13, -1.516193e-16, 8.967997e-20, -2.238627e-23};
   constexpr double RCORR_A[] = {234.3413, -5.803375, 5.061677e-2, -1.994959e-4, 4.017433e-7, -3.975037e-10, 1.522393e-13};
-  
+
   double rcorr(const double tin) {
     double rc;
     if(tin < 16.) {
@@ -162,25 +162,25 @@ namespace TrkDriftCircleMath {
       }
     }
     rc = rc*1e-3;
-    
+
     return rc;
   }
-  
+
   double t2r(const double tin) {
     if(tin < 0.) return 0.;
     if(tin > MAX_DRIFT) return 20.;
-    
+
     double tpow = 1.;
     double rc = 0.;
     for(int j = 0; j < 10; j++) {
       rc += T2R_A[j]*tpow;
       tpow *= tin;
     }
-    
+
     rc -= rcorr(tin);
     return rc;
   }
-  
+
   /// derivatives of RT function, use to get errors
   double rcorrprime(const double tin) {
     double rc;
@@ -195,26 +195,26 @@ namespace TrkDriftCircleMath {
       }
     }
     rc = rc*1e-3;
-    
+
     return rc;
   }
-  
+
   double t2rprime(const double tin) {
     if(tin < 0.) return 0.;
     if(tin > MAX_DRIFT) return 20.;
-    
+
     double tpow = 1.;
     double rc = 0.;
     for(int j = 1; j < 10; j++) {
       rc += j*T2R_A[j]*tpow;
       tpow *= tin;
     }
-    
+
     rc -= rcorrprime(tin);
     return rc;
   }
-  
-  
+
+
   /// use a binary search to get rt-inverse from rt
   /// assumes the function is monotonic, obviously not true for these polynomial parametrizations for all t
   double r2t(const double r) {
@@ -225,7 +225,7 @@ namespace TrkDriftCircleMath {
     } else if(r>t2r(tb)) {
       return R2TSPURIOUS;
     }
-    
+
     int itr = 0;
     while (ta <= tb) {
       double tm  = (ta + tb) / 2;  // compute mid point.
@@ -239,13 +239,13 @@ namespace TrkDriftCircleMath {
       else if (r < rtm ) {
         tb = tm; // repeat search in bottom half.
       }
-      
+
       itr++;
       if(itr>50) return -1;
     }
     return -1;    // failed to find key
   }
-  
+
   double r2t_ext(std::vector<const MuonCalib::IRtRelation*> *rtpointers, double r, int i) {
     const MuonCalib::IRtRelation* rtrel = rtpointers->at(i);
     double ta = rtrel->tLower();
@@ -255,7 +255,7 @@ namespace TrkDriftCircleMath {
     } else if(r>rtrel->radius(tb)) {
       return R2TSPURIOUS;
     }
-    
+
     int itr = 0;
     while (ta <= tb) {
       double tm  = (ta + tb) / 2;  // compute mid point.
@@ -269,7 +269,7 @@ namespace TrkDriftCircleMath {
       else if (r < rtm ) {
         tb = tm; // repeat search in bottom half.
       }
-      
+
       itr++;
       if(itr>50) return -1;
     }
@@ -285,18 +285,12 @@ namespace TrkDriftCircleMath {
 
     if(m_trace) ATH_MSG_DEBUG("New seg: ");
 
-    ROOT::Math::Minimizer* minimum = new ROOT::Minuit2::Minuit2Minimizer("algoName");
-    minimum->SetMaxFunctionCalls(1000000);
-    minimum->SetTolerance(0.001);
-    minimum->SetPrintLevel(-1);
-    if(msgLvl(MSG::VERBOSE)) minimum->SetPrintLevel(1);
- 
     const DCOnTrackVec& dcs_keep = dcs;
 
     unsigned int N = dcs_keep.size();
 
     result.setT0Shift(-99999,-99999);
-    
+
     if(N<2) {
       return false;
     }
@@ -304,7 +298,7 @@ namespace TrkDriftCircleMath {
     if( selection.size() != N ) {
       ATH_MSG_ERROR("MdtSegmentT0Fitter.cxx:fit with t0 <bad HitSelection>");
       return false;
-    }  
+    }
     ++m_npassedSelectionConsistency;
     int used=0;
     for(unsigned int i=0;i<N;++i){
@@ -320,12 +314,12 @@ namespace TrkDriftCircleMath {
 
       //
       //     Copy driftcircles and reset the drift radii as they might have been overwritten
-      //     after a succesfull t0 fit 
-      // 
+      //     after a succesfull t0 fit
+      //
 
       DCOnTrackVec::const_iterator it = dcs.begin();
       DCOnTrackVec::const_iterator it_end = dcs.end();
-      
+
       DCOnTrackVec dcs_new;
       dcs_new.reserve(dcs.size());
       double chi2p = 0.;
@@ -346,7 +340,7 @@ namespace TrkDriftCircleMath {
         }
       }
       if(m_trace&&chi2p>0) ATH_MSG_DEBUG("NO Minuit Fit TOO few hits Chi2 penalty " << chi2p);
-      bool oldrefit = DCSLFitter::fit( result, line, dcs_new, selection ); 
+      bool oldrefit = DCSLFitter::fit( result, line, dcs_new, selection );
       chi2p += result.chi2();
 // add chi2 penalty for too large or too small driftTimes  t < 0 or t> t upper
       result.set(chi2p, result.ndof(),  result.dtheta(),  result.dy0());
@@ -356,15 +350,15 @@ namespace TrkDriftCircleMath {
       return oldrefit;
     } else {
       if(m_trace) ATH_MSG_DEBUG("FITTING FOR T0 N "<<N<<" used " << used);
-    } 
+    }
 
     ++m_npassedMinHits;
-    
+
     if (m_trace) {
       ATH_MSG_DEBUG(" in  MdtSegmentT0Fitter::fit with N dcs "<< N << " hit selection size " <<  selection.size());
       ATH_MSG_DEBUG("in fit "<<result.hasT0Shift()<< " " <<result.t0Shift());
     }
-    
+
     double Zc(0);
     double Yc(0);
     double S(0);
@@ -372,7 +366,7 @@ namespace TrkDriftCircleMath {
     double Sy(0);
     std::vector<double> y(N);
     std::vector<double> z(N);
-    std::vector<double> w(N); 
+    std::vector<double> w(N);
     std::vector<double> r(N);
     std::vector<double> dr(N);
     std::vector<double> t(N);
@@ -393,7 +387,7 @@ namespace TrkDriftCircleMath {
         y[ii] = it->y();
         z[ii] = it->x();
         r[ii] = std::abs(roto->driftRadius());
-        dr[ii] = it->dr(); 
+        dr[ii] = it->dr();
         const Muon::MdtPrepData *peerd;
         peerd = dynamic_cast<const Muon::MdtPrepData*>(roto->prepRawData());
         if(!peerd) {
@@ -405,7 +399,7 @@ namespace TrkDriftCircleMath {
         rtpointers[ii] = rtInfo->rt();
         t[ii] = roto->driftTime();
 
-	double newerror = m_scaleErrors ? it->drPrecise() : it->dr();        
+	double newerror = m_scaleErrors ? it->drPrecise() : it->dr();
 
         if( newerror > 0.) w[ii] = 1./(newerror);
         else w[ii] = 0.;
@@ -416,7 +410,7 @@ namespace TrkDriftCircleMath {
         }
 
         if(m_trace) ATH_MSG_DEBUG("DC:  (" << y[ii] << "," << z[ii] << ") R = " << r[ii] << " W " << w[ii] <<" t " <<t[ii]<< " id: "<<it->id()<<" sel " << selection[ii]);
-        
+
         if( selection[ii] == 0 ){
           S+=w[ii];
           Sz+= w[ii]*z[ii];
@@ -430,15 +424,15 @@ namespace TrkDriftCircleMath {
     const double inv_S = 1. / S;
     Zc = Sz*inv_S;
     Yc = Sy*inv_S;
-    
+
     if(m_trace) ATH_MSG_DEBUG("Yc " << Yc << " Zc " << Zc);
-    
+
     /// go to coordinates centered at the average of the hits
     for(unsigned int i=0;i<N;++i) {
       y[i]  -= Yc;
       z[i]  -= Zc;
     }
-    
+
     int selcount(0);
     DCOnTrackVec::const_iterator it = dcs_keep.begin();
     DCOnTrackVec::const_iterator it_end = dcs_keep.end();
@@ -448,13 +442,13 @@ namespace TrkDriftCircleMath {
     // tlower_i < ti - t0 < tupper_i
     double min_tlower=1e10;
     double max_tupper=-1e10;
-    
+
     double t0seed=0; // the average t0 of the hit
     double st0 = 0; // the std deviation of the hit t0s
     double min_t0 = 1e10; // the smallest t0 seen
     double tee0, tl, th;
-    
-    
+
+
     for(int ii=0 ;it!=it_end; ++it, ++ii ){
       if( selection[ii] == 0 ) {
         double r2tval = r2t_ext(&rtpointers,  r[ii], ii) ;
@@ -481,7 +475,7 @@ namespace TrkDriftCircleMath {
         minFunct.addCoords(z[ii], t[ii], y[ii], w[ii], r[ii], rtpointers[ii]);
 
         selcount++;
-      } 
+      }
     }
     t0seed /= selcount;
     st0 = st0/selcount - t0seed*t0seed;
@@ -493,7 +487,7 @@ namespace TrkDriftCircleMath {
     double theta = line.phi();
     double cosin = std::cos(theta);
     double sinus = std::sin(theta);
-    
+
     if ( sinus < 0.0 ) {
       sinus = -sinus;
       cosin = -cosin;
@@ -501,17 +495,17 @@ namespace TrkDriftCircleMath {
       cosin = -cosin;
     }
     if(m_trace) ATH_MSG_DEBUG("before fit theta "<<theta<<" sinus "<<sinus<< " cosin "<< cosin);
-    
+
     double d = line.y0() + Zc*sinus-Yc*cosin;
-    
+
     if(m_trace) {
       ATH_MSG_DEBUG(" line x y "<<line.position().x()<<" "<<line.position().y());
       ATH_MSG_DEBUG(" Zc Yc "<< Zc <<" "<<Yc);
       ATH_MSG_DEBUG(" line x0 y0 "<<line.x0()<<" "<<line.y0());
       ATH_MSG_DEBUG(" hit shift " << -Zc*sinus+Yc*cosin);
-    } 
+    }
 
-// Calculate signed radii 
+// Calculate signed radii
 
     int nml1p = 0;
     int nml2p = 0;
@@ -539,12 +533,12 @@ namespace TrkDriftCircleMath {
       if(m_trace) ATH_MSG_DEBUG("Combination rejected for positive radii ML1 " <<  nml1p << " ML2 " <<  nml2p << " negative radii ML1 " << nml1n << " ML " << nml2n << " used hits " << used << " t0 Error " << t0Error);
       it = dcs.begin();
       it_end = dcs.end();
-      double chi2p = 0.; 
+      double chi2p = 0.;
       DCOnTrackVec dcs_new;
       dcs_new.reserve(dcs.size());
       for(int i=0; it!=it_end; ++it, ++i ){
 	const DriftCircle* ds  = & dcs[i];
-        if(std::abs(ds->r()-ds->rot()->driftRadius())>m_dRTol && m_trace) ATH_MSG_DEBUG("Different radii on dc " << ds->r() << " rot " << ds->rot()->driftRadius());  
+        if(std::abs(ds->r()-ds->rot()->driftRadius())>m_dRTol && m_trace) ATH_MSG_DEBUG("Different radii on dc " << ds->r() << " rot " << ds->rot()->driftRadius());
 	DriftCircle dc_keep(ds->position(), ds->rot()->driftRadius(), ds->dr(), ds->drPrecise(), ds->state(), ds->id(), ds->index(),ds->rot() );
 	DCOnTrack dc_new(dc_keep, 0., 0.);
 	dc_new.state(dcs[i].state());
@@ -556,15 +550,15 @@ namespace TrkDriftCircleMath {
           double tLow = rtInfo->rt()->tLower();
           if(t<tLow) chi2p += (t-tLow)*(t-tLow)*0.1;
           if(t>tUp) chi2p += (t-tUp)*(t-tUp)*0.1;
-        } 
+        }
       }
       if(m_trace&&chi2p>0) ATH_MSG_DEBUG(" Rejected weak topology Chi2 penalty " << chi2p);
-      bool oldrefit = DCSLFitter::fit( result, line, dcs_new, selection ); 
+      bool oldrefit = DCSLFitter::fit( result, line, dcs_new, selection );
       chi2p += result.chi2();
 // add chi2 penalty for too large or too small driftTimes  t < 0 or t> t upper
       result.set( chi2p, result.ndof(),  result.dtheta(),  result.dy0() );
       return oldrefit;
-    }  // end rejection of weak topologies  
+    }  // end rejection of weak topologies
 
     if(m_trace) ATH_MSG_DEBUG("positive radii ML1 " <<  nml1p << " ML2 " <<  nml2p << " negative radii ML1 " << nml1n << " ML " << nml2n << " used hits " << used << " t0 Error " << t0Error);
 
@@ -572,20 +566,26 @@ namespace TrkDriftCircleMath {
     // starting point
     Double_t variable[3] = {theta,d,0};
     // if t0Seed value from outside use this
-    if(t0Seed > -999.) variable[2] = t0Seed; 
+    if(t0Seed > -999.) variable[2] = t0Seed;
+
+    ROOT::Minuit2::Minuit2Minimizer minimum("algoName");
+    minimum.SetMaxFunctionCalls(1000000);
+    minimum.SetTolerance(0.001);
+    minimum.SetPrintLevel(-1);
+    if(msgLvl(MSG::VERBOSE)) minimum.SetPrintLevel(1);
 
-    minimum->SetVariable(0,"a",variable[0], step[0]);
-    minimum->SetVariable(1,"b",variable[1], step[1]);
-    minimum->SetVariable(2,"t0",variable[2], step[2]);
+    minimum.SetVariable(0,"a",variable[0], step[0]);
+    minimum.SetVariable(1,"b",variable[1], step[1]);
+    minimum.SetVariable(2,"t0",variable[2], step[2]);
 
-    minimum->SetFunction(minFunct);
+    minimum.SetFunction(minFunct);
 
     // do the minimization
-    minimum->Minimize();
+    minimum.Minimize();
 
-    const double *results = minimum->X();
-    const double *errors = minimum->Errors();
-    ATH_MSG_DEBUG("Minimum: f(" << results[0] << "+-" << errors[0] << "," << results[1]<< "+-" << errors[1]<< "," << results[2] << "+-" << errors[2]<< "): " << minimum->MinValue());
+    const double *results = minimum.X();
+    const double *errors = minimum.Errors();
+    ATH_MSG_DEBUG("Minimum: f(" << results[0] << "+-" << errors[0] << "," << results[1]<< "+-" << errors[1]<< "," << results[2] << "+-" << errors[2]<< "): " << minimum.MinValue());
 
     ++m_npassedMinuitFit;
 
@@ -609,7 +609,7 @@ namespace TrkDriftCircleMath {
     double t0=results[2];
     double t0Err=errors[2];
     double dy0 = cosin * bErr - b * sinus * aErr;
-    
+
     double del_t;
     del_t = std::abs(rtpointers[0]->radius((t0+t0Err)) - rtpointers[0]->radius(t0)) ;
 
@@ -623,7 +623,7 @@ namespace TrkDriftCircleMath {
       msg() << MSG::DEBUG <<"COVAR  ";
       for(int it1=0; it1<3; it1++) {
         for(int it2=0; it2<3; it2++) {
-          msg() << MSG::DEBUG <<minimum->CovMatrix(it1,it2)<<" ";
+          msg() << MSG::DEBUG <<minimum.CovMatrix(it1,it2)<<" ";
         }
         msg() << MSG::DEBUG << endmsg;
       }
@@ -643,34 +643,34 @@ namespace TrkDriftCircleMath {
     it = dcs_keep.begin();
     it_end = dcs_keep.end();
     ATH_MSG_DEBUG("------NEW HITS------");
-    
+
     for(int i=0; it!=it_end; ++it, ++i ){
       double rad, drad;
-      
+
       double uppercut = rtpointers[i]->tUpper();
       double lowercut = rtpointers[i]->tLower();
       rad = rtpointers[i]->radius(t[i]-t0);
-      if(t[i]-t0<lowercut) rad = rtpointers[i]->radius(lowercut);     
-      if(t[i]-t0>uppercut) rad = rtpointers[i]->radius(uppercut);     
+      if(t[i]-t0<lowercut) rad = rtpointers[i]->radius(lowercut);
+      if(t[i]-t0>uppercut) rad = rtpointers[i]->radius(uppercut);
       if (w[i]==0) {
         ATH_MSG_WARNING("w[i]==0, continuing");
         continue;
       }
-      drad = 1.0/std::sqrt(w[i]) ; 
-      
+      drad = 1.0/std::sqrt(w[i]) ;
+
       yl = (y[i] -  tana*z[i] - b);
       if(m_trace) {
         ATH_MSG_DEBUG("i "<<i<<" ");
       }
-      
+
       double dth = -(sinus*y[i] + cosin*z[i])*dtheta;
       double residuals = std::abs(yl)/std::sqrt(1+tana*tana) - rad;
       if(m_trace) {
         ATH_MSG_DEBUG(" dth "<<dth<<" dy0 "<<dy0<<" del_t "<<del_t);
       }
-      
+
       double errorResiduals = std::hypot(dth, dy0, del_t);
-      
+
       // derivatives of the residual 'R'
       double deriv[3];
       // del R/del theta
@@ -679,13 +679,13 @@ namespace TrkDriftCircleMath {
       // del R / del b
       deriv[1] = sign(dd) * cosin ;
       // del R / del t0
-      
+
       deriv[2] = -1* rtpointers[i]->driftvelocity(t[i]-t0);
-      
+
       double covsq=0;
       for(int rr=0; rr<3; rr++) {
         for(int cc=0; cc<3; cc++) {
-          covsq += deriv[rr]*minimum->CovMatrix(rr,cc)* deriv[cc];
+          covsq += deriv[rr]*minimum.CovMatrix(rr,cc)* deriv[cc];
         }
       }
       if(m_trace) {
@@ -693,21 +693,21 @@ namespace TrkDriftCircleMath {
 	if( covsq < 0. ){
 	  for(int rr=0; rr<3; rr++) {
 	    for(int cc=0; cc<3; cc++) {
-	      double dot = deriv[rr]*minimum->CovMatrix(rr,cc)* deriv[cc];
-	      ATH_MSG_DEBUG(" adding term " << dot << " dev1 " << deriv[rr] << " cov " << minimum->CovMatrix(rr,cc) << " dev2 " << deriv[cc]);
+	      double dot = deriv[rr]*minimum.CovMatrix(rr,cc)* deriv[cc];
+	      ATH_MSG_DEBUG(" adding term " << dot << " dev1 " << deriv[rr] << " cov " << minimum.CovMatrix(rr,cc) << " dev2 " << deriv[cc]);
 	    }
 	  }
 	}
       }
       covsq = covsq > 0. ? std::sqrt(covsq) : 0.;
       const DriftCircle* ds  = & dcs_keep[i];
-      if (m_propagateErrors) drad = dr[i]; 
+      if (m_propagateErrors) drad = dr[i];
       DriftCircle dc_newrad(dcs_keep[i].position(), rad, drad, ds->state(), dcs_keep[i].id(), dcs_keep[i].index(),ds->rot() );
       DCOnTrack dc_new(dc_newrad, residuals, covsq);
       dc_new.state(dcs_keep[i].state());
-      
+
       if(m_trace) ATH_MSG_DEBUG("T0 Segment hit res "<<residuals<<" eres "<<errorResiduals<<" covsq "<<covsq<<" ri " << r[i]<<" ro "<<rad<<" drad "<<drad << " sel "<<selection[i]<< " inv error " << w[i]);
-      
+
       if( selection[i] == 0 ) {
         ++nhits;
         if (!m_propagateErrors) {
@@ -717,15 +717,15 @@ namespace TrkDriftCircleMath {
         }
         if(m_trace) ATH_MSG_DEBUG("T0 Segment hit res "<<residuals<<" eres "<<errorResiduals<<" covsq "<<covsq<<" ri " << r[i]<<" radius after t0 "<<rad<<" radius error "<< drad <<  " original error " << dr[i]);
 // Put chi2 penalty for drift times outside window
-        if (t[i]-t0> uppercut ) { // too large 
+        if (t[i]-t0> uppercut ) { // too large
 	  chi2  += (t[i]-t0-uppercut)* (t[i]-t0-uppercut)*0.1;
         }else if (t[i]-t0 < lowercut ) {// too small
 	  chi2 += ((t[i]-t0-lowercut)*(t[i]-t0-lowercut))*0.1;
         }
-      } 
+      }
       result.dcs().push_back( dc_new );
     }
-    
+
     double oldshift;
     oldshift = result.t0Shift();
     if(m_trace) ATH_MSG_DEBUG("end fit old "<<oldshift<< " new " <<t0);
@@ -750,6 +750,5 @@ namespace TrkDriftCircleMath {
     }
     return true;
   }
-  
-}
 
+}
-- 
GitLab


From 08316e1e98ca058a4504f515f2ea4425cb2cb939 Mon Sep 17 00:00:00 2001
From: Peter Sherwood <peter.sherwood@cern.ch>
Date: Mon, 21 Dec 2020 19:01:47 +0000
Subject: [PATCH 207/225] Main theme: dividing jet vector inot jet groups now
 done in FastReducer according to the leaf node capacity.

Fix IJetGrouper interface: next() to return HypoJetVector,not HypoJetGroupVector
    AllJetsGrouper.h, cxx
    CombinationsGrouper.h, cxx
    IJetGrouper.h, cxx
    IndexedJetsGrouper.h, cxx
    SingleJetGrouper.h, cxx

New Helper class, with no Grouper (gorupsers now in the Matcher)
     python/ConditionsToolSetterFastReduction.py

Refactoring to aid debugging
	    python/ConditionsToolSetterFastReduction.py

testChainDictMaker.py
	add node tree dump

Jet Groupers now are instantiated according to leaf Condition cap ni FasdtReducer
    ITrigJetHypoToolNoGrouperConfig.h
    FastReducer.cxx

Clean up keeping track of index <-> job groups
      FastReducer.cxx
      new class: GrouperByCapacityFactory.h, cxx
      new class: JetGroupRegister.h, cxx
---
 .../TrigHLTJetHypoUtils/AllJetsGrouper.h      |   4 +-
 .../TrigHLTJetHypoUtils/CombinationsGrouper.h |   2 +-
 .../TrigHLTJetHypoUtils/IJetGrouper.h         |   2 +-
 .../TrigHLTJetHypoUtils/IndexedJetsGrouper.h  |   2 +-
 .../TrigHLTJetHypoUtils/SingleJetGrouper.h    |   6 +-
 .../ConditionsToolSetterFastReduction.py      | 140 +++++++++++++----
 .../python/TrigJetHypoToolConfig.py           |  29 ++--
 .../python/chainDict2jetLabel.py              |   4 +-
 .../TrigHLTJetHypo/python/node.py             |  25 ++-
 .../python/testChainDictMaker.py              |  26 +++-
 .../TrigHLTJetHypo/python/treeVisitors.py     |  47 +++++-
 .../TrigHLTJetHypo/src/ConditionFilter.cxx    |  57 +++++++
 .../TrigHLTJetHypo/src/ConditionFilter.h      |  27 ++++
 .../TrigHLTJetHypo/src/FastReducer.cxx        | 142 ++++++++----------
 .../TrigHLTJetHypo/src/FastReducer.h          |  27 +++-
 .../src/FastReductionMatcher.cxx              |  29 +++-
 .../TrigHLTJetHypo/src/FastReductionMatcher.h |  16 +-
 .../src/GrouperByCapacityFactory.cxx          |  28 ++++
 .../src/GrouperByCapacityFactory.h            |  15 ++
 .../src/HTConditionFastReduction.cxx          |  64 ++++++++
 .../src/HTConditionFastReduction.h            |  54 +++++++
 .../TrigHLTJetHypo/src/IJetsMatcherMT.h       |  43 ++++++
 .../src/ITrigJetHypoToolNoGrouperConfig.h     |  53 +++++++
 .../TrigHLTJetHypo/src/JetGroupRegister.cxx   |  20 +++
 .../TrigHLTJetHypo/src/JetGroupRegister.h     |  44 ++++++
 .../TrigHLTJetHypoUtils/AllJetsGrouper.cxx    |  11 +-
 .../CombinationsGrouper.cxx                   |   6 +-
 .../IndexedJetsGrouper.cxx                    |  16 +-
 .../TrigHLTJetHypoUtils/SingleJetGrouper.cxx  |  14 +-
 .../TrigJetConditionConfig_capacitychecked.h  |   4 +-
 .../src/TrigJetConditionConfig_htfr.cxx       |  49 ++++++
 .../src/TrigJetConditionConfig_htfr.h         |  45 ++++++
 .../TrigJetHypoToolConfig_fastreduction.cxx   |  42 ++++--
 .../src/TrigJetHypoToolConfig_fastreduction.h |  20 ++-
 .../src/TrigJetHypoToolHelperNoGrouper.cxx    | 134 +++++++++++++++++
 .../src/TrigJetHypoToolHelperNoGrouper.h      |  87 +++++++++++
 .../TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx  |  19 +--
 .../src/components/TrigHLTJetHypo_entries.cxx |   4 +
 .../src/groupsMatcherFactoryMT.cxx            |  11 --
 .../src/groupsMatcherFactoryMT.h              |   3 -
 .../share/ref_RDOtoRDOTrig_v1Dev_build.ref    |   2 +-
 41 files changed, 1146 insertions(+), 227 deletions(-)
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/ConditionFilter.cxx
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/ConditionFilter.h
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/GrouperByCapacityFactory.cxx
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/GrouperByCapacityFactory.h
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/HTConditionFastReduction.cxx
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/HTConditionFastReduction.h
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/IJetsMatcherMT.h
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolNoGrouperConfig.h
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/JetGroupRegister.cxx
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/JetGroupRegister.h
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_htfr.cxx
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_htfr.h
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolHelperNoGrouper.cxx
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolHelperNoGrouper.h

diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AllJetsGrouper.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AllJetsGrouper.h
index 47cdba67e25b..ee90f6930057 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AllJetsGrouper.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AllJetsGrouper.h
@@ -10,13 +10,13 @@
 class AllJetsGrouper: public IJetGrouper{
  public:
   AllJetsGrouper();
-  AllJetsGrouper(const HypoJetIter& b, const HypoJetIter& e);
+  AllJetsGrouper(const HypoJetCIter& b, const HypoJetCIter& e);
   AllJetsGrouper(const HypoJetVector&);
   
   std::vector<HypoJetGroupVector> group(HypoJetIter&,
 					HypoJetIter&) const override;
   
-  virtual std::optional<HypoJetGroupVector> next() override;
+  virtual std::optional<HypoJetVector> next() override;
   
   std::string getName() const override; 
   std::string toString() const override;
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGrouper.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGrouper.h
index 57f5f57d3a09..7f573fbb795e 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGrouper.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGrouper.h
@@ -22,7 +22,7 @@ class CombinationsGrouper: public IJetGrouper{
   
   std::vector<HypoJetGroupVector> group(HypoJetIter&,
 					HypoJetIter&) const override;
-  std::optional<HypoJetGroupVector> next() override;
+  std::optional<HypoJetVector> next() override;
 
   std::string getName() const override; 
   std::string toString() const override;
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/IJetGrouper.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/IJetGrouper.h
index 5830516dece0..02ff057f2e88 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/IJetGrouper.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/IJetGrouper.h
@@ -25,7 +25,7 @@ class IJetGrouper{
    */
   virtual std::vector<HypoJetGroupVector> group(HypoJetIter&,
 						HypoJetIter&) const = 0;
-  virtual std::optional<HypoJetGroupVector> next() = 0;
+  virtual std::optional<HypoJetVector> next() = 0;
   virtual std::string toString() const = 0; 
   virtual std::string getName() const = 0; 
 };
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/IndexedJetsGrouper.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/IndexedJetsGrouper.h
index e26d29639fe8..670478e06c87 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/IndexedJetsGrouper.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/IndexedJetsGrouper.h
@@ -36,7 +36,7 @@ public:
   std::vector<HypoJetGroupVector>
   group(HypoJetIter&, HypoJetIter&) const override;
   
-  std::optional<HypoJetGroupVector> next() override;
+  std::optional<HypoJetVector> next() override;
       
   std::string getName() const override;
   std::string toString() const override;
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/SingleJetGrouper.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/SingleJetGrouper.h
index 5d0b474276c7..11323f411f1a 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/SingleJetGrouper.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/SingleJetGrouper.h
@@ -16,13 +16,13 @@ class SingleJetGrouper: public IJetGrouper{
   std::vector<HypoJetGroupVector> group(HypoJetIter&,
 					HypoJetIter&) const override;
 
-  std::optional<HypoJetGroupVector> next() override;
+  std::optional<HypoJetVector> next() override;
   std::string getName() const override; 
   std::string toString() const override;
 
 private:
-  HypoJetVector m_jets;
-  std::size_t m_size;
+  HypoJetVector m_jets{};
+  std::size_t m_size{0};
   std::size_t m_index{0};
 };
 #endif
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ConditionsToolSetterFastReduction.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ConditionsToolSetterFastReduction.py
index 656f8236623f..9b3514a3d038 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ConditionsToolSetterFastReduction.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ConditionsToolSetterFastReduction.py
@@ -14,7 +14,7 @@ from AthenaCommon.Logging import logging
 log = logging.getLogger( 'ConditionsToolSetterFastReduction' )
 
 def is_leaf(node):
-    return node.scenario in  ('simple', 'etaet', 'dijet', 'qjet')
+    return node.scenario in  ('simple', 'etaet', 'dijet', 'qjet', 'agg')
 
 
 def is_inner(node):
@@ -46,11 +46,12 @@ class ConditionsToolSetterFastReduction(object):
             'qjmass': [CompFactory.TrigJetConditionConfig_qjet_mass, 0],
             'smc': [CompFactory.TrigJetConditionConfig_smc, 0],
             'jvt': [CompFactory.TrigJetConditionConfig_jvt, 0],
+            'ht': [CompFactory.TrigJetConditionConfig_htfr, 0],
             'all': [CompFactory.TrigJetConditionConfig_acceptAll, 0],
             'capacitychecked':
             [CompFactory.TrigJetConditionConfig_capacitychecked, 0],
             'fastreduction': [CompFactory.TrigJetHypoToolConfig_fastreduction, 0],
-            'helper': [CompFactory.TrigJetHypoToolHelperMT, 0],
+            'helper': [CompFactory.TrigJetHypoToolHelperNoGrouper, 0],
             }
         for var in self.JetMoments:
             self.tool_factories['mom'+var] = [CompFactory.TrigJetConditionConfig_moment, 0]
@@ -82,7 +83,63 @@ class ConditionsToolSetterFastReduction(object):
         self.tool_factories[key][1] += 1
         return tool
 
+    def _make_el_condition_tools(self, conf_dict):
+        """conf_dict: a dict containing names of elemental conditions 
+        and min, max valies. These will be used to instantiate
+        conditon building AlgTools, one for eac conditon 
+
+        for 2j80_2j60, the dictionaries are:
+        {'et': {'min': '80000.0', 'max': 'inf'}, 
+        'eta': {'min': '0.0', 'max': '3.2'}}
+
+        and 
+
+
+        {'et': {'min': '60000.0', 'max': 'inf'}, 
+        'eta': {'min': '0.0', 'max': '3.2'}})
+        
+        """
+
+        condition_tools = [] # a list of AlgTools that build elemental Conds.
+        
+        for k, v in conf_dict.items(): # loop over elemental conditions
+            # k in the condition name, v contains its min, max values.
+
+            # create the AlgTool that will build the elemental condition
+            condition_tool = self._get_tool_instance(k) 
+            for lim, val in v.items():  # lim: min, max
+                setattr(condition_tool, lim, val)
+
+            # SPECIAL CASE: Moment tool needs the name of the
+            # moment as well as the min. max cuts:
+            if (k.startswith ('mom')):
+                moment = k[len('mom'):]
+                if moment in self.JetMoments:
+                    condition_tool.moment = self.JetMoments[moment]
+                else: raise RuntimeError('%s not supported' % (moment))
+
+            # END SPECIAL CASE
+
+            condition_tools.append(condition_tool)
+
+        return condition_tools
+
+    
     def _make_compound_condition_tools(self, node):
+        """For each element of  node.conf_attrs, construct a 
+        CapacityChecledCondition. Example for chain HLT_2j80_3j60_L1J15:
+
+        First leaf node has 
+        conf_attrs [1]:
+        (defaultdict(<class 'dict'>, {
+        'et': {'min': '80000.0', 'max': 'inf'}, 
+        'eta': {'min': '0.0', 'max': '3.2'}}), 2)
+
+        Second leaf node has 
+        conf_attrs [1]:
+        (defaultdict(<class 'dict'>, {'et': {'min': '60000.0', 'max': 'inf'}, 
+        'eta': {'min': '0.0', 'max': '3.2'}}), 3)
+        """
 
         #  compound_condition_tools:
         # elemental condition maker AlgToolshelper by the compound condition
@@ -99,25 +156,9 @@ class ConditionsToolSetterFastReduction(object):
                 cpi = node.chainpartinds[i][0]
                 assert mult == node.chainpartinds[i][1]
                     
-                
-            condition_tools = [] # elemental conditions for this compounnd ct.
-            for k, v in c.items(): # loop over elemental conditions
-                condition_tool = self._get_tool_instance(k)
-                for lim, val in v.items():  # lim: min, max
-                    setattr(condition_tool, lim, val)
-
-                # SPECIAL CASE: Moment tool needs the name of the
-                # moment as well as the min. max cuts:
-                if (k.startswith ('mom')):
-                    moment = k[len('mom'):]
-                    if moment in self.JetMoments:
-                        condition_tool.moment = self.JetMoments[moment]
-                    else: raise RuntimeError('%s not supported' % (moment))
-
-                # END SPECIAL CASE
-
-                condition_tools.append(condition_tool)
 
+            el_condition_tools = self._make_el_condition_tools(c)
+ 
             # create capacitychecked condition from elemental condition
             condition_tool =self._get_tool_instance('capacitychecked')
 
@@ -126,16 +167,38 @@ class ConditionsToolSetterFastReduction(object):
                 # convert label from string to int for more efficient
                 # processing in C++ land.
                 condition_tool.chainPartInd = int(cpi[len('leg'):])
-            else:
-                condition_tool.chainPartInd = 0
             
-            condition_tool.conditionMakers = condition_tools
+            condition_tool.conditionMakers = el_condition_tools
             condition_tool.multiplicity = mult
             # add capacitychecked condition to list
             outer_condition_tools.append(condition_tool)
             
         return outer_condition_tools
 
+    
+    def _make_filter_tool(self, node):
+        """Condtion filters use a list of CompoundCondition containing
+        single jet elemental conditions  select a subset of the reco
+        jets to send to the a Condition"""
+        
+        el_condition_tools = []
+        for fc, mult in node.filter_conditions:
+            assert len(fc) == 1  # 1 elemental condition
+            assert mult == 1
+            el_condition_tools.extend(self._make_el_condition_tools(fc))
+
+        if not el_condition_tools:
+            el_condition_tools.append(self._get_tool_instance('all'))
+
+        capacitychecked_condition_tool = self._get_tool_instance(
+            'capacitychecked')
+
+        capacitychecked_condition_tool.conditionMakers = el_condition_tools
+        capacitychecked_condition_tool.multiplicity = 1
+        
+        return capacitychecked_condition_tool
+    
+
     def _mod_leaf(self, node):
         """ Add Condition tools to For a leaf node."""
 
@@ -155,6 +218,17 @@ class ConditionsToolSetterFastReduction(object):
         node.compound_condition_tools = self._make_compound_condition_tools(
             node)
 
+        # make condition builder AlgTools for the condition filters.
+        # condition filters select subsets of the input jets to present
+        # to a condition,
+        
+        node.filter_tool = self._make_filter_tool(node)
+
+    
+        # if node.scenario == 'agg':
+        #     print (node)
+        #    assert False
+            
     def report(self):
         wid = max(len(k) for k in self.tool_factories.keys())
         rep = '\n%s: ' % self.__class__.__name__
@@ -171,20 +245,27 @@ class ConditionsToolSetterFastReduction(object):
             self._fill_tree_map(cn, tmap)
 
             
-    def _fill_conditions_map(self, node, cmap):
+    def _fill_conditions_map(self, node, cmap, fmap):
         if is_leaf(node):
 
             assert (len(node.compound_condition_tools) == 1)
             cmap[node.node_id] = node.compound_condition_tools[0]
-
+            fmap[node.node_id] = node.filter_tool
+            
         else:
             # must have a tool for Gaudi to instantiate in
             cmap[node.node_id] = self._get_tool_instance('capacitychecked')
             cmap[node.node_id].conditionMakers = [self._get_tool_instance('all')]
             cmap[node.node_id].multiplicity = 1
+
+            fmap[node.node_id] = self._get_tool_instance('capacitychecked')
+            fmap[node.node_id].conditionMakers = [self._get_tool_instance('all')]
+            fmap[node.node_id].multiplicity = 1
+
+            
         
         for cn in node.children:
-            self._fill_conditions_map(cn, cmap)
+            self._fill_conditions_map(cn, cmap, fmap)
 
 
     def _map_2_vec(self, amap):
@@ -230,14 +311,17 @@ class ConditionsToolSetterFastReduction(object):
         treeVec = self._map_2_vec(tree_map)
 
         conditionsMap = {}
-        self._fill_conditions_map(tree, conditionsMap)
+        filterConditionsMap = {}
+        self._fill_conditions_map(tree, conditionsMap, filterConditionsMap)
         conditionsVec = self._map_2_vec(conditionsMap)
+        filterConditionsVec = self._map_2_vec(filterConditionsMap)
                
         # make a config tool and provide it with condition makers
         config_tool = self._get_tool_instance('fastreduction')
         config_tool.conditionMakers = conditionsVec
+        config_tool.filtConditionsMakers = filterConditionsVec
         config_tool.treeVector = treeVec
-
+        
         nodestr = 'n%dp%d' % (tree.node_id, tree.parent_id)
         helper_tool = self._get_tool_instance('helper', extra=nodestr)
         helper_tool.HypoConfigurer = config_tool
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py
index 431a17d5877d..bb6155862780 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py
@@ -8,8 +8,6 @@ from TrigHLTJetHypo.ConditionsToolSetterFastReduction import (
     ConditionsToolSetterFastReduction,
 )
 
-from TrigHLTJetHypo.ConditionsToolSetterHT import ConditionsToolSetterHT
-
 from  TrigHLTJetHypo.chainDict2jetLabel import chainDict2jetLabel
 
 from  TrigHLTJetHypo.ChainLabelParser import ChainLabelParser
@@ -20,10 +18,10 @@ from TrigHLTJetHypo.NodeSplitterVisitor import NodeSplitterVisitor
 from AthenaCommon.Logging import logging
 log = logging.getLogger( 'TrigJetHypoToolConfig' )
 
-def  trigJetHypoToolHelperFromDict_(
+def  nodeTreeFromChainLabel(
         chain_label, # simple([(260et,320eta490, leg000)])
         chain_name, # HLT_j260_320eta490_L1J75_31ETA49
-        toolSetter=None):
+        toolSetter):
 
     parser = ChainLabelParser(chain_label, debug=False)
 
@@ -59,12 +57,23 @@ def  trigJetHypoToolHelperFromDict_(
     log.info('trigJetHypoToolFromDict chain_name %s', chain_name)
 
     toolSetter.mod(tree)
-    tool = toolSetter.tool
+    return tree
 
-    log.debug(toolSetter.report())
 
-    return tool
+def trigJetHypoToolHelperFromDict_(
+        chain_label, # simple([(260et,320eta490, leg000)])
+        chain_name, # HLT_j260_320eta490_L1J75_31ETA49
+        toolSetter):
 
+    nodeTreeFromChainLabel(
+        chain_label,
+        chain_name,
+        toolSetter)
+    
+    tool = toolSetter.tool
+    log.debug(toolSetter.report())
+    
+    return tool
 
 def  trigJetHypoToolHelperFromDict(chain_dict):
     """Produce  a jet trigger hypo tool helper from a chainDict
@@ -91,11 +100,7 @@ def  trigJetHypoToolHelperFromDict(chain_dict):
 
     chain_name = chain_dict['chainName']
 
-    toolSetter = None
-    if 'agg' in chain_name:
-        toolSetter=ConditionsToolSetterHT()
-    else:
-        toolSetter=ConditionsToolSetterFastReduction()
+    toolSetter = ConditionsToolSetterFastReduction()
 
     return trigJetHypoToolHelperFromDict_(chain_label,
                                           chain_name,
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py
index d01c48a63956..b78bc88bce17 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py
@@ -297,9 +297,9 @@ def _make_agg_label(chain_parts, leg_label):
 
     argvals['leg_label'] = leg_label
     result =  """
-    ht([(%(htlo).0fht, %(leg_label)s)
+    agg([(%(htlo).0fht, %(leg_label)s)
         (%(etlo).0fet)
-        (%(etalo).0feta%(etahi).0f)
+    (%(etalo).0feta%(etahi).0f)
     ])"""  % argvals
     print (result)
     return result
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py
index 7b75c37525d0..9bc459c46b58 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py
@@ -29,11 +29,14 @@ class Node(object):
 
         # filled in by a CondtionsTollSetter:
         self.compound_condition_tools = [] 
-        # self.tool = None
-        # self.compound_condition_tools = []
-        # self.tree_top kludge carensure top level tools get chain name
-        # as Tool name
         self.chainpartinds = []
+
+        # Condition objects may have filters
+        # eg HT may have an et filter. Filters are made up of conditions
+        # and are used to form jet subsets.
+        self.filter_conditions = []
+        self.filter_tool = None
+        
         self.tree_top = False
         self.tool = None
         
@@ -91,11 +94,17 @@ class Node(object):
         for ca in self.conf_attrs:
             s.append(indent + str(ca))
         
-            # this attribute added by flow network setter tool
-            s.append(indent + 'compound_condition_tools [%d]' % len(
-                self.compound_condition_tools))
+        s.append(indent + 'filter_conditions [%d]:' % (
+            len(self.filter_conditions),))
+                 
+        for fc in self.filter_conditions:
+            s.append(indent + str(fc))
+
+        s.append(indent + 'compoundConditionTools [%d]:' % len(
+            self.compound_condition_tools))
+
+        s.append(indent + 'filter_tool :' + str(self.filter_tool))
 
-        s.append(indent + 'AlgTool: %s' % str(self.tool))
         s.append(indent + 'No of children: %d\n' % len(self.children))
 
         return s
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/testChainDictMaker.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/testChainDictMaker.py
index 21a0691446e3..3166c3197c77 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/testChainDictMaker.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/testChainDictMaker.py
@@ -11,7 +11,13 @@ from TriggerMenuMT.HLTMenuConfig.Menu.ChainDefInMenu import ChainProp
 from TriggerMenuMT.HLTMenuConfig.Menu.DictFromChainName import dictFromChainName
 
 from chainDict2jetLabel import chainDict2jetLabel 
-from TrigJetHypoToolConfig import trigJetHypoToolFromDict
+from TrigJetHypoToolConfig import (trigJetHypoToolFromDict,
+                                   nodeTreeFromChainLabel)
+
+from TrigHLTJetHypo.ConditionsToolSetterFastReduction import (
+    ConditionsToolSetterFastReduction,
+)
+
 
 def testChainDictMaker():
 
@@ -43,7 +49,7 @@ def testChainDictMaker():
 
         ChainProp(name='HLT_j0_aggSEP1000htSEP30etSEP0eta320_L1J20',
                   groups=SingleJetGroup),
-
+        
         # ChainProp(name='HLT_j70_j50 _0eta490_invm1000j50_dphi20_deta40_L1J20',
         #          l1SeedThresholds=['FSNOSEED']*2,
         #          groups=MultiJetGroup),
@@ -70,6 +76,22 @@ if __name__ == '__main__':
         print (chainDict2jetLabel(d[1]))
         print ()
 
+        
+    print ('\n node trees:\n')
+    
+    for d in dicts:
+        print (d[0])
+        label = chainDict2jetLabel(d[1])
+        chain_name = d[1]['chainName']
+        
+        toolSetter=ConditionsToolSetterFastReduction()
+            
+        print (nodeTreeFromChainLabel(chain_name=d[0],
+                                      chain_label=label,
+                                      toolSetter=toolSetter).dump())
+        print ()
+        
+
     print ('\nMaking TrigJetHypoTool for each dictiomary\n')
     for d in dicts:
         print (d[0])
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py
index 3133ab0191db..a91db097e259 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py
@@ -34,13 +34,15 @@ def defaultParameters(parameter, default=''):  # default if parameter unknown
                 'smchi': 'inf',                
                 'jvtlo': '0',
                 'jvthi': 'inf',
+                'htlo' : '1000.',
+                'hthi' : 'inf',
     }
 
     if parameter.startswith('mom'):
         parameter = 'momCuts'
 
     if parameter not in  defaults:
-        print ('defaultParameters: unknown parameter, tryurning default ',
+        print ('defaultParameters: unknown parameter, returning default ',
                parameter)
 
     return defaults.get(parameter, default)
@@ -284,6 +286,47 @@ class TreeParameterExpander_simple(object):
         return '%s: ' % self.__class__.__name__ + '\n'.join(self.msgs) 
 
 
+class TreeParameterExpander_agg(object):
+    """Convert parameter string into duction holding low, high window
+        cut vals, as for the  'simple' scenario. Then place conditions
+        not in the agg list in the filters dict. These conditions wil be used
+        to select the subset of the jet collection to be presented to the agg
+        conditions."""
+
+    agg_conditions = ('ht',)
+    
+    def __init__(self):
+        self.msgs = []
+
+    def mod(self, node):
+
+        simple_expander = TreeParameterExpander_simple()
+        simple_expander.mod(node)
+
+        # example conf_attrs:
+        # conf_attrs [3]:
+        # (defaultdict(<class 'dict'>,
+        #              {'ht': {'min': '1000000.0', 'max': 'inf'}}), 1)
+        # (defaultdict(<class 'dict'>,
+        #              {'et': {'min': '30000.0', 'max': 'inf'}}), 1)
+        # (defaultdict(<class 'dict'>,
+        #             {'eta': {'min': '0.0', 'max': '3.2'}}), 1)
+
+
+        for ca in node.conf_attrs:
+            assert len(ca) == 2  # (dict, mult)
+            assert len(ca[0]) == 1  # one entry in dict
+            ca_keys = ca[0].keys()
+            cond_name = list(ca_keys)[0]
+            if cond_name not in self.agg_conditions:
+                node.filter_conditions.append(ca)
+        for fc in node.filter_conditions:
+            node.conf_attrs.remove(fc)
+
+    def report(self):
+        return '%s: ' % self.__class__.__name__ + '\n'.join(self.msgs) 
+
+
 class TreeParameterExpander_dijet(object):
     """Convert parameter string into tuples holding low, high window
     cut vals. Specialistaion for the dijet scenario
@@ -360,7 +403,7 @@ class TreeParameterExpander(object):
         'z': TreeParameterExpander_null,
         'root': TreeParameterExpander_null,
         'simple': TreeParameterExpander_simple,
-        'ht': TreeParameterExpander_simple,
+        'agg': TreeParameterExpander_agg,
         'dijet': TreeParameterExpander_dijet,
         'qjet': TreeParameterExpander_simple,
         'all': TreeParameterExpander_all,
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ConditionFilter.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ConditionFilter.cxx
new file mode 100644
index 000000000000..04d82ce07394
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ConditionFilter.cxx
@@ -0,0 +1,57 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include <algorithm>
+
+#include "./ConditionFilter.h"
+
+ConditionFilter::ConditionFilter(ConditionPtrs& conditions):
+  m_conditions(std::move(conditions)) {
+}
+
+struct FilterPred{
+  FilterPred(const ConditionPtr& cptr,
+	     const std::unique_ptr<ITrigJetHypoInfoCollector>& collector):
+    m_cptr(cptr), m_collector(collector) {
+  }
+
+  bool operator() (pHypoJet pjet) {
+    auto hjv = HypoJetVector{pjet};
+    return m_cptr->isSatisfied(hjv, m_collector);
+  }
+
+  const ConditionPtr& m_cptr;
+  const std::unique_ptr<ITrigJetHypoInfoCollector>& m_collector;
+};
+
+HypoJetVector
+ConditionFilter::filter (const HypoJetCIter& begin,
+			 const HypoJetCIter& end,
+			 const std::unique_ptr<ITrigJetHypoInfoCollector>& collector) const {
+
+  HypoJetVector in (begin, end);
+  auto new_end = in.end();
+  
+  for (const auto& cptr : m_conditions) {
+    new_end = std::partition(in.begin(),
+			 new_end,
+			 FilterPred(cptr, collector));
+  }
+  
+  return HypoJetVector(in.begin(), new_end);
+}
+
+std::string ConditionFilter::toString() const {
+  std::stringstream ss;
+  const void* address = static_cast<const void*>(this);
+  ss << "ConditionFilter: (" << address << ")\n"
+     << "Conditions [" << m_conditions.size() << "]:\n";
+  for (const auto& c : m_conditions) {
+     ss << " " << c->toString() << "\n\n";
+   }
+
+  return ss.str();
+}
+
+	   
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ConditionFilter.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ConditionFilter.h
new file mode 100644
index 000000000000..3911c3f5ff32
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ConditionFilter.h
@@ -0,0 +1,27 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TRIGHLTJETHYPO_CONDITIONFILTER_H
+#define TRIGHLTJETHYPO_CONDITIONFILTER_H
+
+#include "./CapacityCheckedConditionsDefs.h"
+
+class ConditionFilter {
+ public:
+  ConditionFilter(ConditionPtrs&);
+
+  // find the subset of jets which satisfy a sequence of conditions
+  HypoJetVector filter (const HypoJetCIter& b,
+			const HypoJetCIter& e,
+			const std::unique_ptr<ITrigJetHypoInfoCollector>&
+			) const;
+  
+  std::string toString() const;  
+ private:
+  ConditionPtrs m_conditions;
+
+  
+};
+
+#endif
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/FastReducer.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/FastReducer.cxx
index 7e174e07d330..05dafc68253b 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/FastReducer.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/FastReducer.cxx
@@ -3,6 +3,7 @@
 */
 
 #include "./FastReducer.h"
+#include "./GrouperByCapacityFactory.h"
 #include "./ITrigJetHypoInfoCollector.h"
 
 #include <map>
@@ -36,13 +37,14 @@ struct IndexVecComp{
 };
 
 
-FastReducer::FastReducer(const HypoJetGroupCIter& groups_b,
-                         const HypoJetGroupCIter& groups_e,
+FastReducer::FastReducer(const HypoJetCIter& jets_b,
+                         const HypoJetCIter& jets_e,
                          const ConditionPtrs& conditions,
+			 const ConditionFilters& filters,
                          const Tree& tree,
                          xAODJetCollector& jetCollector,
                          const Collector& collector):
-  m_conditions(conditions),  m_tree(tree) {
+  m_conditions(conditions),  m_conditionFilters(filters), m_tree(tree) {
 
   // create an empty vector of indices of satisfying jet groups
   // for each Condition.
@@ -52,8 +54,8 @@ FastReducer::FastReducer(const HypoJetGroupCIter& groups_b,
   }
 
 
-  if(!findInitialJetGroups(groups_b,
-			   groups_e,
+  if(!findInitialJetGroups(jets_b,
+			   jets_e,
 			   collector)){
     if(collector){
       collector->collect("FastReducer early return",
@@ -162,57 +164,57 @@ void FastReducer::collectLeafJets(xAODJetCollector& jetCollector,
 }
 
 
-bool FastReducer::findInitialJetGroups(const HypoJetGroupCIter& groups_b,
-				       const HypoJetGroupCIter& groups_e,
+bool FastReducer::findInitialJetGroups(const HypoJetCIter& jets_b,
+				       const HypoJetCIter& jets_e,
 				       const Collector& collector) {
   
 
   /*
-    Will now test the incoming jet groups against the leaf conditions.
+    Will now test the incoming jets against the leaf conditions.
   */
 
   std::size_t ijg{0};
   auto leaves = m_tree.leaves();
 
-  for(auto iter = groups_b; iter != groups_e; ++iter){
-    auto jg = *iter;
-    
-    if(jg.size() != 1){
-      collector->collect("FastReducer", "Initial jet group size != 1");
-      return false;
-    }
-    
-    // if a jet group satisfies a condition, note the fact,
-    // and store it by index
-    bool jg_used{false};
+  // if a jet group satisfies a condition, note the fact,
+  // and store it by index
+
+  for(const auto& leaf: leaves){
+
+    auto& filter = m_conditionFilters[leaf];
+    auto filtered_jets = filter->filter(jets_b, jets_e, collector);
+
+    recordFiltering(leaf, jets_e-jets_b, filtered_jets.size(), collector);
+
     
-    auto cur_jg = m_jgIndAllocator(std::vector<std::size_t>{ijg});
-    for(const auto& leaf: leaves){
-      
-      m_testedBy[leaf].insert(cur_jg);
+    auto grouper = grouperByCapacityFactory(m_conditions[leaf]->capacity(),
+					    filtered_jets.begin(),
+					    filtered_jets.end());
+
+    while(true){
+      auto ojg = grouper->next();
+      if (!ojg.has_value()) {break;}
+
+      auto jg = *ojg;
+      auto jg_ind = m_jgRegister.record(jg);
+      m_testedBy[leaf].insert(jg_ind);
       if (m_conditions[leaf]->isSatisfied(jg, collector)){
-	jg_used= true;
-	if(collector){recordJetGroup(cur_jg, jg, collector);}
+	if(collector){recordJetGroup(jg_ind, jg, collector);}
 	// do the following for each satisfied condition ...
-	m_satisfiedBy[leaf].push_back(cur_jg);
+	m_satisfiedBy[leaf].push_back(jg_ind);
+	m_jg2elemjgs[jg_ind] =  std::vector<std::size_t>{jg_ind};
+	m_indJetGroup.emplace(jg_ind, jg);
+	++ijg;
       }
     }
-    
-    if(jg_used){
-      m_jg2elemjgs[cur_jg] =  std::vector<std::size_t>{cur_jg};
-      m_indJetGroup.emplace(cur_jg, jg);
-      ++ijg;
-    }
-    
   }
-  
+    
   if(collector){
     for(const auto& p : m_indJetGroup){
       recordJetGroup(p.first, p.second, collector);
     }
   }
-
-
+  
   // check all leaf conditions are satisfied
   for (const auto& i : leaves) {
     if (!capacitySatisfied(i, collector)) {
@@ -220,47 +222,9 @@ bool FastReducer::findInitialJetGroups(const HypoJetGroupCIter& groups_b,
     }
   }
   
-  /*
-    For the special but important case where all leaf nodes have
-    the root node as a parent, check that there are enough jets
-    to pass the hypo. This prevents doing a long calculation 
-    to discover that the hypo will fail. For example, if the chain
-    requires 10j40, and there are 5 jets that pass the condition,
-    each condition will be satisfied by th 5 jets, and 5^10 combinations
-    will be attempted in th seach for a successful combination. As there
-    are only 5 jets involved, such a combination does not exist.
-
-    Such trees have a tree vector with all entries == 0.
-
-    This check cannot be applied in the general case. For example,
-    if the root condition requires 4 jets, and has three children,
-    two of which are leaf nodes, while the other is not, then the
-    check will fail the event as no jets have yet ben assigned to the
-    second child, while the full popagation through the tree may pass the
-    event.
-
-    A possible way to tighten the chck would be to forbid children to be
-    separated from thir parent by more than 1 generation.
-  */
-
-  if (std::all_of(m_tree.cbegin(),
-		  m_tree.cend(),
-		  [](std::size_t i){return i == 0;})) {
-    
-    if (m_conditions[0]->capacity() > ijg) {
-      
-      if (collector){
-	collector->collect("FastReducer", "too few children. root capacity "
-			   + std::to_string(m_conditions[0]->capacity()) +
-			   " no of children: " + std::to_string(ijg));
-      }
-
-      return false;
-    }
-  }
-  
   return true;
 }  
+  
 
 bool FastReducer::propagateJetGroups(const Collector& collector){
   
@@ -395,18 +359,20 @@ bool FastReducer::propagate_(std::size_t child,
     }
 
     HypoJetVector jg;
-
+    for(const auto& i : elem_jgs){
+      jg.push_back(m_indJetGroup.at(i)[0]);  // why [0]? assume elemental jg has size 1
+    }
+    
     // obtain an index for the new jet group.
-    auto cur_jg = m_jgIndAllocator(elem_jgs);
+    // auto cur_jg = m_jgIndAllocator(elem_jgs);
+    auto cur_jg = m_jgRegister.record(jg);
     if(m_testedBy[par].find(cur_jg) != m_testedBy[par].end()){
       next = jg_product.next(collector);
       continue;
     }
     m_testedBy[par].insert(cur_jg);
 	
-    for(const auto& i : elem_jgs){
-      jg.push_back(m_indJetGroup.at(i)[0]);  // why [0]? assume elemental jg has size 1
-    }
+
 
     if (m_conditions[par]->isSatisfied(jg, collector)){// par is a tree ind.
 
@@ -526,6 +492,22 @@ void FastReducer::recordJetGroup(std::size_t ind,
   collector->collect(ss0.str(), ss1.str());
 }
 
+void FastReducer::recordFiltering(std::size_t leaf_ind,
+				  std::size_t n_injets,
+				  int n_filteredjets,
+				  const Collector& collector) const {
+
+  if(!collector) {return;}
+  
+  std::stringstream ss0;
+  ss0  << "FastReducer filtering Condition index: "  << leaf_ind;
+  
+  std::stringstream ss1;
+  ss1  << "n jets. in: " << n_injets << " filtered: " << n_filteredjets << '\n';
+  
+  collector->collect(ss0.str(), ss1.str());
+}
+
 bool FastReducer::pass() const { return m_pass; }
 
 
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/FastReducer.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/FastReducer.h
index 7f3d1191fdd1..99a374e9093c 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/FastReducer.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/FastReducer.h
@@ -11,7 +11,10 @@
 #include "./JetGroupIndAllocator.h"
 #include "./xAODJetCollector.h"
 #include "./ITrigJetHypoInfoCollector.h"
+#include "./JetGroupRegister.h"
+#include "./ConditionFilter.h"
 #include <string>
+#include <map>
 
 using TreeVec = std::vector<std::size_t>;
 using IDJetGroup = std::map<std::size_t, HypoJetVector>;
@@ -22,14 +25,16 @@ typedef std::unique_ptr<ITrigJetHypoInfoCollector> Collector;
 */
 
 using JetGroupInd2ElemInds = std::map<int, std::vector<std::size_t>>;
+using  ConditionFilters = std::vector<std::unique_ptr<ConditionFilter>>;
 
 
 class FastReducer {
  public:
 
-  FastReducer(const HypoJetGroupCIter& groups_b,
-              const HypoJetGroupCIter& groups_e,
+  FastReducer(const HypoJetCIter& jets_b,
+              const HypoJetCIter& jets_e,
               const ConditionPtrs& conditionObjects,
+	      const ConditionFilters& conditionFilters,
               const Tree& conditionsTree,
               xAODJetCollector& jetCollector,
               const Collector& collector);
@@ -45,8 +50,12 @@ class FastReducer {
 
  private:
 
+  // conditions owned by the matcher
   const ConditionPtrs& m_conditions;
 
+  // conditionFilters owned by the matcher
+  const ConditionFilters& m_conditionFilters;
+
   /** tree structure for Conditions objects.
    The conditions tree gives relations among conditions (eg parent-child
    and siblings-of)
@@ -75,15 +84,16 @@ class FastReducer {
 
   HypoJetVector m_passingJets;
 
-  JetGroupIndAllocator m_jgIndAllocator;
-  
+  //  JetGroupIndAllocator m_jgIndAllocator;
+
+  JetGroupRegister m_jgRegister;
   /** set up the data structures for propagation. Propagation is the
    act of combining jet groups satisfying children
    in preparration for testing against parent conditions.
   */
   
-  bool findInitialJetGroups(const HypoJetGroupCIter& groups_b,
-			    const HypoJetGroupCIter& groups_e,
+  bool findInitialJetGroups(const HypoJetCIter& jets_b,
+			    const HypoJetCIter& jets_e,
 			    const Collector& collector);
   
   
@@ -102,6 +112,11 @@ class FastReducer {
 		      const HypoJetVector& jg,
 		      const Collector& collector) const;
 
+  void recordFiltering(std::size_t leaf_ind,
+		       std::size_t n_inputjets,
+		       int n_filteredjets,
+		       const Collector& collector) const;
+
   void collectLeafJets(xAODJetCollector& jetCollector,
 		       const Collector& collector) const;
 
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/FastReductionMatcher.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/FastReductionMatcher.cxx
index 81c85760c254..d30fb5d240ad 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/FastReductionMatcher.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/FastReductionMatcher.cxx
@@ -10,9 +10,11 @@
 #include <algorithm>
 #include <sstream>
 
-FastReductionMatcher::FastReductionMatcher(ConditionPtrs conditions,
+FastReductionMatcher::FastReductionMatcher(ConditionPtrs& conditions,
+					   ConditionFilters& filters,
 					   const Tree& tree):
   m_conditions(std::move(conditions)),
+  m_conditionFilters(std::move(filters)),
   m_tree(tree){
 
   for (const auto& il : m_tree.leaves()){
@@ -20,12 +22,16 @@ FastReductionMatcher::FastReductionMatcher(ConditionPtrs conditions,
       throw std::runtime_error("Tree leaf condition  but not from ChainPart");
     }
   }
+  if (filters.size() != conditions.size()) {
+    throw std::runtime_error("Conditions and ConditionFilters sequence sizes differ");
+  }
+
 }
 	 
 
 std::optional<bool>
-FastReductionMatcher::match(const HypoJetGroupCIter& groups_b,
-			    const HypoJetGroupCIter& groups_e,
+FastReductionMatcher::match(const HypoJetCIter& jets_b,
+			    const HypoJetCIter& jets_e,
 			    xAODJetCollector& jetCollector,
 			    const std::unique_ptr<ITrigJetHypoInfoCollector>& collector,
 			    bool) const {
@@ -43,9 +49,10 @@ FastReductionMatcher::match(const HypoJetGroupCIter& groups_b,
    */
 
 
-  FastReducer reducer(groups_b,
-                      groups_e,
+  FastReducer reducer(jets_b,
+                      jets_e,
                       m_conditions,
+		      m_conditionFilters,
                       m_tree,
                       jetCollector,
                       collector);
@@ -68,5 +75,17 @@ std::string FastReductionMatcher::toString() const {
     ss << sc <<": "<< c->toString() + '\n';
   }
 
+  ss << "FastReductionMatcher ConditionFilters ["
+     << m_conditionFilters.size() << "]: \n";
+
+
+  count = 0;
+  for(const auto& c : m_conditionFilters){
+    auto sc = std::to_string(count++);
+    sc.insert(sc.begin(), 3-sc.length(), ' ');
+    ss << sc <<": "<< c->toString() + '\n';
+  }
+  
+
   return ss.str();
 }
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/FastReductionMatcher.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/FastReductionMatcher.h
index 9b1e68b8a6ff..ec33356e0245 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/FastReductionMatcher.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/FastReductionMatcher.h
@@ -6,17 +6,21 @@
 #define TRIGHLTJETHYPO_FASTREDUCTIONMATCHER_H
 
 
-#include "./IGroupsMatcherMT.h"
+#include "./IJetsMatcherMT.h"
 #include "./CapacityCheckedConditionsDefs.h"
+#include "./ConditionFilter.h"
 #include "./Tree.h"
 
 using TreeVec = std::vector<std::size_t>;
 class ITrigJetHypoInfoCollector;
 
-class FastReductionMatcher: public IGroupsMatcherMT {
+using  ConditionFilters = std::vector<std::unique_ptr<ConditionFilter>>;
+
+class FastReductionMatcher: public IJetsMatcherMT {
  public:
 
-  FastReductionMatcher(ConditionPtrs,
+  FastReductionMatcher(ConditionPtrs&,
+		       ConditionFilters&,
 		       const Tree&);
 
 
@@ -30,8 +34,8 @@ class FastReductionMatcher: public IGroupsMatcherMT {
   */
   
   virtual std::optional<bool>
-    match(const HypoJetGroupCIter& groups_b,
-	  const HypoJetGroupCIter& groups_e,
+    match(const HypoJetCIter& jets_b,
+	  const HypoJetCIter& jets_e,
 	  xAODJetCollector&,
 	  const std::unique_ptr<ITrigJetHypoInfoCollector>& collector,
 	  bool
@@ -42,7 +46,7 @@ class FastReductionMatcher: public IGroupsMatcherMT {
  private:
 
   ConditionPtrs m_conditions;
-
+  std::vector<std::unique_ptr<ConditionFilter>> m_conditionFilters;
   /** tree structure for Conditions objects.
    The conditions tree gives relations among conditions (eg parent-child
    and siblings-of)
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/GrouperByCapacityFactory.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/GrouperByCapacityFactory.cxx
new file mode 100644
index 000000000000..f2c7e5b82698
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/GrouperByCapacityFactory.cxx
@@ -0,0 +1,28 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "GrouperByCapacityFactory.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/AllJetsGrouper.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/SingleJetGrouper.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGrouper.h"
+
+
+std::unique_ptr<IJetGrouper> grouperByCapacityFactory(unsigned int cap,
+						      const HypoJetCIter& b,
+						      const HypoJetCIter& e){
+
+  std::unique_ptr<IJetGrouper> pGrouper(nullptr);
+  
+  if (cap == 0) {
+    throw std::runtime_error("groupByMultFactory - attempting ctrct grouper with mult == 0");
+  } else if (cap == 1) {
+    pGrouper.reset(new SingleJetGrouper(b, e));
+  } else if (cap == std::numeric_limits<int>::max()) {
+    pGrouper.reset(new AllJetsGrouper(b, e));
+  } else {
+    pGrouper.reset(new CombinationsGrouper(cap, b, e));
+  }
+
+  return pGrouper;
+}
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/GrouperByCapacityFactory.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/GrouperByCapacityFactory.h
new file mode 100644
index 000000000000..cf227df628d2
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/GrouperByCapacityFactory.h
@@ -0,0 +1,15 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TRIGHLTJETHYPO_GROUPERBYCAPACITYFACTORY_H
+#define TRIGHLTJETHYPO_GROUPERBYCAPACITYFACTORY_H
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/IJetGrouper.h"
+#include <memory>
+
+std::unique_ptr<IJetGrouper> grouperByCapacityFactory(unsigned int capacity,
+						      const HypoJetCIter& b,
+						      const HypoJetCIter& e);
+
+#endif
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/HTConditionFastReduction.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/HTConditionFastReduction.cxx
new file mode 100644
index 000000000000..639cb3f465d4
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/HTConditionFastReduction.cxx
@@ -0,0 +1,64 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "./HTConditionFastReduction.h"
+#include "./ITrigJetHypoInfoCollector.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/HypoJetDefs.h"
+
+#include <sstream>
+#include <cmath>
+#include <algorithm>
+#include <numeric>
+
+HTConditionFastReduction::HTConditionFastReduction(double ht_min,
+						   double ht_max):
+  m_htMin(ht_min), m_htMax(ht_max) {
+}
+
+
+bool
+HTConditionFastReduction::isSatisfied(const HypoJetVector& ips,
+				      const std::unique_ptr<ITrigJetHypoInfoCollector>& collector) const {
+  
+  auto htsum =  std::accumulate(ips.begin(),
+				ips.end(),
+				0.0,
+				[](double sum, const pHypoJet& jp){
+				  return sum + jp->et();});
+  bool pass = htsum > m_htMin;
+  
+  if(collector){
+    std::stringstream ss0;
+    const void* address = static_cast<const void*>(this);
+    ss0 << "HTCondition: (" << address << ") Sum(et) "
+	<< htsum << " "
+	<< std::boolalpha << pass <<  " jet group: \n";
+    
+    std::stringstream ss1;
+    
+    for(const auto& ip : ips){
+      address = static_cast<const void*>(ip.get());
+      ss1 << "    "  << address << " " << ip->eta() << " e " << ip->e() << '\n';
+    }
+    ss1 << '\n';
+    collector -> collect(ss0.str(), ss1.str());
+  }
+  
+  return pass;
+  
+}
+    
+
+std::string HTConditionFastReduction::toString() const {
+  std::stringstream ss;
+  ss << "HTConditionFastReduction: htMin: "
+     << m_htMin;
+
+  
+
+  ss <<'\n';
+
+  return ss.str();
+}
+
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/HTConditionFastReduction.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/HTConditionFastReduction.h
new file mode 100644
index 000000000000..ec67e2b76765
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/HTConditionFastReduction.h
@@ -0,0 +1,54 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TRIGHLTJETHYPO_HTCONDITIONFASTREDUCTION_H
+#define TRIGHLTJETHYPO_HTCONDITIONFASTREDUCTION_H
+
+/********************************************************************
+ *
+ * NAME:     HTConditionFastReduction.h
+ * PACKAGE:  Trigger/TrigHypothesis/TrigHLTJetHypo
+ *
+ * AUTHOR:   P. Sherwood
+ *********************************************************************/
+
+#include "./IConditionMT.h"
+
+#include <string>
+#include <limits>
+// #include <memory>
+
+namespace HypoJet{
+  class IJet;
+}
+
+
+class ITrigJetHypoInfoCollector;
+
+class HTConditionFastReduction: public IConditionMT{
+ public:
+
+  
+  HTConditionFastReduction(double htMin, double htMax);
+
+  
+  ~HTConditionFastReduction() override {}
+
+  bool isSatisfied(const HypoJetVector&,
+                   const std::unique_ptr<ITrigJetHypoInfoCollector>&) const override;
+
+  std::string toString() const override;
+  virtual unsigned int capacity() const override {return s_capacity;}
+
+ private:
+  
+  double m_htMin;
+  double m_htMax;
+  
+  const static  unsigned int s_capacity{std::numeric_limits<int>::max()};
+  
+  
+};
+
+#endif
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/IJetsMatcherMT.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/IJetsMatcherMT.h
new file mode 100644
index 000000000000..14e38d363cb6
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/IJetsMatcherMT.h
@@ -0,0 +1,43 @@
+
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TRIGHLTJETHYPO_IJETSMATCHERMT_H
+#define TRIGHLTJETHYPO_IJETSMATCHERMT_H
+/********************************************************************
+ *
+ * NAME:     IJetsMatcherMT.h
+ * PACKAGE:  Trigger/TrigHypothesis/TrigHLTJetHypo
+ *
+ * AUTHOR:   P. Sherwood
+ * CREATED:  March 21, 2015
+ *           
+ *
+ *  PABC for matching gropups of jets with Conditions.
+ *********************************************************************/
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/IJet.h"
+#include "./ConditionsDefsMT.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/HypoJetDefs.h"
+#include <string>
+
+class ITrigJetHypoInfoCollector;
+class xAODJetCollector;
+
+class IJetsMatcherMT{
+ public:
+
+  virtual ~IJetsMatcherMT(){}
+  virtual std::optional<bool> match(const HypoJetCIter&,
+				    const HypoJetCIter&,
+				    xAODJetCollector&,
+				    const std::unique_ptr<ITrigJetHypoInfoCollector>&,
+				    bool debug=false) const = 0;
+  
+  virtual std::string toString() const = 0;
+};
+
+#endif
+
+
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolNoGrouperConfig.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolNoGrouperConfig.h
new file mode 100644
index 000000000000..c2b5b1974a99
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolNoGrouperConfig.h
@@ -0,0 +1,53 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef TRIGHLTJETHYPO_ITRIGJETHYPOTOOLNOGROUPERCONFIG_H
+#define TRIGHLTJETHYPO_ITRIGJETHYPOTOOLNOGROUPERCONFIG_H
+
+
+#include "GaudiKernel/IAlgTool.h"
+#include "./ConditionsDefsMT.h"
+#include "./IJetsMatcherMT.h"
+#include "./ConditionFilter.h"
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h"
+#include <optional>
+
+class ITrigJetHypoToolNoGrouperConfig : virtual public ::IAlgTool {
+  /** PABC (Pure Abstract Base Class) for JetHypoTool Condiguration classes.
+   TrigJetHypoToolHelperMT is a general purpose class to run
+   parts of a jet hypo. The Condiguration tools supply them
+   with the components according to the hypo scenario. */
+public:
+  DeclareInterfaceID(ITrigJetHypoToolNoGrouperConfig, 1, 0);
+  virtual ~ITrigJetHypoToolNoGrouperConfig(){};
+
+
+  /** check the input values */
+  virtual StatusCode checkVals()  const = 0;
+
+
+  /** Provide cleaner objects to sdiscard "dirty" jets before preocessing. */
+  virtual std::vector<std::shared_ptr<ICleaner>> getCleaners() const = 0;
+
+  /** return an object that tests jet group - Conditions matching */
+  virtual std::unique_ptr<IJetsMatcherMT> getMatcher() const = 0;
+
+  /** return the Conditions (which check whether a jet group satisfies one
+      or more requirements 
+  */
+   virtual std::optional<ConditionsMT> getConditions() const = 0;
+
+  /** return the ConditionFilters. These reduce the input jet collection
+      before it is passed to a Condition. Example: HT conditions sometimes
+      need and eta - Et filtered vector on which to do the Et sum.
+  */
+  
+  virtual std::vector<std::unique_ptr<ConditionFilter>>
+  getConditionFilters() const = 0;
+
+  /*( Gives the minimum number of jets the helper using this Confiog
+   class will require to pass the event. */
+  virtual std::size_t requiresNJets() const =0;
+};
+#endif
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/JetGroupRegister.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/JetGroupRegister.cxx
new file mode 100644
index 000000000000..aa873c6764c6
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/JetGroupRegister.cxx
@@ -0,0 +1,20 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "./JetGroupRegister.h"
+
+std::size_t JetGroupRegister::record(HypoJetVector v){
+
+  std::sort(v.begin(), v.end(), HypoJetLess());
+  
+  auto it = m_reg.find(v);
+  
+  if (it == m_reg.end()){
+    auto new_ind = m_reg.size();
+    m_reg[v] = new_ind;
+    return new_ind;
+  } else {
+    return it->second;
+  }
+}
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/JetGroupRegister.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/JetGroupRegister.h
new file mode 100644
index 000000000000..7ca0aec6c1a2
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/JetGroupRegister.h
@@ -0,0 +1,44 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TRIGHLTJETHYPO_JETGROUPREGISTER_H
+#define TRIGHLTJETHYPO_JETGROUPREGISTER_H
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/HypoJetDefs.h"
+
+#include <map>
+#include <algorithm>
+
+// maintain a register of ordered vectors HypoJets 
+
+struct HypoJetLess{
+  bool operator() (const HypoJetVector::value_type& l,
+		   const HypoJetVector::value_type& r) const {
+    return l.get() < r.get();
+  }
+};
+
+struct HypoJetVectorLess{
+  bool operator() (const HypoJetVector& l,
+		   const HypoJetVector& r) const {
+    
+    return std::lexicographical_compare(l.begin(),
+					l.end(),
+					r.begin(),
+					r.end(),
+					HypoJetLess());
+  }
+};
+
+
+class JetGroupRegister {
+ public:
+
+  std::size_t record(HypoJetVector v);  // copy vector
+
+ private:
+  std::map<HypoJetVector, std::size_t, HypoJetVectorLess> m_reg;
+    
+};
+#endif
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/AllJetsGrouper.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/AllJetsGrouper.cxx
index fcbfca501e77..17a701f3e9ff 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/AllJetsGrouper.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/AllJetsGrouper.cxx
@@ -7,8 +7,8 @@
 
 AllJetsGrouper:: AllJetsGrouper(){}
 
-AllJetsGrouper:: AllJetsGrouper(const HypoJetIter& b,
-				const HypoJetIter& e): m_jets(b, e){
+AllJetsGrouper:: AllJetsGrouper(const HypoJetCIter& b,
+				const HypoJetCIter& e): m_jets(b, e){
 }
 
 AllJetsGrouper:: AllJetsGrouper(const HypoJetVector& jets): m_jets{jets}{
@@ -23,14 +23,13 @@ std::vector<HypoJetGroupVector> AllJetsGrouper::group(HypoJetIter& begin,
   return std::vector<HypoJetGroupVector>{hjgv};
 }
 
-std::optional<HypoJetGroupVector> AllJetsGrouper::next(){
+std::optional<HypoJetVector> AllJetsGrouper::next(){
   if (m_done){
-    return std::optional<HypoJetGroupVector>();
+    return std::optional<HypoJetVector>();
   }
   
-  HypoJetGroupVector hjgv{HypoJetVector(m_jets)};
   m_done = true;
-  return std::make_optional<HypoJetGroupVector>(hjgv);
+  return std::make_optional<HypoJetVector>(m_jets);
 }
 
 std::string AllJetsGrouper::getName() const {
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/CombinationsGrouper.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/CombinationsGrouper.cxx
index e05b643e00c4..31a4a8e36731 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/CombinationsGrouper.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/CombinationsGrouper.cxx
@@ -46,7 +46,7 @@ CombinationsGrouper::group(HypoJetIter& begin, HypoJetIter& end) const {
   return std::vector<HypoJetGroupVector>{hjgv};
 }
 
-std::optional<HypoJetGroupVector>
+std::optional<HypoJetVector>
 CombinationsGrouper::next() {
   HypoJetGroupVector hjgv;
   
@@ -56,13 +56,13 @@ CombinationsGrouper::next() {
   
   auto combs = combgen.next();
   if (combs.second == false){
-    std::optional<HypoJetGroupVector>();
+    std::optional<HypoJetVector>();
   }
   
   HypoJetVector v;
   for(auto i : combs.first){ v.push_back(*(m_jets.begin() + i));}
   
-  return std::make_optional<HypoJetGroupVector>(hjgv);
+  return std::make_optional<HypoJetVector>(v);
 }
 
 std::string CombinationsGrouper::getName() const {
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/IndexedJetsGrouper.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/IndexedJetsGrouper.cxx
index 1abd209d030c..c905fc57409a 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/IndexedJetsGrouper.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/IndexedJetsGrouper.cxx
@@ -78,7 +78,7 @@ IndexedJetsGrouper::group(HypoJetIter& begin, HypoJetIter& end) const{
 }
 
 
-std::optional<HypoJetGroupVector>
+std::optional<HypoJetVector>
 IndexedJetsGrouper::next(){
 
   // exhausts after a single group
@@ -86,14 +86,13 @@ IndexedJetsGrouper::next(){
   // check if there are enough jets find the highest (last, as the vector is
   // ordered) and see if it lies within the jet vector
 
-  if (m_done) { return std::optional<HypoJetGroupVector>(); }
-  if (m_indices.empty()) { return std::optional<HypoJetGroupVector>(); }
+  if (m_done) { return std::optional<HypoJetVector>(); }
+  if (m_indices.empty()) { return std::optional<HypoJetVector>(); }
   
-  auto hjgv = HypoJetGroupVector();
   auto last_jet_pos =  m_indices.back();
   if (m_jets.size() <= last_jet_pos) {
     m_done = true;
-    return std::optional<HypoJetGroupVector>();
+    return std::optional<HypoJetVector>();
   }
   
   // sort jets by descending Et
@@ -103,13 +102,12 @@ IndexedJetsGrouper::next(){
                      DescendingEt());
   
   // place the jets at positions in the index vector into the inner vector
-  HypoJetVector inner;
-  for (auto i : m_indices){inner.push_back(*(m_jets.begin() + i));}
+  HypoJetVector hjv;
+  for (auto i : m_indices){hjv.push_back(*(m_jets.begin() + i));}
   
   // push the inner vector into the outer vector
-  hjgv.push_back(inner);
   m_done = true;
-  return std::make_optional<HypoJetGroupVector>(hjgv);
+  return std::make_optional<HypoJetVector>(hjv);
 }
 
 
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/SingleJetGrouper.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/SingleJetGrouper.cxx
index 80441003fc07..54de42f78560 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/SingleJetGrouper.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/SingleJetGrouper.cxx
@@ -7,12 +7,13 @@
 
 SingleJetGrouper::SingleJetGrouper(){}
 
-SingleJetGrouper::SingleJetGrouper(const HypoJetVector& v): m_jets(v){
+SingleJetGrouper::SingleJetGrouper(const HypoJetVector& v):
+  m_jets(v), m_size{v.size()}{
 }
 
 SingleJetGrouper::SingleJetGrouper(const HypoJetCIter& b,
 				   const HypoJetCIter& e):
-  m_jets(b, e){
+  m_jets(b, e), m_size{m_jets.size()}{
 }
 
 std::vector<HypoJetGroupVector> SingleJetGrouper::group(HypoJetIter& begin,
@@ -28,15 +29,14 @@ std::vector<HypoJetGroupVector> SingleJetGrouper::group(HypoJetIter& begin,
   return std::vector<HypoJetGroupVector>{hjgv};
 }
 
-std::optional<HypoJetGroupVector>
+std::optional<HypoJetVector>
 SingleJetGrouper::next() {
   if (m_index == m_size){
-    return std::optional<HypoJetGroupVector>();
+    return std::optional<HypoJetVector>();
   }
   
-  HypoJetGroupVector result;
-  result.push_back(HypoJetVector{m_jets[m_index++]});
-  return std::make_optional<HypoJetGroupVector>(result);
+  HypoJetVector result{m_jets[m_index++]};
+  return std::make_optional<HypoJetVector>(result);
 }
 
 std::string SingleJetGrouper::getName() const {
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_capacitychecked.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_capacitychecked.h
index 77e0dcb6c7aa..3daf31fa6970 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_capacitychecked.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_capacitychecked.h
@@ -37,9 +37,9 @@ public extends<AthAlgTool, ITrigJetCapacityCheckedConditionConfig> {
 
   
 
-  Gaudi::Property<std::size_t> m_chainPartInd {this,
+  Gaudi::Property<int> m_chainPartInd {this,
     "chainPartInd",
-    {0},
+    {-1},
     "identifier for chain leg - used to group jets for jet hypo clients "};
 
 
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_htfr.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_htfr.cxx
new file mode 100644
index 000000000000..6f0878909c7b
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_htfr.cxx
@@ -0,0 +1,49 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+/*
+  Instantiator for Htfr Conditions
+ */
+#include "TrigJetConditionConfig_htfr.h"
+#include "GaudiKernel/StatusCode.h"
+#include "./HTConditionFastReduction.h"
+#include "./ArgStrToDouble.h"
+
+TrigJetConditionConfig_htfr::TrigJetConditionConfig_htfr(const std::string& type,
+                                                 const std::string& name,
+                                                 const IInterface* parent) :
+  base_class(type, name, parent){
+
+}
+
+
+StatusCode TrigJetConditionConfig_htfr::initialize() {
+  CHECK(checkVals());
+
+  return StatusCode::SUCCESS;
+}
+
+
+ConditionMT TrigJetConditionConfig_htfr::getCondition() const {
+  auto a2d = ArgStrToDouble();
+  return std::make_unique<HTConditionFastReduction>(a2d(m_min), a2d(m_max));
+}
+
+
+StatusCode TrigJetConditionConfig_htfr::checkVals() const {
+    auto a2d = ArgStrToDouble();
+  if (a2d(m_min) > a2d(m_max)){
+    ATH_MSG_ERROR("htMin > htMax");
+    return StatusCode::FAILURE;
+  }
+  return StatusCode::SUCCESS;
+}
+
+bool TrigJetConditionConfig_htfr::addToCapacity(std::size_t) {
+  return false;
+}
+
+std::size_t TrigJetConditionConfig_htfr::capacity() const {
+  return getCondition()->capacity();
+}
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_htfr.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_htfr.h
new file mode 100644
index 000000000000..8f2f9ec06794
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_htfr.h
@@ -0,0 +1,45 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TRIGJETCONDITIONCONFIG_HTFR_H
+#define TRIGJETCONDITIONCONFIG_HTFR_H
+
+/*
+Condiguration AlgTool for ht conditions to be run in FastReduction
+PS 
+*/
+
+#include "ITrigJetConditionConfig.h"
+#include "./ConditionsDefsMT.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h"
+
+class TrigJetConditionConfig_htfr:
+public extends<AthAlgTool, ITrigJetConditionConfig> {
+
+ public:
+  
+  TrigJetConditionConfig_htfr(const std::string& type,
+			      const std::string& name,
+			      const IInterface* parent);
+
+  virtual StatusCode initialize() override;
+  virtual ConditionMT getCondition() const override;
+
+  virtual bool addToCapacity(std::size_t) override;
+  virtual std::size_t capacity() const override;
+
+ private:
+
+
+  Gaudi::Property<std::string>
+    m_min{this, "min", {}, "min HT"};
+
+  Gaudi::Property<std::string>
+    m_max{this, "max", {}, "max HT"};
+
+  StatusCode checkVals()  const;
+};
+#endif
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_fastreduction.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_fastreduction.cxx
index c819ee3580b1..eb8b9b40796a 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_fastreduction.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_fastreduction.cxx
@@ -9,12 +9,12 @@
 
 #include "./conditionsFactoryMT.h"
 
-#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/SingleJetGrouper.h"
 #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/xAODJetAsIJetFactory.h"
 #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerFactory.h"
 #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/TrigHLTJetHypoHelper2.h"
-#include "./groupsMatcherFactoryMT.h"
 #include "./CapacityCheckedCondition.h"
+#include "./FastReductionMatcher.h"
+#include "./Tree.h"
 
 #include "TrigCompositeUtils/TrigCompositeUtils.h"
 
@@ -134,29 +134,49 @@ TrigJetHypoToolConfig_fastreduction::getConditions() const {
   return std::make_optional<ConditionsMT>(std::move(conditions));
 }
 
+
+std::vector<std::unique_ptr<ConditionFilter>>
+TrigJetHypoToolConfig_fastreduction::getConditionFilters() const {
+
+  auto filters = std::vector<std::unique_ptr<ConditionFilter>>();
+  
+  for(const auto& cm : m_filtConditionMakers){
+    ConditionPtrs filterConditions;  // will contain a single Condition
+    filterConditions.push_back(std::move(cm->getCapacityCheckedCondition()));
+    auto cf = std::make_unique<ConditionFilter>(filterConditions);
+    filters.push_back(std::move(cf));
+  }
+  
+  return filters;
+}
+
 // following function not used for treeless hypos
 std::size_t
 TrigJetHypoToolConfig_fastreduction::requiresNJets() const {
   return 0;
 }
 
- 
-std::unique_ptr<IJetGrouper>
-TrigJetHypoToolConfig_fastreduction::getJetGrouper() const {
-  return std::make_unique<SingleJetGrouper>();
-}
 
-std::unique_ptr<IGroupsMatcherMT>
+std::unique_ptr<IJetsMatcherMT>
 TrigJetHypoToolConfig_fastreduction::getMatcher () const {
 
   auto opt_conds = getCapacityCheckedConditions();
 
   if(!opt_conds.has_value()){
-    return std::unique_ptr<IGroupsMatcherMT>(nullptr);
+    return std::unique_ptr<IJetsMatcherMT>(nullptr);
   }
 
-  return groupsMatcherFactoryMT_FastReduction(std::move(*opt_conds),
-					      m_treeVec);
+  auto matcher =  std::unique_ptr<IJetsMatcherMT>();
+  //  matcher.reset(new FastReductionMatcher(std::move(*opt_conds),
+  //					 Tree(m_treeVec)));
+
+  auto conditions = std::move(*opt_conds);
+  auto filters = getConditionFilters();
+  auto fpm = new FastReductionMatcher(conditions,
+				      filters,
+				      Tree(m_treeVec));
+  matcher.reset(fpm);
+  return matcher;
 }
 
 StatusCode TrigJetHypoToolConfig_fastreduction::checkVals() const {
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_fastreduction.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_fastreduction.h
index 26a33fe89d6c..91622b23b550 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_fastreduction.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_fastreduction.h
@@ -13,22 +13,23 @@
  *********************************************************************/
 
 
-#include "ITrigJetHypoToolConfig.h"
+#include "ITrigJetHypoToolNoGrouperConfig.h"
 #include "./CapacityCheckedConditionsDefs.h"
 #include "TrigCompositeUtils/HLTIdentifier.h"
 #include "AthenaBaseComps/AthAlgTool.h"
 #include "TrigCompositeUtils/TrigCompositeUtils.h"
 #include "AthenaMonitoringKernel/GenericMonitoringTool.h"
 
+#include "./IJetsMatcherMT.h"
 #include "./ConditionsDefsMT.h"
 #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ICleaner.h"
-#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/IJetGrouper.h"
 #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h"
 #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h"
 #include "./ITrigJetCapacityCheckedConditionConfig.h"
+#include "./ConditionFilter.h"
 
 class TrigJetHypoToolConfig_fastreduction:
-public extends<AthAlgTool, ITrigJetHypoToolConfig> {
+public extends<AthAlgTool, ITrigJetHypoToolNoGrouperConfig> {
 
  public:
   
@@ -39,17 +40,24 @@ public extends<AthAlgTool, ITrigJetHypoToolConfig> {
 
   virtual StatusCode initialize() override;
   virtual std::vector<std::shared_ptr<ICleaner>> getCleaners() const override;
-  virtual std::unique_ptr<IJetGrouper> getJetGrouper() const override;
-  virtual std::unique_ptr<IGroupsMatcherMT> getMatcher() const override;
+  virtual std::unique_ptr<IJetsMatcherMT> getMatcher() const override;
   virtual std::optional<ConditionsMT> getConditions() const override;
+
+  virtual std::vector<std::unique_ptr<ConditionFilter>>
+  getConditionFilters() const override;
+
   virtual std::size_t requiresNJets() const override;
   virtual StatusCode checkVals() const override;
 
 
  private:
   ToolHandleArray<ITrigJetCapacityCheckedConditionConfig> m_conditionMakers{
-    this, "conditionMakers", {}, "hypo tree node to conditiionMaker map"};
+    this, "conditionMakers", {}, "hypo tree Condition builder AlgTools"};
 
+  ToolHandleArray<ITrigJetCapacityCheckedConditionConfig> m_filtConditionMakers{
+    this, "filtConditionsMakers", {},
+    "hypo tree Condition builder AlgTools for Condition filters"};
+  
   Gaudi::Property<std::vector<std::size_t>> m_treeVec{
     this, "treeVector", {}, "integer sequence representation of jet hypo tree"};
 
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolHelperNoGrouper.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolHelperNoGrouper.cxx
new file mode 100644
index 000000000000..b7e7a2025889
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolHelperNoGrouper.cxx
@@ -0,0 +1,134 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "./TrigJetHypoToolHelperNoGrouper.h"
+#include "./ITrigJetHypoInfoCollector.h"
+#include "./xAODJetCollector.h"
+#include "./JetTrigTimer.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerFactory.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/xAODJetAsIJet.h"  // TLorentzVec
+#include "./nodeIDPrinter.h"
+#include "./DebugInfoCollector.h"
+#include <algorithm>
+#include <sstream>
+
+TrigJetHypoToolHelperNoGrouper::TrigJetHypoToolHelperNoGrouper(const std::string& type,
+							       const std::string& name,
+							       const IInterface* parent) :
+  base_class(type, name, parent){
+}
+
+StatusCode TrigJetHypoToolHelperNoGrouper::initialize() {
+
+  m_matcher = m_config->getMatcher();
+  if(!m_matcher){
+    ATH_MSG_ERROR("Error setting matcher");
+    return StatusCode::FAILURE;
+  }
+		  
+  return StatusCode::SUCCESS;
+}
+
+void
+TrigJetHypoToolHelperNoGrouper::collectData(const std::string& exetime,
+					    const std::unique_ptr<ITrigJetHypoInfoCollector>& collector,
+					    const std::optional<bool>& pass) const {
+  if(!collector){return;}
+  auto helperInfo = nodeIDPrinter("TrigJetHypoToolHelperNoGrouper",
+                                  m_nodeID,
+                                  m_parentNodeID,
+                                  pass,
+                                  exetime
+                                  );
+  
+  collector->collect(name(), helperInfo);
+}
+
+
+bool
+TrigJetHypoToolHelperNoGrouper::pass(HypoJetVector& jets,
+				     xAODJetCollector& jetCollector,
+				     const std::unique_ptr<ITrigJetHypoInfoCollector>& collector) const {
+  
+  if(collector){
+    std::stringstream ss;
+    ss <<  "No of jets " + std::to_string(jets.size()) + '\n';
+    ss << jets; 
+    collector->collect(name(), ss.str());
+  }
+
+  JetTrigTimer timer;
+  timer.start();
+  
+  if(jets.empty()){   
+    timer.stop();
+    bool pass = false;
+    collectData(timer.readAndReset(), collector, pass);
+    return pass;
+  }
+
+  HypoJetIter jets_begin = jets.begin(); 
+  HypoJetIter jets_end = jets.end(); 
+  for(auto cleaner: m_cleaners){
+    jets_end = std::partition(jets_begin,
+			      jets_end,
+			      [cleaner](const pHypoJet& j){
+				return cleaner->select(j);}
+			      );
+  }
+  
+  auto pass = m_matcher->match(jets_begin,
+			       jets_end,
+			       jetCollector,
+			       collector);
+  
+  timer.stop();
+  
+  collectData(timer.readAndReset(), collector, pass);
+  
+  if(!pass.has_value()){
+    ATH_MSG_ERROR("Matcher cannot determine result. Config error?");
+    return false;
+  }
+    
+  return *pass;
+}
+
+std::string TrigJetHypoToolHelperNoGrouper::toString() const {
+  
+  
+  std::stringstream ss;
+  ss << nodeIDPrinter(name(),
+                      m_nodeID,
+                      m_parentNodeID);
+  
+  
+  ss << "Cleaners:\n No of cleaners: "  << m_cleaners.size() << '\n';
+  
+  for(auto cleaner : m_cleaners) {
+    ss << cleaner->toString() 
+       << '\n';
+  }
+  
+  ss << "\nMatcher:\n";
+  ss << m_matcher -> toString();
+  
+  return ss.str();
+}
+
+
+StatusCode
+TrigJetHypoToolHelperNoGrouper::getDescription(ITrigJetHypoInfoCollector& c) const {
+  c.collect(name(), toString());
+  return StatusCode::SUCCESS;
+}
+
+
+std::size_t TrigJetHypoToolHelperNoGrouper::requiresNJets() const {
+  return m_config->requiresNJets();
+}
+
+
+
+
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolHelperNoGrouper.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolHelperNoGrouper.h
new file mode 100644
index 000000000000..f4e58f9a0ac0
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolHelperNoGrouper.h
@@ -0,0 +1,87 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TRIGHLTJETHYPO_TRIGJETHYPOHELPERNOGROUPER_H
+#define TRIGHLTJETHYPO_TRIGJETHYPOHELPERNOGROUPER_H
+
+/**
+ * A configurable helper class to implement Jet Trigger algorithms.
+ * Initial jet removal from incomming container is done using the ICleaner predicates.
+ * The surviving jets are grouped into subsets by the IJetGroup object.
+ *
+ * The IMatcher objector owns a set of Conditions objects. 
+ * The Matcher determines 
+ * whether the container of jet groups satisfies the Conditions. If so,
+ * the event passes, otherwise it fails.
+ *
+ */
+
+#include <vector>
+#include <memory>
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ICleanerTool.h"
+#include "./IJetsMatcherMT.h"
+#include "./ConditionsDefsMT.h"
+
+#include "TrigHLTJetHypo/ITrigJetHypoToolHelperMT.h"
+#include "ITrigJetHypoToolNoGrouperConfig.h"
+
+class ITrigJetHypoInfoCollector;
+class xAODJetCollector;
+
+class TrigJetHypoToolHelperNoGrouper:
+public extends<AthAlgTool, ITrigJetHypoToolHelperMT> {
+
+ public:
+  TrigJetHypoToolHelperNoGrouper(const std::string& type,
+                          const std::string& name,
+                          const IInterface* parent);
+
+  StatusCode initialize() override;
+  virtual bool
+
+    // pass - tests wethewr a jet collection passes cuts, and collects
+    // information about the decision.
+    pass(HypoJetVector&,
+	 xAODJetCollector&,
+	 const std::unique_ptr<ITrigJetHypoInfoCollector>&) const override;
+  
+  virtual std::size_t requiresNJets() const override;
+  
+  virtual StatusCode getDescription(ITrigJetHypoInfoCollector&) const override;
+
+ private:
+
+  // Object that matches jet groups with Conditions
+  std::unique_ptr<IJetsMatcherMT> m_matcher;
+
+  // Bridge objects to ICleaner predicate function objects to allow polymorphic
+  // pointers to be used with the STL (pass by value).
+  ToolHandleArray<ICleanerTool> m_cleaners;
+
+  ///////////////////////////////
+
+ // Used to generate helper objects foe TrigHLTJetHelper
+ // from user supplied values
+ ToolHandle<ITrigJetHypoToolNoGrouperConfig> m_config {
+   this, "HypoConfigurer", {}, "Configurer to set up TrigHLTJetHypoHelper2"}; 
+
+ Gaudi::Property<int>
+  m_parentNodeID {this, "parent_id", {0}, "hypo tool tree parent node id"};
+
+Gaudi::Property<int>
+  m_nodeID {this, "node_id", {0}, "hypo tool tree node id"};
+
+Gaudi::Property<bool>
+  m_debug {this, "debug", false, "instantantiate helpers with this debug flag"};
+
+
+ void collectData(const std::string& exetime,
+                  const std::unique_ptr<ITrigJetHypoInfoCollector>&,
+                  const std::optional<bool>& pass) const;
+
+ virtual std::string toString() const override;
+};
+
+#endif
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx
index d573062d7aae..05e2bf6d986d 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx
@@ -42,17 +42,18 @@ TrigJetHypoToolMT::~TrigJetHypoToolMT(){
 }
 
 StatusCode TrigJetHypoToolMT::initialize(){
-  DebugInfoCollector collector(name());
-  CHECK(m_helper->getDescription(collector));
-  auto s = collector.toString();
-  
-  for(const auto& l : lineSplitter(s)){
-    ATH_MSG_INFO(l);
-  }
-  
+
   if (m_visitDebug){
-    collector.write();
+
+    DebugInfoCollector collector(name());
+    CHECK(m_helper->getDescription(collector));
+    auto s = collector.toString();
+  
+    for(const auto& l : lineSplitter(s)){
+      ATH_MSG_INFO(l);
+    }
   }
+
   return StatusCode::SUCCESS;
 }
 
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx
index 2ef7d1045234..4974748f7260 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx
@@ -20,6 +20,7 @@
 #include "../TrigJetConditionConfig_signed_eta.h"
 #include "../TrigJetConditionConfig_et.h"
 #include "../TrigJetConditionConfig_ht.h"
+#include "../TrigJetConditionConfig_htfr.h"
 #include "../TrigJetConditionConfig_dijet_mass.h"
 #include "../TrigJetConditionConfig_dijet_dphi.h"
 #include "../TrigJetConditionConfig_dijet_deta.h"
@@ -34,6 +35,7 @@
 //
 #include "../TrigJetHypoToolMT.h"
 #include "../TrigJetHypoToolHelperMT.h"
+#include "../TrigJetHypoToolHelperNoGrouper.h"
 #include "../TrigJetTLAHypoAlgMT.h"
 #include "../TrigJetTLAHypoToolMT.h"
 #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/BasicCleanerTool.h"
@@ -64,6 +66,7 @@ DECLARE_COMPONENT(TrigJetConditionConfig_signed_eta)
 DECLARE_COMPONENT(TrigJetConditionConfig_abs_eta)
 DECLARE_COMPONENT(TrigJetConditionConfig_et)
 DECLARE_COMPONENT(TrigJetConditionConfig_ht)
+DECLARE_COMPONENT(TrigJetConditionConfig_htfr)
 DECLARE_COMPONENT(TrigJetConditionConfig_dijet_mass)
 DECLARE_COMPONENT(TrigJetConditionConfig_dijet_deta)
 DECLARE_COMPONENT(TrigJetConditionConfig_dijet_dphi)
@@ -80,6 +83,7 @@ DECLARE_COMPONENT(TrigJetHypoToolMT)
 DECLARE_COMPONENT(TrigJetTLAHypoAlgMT)
 DECLARE_COMPONENT(TrigJetTLAHypoToolMT)
 DECLARE_COMPONENT(TrigJetHypoToolHelperMT)
+DECLARE_COMPONENT(TrigJetHypoToolHelperNoGrouper)
 
 DECLARE_COMPONENT(BasicCleanerTool)
 DECLARE_COMPONENT(AntiCleanerTool)
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/groupsMatcherFactoryMT.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/groupsMatcherFactoryMT.cxx
index b34ebadffb58..c7baef98e498 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/groupsMatcherFactoryMT.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/groupsMatcherFactoryMT.cxx
@@ -17,17 +17,6 @@ groupsMatcherFactoryMT_SingleCondition (ConditionsMT&& conditions){
 }
 
 
-std::unique_ptr<IGroupsMatcherMT> 
-groupsMatcherFactoryMT_FastReduction (ConditionPtrs&& conditions,
-				      const std::vector<std::size_t>& treeVec){
-  
-  if (conditions.size() == 1) {
-    return std::make_unique<SingleConditionMatcherMT>(std::move(conditions[0]));
-  } else {
-    return std::make_unique<FastReductionMatcher>(std::move(conditions),
-						  treeVec);
-  } 
-}
 
 
 
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/groupsMatcherFactoryMT.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/groupsMatcherFactoryMT.h
index b91b74c3df27..cde9b776796e 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/groupsMatcherFactoryMT.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/groupsMatcherFactoryMT.h
@@ -16,7 +16,4 @@ groupsMatcherFactoryMT_SingleCondition(ConditionsMT&&);
 std::unique_ptr<IGroupsMatcherMT>
 groupsMatcherFactoryMT_MaxBipartite(ConditionsMT&&);
 
-std::unique_ptr<IGroupsMatcherMT>
-groupsMatcherFactoryMT_FastReduction(ConditionPtrs&&,
-				     const std::vector<std::size_t>& treeVec);
 #endif
diff --git a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
index 3d09ef19cbbe..201a8038ae04 100644
--- a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
+++ b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
@@ -1469,7 +1469,7 @@ HLT_j0_aggSEP500htSEP30etSEP0eta320_L1J20:
   stepCounts:
     0: 1
   stepFeatures:
-    0: 50
+    0: 5
 HLT_j0_perf_L1J12_EMPTY:
   eventCount: 0
 HLT_j0_vbenfSEP30etSEP34mass35SEP50fbet_L1J20:
-- 
GitLab


From 89da29eb6b020d5ae7548287e95c6da6984a522c Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Tue, 22 Dec 2020 00:03:56 +0100
Subject: [PATCH 208/225] MuonTrackSteeringTools: Another attempt to fix
 dangling Surface references.

finalize() is still to late to clean up the garbage in MuPatCandidateTool,
as we also clean stores in step.  Try moving deleting the garbage
to stop().

See ATLASRECTS-5843.
---
 .../MuonTrackSteeringTools/src/MuPatCandidateTool.cxx    | 6 +++++-
 .../MuonTrackSteeringTools/src/MuPatCandidateTool.h      | 9 ++++++---
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx
index 4bf8325d4afe..d12909b845c2 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.cxx
@@ -58,9 +58,13 @@ namespace Muon {
   }
 
   StatusCode MuPatCandidateTool::finalize() {
+    return StatusCode::SUCCESS;
+  }
+
+  StatusCode MuPatCandidateTool::stop() {
 
     // Clean up all garbage now.
-    // If we leave it for the dtor, we may end up with dangling references
+    // If we leave it for later, we may end up with dangling references
     // to Surface objects that have already been deleted.
     for (CacheEntry& ent : m_cache) {
       ent.cleanUp();
diff --git a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.h b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.h
index 9408b03df006..da0186c3a723 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonTrackMakers/MuonTrackMakerTools/MuonTrackSteeringTools/src/MuPatCandidateTool.h
@@ -65,13 +65,16 @@ namespace Muon {
     MuPatCandidateTool(const std::string&, const std::string&, const IInterface*);
     
     /** destructor */
-    ~MuPatCandidateTool() = default;
+    virtual ~MuPatCandidateTool() = default;
     
     /** initialize method, method taken from bass-class AlgTool */
-    StatusCode initialize();
+    virtual StatusCode initialize() override;
 
     /** finialize method, method taken from bass-class AlgTool */
-    StatusCode finalize();
+    virtual StatusCode finalize() override;
+
+    /** stop method, used to clean up garbage */
+    virtual StatusCode stop() override;
     
     /** @brief access to tool interface */
     static const InterfaceID& interfaceID() { return IID_MuPatCandidateTool; }
-- 
GitLab


From dd8cd5e2296f9e2609a20532e873786a97631151 Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Tue, 8 Dec 2020 22:34:42 -0500
Subject: [PATCH 209/225] TrigHLTJetHypo: Fix debug logging.

Missing format string arguments.
Was generating errors with py 3.8.
---
 .../TrigHLTJetHypo/python/ConditionsToolSetterFastReduction.py  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ConditionsToolSetterFastReduction.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ConditionsToolSetterFastReduction.py
index 656f8236623f..4cbe8323990c 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ConditionsToolSetterFastReduction.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ConditionsToolSetterFastReduction.py
@@ -225,7 +225,7 @@ class ConditionsToolSetterFastReduction(object):
         self._fill_tree_map(tree, tree_map)
 
         for k, v in tree_map.items():
-            log.debug("Tree map debug ", str(k), str(v))
+            log.debug("Tree map debug %s %s", str(k), str(v))
             
         treeVec = self._map_2_vec(tree_map)
 
-- 
GitLab


From 314d539b9c4433d644e4e9e5962e3224a1f2f79e Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Sat, 19 Dec 2020 11:06:33 -0500
Subject: [PATCH 210/225] TrkPatternParameters: Protect against passing null
 surface pointers.

Needed to fix null pointer dereference warning in TRT_TrajectoryElement_xk,
where we have

```
  Tp.setParametersWithCovariance(0,P,V);
```
---
 .../TrkPatternParameters/PatternTrackParameters.h             | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Tracking/TrkEvent/TrkPatternParameters/TrkPatternParameters/PatternTrackParameters.h b/Tracking/TrkEvent/TrkPatternParameters/TrkPatternParameters/PatternTrackParameters.h
index 977d9bfda6ff..846dcd841605 100755
--- a/Tracking/TrkEvent/TrkPatternParameters/TrkPatternParameters/PatternTrackParameters.h
+++ b/Tracking/TrkEvent/TrkPatternParameters/TrkPatternParameters/PatternTrackParameters.h
@@ -206,7 +206,7 @@ namespace Trk {
   inline void PatternTrackParameters::setParameters
     (const Surface* s,const double* p)
     {
-      m_surface.reset(s->isFree() ? s->clone() : s);
+      m_surface.reset(s && s->isFree() ? s->clone() : s);
       m_parameters[ 0] = p[ 0];
       m_parameters[ 1] = p[ 1];
       m_parameters[ 2] = p[ 2];
@@ -250,7 +250,7 @@ namespace Trk {
   inline void PatternTrackParameters::setParametersWithCovariance
     (const Surface* s,const double* p,const double* c)
     {
-      m_surface.reset(s->isFree() ? s->clone() : s);
+      m_surface.reset(s && s->isFree() ? s->clone() : s);
       m_parameters[ 0] = p[ 0];
       m_parameters[ 1] = p[ 1];
       m_parameters[ 2] = p[ 2];
-- 
GitLab


From d59d10d40cc3da7c7fd9698b19abb89aeb069e57 Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Thu, 10 Dec 2020 17:16:35 -0500
Subject: [PATCH 211/225] ActsGeometry: Fix clang warnings.

class/struct mismatch.
unused alias.
---
 .../Acts/ActsGeometry/ActsGeometry/ActsExtrapolationAlg.h     | 2 +-
 .../ActsGeometry/ActsGeometry/IActsPropStepRootWriterSvc.h    | 4 ++--
 Tracking/Acts/ActsGeometry/src/ActsPropStepRootWriterSvc.cxx  | 4 +---
 3 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/Tracking/Acts/ActsGeometry/ActsGeometry/ActsExtrapolationAlg.h b/Tracking/Acts/ActsGeometry/ActsGeometry/ActsExtrapolationAlg.h
index d87153490dbf..887764140859 100755
--- a/Tracking/Acts/ActsGeometry/ActsGeometry/ActsExtrapolationAlg.h
+++ b/Tracking/Acts/ActsGeometry/ActsGeometry/ActsExtrapolationAlg.h
@@ -25,7 +25,7 @@
 namespace Acts {
   class TrackingGeometry;
   namespace detail {
-    class Step;
+    struct Step;
   }
 }
 
diff --git a/Tracking/Acts/ActsGeometry/ActsGeometry/IActsPropStepRootWriterSvc.h b/Tracking/Acts/ActsGeometry/ActsGeometry/IActsPropStepRootWriterSvc.h
index abcde5cd7fa2..e7653a923bcf 100644
--- a/Tracking/Acts/ActsGeometry/ActsGeometry/IActsPropStepRootWriterSvc.h
+++ b/Tracking/Acts/ActsGeometry/ActsGeometry/IActsPropStepRootWriterSvc.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef ACTSGEOMETRY_IACTSPROPSTEPROOTWRITERSVC_H
@@ -10,7 +10,7 @@
 
 namespace Acts {
   namespace detail {
-    class Step;
+    struct Step;
   }
 }
 
diff --git a/Tracking/Acts/ActsGeometry/src/ActsPropStepRootWriterSvc.cxx b/Tracking/Acts/ActsGeometry/src/ActsPropStepRootWriterSvc.cxx
index 6229793ec97c..5e8c33835bd5 100644
--- a/Tracking/Acts/ActsGeometry/src/ActsPropStepRootWriterSvc.cxx
+++ b/Tracking/Acts/ActsGeometry/src/ActsPropStepRootWriterSvc.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "ActsGeometry/ActsPropStepRootWriterSvc.h"
@@ -120,8 +120,6 @@ ActsPropStepRootWriterSvc::writeThread()
 void
 ActsPropStepRootWriterSvc::doWrite(const StepVector& steps, size_t evtNum)
 {
-  using ag = Acts::GeometryIdentifier;
-
   m_eventNum = evtNum;
   m_s_pX.clear();
   m_s_pY.clear();
-- 
GitLab


From 9fae3e0e9e9fa49dabae51155aa93a1e27c4bb78 Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Tue, 15 Dec 2020 15:05:19 -0500
Subject: [PATCH 212/225] CxxUtils: Fix copyright for MurmurHash2.

It's non-ATLAS, public-domain code.
Remove ATLAS copyright; restore original copyright notice that
had been mangled.
---
 Control/CxxUtils/CxxUtils/MurmurHash2.h | 5 +----
 Control/CxxUtils/Root/MurmurHash2.cxx   | 4 +---
 2 files changed, 2 insertions(+), 7 deletions(-)

diff --git a/Control/CxxUtils/CxxUtils/MurmurHash2.h b/Control/CxxUtils/CxxUtils/MurmurHash2.h
index f07a1e86b92b..27169c86d279 100644
--- a/Control/CxxUtils/CxxUtils/MurmurHash2.h
+++ b/Control/CxxUtils/CxxUtils/MurmurHash2.h
@@ -1,7 +1,4 @@
 // This file's extension implies that it's C, but it's really -*- C++ -*-.
-/*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
-*/
 /*
  * Public domain; see below.
  */
@@ -21,7 +18,7 @@
 
 //-----------------------------------------------------------------------------
 // MurmurHash2 was written by Austin Appleby, and is placed in the public
-
+// domain. The author hereby disclaims copyright to this source code.
 
 //-----------------------------------------------------------------------------
 // Platform-specific functions and macros
diff --git a/Control/CxxUtils/Root/MurmurHash2.cxx b/Control/CxxUtils/Root/MurmurHash2.cxx
index 64d27e4a1185..4311c5b2a00e 100644
--- a/Control/CxxUtils/Root/MurmurHash2.cxx
+++ b/Control/CxxUtils/Root/MurmurHash2.cxx
@@ -1,6 +1,3 @@
-/*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
-*/
 /*
  * Public domain; see below.
  */
@@ -16,6 +13,7 @@
 
 //-----------------------------------------------------------------------------
 // MurmurHash2 was written by Austin Appleby, and is placed in the public
+// domain. The author hereby disclaims copyright to this source code.
 
 // Note - This code makes a few assumptions about how your machine behaves -
 
-- 
GitLab


From 7752570ff7fe29203305fd3c2c3dc39aa951f8f7 Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Mon, 14 Dec 2020 16:48:49 -0500
Subject: [PATCH 213/225] CxxUtils: Fix a typo in comments.

Fix a typo in comments.
---
 Control/CxxUtils/CxxUtils/ConcurrentRangeMap.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Control/CxxUtils/CxxUtils/ConcurrentRangeMap.h b/Control/CxxUtils/CxxUtils/ConcurrentRangeMap.h
index b4aaaef30cee..b7b0a3c82928 100644
--- a/Control/CxxUtils/CxxUtils/ConcurrentRangeMap.h
+++ b/Control/CxxUtils/CxxUtils/ConcurrentRangeMap.h
@@ -390,7 +390,7 @@ public:
 
   /**
    * @brief Update all range objects.
-   * @param rangeUpater Functional to call on each range object.
+   * @param rangeUpdater Functional to call on each range object.
    * @param ctx Execution context.
    *
    * This will iterate through the list of entries and call @c rangeUpdater
-- 
GitLab


From e02abb936b6e7f3da0b8ba627b19181f6763a1f2 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Mon, 21 Dec 2020 04:54:20 +0100
Subject: [PATCH 214/225] StoreGateBindings: Protect against missing
 hasStore().

In the pythonization of SG retrieve, don't assume that having a setStore()
method implies that we have a hasStore() method.  That's not true if we're
explicitly retrieving an auxiliary store object.
---
 Control/StoreGateBindings/python/Bindings.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Control/StoreGateBindings/python/Bindings.py b/Control/StoreGateBindings/python/Bindings.py
index 07d8c9b46fd5..9797e0490a0b 100644
--- a/Control/StoreGateBindings/python/Bindings.py
+++ b/Control/StoreGateBindings/python/Bindings.py
@@ -85,7 +85,7 @@ def _setup():
             ret = py_sg_getitem(self, str(key).encode())
         except LookupError as err:
             raise KeyError(str(err))
-        if ret and hasattr(ret,'setStore') and not ret.hasStore():
+        if ret and hasattr(ret,'setStore') and hasattr(ret,'hasStore') and not ret.hasStore():
             if not hasattr(ret,'trackIndices') or ret.trackIndices():
                 if py_sg_contains (self, 'SG::IConstAuxStore', key + 'Aux.'):
                     aux = py_retrieve (self, 'SG::IConstAuxStore', key + 'Aux.')
-- 
GitLab


From 3c4d55c841e8b778ab5975a6b875ec4a7069dfde Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Mon, 21 Dec 2020 05:01:15 +0100
Subject: [PATCH 215/225] egammaD3PDMaker: Restore some required imports.

The imports of resolveSGKey are required, even though flake8 doesn't
know it.
---
 .../egammaD3PDMaker/python/CorrectionClusterD3PDObject.py        | 1 +
 .../D3PDMaker/egammaD3PDMaker/python/ElectronD3PDObject.py       | 1 +
 .../D3PDMaker/egammaD3PDMaker/python/PhotonD3PDObject.py         | 1 +
 3 files changed, 3 insertions(+)

diff --git a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/CorrectionClusterD3PDObject.py b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/CorrectionClusterD3PDObject.py
index 2528bbe8c2e4..1efcd7c3c021 100644
--- a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/CorrectionClusterD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/CorrectionClusterD3PDObject.py
@@ -12,6 +12,7 @@
 from D3PDMakerCoreComps.D3PDObject    import make_SGDataVector_D3PDObject
 from egammaD3PDAnalysis.TileGapConfig import TileGapConfig
 from D3PDMakerCoreComps.D3PDObject    import DeferArg
+from D3PDMakerCoreComps.resolveSGKey  import resolveSGKey # noqa: F401
 import EventCommonD3PDMaker
 import D3PDMakerCoreComps
 import CaloD3PDMaker
diff --git a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/ElectronD3PDObject.py b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/ElectronD3PDObject.py
index b0df9756add6..42c49237a45b 100644
--- a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/ElectronD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/ElectronD3PDObject.py
@@ -15,6 +15,7 @@ from D3PDMakerCoreComps.D3PDObject          import DeferArg
 from D3PDMakerCoreComps.SimpleAssociation   import SimpleAssociation
 from D3PDMakerCoreComps.IndexMultiAssociation import IndexMultiAssociation
 from D3PDMakerCoreComps.resolveSGKey        import testSGKey
+from D3PDMakerCoreComps.resolveSGKey        import resolveSGKey # noqa: F401
 from D3PDMakerConfig.D3PDMakerFlags         import D3PDMakerFlags
 from RecExConfig.RecFlags                   import rec
 import egammaD3PDMaker
diff --git a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/PhotonD3PDObject.py b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/PhotonD3PDObject.py
index fbf504ce8a1c..81757134e46a 100644
--- a/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/PhotonD3PDObject.py
+++ b/PhysicsAnalysis/D3PDMaker/egammaD3PDMaker/python/PhotonD3PDObject.py
@@ -14,6 +14,7 @@ from D3PDMakerCoreComps.D3PDObject           import DeferArg
 from D3PDMakerCoreComps.SimpleAssociation    import SimpleAssociation
 from D3PDMakerConfig.D3PDMakerFlags          import D3PDMakerFlags
 from D3PDMakerCoreComps.resolveSGKey         import testSGKey
+from D3PDMakerCoreComps.resolveSGKey         import resolveSGKey # noqa: F401
 from TrackD3PDMaker.xAODTrackSummaryFiller   import xAODTrackSummaryFiller
 from D3PDMakerCoreComps.ContainedVectorMultiAssociation import ContainedVectorMultiAssociation
 from RecExConfig.RecFlags                    import rec
-- 
GitLab


From 3e80eb56d4096aa1293e7de8847aff661357fc25 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Mon, 21 Dec 2020 05:09:44 +0100
Subject: [PATCH 216/225] D3PDMakerConfig: configuration fixes

 - Need to make sure that aux ids are defined in MergeElectrons.
 - Don't import CondDB before including RecExCommon_topOptions.py;
   otherwise, the database instance can be set wrong.
---
 .../D3PDMakerConfig/python/egammaD3PD.py         | 16 ++++------------
 .../D3PDMakerConfig/share/AODToEgammaD3PD.py     |  5 +++--
 2 files changed, 7 insertions(+), 14 deletions(-)

diff --git a/PhysicsAnalysis/D3PDMaker/D3PDMakerConfig/python/egammaD3PD.py b/PhysicsAnalysis/D3PDMaker/D3PDMakerConfig/python/egammaD3PD.py
index 29bf2a9878c5..4e13f4f8639f 100644
--- a/PhysicsAnalysis/D3PDMaker/D3PDMakerConfig/python/egammaD3PD.py
+++ b/PhysicsAnalysis/D3PDMaker/D3PDMakerConfig/python/egammaD3PD.py
@@ -205,18 +205,10 @@ class MergeElectrons (PyAthena.Alg):
         sg.record (enew, 'AllElectrons')
         cfgKeyStore.addTransient ('xAOD::ElectronContainer', 'AllElectrons')
 
-        #e1 = sg['StacoMuonCollection']
-        e1 = sg.retrieve (ROOT.DataVector(ROOT.xAOD.Electron_v1), 'AllElectrons')
-        #if e1.size() > 0:
-        #    reg = ROOT.SG.AuxTypeRegistry.instance()
-        #    auxids = list(e1[0].getAuxIDs())
-        #    auxids = [(reg.getName(id), id) for id in auxids]
-        #    auxids.sort()
-        #    print 'aaa', auxids
-        # if e2.size() > 0:
-        #     acc = ROOT.SG.AuxElement.TypelessConstAccessor ('Loose')
-        #     print 'bbb2', acc.isAvailable(e2[0])
-
+        # Make sure these aux variables are defined at this point.
+        ROOT.xAOD.ElectronAuxContainer()
+        ROOT.xAOD.CaloClusterAuxContainer()
+               
         return StatusCode.Success
         
 
diff --git a/PhysicsAnalysis/D3PDMaker/D3PDMakerConfig/share/AODToEgammaD3PD.py b/PhysicsAnalysis/D3PDMaker/D3PDMakerConfig/share/AODToEgammaD3PD.py
index dfa8e02ffd39..f573679f8666 100644
--- a/PhysicsAnalysis/D3PDMaker/D3PDMakerConfig/share/AODToEgammaD3PD.py
+++ b/PhysicsAnalysis/D3PDMaker/D3PDMakerConfig/share/AODToEgammaD3PD.py
@@ -57,6 +57,9 @@ muonRecFlags.doMSVertex.set_Value_and_Lock( False )
 
 #from xAODJetCnv import ParticleJetCompatibility
 
+
+include( "RecExCommon/RecExCommon_topOptions.py" )
+
 # Block loading conditions folders we won't need.
 blocked_folders = [
     '/CALO/Identifier/CaloTTOnAttrIdMapAtlas',
@@ -80,5 +83,3 @@ for f in blocked_folders:
     conddb.blockFolder (f)
 
 
-include( "RecExCommon/RecExCommon_topOptions.py" )
-
-- 
GitLab


From 71641de68d7a12339a7837ed3a011b92528ab005 Mon Sep 17 00:00:00 2001
From: MatousVozak <matous.vozak@cern.ch>
Date: Tue, 22 Dec 2020 07:59:35 +0100
Subject: [PATCH 217/225] adding getter for propagator

---
 Trigger/TrigTools/TrigInDetConfig/python/InDetTrigCommon.py | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/Trigger/TrigTools/TrigInDetConfig/python/InDetTrigCommon.py b/Trigger/TrigTools/TrigInDetConfig/python/InDetTrigCommon.py
index f4ae49837955..4f4fe1ffa3c7 100644
--- a/Trigger/TrigTools/TrigInDetConfig/python/InDetTrigCommon.py
+++ b/Trigger/TrigTools/TrigInDetConfig/python/InDetTrigCommon.py
@@ -48,6 +48,10 @@ def trackSummaryTool_getter( doTRT ):
    else:
       return InDetTrigTrackSummaryTool
 
+def trigPropagator_getter():
+   from InDetTrigRecExample.InDetTrigConfigRecLoadTools import InDetTrigPropagator
+   return InDetTrigPropagator
+
 #--------------------------------------------------------------------------------------
 
 
-- 
GitLab


From 35a424beb7dba41eb5163356d87bfe9c44bb7ea0 Mon Sep 17 00:00:00 2001
From: MatousVozak <matous.vozak@cern.ch>
Date: Tue, 22 Dec 2020 08:18:47 +0100
Subject: [PATCH 218/225] Adapting naming from MR39144

---
 .../TrigInDetConfig/python/InDetPT.py         | 41 ++++++++-----------
 1 file changed, 18 insertions(+), 23 deletions(-)

diff --git a/Trigger/TrigTools/TrigInDetConfig/python/InDetPT.py b/Trigger/TrigTools/TrigInDetConfig/python/InDetPT.py
index 89c583c4d709..8be9a444754c 100644
--- a/Trigger/TrigTools/TrigInDetConfig/python/InDetPT.py
+++ b/Trigger/TrigTools/TrigInDetConfig/python/InDetPT.py
@@ -27,29 +27,24 @@ def makeInDetPrecisionTracking( config = None,
 
   #-----------------------------------------------------------------------------
   #                        Naming conventions
+  doTRT = config.PT.setting.doTRT
 
   algNamePrefix = "InDetTrigMT" 
   #Add suffix to the algorithms
   signature =  "_{}".format( config.name )
-  
-  #Name settings for output Tracks/TrackParticles
-  #This first part is for ambiguity solver tracks
-  nameAmbiTrackCollection = config.PT.trkTracksAS() 
-  
-  #Tracks from TRT extension
-  nameExtTrackCollection = config.PT.trkTracksTE() 
 
-  outPTTracks             = config.PT.trkTracksPT()
-  outPTTrackParticles     = config.PT.tracksPT( doRecord = config.isRecordable )
+
+  #Name settings for output Tracks/TrackParticles
+  outTrkTracks        = config.PT.trkTracksPT() #Final output Track collection
+  outTrackParticles   = config.PT.tracksPT( doRecord = config.isRecordable ) #Final output xAOD::TrackParticle collection
+  ambiTrackCollection = config.PT.trkTracksAS()  #Ambiguity solver tracks
 
   #Atm there are mainly two output track collections one from ambiguity solver stage and one from trt,
   #we want to have the output name of the track collection the same whether TRT was run or not,
   #Therefore, we have to adapt output names of the algorithm which produces last collection
   #However, this condition should be handled internally in configuration of the algs once TRT is configured with builders as well
-  if config.PT.setting.doTRT:
-     nameExtTrackCollection = outPTTracks
-  else:
-     nameAmbiTrackCollection = outPTTracks
+  if not doTRT:
+     ambiTrackCollection = outTrkTracks
 
   #-----------------------------------------------------------------------------
   #                        Verifying input data for the algorithms
@@ -77,7 +72,7 @@ def makeInDetPrecisionTracking( config = None,
   
   #Obsolete, will be eventually replaced
   #Note: keep Parameter_config!
-  if config.PT.setting.doTRT:
+  if doTRT:
       if "electron" in config.name  or "tau" in config.name:
          trigTrackSummaryTool.TRT_ElectronPidTool = InDetTrigTRT_ElectronPidTool
 
@@ -102,7 +97,7 @@ def makeInDetPrecisionTracking( config = None,
                            ambiguitySolverAlg_builder( name                  = get_full_name( core = 'TrkAmbiguitySolver', suffix = config.name ),
                                                        config                = config,
                                                        inputTrackScoreMap    = get_scoremap_name( config.name ), #Map of tracks and their scores, 
-                                                       outputTrackCollection = nameAmbiTrackCollection  )
+                                                       outputTrackCollection = ambiTrackCollection  )
                         ]
    
 
@@ -111,7 +106,7 @@ def makeInDetPrecisionTracking( config = None,
 
   from InDetTrigRecExample.InDetTrigConfigRecLoadTools import  InDetTrigExtrapolator
   #TODO:implement builders and getters for TRT (WIP)
-  if config.PT.setting.doTRT:
+  if doTRT:
 
             #-----------------------------------------------------------------------------
             #                        TRT data preparation
@@ -234,7 +229,7 @@ def makeInDetPrecisionTracking( config = None,
  
             from TRT_TrackExtensionAlg.TRT_TrackExtensionAlgConf import InDet__TRT_TrackExtensionAlg
             InDetTrigTRTextensionAlg = InDet__TRT_TrackExtensionAlg( name = "%sTrackExtensionAlg%s"%(algNamePrefix, signature),
-                                                            InputTracksLocation    = nameAmbiTrackCollection,
+                                                            InputTracksLocation    = ambiTrackCollection,
                                                             TrackExtensionTool     = InDetTrigTRTExtensionTool,
                                                             ExtendedTracksLocation = 'ExtendedTrackMap'
                                                              )
@@ -271,10 +266,10 @@ def makeInDetPrecisionTracking( config = None,
             from InDetTrigRecExample.InDetTrigConfigRecLoadTools import InDetTrigTrackFitter
             from InDetExtensionProcessor.InDetExtensionProcessorConf import InDet__InDetExtensionProcessor   
             InDetTrigExtensionProcessor = InDet__InDetExtensionProcessor (name               = "%sExtensionProcessor%s"%(algNamePrefix, signature),
-                                                                          TrackName          = nameAmbiTrackCollection,
+                                                                          TrackName          = ambiTrackCollection,
                                                                           #Cosmics           = InDetFlags.doCosmics(),
                                                                           ExtensionMap       = 'ExtendedTrackMap',
-                                                                          NewTrackName       = nameExtTrackCollection,
+                                                                          NewTrackName       = outTrkTracks,
                                                                           TrackFitter        = InDetTrigTrackFitter,
                                                                           TrackSummaryTool   = SummaryTool_config,
                                                                           ScoringTool        = InDetTrigExtScoringTool, #TODO do I provide the same tool as for ambiguity solver?
@@ -296,8 +291,8 @@ def makeInDetPrecisionTracking( config = None,
   from .InDetTrigCommon import trackParticleCnv_builder
   trackParticleCnvAlg = trackParticleCnv_builder(name                 = get_full_name( 'xAODParticleCreatorAlg',config.name + '_IDTrig' ), #IDTrig suffix signifies that this is for precision tracking
                                                  config               = config,
-                                                 inTrackCollectionKey = outPTTracks,
-                                                 outTrackParticlesKey = outPTTrackParticles,
+                                                 inTrackCollectionKey = outTrkTracks,
+                                                 outTrackParticlesKey = outTrackParticles,
                                                  )
   log.debug(trackParticleCnvAlg)
   ptAlgs.append(trackParticleCnvAlg)
@@ -308,8 +303,8 @@ def makeInDetPrecisionTracking( config = None,
   
   #Potentialy other algs with more collections? 
   #Might Drop the list in the end and keep just one output key
-  nameTrackCollections =[ outPTTracks ]
-  nameTrackParticles =  [ outPTTrackParticles ]
+  nameTrackCollections =[ outTrkTracks ]
+  nameTrackParticles =  [ outTrackParticles ]
 
   
   #Return list of Track keys, TrackParticle keys, and PT algs
-- 
GitLab


From 64d438ffe57af9858a34b213f72c0facdb8d0d96 Mon Sep 17 00:00:00 2001
From: Andrii Verbytskyi <andrii.verbytskyi@cern.ch>
Date: Tue, 22 Dec 2020 08:56:36 +0000
Subject: [PATCH 219/225] Hepmc3 nightly fixes 18122020 part 1

---
 .../InDetOverlay/test/TRTOverlay_test.cxx     | 20 +++++++++----------
 .../src/D2PDTruthParticleSelector.cxx         | 20 +++++++------------
 .../G4AtlasTests/src/TruthTestTool.cxx        |  6 +++---
 3 files changed, 20 insertions(+), 26 deletions(-)

diff --git a/InnerDetector/InDetRawAlgs/InDetOverlay/test/TRTOverlay_test.cxx b/InnerDetector/InDetRawAlgs/InDetOverlay/test/TRTOverlay_test.cxx
index a21c8c8b41db..c458c6acb97a 100644
--- a/InnerDetector/InDetRawAlgs/InDetOverlay/test/TRTOverlay_test.cxx
+++ b/InnerDetector/InDetRawAlgs/InDetOverlay/test/TRTOverlay_test.cxx
@@ -277,7 +277,7 @@ namespace OverlayTesting {
       return digit;
     }
 
-    bool initMcEventCollection(std::vector<HepMC::GenParticle*>& genPartList)
+    bool initMcEventCollection(std::vector<HepMC::GenParticlePtr>& genPartList)
     {
       // create dummy input McEventCollection with a name that
       // HepMcParticleLink knows about
@@ -286,7 +286,7 @@ namespace OverlayTesting {
       // Add a dummy GenEvent
       const int process_id1(20);
       const int event_number1(17);
-      inputTestDataHandle->push_back(new HepMC::GenEvent(process_id1, event_number1));
+      inputTestDataHandle->push_back(HepMC::newGenEvent(process_id1, event_number1));
       HepMC::GenEvent& ge1 = *(inputTestDataHandle->at(0));
       populateGenEvent(ge1,-11,11,genPartList);
       populateGenEvent(ge1,-13,13,genPartList);
@@ -297,26 +297,26 @@ namespace OverlayTesting {
       return true;
     }
 
-    void populateGenEvent(HepMC::GenEvent & ge, int pdgid1, int pdgid2, std::vector<HepMC::GenParticle*>& genPartList)
+    void populateGenEvent(HepMC::GenEvent & ge, int pdgid1, int pdgid2, std::vector<HepMC::GenParticlePtr>& genPartList)
     {
-      CLHEP::HepLorentzVector myPos( 0.0, 0.0, 0.0, 0.0);
-      HepMC::GenVertex *myVertex = new HepMC::GenVertex( myPos, -1 );
+      HepMC::FourVector myPos( 0.0, 0.0, 0.0, 0.0);
+      HepMC::GenVertexPtr myVertex = HepMC::newGenVertexPtr( myPos, -1 );
       HepMC::FourVector fourMomentum1( 0.0, 0.0, 1.0, 1.0*CLHEP::TeV);
-      HepMC::GenParticle* inParticle1 = new HepMC::GenParticle(fourMomentum1, pdgid1, 2);
+      HepMC::GenParticlePtr inParticle1 = HepMC::newGenParticlePtr(fourMomentum1, pdgid1, 2);
       myVertex->add_particle_in(inParticle1);
       HepMC::FourVector fourMomentum2( 0.0, 0.0, -1.0, 1.0*CLHEP::TeV);
-      HepMC::GenParticle* inParticle2 = new HepMC::GenParticle(fourMomentum2, pdgid2, 2);
+      HepMC::GenParticlePtr inParticle2 = HepMC::newGenParticlePtr(fourMomentum2, pdgid2, 2);
       myVertex->add_particle_in(inParticle2);
       HepMC::FourVector fourMomentum3( 0.0, 1.0, 0.0, 1.0*CLHEP::TeV);
-      HepMC::GenParticle* inParticle3 = new HepMC::GenParticle(fourMomentum3, pdgid1, 1);
+      HepMC::GenParticlePtr inParticle3 = HepMC::newGenParticlePtr(fourMomentum3, pdgid1, 1);
       myVertex->add_particle_out(inParticle3);
       genPartList.push_back(inParticle3);
       HepMC::FourVector fourMomentum4( 0.0, -1.0, 0.0, 1.0*CLHEP::TeV);
-      HepMC::GenParticle* inParticle4 = new HepMC::GenParticle(fourMomentum4, pdgid2, 1);
+      HepMC::GenParticlePtr inParticle4 = HepMC::newGenParticlePtr(fourMomentum4, pdgid2, 1);
       myVertex->add_particle_out(inParticle4);
       genPartList.push_back(inParticle4);
       ge.add_vertex( myVertex );
-      ge.set_signal_process_vertex( myVertex );
+      HepMC::set_signal_process_vertex( &ge, myVertex );
       ge.set_beam_particles(inParticle1,inParticle2);
     }
 
diff --git a/PhysicsAnalysis/D2PDMaker/src/D2PDTruthParticleSelector.cxx b/PhysicsAnalysis/D2PDMaker/src/D2PDTruthParticleSelector.cxx
index e9649d217765..1e655dc0d917 100644
--- a/PhysicsAnalysis/D2PDMaker/src/D2PDTruthParticleSelector.cxx
+++ b/PhysicsAnalysis/D2PDMaker/src/D2PDTruthParticleSelector.cxx
@@ -297,14 +297,11 @@ StatusCode D2PDTruthParticleSelector::processObject( const TruthParticle* part,
           if( genPart->end_vertex() )
             {
               int barcode = HepMC::barcode(genPart);
-              auto childItrBegin =    genPart->end_vertex()->particles_begin(HepMC::children);
-              auto childItrEnd = genPart->end_vertex()->particles_end(HepMC::children);
-              for (auto childItr=childItrBegin; childItr!=childItrEnd; ++childItr )
+              for (auto child: *(genPart->end_vertex()))
                 {
-                  auto child = (*childItr);
                   if( child->pdg_id() == pdgID
-                      && child->barcode() != barcode
-                      && child->barcode() < 200000 )
+                      && HepMC::barcode(child) != barcode
+                      && HepMC::barcode(child) < 200000 )
                     {
                       isPassed = false;
                     }
@@ -605,17 +602,14 @@ bool D2PDTruthParticleSelector::getDaughters( HepMC::ConstGenParticlePtr genPart
   if( genPart->end_vertex() )
     {
       int pdgID   = genPart->pdg_id();
-      int barcode = genPart->barcode();
+      int barcode = HepMC::barcode(genPart);
 
       // Loop over all children
-      auto childItrBegin = genPart->end_vertex()->particles_begin(HepMC::children);
-      auto  childItrEnd = genPart->end_vertex()->particles_end(HepMC::children);
-      for (auto childItr=childItrBegin; childItr != childItrEnd; ++childItr )
+      for (auto child: *(genPart->end_vertex()))
         {
-          auto child = (*childItr);
           if( child->pdg_id() == pdgID
-              && child->barcode() != barcode
-              && child->barcode() < 200000 )
+              && HepMC::barcode(child) != barcode
+              && HepMC::barcode(child) < 200000 )
             {
               return getDaughters( child, daughters );
             }
diff --git a/Simulation/G4Atlas/G4AtlasTests/src/TruthTestTool.cxx b/Simulation/G4Atlas/G4AtlasTests/src/TruthTestTool.cxx
index a5dac7b791ca..454f5bf9adb2 100644
--- a/Simulation/G4Atlas/G4AtlasTests/src/TruthTestTool.cxx
+++ b/Simulation/G4Atlas/G4AtlasTests/src/TruthTestTool.cxx
@@ -224,7 +224,6 @@ StatusCode TruthTestTool::processEvent()
       }
 
       int npart_prim=0, npart_sec=0;
-      HepMC::GenEvent::particle_const_iterator currentGenParticleIter;
       for (auto currentGenParticle: *(*currentGenEventIter)) {
 
         const HepMC::FourVector mom = currentGenParticle->momentum();
@@ -284,8 +283,9 @@ StatusCode TruthTestTool::processEvent()
         m_particle_type->Fill( particleType );
 
         if ( HepMC::barcode(currentGenParticle)<200000 ) {
-          m_p_gen->Fill( mom.rho() );
-          m_log_p_gen->Fill( log(mom.rho()) );
+          double momentum=std::sqrt(mom.x()*mom.x()+mom.y()*mom.y()+mom.z()*mom.z());
+          m_p_gen->Fill( momentum );
+          m_log_p_gen->Fill( std::log(momentum) );
           m_eta_gen->Fill( mom.eta() );
           m_phi_gen->Fill( mom.phi() );
           ++npart_prim;
-- 
GitLab


From c423ce08c9a541668ed71bd0be0f78fdfbe54ef9 Mon Sep 17 00:00:00 2001
From: Andrii Verbytskyi <andrii.verbytskyi@cern.ch>
Date: Tue, 22 Dec 2020 10:18:16 +0000
Subject: [PATCH 220/225] Hepmc3 nightly fixes 20122020 part 1 tracking

---
 .../TrkToolInterfaces/ITruthToTrack.h         |  4 +-
 .../ITruthTrajectoryBuilder.h                 |  6 +-
 .../src/DecayInFlyTruthTrajectoryBuilder.cxx  | 34 ++++-----
 .../src/DetailedTrackTruthBuilder.cxx         |  8 +-
 .../IPRD_TruthTrajectoryBuilder.h             |  2 +-
 .../PRD_TruthTrajectory.h                     |  4 +-
 .../src/PRD_TruthTrajectoryBuilder.cxx        | 10 +--
 .../src/PRD_TruthTrajectoryBuilder.h          |  4 +-
 .../src/TruthTrackBuilder.cxx                 |  2 +-
 .../TrkValAlgs/TrackValidationNtupleWriter.h  |  2 +-
 .../src/RecMomentumQualityValidation.cxx      |  2 +-
 .../src/TrackValidationNtupleWriter.cxx       | 10 +--
 .../TrkValInterfaces/IGenParticleJetFinder.h  |  2 +-
 .../TrkValInterfaces/IGenParticleSelector.h   |  2 +-
 .../TrkValInterfaces/ITrackTruthClassifier.h  |  4 +-
 .../TrkValTools/PrimaryTruthClassifier.h      |  5 +-
 .../src/PrimaryTruthClassifier.cxx            | 19 +++--
 .../src/TrkPriVxPurityTool.cxx                | 73 ++++++++++++-------
 18 files changed, 103 insertions(+), 90 deletions(-)

diff --git a/Tracking/TrkTools/TrkToolInterfaces/TrkToolInterfaces/ITruthToTrack.h b/Tracking/TrkTools/TrkToolInterfaces/TrkToolInterfaces/ITruthToTrack.h
index ff2438d11c26..2e0801ba13a2 100644
--- a/Tracking/TrkTools/TrkToolInterfaces/TrkToolInterfaces/ITruthToTrack.h
+++ b/Tracking/TrkTools/TrkToolInterfaces/TrkToolInterfaces/ITruthToTrack.h
@@ -51,7 +51,7 @@ namespace Trk {
      *  object. (Wrapping it into a smart pointer may be the most
      *  convenient way to make sure the memory is freed.)
      */
-    virtual const Trk::TrackParameters* makeProdVertexParameters(const HepMC::GenParticle* part) const = 0;
+    virtual const Trk::TrackParameters* makeProdVertexParameters(HepMC::ConstGenParticlePtr part) const = 0;
     virtual const Trk::TrackParameters* makeProdVertexParameters(const xAOD::TruthParticle* part) const = 0;
 
     /** This function extrapolates track to the perigee, and returns
@@ -61,7 +61,7 @@ namespace Trk {
      * operator new.  The caller is responsible for deletion of the
      * object.
      */
-    virtual const Trk::TrackParameters* makePerigeeParameters(const HepMC::GenParticle* part) const = 0;
+    virtual const Trk::TrackParameters* makePerigeeParameters(HepMC::ConstGenParticlePtr part) const = 0;
     virtual const Trk::TrackParameters* makePerigeeParameters(const xAOD::TruthParticle* part) const = 0;
 
   };
diff --git a/Tracking/TrkTools/TrkToolInterfaces/TrkToolInterfaces/ITruthTrajectoryBuilder.h b/Tracking/TrkTools/TrkToolInterfaces/TrkToolInterfaces/ITruthTrajectoryBuilder.h
index 61e708ffe730..b67b81d0c43d 100644
--- a/Tracking/TrkTools/TrkToolInterfaces/TrkToolInterfaces/ITruthTrajectoryBuilder.h
+++ b/Tracking/TrkTools/TrkToolInterfaces/TrkToolInterfaces/ITruthTrajectoryBuilder.h
@@ -29,13 +29,13 @@ namespace Trk {
     /** Build a TruthTrajectory this particle belongs to.  
      *  The result may be an empty TruthTrajectory (in case input did not pass the cuts).
      */
-    virtual void buildTruthTrajectory(TruthTrajectory *result, const HepMC::GenParticle *input) const = 0;
+    virtual void buildTruthTrajectory(TruthTrajectory *result, HepMC::ConstGenParticlePtr input) const = 0;
 
     /** Previous particle on the truth trajectory or 0 */
-    virtual const HepMC::GenParticle *getMother(const HepMC::GenParticle *part) const = 0;
+    virtual HepMC::ConstGenParticlePtr getMother(HepMC::ConstGenParticlePtr part) const = 0;
 
     /** Next particle on the truth trajectory or 0 */
-    virtual const HepMC::GenParticle *getDaughter(const HepMC::GenParticle *part) const = 0;
+    virtual HepMC::ConstGenParticlePtr getDaughter(HepMC::ConstGenParticlePtr part) const = 0;
   };
   
 } // namespace Trk
diff --git a/Tracking/TrkTools/TrkTruthCreatorTools/src/DecayInFlyTruthTrajectoryBuilder.cxx b/Tracking/TrkTools/TrkTruthCreatorTools/src/DecayInFlyTruthTrajectoryBuilder.cxx
index 9e25de02879f..6752fe0d1b6a 100644
--- a/Tracking/TrkTools/TrkTruthCreatorTools/src/DecayInFlyTruthTrajectoryBuilder.cxx
+++ b/Tracking/TrkTools/TrkTruthCreatorTools/src/DecayInFlyTruthTrajectoryBuilder.cxx
@@ -71,34 +71,32 @@ buildTruthTrajectory(TruthTrajectory *result, HepMC::ConstGenParticlePtr input)
 DecayInFlyTruthTrajectoryBuilder::MotherDaughter
 DecayInFlyTruthTrajectoryBuilder::truthTrajectoryCuts(HepMC::ConstGenVertexPtr vtx) const
 {
-  HepMC::GenParticlePtr mother{nullptr};
-  HepMC::GenParticlePtr daughter{nullptr};
-  // only truth vertices with 1 incoming particle
+  HepMC::ConstGenParticlePtr mother{nullptr};
+  HepMC::ConstGenParticlePtr daughter{nullptr};
+     // only truth vertices with 1 incoming particle     
+      // Restrict to quasi-elastic processes (e.g. brems, delta-rays, pi->pi+Delta).
+      // 
+      // Require not more than 2 outgoing particles. Note that
+      // delta-rays for primary==electron is a special case, because we have two
+      // outgoing particles with the same PDG id.  The "correct" one
+      // is that with the higher energy (NOT pt).
+      // 
+      // allow 1 outgoing to cover possible vertexes from interaction in detector material
 #ifdef HEPMC3
-  if(vtx && (vtx->particles_in().size() == 1)) {
+  if(vtx && (vtx->particles_in().size() == 1) && (vtx->particles_out().size() <= 2)  ) {
 
     mother = vtx->particles_in().front();
 #else 
-  if(vtx && (vtx->particles_in_size() == 1)) {
+  if(vtx && (vtx->particles_in_size() == 1) && (vtx->particles_out_size() <= 2) ) {
 
     mother = *vtx->particles_in_const_begin();
 #endif    
     // Allow status code 1 and 2.  E.g. a pion that produced a long track can decay  outside of InDet and have status==2.
     if( mother && (mother->status() < 3) ) {
-    
-      // Restrict to quasi-elastic processes (e.g. brems, delta-rays, pi->pi+Delta).
-      // 
-      // Require not more than 2 outgoing particles. Note that
-      // delta-rays for primary==electron is a special case, because we have two
-      // outgoing particles with the same PDG id.  The "correct" one
-      // is that with the higher energy (NOT pt).
-      // 
-      // allow 1 outgoing to cover possible vertexes from interaction in detector material
-      if (vtx->particles_out_size() <= 2) {
 
 	int num_passed_cuts = 0;
-	HepMC::GenParticlePtr passed_cuts{nullptr};
-	for(HepMC::GenParticlePtr candidate: *vtx){
+	HepMC::ConstGenParticlePtr passed_cuts{nullptr};
+	for(HepMC::ConstGenParticlePtr candidate: *vtx){
 	  if(candidate->pdg_id() == mother->pdg_id()) {
 
 	    if(passed_cuts && (mother->pdg_id() == 11)) { // second negative electron is a special case
@@ -121,8 +119,6 @@ DecayInFlyTruthTrajectoryBuilder::truthTrajectoryCuts(HepMC::ConstGenVertexPtr v
 	if(num_passed_cuts==1) { // disallow hadronic pi->N*pi etc.
 	  daughter = passed_cuts;
 	}
-
-      } // if (vtx->particles_out_size() <= 2)
     } // if( mother && (mother->status() == 1) )
   }
   
diff --git a/Tracking/TrkTools/TrkTruthCreatorTools/src/DetailedTrackTruthBuilder.cxx b/Tracking/TrkTools/TrkTruthCreatorTools/src/DetailedTrackTruthBuilder.cxx
index e560005102d3..04e2724ff88c 100755
--- a/Tracking/TrkTools/TrkTruthCreatorTools/src/DetailedTrackTruthBuilder.cxx
+++ b/Tracking/TrkTools/TrkTruthCreatorTools/src/DetailedTrackTruthBuilder.cxx
@@ -165,7 +165,7 @@ buildDetailedTrackTruth(DetailedTrackTruthCollection *output,
       const TruthTrajectory& t = i->second.trajectory();
       msg(MSG::VERBOSE)<<"Particles on the trajectory:\n";
       for(unsigned k=0; k<t.size(); ++k) {
-	msg(MSG::VERBOSE)<<*t[k]<<"\n";
+	msg(MSG::VERBOSE)<<t[k]<<"\n";
       }
       msg(MSG::VERBOSE)<<"\n"<<endmsg;
     }
@@ -353,12 +353,12 @@ void DetailedTrackTruthBuilder::addTrack(DetailedTrackTruthCollection *output,
   while(!seeds.empty()) {
     HepMcParticleLink link = *seeds.begin();
     Sprout current_sprout;
-    std::queue<const HepMC::GenParticle*> tmp;
+    std::queue<HepMC::ConstGenParticlePtr> tmp;
     ExtendedEventIndex eventIndex(link, proxy);
     const HepMC::GenParticle *current = link.cptr();
 
     do {
-      HepMcParticleLink curlink( eventIndex.makeLink(current->barcode(), proxy));
+      HepMcParticleLink curlink( eventIndex.makeLink(HepMC::barcode(current), proxy));
 
       // remove the current particle from the list of particles to consider (if it is still there)
       seeds.erase(curlink);
@@ -410,7 +410,7 @@ void DetailedTrackTruthBuilder::addTrack(DetailedTrackTruthCollection *output,
     // This may add only hits that are *not* on the current track.
     // Thus no need to update stats track and stats common.
 
-    const HepMC::GenParticle* current = *s->second.begin();
+    auto current = *s->second.begin();
     while( (current = m_truthTrajBuilder->getDaughter(current)) ) {
       s->second.push_front(current);
     }
diff --git a/Tracking/TrkTruthTracks/TrkTruthTrackInterfaces/TrkTruthTrackInterfaces/IPRD_TruthTrajectoryBuilder.h b/Tracking/TrkTruthTracks/TrkTruthTrackInterfaces/TrkTruthTrackInterfaces/IPRD_TruthTrajectoryBuilder.h
index 309d14623515..58365fe22133 100644
--- a/Tracking/TrkTruthTracks/TrkTruthTrackInterfaces/TrkTruthTrackInterfaces/IPRD_TruthTrajectoryBuilder.h
+++ b/Tracking/TrkTruthTracks/TrkTruthTrackInterfaces/TrkTruthTrackInterfaces/IPRD_TruthTrajectoryBuilder.h
@@ -38,7 +38,7 @@ namespace Trk {
        static const InterfaceID& interfaceID() { return IID_IPRD_TruthTrajectoryBuilder; }
 
        /** return a vector of PrepRawData trajectories - uses internal cache**/
-       virtual const std::map< const HepMC::GenParticle*, PRD_TruthTrajectory >& truthTrajectories() const = 0;
+       virtual const std::map< HepMC::ConstGenParticlePtr, PRD_TruthTrajectory >& truthTrajectories() const = 0;
        
        /** Event refresh - can't be an IIncident, because it has to run after PRD creation and PRD truth creation */
        virtual StatusCode refreshEvent() = 0;       
diff --git a/Tracking/TrkTruthTracks/TrkTruthTrackInterfaces/TrkTruthTrackInterfaces/PRD_TruthTrajectory.h b/Tracking/TrkTruthTracks/TrkTruthTrackInterfaces/TrkTruthTrackInterfaces/PRD_TruthTrajectory.h
index 21ff251f2e43..2d3a9df02060 100644
--- a/Tracking/TrkTruthTracks/TrkTruthTrackInterfaces/TrkTruthTrackInterfaces/PRD_TruthTrajectory.h
+++ b/Tracking/TrkTruthTracks/TrkTruthTrackInterfaces/TrkTruthTrackInterfaces/PRD_TruthTrajectory.h
@@ -28,7 +28,7 @@ namespace Trk {
       
      /**  public members */ 
      std::vector<const Trk::PrepRawData* > prds;
-     const HepMC::GenParticle*             genParticle;
+     HepMC::ConstGenParticlePtr             genParticle;
      size_t                                nDoF;
 
      /** defualt constructor */
@@ -39,7 +39,7 @@ namespace Trk {
      
      /** fast constructor */
      PRD_TruthTrajectory( const std::vector<const Trk::PrepRawData* >& prdVec,
-                          const HepMC::GenParticle* gP    = 0,
+                          HepMC::ConstGenParticlePtr gP    = nullptr,
                           size_t numberOfDegreesOfFreedom = 0) :
       prds(prdVec),
       genParticle(gP),
diff --git a/Tracking/TrkTruthTracks/TrkTruthTrackTools/src/PRD_TruthTrajectoryBuilder.cxx b/Tracking/TrkTruthTracks/TrkTruthTrackTools/src/PRD_TruthTrajectoryBuilder.cxx
index 7b60f9c4c5d8..628c472caefa 100644
--- a/Tracking/TrkTruthTracks/TrkTruthTrackTools/src/PRD_TruthTrajectoryBuilder.cxx
+++ b/Tracking/TrkTruthTracks/TrkTruthTrackTools/src/PRD_TruthTrajectoryBuilder.cxx
@@ -97,7 +97,7 @@ StatusCode Trk::PRD_TruthTrajectoryBuilder::refreshEvent()  {
    
 }
 
-const std::map< const HepMC::GenParticle*, Trk::PRD_TruthTrajectory >& Trk::PRD_TruthTrajectoryBuilder::truthTrajectories() const {
+const std::map<HepMC::ConstGenParticlePtr, Trk::PRD_TruthTrajectory >& Trk::PRD_TruthTrajectoryBuilder::truthTrajectories() const {
     // ndof
     size_t ndofTotal = 0;
     size_t ndof      = 0;
@@ -111,7 +111,7 @@ const std::map< const HepMC::GenParticle*, Trk::PRD_TruthTrajectory >& Trk::PRD_
         PRD_MultiTruthCollection::const_iterator prdMtCIterE = (*pmtCollIter)->end();
         for ( ; prdMtCIter != prdMtCIterE; ++ prdMtCIter ){
             // check if entry exists and if   
-            const HepMC::GenParticle* curGenP       = (*prdMtCIter).second;
+            auto curGenP       = (*prdMtCIter).second;
             Identifier                curIdentifier = (*prdMtCIter).first;
             // apply the min pT cut 
             if ( curGenP->momentum().perp() < m_minPt ) continue;
@@ -123,7 +123,7 @@ const std::map< const HepMC::GenParticle*, Trk::PRD_TruthTrajectory >& Trk::PRD_
             // stuff it into the trajectory if you found a PRD
             if (prd){
                 // try to find the entry for this GenParticle 
-                std::map< const HepMC::GenParticle*, PRD_TruthTrajectory >::iterator prdTrajIter = m_gpPrdTruthTrajectories.find(curGenP);
+                auto prdTrajIter = m_gpPrdTruthTrajectories.find(curGenP);
                 if ( prdTrajIter ==  m_gpPrdTruthTrajectories.end() ){
                     // first PRD associated to this: create PRD_TruthTrajectory object
                     Trk::PRD_TruthTrajectory newPrdTruthTrajectory;
@@ -147,8 +147,8 @@ const std::map< const HepMC::GenParticle*, Trk::PRD_TruthTrajectory >& Trk::PRD_
     }
     // PART 2 --------------------------------------------------------------------------------------------------------
     // loop through the provided list of manipulators ( sorter is included )
-    std::map< const HepMC::GenParticle*, PRD_TruthTrajectory >::iterator prdTruthTrajIter  = m_gpPrdTruthTrajectories.begin();
-    std::map< const HepMC::GenParticle*, PRD_TruthTrajectory >::iterator prdTruthTrajIterE = m_gpPrdTruthTrajectories.end();
+    auto prdTruthTrajIter  = m_gpPrdTruthTrajectories.begin();
+    auto prdTruthTrajIterE = m_gpPrdTruthTrajectories.end();
     for ( ; prdTruthTrajIter != prdTruthTrajIterE; ++prdTruthTrajIter ){
     //std::cout << "sorting, barcode: " << prdTruthTrajIter->first->barcode() << std::endl;
         if ( m_prdTruthTrajectoryManipulators.size() ){
diff --git a/Tracking/TrkTruthTracks/TrkTruthTrackTools/src/PRD_TruthTrajectoryBuilder.h b/Tracking/TrkTruthTracks/TrkTruthTrackTools/src/PRD_TruthTrajectoryBuilder.h
index 3199d6c9ed38..6112ea9f8370 100644
--- a/Tracking/TrkTruthTracks/TrkTruthTrackTools/src/PRD_TruthTrajectoryBuilder.h
+++ b/Tracking/TrkTruthTracks/TrkTruthTrackTools/src/PRD_TruthTrajectoryBuilder.h
@@ -53,7 +53,7 @@ namespace Trk {
        StatusCode  finalize();
 
        /** return a vector of PrepRawData trajectories - uses internal cache**/
-       const std::map< const HepMC::GenParticle*, PRD_TruthTrajectory >& truthTrajectories() const;
+       const std::map< HepMC::ConstGenParticlePtr, PRD_TruthTrajectory >& truthTrajectories() const;
 
        /** Event refresh - can't be an IIncident, because it has to run after PRD creation and PRD truth creation */
        StatusCode refreshEvent();
@@ -71,7 +71,7 @@ namespace Trk {
         
 	Gaudi::Property<double>                             m_minPt {this,"MinimumPt",400.,"minimum pT to be even considered"};
 	Gaudi::Property<bool>                               m_geantinos {this,"Geantinos",false,"Track geantinos or not"};
-        mutable std::map< const HepMC::GenParticle*, PRD_TruthTrajectory > m_gpPrdTruthTrajectories; //!< the cache for the return (cleared by Incident)
+        mutable std::map< HepMC::ConstGenParticlePtr, PRD_TruthTrajectory > m_gpPrdTruthTrajectories; //!< the cache for the return (cleared by Incident)
         
   };
 
diff --git a/Tracking/TrkTruthTracks/TrkTruthTrackTools/src/TruthTrackBuilder.cxx b/Tracking/TrkTruthTracks/TrkTruthTrackTools/src/TruthTrackBuilder.cxx
index 1940d483abe3..bda9841b728f 100644
--- a/Tracking/TrkTruthTracks/TrkTruthTrackTools/src/TruthTrackBuilder.cxx
+++ b/Tracking/TrkTruthTracks/TrkTruthTrackTools/src/TruthTrackBuilder.cxx
@@ -130,7 +130,7 @@ Trk::Track* Trk::TruthTrackBuilder::createTrack(const PRD_TruthTrajectory& prdTr
     ATH_MSG_VERBOSE("The PRD Truth trajectory contains " << prdTraj.prds.size() << " PRDs.");
 
     // get the associated GenParticle
-    const HepMC::GenParticle* genPart = prdTraj.genParticle;
+    auto genPart = prdTraj.genParticle;
     if (!genPart) {
         ATH_MSG_WARNING("No GenParticle associated to this PRD_TruthTrajectory. Ignoring track creation.");
         return 0;
diff --git a/Tracking/TrkValidation/TrkValAlgs/TrkValAlgs/TrackValidationNtupleWriter.h b/Tracking/TrkValidation/TrkValAlgs/TrkValAlgs/TrackValidationNtupleWriter.h
index b5fe26995e4d..98e06ad91b6e 100644
--- a/Tracking/TrkValidation/TrkValAlgs/TrkValAlgs/TrackValidationNtupleWriter.h
+++ b/Tracking/TrkValidation/TrkValAlgs/TrkValAlgs/TrackValidationNtupleWriter.h
@@ -96,7 +96,7 @@ protected:
   bool                      m_doTruth;                     //!< Switch to turn on / off truth
   bool                      m_doTrackParticle;             //!  Switch to turn on/pff recording track particle trees into Ntuple 
 
-  const HepMC::GenParticle* m_visibleParticleWithoutTruth; //!< cludge to treat G4's "fake fakes"
+  HepMC::GenParticlePtr m_visibleParticleWithoutTruth; //!< cludge to treat G4's "fake fakes"
   std::vector<unsigned int>           m_nTrackTreeRecords;
   std::vector<TTree*>       m_trees;                 //!< Pointer to the NTuple trees (one for each input track collection)
   TTree*                    m_eventLinkTree;         //!< pointer to event-wise ntuple trees (one for all input track collections + truth)
diff --git a/Tracking/TrkValidation/TrkValAlgs/src/RecMomentumQualityValidation.cxx b/Tracking/TrkValidation/TrkValAlgs/src/RecMomentumQualityValidation.cxx
index 6b6d9248f5e5..9e37c70845e0 100644
--- a/Tracking/TrkValidation/TrkValAlgs/src/RecMomentumQualityValidation.cxx
+++ b/Tracking/TrkValidation/TrkValAlgs/src/RecMomentumQualityValidation.cxx
@@ -135,7 +135,7 @@ StatusCode Trk::RecMomentumQualityValidation::execute()
 
       // find matching truth particle
       const TrackTruth* trackTruth = 0;
-      const HepMC::GenParticle* genParticle = 0;
+      HepMC::ConstGenParticlePtr genParticle{nullptr};
       TrackTruthCollection::const_iterator truthIterator 
         = trackTruthCollection->find( trackIterator - (*trackCollection).begin() );
       if ( truthIterator == trackTruthCollection->end() ){
diff --git a/Tracking/TrkValidation/TrkValAlgs/src/TrackValidationNtupleWriter.cxx b/Tracking/TrkValidation/TrkValAlgs/src/TrackValidationNtupleWriter.cxx
index d24e09758980..7ebe04335e8e 100644
--- a/Tracking/TrkValidation/TrkValAlgs/src/TrackValidationNtupleWriter.cxx
+++ b/Tracking/TrkValidation/TrkValAlgs/src/TrackValidationNtupleWriter.cxx
@@ -219,7 +219,7 @@ StatusCode Trk::TrackValidationNtupleWriter::initialize() {
         sc = m_truthNtupleTool->initBranches(m_trackTruthClassifiers, include_jets, m_inputTrackCollection);
         if (sc.isFailure()) return sc;
 
-        m_visibleParticleWithoutTruth = new HepMC::GenParticle(HepLorentzVector(), 0);
+        m_visibleParticleWithoutTruth = HepMC::newGenParticlePtr(HepMC::FourVector(), 0);
 
     } // if truth is activated
 
@@ -332,7 +332,7 @@ StatusCode Trk::TrackValidationNtupleWriter::execute() {
 
     unsigned int nTruthTreeRecordsAtCurrentEvent = 0;
     std::vector<Trk::ValidationTrackTruthData>  truthData;
-    std::vector<const HepMC::GenParticle*>*  selecParticles = 0;
+    std::vector<HepMC::ConstGenParticlePtr>*  selecParticles = nullptr;
     //std::vector<const Trk::TrackParameters*> extrapolatedTruthPerigees;
     //std::vector<std::vector<unsigned int> >  classifications;
     std::vector< Trk::GenParticleJet >*      genParticleJets = 0;
@@ -377,7 +377,7 @@ StatusCode Trk::TrackValidationNtupleWriter::execute() {
                 if ( genParticle->production_vertex() )
                   {
                     generatedTrackPerigee = m_truthToTrack->makePerigeeParameters( genParticle );
-                    if (generatedTrackPerigee == NULL && genParticle->barcode() > 1000000 ) {
+                    if (generatedTrackPerigee == NULL && HepMC::barcode(genParticle) > 1000000 ) {
                       ATH_MSG_DEBUG ("No perigee available for interacting truth particle."
                                      <<" -> This is OK for particles from the TrackRecord, but probably"
                                      <<" a bug for production vertex particles.");
@@ -389,7 +389,7 @@ StatusCode Trk::TrackValidationNtupleWriter::execute() {
                 partData.classifications.reserve(m_trackTruthClassifiers.size());
                 for (unsigned int toolIndex = 0 ; toolIndex < m_trackTruthClassifiers.size(); ++toolIndex ) 
                   {
-                    partData.classifications.push_back(m_trackTruthClassifiers[toolIndex]->classify(*genParticle));
+                    partData.classifications.push_back(m_trackTruthClassifiers[toolIndex]->classify(genParticle));
                   }
                 // resize the truth to track vectors to the number of input track collections:
                 partData.truthToTrackIndices.resize(m_inputTrackCollection.size());
@@ -594,7 +594,7 @@ StatusCode Trk::TrackValidationNtupleWriter::writeTrackData(unsigned int trackCo
             if (m_doTruth){
                 // find matching truth particle
                 const TrackTruth* trackTruth = 0;
-                const HepMC::GenParticle* genParticle = 0;
+                HepMC::ConstGenParticlePtr genParticle{nullptr};
                 TrackTruthCollection::const_iterator truthIterator = trackTruthCollection->find( trackIterator - (*tracks).begin() );
                 if ( truthIterator == trackTruthCollection->end() ){
                   ATH_MSG_DEBUG ("No matching truth particle found for track");
diff --git a/Tracking/TrkValidation/TrkValInterfaces/TrkValInterfaces/IGenParticleJetFinder.h b/Tracking/TrkValidation/TrkValInterfaces/TrkValInterfaces/IGenParticleJetFinder.h
index fde30d484a15..b16a3ab46f3c 100644
--- a/Tracking/TrkValidation/TrkValInterfaces/TrkValInterfaces/IGenParticleJetFinder.h
+++ b/Tracking/TrkValidation/TrkValInterfaces/TrkValInterfaces/IGenParticleJetFinder.h
@@ -47,7 +47,7 @@ class IGenParticleJetFinder : virtual public IAlgTool {
         This method is a factory, i.e. vector ownership is given back and
         on failure condition returns NULL. */
     virtual std::vector< Trk::GenParticleJet >*  jetMCFinder
-      (std::vector <const HepMC::GenParticle *>& ) const=0;
+      (std::vector <HepMC::ConstGenParticlePtr>& ) const=0;
 
   };
 
diff --git a/Tracking/TrkValidation/TrkValInterfaces/TrkValInterfaces/IGenParticleSelector.h b/Tracking/TrkValidation/TrkValInterfaces/TrkValInterfaces/IGenParticleSelector.h
index 0e58912b073f..ac8d6b138ee4 100644
--- a/Tracking/TrkValidation/TrkValInterfaces/TrkValInterfaces/IGenParticleSelector.h
+++ b/Tracking/TrkValidation/TrkValInterfaces/TrkValInterfaces/IGenParticleSelector.h
@@ -33,7 +33,7 @@ class IGenParticleSelector : virtual public IAlgTool {
     static const InterfaceID& interfaceID();
     
     /** explain */
-    virtual std::vector<const HepMC::GenParticle *>*
+    virtual std::vector<HepMC::ConstGenParticlePtr>*
       selectGenSignal (const McEventCollection*) const=0;
   };
 
diff --git a/Tracking/TrkValidation/TrkValInterfaces/TrkValInterfaces/ITrackTruthClassifier.h b/Tracking/TrkValidation/TrkValInterfaces/TrkValInterfaces/ITrackTruthClassifier.h
index 56af45805d49..c557707b4470 100644
--- a/Tracking/TrkValidation/TrkValInterfaces/TrkValInterfaces/ITrackTruthClassifier.h
+++ b/Tracking/TrkValidation/TrkValInterfaces/TrkValInterfaces/ITrackTruthClassifier.h
@@ -33,9 +33,9 @@ class ITrackTruthClassifier : virtual public IAlgTool {
     
     /** explain */
     virtual void initClassification(const McEventCollection&,
-                                    const std::vector<const HepMC::GenParticle *>*) const=0;
+                                    const std::vector<HepMC::ConstGenParticlePtr>*) const=0;
 
-    virtual unsigned int classify(const HepMC::GenParticle&) const = 0;
+    virtual unsigned int classify(HepMC::ConstGenParticlePtr) const = 0;
 
     virtual std::string nameOfClassifier() const = 0;
 
diff --git a/Tracking/TrkValidation/TrkValTools/TrkValTools/PrimaryTruthClassifier.h b/Tracking/TrkValidation/TrkValTools/TrkValTools/PrimaryTruthClassifier.h
index 496e2a09b8d7..c3eaf26f51fe 100644
--- a/Tracking/TrkValidation/TrkValTools/TrkValTools/PrimaryTruthClassifier.h
+++ b/Tracking/TrkValidation/TrkValTools/TrkValTools/PrimaryTruthClassifier.h
@@ -18,6 +18,7 @@
 #include "TrkValEvent/TruthClassificationDefs.h"
 
 #include "AtlasHepMC/GenParticle.h"
+#include "AtlasHepMC/SimpleVector.h"
 
 namespace Trk {
 
@@ -40,9 +41,9 @@ namespace Trk {
 
       /** explain */
       virtual void initClassification(const McEventCollection&,
-                                      const std::vector<const HepMC::GenParticle *>*) const;
+                                      const std::vector<HepMC::ConstGenParticlePtr>*) const;
 
-      virtual unsigned int classify(const HepMC::GenParticle&) const;
+      virtual unsigned int classify(HepMC::ConstGenParticlePtr) const;
 
       virtual std::string nameOfClassifier() const;
 
diff --git a/Tracking/TrkValidation/TrkValTools/src/PrimaryTruthClassifier.cxx b/Tracking/TrkValidation/TrkValTools/src/PrimaryTruthClassifier.cxx
index bd344c64e570..01c8f65d5657 100644
--- a/Tracking/TrkValidation/TrkValTools/src/PrimaryTruthClassifier.cxx
+++ b/Tracking/TrkValidation/TrkValTools/src/PrimaryTruthClassifier.cxx
@@ -53,7 +53,7 @@ StatusCode Trk::PrimaryTruthClassifier::finalize() {
 
 void Trk::PrimaryTruthClassifier::initClassification
 (const McEventCollection& /*SimTracks*/,
- const std::vector<const HepMC::GenParticle *>* /*genSignal*/) const {
+ const std::vector<HepMC::ConstGenParticlePtr>* /*genSignal*/) const {
 
   // nothing to prepare as local data at start of collection analysis
   return;
@@ -62,7 +62,7 @@ void Trk::PrimaryTruthClassifier::initClassification
 //////////////////////////////////////////
 // classification from InDetRecStatistics
 //////////////////////////////////////////
-unsigned int Trk::PrimaryTruthClassifier::classify(const HepMC::GenParticle& genParticle) const {
+unsigned int Trk::PrimaryTruthClassifier::classify(HepMC::ConstGenParticlePtr genParticle) const {
 
  
   /* note on using HepMC::FourVector/3Vector against HepGeom::Point3D<double>: The versions from HepMC2 do not know
@@ -74,17 +74,17 @@ unsigned int Trk::PrimaryTruthClassifier::classify(const HepMC::GenParticle& gen
   bool  secondary=false;
   bool  truncated=false;
 
-  if (genParticle.production_vertex()) {
-    HepMC::FourVector      startVertex = genParticle.production_vertex()->position();
+  if (genParticle->production_vertex()) {
+    HepMC::FourVector      startVertex = genParticle->production_vertex()->position();
 
     // primary vertex inside innermost layer?
     if ( fabs(startVertex.perp()) < m_maxRStartPrimary 
          && fabs(startVertex.z()) < m_maxZStartPrimary)
       {
-        if (genParticle.end_vertex() == 0) {  
+        if (genParticle->end_vertex() == 0) {  
           primary=true;
         } else {
-          HepMC::FourVector endVertex = genParticle.end_vertex()->position();
+          HepMC::FourVector endVertex = genParticle->end_vertex()->position();
           if (  endVertex.perp()         > m_minREndPrimary 
                 || fabs(startVertex.z()) > m_minZEndPrimary)
             primary=true; else truncated = true;
@@ -93,10 +93,10 @@ unsigned int Trk::PrimaryTruthClassifier::classify(const HepMC::GenParticle& gen
     else if ( startVertex.perp()    <  m_maxRStartSecondary && 
               fabs(startVertex.z()) <  m_maxZStartSecondary)
       {
-        if (genParticle.end_vertex() == 0) {  
+        if (genParticle->end_vertex() == 0) {  
           secondary=true;
         } else {
-          HepMC::FourVector endVertex = genParticle.end_vertex()->position();
+          HepMC::FourVector endVertex = genParticle->end_vertex()->position();
           if (endVertex.perp()            > m_minREndSecondary
               || fabs(endVertex.z())      > m_minZEndSecondary) {
             secondary=true;
@@ -108,8 +108,7 @@ unsigned int Trk::PrimaryTruthClassifier::classify(const HepMC::GenParticle& gen
   if (truncated) return Trk::TruthClassification::Truncated;
   if (secondary) return Trk::TruthClassification::Secondary;
   if (primary) return Trk::TruthClassification::Primary;
-  ATH_MSG_DEBUG ( "Could not classify this particle: " 
-        << genParticle );
+  ATH_MSG_DEBUG ( "Could not classify this particle: " << genParticle );
   return Trk::TruthClassification::OutsideClassification;
 
 }
diff --git a/Tracking/TrkValidation/TrkVertexFitterValidationUtils/src/TrkPriVxPurityTool.cxx b/Tracking/TrkValidation/TrkVertexFitterValidationUtils/src/TrkPriVxPurityTool.cxx
index b0effec98c42..9a9d2eb64510 100755
--- a/Tracking/TrkValidation/TrkVertexFitterValidationUtils/src/TrkPriVxPurityTool.cxx
+++ b/Tracking/TrkValidation/TrkVertexFitterValidationUtils/src/TrkPriVxPurityTool.cxx
@@ -79,36 +79,47 @@ namespace Trk {
 //getting the signal event itself
                 McEventCollection::const_iterator it = mcCollection->begin();
                 const HepMC::GenEvent* genEvent= ( *it );
+#ifdef HEPMC3
+                if( genEvent->vertices().empty() ) {
+                  ATH_MSG_DEBUG( "No vertices found in first GenEvent" );
+                  return 0;
+                }
+               auto pv = genEvent->vertices()[0];
+#else
 //        std::cout<<"The ID of the first event of the collection: "<<genEvent->event_number()<<std::endl;
                 if( genEvent->vertices_empty() ) {
                   ATH_MSG_DEBUG( "No vertices found in first GenEvent" );
                   return 0;
                 }
+               auto pv = *(genEvent->vertices_begin());
+#endif
 
 //analysing the MC event to create PV candidate
 //first finding the vertex of primary pp interaction
-                HepMC::GenEvent::vertex_const_iterator pv = genEvent->vertices_begin();
 
 //and storing its position
-                CLHEP::HepLorentzVector pv_pos ( ( *pv )->position().x(),
-                                          ( *pv )->position().y(),
-                                          ( *pv )->position().z(),
-                                          ( *pv )->position().t() );
+                CLHEP::HepLorentzVector pv_pos ( pv ->position().x(),
+                                          pv ->position().y(),
+                                          pv ->position().z(),
+                                          pv ->position().t() );
                 double pv_r = pv_pos.perp();
                 double pv_z = pv_pos.z();
 
 // storing all the ids of vertices reasonably close to the primary one.
 // here the region of interest is selected.
-                std::map<int,HepMC::GenVertex *> vertex_ids;
-
-                for ( HepMC::GenEvent::vertex_const_iterator i = genEvent->vertices_begin();
-                      i != genEvent->vertices_end()  ;++i ) {
-                    CLHEP::HepLorentzVector lv_pos ( ( *i )->position().x(),
-                                              ( *i )->position().y(),
-                                              ( *i )->position().z(),
-                                              ( *i )->position().t() );
-                    if ( fabs ( lv_pos.perp() - pv_r ) <m_r_tol  && fabs ( lv_pos.z() - pv_z ) <m_z_tol ) {
-                        vertex_ids[ ( *i )->barcode() ]= ( *i );
+                std::map<int,HepMC::ConstGenVertexPtr> vertex_ids;
+#ifdef HEPMC3
+                for (auto vtx: genEvent->vertices()){
+#else
+                for ( HepMC::GenEvent::vertex_const_iterator i = genEvent->vertices_begin(); i != genEvent->vertices_end()  ;++i ) {
+                    auto vtx=*i;
+#endif
+                    CLHEP::HepLorentzVector lv_pos ( vtx->position().x(),
+                                              vtx->position().y(),
+                                              vtx->position().z(),
+                                              vtx->position().t() );
+                    if ( std::abs ( lv_pos.perp() - pv_r ) <m_r_tol  && std::abs ( lv_pos.z() - pv_z ) <m_z_tol ) {
+                        vertex_ids[ HepMC::barcode(vtx) ]= vtx;
                     }//end of accepted vertices check
                 }//end  of loop over all the vertices
 
@@ -128,7 +139,6 @@ namespace Trk {
 //looping over the tracks to find those matched to the GenParticle originating from signal PV
                 std::vector<Trk::VxTrackAtVertex *>::const_iterator vt = tracks->begin();
                 std::vector<Trk::VxTrackAtVertex *>::const_iterator ve = tracks->end();
-//         unsigned int total_size = 0;
                 unsigned int n_failed = 0;
                 std::vector<double> in_weights ( 0 );
                 std::vector<double> out_weights ( 0 );
@@ -147,7 +157,6 @@ namespace Trk {
                             // get to the original track particle
                             LinkToTrackParticleBase * tr_part = dynamic_cast< LinkToTrackParticleBase * > ( origLink );
                             if ( tr_part !=0  && tr_part->isValid()) {
-//                 ++total_size;
                 
 
                                 std::map< Rec::TrackParticleTruthKey, TrackParticleTruth>::const_iterator ttItr = trackParticleTruthCollection->end();
@@ -166,22 +175,22 @@ namespace Trk {
 
                                 if (ttItr != trackParticleTruthCollection->end() ) {
                                     const HepMcParticleLink& particleLink = ttItr->second.particleLink();
-                                    const HepMC::GenParticle* genParticle = particleLink.cptr();
+                                    HepMC::ConstGenParticlePtr genParticle = particleLink.cptr();
 
-                                    if(genParticle !=0) {
-                                        HepMC::GenEvent * tpEvent = genParticle->parent_event();
+                                    if(genParticle) {
+                                        auto tpEvent = genParticle->parent_event();
                                         if(tpEvent==genEvent) { 
-                                            const HepMC::GenVertex * pVertex(0);
-                                            if (genParticle!=0) pVertex = genParticle->production_vertex();
-                                            if ( pVertex != 0 ) {
+                                            HepMC::ConstGenVertexPtr pVertex{nullptr};
+                                            if (genParticle) pVertex = genParticle->production_vertex();
+                                            if ( pVertex) {
                                                 int link_pid = genParticle->pdg_id();
                                                 bool primary_track = false;
                                                 bool secondary_track = false;
                   
 //loop over the particles until decision is really taken
                                                 do {
-                                                    int tvrt_code = pVertex->barcode();
-                                                    std::map<int, HepMC::GenVertex *>::const_iterator idf_res = vertex_ids.find ( tvrt_code );
+                                                    int tvrt_code = HepMC::barcode(pVertex);
+                                                    auto idf_res = vertex_ids.find ( tvrt_code );
 
 //for the HepMcParticle Link, the signal event has an index 0.
 // tagging on it
@@ -193,11 +202,19 @@ namespace Trk {
 //this vertex is not from the central region.
 //checking whether it is a bremsstrahlung
 //if so, propagating track to its origin, otherwise rejecting it completely.
+#ifdef HEPMC3
+                                                        if ( pVertex->particles_in().size() == 1 ) {
+#else
                                                         if ( pVertex->particles_in_size() == 1 ) {
+#endif
 // one mother particle: is it a brem of some kind?
-                                                            HepMC::GenVertex::particles_in_const_iterator inp = pVertex->particles_in_const_begin() ;
-                                                            HepMC::GenVertex * tmpVertex_loc = ( *inp )->production_vertex();
-                                                            if ( ( *inp )->pdg_id() == link_pid  && tmpVertex_loc) {
+#ifdef HEPMC3
+                                                            auto inp = pVertex->particles_in()[0] ;
+#else
+                                                            auto inp =*(pVertex->particles_in_const_begin()) ;
+#endif
+                                                            auto tmpVertex_loc = inp ->production_vertex();
+                                                            if ( inp ->pdg_id() == link_pid  && tmpVertex_loc) {
 // seems like a brem (this can be generator/simulation dependent unfortunately)
 // continue iterating
                                                                 pVertex = tmpVertex_loc;
-- 
GitLab


From dd2d3ba7244cbe355259a46ce8c12dc823228fe4 Mon Sep 17 00:00:00 2001
From: John Derek Chapman <chapman@hep.phy.cam.ac.uk>
Date: Tue, 22 Dec 2020 15:17:16 +0000
Subject: [PATCH 221/225] Overriding Run Numbers in Component Accumulator based
 configuration

---
 .../python/AllConfigFlags.py                  |  12 +-
 .../python/AutoConfigFlags.py                 |  17 +++
 .../python/RunToTimestampData.py              |   0
 .../python/EventIdOverrideConfig.py           | 131 ++++++++++++++++++
 .../AthenaPoolCnvSvc/python/PoolReadConfig.py |  52 ++++++-
 .../python/DigitizationConfigFlags.py         |   3 -
 .../python/DigitizationParametersConfig.py    |  18 +--
 .../Digitization/python/PileUpConfigNew.py    |   2 +-
 .../python/RunDependentConfigNew.py           |  84 +----------
 .../test/DigitizationPUConfigNew_test.py      |   2 +-
 .../G4AtlasApps/python/G4Atlas_MetadataNew.py |  16 +--
 .../G4AtlasApps/python/SimConfigFlags.py      |   8 --
 .../ISF_SimulationSelectorsConfigNew.py       | 110 +++++++--------
 .../SimuJobTransforms/python/ISF_Skeleton.py  |  60 +-------
 14 files changed, 271 insertions(+), 244 deletions(-)
 rename {Simulation/G4Atlas/G4AtlasApps => Control/AthenaConfiguration}/python/RunToTimestampData.py (100%)
 create mode 100644 Control/AthenaKernel/python/EventIdOverrideConfig.py

diff --git a/Control/AthenaConfiguration/python/AllConfigFlags.py b/Control/AthenaConfiguration/python/AllConfigFlags.py
index 137186d0313e..83e2ed707f96 100644
--- a/Control/AthenaConfiguration/python/AllConfigFlags.py
+++ b/Control/AthenaConfiguration/python/AllConfigFlags.py
@@ -4,7 +4,7 @@ from __future__ import print_function
 
 from AthenaConfiguration.AthConfigFlags import AthConfigFlags
 from AthenaCommon.SystemOfUnits import TeV
-from AthenaConfiguration.AutoConfigFlags import GetFileMD
+from AthenaConfiguration.AutoConfigFlags import GetFileMD, getInitialTimeStampsFromRunNumbers, getRunToTimestampDict
 from PyUtils.moduleExists import moduleExists
 
 
@@ -29,8 +29,14 @@ def _createCfgFlags():
     acf.addFlag('Input.Files', ["_ATHENA_GENERIC_INPUTFILE_NAME_",] ) # former global.InputFiles
     acf.addFlag('Input.SecondaryFiles', []) # secondary input files for DoubleEventSelector
     acf.addFlag('Input.isMC', lambda prevFlags : "IS_SIMULATION" in GetFileMD(prevFlags.Input.Files).get("eventTypes",[]) ) # former global.isMC
+    acf.addFlag('Input.OverrideRunNumber', False )
     acf.addFlag('Input.RunNumber', lambda prevFlags : list(GetFileMD(prevFlags.Input.Files).get("runNumbers",[]))) # former global.RunNumber
     acf.addFlag('Input.LumiBlockNumber', lambda prevFlags : list(GetFileMD(prevFlags.Input.Files).get("lumiBlockNumbers",[]))) # former global.RunNumber
+    acf.addFlag('Input.TimeStamp', lambda prevFlags : [] if not prevFlags.Input.OverrideRunNumber else getInitialTimeStampsFromRunNumbers(prevFlags.Input.RunNumber))
+    # Configure EvtIdModifierSvc with a list of dictionaries of the form:
+    # {'run': 152166, 'lb': 202, 'starttstamp': 1269948352889940910, 'dt': 104.496, 'evts': 1, 'mu': 0.005, 'force_new': False}
+    acf.addFlag("Input.RunAndLumiOverrideList", [])
+
     acf.addFlag('Input.ProjectName', lambda prevFlags : GetFileMD(prevFlags.Input.Files).get("project_name","data17_13TeV") ) # former global.ProjectName
     acf.addFlag('Input.Format', lambda prevFlags : GetFileMD(prevFlags.Input.Files).get("file_type","") ) # former global.InputFormat
 
@@ -137,6 +143,10 @@ def _createCfgFlags():
     acf.addFlag("IOVDb.GlobalTag",lambda prevFlags : GetFileMD(prevFlags.Input.Files).get("IOVDbGlobalTag",None) or "CONDBR2-BLKPA-2017-05")
     from IOVDbSvc.IOVDbAutoCfgFlags import getDatabaseInstanceDefault
     acf.addFlag("IOVDb.DatabaseInstance",getDatabaseInstanceDefault)
+    # Run dependent simulation
+    # map from runNumber to timestamp; migrated from RunDMCFlags.py
+    acf.addFlag("IOVDb.RunToTimestampDict", lambda prevFlags: getRunToTimestampDict())
+
 
     def __bfield():
         from MagFieldConfig.BFieldConfigFlags import createBFieldConfigFlags
diff --git a/Control/AthenaConfiguration/python/AutoConfigFlags.py b/Control/AthenaConfiguration/python/AutoConfigFlags.py
index 5ac59444e947..12958a31c184 100644
--- a/Control/AthenaConfiguration/python/AutoConfigFlags.py
+++ b/Control/AthenaConfiguration/python/AutoConfigFlags.py
@@ -55,3 +55,20 @@ def DetDescrInfo(geoTag):
     detDescrInfo = _initializeGeometryParameters(geoTag)
     detDescrInfo["geomTag"] = geoTag
     return detDescrInfo
+
+
+# Based on RunDMCFlags.py
+def getRunToTimestampDict():
+    # this wrapper is intended to avoid an initial import
+    from .RunToTimestampData import RunToTimestampDict
+    return RunToTimestampDict
+
+
+def getInitialTimeStampsFromRunNumbers(runNumbers):
+    """This is used to hold a dictionary of the form
+    {152166:1269948352889940910, ...} to allow the
+    timestamp to be determined from the run.
+    """
+    run2timestampDict =  getRunToTimestampDict()
+    timeStamps = [run2timestampDict.get(runNumber,1) for runNumber in runNumbers] # Add protection here?
+    return timeStamps
diff --git a/Simulation/G4Atlas/G4AtlasApps/python/RunToTimestampData.py b/Control/AthenaConfiguration/python/RunToTimestampData.py
similarity index 100%
rename from Simulation/G4Atlas/G4AtlasApps/python/RunToTimestampData.py
rename to Control/AthenaConfiguration/python/RunToTimestampData.py
diff --git a/Control/AthenaKernel/python/EventIdOverrideConfig.py b/Control/AthenaKernel/python/EventIdOverrideConfig.py
new file mode 100644
index 000000000000..d49a61ab6280
--- /dev/null
+++ b/Control/AthenaKernel/python/EventIdOverrideConfig.py
@@ -0,0 +1,131 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
+
+# based on https://acode-browser1.usatlas.bnl.gov/lxr/source/athena/Control/AthenaServices/python/Configurables.py#0247
+def add_modifier(run_nbr=None, evt_nbr=None, time_stamp=None, lbk_nbr=None, nevts=1):
+
+    if run_nbr is None:
+        modify_run_nbr = 0
+        run_nbr = 0
+    else:
+        modify_run_nbr = 1
+
+    if evt_nbr is None:
+        modify_evt_nbr = 0
+        evt_nbr = 0
+    else:
+        modify_evt_nbr = 1
+
+    if time_stamp is None:
+        modify_time_stamp = 0
+        time_stamp = 0
+    else:
+        modify_time_stamp = 1
+
+    if lbk_nbr is None:
+        modify_lbk_nbr = 0
+        lbk_nbr = 0
+    else:
+        modify_lbk_nbr = 1
+
+    mod_bit = int(0b0000
+                  | (modify_run_nbr << 0)
+                  | (modify_evt_nbr << 1)
+                  | (modify_time_stamp << 2)
+                  | (modify_lbk_nbr << 3))
+
+    return [run_nbr, evt_nbr, time_stamp, lbk_nbr, nevts, mod_bit]
+
+
+def buildListOfModifiers(ConfigFlags):
+    # migrated from RunDMCFlags.py
+    Modifiers = []
+    pDicts = ConfigFlags.Input.RunAndLumiOverrideList
+    DataRunNumber = ConfigFlags.Digitization.DataRunNumber
+
+    if pDicts:
+        for el in pDicts:
+            evt_nbr = el.get("evt_nbr", None)
+            Modifiers += add_modifier(run_nbr=el["run"], evt_nbr=evt_nbr, time_stamp=el["starttstamp"], lbk_nbr=el["lb"], nevts=el["evts"])
+    elif DataRunNumber>0:
+        assert DataRunNumber >= 0, (
+            "ConfigFlags.Digitization.DataRunNumber %d is negative. "
+            "Use a real run number from data." % DataRunNumber)
+
+        # Using event numbers to avoid "some very large number" setting
+        totalNumber = 1000000
+        if ConfigFlags.Exec.MaxEvents > 0:
+            totalNumber = ConfigFlags.Exec.MaxEvents + 1
+        if ConfigFlags.Exec.SkipEvents > 0:
+            totalNumber += ConfigFlags.Exec.SkipEvents
+
+        InitialTimeStamp = ConfigFlags.IOVDb.RunToTimestampDict.get(DataRunNumber, 1) # TODO fix repeated configuration
+
+        FirstLB = 1
+        Modifiers += add_modifier(run_nbr=DataRunNumber, lbk_nbr=FirstLB, time_stamp=InitialTimeStamp, nevts=totalNumber)
+    elif ConfigFlags.Input.RunNumber:
+        # Behaviour for Simulation jobs. For standard Simulation we
+        # override the run number once per job. TODO Still need to deal with the specific case of DataOverlay
+        myRunNumber = ConfigFlags.Input.RunNumber[0]
+        assert myRunNumber >= 0, (
+            "ConfigFlags.Input.RunNumber[0] %d is negative. "
+            "Use a real run number from data." % myRunNumber)
+        myFirstLB = ConfigFlags.Input.LumiBlockNumber[0]
+        myInitialTimeStamp = ConfigFlags.Input.TimeStamp[0]
+
+        # Using event numbers to avoid "some very large number" setting
+        totalNumber = 1000000
+        if ConfigFlags.Exec.MaxEvents > 0:
+            totalNumber = ConfigFlags.Exec.MaxEvents + 1
+        if ConfigFlags.Exec.SkipEvents > 0:
+            totalNumber += ConfigFlags.Exec.SkipEvents
+        Modifiers += add_modifier(run_nbr=myRunNumber, lbk_nbr=myFirstLB, time_stamp=myInitialTimeStamp, nevts=totalNumber)
+    return Modifiers
+
+
+def getMinMaxRunNumbers(ConfigFlags):
+    """Get a pair (firstrun,lastrun + 1) for setting ranges in IOVMetaData """
+    mini = 1
+    maxi = 2147483647
+    pDicts = ConfigFlags.Input.RunAndLumiOverrideList
+    if pDicts:
+        # Behaviour for Digitization jobs using RunAndLumiOverrideList
+        allruns = [element['run'] for element in pDicts]
+        mini = min(allruns) + 0
+        maxi = max(allruns) + 1
+    elif ConfigFlags.Digitization.DataRunNumber>0:
+        # Behaviour for Digitization jobs using DataRunNumber
+        DataRunNumber = ConfigFlags.Digitization.DataRunNumber
+        assert DataRunNumber >= 0, (
+            "ConfigFlags.Digitization.DataRunNumber %d is negative. "
+            "Use a real run number from data." % DataRunNumber)
+        mini = DataRunNumber
+        maxi = DataRunNumber+1
+    elif ConfigFlags.Input.RunNumber:
+        # Behaviour for Simulation jobs
+        myRunNumber = ConfigFlags.Input.RunNumber[0]
+        assert myRunNumber >= 0, (
+            "ConfigFlags.Input.RunNumber[0] %d is negative. "
+            "Use a real run number from data." % myRunNumber)
+        mini = myRunNumber
+        maxi = 2147483647
+    return (mini,maxi)
+
+
+def EvtIdModifierSvcCfg(ConfigFlags, name="EvtIdModifierSvc", **kwargs):
+    acc = ComponentAccumulator()
+    if ConfigFlags.Digitization.Pileup or ConfigFlags.Sim.DoFullChain:
+        kwargs.setdefault("EvtStoreName", "OriginalEvent_SG")
+    else:
+        kwargs.setdefault("EvtStoreName", "StoreGateSvc")
+
+    Modifiers = buildListOfModifiers(ConfigFlags)
+    if len(Modifiers) > 0:
+        kwargs.setdefault("Modifiers", Modifiers)
+    acc.addService(CompFactory.EvtIdModifierSvc(name, **kwargs), create=True)
+    iovDbMetaDataTool = CompFactory.IOVDbMetaDataTool()
+    iovDbMetaDataTool.MinMaxRunNumbers = getMinMaxRunNumbers(ConfigFlags)
+    acc.addPublicTool(iovDbMetaDataTool)
+    return acc
diff --git a/Database/AthenaPOOL/AthenaPoolCnvSvc/python/PoolReadConfig.py b/Database/AthenaPOOL/AthenaPoolCnvSvc/python/PoolReadConfig.py
index de15a350b0e8..8779b2921140 100644
--- a/Database/AthenaPOOL/AthenaPoolCnvSvc/python/PoolReadConfig.py
+++ b/Database/AthenaPOOL/AthenaPoolCnvSvc/python/PoolReadConfig.py
@@ -2,6 +2,50 @@
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
+from AthenaKernel.EventIdOverrideConfig import EvtIdModifierSvcCfg
+
+def EventSelectorAthenaPoolCfg(configFlags):
+    result=ComponentAccumulator()
+    EventSelectorAthenaPool=CompFactory.EventSelectorAthenaPool
+    evSel=EventSelectorAthenaPool("EventSelector",
+                                  InputCollections = configFlags.Input.Files,
+                                  SkipEvents=configFlags.Exec.SkipEvents)
+    if configFlags.Input.OverrideRunNumber:
+        if not configFlags.Input.RunAndLumiOverrideList:
+            DataRunNumber = -1
+            FirstLB = 1
+            InitialTimeStamp = 1
+            OldRunNumber = -1
+            if configFlags.Digitization.DataRunNumber>0:
+                # Behaviour for Digitization jobs using DataRunNumber
+                DataRunNumber = configFlags.Digitization.DataRunNumber
+                FirstLB = 1
+                InitialTimeStamp = configFlags.IOVDb.RunToTimestampDict.get(DataRunNumber, 1) # TODO fix repeated configuration
+                if not configFlags.Sim.DoFullChain:
+                    OldRunNumber = configFlags.Input.RunNumber[0] # CHECK this should be the Run Number from the HITS file
+            elif configFlags.Input.RunNumber:
+                # Behaviour for Simulation jobs
+                DataRunNumber = configFlags.Input.RunNumber[0]
+                FirstLB = configFlags.Input.LumiBlockNumber[0]
+                InitialTimeStamp = configFlags.Input.TimeStamp[0]
+            assert DataRunNumber >= 0, (
+                "configFlags.Input.OverrideRunNumber was True, but provided DataRunNumber (%d) is negative. "
+                "Use a real run number from data." % DataRunNumber)
+            evSel.OverrideRunNumber = configFlags.Input.OverrideRunNumber
+            evSel.RunNumber = DataRunNumber
+            evSel.FirstLB = FirstLB
+            evSel.InitialTimeStamp = InitialTimeStamp # Necessary to avoid a crash
+            if hasattr(evSel, "OverrideRunNumberFromInput"):
+                evSel.OverrideRunNumberFromInput = configFlags.Input.OverrideRunNumber
+            if OldRunNumber > 0:
+                evSel.OldRunNumber = OldRunNumber
+        else:
+            # Behaviour for Digitization jobs using RunAndLumiOverrideList
+            pass
+        result.merge(EvtIdModifierSvcCfg(configFlags))
+    result.addService(evSel)
+    return result
+
 
 def PoolReadCfg(configFlags):
     """
@@ -70,17 +114,15 @@ def PoolReadCfg(configFlags):
                                                    IsSecondary=True,
                                                    InputCollections=filenamesSecondary)
             result.addService(secondarySel)
+        result.addService(evSel)
     else:
         # We have only primary inputs
         apaps=AthenaPoolAddressProviderSvc()
         result.addService(apaps)
         result.addService(ProxyProviderSvc(ProviderNames=[apaps.getFullJobOptName(),])) #No service handle yet???
+        result.merge(EventSelectorAthenaPoolCfg(configFlags))
+        evSel = result.getService("EventSelector")
 
-        evSel=EventSelectorAthenaPool("EventSelector", 
-                                      InputCollections = filenames, 
-                                      SkipEvents=configFlags.Exec.SkipEvents)
-
-    result.addService(evSel)
     result.setAppProperty("EvtSel",evSel.getFullJobOptName())
 
     #(possibly) missing: MetaDataSvc
diff --git a/Simulation/Digitization/python/DigitizationConfigFlags.py b/Simulation/Digitization/python/DigitizationConfigFlags.py
index 9bd2e33ff737..b89326551cc6 100644
--- a/Simulation/Digitization/python/DigitizationConfigFlags.py
+++ b/Simulation/Digitization/python/DigitizationConfigFlags.py
@@ -140,9 +140,6 @@ def createDigitizationCfgFlags():
     flags.addFlag("Digitization.PU.NumberOfCavern", 0.0)
     # Repeating pattern to determine which events to simulate when using Stepping Cache
     flags.addFlag("Digitization.PU.SignalPatternForSteppingCache", [])
-    # Configure EvtIdModifierSvc with a list of dictionaries of the form:
-    # {'run': 152166, 'lb': 202, 'starttstamp': 1269948352889940910, 'dt': 104.496, 'evts': 1, 'mu': 0.005, 'force_new': False}
-    flags.addFlag("Digitization.PU.RunAndLumiOverrideList", [])
     
     return flags
 
diff --git a/Simulation/Digitization/python/DigitizationParametersConfig.py b/Simulation/Digitization/python/DigitizationParametersConfig.py
index 87f1fc7848f8..07779269ecc5 100644
--- a/Simulation/Digitization/python/DigitizationParametersConfig.py
+++ b/Simulation/Digitization/python/DigitizationParametersConfig.py
@@ -1,27 +1,13 @@
 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
+from AthenaKernel.EventIdOverrideConfig import getMinMaxRunNumbers
 from AthenaCommon.Logging import logging
 logDigitizationWriteMetadata = logging.getLogger( 'DigitizationParametersConfig' )
 
-myRunNumber = 0
-myEndRunNumber = 2147483647 # the max run number
-
-def getRunNumberRangeForOutputMetadata(ConfigFlags):
-    myRunNumber = ConfigFlags.Input.RunNumber[0]
-    myEndRunNumber = 2147483647 # the max run number
-
-    if myRunNumber > 0 :
-        logDigitizationWriteMetadata.info('Found Run Number %s in hits file metadata.', str(myRunNumber) )
-        myEndRunNumber = myRunNumber+1 # got a reasonable run number so set end run to be the next run after this one.
-    else :
-        logDigitizationWriteMetadata.info('Found unexpected Run Number %s in hits file metadata. Not overriding RunNumber to match hits file for this job.', str(myRunNumber) )
-        myRunNumber = 0
-    return myRunNumber, myEndRunNumber
-
 def writeDigitizationMetadata(ConfigFlags):
     from IOVDbMetaDataTools import ParameterDbFiller
     dbFiller = ParameterDbFiller.ParameterDbFiller()
-    myRunNumber, myEndRunNumber = getRunNumberRangeForOutputMetadata(ConfigFlags)
+    myRunNumber, myEndRunNumber = getMinMaxRunNumbers(ConfigFlags)
     logDigitizationWriteMetadata.debug('ParameterDbFiller BeginRun = %s', str(myRunNumber) )
     dbFiller.setBeginRun(myRunNumber)
     logDigitizationWriteMetadata.debug('ParameterDbFiller EndRun   = %s', str(myEndRunNumber) )
diff --git a/Simulation/Digitization/python/PileUpConfigNew.py b/Simulation/Digitization/python/PileUpConfigNew.py
index 72194f7b362e..691d9ed10021 100644
--- a/Simulation/Digitization/python/PileUpConfigNew.py
+++ b/Simulation/Digitization/python/PileUpConfigNew.py
@@ -311,7 +311,7 @@ def PileUpEventLoopMgrCfg(flags, name="PileUpEventLoopMgr", **kwargs):
     kwargs.setdefault("firstXing", flags.Digitization.PU.InitialBunchCrossing)
     kwargs.setdefault("lastXing", flags.Digitization.PU.FinalBunchCrossing)
 
-    if flags.Digitization.PU.RunAndLumiOverrideList:
+    if flags.Input.RunAndLumiOverrideList:
         kwargs.setdefault("MaxMinBiasCollPerXing", maxNevtsPerXing(flags))
         acc.merge(LumiProfileSvcCfg(flags))
         kwargs.setdefault("BeamLuminosity", acc.getService("LumiProfileSvc"))
diff --git a/Simulation/Digitization/python/RunDependentConfigNew.py b/Simulation/Digitization/python/RunDependentConfigNew.py
index 8aa31ec86093..84273ffbe660 100644
--- a/Simulation/Digitization/python/RunDependentConfigNew.py
+++ b/Simulation/Digitization/python/RunDependentConfigNew.py
@@ -8,74 +8,10 @@ from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
 
 # Auxiliary
-def add_modifier(run_nbr=None, evt_nbr=None, time_stamp=None, lbk_nbr=None, nevts=1):
-    
-    if run_nbr is None:
-        modify_run_nbr = 0
-        run_nbr = 0
-    else:
-        modify_run_nbr = 1
-
-    if evt_nbr is None:
-        modify_evt_nbr = 0
-        evt_nbr = 0
-    else:
-        modify_evt_nbr = 1
-
-    if time_stamp is None:
-        modify_time_stamp = 0
-        time_stamp = 0
-    else:
-        modify_time_stamp = 1
-
-    if lbk_nbr is None:
-        modify_lbk_nbr = 0
-        lbk_nbr = 0
-    else:
-        modify_lbk_nbr = 1
-
-    mod_bit = int(0b0000
-                  | (modify_run_nbr << 0)
-                  | (modify_evt_nbr << 1)
-                  | (modify_time_stamp << 2)
-                  | (modify_lbk_nbr << 3))
-
-    return [run_nbr, evt_nbr, time_stamp, lbk_nbr, nevts, mod_bit]
-
-
-def buildListOfModifiers(flags):
-    # migrated from RunDMCFlags.py
-    Modifiers = []
-    pDicts = flags.Digitization.PU.RunAndLumiOverrideList
-    DataRunNumber = flags.Digitization.DataRunNumber
-    
-    if pDicts:
-        for el in pDicts:
-            evt_nbr = el.get("evt_nbr", None)
-            Modifiers += add_modifier(run_nbr=el["run"], evt_nbr=evt_nbr, time_stamp=el["starttstamp"], lbk_nbr=el["lb"], nevts=el["evts"])
-    elif DataRunNumber:
-        assert DataRunNumber >= 0, (
-            "flags.Digitization.DataRunNumber %d is negative. "
-            "Use a real run number from data." % DataRunNumber)
-        
-        # Using event numbers to avoid "some very large number" setting
-        totalNumber = 1000000
-        if flags.Exec.MaxEvents > 0:
-            totalNumber = flags.Exec.MaxEvents + 1
-        if flags.Exec.SkipEvents > 0:
-            totalNumber += flags.Exec.SkipEvents
-            
-        InitialTimeStamp = flags.Sim.RunToTimestampDict.get(DataRunNumber, 1)
-
-        FirstLB = 1
-        Modifiers += add_modifier(run_nbr=DataRunNumber, lbk_nbr=FirstLB, time_stamp=InitialTimeStamp, nevts=totalNumber)
-    return Modifiers
-
-
 def maxNevtsPerXing(flags):
     """Return the largest minbias pileup value, for PileUpEvtLoopMgr caches"""
     # migrated from DigitizationFlags.py
-    pDicts = flags.Digitization.PU.RunAndLumiOverrideList
+    pDicts = flags.Input.RunAndLumiOverrideList
     return max(element["mu"] for element in pDicts)
 
 
@@ -83,7 +19,7 @@ def runLumiListAndScaleFactorLists(flags):
     # migrated from DigitizationFlags.py
     runLumiList = []
     scaleFactorList = []
-    pDicts = flags.Digitization.PU.RunAndLumiOverrideList
+    pDicts = flags.Input.RunAndLumiOverrideList
     MaxCollisionsPerXing = maxNevtsPerXing(flags)
     for element in pDicts:
         run = element["run"]
@@ -99,22 +35,6 @@ def runLumiListAndScaleFactorLists(flags):
 
 
 # Config
-def EvtIdModifierSvcCfg(flags, name="EvtIdModifierSvc", **kwargs):
-    acc = ComponentAccumulator()
-    
-    if flags.Sim.DoFullChain:
-        kwargs.setdefault("EvtStoreName", "OriginalEvent_SG")
-    else:
-        kwargs.setdefault("EvtStoreName", "StoreGateSvc")
-
-    Modifiers = buildListOfModifiers(flags)
-    if len(Modifiers) > 0:
-        kwargs.setdefault("Modifiers", Modifiers)
-
-    acc.addService(CompFactory.EvtIdModifierSvc(name, **kwargs), create=True)
-    return acc
-
-
 def LumiProfileSvcCfg(flags, name="LumiProfileSvc", **kwargs):
     acc = ComponentAccumulator()
     runLumiList, scaleFactorList = runLumiListAndScaleFactorLists(flags)
diff --git a/Simulation/Digitization/test/DigitizationPUConfigNew_test.py b/Simulation/Digitization/test/DigitizationPUConfigNew_test.py
index 74545bff0733..6f34bdafd0d2 100755
--- a/Simulation/Digitization/test/DigitizationPUConfigNew_test.py
+++ b/Simulation/Digitization/test/DigitizationPUConfigNew_test.py
@@ -126,7 +126,7 @@ ConfigFlags.Tile.correctTime = False
 ConfigFlags.lock()
 
 # test this flag
-ConfigFlags.Sim.RunToTimestampDict
+ConfigFlags.IOVDb.RunToTimestampDict
 
 # Core components
 acc = MainServicesCfg(ConfigFlags)
diff --git a/Simulation/G4Atlas/G4AtlasApps/python/G4Atlas_MetadataNew.py b/Simulation/G4Atlas/G4AtlasApps/python/G4Atlas_MetadataNew.py
index f075b62cf844..d37613c34c0b 100644
--- a/Simulation/G4Atlas/G4AtlasApps/python/G4Atlas_MetadataNew.py
+++ b/Simulation/G4Atlas/G4AtlasApps/python/G4Atlas_MetadataNew.py
@@ -2,6 +2,7 @@
 
 ### This module contains functions which may need to peek at the input file metadata
 
+from AthenaKernel.EventIdOverrideConfig import getMinMaxRunNumbers
 ## Get the logger
 from AthenaCommon.Logging import logging
 simMDlog = logging.getLogger('Sim_Metadata')
@@ -26,7 +27,6 @@ def fillAtlasMetadata(ConfigFlags, dbFiller):
 
     #---------  
     ## Simulated detector flags: add each enabled detector to the simulatedDetectors list
-    from AthenaCommon.DetFlags import DetFlags  # noqa: F401
     simDets = []
     for det in ['Pixel','SCT','TRT','BCM','Lucid','ZDC','ALFA','AFP','FwdRegion','LAr','HGTD','Tile','MDT','CSC','TGC','RPC','MM','sTGC','Truth','LVL1']:
         attrname = "Detector.Geometry"+det
@@ -50,22 +50,10 @@ def fillISFMetadata(dbFiller):
     dbFiller.addSimParam('Simulator', ISF_Flags.Simulator())
 
 
-def getRunNumberRangeForOutputMetadata(ConfigFlags):
-    myRunNumber = ConfigFlags.Input.RunNumber[0]
-    myEndRunNumber = 2147483647 # the max run number
-
-    #if myRunNumber > 0 :
-    #    simMDlog.info('Found Run Number %s in hits file metadata.', str(myRunNumber) )
-    #    myEndRunNumber = myRunNumber+1 # got a reasonable run number so set end run to be the next run after this one.
-    #else :
-    #    simMDlog.info('Found unexpected Run Number %s in hits file metadata. Not overriding RunNumber to match hits file for this job.', str(myRunNumber) )
-    #    myRunNumber = 0
-    return myRunNumber, myEndRunNumber
-
 def writeSimulationParametersMetadata(ConfigFlags):
     from IOVDbMetaDataTools import ParameterDbFiller
     dbFiller = ParameterDbFiller.ParameterDbFiller()
-    myRunNumber, myEndRunNumber = getRunNumberRangeForOutputMetadata(ConfigFlags)
+    myRunNumber, myEndRunNumber = getMinMaxRunNumbers(ConfigFlags)
     simMDlog.debug('ParameterDbFiller BeginRun = %s', str(myRunNumber) )
     dbFiller.setBeginRun(myRunNumber)
     simMDlog.debug('ParameterDbFiller EndRun   = %s', str(myEndRunNumber) )
diff --git a/Simulation/G4Atlas/G4AtlasApps/python/SimConfigFlags.py b/Simulation/G4Atlas/G4AtlasApps/python/SimConfigFlags.py
index 764ce875c6da..c9eac2b62a4c 100644
--- a/Simulation/G4Atlas/G4AtlasApps/python/SimConfigFlags.py
+++ b/Simulation/G4Atlas/G4AtlasApps/python/SimConfigFlags.py
@@ -127,14 +127,6 @@ def createSimConfigFlags():
     scf.addFlag("Sim.Fatras.GaussianMixtureModel", True) # use Gaussian mixture model for Multiple Scattering
     scf.addFlag("Sim.Fatras.BetheHeitlerScale", 1.) # scale to Bethe-Heitler contribution
 
-    # Run dependent simulation
-    # map from runNumber to timestamp; migrated from RunDMCFlags.py
-    def getRunToTimestampDict():
-        # this wrapper is intended to avoid an initial import
-        from G4AtlasApps.RunToTimestampData import RunToTimestampDict
-        return RunToTimestampDict
-    scf.addFlag("Sim.RunToTimestampDict", lambda prevFlags: getRunToTimestampDict())
-
     scf.addFlag("Sim.BeamPipeCut", 100.0)
     scf.addFlag("Sim.TightMuonStepping", False)
 
diff --git a/Simulation/ISF/ISF_SimulationSelectors/python/ISF_SimulationSelectorsConfigNew.py b/Simulation/ISF/ISF_SimulationSelectors/python/ISF_SimulationSelectorsConfigNew.py
index 2031035e3a0f..5085814f5c98 100644
--- a/Simulation/ISF/ISF_SimulationSelectors/python/ISF_SimulationSelectorsConfigNew.py
+++ b/Simulation/ISF/ISF_SimulationSelectors/python/ISF_SimulationSelectorsConfigNew.py
@@ -33,7 +33,7 @@ def DefaultSimSelectorCfg(flags, name="ISF_DefaultSimSelector", **kwargs):
 
 def DefaultParticleKillerSelectorCfg(flags, name="ISF_DefaultParticleKillerSelector", **kwargs):
     acc = ParticleKillerSvcCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_ParticleKillerSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.ParticleKiller)
     acc.merge(DefaultSimSelectorCfg(flags, name, **kwargs))
@@ -43,7 +43,7 @@ def DefaultParticleKillerSelectorCfg(flags, name="ISF_DefaultParticleKillerSelec
 def PileupParticleKillerSelectorCfg(flags, name="ISF_PileupParticleKillerSelector", **kwargs):
     acc = ParticleKillerSvcCfg(flags)
     kwargs.setdefault("PileupBCID", [1])
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_ParticleKillerSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.ParticleKiller)
     acc.addPublicTool(CompFactory.ISF.KinematicPileupSimSelector(name, **kwargs))
@@ -52,7 +52,7 @@ def PileupParticleKillerSelectorCfg(flags, name="ISF_PileupParticleKillerSelecto
 
 def DefaultGeant4SelectorCfg(flags, name="ISF_DefaultGeant4Selector", **kwargs):
     acc = Geant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISFG4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     acc.merge(DefaultSimSelectorCfg(flags, name, **kwargs))
@@ -61,7 +61,7 @@ def DefaultGeant4SelectorCfg(flags, name="ISF_DefaultGeant4Selector", **kwargs):
 
 def DefaultAFIIGeant4SelectorCfg(flags, name="ISF_DefaultAFIIGeant4Selector", **kwargs):
     acc = AFIIGeant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_AFIIGeant4SimSvc"))
     acc.merge(DefaultGeant4SelectorCfg(flags, name, **kwargs))
     return acc
@@ -69,7 +69,7 @@ def DefaultAFIIGeant4SelectorCfg(flags, name="ISF_DefaultAFIIGeant4Selector", **
 
 def DefaultLongLivedGeant4SelectorCfg(flags, name="ISF_DefaultLongLivedGeant4Selector", **kwargs):
     acc = LongLivedGeant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_LongLivedGeant4SimSvc"))
     acc.merge(DefaultGeant4SelectorCfg(flags, name, **kwargs))
     return acc
@@ -77,7 +77,7 @@ def DefaultLongLivedGeant4SelectorCfg(flags, name="ISF_DefaultLongLivedGeant4Sel
 
 def DefaultAFII_QS_Geant4SelectorCfg(flags, name="ISF_DefaultAFII_QS_Geant4Selector", **kwargs):
     acc = AFII_QS_Geant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_AFII_QS_Geant4SimSvc"))
     acc.merge(DefaultGeant4SelectorCfg(flags, name, **kwargs))
     return acc
@@ -85,7 +85,7 @@ def DefaultAFII_QS_Geant4SelectorCfg(flags, name="ISF_DefaultAFII_QS_Geant4Selec
 
 def FullGeant4SelectorCfg(flags, name="ISF_FullGeant4Selector", **kwargs):
     acc = ComponentAccumulator()
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         acc.merge(FullGeant4SimCfg(flags))
         kwargs.setdefault("Simulator", acc.getService("ISF_FullGeant4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
@@ -95,7 +95,7 @@ def FullGeant4SelectorCfg(flags, name="ISF_FullGeant4Selector", **kwargs):
 
 def PassBackGeant4SelectorCfg(flags, name="ISF_PassBackGeant4Selector", **kwargs):
     acc = PassBackGeant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_PassBackGeant4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     acc.merge(DefaultSimSelectorCfg(flags, name, **kwargs))
@@ -104,7 +104,7 @@ def PassBackGeant4SelectorCfg(flags, name="ISF_PassBackGeant4Selector", **kwargs
 
 def DefaultFastCaloSimSelectorCfg(flags, name="ISF_DefaultFastCaloSimSelector", **kwargs):
     acc = FastCaloSimSvcCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_FastCaloSimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.FastCaloSim)
     acc.merge(DefaultSimSelectorCfg(flags, name, **kwargs))
@@ -113,7 +113,7 @@ def DefaultFastCaloSimSelectorCfg(flags, name="ISF_DefaultFastCaloSimSelector",
 
 def DefaultLegacyAFIIFastCaloSimSelectorCfg(flags, name="ISF_DefaultLegacyAFIIFastCaloSimSelector", **kwargs):
     acc = LegacyAFIIFastCaloSimSvcCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_LegacyAFIIFastCaloSimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.FastCaloSim)
     acc.merge(DefaultSimSelectorCfg(flags, name, **kwargs))
@@ -122,7 +122,7 @@ def DefaultLegacyAFIIFastCaloSimSelectorCfg(flags, name="ISF_DefaultLegacyAFIIFa
 
 def DefaultFastCaloSimV2SelectorCfg(flags, name="ISF_DefaultFastCaloSimV2Selector", **kwargs):
     acc = FastCaloSimV2SvcCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_FastCaloSimSvcV2"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.FastCaloSimV2)
     acc.merge(DefaultSimSelectorCfg(flags, name, **kwargs))
@@ -131,7 +131,7 @@ def DefaultFastCaloSimV2SelectorCfg(flags, name="ISF_DefaultFastCaloSimV2Selecto
 
 def DefaultDNNCaloSimSelectorCfg(flags, name="ISF_DefaultDNNCaloSimSelector", **kwargs):
     acc = DNNCaloSimSvcCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_DNNCaloSimSvc"))
     acc.merge(DefaultSimSelectorCfg(flags, name, **kwargs))
     return acc
@@ -140,7 +140,7 @@ def DefaultDNNCaloSimSelectorCfg(flags, name="ISF_DefaultDNNCaloSimSelector", **
 def FastHitConvAlgFastCaloSimSelectorCfg(flags, name="ISF_FastHitConvAlgFastCaloSimSelector", **kwargs):
     acc = ComponentAccumulator()
     acc.merge(FastHitConvAlgFastCaloSimSvcCfg(flags))
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_FastHitConvAlgFastCaloSimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.FastCaloSim)
     acc.merge(DefaultSimSelectorCfg(flags, name, **kwargs))
@@ -150,7 +150,7 @@ def FastHitConvAlgFastCaloSimSelectorCfg(flags, name="ISF_FastHitConvAlgFastCalo
 def FastHitConvAlgLegacyAFIIFastCaloSimSelectorCfg(flags, name="ISF_FastHitConvAlgLegacyAFIIFastCaloSimSelector", **kwargs):
     acc = ComponentAccumulator()
     acc.merge(FastHitConvAlgLegacyAFIIFastCaloSimSvcCfg(flags))
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_FastHitConvAlgLegacyAFIIFastCaloSimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.FastCaloSim)
     acc.merge(DefaultSimSelectorCfg(flags, name, **kwargs))
@@ -159,7 +159,7 @@ def FastHitConvAlgLegacyAFIIFastCaloSimSelectorCfg(flags, name="ISF_FastHitConvA
 
 def DefaultFatrasSelectorCfg(flags, name="ISF_DefaultFatrasSelector", **kwargs):
     acc = fatrasSimServiceIDCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_FatrasSimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Fatras)
     acc.merge(DefaultSimSelectorCfg(flags, name, **kwargs))
@@ -169,7 +169,7 @@ def DefaultFatrasSelectorCfg(flags, name="ISF_DefaultFatrasSelector", **kwargs):
 def DefaultFatrasNewExtrapolationSelectorCfg(flags, name="ISF_DefaultFatrasNewExtrapolationSelector", **kwargs):
     acc = ComponentAccumulator()
     acc.merge(fatrasNewExtrapolationSimServiceIDCfg(flags))
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_FatrasNewExtrapolationSimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Fatras)
     acc.merge(DefaultSimSelectorCfg(flags, name, **kwargs))
@@ -178,7 +178,7 @@ def DefaultFatrasNewExtrapolationSelectorCfg(flags, name="ISF_DefaultFatrasNewEx
 
 def DefaultParametricSimulationSelectorCfg(flags, name="ISF_DefaultParametricSimulationSelector", **kwargs):
     acc = ComponentAccumulator()
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", "ISF_ParametricSimSvc") # TODO
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Parametric)
     acc.merge(DefaultSimSelectorCfg(flags, name, **kwargs))
@@ -196,7 +196,7 @@ def FatrasPileupSelectorCfg(flags, name="ISF_FatrasPileupSelector", **kwargs):
     acc = ComponentAccumulator()
     acc.merge(fatrasPileupSimServiceIDCfg(flags))
     kwargs.setdefault("PileupBCID", [1])
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_FatrasPileupSimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.FatrasPileup)
     acc.merge(PileupSimSelectorCfg(flags, name, **kwargs))
@@ -210,7 +210,7 @@ def FatrasPileupSelectorCfg(flags, name="ISF_FatrasPileupSelector", **kwargs):
 def FastCaloSimPileupSelectorCfg(flags, name="ISF_FastCaloSimPileupSelector", **kwargs):
     acc = FastCaloSimPileupSvcCfg(flags)
     kwargs.setdefault("PileupBCID"  , flags.Sim.FastChain.BCID)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_FastCaloSimPileupSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.FastCaloSimPileup)
     acc.merge(PileupSimSelectorCfg(flags, name, **kwargs))
@@ -220,7 +220,7 @@ def FastCaloSimPileupSelectorCfg(flags, name="ISF_FastCaloSimPileupSelector", **
 def FastCaloSimPileupOTSelectorCfg(flags, name="ISF_FastCaloSimPileupOTSelector", **kwargs):
     acc = FastCaloSimPileupOTSvcCfg(flags)
     kwargs.setdefault("PileupBCID", flags.Sim.FastChain.BCID)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_FastCaloSimPileupOTSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.FastCaloSimPileup)
     acc.merge(PileupSimSelectorCfg(flags, name, **kwargs))
@@ -231,7 +231,7 @@ def FastCaloSimPileupOTSelectorCfg(flags, name="ISF_FastCaloSimPileupOTSelector"
 def ElectronGeant4SelectorCfg(flags, name="ISF_ElectronGeant4Selector", **kwargs):
     acc = Geant4SimCfg(flags)
     kwargs.setdefault("ParticlePDG", 11)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISFG4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     acc.addPublicTool(CompFactory.ISF.KinematicSimSelector(name, **kwargs))
@@ -241,7 +241,7 @@ def ElectronGeant4SelectorCfg(flags, name="ISF_ElectronGeant4Selector", **kwargs
 def NeutralGeant4SelectorCfg(flags, name="ISF_NeutralGeant4Selector", **kwargs):
     acc = Geant4SimCfg(flags)
     kwargs.setdefault("Charge", 0)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISFG4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     acc.addPublicTool(CompFactory.ISF.KinematicSimSelector(name, **kwargs))
@@ -252,7 +252,7 @@ def ProtonAFIIGeant4SelectorCfg(flags, name="ISF_ProtonAFIIGeant4Selector", **kw
     acc = AFIIGeant4SimCfg(flags)
     kwargs.setdefault("MaxMom", 750)
     kwargs.setdefault("ParticlePDG", 2212)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_AFIIGeant4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     acc.addPublicTool(CompFactory.ISF.KinematicSimSelector(name, **kwargs))
@@ -261,7 +261,7 @@ def ProtonAFIIGeant4SelectorCfg(flags, name="ISF_ProtonAFIIGeant4Selector", **kw
 
 def ProtonAFII_QS_Geant4SelectorCfg(flags, name="ISF_ProtonAFII_QS_Geant4Selector", **kwargs):
     acc = AFII_QS_Geant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_AFII_QS_Geant4SimSvc"))
     acc.merge(ProtonAFIIGeant4SelectorCfg(flags, name, **kwargs))
     return acc
@@ -271,7 +271,7 @@ def PionAFIIGeant4SelectorCfg(flags, name="ISF_PionAFIIGeant4Selector", **kwargs
     acc = AFIIGeant4SimCfg(flags)
     kwargs.setdefault("MaxMom", 200)
     kwargs.setdefault("ParticlePDG", 211)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_AFIIGeant4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     acc.addPublicTool(CompFactory.ISF.KinematicSimSelector(name, **kwargs))
@@ -282,7 +282,7 @@ def PionG4FastCaloGeant4Selector(flags, name="ISF_PionG4FastCaloGeant4Selector",
     acc = AFIIGeant4SimCfg(flags)
     kwargs.setdefault("MaxEkin", 200)
     kwargs.setdefault("ParticlePDG", 211)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_AFIIGeant4SimSvc"))
     acc.addPublicTool(CompFactory.ISF.KinematicSimSelector(name, **kwargs))
     return acc
@@ -292,7 +292,7 @@ def ProtonG4FastCaloGeant4Selector(flags, name="ISF_ProtonG4FastCaloGeant4Select
     acc = AFIIGeant4SimCfg(flags)
     kwargs.setdefault("MaxEkin", 400)
     kwargs.setdefault("ParticlePDG", 2212)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_AFIIGeant4SimSvc"))
     acc.addPublicTool(CompFactory.ISF.KinematicSimSelector(name, **kwargs))
     return acc
@@ -302,7 +302,7 @@ def NeutronG4FastCaloGeant4Selector(flags, name="ISF_NeutronG4FastCaloGeant4Sele
     acc = AFIIGeant4SimCfg(flags)
     kwargs.setdefault("MaxEkin", 400)
     kwargs.setdefault("ParticlePDG", 2112)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_AFIIGeant4SimSvc"))
     acc.addPublicTool(CompFactory.ISF.KinematicSimSelector(name, **kwargs))
     return acc
@@ -312,7 +312,7 @@ def ChargedKaonG4FastCaloGeant4Selector(flags, name="ISF_ChargedKaonG4FastCaloGe
     acc = AFIIGeant4SimCfg(flags)
     kwargs.setdefault("MaxEkin", 400)
     kwargs.setdefault("ParticlePDG", 321)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_AFIIGeant4SimSvc"))
     acc.addPublicTool(CompFactory.ISF.KinematicSimSelector(name, **kwargs))
     return acc
@@ -322,7 +322,7 @@ def KLongG4FastCaloGeant4Selector(flags, name="ISF_KLongG4FastCaloGeant4Selector
     acc = AFIIGeant4SimCfg(flags)
     kwargs.setdefault("MaxEkin", 400)
     kwargs.setdefault("ParticlePDG", 130)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_AFIIGeant4SimSvc"))
     acc.addPublicTool(CompFactory.ISF.KinematicSimSelector(name, **kwargs))
     return acc
@@ -330,7 +330,7 @@ def KLongG4FastCaloGeant4Selector(flags, name="ISF_KLongG4FastCaloGeant4Selector
 
 def PionAFII_QS_Geant4SelectorCfg(flags, name="ISF_PionAFII_QS_Geant4Selector", **kwargs):
     acc = AFII_QS_Geant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_AFII_QS_Geant4SimSvc"))
     acc.merge(PionAFIIGeant4SelectorCfg(flags, name, **kwargs))
     return acc
@@ -340,7 +340,7 @@ def ChargedKaonAFIIGeant4SelectorCfg(flags, name="ISF_ChargedKaonAFIIGeant4Selec
     acc = AFIIGeant4SimCfg(flags)
     kwargs.setdefault("MaxMom", 750)
     kwargs.setdefault("ParticlePDG", 321)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_AFIIGeant4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     acc.addPublicTool(CompFactory.ISF.KinematicSimSelector(name, **kwargs))
@@ -349,7 +349,7 @@ def ChargedKaonAFIIGeant4SelectorCfg(flags, name="ISF_ChargedKaonAFIIGeant4Selec
 
 def ChargedKaonAFII_QS_Geant4SelectorCfg(flags, name="ISF_ChargedKaonAFII_QS_Geant4Selector", **kwargs):
     acc = AFII_QS_Geant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_AFII_QS_Geant4SimSvc"))
     acc.merge(ChargedKaonAFIIGeant4SelectorCfg(flags, name, **kwargs))
     return acc
@@ -359,7 +359,7 @@ def KLongAFIIGeant4SelectorCfg(flags, name="ISF_KLongAFIIGeant4Selector", **kwar
     acc = AFIIGeant4SimCfg(flags)
     kwargs.setdefault("MaxMom", 750)
     kwargs.setdefault("ParticlePDG", 130)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_AFIIGeant4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     acc.addPublicTool(CompFactory.ISF.KinematicSimSelector(name, **kwargs))
@@ -368,7 +368,7 @@ def KLongAFIIGeant4SelectorCfg(flags, name="ISF_KLongAFIIGeant4Selector", **kwar
 
 def KLongAFII_QS_Geant4SelectorCfg(flags, name="ISF_KLongAFII_QS_Geant4Selector", **kwargs):
     acc = AFII_QS_Geant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_AFII_QS_Geant4SimSvc"))
     acc.merge(KLongAFIIGeant4SelectorCfg(flags, name, **kwargs))
     return acc
@@ -383,7 +383,7 @@ def MuonSelectorCfg(flags, name="ISF_MuonSelector", **kwargs):
 
 def MuonGeant4SelectorCfg(flags, name="ISF_MuonGeant4Selector", **kwargs):
     acc = Geant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISFG4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     acc.merge(MuonSelectorCfg(flags, name, **kwargs))
@@ -392,7 +392,7 @@ def MuonGeant4SelectorCfg(flags, name="ISF_MuonGeant4Selector", **kwargs):
 
 def MuonAFIIGeant4SelectorCfg(flags, name="ISF_MuonAFIIGeant4Selector", **kwargs):
     acc = AFIIGeant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_AFIIGeant4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     acc.merge(MuonGeant4SelectorCfg(flags, name, **kwargs))
@@ -401,7 +401,7 @@ def MuonAFIIGeant4SelectorCfg(flags, name="ISF_MuonAFIIGeant4Selector", **kwargs
 
 def MuonAFII_QS_Geant4SelectorCfg(flags, name="ISF_MuonAFII_QS_Geant4Selector", **kwargs):
     acc = AFII_QS_Geant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_AFII_QS_Geant4SimSvc"))
     acc.merge(MuonGeant4SelectorCfg(flags, name, **kwargs))
     return acc
@@ -409,7 +409,7 @@ def MuonAFII_QS_Geant4SelectorCfg(flags, name="ISF_MuonAFII_QS_Geant4Selector",
 
 def MuonFatrasSelectorCfg(flags, name="ISF_MuonFatrasSelector", **kwargs):
     acc = fatrasSimServiceIDCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_FatrasSimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Fatras)
     acc.merge(MuonSelectorCfg(flags, name, **kwargs))
@@ -419,7 +419,7 @@ def MuonFatrasSelectorCfg(flags, name="ISF_MuonFatrasSelector", **kwargs):
 def MuonFatrasPileupSelectorCfg(flags, name="ISF_MuonFatrasPileupSelector", **kwargs):
     acc = ComponentAccumulator()
     acc.merge(fatrasPileupSimServiceIDCfg(flags))
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_FatrasPileupSimSvc"))
     kwargs.setdefault("PileupBCID", [1])
     kwargs.setdefault("ParticlePDG", 13)
@@ -430,7 +430,7 @@ def MuonFatrasPileupSelectorCfg(flags, name="ISF_MuonFatrasPileupSelector", **kw
 
 def WithinEta5FastCaloSimSelectorCfg(flags, name="ISF_WithinEta5FastCaloSimSelector", **kwargs):
     acc = FastCaloSimSvcCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_FastCaloSimSvc"))
     kwargs.setdefault("MinPosEta", -5.0)
     kwargs.setdefault("MaxPosEta",  5.0)
@@ -441,7 +441,7 @@ def WithinEta5FastCaloSimSelectorCfg(flags, name="ISF_WithinEta5FastCaloSimSelec
 
 def EtaGreater5ParticleKillerSimSelectorCfg(flags, name="ISF_EtaGreater5ParticleKillerSimSelector", **kwargs):
     acc = ParticleKillerSvcCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_ParticleKillerSvc"))
     kwargs.setdefault("MinPosEta", -5.0)
     kwargs.setdefault("MaxPosEta",  5.0)
@@ -453,7 +453,7 @@ def EtaGreater5ParticleKillerSimSelectorCfg(flags, name="ISF_EtaGreater5Particle
 
 def EtaGreater5PileupParticleKillerSimSelectorCfg(flags, name="ISF_EtaGreater5PileupParticleKillerSimSelector", **kwargs):
     acc = ParticleKillerSvcCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_ParticleKillerSvc"))
     kwargs.setdefault("MinPosEta", -5.0)
     kwargs.setdefault("MaxPosEta",  5.0)
@@ -476,7 +476,7 @@ def PhotonConeSelectorCfg(flags, name="ISF_PhotonConeSelector", **kwargs):
 
 def PhotonConeFatrasSelectorCfg(flags, name="ISF_PhotonConeFatrasSelector", **kwargs):
     acc = fatrasSimServiceIDCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_FatrasSimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Fatras)
     acc.merge(PhotonConeSelectorCfg(flags, name, **kwargs))
@@ -485,7 +485,7 @@ def PhotonConeFatrasSelectorCfg(flags, name="ISF_PhotonConeFatrasSelector", **kw
 
 def PhotonConeGeant4SelectorCfg(flags, name="ISF_PhotonConeGeant4Selector", **kwargs):
     acc = Geant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISFG4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     acc.merge(PhotonConeSelectorCfg(flags, name, **kwargs))
@@ -508,7 +508,7 @@ def HiggsLeptonsConeSimSelectorCfg(flags, name="ISF_HiggsLeptonsConeSimSelector"
 
 def HiggsLeptonsConeGeant4SelectorCfg(flags, name="ISF_HiggsLeptonsConeGeant4Selector", **kwargs):
     acc = Geant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISFG4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     acc.merge(HiggsLeptonsConeSimSelectorCfg(flags, name, **kwargs))
@@ -530,7 +530,7 @@ def HiggsLeptonsConeGeant4CaloSelectorCfg(flags, name="ISF_HiggsLeptonsConeGeant
 
 def WLeptonsConeGeant4SelectorCfg(flags, name="ISF_WLeptonsConeGeant4Selector", **kwargs):
     acc = Geant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISFG4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     kwargs.setdefault("ConeCreatorMinPt", 0.)
@@ -548,7 +548,7 @@ def ZLeptonsDirectionConeGeant4SelectorCfg(flags, name="ISF_ZLeptonsDirectionCon
     # this selector picks all particles with a mometum direction
     # within DeltaR<ConeSize relative to the Z decay lepton directions
     acc = Geant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISFG4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     kwargs.setdefault("ConeCreatorMinPt", 0.)
@@ -571,7 +571,7 @@ def ZLeptonsPositionConeGeant4SelectorCfg(flags, name="ISF_ZLeptonsPositionConeG
 
 def JPsiLeptonsConeGeant4SelectorCfg(flags, name="ISF_JPsiLeptonsConeGeant4Selector", **kwargs):
     acc = Geant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISFG4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     kwargs.setdefault("ConeCreatorMinPt", 0.)
@@ -603,7 +603,7 @@ def BHadronProductsSimSelectorCfg(flags, name="ISF_BHadronProductsSimSelector",
 
 def BHadronProductsGeant4SelectorCfg(flags, name="ISF_BHadronProductsGeant4Selector", **kwargs):
     acc = Geant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISFG4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     acc.merge(BHadronProductsSimSelectorCfg(flags, name, **kwargs))
@@ -612,7 +612,7 @@ def BHadronProductsGeant4SelectorCfg(flags, name="ISF_BHadronProductsGeant4Selec
 
 def BHadronProductsFatrasSelectorCfg(flags, name="ISF_BHadronProductsFatrasSelector", **kwargs):
     acc = fatrasSimServiceIDCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISF_FatrasSimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Fatras)
     acc.merge(BHadronProductsSimSelectorCfg(flags, name, **kwargs))
@@ -631,7 +631,7 @@ def TauProductsSimSelectorCfg(flags, name="ISF_TauProductsSimSelector", **kwargs
 
 def TauProductsGeant4SelectorCfg(flags, name="ISF_TauProductsGeant4Selector", **kwargs):
     acc = Geant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISFG4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     acc.merge(TauProductsSimSelectorCfg(flags, name, **kwargs))
@@ -650,7 +650,7 @@ def ZProductsSimSelectorCfg(flags, name="ISF_ZProductsSimSelector", **kwargs):
 
 def ZProductsGeant4SelectorCfg(flags, name="ISF_ZProductsGeant4Selector", **kwargs):
     acc = Geant4SimCfg(flags)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISFG4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     acc.merge(ZProductsSimSelectorCfg(flags, name, **kwargs))
@@ -661,7 +661,7 @@ def ZProductsGeant4SelectorCfg(flags, name="ISF_ZProductsGeant4Selector", **kwar
 def SubDetStickyGeant4SimSelectorCfg(flags, name="ISF_SubDetStickyGeant4SimSelector", **kwargs):
     acc = Geant4SimCfg(flags)
     kwargs.setdefault("RequiresUnchangedGeoID", True)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("PrevSimSvc", acc.getService("ISFG4SimSvc"))
         kwargs.setdefault("Simulator", acc.getService("ISFG4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
@@ -673,7 +673,7 @@ def GlobalStickyGeant4SimSelectorCfg(flags, name="ISF_GlobalStickyGeant4SimSelec
     acc = Geant4SimCfg(flags)
     kwargs.setdefault("PrevSimSvc", acc.getService("ISFG4SimSvc"))
     kwargs.setdefault("RequiresUnchangedGeoID", False)
-    if flags.Concurrency.NumThreads == 0:
+    if flags.Concurrency.NumThreads == 0 and 'MT' not in flags.Sim.ISF.Simulator:
         kwargs.setdefault("Simulator", acc.getService("ISFG4SimSvc"))
     kwargs.setdefault("SimulationFlavor", SimulationFlavor.Geant4)
     acc.addPublicTool(CompFactory.ISF.HistorySimSelector(name, **kwargs))
diff --git a/Simulation/SimuJobTransforms/python/ISF_Skeleton.py b/Simulation/SimuJobTransforms/python/ISF_Skeleton.py
index 2073c899f084..a5396254fdfa 100644
--- a/Simulation/SimuJobTransforms/python/ISF_Skeleton.py
+++ b/Simulation/SimuJobTransforms/python/ISF_Skeleton.py
@@ -4,44 +4,6 @@ import sys
 from PyJobTransforms.CommonRunArgsToFlags import commonRunArgsToFlags
 from OverlayConfiguration.OverlayHelpers import accFromFragment
 
-# based on https://acode-browser1.usatlas.bnl.gov/lxr/source/athena/Control/AthenaServices/python/Configurables.py#0247
-def EvtIdModifierSvc_add_modifier(svc,
-        run_nbr=None, evt_nbr=None, time_stamp=None, lbk_nbr=None,
-        nevts=1):
-    if run_nbr is None:
-        modify_run_nbr = 0
-        run_nbr = 0
-    else:
-        modify_run_nbr = 1
-
-
-    if evt_nbr is None:
-        modify_evt_nbr = 0
-        evt_nbr = 0
-    else:
-        modify_evt_nbr = 1
-
-    if time_stamp is None:
-        modify_time_stamp = 0
-        time_stamp = 0
-    else:
-        modify_time_stamp = 1
-
-    if lbk_nbr is None:
-        modify_lbk_nbr = 0
-        lbk_nbr = 0
-    else:
-        modify_lbk_nbr = 1
-
-    mod_bit = int(0b0000
-                | (modify_run_nbr << 0)
-                | (modify_evt_nbr << 1)
-                | (modify_time_stamp << 2)
-                | (modify_lbk_nbr << 3))
-
-    svc.Modifiers += [run_nbr, evt_nbr, time_stamp, lbk_nbr,
-                    nevts, mod_bit]
-
 def defaultSimulationFlags(ConfigFlags):
     """Fill default simulation flags"""
     # TODO: how to autoconfigure those
@@ -137,6 +99,8 @@ def fromRunArgs(runArgs):
 
     if hasattr(runArgs, 'DataRunNumber'):
         ConfigFlags.Input.RunNumber = [runArgs.DataRunNumber] # is it updating?
+        ConfigFlags.Input.OverrideRunNumber = True
+        ConfigFlags.Input.LumiBlockNumber = [1] # dummy value
 
     if hasattr(runArgs, 'outputHITSFile'):
         ConfigFlags.Sim.PhysicsList = runArgs.physicsList
@@ -180,26 +144,6 @@ def fromRunArgs(runArgs):
     from AthenaPoolCnvSvc.PoolWriteConfig import PoolWriteCfg
     cfg.merge(PoolReadCfg(ConfigFlags))
     cfg.merge(PoolWriteCfg(ConfigFlags))
-    # todo its own cfg ...
-    #todo check evtMax=-1 works with this method
-    myRunNumber = 284500
-    myFirstLB = 1
-    myInitialTimeStamp = 1446539185
-    from AthenaConfiguration.ComponentFactory import CompFactory
-    evtIdModifierSvc = CompFactory.EvtIdModifierSvc(EvtStoreName="StoreGateSvc")
-    iovDbMetaDataTool = CompFactory.IOVDbMetaDataTool()
-    iovDbMetaDataTool.MinMaxRunNumbers = [myRunNumber, 2147483647]
-    cfg.addPublicTool(iovDbMetaDataTool)
-    EvtIdModifierSvc_add_modifier(evtIdModifierSvc, run_nbr=myRunNumber, lbk_nbr=myFirstLB, time_stamp=myInitialTimeStamp, nevts=evtMax)
-    eventSelector = cfg.getService("EventSelector")
-    eventSelector.OverrideRunNumber = True
-    eventSelector.RunNumber = myRunNumber
-    eventSelector.FirstLB = myFirstLB
-    eventSelector.InitialTimeStamp = myInitialTimeStamp # Necessary to avoid a crash
-    if hasattr(eventSelector, "OverrideRunNumberFromInput"):
-        eventSelector.OverrideRunNumberFromInput = True
-    cfg.addService(evtIdModifierSvc, create=True)
-    # ... up to here?
 
     # add BeamEffectsAlg
     from BeamEffects.BeamEffectsAlgConfig import BeamEffectsAlgCfg
-- 
GitLab


From 03a10aae3f8edffc8508d1d5417ebc3e86ae654b Mon Sep 17 00:00:00 2001
From: Fernando Monticelli <fernando.monticelli@cern.ch>
Date: Tue, 22 Dec 2020 15:18:39 +0000
Subject: [PATCH 222/225] Fixed Flake8 warning

---
 .../TrigEgammaAnalysisTools/CMakeLists.txt    |   3 +-
 .../python/TrigEgammaAnalysisToolsConfig.py   |  24 +-
 .../python/TrigEgammaMonToolConfig.py         |  95 ---
 .../python/TrigEgammaMonToolConfig50ns.py     | 112 ---
 .../python/TrigEgammaPhysValMonToolConfig.py  |  94 ---
 .../python/TrigEgammaProbelist.py             | 786 +++++++++---------
 .../share/testTrigEgammaAnalysisTools.py      | 117 ---
 .../share/testTrigEgammaAnalysisToolsGRL.py   | 200 -----
 .../testTrigEgammaAnalysisTools_emulator.py   | 250 ------
 .../share/testTrigEgammaEventSelectionTool.py | 195 -----
 10 files changed, 397 insertions(+), 1479 deletions(-)
 delete mode 100644 Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaMonToolConfig.py
 delete mode 100644 Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaMonToolConfig50ns.py
 delete mode 100644 Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaPhysValMonToolConfig.py
 delete mode 100755 Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisTools.py
 delete mode 100755 Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisToolsGRL.py
 delete mode 100644 Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisTools_emulator.py
 delete mode 100644 Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaEventSelectionTool.py

diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/CMakeLists.txt b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/CMakeLists.txt
index a0bcc2ad4760..e1a73b62b672 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/CMakeLists.txt
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/CMakeLists.txt
@@ -22,8 +22,7 @@ atlas_add_component( TrigEgammaAnalysisTools
    LINK_LIBRARIES AsgTools AthenaBaseComps AthenaMonitoringLib TrigEgammaAnalysisToolsLib xAODEgamma )
 
 # Install files from the package:
-atlas_install_python_modules( python/TrigEgamma*.py )
-atlas_install_joboptions( share/test*.py )
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
 atlas_install_generic( share/trigEgammaDQ.py share/get_trigEgammaDQ.sh 
    DESTINATION share
    EXECUTABLE )
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaAnalysisToolsConfig.py b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaAnalysisToolsConfig.py
index e9cba421f6d3..c914e5a01165 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaAnalysisToolsConfig.py
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaAnalysisToolsConfig.py
@@ -8,25 +8,19 @@ from TrigEgammaAnalysisTools import TrigEgammaAnalysisToolsConf
 from AthenaCommon import CfgMgr
 from AthenaCommon.AppMgr import ToolSvc
 
-from egammaRec.Factories import PublicToolFactory,FcnWrapper,AlgFactory, getPropertyValue 
+from egammaRec.Factories import PublicToolFactory
 
 import PyUtils.RootUtils as ru
 ROOT = ru.import_root()
 import cppyy
 cppyy.load_library('libElectronPhotonSelectorToolsDict')
-from ROOT import LikeEnum
-from ROOT import egammaPID
 
 # Following loads the online selectors
 from TrigEgammaHypo.TrigEgammaPidTools import ElectronPidTools
 from TrigEgammaHypo.TrigEgammaPidTools import PhotonPidTools
-from TrigEgammaHypo.TrigEgammaPidTools import ElectronToolName
 ElectronPidTools()
 PhotonPidTools()
 
-from ElectronPhotonSelectorTools.ElectronPhotonSelectorToolsConf import AsgElectronIsEMSelector, AsgElectronLikelihoodTool
-from ElectronPhotonSelectorTools.ElectronIsEMSelectorMapping import ElectronIsEMMap,electronPIDmenu
-
 # Offline selectors -- taken from latest conf
 LooseElectronSelector             = CfgMgr.AsgElectronIsEMSelector("T0HLTLooseElectronSelector")
 MediumElectronSelector            = CfgMgr.AsgElectronIsEMSelector("T0HLTMediumElectronSelector")
@@ -67,7 +61,7 @@ LuminosityCondAlgOnlineDefault (suffix = 'Online')
 IneffLabels=["ClusterEtaRange","ConversionMatch","ClusterHadronicLeakage","ClusterMiddleEnergy","ClusterMiddleEratio37","ClusterMiddleEratio33","ClusterMiddleWidth","f3","ClusterStripsEratio","ClusterStripsDeltaEmax2","ClusterStripsDeltaE","ClusterStripsWtot","ClusterStripsFracm","ClusterStripsWeta1c","empty14","ClusterStripsDEmaxs1","TrackBlayer","TrackPixel","TrackSi","TrackA0","TrackMatchEta","TrackMatchPhi","TrackMatchEoverP","TrackTRTeProbabilityHT_Electron","TrackTRThits","TrackTRTratio","TrackTRTratio90","TrackA0Tight","TrackMatchEtaTight","Isolation","ClusterIsolation","TrackIsolation","No Track","No Cluster","No Object"]
 
 from TrigEgammaAnalysisTools.TrigEgammaProbelist import monitoring_mam, monitoring_electron, monitoring_photon 
-from TrigEgammaAnalysisTools.TrigEgammaProbelist import monitoringTP_electron, monitoringTP_electronZee, monitoringTP_electronJpsiee 
+from TrigEgammaAnalysisTools.TrigEgammaProbelist import monitoringTP_electron,  monitoringTP_electronJpsiee 
 
 from TrigEgammaMatchingTool.TrigEgammaMatchingToolConf import Trig__TrigEgammaMatchingTool
 
@@ -197,9 +191,6 @@ TrigEgammaNavAnalysisTool = PublicToolFactory(TrigEgammaAnalysisToolsConf.TrigEg
 #############################################################################################
 # Functions
 
-# Function to return triggerlist tools
-def getAllTools():
-    return [TrigEgammaNavZeeTPCounts(),TrigEgammaNavZeeTPEff(),TrigEgammaNavZeeTPIneff(),TrigEgammaNavZeeTPRes(),]
 
 
 def setRunFlag( runFlag ):
@@ -230,12 +221,6 @@ def setRunFlag( runFlag ):
 
 
 
-# The main algorithm
-# Add triggerlist tools to ToolHandleArray 
-TrigEgammaAnalysisAlg = AlgFactory(TrigEgammaAnalysisToolsConf.TrigEgammaAnalysisAlg, 
-        name='TrigEgammaAnalysisAlg',
-        Tools = FcnWrapper(getAllTools),
-        )
 
 
 
@@ -246,10 +231,7 @@ def getEventSelectionTool(runFlag):
   from TrigEgammaEmulationTool.TrigEgammaEmulationPidToolsConfig import getEgammaIsEMSelectorCaloOnly, \
                                                                         getElectronIsEMSelector,\
                                                                         getEgammaLikelihoodSelectorCaloOnly, \
-                                                                        getElectronLikelihoodSelector2015,\
                                                                         getElectronLikelihoodSelectorNoD0
-  from AthenaCommon import CfgMgr
-  from AthenaCommon.AppMgr import ToolSvc
   # create all selector list. Here, the order is matter. Please check the 
   
   setRunFlag(runFlag)
@@ -277,7 +259,7 @@ def getEventSelectionTool(runFlag):
           ElectronKey = 'Electrons',
           MatchTool = EgammaMatchTool,
           PlotTool=TrigEgammaPlotTool,
-          EmulationTool=EmulationTool, # The emulation must be on in this tool.
+          #EmulationTool=EmulationTool, # The emulation must be on in this tool.
           doEmulation=True,
           Tools=[],
           isEMResultNames=["Tight","Medium","Loose"],
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaMonToolConfig.py b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaMonToolConfig.py
deleted file mode 100644
index 96f9961fb6f5..000000000000
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaMonToolConfig.py
+++ /dev/null
@@ -1,95 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-def TrigEgammaMonTool():
-    #from AthenaCommon.AppMgr import ToolSvc
-    from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConfig import TrigEgammaNavAnalysisTool,TrigEgammaNavTPAnalysisTool,TrigEgammaNavTPJpsieeAnalysisTool
-    from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConfig import TrigEgammaPlotTool
-    from TrigEgammaAnalysisTools.TrigEgammaProbelist import monitoring_mam, monitoring_electron, monitoring_photon 
-    from TrigEgammaAnalysisTools.TrigEgammaProbelist import monitoringTP_electron, monitoringTP_electronZee, monitoringTP_electronJpsiee 
-
-
-    #Define the base path for all histograms
-    basePath = '/HLT/Egamma'
-    
-    tagItems     = ['HLT_e24_lhmedium_iloose_L1EM18VH',
-                    'HLT_e24_lhmedium_iloose_L1EM20VH',
-                    'HLT_e24_lhtight_iloose',
-                    'HLT_e26_lhtight_iloose',
-                    # Primary cut-based electron triggers
-                    'HLT_e24_medium_iloose_L1EM18VH',
-                    'HLT_e24_medium_iloose_L1EM20VH',
-                    'HLT_e24_tight_iloose',
-                    'HLT_e26_tight_iloose']
-
-    JpsitagItems = ['HLT_e5_tight_e4_etcut',
-                    'HLT_e9_tight_e4_etcut',
-                    'HLT_e14_tight_e4_etcut',
-                    'HLT_e9_etcut_e5_tight',
-                    'HLT_e14_etcut_e5_tight',
-                    # Primary cut-based electron triggers
-                    'HLT_e5_tight_e4_etcut_Jpsiee',
-                    'HLT_e9_tight_e4_etcut_Jpsiee',
-                    'HLT_e14_tight_e4_etcut_Jpsiee',
-                    'HLT_e9_etcut_e5_tight_Jpsiee',
-                    'HLT_e14_etcut_e5_tight_Jpsiee']
-
-    #Configure the TrigEgammaPlotTool
-    PlotTool = TrigEgammaPlotTool.copy(name="TrigEgammaPlotTool",
-            DirectoryPath=basePath,
-            MaM=monitoring_mam,
-            Efficiency=["eff_et","eff_eta","eff_mu"],
-            Distribution=["et","eta","d0","d0sig"],
-            Resolution=["res_et","res_eta","res_Rhad","res_Rphi","res_Reta"])
-
-    #Configure emulation tools
-    #from TrigEgammaEmulationTool.TrigEgammaEmulationToolConfig import TrigEgammaEmulationTool
-    #EmulationPhotonTool     = TrigEgammaEmulationTool.copy( TriggerList = monitoring_photon          , name = "EmulationPhotonTool"     )
-    #EmulationElectronTool   = TrigEgammaEmulationTool.copy( TriggerList = monitoring_electron        , name = "EmulationElectronTool"   )
-    #EmulationTPElectronTool = TrigEgammaEmulationTool.copy( TriggerList = monitoringTP_electron      , name = "EmulationTPElectronTool" )
-    #EmulationJpsieeTool     = TrigEgammaEmulationTool.copy( TriggerList = monitoringTP_electronJpsiee, name = "EmulationJpsieeTool"     )
-
-
-    ElectronAnalysis = TrigEgammaNavAnalysisTool(name='NavElectronAnalysis',
-            Analysis='Electrons',
-            PlotTool=PlotTool,
-            TriggerList=monitoring_electron,
-            File="",
-            #doEmulation=True,
-            #EmulationTool=EmulationElectronTool,
-            OutputLevel=0,DetailedHistograms=False)
-    PhotonAnalysis = TrigEgammaNavAnalysisTool(name='NavPhotonAnalysis',
-            Analysis='Photons',
-            PlotTool=PlotTool,
-            TriggerList=monitoring_photon,
-            File="",
-            #doEmulation=True,
-            #EmulationTool=EmulationPhotonTool,
-            OutputLevel=0,DetailedHistograms=False)
-    TPAnalysis = TrigEgammaNavTPAnalysisTool(name='NavTPAnalysis',
-            Analysis='Zee',
-            PlotTool=PlotTool,
-            TriggerList=monitoringTP_electron,
-            File="",
-            TagTriggerList=tagItems,
-            #doEmulation=True,
-            #EmulationTool=EmulationTPElectronTool,
-            RemoveCrack=False,
-            OutputLevel=0,DetailedHistograms=False)
-    JpsiTPAnalysis = TrigEgammaNavTPJpsieeAnalysisTool(name='NavTPJpsieeAnalysis',
-                                                        Analysis='Jpsiee',
-                                                        PlotTool=PlotTool,
-                                                        TriggerList=monitoringTP_electronJpsiee,
-                                                        File="",
-                                                        #doEmulation=True,
-                                                        #EmulationTool=EmulationJpsieeTool,
-                                                        TagTriggerList= JpsitagItems)
-
-    from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConf import TrigEgammaMonTool
-    TrigEgammaMonTool = TrigEgammaMonTool( name = "HLTEgammaMon", 
-            histoPathBase=basePath,
-            Tools=[
-                "TrigEgammaNavAnalysisTool/NavPhotonAnalysis",
-                "TrigEgammaNavAnalysisTool/NavElectronAnalysis",
-                "TrigEgammaNavTPAnalysisTool/NavTPAnalysis",
-                "TrigEgammaNavTPAnalysisTool/NavTPJpsieeAnalysis"])
-    #ToolSvc += TrigEgammaMonTool
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaMonToolConfig50ns.py b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaMonToolConfig50ns.py
deleted file mode 100644
index 7af1f7b52df4..000000000000
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaMonToolConfig50ns.py
+++ /dev/null
@@ -1,112 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-def TrigEgammaMonTool():
-    #from AthenaCommon.AppMgr import ToolSvc
-    from AthenaCommon import CfgMgr
-    from ElectronPhotonSelectorTools.ElectronPhotonSelectorToolsConf import AsgElectronIsEMSelector
-    from ElectronPhotonSelectorTools.ElectronIsEMSelectorMapping import ElectronIsEMMap,electronPIDmenu
-    from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConfig import TrigEgammaNavAnalysisTool,TrigEgammaNavTPAnalysisTool,TrigEgammaNavTPJpsieeAnalysisTool
-    from TrigEgammaAnalysisTools.TrigEgammaProbelist import default,defaultJpsi # to import probelist
-    #from TrigHLTMonitoring.HLTMonTriggerList import hltmonList # import MaM trigger list, not available!!!!
-   
-    # Import full trigger menu, requires setup of both MC and Physics
-    # Makes available all possible triggers which can be in any dataset
-    # Set final list from triggers available in data
-    import TriggerMenu.menu.Physics_pp_v5 as physics_menu
-    from TriggerJobOpts.TriggerFlags import TriggerFlags
-
-    # Offline selectors -- taken from latest conf
-    # Offline tunes for 50 ns
-    LooseElectronSelector=CfgMgr.AsgElectronIsEMSelector("LooseElectron50nsSelector")
-    LooseElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150429/ElectronIsEMLooseSelectorCutDefs.conf"
-    ToolSvc+=LooseElectronSelector
-    MediumElectronSelector=CfgMgr.AsgElectronIsEMSelector("MediumElectron50nsSelector")
-    MediumElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150429/ElectronIsEMMediumSelectorCutDefs.conf"
-    ToolSvc+=MediumElectronSelector
-    TightElectronSelector=CfgMgr.AsgElectronIsEMSelector("TightElectron50nsSelector")
-    TightElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150429/ElectronIsEMTightSelectorCutDefs.conf"
-    ToolSvc+=TightElectronSelector
-
-    LooseLHSelector=CfgMgr.AsgElectronLikelihoodTool("LooseLH50nsSelector")
-    LooseLHSelector.ConfigFile="ElectronPhotonSelectorTools/offline/mc15_20150429/ElectronLikelihoodLooseOfflineConfig2015.conf"
-    ToolSvc+=LooseLHSelector
-    MediumLHSelector=CfgMgr.AsgElectronLikelihoodTool("MediumLH50nsSelector")
-    MediumLHSelector.ConfigFile="ElectronPhotonSelectorTools/offline/mc15_20150429/ElectronLikelihoodMediumOfflineConfig2015.conf"
-    ToolSvc+=MediumLHSelector
-    TightLHSelector=CfgMgr.AsgElectronLikelihoodTool("TightLH50nsSelector")
-    TightLHSelector.ConfigFile="ElectronPhotonSelectorTools/offline/mc15_20150429/ElectronLikelihoodTightOfflineConfig2015.conf"
-    ToolSvc+=TightLHSelector
-
-    physics_menu.setupMenu()
-    egammaMenu = TriggerFlags.EgammaSlice.signatures()
-    egammaChains = []
-    l1Items = []
-    addItems = []
-    for egchain in egammaMenu:
-        egammaChains.append(egchain[0])
-        l1Items.append(egchain[1])
-        addItems.append(egchain[3])
-    # Set list to full menu
-    #probelist = egammaChains
-    probelist = default
-    Jpsiprobelist = defaultJpsi
-    #probelist=['e5_loose_idperf','e5_lhloose_idperf','e0_perf_L1EM15','g0_perf_L1EM15']
-
-    basePath = '/HLT/Egamma/'
-    tagItems = ['e24_lhmedium_iloose_L1EM18VH',
-        'e24_lhmedium_iloose_L1EM20VH',
-        'e24_lhtight_iloose',
-        'e26_lhtight_iloose',
-        # Primary cut-based electron triggers
-        'e24_medium_iloose_L1EM18VH',
-        'e24_medium_iloose_L1EM20VH',
-        'e24_tight_iloose',
-        'e26_tight_iloose']
-
-    JpsitagItems = ['e5_tight_e4_etcut',
-                    'e9_tight_e4_etcut',
-                    'e14_tight_e4_etcut',
-                    'e9_etcut_e5_tight',
-                    'e14_etcut_e5_tight',
-                    # Primary cut-based electron triggers
-                    'e5_tight_e4_etcut_Jpsiee',
-                    'e9_tight_e4_etcut_Jpsiee',
-                    'e14_tight_e4_etcut_Jpsiee',
-                    'e9_etcut_e5_tight_Jpsiee',
-                    'e14_etcut_e5_tight_Jpsiee']
-    Analysis = TrigEgammaNavAnalysisTool(name='NavAnalysis',
-            DirectoryPath=basePath+'Analysis',
-            TriggerList=probelist, 
-            ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector],
-            ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector], 
-            File="",
-            OutputLevel=0,DetailedHistograms=False)
-    TPAnalysis = TrigEgammaNavTPAnalysisTool(name='NavTPAnalysis',
-            DirectoryPath=basePath+'TPAnalysis',
-            TriggerList=probelist, 
-            ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector],
-            ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector], 
-            File="",
-            TagTriggerList=tagItems,
-            RemoveCrack=False,
-            OutputLevel=0,DetailedHistograms=True)
-    JpsiTPAnalysis = TrigEgammaNavTPJpsieeAnalysisTool(name='NavTPJpsieeAnalysis',
-                                                        DirectoryPath=basePath+'TPJpsieeAnalysis',
-                                                        TriggerList=Jpsiprobelist,
-                                                        File="",
-                                                        TagTriggerList= JpsitagItems,
-                                                        RemoveCrack=True,
-                                                        ZeeLowerMass=2,
-                                                        ZeeUpperMass=5,
-                                                        OfflineTagMinEt=5,
-                                                        OfflineProbeMinEt=5,
-                                                        OutputLevel=0,
-                                                        DetailedHistograms=False,
-                                                        doJpsiee=True)
-    from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConf import TrigEgammaMonTool
-    TrigEgammaMonTool = TrigEgammaMonTool( name = "TrigEgammaMonTool", 
-            histoPathBase=basePath,
-            Tools=["TrigEgammaNavAnalysisTool/NavAnalysis",
-                "TrigEgammaNavTPAnalysisTool/NavTPAnalysis",
-                "TrigEgammaNavTPAnalysisTool/NavTPJpsieeAnalysis"])
-    #ToolSvc += TrigEgammaMonTool
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaPhysValMonToolConfig.py b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaPhysValMonToolConfig.py
deleted file mode 100644
index 9ef1c9d44531..000000000000
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaPhysValMonToolConfig.py
+++ /dev/null
@@ -1,94 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-def TrigEgammaPhysValMonTool():
-    #from AthenaCommon.AppMgr import ToolSvc
-    from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConfig import TrigEgammaEmulationTool
-    from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConfig import TrigEgammaNavAnalysisTool,TrigEgammaNavTPAnalysisTool, TrigEgammaNavNtuple, TrigEgammaNavTPNtuple
-    from TrigEgammaAnalysisTools.TrigEgammaProbelist import default, probeListLowMidPtPhysicsTriggers # to import probelist
-    
-    #from TrigHLTMonitoring.HLTMonTriggerList import hltmonList # import MaM trigger list not available!!!!
-    import TriggerMenu.menu.Physics_pp_v5 as physics_menu
-    import TriggerMenu.menu.MC_pp_v5 as mc_menu
-    from TriggerJobOpts.TriggerFlags import TriggerFlags
-
-   
-    physics_menu.setupMenu()
-    mc_menu.setupMenu()
-    egammaMenu = TriggerFlags.EgammaSlice.signatures()
-    egammaChains = []
-    l1Items = []
-    addItems = []
-    for egchain in egammaMenu:
-        egammaChains.append(egchain[0])
-        l1Items.append(egchain[1])
-        addItems.append(egchain[3])
-    # Set list to full menu
-    #probelist = egammaChains
-    probelist = default
-    #probelist = list(set(default+probeListLowMidPtPhysicsTriggers))
-    
-
-    basePath = 'Trigger/HLT/Egamma/'
-    tagItems = [
-        'e24_lhmedium_iloose_L1EM18VH',
-        'e24_lhmedium_iloose_L1EM20VH',
-        'e24_lhtight_iloose'
-        'e26_lhtight_iloose',
-        #Primary cut-based electron triggers
-        'e24_medium_iloose_L1EM18VH',
-        'e24_medium_iloose_L1EM20VH',
-        'e24_tight_iloose',
-        'e26_tight_iloose'
-        ]
-    Analysis = TrigEgammaNavAnalysisTool(name='NavAnalysis',
-            DirectoryPath=basePath+'Analysis',
-            TriggerList=probelist, 
-            File="PhysVal")
-    
-    TPAnalysis = TrigEgammaNavTPAnalysisTool(name='NavTPAnalysis',
-            DirectoryPath=basePath+'TPAnalysis',
-            TriggerList=probelist, 
-            File="PhysVal",
-            TagTriggerList=tagItems,
-            OutputLevel=0)
- 
-    Emulation = TrigEgammaEmulationTool("Emulation",TriggerList=probelist)
- 
-
-    Ntuple    = TrigEgammaNavNtuple(name="NavNtuple",
-            DirectoryPath=basePath+'Ntuple',
-            TriggerList=probelist,
-            DoOfflineDump=False,
-            ForcePidSelection=True,
-            ForceProbeIsolation=False,
-            ForceEtThreshold=True,
-            RemoveCrack=True,
-            #ForceFilterSelection=False,
-            #ElectronFilterType="Tight",
-            File="PhysVal",
-            OutputLevel=0)
-
-   
-    TPNtuple  = TrigEgammaNavTPNtuple(name="NavTPNtuple",
-            DirectoryPath=basePath+'TPNtuple',
-            TriggerList=probelist,
-            File="PhysVal",
-            TagTriggerList=tagItems,
-            OutputLevel=0)
-
-
-    from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConf import TrigEgammaPhysValMonTool
-    TrigEgammaPhysValMonTool = TrigEgammaPhysValMonTool( name = "TrigEgammaPhysValMonTool", 
-            histoPathBase=basePath,
-            Tools=[
-                "TrigEgammaNavAnalysisTool/NavAnalysis",
-                "TrigEgammaNavTPAnalysisTool/NavTPAnalysis",
-                "TrigEgammaEmulationTool/Emulation",
-                "TrigEgammaNavNtuple/NavNtuple",
-                "TrigEgammaNavTPNtuple/NavTPNtuple"
-                ])
-
-    #ToolSvc += TrigEgammaPhysValMonTool
-
-
-
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaProbelist.py b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaProbelist.py
index be86a3aa05ae..ed20ee82f66c 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaProbelist.py
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaProbelist.py
@@ -9,132 +9,132 @@
 
 #Tag items
 triggerTags = [ 
-  'HLT_e24_lhmedium_iloose_L1EM18VH',
-  'HLT_e24_lhmedium_iloose_L1EM20VH',
-  'HLT_e24_lhtight_iloose',
-  'HLT_e26_lhtight_iloose',
-  # Primary cut-based electron triggers
-  'HLT_e24_medium_iloose_L1EM18VH',
-  'HLT_e24_medium_iloose_L1EM20VH',
-  'HLT_e24_tight_iloose',
-  'HLT_e26_tight_iloose'
-]
+        'HLT_e24_lhmedium_iloose_L1EM18VH',
+        'HLT_e24_lhmedium_iloose_L1EM20VH',
+        'HLT_e24_lhtight_iloose',
+        'HLT_e26_lhtight_iloose',
+        # Primary cut-based electron triggers
+        'HLT_e24_medium_iloose_L1EM18VH',
+        'HLT_e24_medium_iloose_L1EM20VH',
+        'HLT_e24_tight_iloose',
+        'HLT_e26_tight_iloose'
+        ]
 
 
 monitoring_mam = {
-  'primary_single_ele'      : 'HLT_e26_lhtight_iloose',
-  'primary_single_cut_ele'  : 'HLT_e24_tight_iloose',
-  'primary_single_pho'      : 'HLT_g120_loose'}
+        'primary_single_ele'      : 'HLT_e26_lhtight_iloose',
+        'primary_single_cut_ele'  : 'HLT_e24_tight_iloose',
+        'primary_single_pho'      : 'HLT_g120_loose'}
 
 # L1 Items
 monitoring_L1Calo = [
-  'L1_EM20VH',
-  'L1_EM20VHI']
+        'L1_EM20VH',
+        'L1_EM20VHI']
 
 # High pt electron triggers that cannot be monitored with TP Analysis
 monitoring_electron=[
-  'HLT_e60_lhmedium',
-  'HLT_e60_medium',
-  'HLT_e120_lhloose',
-  'HLT_e120_loose',
-  'HLT_e140_lhloose'
-]
+        'HLT_e60_lhmedium',
+        'HLT_e60_medium',
+        'HLT_e120_lhloose',
+        'HLT_e120_loose',
+        'HLT_e140_lhloose'
+        ]
 
 # Full list of monitoring for photons
 monitoring_photon=[
-  'HLT_g25_loose',
-  'HLT_g35_loose',
-  "HLT_g25_medium",
-  "HLT_g35_medium",
-  'HLT_g20_tight',
-  'HLT_g120_loose',
-  'HLT_g140_loose'
-]
+        'HLT_g25_loose',
+        'HLT_g35_loose',
+        "HLT_g25_medium",
+        "HLT_g35_medium",
+        'HLT_g20_tight',
+        'HLT_g120_loose',
+        'HLT_g140_loose'
+        ]
 
 # Lowest single electron triggers for TP analysis
 monitoringTP_electron =[
-  'HLT_e24_lhmedium_L1EM18VH',
-  'HLT_e24_lhmedium_L1EM20VH',
-  'HLT_e24_medium_L1EM20VH',
-  'HLT_e24_lhmedium_iloose',
-  'HLT_e24_medium_iloose',
-  'HLT_e24_lhmedium_nod0_iloose',
-  'HLT_e24_lhtight_iloose',
-  'HLT_e24_tight_iloose',
-  'HLT_e26_lhtight_iloose',
-  'HLT_e26_lhtight_nod0_iloose',
-  'HLT_e26_lhtight_nod0_ivarloose',
-  'HLT_e26_lhtight_nod0_ringer_iloose',
-  'HLT_e26_lhtight_nod0_ringer_ivarloose',
-  'HLT_e28_lhtight_nod0_iloose',
-]
+        'HLT_e24_lhmedium_L1EM18VH',
+        'HLT_e24_lhmedium_L1EM20VH',
+        'HLT_e24_medium_L1EM20VH',
+        'HLT_e24_lhmedium_iloose',
+        'HLT_e24_medium_iloose',
+        'HLT_e24_lhmedium_nod0_iloose',
+        'HLT_e24_lhtight_iloose',
+        'HLT_e24_tight_iloose',
+        'HLT_e26_lhtight_iloose',
+        'HLT_e26_lhtight_nod0_iloose',
+        'HLT_e26_lhtight_nod0_ivarloose',
+        'HLT_e26_lhtight_nod0_ringer_iloose',
+        'HLT_e26_lhtight_nod0_ringer_ivarloose',
+        'HLT_e28_lhtight_nod0_iloose',
+        ]
 
 #Zee TP triggers
 monitoringTP_electronZee = [
-  'HLT_e24_lhtight_L1EM20VH_e15_etcut_Zee',
-  'HLT_e26_lhtight_e15_etcut_Zee',
-]
+        'HLT_e24_lhtight_L1EM20VH_e15_etcut_Zee',
+        'HLT_e26_lhtight_e15_etcut_Zee',
+        ]
 
 #Jpsiee TP triggers
 monitoringTP_electronJpsiee = [
-  "HLT_e5_loose",
-  "HLT_e5_lhloose",
-  "HLT_e5_vloose",
-  "HLT_e5_lhvloose",
-]
+        "HLT_e5_loose",
+        "HLT_e5_lhloose",
+        "HLT_e5_vloose",
+        "HLT_e5_lhvloose",
+        ]
 
 default = [
-  'HLT_e24_lhmedium_iloose_L1EM18VH',# Primary LH electron triggers
-  'HLT_e24_lhmedium_iloose_L1EM20VH',
-  'HLT_e24_lhtight_iloose',
-  'HLT_e24_lhtight_iloose_L1EM20VH',
-  'HLT_e26_lhtight_iloose',
-  'HLT_e26_lhtight_smooth_iloose',
-  'HLT_e60_lhmedium',
-  'HLT_e120_lhloose',
-  'HLT_e140_lhloose',
-  # Primary cut-based electron triggers
-  'HLT_e24_medium_iloose_L1EM18VH',
-  'HLT_e24_medium_iloose_L1EM20VH',
-  'HLT_e24_tight_iloose',
-  'HLT_e26_tight_iloose',
-  'HLT_e60_medium',
-  'HLT_e120_loose',
-  'HLT_e140_loose',
-  # Non-isolated
-  'HLT_e24_lhmedium_L1EM18VH',
-  'HLT_e24_medium_L1EM18VH',
-  'HLT_e24_lhtight_L1EM20VH',
-  'HLT_e24_tight_L1EM20VH',
-  'HLT_e24_lhmedium_L1EM20VHI',
-  # Single photon
-  'HLT_g120_loose',
-  'HLT_g140_loose',
-  # Suppporting triggers for alignment studies / LH ineffiency
-  'HLT_e24_lhmedium_cutd0dphideta_iloose_L1EM18VH',
-  'HLT_e24_lhmedium_nod0_iloose_L1EM18VH',
-  'HLT_e24_lhmedium_nodeta_iloose_L1EM18VH',
-  'HLT_e24_lhmedium_nodphires_iloose_L1EM18VH',
-  'HLT_e24_lhmedium_cutd0dphideta_iloose_L1EM20VH',
-  'HLT_e24_lhmedium_nod0_iloose_L1EM20VH',
-  'HLT_e24_lhmedium_nodeta_iloose_L1EM20VH',
-  'HLT_e24_lhmedium_nodphires_iloose_L1EM20VH',
-  'HLT_e24_lhmedium_iloose_HLTCalo_L1EM18VH',
-  'HLT_e24_lhmedium_iloose_HLTCalo_L1EM20VH',
-  'HLT_e24_lhmedium_iloose_L2EFCalo_L1EM18VH',
-  'HLT_e24_lhmedium_iloose_L2EFCalo_L1EM20VH',
-  'HLT_e26_lhtight_cutd0dphideta_iloose',
-  'HLT_e26_lhtight_iloose_HLTCalo',
-  'HLT_e26_lhtight_iloose_L2EFCalo',
-  'HLT_e24_lhtight_iloose_HLTCalo_L1EM20VH',
-  'HLT_e24_lhtight_iloose_L2EFCalo_L1EM20VH',
-  'HLT_e60_lhmedium_HLTCalo',
-  'HLT_e60_lhmedium_L2EFCalo',
-  'HLT_e60_lhmedium_nod0',
-  'HLT_e60_lhmedium_cutd0dphideta',
-  # Supporting trigger for background
-  #'HLT_e24_vloose_L1EM18VH', 
-  #'HLT_e24_vloose_L1EM20VH',  
+        'HLT_e24_lhmedium_iloose_L1EM18VH',# Primary LH electron triggers
+        'HLT_e24_lhmedium_iloose_L1EM20VH',
+        'HLT_e24_lhtight_iloose',
+        'HLT_e24_lhtight_iloose_L1EM20VH',
+        'HLT_e26_lhtight_iloose',
+        'HLT_e26_lhtight_smooth_iloose',
+        'HLT_e60_lhmedium',
+        'HLT_e120_lhloose',
+        'HLT_e140_lhloose',
+        # Primary cut-based electron triggers
+        'HLT_e24_medium_iloose_L1EM18VH',
+        'HLT_e24_medium_iloose_L1EM20VH',
+        'HLT_e24_tight_iloose',
+        'HLT_e26_tight_iloose',
+        'HLT_e60_medium',
+        'HLT_e120_loose',
+        'HLT_e140_loose',
+        # Non-isolated
+        'HLT_e24_lhmedium_L1EM18VH',
+        'HLT_e24_medium_L1EM18VH',
+        'HLT_e24_lhtight_L1EM20VH',
+        'HLT_e24_tight_L1EM20VH',
+        'HLT_e24_lhmedium_L1EM20VHI',
+        # Single photon
+        'HLT_g120_loose',
+        'HLT_g140_loose',
+        # Suppporting triggers for alignment studies / LH ineffiency
+        'HLT_e24_lhmedium_cutd0dphideta_iloose_L1EM18VH',
+        'HLT_e24_lhmedium_nod0_iloose_L1EM18VH',
+        'HLT_e24_lhmedium_nodeta_iloose_L1EM18VH',
+        'HLT_e24_lhmedium_nodphires_iloose_L1EM18VH',
+        'HLT_e24_lhmedium_cutd0dphideta_iloose_L1EM20VH',
+        'HLT_e24_lhmedium_nod0_iloose_L1EM20VH',
+        'HLT_e24_lhmedium_nodeta_iloose_L1EM20VH',
+        'HLT_e24_lhmedium_nodphires_iloose_L1EM20VH',
+        'HLT_e24_lhmedium_iloose_HLTCalo_L1EM18VH',
+        'HLT_e24_lhmedium_iloose_HLTCalo_L1EM20VH',
+        'HLT_e24_lhmedium_iloose_L2EFCalo_L1EM18VH',
+        'HLT_e24_lhmedium_iloose_L2EFCalo_L1EM20VH',
+        'HLT_e26_lhtight_cutd0dphideta_iloose',
+        'HLT_e26_lhtight_iloose_HLTCalo',
+        'HLT_e26_lhtight_iloose_L2EFCalo',
+        'HLT_e24_lhtight_iloose_HLTCalo_L1EM20VH',
+        'HLT_e24_lhtight_iloose_L2EFCalo_L1EM20VH',
+        'HLT_e60_lhmedium_HLTCalo',
+        'HLT_e60_lhmedium_L2EFCalo',
+        'HLT_e60_lhmedium_nod0',
+        'HLT_e60_lhmedium_cutd0dphideta',
+        # Supporting trigger for background
+        #'HLT_e24_vloose_L1EM18VH', 
+#'HLT_e24_vloose_L1EM20VH',  
   #'HLT_e24_lhvloose_L1EM18VH', 
   #'HLT_e24_lhvloose_L1EM20VH',  
   #'HLT_e26_lhvloose_L1EM20VH',
@@ -150,7 +150,7 @@ default = [
   'HLT_e17_loose_L1EM15',
   'HLT_e17_lhloose_L1EM15',
   'HLT_e13_etcut_trkcut',
-	# Rerun mode for photon
+        # Rerun mode for photon
   # Performance and supporting triggers 
   #"HLT_g0_perf_L1EM3_EMPTY",
   #"HLT_e0_perf_L1EM3_EMPTY",
@@ -193,190 +193,190 @@ default = [
 # Samples to run - Zee and a background such as dijet or JF17 or any JF sample
 
 probeListLowMidPtSupportingTriggers = [
-	"HLT_e0_L2Star_perf_L1EM15",
-	"HLT_e0_L2Star_perf_L1EM3",
-	"HLT_e0_perf_L1EM15",
-	"HLT_e0_perf_L1EM3",
-	"HLT_e10_etcut_L1EM7",
-	"HLT_e13_etcut_L1EM10_W-MT25",
-	"HLT_e13_etcut_L1EM10_W-MT30",
-	"HLT_e13_etcut_L1W-NOMATCH",
-	"HLT_e13_etcut_L1W-NOMATCH_W-05RO-XEEMHT",
-	"HLT_e13_etcut_trkcut",
-	"HLT_e14_etcut",
-	"HLT_e17_etcut_L1EM15",
-	"HLT_e17_etcut_L2StarA_L1EM15",
-	"HLT_e17_etcut_L2StarB_L1EM15",
-	"HLT_e17_etcut_L2StarC_L1EM15",
-	"HLT_e17_etcut_L2Star_idperf_L1EM15",
-	"HLT_e17_etcut_idperf_L1EM15",
-	"HLT_e18_etcut_L1EM15_W-MT35",
-	"HLT_e18_etcut_trkcut",
-	"HLT_e20_etcut_L1EM12",
-	"HLT_e30_etcut_L1EM15",
-	"HLT_e3_etcut",
-	"HLT_e3_etcut_L1EM3_EMPTY",
-	"HLT_e4_etcut",
-	"HLT_e5_etcut",
-	"HLT_e9_etcut",
-  "HLT_e24_etcut",
-  "HLT_e25_etcut_L1EM15",
-]
+        "HLT_e0_L2Star_perf_L1EM15",
+        "HLT_e0_L2Star_perf_L1EM3",
+        "HLT_e0_perf_L1EM15",
+        "HLT_e0_perf_L1EM3",
+        "HLT_e10_etcut_L1EM7",
+        "HLT_e13_etcut_L1EM10_W-MT25",
+        "HLT_e13_etcut_L1EM10_W-MT30",
+        "HLT_e13_etcut_L1W-NOMATCH",
+        "HLT_e13_etcut_L1W-NOMATCH_W-05RO-XEEMHT",
+        "HLT_e13_etcut_trkcut",
+        "HLT_e14_etcut",
+        "HLT_e17_etcut_L1EM15",
+        "HLT_e17_etcut_L2StarA_L1EM15",
+        "HLT_e17_etcut_L2StarB_L1EM15",
+        "HLT_e17_etcut_L2StarC_L1EM15",
+        "HLT_e17_etcut_L2Star_idperf_L1EM15",
+        "HLT_e17_etcut_idperf_L1EM15",
+        "HLT_e18_etcut_L1EM15_W-MT35",
+        "HLT_e18_etcut_trkcut",
+        "HLT_e20_etcut_L1EM12",
+        "HLT_e30_etcut_L1EM15",
+        "HLT_e3_etcut",
+        "HLT_e3_etcut_L1EM3_EMPTY",
+        "HLT_e4_etcut",
+        "HLT_e5_etcut",
+        "HLT_e9_etcut",
+        "HLT_e24_etcut",
+        "HLT_e25_etcut_L1EM15",
+        ]
 
 # ProbeList 2 Low/mid pt physics triggers
 # EmulationTool,Eff,Counts,Perf
 # Samples to run Zee and any background sample dijet, JFXX
 probeListLowMidPtPhysicsTriggers = [
-	"HLT_e10_lhvloose_L1EM7",
-	"HLT_e10_vloose_L1EM7",
-	"HLT_e12_lhloose",
-	"HLT_e12_loose",
-	"HLT_e12_lhvloose_L1EM10VH",
-	"HLT_e12_vloose_L1EM10VH",
-	"HLT_e15_lhloose_L1EM13VH",
-	"HLT_e15_lhvloose_L1EM13VH",
-	"HLT_e15_lhvloose_L1EM7",
-	"HLT_e15_loose_L1EM13VH",
-	"HLT_e15_vloose_L1EM13VH",
-	"HLT_e15_vloose_L1EM7",
-	"HLT_e17_lhloose",
-	"HLT_e17_lhmedium",
-	"HLT_e17_lhmedium_iloose",
-	"HLT_e17_lhvloose",
-	"HLT_e17_loose",
-	"HLT_e17_medium",
-	"HLT_e17_medium_iloose",
-	"HLT_e17_vloose",
-	"HLT_e20_lhmedium",
-	"HLT_e20_lhvloose",
-	"HLT_e20_medium",
-	"HLT_e20_vloose",
-	"HLT_e20_vloose_L1EM12",
-	"HLT_e24_lhmedium_L1EM15VH",
-	"HLT_e24_lhmedium_L1EM18VH",
-	"HLT_e24_lhmedium_iloose_L1EM18VH",
-	"HLT_e24_lhmedium_iloose_L1EM20VH",
-	"HLT_e24_lhtight_iloose",
-	"HLT_e24_lhvloose_L1EM18VH",
-	"HLT_e24_lhvloose_L1EM20VH",
-	"HLT_e24_medium_L1EM15VH",
-	"HLT_e24_medium_L1EM18VH",
-	"HLT_e24_medium_iloose_L1EM18VH",
-	"HLT_e24_medium_iloose_L1EM20VH",
-	"HLT_e24_tight_L1EM20VH",
-	"HLT_e24_tight_iloose",
-	"HLT_e24_vloose_L1EM18VH",
-	"HLT_e24_vloose_L1EM20VH",
-	"HLT_e25_lhvloose_L1EM15",
-	"HLT_e25_vloose_L1EM15",
-	"HLT_e26_lhtight_iloose",
-	"HLT_e26_lhvloose_L1EM20VH",
-	"HLT_e26_tight_iloose",
-	"HLT_e26_vloose_L1EM20VH",
-	"HLT_e30_lhvloose_L1EM15",
-	"HLT_e30_vloose_L1EM15",
-]
+        "HLT_e10_lhvloose_L1EM7",
+        "HLT_e10_vloose_L1EM7",
+        "HLT_e12_lhloose",
+        "HLT_e12_loose",
+        "HLT_e12_lhvloose_L1EM10VH",
+        "HLT_e12_vloose_L1EM10VH",
+        "HLT_e15_lhloose_L1EM13VH",
+        "HLT_e15_lhvloose_L1EM13VH",
+        "HLT_e15_lhvloose_L1EM7",
+        "HLT_e15_loose_L1EM13VH",
+        "HLT_e15_vloose_L1EM13VH",
+        "HLT_e15_vloose_L1EM7",
+        "HLT_e17_lhloose",
+        "HLT_e17_lhmedium",
+        "HLT_e17_lhmedium_iloose",
+        "HLT_e17_lhvloose",
+        "HLT_e17_loose",
+        "HLT_e17_medium",
+        "HLT_e17_medium_iloose",
+        "HLT_e17_vloose",
+        "HLT_e20_lhmedium",
+        "HLT_e20_lhvloose",
+        "HLT_e20_medium",
+        "HLT_e20_vloose",
+        "HLT_e20_vloose_L1EM12",
+        "HLT_e24_lhmedium_L1EM15VH",
+        "HLT_e24_lhmedium_L1EM18VH",
+        "HLT_e24_lhmedium_iloose_L1EM18VH",
+        "HLT_e24_lhmedium_iloose_L1EM20VH",
+        "HLT_e24_lhtight_iloose",
+        "HLT_e24_lhvloose_L1EM18VH",
+        "HLT_e24_lhvloose_L1EM20VH",
+        "HLT_e24_medium_L1EM15VH",
+        "HLT_e24_medium_L1EM18VH",
+        "HLT_e24_medium_iloose_L1EM18VH",
+        "HLT_e24_medium_iloose_L1EM20VH",
+        "HLT_e24_tight_L1EM20VH",
+        "HLT_e24_tight_iloose",
+        "HLT_e24_vloose_L1EM18VH",
+        "HLT_e24_vloose_L1EM20VH",
+        "HLT_e25_lhvloose_L1EM15",
+        "HLT_e25_vloose_L1EM15",
+        "HLT_e26_lhtight_iloose",
+        "HLT_e26_lhvloose_L1EM20VH",
+        "HLT_e26_tight_iloose",
+        "HLT_e26_vloose_L1EM20VH",
+        "HLT_e30_lhvloose_L1EM15",
+        "HLT_e30_vloose_L1EM15",
+        ]
 
 # Compare LHTrigger to IsEMTrigger
 probeListLHTriggers = [
-  "HLT_e10_lhvloose_L1EM7",
-  "HLT_e12_lhloose",
-  "HLT_e17_lhloose",
-  "HLT_e17_lhmedium",
-  "HLT_e17_lhmedium_iloose",
-  "HLT_e17_lhvloose",
-  "HLT_e20_lhmedium",
-  "HLT_e20_lhvloose",
-  "HLT_e24_lhtight_iloose",
-  "HLT_e26_lhtight_iloose",
-  "HLT_e30_lhvloose_L1EM15",
-  "HLT_e60_lhmedium",
-]
+        "HLT_e10_lhvloose_L1EM7",
+        "HLT_e12_lhloose",
+        "HLT_e17_lhloose",
+        "HLT_e17_lhmedium",
+        "HLT_e17_lhmedium_iloose",
+        "HLT_e17_lhvloose",
+        "HLT_e20_lhmedium",
+        "HLT_e20_lhvloose",
+        "HLT_e24_lhtight_iloose",
+        "HLT_e26_lhtight_iloose",
+        "HLT_e30_lhvloose_L1EM15",
+        "HLT_e60_lhmedium",
+        ]
 
 # Compare with LH trigger above
 probeListIsEMTriggers = [
-  "HLT_e10_vloose_L1EM7",
-  "HLT_e12_loose",
-  "HLT_e17_loose",
-	"HLT_e17_medium",
-	"HLT_e17_medium_iloose",
-  "HLT_e17_vloose",
-	"HLT_e20_medium",
-	"HLT_e20_vloose",
-  "HLT_e24_tight_iloose",
-  "HLT_e26_tight_iloose",
-  "HLT_e30_vloose_L1EM15",
-  "HLT_e60_medium",
-]
+        "HLT_e10_vloose_L1EM7",
+        "HLT_e12_loose",
+        "HLT_e17_loose",
+        "HLT_e17_medium",
+        "HLT_e17_medium_iloose",
+        "HLT_e17_vloose",
+        "HLT_e20_medium",
+        "HLT_e20_vloose",
+        "HLT_e24_tight_iloose",
+        "HLT_e26_tight_iloose",
+        "HLT_e30_vloose_L1EM15",
+        "HLT_e60_medium",
+        ]
 
 # Compare with same items without L1 seed
 probeListAltL1Seeds = [
-	"HLT_e12_lhloose_L1EM10VH",
-  "HLT_e12_loose_L1EM10VH",
-  "HLT_e17_lhloose_L1EM15",
-  "HLT_e17_loose_L1EM15",
-  "HLT_e20_lhvloose_L1EM12",
-  "HLT_e24_lhtight_L1EM20VH",
-	"HLT_e24_lhtight_iloose_L1EM20VH",
-	"HLT_e24_tight_iloose_L1EM20VH",
-	"HLT_e24_tight_iloose_etisem_L1EM20VH",
-]
+        "HLT_e12_lhloose_L1EM10VH",
+        "HLT_e12_loose_L1EM10VH",
+        "HLT_e17_lhloose_L1EM15",
+        "HLT_e17_loose_L1EM15",
+        "HLT_e20_lhvloose_L1EM12",
+        "HLT_e24_lhtight_L1EM20VH",
+        "HLT_e24_lhtight_iloose_L1EM20VH",
+        "HLT_e24_tight_iloose_L1EM20VH",
+        "HLT_e24_tight_iloose_etisem_L1EM20VH",
+        ]
 
 # Special triggers for hlt id performance
 probeListPerfTriggers = [
-	"HLT_e24_lhmedium_L2Star_idperf_L1EM20VH",
-	"HLT_e24_lhmedium_idperf_L1EM20VH",
-  "HLT_e24_medium1_L2Star_idperf_L1EM18VH",
-  "HLT_e24_medium1_idperf_L1EM18VH",
-  "HLT_e24_medium_L2Star_idperf_L1EM20VH",
-  "HLT_e24_medium_idperf_L1EM20VH",
-]
+        "HLT_e24_lhmedium_L2Star_idperf_L1EM20VH",
+        "HLT_e24_lhmedium_idperf_L1EM20VH",
+        "HLT_e24_medium1_L2Star_idperf_L1EM18VH",
+        "HLT_e24_medium1_idperf_L1EM18VH",
+        "HLT_e24_medium_L2Star_idperf_L1EM20VH",
+        "HLT_e24_medium_idperf_L1EM20VH",
+        ]
 
 # Run1 tracking triggers, for rate estimates
 # Compare with same triggers w/o L2StarA
 probeListRun1TrkTriggers = [
-  "HLT_e24_lhmedium_iloose_L2StarA_L1EM20VH",
-  "HLT_e24_medium1_iloose_L2StarA_L1EM18VH",
-  "HLT_e24_medium_iloose_L2StarA_L1EM20VH",
-]
+        "HLT_e24_lhmedium_iloose_L2StarA_L1EM20VH",
+        "HLT_e24_medium1_iloose_L2StarA_L1EM18VH",
+        "HLT_e24_medium_iloose_L2StarA_L1EM20VH",
+        ]
 
 # Run1 Pid, compare with same Run2 items
 probeListRun1PidTriggers = [
-	"HLT_e24_medium1_L1EM18VH",
-	"HLT_e24_medium1_iloose_L1EM18VH",
-	"HLT_e24_tight1_iloose",
-	"HLT_e24_tight1_iloose_L1EM20VH",
-  "HLT_e26_tight1_iloose",
-]
+        "HLT_e24_medium1_L1EM18VH",
+        "HLT_e24_medium1_iloose_L1EM18VH",
+        "HLT_e24_tight1_iloose",
+        "HLT_e24_tight1_iloose_L1EM20VH",
+        "HLT_e26_tight1_iloose",
+        ]
 
 # To be compared with the default items
 probeListMisalignmentTriggers = [
-	"HLT_e24_lhmedium_cutd0dphideta_L1EM18VH",
-	"HLT_e24_lhmedium_cutd0dphideta_iloose_L1EM18VH",
-	"HLT_e24_lhmedium_cutd0dphideta_iloose_L1EM20VH",
-	"HLT_e24_lhmedium_nod0_L1EM18VH",
-	"HLT_e24_lhmedium_nod0_iloose_L1EM18VH",
-	"HLT_e24_lhmedium_nodeta_L1EM18VH",
-	"HLT_e24_lhmedium_nodeta_iloose_L1EM18VH",
-	"HLT_e24_lhmedium_nodphires_L1EM18VH",
-	"HLT_e24_lhmedium_nodphires_iloose_L1EM18VH",
-	"HLT_e24_lhtight_cutd0dphideta_iloose",
-	"HLT_e24_lhtight_cutd0dphideta_iloose_L1EM20VH",
-  "HLT_e26_lhtight_cutd0dphideta_iloose",
-  "HLT_e60_lhmedium_cutd0dphideta",
-]
+        "HLT_e24_lhmedium_cutd0dphideta_L1EM18VH",
+        "HLT_e24_lhmedium_cutd0dphideta_iloose_L1EM18VH",
+        "HLT_e24_lhmedium_cutd0dphideta_iloose_L1EM20VH",
+        "HLT_e24_lhmedium_nod0_L1EM18VH",
+        "HLT_e24_lhmedium_nod0_iloose_L1EM18VH",
+        "HLT_e24_lhmedium_nodeta_L1EM18VH",
+        "HLT_e24_lhmedium_nodeta_iloose_L1EM18VH",
+        "HLT_e24_lhmedium_nodphires_L1EM18VH",
+        "HLT_e24_lhmedium_nodphires_iloose_L1EM18VH",
+        "HLT_e24_lhtight_cutd0dphideta_iloose",
+        "HLT_e24_lhtight_cutd0dphideta_iloose_L1EM20VH",
+        "HLT_e26_lhtight_cutd0dphideta_iloose",
+        "HLT_e60_lhmedium_cutd0dphideta",
+        ]
 
 # Compare with default items
 probeListAltSequence = [
-	"HLT_e24_lhmedium_iloose_HLTCalo_L1EM18VH",
-	"HLT_e24_lhmedium_iloose_HLTCalo_L1EM20VH",
-	"HLT_e24_lhtight_iloose_HLTCalo",
-	"HLT_e24_lhtight_iloose_HLTCalo_L1EM20VH",
-  "HLT_e24_lhtight_iloose_L2EFCalo_L1EM20VH",
-  "HLT_e24_tight_iloose_HLTCalo_L1EM20VH",
-  "HLT_e24_tight_iloose_L2EFCalo_L1EM20VH",
-  "HLT_e26_lhtight_iloose_HLTCalo",
-]
+        "HLT_e24_lhmedium_iloose_HLTCalo_L1EM18VH",
+        "HLT_e24_lhmedium_iloose_HLTCalo_L1EM20VH",
+        "HLT_e24_lhtight_iloose_HLTCalo",
+        "HLT_e24_lhtight_iloose_HLTCalo_L1EM20VH",
+        "HLT_e24_lhtight_iloose_L2EFCalo_L1EM20VH",
+        "HLT_e24_tight_iloose_HLTCalo_L1EM20VH",
+        "HLT_e24_tight_iloose_L2EFCalo_L1EM20VH",
+        "HLT_e26_lhtight_iloose_HLTCalo",
+        ]
 
 #ProbeList 3 High pt triggers
 #Should run with Zprime and / or WPrime samples
@@ -387,164 +387,164 @@ probeListAltSequence = [
 
 # Etcut Trigger list
 probeListHighPtSupportingTriggers = [
-	"HLT_e100_etcut",
-	"HLT_e120_etcut",
-	"HLT_e40_etcut_L1EM15",
-	"HLT_e60_etcut",
-	"HLT_e80_etcut",
-	"HLT_e50_etcut_L1EM15",
-]
+        "HLT_e100_etcut",
+        "HLT_e120_etcut",
+        "HLT_e40_etcut_L1EM15",
+        "HLT_e60_etcut",
+        "HLT_e80_etcut",
+        "HLT_e50_etcut_L1EM15",
+        ]
 
 # The Primary Trigger List
 probeListHighPtPhysicsTriggers = [
-	"HLT_e120_lhloose",
-	"HLT_e120_lhloose_HLTCalo",
-	"HLT_e120_lhvloose",
-	"HLT_e120_loose",
-	"HLT_e120_loose1",
-	"HLT_e120_vloose",
-	"HLT_e140_lhloose",
-	"HLT_e140_lhloose_HLTCalo",
-	"HLT_e140_loose",
-	"HLT_e40_lhvloose_L1EM15",
-	"HLT_e40_vloose_L1EM15",
-	"HLT_e50_lhvloose_L1EM15",
-	"HLT_e50_vloose_L1EM15",
-	"HLT_e60_lhloose",
-	"HLT_e60_lhmedium",
-	"HLT_e60_lhmedium_HLTCalo",
-	"HLT_e60_lhmedium_cutd0dphideta",
-	"HLT_e60_lhvloose",
-	"HLT_e60_loose",
-	"HLT_e60_medium",
-	"HLT_e60_medium1",
-	"HLT_e60_vloose",
-	"HLT_e70_lhloose",
-	"HLT_e70_lhvloose",
-	"HLT_e70_loose",
-	"HLT_e70_vloose",
-	"HLT_e80_lhvloose",
-	"HLT_e80_vloose",
-]
+        "HLT_e120_lhloose",
+        "HLT_e120_lhloose_HLTCalo",
+        "HLT_e120_lhvloose",
+        "HLT_e120_loose",
+        "HLT_e120_loose1",
+        "HLT_e120_vloose",
+        "HLT_e140_lhloose",
+        "HLT_e140_lhloose_HLTCalo",
+        "HLT_e140_loose",
+        "HLT_e40_lhvloose_L1EM15",
+        "HLT_e40_vloose_L1EM15",
+        "HLT_e50_lhvloose_L1EM15",
+        "HLT_e50_vloose_L1EM15",
+        "HLT_e60_lhloose",
+        "HLT_e60_lhmedium",
+        "HLT_e60_lhmedium_HLTCalo",
+        "HLT_e60_lhmedium_cutd0dphideta",
+        "HLT_e60_lhvloose",
+        "HLT_e60_loose",
+        "HLT_e60_medium",
+        "HLT_e60_medium1",
+        "HLT_e60_vloose",
+        "HLT_e70_lhloose",
+        "HLT_e70_lhvloose",
+        "HLT_e70_loose",
+        "HLT_e70_vloose",
+        "HLT_e80_lhvloose",
+        "HLT_e80_vloose",
+        ]
 
 # ProbeList 4 Photon triggers
 # EmulationTool,Perf
 # Sample ggH125 and background dijet / JFXX
 
 probeListPhotonTriggers = [
-	"HLT_g0_hiptrt_L1EM18VH",
-	"HLT_g0_hiptrt_L1EM20VH",
-	"HLT_g0_hiptrt_L1EM20VHI",
-	"HLT_g0_hiptrt_L1EM22VHI",
-	"HLT_g0_perf_L1EM15",
-	"HLT_g0_perf_L1EM3",
-	"HLT_g100_loose",
-	"HLT_g10_etcut",
-	"HLT_g10_loose",
-	"HLT_g10_medium",
-	"HLT_g120_loose",
-	"HLT_g120_loose1",
-	"HLT_g120_loose_HLTCalo",
-	"HLT_g140_loose",
-	"HLT_g15_loose",
-	"HLT_g15_loose_L1EM3",
-	"HLT_g15_loose_L1EM7",
-	"HLT_g200_etcut",
-	"HLT_g20_etcut_L1EM12",
-	"HLT_g20_loose",
-	"HLT_g20_loose_L1EM12",
-	"HLT_g20_loose_L1EM15",
-	"HLT_g20_tight",
-	"HLT_g25_loose",
-	"HLT_g25_loose_L1EM15",
-	"HLT_g25_medium",
-	"HLT_g35_loose",
-	"HLT_g35_loose_L1EM15",
-	"HLT_g35_loose_L1EM15_g25_loose_L1EM15",
-	"HLT_g35_loose_g25_loose",
-	"HLT_g35_medium",
-	"HLT_g3_etcut",
-	"HLT_g3_etcut_L1EM3_EMPTY",
-	"HLT_g40_loose_L1EM15",
-	"HLT_g40_tight",
-	"HLT_g45_loose_L1EM15",
-	"HLT_g45_tight",
-	"HLT_g50_loose",
-	"HLT_g50_loose_L1EM15",
-	"HLT_g60_loose",
-	"HLT_g60_loose_L1EM15VH",
-	"HLT_g70_loose",
-	"HLT_g80_loose",
-]
+        "HLT_g0_hiptrt_L1EM18VH",
+        "HLT_g0_hiptrt_L1EM20VH",
+        "HLT_g0_hiptrt_L1EM20VHI",
+        "HLT_g0_hiptrt_L1EM22VHI",
+        "HLT_g0_perf_L1EM15",
+        "HLT_g0_perf_L1EM3",
+        "HLT_g100_loose",
+        "HLT_g10_etcut",
+        "HLT_g10_loose",
+        "HLT_g10_medium",
+        "HLT_g120_loose",
+        "HLT_g120_loose1",
+        "HLT_g120_loose_HLTCalo",
+        "HLT_g140_loose",
+        "HLT_g15_loose",
+        "HLT_g15_loose_L1EM3",
+        "HLT_g15_loose_L1EM7",
+        "HLT_g200_etcut",
+        "HLT_g20_etcut_L1EM12",
+        "HLT_g20_loose",
+        "HLT_g20_loose_L1EM12",
+        "HLT_g20_loose_L1EM15",
+        "HLT_g20_tight",
+        "HLT_g25_loose",
+        "HLT_g25_loose_L1EM15",
+        "HLT_g25_medium",
+        "HLT_g35_loose",
+        "HLT_g35_loose_L1EM15",
+        "HLT_g35_loose_L1EM15_g25_loose_L1EM15",
+        "HLT_g35_loose_g25_loose",
+        "HLT_g35_medium",
+        "HLT_g3_etcut",
+        "HLT_g3_etcut_L1EM3_EMPTY",
+        "HLT_g40_loose_L1EM15",
+        "HLT_g40_tight",
+        "HLT_g45_loose_L1EM15",
+        "HLT_g45_tight",
+        "HLT_g50_loose",
+        "HLT_g50_loose_L1EM15",
+        "HLT_g60_loose",
+        "HLT_g60_loose_L1EM15VH",
+        "HLT_g70_loose",
+        "HLT_g80_loose",
+        ]
 
 defaultJpsi=[
-  "HLT_e5_loose",
-  "HLT_e5_lhloose",
-  "HLT_e5_vloose",
-  "HLT_e5_lhvloose",
-]
+        "HLT_e5_loose",
+        "HLT_e5_lhloose",
+        "HLT_e5_vloose",
+        "HLT_e5_lhvloose",
+        ]
 
 
 # Lowest single electron triggers for TP analysis
 monitoringTP_electron_extra =[
-  'HLT_e24_lhmedium_L1EM18VH',
-  'HLT_e24_lhmedium_nod0_L1EM18VH',
-  'HLT_e24_lhmedium_nod0_L1EM20VH',
-  'HLT_e24_medium_nod0_L1EM20VH',
-  'HLT_e24_lhmedium_iloose',
-  'HLT_e24_medium_iloose',
-  'HLT_e24_lhmedium_nod0_iloose',
-  'HLT_e24_lhtight_nod0_iloose',
-  'HLT_e24_lhmedium_nod0_ivarloose',
-  'HLT_e24_lhtight_nod0_ivarloose',
-  'HLT_e24_lhtight_iloose',
-  'HLT_e24_tight_iloose',
-  'HLT_e26_lhtight_iloose',
-  'HLT_e26_lhtight_nod0_iloose',
-  'HLT_e26_lhtight_nod0_ivarloose',
-  'HLT_e24_lhmedium_nod0_ringer_L1EM20VH',
-  'HLT_e24_lhmedium_nod0_ringer_iloose',
-  'HLT_e24_lhtight_nod0_ringer_iloose',
-  'HLT_e24_lhmedium_nod0_ringer_ivarloose',
-  'HLT_e24_lhtight_nod0_ringer_ivarloose',
-  'HLT_e26_lhtight_nod0_ringer_iloose',
-  'HLT_e26_lhtight_nod0_ringer_ivarloose',
-  'HLT_e28_lhtight_nod0_iloose',
-  'HLT_e28_lhtight_nod0_ringer_iloose',
-  'HLT_e28_lhtight_nod0_ringer_ivarloose',
-]
+        'HLT_e24_lhmedium_L1EM18VH',
+        'HLT_e24_lhmedium_nod0_L1EM18VH',
+        'HLT_e24_lhmedium_nod0_L1EM20VH',
+        'HLT_e24_medium_nod0_L1EM20VH',
+        'HLT_e24_lhmedium_iloose',
+        'HLT_e24_medium_iloose',
+        'HLT_e24_lhmedium_nod0_iloose',
+        'HLT_e24_lhtight_nod0_iloose',
+        'HLT_e24_lhmedium_nod0_ivarloose',
+        'HLT_e24_lhtight_nod0_ivarloose',
+        'HLT_e24_lhtight_iloose',
+        'HLT_e24_tight_iloose',
+        'HLT_e26_lhtight_iloose',
+        'HLT_e26_lhtight_nod0_iloose',
+        'HLT_e26_lhtight_nod0_ivarloose',
+        'HLT_e24_lhmedium_nod0_ringer_L1EM20VH',
+        'HLT_e24_lhmedium_nod0_ringer_iloose',
+        'HLT_e24_lhtight_nod0_ringer_iloose',
+        'HLT_e24_lhmedium_nod0_ringer_ivarloose',
+        'HLT_e24_lhtight_nod0_ringer_ivarloose',
+        'HLT_e26_lhtight_nod0_ringer_iloose',
+        'HLT_e26_lhtight_nod0_ringer_ivarloose',
+        'HLT_e28_lhtight_nod0_iloose',
+        'HLT_e28_lhtight_nod0_ringer_iloose',
+        'HLT_e28_lhtight_nod0_ringer_ivarloose',
+        ]
 
 
 ### Make supproting trigger list for the emulation e/g tool
 supportingTriggerList = probeListLowMidPtSupportingTriggers+probeListHighPtSupportingTriggers
 # Update the supporting list with very loose chains. This will be used in data collisin matches
 for trig in probeListLowMidPtPhysicsTriggers+probeListHighPtPhysicsTriggers:
-  if 'vloose' in trig:  supportingTriggerList.append(trig)
+    if 'vloose' in trig:  supportingTriggerList.append(trig)
 
 supportingTriggerList.extend( [
-  'HLT_e24_lhvloose_nod0_L1EM20VH',
-  'HLT_e26_lhvloose_nod0_L1EM20VH',
-  'HLT_e28_lhvloose_nod0_L1EM20VH',
-  'HLT_e140_lhvloose_nod0',
-  'HLT_e10_lhvloose_nod0_L1EM7',
-  'HLT_e10_lhvloose_nod0_L1EM7',
-  'HLT_e15_lhvloose_nod0_L1EM7',
-  'HLT_e20_lhvloose_nod0_L1EM12',
-  'HLT_e25_lhvloose_nod0_L1EM15',
-  'HLT_e30_lhvloose_nod0_L1EM15',
-  'HLT_e40_lhvloose_nod0_L1EM15',
-  'HLT_e50_lhvloose_nod0_L1EM15',
-  'HLT_e70_lhvloose_nod0',
-  'HLT_e80_lhvloose_nod0',
-  'HLT_e100_lhvloose_nod0',
-  'HLT_e120_lhvloose_nod0',
-  'HLT_e5_lhvloose_nod0',
-  'HLT_e12_lhvloose_nod0_L1EM10VH',
-  'HLT_e17_lhvloose_nod0',
-  'HLT_e20_lhvloose_nod0',
-  'HLT_e40_lhvloose_nod0',
-  'HLT_e60_lhvloose_nod0',
-] )
+    'HLT_e24_lhvloose_nod0_L1EM20VH',
+    'HLT_e26_lhvloose_nod0_L1EM20VH',
+    'HLT_e28_lhvloose_nod0_L1EM20VH',
+    'HLT_e140_lhvloose_nod0',
+    'HLT_e10_lhvloose_nod0_L1EM7',
+    'HLT_e10_lhvloose_nod0_L1EM7',
+    'HLT_e15_lhvloose_nod0_L1EM7',
+    'HLT_e20_lhvloose_nod0_L1EM12',
+    'HLT_e25_lhvloose_nod0_L1EM15',
+    'HLT_e30_lhvloose_nod0_L1EM15',
+    'HLT_e40_lhvloose_nod0_L1EM15',
+    'HLT_e50_lhvloose_nod0_L1EM15',
+    'HLT_e70_lhvloose_nod0',
+    'HLT_e80_lhvloose_nod0',
+    'HLT_e100_lhvloose_nod0',
+    'HLT_e120_lhvloose_nod0',
+    'HLT_e5_lhvloose_nod0',
+    'HLT_e12_lhvloose_nod0_L1EM10VH',
+    'HLT_e17_lhvloose_nod0',
+    'HLT_e20_lhvloose_nod0',
+    'HLT_e40_lhvloose_nod0',
+    'HLT_e60_lhvloose_nod0',
+    ] )
 
 
 
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisTools.py b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisTools.py
deleted file mode 100755
index 763707849410..000000000000
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisTools.py
+++ /dev/null
@@ -1,117 +0,0 @@
-# Job options for standalone and Tier0 running of AnalysisTools 
-# Authors: 
-# Ryan Mackenzie White <ryan.white@cern.ch>
-# 
-# Tool and algorithm configuration done using egamma Factories
-# Default configurations found in TrigEgammaAnalysisToolsConfig
-
-# To run
-# athena -l DEBUG -c "DIR='/afs/cern.ch/work/j/jolopezl/datasets/valid1.147406.PowhegPythia8_AZNLO_Zee.recon.AOD.e3099_s2578_r6220_tid05203475_00'" -c "NOV=50" test_ZeeElectronLowPtSupportingTrigAnalysis.py
-# where NOV is the number of events to run
-
-from AthenaCommon.AthenaCommonFlags import athenaCommonFlags
-from RecExConfig.RecFlags import rec
-from RecExConfig.RecAlgsFlags import recAlgs
-from AthenaCommon.AppMgr import ToolSvc
-
-import os
-
-#print 'Set some variables for job'
-dirtouse = str()
-
-finallist=[]
-
-if 'FILE' in dir() :
-     finallist.append(FILE)
-elif 'DIR' in dir() :
-     dirtouse=DIR       
-     while( dirtouse.endswith('/') ) :
-          dirtouse= dirtouse.rstrip('/')
-     listfiles=os.listdir(dirtouse)
-     for ll in listfiles:
-          finallist.append(dirtouse+'/'+ll)
-
-if 'NOV' in dir():
-    nov=NOV
-else :
-    nov=-1
-
-if 'RTT' in dir():
-    rttfile='root://eosatlas.cern.ch//eos/atlas/atlascerngroupdisk/proj-sit/rtt/prod/rtt/'+RTT+'/x86_64-slc6-gcc49-opt/offline/TrigEgammaValidation/RDOtoAOD_MC_transform_Zee_25ns_pileup/AOD.Zee.25ns.pileup.pool.root'
-    finallist.append(rttfile)
-
-if 'GRL' in dir():
-    grl=GRL
-
-
-athenaCommonFlags.FilesInput=finallist
-athenaCommonFlags.EvtMax=nov
-rec.readAOD=True
-# switch off detectors
-rec.doForwardDet=False
-rec.doInDet=False
-rec.doCalo=False
-rec.doMuon=False
-rec.doEgamma=False
-rec.doTrigger = True; recAlgs.doTrigger=False # disable trigger (maybe necessary if detectors switched off)
-rec.doMuon=False
-rec.doMuonCombined=False
-rec.doWriteAOD=True
-rec.doWriteESD=False
-rec.doDPD=False
-rec.doTruth=False
-
-# autoconfiguration might trigger undesired feature
-rec.doESD.set_Value_and_Lock(False) # uncomment if do not run ESD making algorithms
-rec.doWriteESD.set_Value_and_Lock(False) # uncomment if do not write ESD
-rec.doAOD.set_Value_and_Lock(True) # uncomment if do not run AOD making algorithms
-rec.doWriteAOD.set_Value_and_Lock(True) # uncomment if do not write AOD
-rec.doWriteTAG.set_Value_and_Lock(False) # uncomment if do not write TAG
-
-# main jobOption
-include ("RecExCommon/RecExCommon_topOptions.py")
-MessageSvc.debugLimit = 20000000
-MessageSvc.infoLimit  = 20000000
-# TDT
-from TrigDecisionTool.TrigDecisionToolConf import Trig__TrigDecisionTool
-ToolSvc += Trig__TrigDecisionTool( "TrigDecisionTool" )
-ToolSvc.TrigDecisionTool.TrigDecisionKey='xTrigDecision'
-
-from AthenaCommon.AlgSequence import AlgSequence
-topSequence = AlgSequence()
-
-# Use GRL selection 
-if 'GRL' in dir():
-    # Configure the goodrunslist selector tool
-    from GoodRunsLists.GoodRunsListsConf import *
-    ToolSvc += GoodRunsListSelectorTool() 
-    GoodRunsListSelectorTool.GoodRunsListVec = [grl]
-    GoodRunsListSelectorTool.OutputLevel = DEBUG
-    from AthenaCommon.AlgSequence import AlgSequence,AthSequencer
-    topSequence = AlgSequence()
-    seq = AthSequencer("AthMasterSeq")
-    from GoodRunsListsUser.GoodRunsListsUserConf import *
-    seq += GRLTriggerSelectorAlg('GRLTriggerAlg1')
-    seq.GRLTriggerAlg1.GoodRunsListArray = ['PHYS_StandardGRL_All_Good']        ## pick up correct name from inside xml file!
-
-from AthenaMonitoring.AthenaMonitoringConf import AthenaMonManager
-topSequence += AthenaMonManager( "HLTMonManager")
-HLTMonManager = topSequence.HLTMonManager
-
-################ Mon Tools #################
-#Global HLTMonTool
-
-from TrigHLTMonitoring.TrigHLTMonitoringConf import HLTMonTool
-HLTMon = HLTMonTool(name               = 'HLTMon',
-               histoPathBase      = "HLT");
-
-#ToolSvc += HLTMon;
-HLTMonManager.AthenaMonTools += [ HLTMon ];
-    
-from TrigEgammaAnalysisTools import TrigEgammaMonToolConfig
-HLTEgammaMon = TrigEgammaMonToolConfig.TrigEgammaMonTool()
-HLTMonManager.AthenaMonTools += [ HLTEgammaMon ]
-HLTMonManager.FileKey = "GLOBAL"
-
-
-    
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisToolsGRL.py b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisToolsGRL.py
deleted file mode 100755
index cb574e9530c7..000000000000
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisToolsGRL.py
+++ /dev/null
@@ -1,200 +0,0 @@
-# Job options for standalone and Tier0 running of AnalysisTools 
-# Authors: 
-# Ryan Mackenzie White <ryan.white@cern.ch>
-# 
-# Tool and algorithm configuration done using egamma Factories
-# Default configurations found in TrigEgammaAnalysisToolsConfig
-
-# To run
-# athena -l DEBUG -c "DIR='/afs/cern.ch/work/j/jolopezl/datasets/valid1.147406.PowhegPythia8_AZNLO_Zee.recon.AOD.e3099_s2578_r6220_tid05203475_00'" -c "NOV=50" test_ZeeElectronLowPtSupportingTrigAnalysis.py
-# where NOV is the number of events to run
-
-from AthenaCommon.GlobalFlags import globalflags
-globalflags.ConditionsTag="CONDBR2-BLKPA-2014-00"
-from AthenaCommon.AthenaCommonFlags import athenaCommonFlags
-from RecExConfig.RecFlags import rec
-from RecExConfig.RecAlgsFlags import recAlgs
-from InDetRecExample.InDetJobProperties import InDetFlags
-InDetFlags.doSecVertexFinder.set_Value_and_Lock(False)
-from AthenaCommon.AppMgr import ToolSvc
-
-import os
-
-# Use the parser
-import argparse
-#print 'Setup parser'
-parser = argparse.ArgumentParser()
-#parser.add_argument("--file", action="store",help="input file name")
-#parser.add_argument("--dirname", action="store",help="input directory")
-#parser.add_argument("--nev",default=-1,action=store,type=int,help="number of events to process")
-#parser.add_argument("--output",default="Validation",action=store,help="output file name")
-#parser.add_argument("--t0",default=False,action=store_true,help="run T0 monitoring")
-#parser.add_argument("--tagTrigger",default="e26_lhtight_iloose",action=store,help="Tag trigger to TP")
-#parser.add_argument("--useMCMenu",default=False,action=store_true,help="Use MC menu to generate trigger list")
-#parser.add_argument("--usePhysicsMenu",default=False,action=store_true,help="Use MC menu to generate trigger list")
-
-#print 'Set some variables for job'
-dirtouse = str()
-
-finallist=[]
-#print 'Now parser'
-#args = parser.parse_args()
-#print 'Now setup filelist'
-#finallist.append(args.file)
-#print 'Or set the directory'
-#dirtouse=args.dirname
-#nov=args.nev
-#while( dirtouse.endswith('/') ) :
-#    dirtouse= dirtouse.rstrip('/')
-#    listfiles=os.listdir(dirtouse)
-#    for ll in listfiles:
-#        finallist.append(dirtouse+'/'+ll)
-#outputName = args.output
-#tagItem = args.Tagtrigger
-
-if 'FILE' in dir() :
-     finallist.append(FILE)
-elif 'DIR' in dir() :
-     dirtouse=DIR       
-     while( dirtouse.endswith('/') ) :
-          dirtouse= dirtouse.rstrip('/')
-     listfiles=os.listdir(dirtouse)
-     for ll in listfiles:
-          finallist.append(dirtouse+'/'+ll)
-
-if 'NOV' in dir():
-    nov=NOV
-else :
-    nov=-1
-
-if 'OUTPUT' in dir():
-    outputName = OUTPUT
-elif 'DOTIER0' in dir():
-    outputName = ''
-else:
-    outputName = 'Validation'
-
-if('TAG' in dir()):
-    tagItem = TAG 
-else: 
-    tagItem = 'e26_tight_iloose'
-
-
-athenaCommonFlags.FilesInput=finallist
-athenaCommonFlags.EvtMax=nov
-#athenaCommonFlags.EvtMax=-1
-rec.readAOD=True
-# switch off detectors
-rec.doForwardDet=False
-rec.doInDet=False
-rec.doCalo=False
-rec.doMuon=False
-rec.doEgamma=False
-rec.doTrigger = True; recAlgs.doTrigger=False # disable trigger (maybe necessary if detectors switched off)
-rec.doMuon=False
-rec.doMuonCombined=False
-rec.doWriteAOD=False
-rec.doWriteESD=False
-rec.doDPD=False
-rec.doTruth=False
-
-
-# autoconfiguration might trigger undesired feature
-rec.doESD.set_Value_and_Lock(False) # uncomment if do not run ESD making algorithms
-rec.doWriteESD.set_Value_and_Lock(False) # uncomment if do not write ESD
-rec.doAOD.set_Value_and_Lock(False) # uncomment if do not run AOD making algorithms
-rec.doWriteAOD.set_Value_and_Lock(False) # uncomment if do not write AOD
-rec.doWriteTAG.set_Value_and_Lock(False) # uncomment if do not write TAG
-
-# main jobOption
-include ("RecExCommon/RecExCommon_topOptions.py")
-
-# TDT
-from TrigDecisionTool.TrigDecisionToolConf import Trig__TrigDecisionTool
-ToolSvc += Trig__TrigDecisionTool( "TrigDecisionTool" )
-ToolSvc.TrigDecisionTool.TrigDecisionKey='xTrigDecision'
-
-# Configure the goodrunslist selector tool
-from GoodRunsLists.GoodRunsListsConf import *
-ToolSvc += GoodRunsListSelectorTool() 
-GoodRunsListSelectorTool.GoodRunsListVec = ['data15_13TeV.periodAllYear_DetStatus-v63-pro18-01_DQDefects-00-01-02_PHYS_StandardGRL_All_Good.xml']
-GoodRunsListSelectorTool.OutputLevel = DEBUG
-# Set base path for monitoring/validation tools        
-basePath = '/HLT/Egamma/'
-
-if 'DOTIER0' in dir():
-    from AthenaCommon.AlgSequence import AlgSequence,AthSequencer
-    topSequence = AlgSequence()
-    seq = AthSequencer("AthMasterSeq")
-    from GoodRunsListsUser.GoodRunsListsUserConf import *
-    seq += GRLTriggerSelectorAlg('GRLTriggerAlg1')
-    seq.GRLTriggerAlg1.GoodRunsListArray = ['PHYS_StandardGRL_All_Good']        ## pick up correct name from inside xml file!
-    
-    from AthenaMonitoring.AthenaMonitoringConf import AthenaMonManager
-    topSequence += AthenaMonManager( "HLTMonManager")
-    HLTMonManager = topSequence.HLTMonManager
-
-    ################ Mon Tools #################
-
-    #Global HLTMonTool
-
-    from TrigHLTMonitoring.TrigHLTMonitoringConf import HLTMonTool
-    HLTMon = HLTMonTool(name               = 'HLTMon',
-                   histoPathBase      = "HLT");
-
-
-    #ToolSvc += HLTMon;
-    HLTMonManager.AthenaMonTools += [ HLTMon ];
-    
-    from TrigEgammaAnalysisTools import TrigEgammaMonToolConfig
-    TrigEgammaMonTool = TrigEgammaMonToolConfig.TrigEgammaMonTool()
-    HLTMonManager.AthenaMonTools += [ TrigEgammaMonTool ]
-    HLTMonManager.FileKey = "GLOBAL"
-
-elif 'DO50ns' in dir():
-    from AthenaCommon.AlgSequence import AlgSequence,AthSequencer
-    topSequence = AlgSequence()
-    seq = AthSequencer("AthMasterSeq")
-    from GoodRunsListsUser.GoodRunsListsUserConf import *
-    seq += GRLTriggerSelectorAlg('GRLTriggerAlg1')
-    seq.GRLTriggerAlg1.GoodRunsListArray = ['PHYS_StandardGRL_All_Good']        ## pick up correct name from inside xml file!
-
-    from AthenaMonitoring.AthenaMonitoringConf import AthenaMonManager
-    topSequence += AthenaMonManager( "HLTMonManager")
-    HLTMonManager = topSequence.HLTMonManager
-
-    ################ Mon Tools #################
-
-    #Global HLTMonTool
-
-    from TrigHLTMonitoring.TrigHLTMonitoringConf import HLTMonTool
-    HLTMon = HLTMonTool(name               = 'HLTMon',
-                   histoPathBase      = "HLT");
-
-
-    #ToolSvc += HLTMon;
-    HLTMonManager.AthenaMonTools += [ HLTMon ];
-    
-    from TrigEgammaAnalysisTools import TrigEgammaMonToolConfig50ns
-    TrigEgammaMonTool = TrigEgammaMonToolConfig50ns.TrigEgammaMonTool()
-    HLTMonManager.AthenaMonTools += [ TrigEgammaMonTool ]
-    HLTMonManager.FileKey = "GLOBAL"
-elif 'DOPHYSVAL' in dir():
-    from AthenaCommon.AlgSequence import AlgSequence
-    topSequence = AlgSequence()
-    
-    from AthenaMonitoring.AthenaMonitoringConf import AthenaMonManager
-    monMan= AthenaMonManager( "PhysValMonManager")
-    monMan.FileKey = "PhysVal"
-    topSequence += monMan
-
-    from GaudiSvc.GaudiSvcConf import THistSvc
-    ServiceMgr += THistSvc()
-    
-    ServiceMgr.THistSvc.Output += ["PhysVal DATAFILE='PhysVal.root' OPT='RECREATE'"]
-    from TrigEgammaAnalysisTools import TrigEgammaPhysValMonToolConfig
-    TrigEgammaPhysValMonToolConfig.TrigEgammaPhysValMonTool()
-    monMan.AthenaMonTools += [ "TrigEgammaPhysValMonTool" ]
-else:
-   print "No job configured, options DOPHYSVAL=True or DOTIER0=True" 
-    
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisTools_emulator.py b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisTools_emulator.py
deleted file mode 100644
index d935bbb645d2..000000000000
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisTools_emulator.py
+++ /dev/null
@@ -1,250 +0,0 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-
-####################################################################################################
-# Job options for standalone and Tier0 running of AnalysisTools 
-# Authors: 
-# Ryan Mackenzie White <ryan.white@cern.ch>
-# Joao Victor Pinto    <jodafons@cern.ch>
-# 
-# Tool and algorithm configuration done using egamma Factories
-#
-# To run
-# athena -l DEBUG -c "DIR='/afs/cern.ch/work/j/jolopezl/datasets/\
-#                     valid1.147406.PowhegPythia8_AZNLO_Zee.recon.AOD.e3099_s2578_r6220_tid05203475_00'" 
-#                 -c "NOV=50" test_ZeeElectronLowPtSupportingTrigAnalysis.py
-# where NOV is the number of events to run
-####################################################################################################
-
-
-from AthenaCommon.AthenaCommonFlags import athenaCommonFlags
-from RecExConfig.RecFlags import rec
-from RecExConfig.RecAlgsFlags import recAlgs
-from AthenaCommon.AppMgr import ToolSvc
-import os
-
-# Define triggers for tagging 
-tagList = ['HLT_e24_lhtight_nod0_ivarloose',
-           'HLT_e26_lhtight_nod0_ivarloose',
-           'HLT_e28_lhtight_nod0_ivarloose']
-
-triggerList_commissioning_v1 = [
-          
-         # standard monitoring chains
-         #'HLT_e17_lhvloose_nod0_L1EM15VHI',
-         'HLT_e17_lhvloose_nod0',
-         'HLT_e26_lhloose_nod0',
-         'HLT_e26_lhmedium_nod0',
-         #'HLT_e26_lhtight_nod0',
-         #'HLT_e26_lhtight_nod0_ivarloose',
-         'HLT_e28_lhtight_nod0_ivarloose',
-         'HLT_e60_lhmedium_nod0_L1EM24VHI',
-         'HLT_e140_lhloose_nod0_L1EM24VHI',
-         # ringer chains for the commissioning...
-         #'HLT_e17_lhvloose_nod0_ringer_L1EM15VHI',
-         'HLT_e17_lhvloose_nod0_ringer',
-         'HLT_e26_lhloose_nod0_ringer',
-         'HLT_e26_lhmedium_nod0_ringer',
-         #'HLT_e26_lhtight_nod0_ringer',
-         #'HLT_e26_lhtight_nod0_ringer_ivarloose',
-         'HLT_e28_lhtight_nod0_ringer_ivarloose',
-         'HLT_e60_lhmedium_nod0_ringer_L1EM24VHI',
-         'HLT_e140_lhloose_nod0_ringer_L1EM24VHI',
-    ]
-
-
-triggerList_monitoring_v1 = [
-         # standard monitoring chains
-         'HLT_e17_lhvloose_nod0_L1EM15VHI',
-         'HLT_e26_lhtight_nod0_ivarloose',
-         'HLT_e28_lhtight_nod0_icaloloose',
-         'HLT_e60_lhmedium_nod0_L1EM24VHI',
-         'HLT_e140_lhloose_nod0_L1EM24VHI',
-         # no ringer chains for pos-commissioning...
-         'HLT_e17_lhvloose_nod0_noringer_L1EM15VHI',
-         'HLT_e26_lhtight_nod0_noringer_ivarloose',
-         'HLT_e28_lhtight_nod0_noringer_ivarloose',
-         'HLT_e60_lhmedium_nod0_noringer_L1EM24VHI',
-         'HLT_e140_lhloose_nod0_noringer_L1EM24VHI',
-
-      ]
-
-
-triggerList = triggerList_monitoring_v1
-
-doGRL=False
-doEmulation=True
-DetailedHistograms=False
-####################################################################################################
-dirtouse = str()
-finallist=[]
-grllist=[]
-
-from AthenaCommon.AthenaCommonFlags import athenaCommonFlags as acf
-from glob import glob
-
-if ('FILE' in dir()):
-    acf.FilesInput=[FILE]
-elif ('DIR' in dir()):
-    inputFiles = glob(DIR+'*')
-    acf.FilesInput=inputFiles
-if 'NOV' in dir():
-    nov=NOV
-else :
-    nov=500
-if 'GRL' in dir():
-  grllist.append(GRL)
-else:
-  #grllist.append('/afs/cern.ch/work/j/jodafons/public/data/data15_13TeV.periodAllYear_DetStatus-v79-repro20-02_DQDefects-00-02-02_PHYS_StandardGRL_All_Good_25ns.xml')
-  #grllist.append('data15_13TeV.periodAllYear_DetStatus-v79-repro20-02_DQDefects-00-02-02_PHYS_StandardGRL_All_Good_25ns.xml')
-  #grllist.append('/afs/cern.ch/work/j/jodafons/public/data/data16_13TeV.periodAllYear_DetStatus-v81-pro20-10_DQDefects-00-02-02_PHYS_StandardGRL_All_Good_25ns.xml')
-  #grllist.append('data16_13TeV.periodAllYear_DetStatus-v81-pro20-10_DQDefects-00-02-02_PHYS_StandardGRL_All_Good_25ns.xml')
-  grllist.append('data17_13TeV.periodAllYear_DetStatus-v92-pro21-05_Unknown_PHYS_StandardGRL_All_Good_25ns_Triggerno17e33prim.xml')
-
-####################################################################################################
-
-acf.EvtMax=nov
-rec.readAOD=True
-# switch off detectors
-rec.doForwardDet=False
-rec.doInDet=False
-rec.doCalo=False
-rec.doMuon=False
-rec.doEgamma=False
-rec.doTrigger=True
-recAlgs.doTrigger=False # disable trigger (maybe necessary if detectors switched off)
-rec.doMuon=False
-rec.doMuonCombined=False
-rec.doWriteAOD=True
-rec.doWriteESD=False
-rec.doDPD=False
-rec.doTruth=False
-# autoconfiguration might trigger undesired feature
-rec.doESD.set_Value_and_Lock(False)      # uncomment if do not run ESD making algorithms
-rec.doWriteESD.set_Value_and_Lock(False) # uncomment if do not write ESD
-rec.doAOD.set_Value_and_Lock(True)       # uncomment if do not run AOD making algorithms
-rec.doWriteAOD.set_Value_and_Lock(False) # uncomment if do not write AOD
-rec.doWriteTAG.set_Value_and_Lock(False) # uncomment if do not write TAG
-
-# main jobOption
-include ("RecExCommon/RecExCommon_topOptions.py")
-MessageSvc.debugLimit = 20000000
-MessageSvc.infoLimit  = 20000000
-
-# Add Trigger Decision Tool 
-from TrigDecisionTool.TrigDecisionToolConf import Trig__TrigDecisionTool
-tdt = Trig__TrigDecisionTool( "TrigDecisionTool" )
-tdt.TrigDecisionKey='xTrigDecision'
-tdt.Navigation.ReadonlyHolders=True
-ToolSvc+=tdt
-
-try:
-  include ("AthenaMonitoring/DataQualityInit_jobOptions.py")
-except Exception:
-  treatException("Could not load AthenaMonitoring/DataQualityInit_jobOptions.py")
-
-
-
-
-# Call top sequence
-from AthenaCommon.AlgSequence import AlgSequence, AthSequencer
-topSequence = AlgSequence()
-
-
-##################################### GRL Tools ##########################################
-# Good Run List (GRL)
-if doGRL:
-    from PyUtils.MetaReaderPeeker import metadata
-    try:
-        if metadata['eventTypes'][0] == 'IS_DATA':
-            from GoodRunsLists.GoodRunsListsConf import *
-            ToolSvc += GoodRunsListSelectorTool()
-            GoodRunsListSelectorTool.GoodRunsListVec = grllist
-            from GoodRunsListsUser.GoodRunsListsUserConf import *
-            seq = AthSequencer("AthFilterSeq")
-            seq += GRLTriggerSelectorAlg('GRLTriggerAlg1')
-            #seq.GRLTriggerAlg1.GoodRunsListArray = ['PHYS_StandardGRL_All_Good_25ns']
-            seq.GRLTriggerAlg1.GoodRunsListArray = [grllist[0].replace('.xml','')]
-    except:
-        print("GRL not available!")
-  
-##################################### Mon Tools ##########################################
-
-from AthenaMonitoring.AthenaMonitoringConf import AthenaMonManager
-topSequence += AthenaMonManager( "HLTMonManager")
-HLTMonManager = topSequence.HLTMonManager
-################ Mon Tools #################
-#Global HLTMonTool
-from TrigHLTMonitoring.TrigHLTMonitoringConf import HLTMonTool
-HLTMon = HLTMonTool(name  = 'HLTMon', histoPathBase = "HLT");
-ToolSvc += HLTMon;
-HLTMonManager.AthenaMonTools += [ "HLTMonTool/HLTMon" ];
-
-####################################################################################################
-#Define the base path for all histograms
-
-
-
-basePath = '/HLT/Egamma'
-#Configure the TrigEgammaPlotTool
-from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConfig import TrigEgammaNavTPAnalysisTool, TrigEgammaPlotTool, EfficiencyTool, DistTool, ResolutionTool
-from TrigEgammaAnalysisTools.TrigEgammaProbelist           import monitoring_mam, monitoring_electron, monitoring_photon 
-from TrigEgammaAnalysisTools.TrigEgammaProbelist           import probeListLowMidPtSupportingTriggers, probeListHighPtSupportingTriggers
-
-PlotTool = TrigEgammaPlotTool.copy( name="TrigEgammaPlotTool",
-                                    DirectoryPath=basePath,
-                                    MaM=monitoring_mam,
-                                    Efficiency=[],
-                                    Distribution=[],
-                                    Resolution=[])
-
-EffTool = EfficiencyTool.copy(name="EfficiencyTool",
-                              PlotTool=PlotTool,
-                              isEMResultNames=["Tight","Medium","Loose"],
-                              LHResultNames=["LHTight","LHMedium","LHLoose"],
-                              OutputLevel=0)
-
-
-
-####################################################################################################
-from TrigEgammaEmulationTool.TrigEgammaEmulationToolConfig import TrigEgammaEmulationTool
-from TrigEgammaEmulationTool.TrigEgammaEmulationEFConfig   import EgammaEFElectronDefaultEmulator,EgammaEFElectronNoD0Emulator
-from TriggerJobOpts.TriggerFlags import TriggerFlags
-
-# Force this emulation selector path
-TriggerFlags.EgammaSlice.pidVersion.set_Value_and_Lock("ElectronPhotonSelectorTools/trigger/rel21_20170217/")
-TriggerFlags.EgammaSlice.ringerVersion.set_Value_and_Lock("RingerSelectorTools/TrigL2_20170505_v6")
-
-EmulationElectronTool = TrigEgammaEmulationTool.copy( name="TrigEgammaEmulationTool",
-                                                      TriggerList = triggerList,
-                                                      DoL2ElectronFex=True,
-                                                      DoEFCaloPid=False,
-                                                      DoRinger=True,
-                                                      OutputLevel=0)
-
-####################################################################################################
-
-AnalysisTool = TrigEgammaNavTPAnalysisTool( name = "TrigEgammaNavTPAnalysisTool",
-                                            Analysis='Zee',
-                                            PlotTool=PlotTool,
-                                            Tools=[EffTool],
-                                            OfflineTagSelector='Tight', # 1=tight, 2=medium, 3=loose
-                                            OfflineProbeSelector='Loose', 
-                                            DefaultProbePid='LHMedium',
-                                            doEmulation=doEmulation,
-                                            DetailedHistograms=DetailedHistograms,
-                                            EmulationTool=EmulationElectronTool,
-                                            TPTrigger=False,
-                                            RemoveCrack=False,
-                                            TagTriggerList=tagList,
-                                            TriggerList=triggerList,
-                                            OutputLevel=0)
-
-####################################################################################################
-Tools=['TrigEgammaNavTPAnalysisTool/TrigEgammaNavTPAnalysisTool']
-from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConf import TrigEgammaMonTool
-TrigEgammaMonTool = TrigEgammaMonTool( name = "HLTEgammaMon", histoPathBase=basePath, Tools=Tools)
-ToolSvc += TrigEgammaMonTool
-HLTMonManager.AthenaMonTools += [ "TrigEgammaMonTool/HLTEgammaMon" ]
-HLTMonManager.FileKey = "GLOBAL"
-ToolSvc.TrigDecisionTool.Navigation.OutputLevel = WARNING
-####################################################################################################
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaEventSelectionTool.py b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaEventSelectionTool.py
deleted file mode 100644
index ba72df178c83..000000000000
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaEventSelectionTool.py
+++ /dev/null
@@ -1,195 +0,0 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-
-# Job options for standalone and Tier0 running of AnalysisTools 
-# Authors: 
-# Ryan Mackenzie White <ryan.white@cern.ch>
-# 
-# Tool and algorithm configuration done using egamma Factories
-# Default configurations found in TrigEgammaAnalysisToolsConfig
-#
-# To run
-# athena -l DEBUG -c "DIR='/afs/cern.ch/work/j/jolopezl/datasets/valid1.147406.PowhegPythia8_AZNLO_Zee.recon.AOD.e3099_s2578_r6220_tid05203475_00'" 
-#                 -c "NOV=50" test_ZeeElectronLowPtSupportingTrigAnalysis.py
-# where NOV is the number of events to run
-
-from AthenaCommon.AthenaCommonFlags import athenaCommonFlags
-from RecExConfig.RecFlags import rec
-from RecExConfig.RecAlgsFlags import recAlgs
-from AthenaCommon.AppMgr import ToolSvc
-import os
-
-doZ=True
-doFakes=True
-
-# Define triggers for tagging 
-triggerTags     = ['HLT_e24_lhtight_nod0_ivarloose',
-                   'HLT_e26_lhtight_nod0_ivarloose',
-                   'HLT_e28_lhtight_nod0_ivarloose']
-
-triggerList = [
-         # standard monitoring chains
-         'HLT_e26_lhtight_nod0_ivarloose',
-         'HLT_e28_lhtight_nod0_ivarloose',
-         'HLT_e60_lhmedium_nod0_L1EM24VHI',
-         # no ringer chains for pos-commissioning...
-         'HLT_e26_lhtight_nod0_noringer_ivarloose_L1EM22VHI',
-         'HLT_e28_lhtight_nod0_noringer_ivarloose', # get real TDT
-         'HLT_e28_lhtight_nod0_noringer_ivarloose_L1EM24VHI',
-         'HLT_e60_lhmedium_nod0_noringer_L1EM24VHI',
-      ]
-
-
-
-#print 'Set some variables for job'
-dirtouse = str()
-finallist=[]
-
-if 'FILE' in dir() :
-     finallist.append(FILE)
-
-if 'DIR' in dir() :
-     dirtouse=DIR      
-     print 'DIR = ',dirtouse
-     while( dirtouse.endswith('/') ) :
-          dirtouse= dirtouse.rstrip('/')
-     listfiles=os.listdir(dirtouse)
-     for ll in listfiles:
-          finallist.append(dirtouse+'/'+ll)
-
-if 'NOV' in dir():
-    nov=NOV
-else :
-    nov=-1
-
-
-print  finallist 
-athenaCommonFlags.FilesInput=finallist
-athenaCommonFlags.EvtMax=nov
-rec.readAOD=True
-# switch off detectors
-rec.doForwardDet=False
-rec.doInDet=False
-rec.doCalo=False
-rec.doMuon=False
-rec.doEgamma=False
-rec.doTrigger = True; recAlgs.doTrigger=False # disable trigger (maybe necessary if detectors switched off)
-rec.doMuon=False
-rec.doAOD=False
-rec.doMuonCombined=False
-rec.doWriteAOD=False
-rec.doWriteESD=False
-rec.doDPD=False
-rec.doTruth=False
-
-# autoconfiguration might trigger undesired feature
-rec.doESD.set_Value_and_Lock(False) # uncomment if do not run ESD making algorithms
-rec.doWriteESD.set_Value_and_Lock(False) # uncomment if do not write ESD
-rec.doAOD.set_Value_and_Lock(True) # uncomment if do not run AOD making algorithms
-rec.doWriteAOD.set_Value_and_Lock(False) # uncomment if do not write AOD
-rec.doWriteTAG.set_Value_and_Lock(False) # uncomment if do not write TAG
-
-# main jobOption
-include ("RecExCommon/RecExCommon_topOptions.py")
-MessageSvc.debugLimit = 20000000
-MessageSvc.infoLimit  = 20000000
-# TDT
-from TrigDecisionTool.TrigDecisionToolConf import Trig__TrigDecisionTool
-tdt = Trig__TrigDecisionTool( "TrigDecisionTool" )
-tdt.TrigDecisionKey='xTrigDecision'
-tdt.Navigation.ReadonlyHolders=True
-ToolSvc+=tdt
-
-try:
-  include ("AthenaMonitoring/DataQualityInit_jobOptions.py")
-except Exception:
-  treatException("Could not load AthenaMonitoring/DataQualityInit_jobOptions.py")
-
-from AthenaCommon.AlgSequence import AlgSequence
-topSequence = AlgSequence()
-
-from AthenaMonitoring.AthenaMonitoringConf import AthenaMonManager
-topSequence += AthenaMonManager( "HLTMonManager")
-HLTMonManager = topSequence.HLTMonManager
-
-################ Mon Tools #################
-#Global HLTMonTool
-
-from TrigHLTMonitoring.TrigHLTMonitoringConf import HLTMonTool
-HLTMon = HLTMonTool(name  = 'HLTMon', histoPathBase = "HLT");
-
-ToolSvc += HLTMon;
-HLTMonManager.AthenaMonTools += [ "HLTMonTool/HLTMon" ];
-    
-from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConfig import TrigEgammaPlotTool, getEventSelectionTool
-#Define the base path for all histograms
-basePath = '/HLT/Physval'
-
-#Configure the TrigEgammaPlotTool
-PlotTool = TrigEgammaPlotTool.copy( name="TrigEgammaPlotTool",
-                                    DirectoryPath=basePath,
-                                    #MaM=monitoring_mam,
-                                    Efficiency=[],
-                                    Distribution=[],
-                                    Resolution=[])
-
-TrigEgammaEventSelection = getEventSelectionTool()
-
-####################################################################################################
-
-from TrigEgammaEmulationTool.TrigEgammaEmulationToolConfig import TrigEgammaEmulationTool
-from TrigEgammaEmulationTool.TrigEgammaEmulationEFConfig   import EgammaEFElectronDefaultEmulator,EgammaEFElectronNoD0Emulator
-from TriggerJobOpts.TriggerFlags import TriggerFlags
-
-# Force this emulation selector path
-TriggerFlags.EgammaSlice.pidVersion.set_Value_and_Lock("ElectronPhotonSelectorTools/trigger/rel21_20170217/")
-TriggerFlags.EgammaSlice.ringerVersion.set_Value_and_Lock("RingerSelectorTools/TrigL2_20170505_v6")
-
-EmulationElectronTool = TrigEgammaEmulationTool.copy( name="TrigEgammaEmulationTool",
-                                                      TriggerList = triggerList,
-                                                      DoL2ElectronFex=True,
-                                                      DoEFCaloPid=False,
-                                                      DoRinger=True,
-                                                      OutputLevel=0)
-
-####################################################################################################
-
-
-Tool = TrigEgammaEventSelection( name='EventSelection',
-                              Analysis='Probes',
-                              PlotTool=PlotTool,
-                              EmulationTool=EmulationElectronTool,
-                              File="",
-                              OutputLevel=0,
-                              DetailedHistograms=False,
-                              isEMResultNames=["Tight","Medium","Loose"],
-                              LHResultNames=["LHTight","LHMedium","LHLoose"],
-                              ZeeLowerMass=80,
-                              ZeeUpperMass=100,
-                              OfflineTagSelector='Tight', # 1=tight, 2=medium, 3=loose
-                              OfflineProbeSelector='Loose', 
-                              ForceProbePid=False, 
-                              OppositeCharge=True,
-                              OfflineTagMinEt=25,
-                              TagTriggerList=triggerTags,
-                              SelectionZ=doZ,
-                              SelectionFakes=doFakes,
-                              ApplyMinimalTrigger=False,
-                              DetailedDataLevel=2,
-                              DumpTags=False,
-                              TriggerList=triggerList)
-
-Tools=['TrigEgammaEventSelection/EventSelection']
-
-from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConf import TrigEgammaMonTool
-TrigEgammaMonTool = TrigEgammaMonTool( name = "HLTEgammaMon", 
-                                       histoPathBase=basePath,
-                                       Tools=Tools)
-
-ToolSvc += TrigEgammaMonTool
-
-#TrigEgammaMonToolConfig.TrigEgammaMonTool()
-HLTMonManager.AthenaMonTools += [ "TrigEgammaMonTool/HLTEgammaMon" ]
-HLTMonManager.FileKey = "GLOBAL"
-
-
-    
-- 
GitLab


From b9acd9a9ef5d168d6591e7dc9d9ddee6b347aab3 Mon Sep 17 00:00:00 2001
From: Nicolas Koehler <nicolas.koehler@cern.ch>
Date: Tue, 22 Dec 2020 15:22:45 +0000
Subject: [PATCH 223/225] Rename Trk::SegmentCollection to TrackMuonSegments to
 avoid duplicate (ATLASRECTS-5667)

---
 .../xAOD/xAODMuonCnv/src/MuonSegmentCnvAlg.h  |  2 +-
 .../python/MuonReconstructionConfig.py        |  2 +-
 .../python/MuonSegmentFindingConfig.py        | 17 ++--
 .../python/MuonTrackBuildingConfig.py         |  2 +-
 .../MuonRecExample/python/MuonStandalone.py   | 15 ++--
 .../share/MuonRecOutputItemList_jobOptions.py |  4 +-
 .../src/MuonSegmentFinderAlg.h                |  4 +-
 .../src/MuonPhysValMonitoringTool.cxx         | 79 ++++++-------------
 .../src/MuonPhysValMonitoringTool.h           | 69 ++++++----------
 .../CscRawDataMonitoring/CSCSegmValAlg.h      |  2 +-
 .../CscRawDataMonitoring/CSCSegmValMonAlg.h   |  3 +-
 .../share/CSCMon_jobOptions.py                |  4 +-
 .../share/CscRawESD_MonitoringOptions.py      |  4 -
 .../src/CSCSegmValMonAlg.cxx                  | 12 +++
 .../MdtRawDataMonitoring/MdtRawDataMonAlg.h   |  3 +-
 .../MdtRawDataMonitoring/MdtRawDataValAlg.h   |  2 +-
 .../src/MdtRawDataMonAlg.cxx                  | 15 +++-
 .../PrimaryDPDMaker/share/DESDM_IDALIGN.py    |  4 +-
 .../PrimaryDPDMaker/share/DESD_DEDX.py        |  4 +-
 .../PrimaryDPDMaker/share/PerfDESDM_MS.py     |  2 +-
 .../PrimaryDPDMaker/share/PerfDPD_AllCells.py |  4 +-
 .../PrimaryDPDMaker/share/PerfDPD_EGamma.py   |  4 +-
 .../PrimaryDPDMaker/share/PerfDPD_EOverP.py   |  4 +-
 .../PrimaryDPDMaker/share/PerfDPD_Jet.py      |  4 +-
 .../share/PerfDPD_PhotonJet.py                |  4 +-
 .../PrimaryDPDMaker/share/PerfDPD_SGLEL.py    |  4 +-
 .../share/PerfDPD_TtbarMuon.py                |  4 +-
 .../share/PhysDPD_HIPs.py                     |  4 +-
 .../src/MuonCombinedInDetExtensionAlg.h       |  7 +-
 .../MuonCombinedReconstructionConfig.py       |  2 +-
 .../python/MuonCombinedAlgs.py                | 21 +----
 .../RecBackgroundAlgs/BeamBackgroundFiller.h  |  4 +-
 .../share/RecBackground_jobOptions.py         |  2 +-
 .../python/HLTMenuConfig/Muon/MuonSetup.py    |  6 +-
 34 files changed, 129 insertions(+), 194 deletions(-)

diff --git a/Event/xAOD/xAODMuonCnv/src/MuonSegmentCnvAlg.h b/Event/xAOD/xAODMuonCnv/src/MuonSegmentCnvAlg.h
index ed64557d5427..08f850428c44 100644
--- a/Event/xAOD/xAODMuonCnv/src/MuonSegmentCnvAlg.h
+++ b/Event/xAOD/xAODMuonCnv/src/MuonSegmentCnvAlg.h
@@ -36,7 +36,7 @@ namespace xAODMaker {
 
    private:
      // the following segments do NOT contain MuGirl segments
-     SG::ReadHandleKey<Trk::SegmentCollection> m_muonSegmentLocation{this,"SegmentContainerName","MuonSegments"};
+     SG::ReadHandleKey<Trk::SegmentCollection> m_muonSegmentLocation{this,"SegmentContainerName","TrackMuonSegments"};
      SG::WriteHandleKey<xAOD::MuonSegmentContainer> m_xaodContainerName{this,"xAODContainerName","MuonSegments"};
 
      ToolHandle<xAODMaker::IMuonSegmentConverterTool> m_muonSegmentConverterTool{this,"MuonSegmentConverterTool","Muon::MuonSegmentConverterTool/MuonSegmentConverterTool"};
diff --git a/MuonSpectrometer/MuonConfig/python/MuonReconstructionConfig.py b/MuonSpectrometer/MuonConfig/python/MuonReconstructionConfig.py
index 25fb367cb01d..421518f5059f 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonReconstructionConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonReconstructionConfig.py
@@ -55,7 +55,7 @@ if __name__=="__main__":
     muon_edm_helper_svc = Muon__MuonEDMHelperSvc("MuonEDMHelperSvc")
     cfg.addService( muon_edm_helper_svc )
 
-    itemsToRecord = ["Trk::SegmentCollection#MuonSegments", "Trk::SegmentCollection#NCB_MuonSegments"]
+    itemsToRecord = ["Trk::SegmentCollection#TrackMuonSegments", "Trk::SegmentCollection#NCB_TrackMuonSegments"]
     itemsToRecord += ["TrackCollection#MuonSpectrometerTracks"] 
     SetupMuonStandaloneOutput(cfg, ConfigFlags, itemsToRecord)
     
diff --git a/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py b/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py
index ec455944705b..ea0c9e213fc3 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py
@@ -610,7 +610,7 @@ def MooSegmentFinderAlgCfg(flags, name = "MuonSegmentMaker",  **kwargs):
     # FIXME - this really shouldn't be set here! 
     kwargs.setdefault('TgcPrepDataContainer', 'TGC_MeasurementsAllBCs' if not flags.Muon.useTGCPriorNextBC and not flags.Muon.useTGCPriorNextBC else 'TGC_Measurements')
         
-    kwargs.setdefault('MuonSegmentOutputLocation', "ThirdChainSegments" if flags.Muon.segmentOrigin=="TruthTracking" else "MuonSegments")
+    kwargs.setdefault('MuonSegmentOutputLocation', "ThirdChainSegments" if flags.Muon.segmentOrigin=="TruthTracking" else "TrackMuonSegments")
 
     moo_segment_finder_alg = MooSegmentFinderAlg( name=name, **kwargs )
     moo_segment_finder_alg.Cardinality=10
@@ -645,7 +645,7 @@ def MooSegmentFinderAlg_NCBCfg(flags, name = "MuonSegmentMaker_NCB", **kwargs):
 
     # Now set other NCB properties
     kwargs.setdefault('MuonPatternCombinationLocation', "NCB_MuonHoughPatternCombinations" )
-    kwargs.setdefault('MuonSegmentOutputLocation', "NCB_MuonSegments" )
+    kwargs.setdefault('MuonSegmentOutputLocation', "NCB_TrackMuonSegments" )
     kwargs.setdefault('UseCSC', flags.Muon.doCSCs)
     kwargs.setdefault('UseMDT', False)
     kwargs.setdefault('UseRPC', False)
@@ -679,7 +679,7 @@ def MuonSegmentFindingCfg(flags, cardinality=1):
     result.merge(acc)
     return result
 
-if __name__=="__main__":                        
+if __name__=="__main__":
     # To run this, do e.g. 
     # python -m MuonConfig.MuonSegmentFindingConfig --run --threads=1
     from MuonConfig.MuonConfigUtils import SetupMuonStandaloneArguments, SetupMuonStandaloneConfigFlags, SetupMuonStandaloneOutput, SetupMuonStandaloneCA
@@ -707,13 +707,13 @@ if __name__=="__main__":
     pps = ProxyProviderSvc()
     ars=AddressRemappingSvc()
     pps.ProviderNames += [ 'AddressRemappingSvc' ]
-    ars.TypeKeyRenameMaps += [ '%s#%s->%s' % ("Trk::SegmentCollection", "MuonSegments", "MuonSegments_old") ]
-    ars.TypeKeyRenameMaps += [ '%s#%s->%s' % ("Trk::SegmentCollection", "MuonSegments_NCB", "MuonSegments_NCB_old") ]
-    
+    ars.TypeKeyRenameMaps += [ '%s#%s->%s' % ("Trk::SegmentCollection", "TrackMuonSegments", "TrackMuonSegments_old") ]
+    ars.TypeKeyRenameMaps += [ '%s#%s->%s' % ("Trk::SegmentCollection", "NCB_TrackMuonSegments", "NCB_TrackMuonSegments_old") ]
+
     cfg.addService(pps)
     cfg.addService(ars)
-    
-    itemsToRecord = ["Trk::SegmentCollection#MuonSegments", "Trk::SegmentCollection#NCB_MuonSegments"]
+
+    itemsToRecord = ["Trk::SegmentCollection#TrackMuonSegments", "Trk::SegmentCollection#NCB_TrackMuonSegments"]
     SetupMuonStandaloneOutput(cfg, ConfigFlags, itemsToRecord)
 
     # cfg.getService("StoreGateSvc").Dump = True
@@ -727,4 +727,3 @@ if __name__=="__main__":
         if not sc.isSuccess():
             import sys
             sys.exit("Execution failed")
-    
diff --git a/MuonSpectrometer/MuonConfig/python/MuonTrackBuildingConfig.py b/MuonSpectrometer/MuonConfig/python/MuonTrackBuildingConfig.py
index c66983c0fca2..3036fb462f03 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonTrackBuildingConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonTrackBuildingConfig.py
@@ -527,7 +527,7 @@ def MuonTrackBuildingCfg(flags, name = "MuPatTrackBuilder"):
     track_steering = acc.getPrimary()
     result.merge(acc)
     
-    track_builder = MuPatTrackBuilder(name=name, TrackSteering = track_steering, MuonSegmentCollection="MuonSegments", SpectrometerTrackOutputLocation="MuonSpectrometerTracks" )
+    track_builder = MuPatTrackBuilder(name=name, TrackSteering = track_steering, MuonSegmentCollection="TrackMuonSegments", SpectrometerTrackOutputLocation="MuonSpectrometerTracks" )
 
     result.addEventAlgo( track_builder, primary=True )
     return result
diff --git a/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonStandalone.py b/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonStandalone.py
index bed770e06a53..45f35c51658f 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonStandalone.py
+++ b/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonStandalone.py
@@ -66,7 +66,7 @@ def MooSegmentFinderAlg( name="MuonSegmentMaker",**kwargs ):
     kwargs.setdefault("SegmentFinder", getPublicToolClone("MuonSegmentFinder","MooSegmentFinder",
                                                           DoSummary=muonStandaloneFlags.printSummary()))
     kwargs.setdefault("MuonClusterSegmentFinderTool",getPublicTool("MuonClusterSegmentFinder"))
-    kwargs.setdefault("MuonSegmentOutputLocation", "MuonSegments")
+    kwargs.setdefault("MuonSegmentOutputLocation", "TrackMuonSegments")
     kwargs.setdefault("UseCSC", muonRecFlags.doCSCs())
     kwargs.setdefault("UseMDT", muonRecFlags.doMDTs())
     kwargs.setdefault("UseRPC", muonRecFlags.doRPCs())
@@ -94,8 +94,7 @@ def MooSegmentFinderNCBAlg( name="MuonSegmentMaker_NCB",**kwargs ):
                                                                                                  segmentTool = getPublicTool("CscSegmentUtilTool_NCB")) if MuonGeometryFlags.hasCSC() else ""),
                                                          DoMdtSegments=False,DoSegmentCombinations=False,DoSegmentCombinationCleaning=False))
     kwargs.setdefault("MuonPatternCombinationLocation", "NCB_MuonHoughPatternCombinations")
-    kwargs.setdefault("MuonSegmentOutputLocation", "NCB_MuonSegments")
-    kwargs.setdefault("MuonSegmentOutputLocation", "NCB_MuonSegments")
+    kwargs.setdefault("MuonSegmentOutputLocation", "NCB_TrackMuonSegments")
     kwargs.setdefault("UseCSC", muonRecFlags.doCSCs())
     kwargs.setdefault("UseMDT", False)
     kwargs.setdefault("UseRPC", False)
@@ -146,7 +145,7 @@ class MuonStandalone(ConfiguredMuonRec):
         super(MuonStandalone,self).configure(keys)
         if not self.isEnabled(): return
 
-        SegmentLocation = "MuonSegments"
+        SegmentLocation = "TrackMuonSegments"
         if muonStandaloneFlags.segmentOrigin == 'TruthTracking':
             SegmentLocation = "ThirdChainSegments"
 
@@ -189,7 +188,7 @@ class MuonStandalone(ConfiguredMuonRec):
             self.addAlg(MooSegmentFinderNCBAlg("MuonSegmentMaker_NCB"))
 
             if (not cfgKeyStore.isInInput ('xAOD::MuonSegmentContainer', 'MuonSegments_NCB')):
-                self.addAlg( CfgMgr.xAODMaker__MuonSegmentCnvAlg("MuonSegmentCnvAlg_NCB",SegmentContainerName="NCB_MuonSegments",xAODContainerName="NCB_MuonSegments") )
+                self.addAlg( CfgMgr.xAODMaker__MuonSegmentCnvAlg("MuonSegmentCnvAlg_NCB",SegmentContainerName="NCB_TrackMuonSegments",xAODContainerName="NCB_MuonSegments") )
 
         if (not cfgKeyStore.isInInput ('xAOD::MuonSegmentContainer', 'MuonSegments')):
             self.addAlg( CfgMgr.xAODMaker__MuonSegmentCnvAlg("MuonSegmentCnvAlg") )
@@ -200,13 +199,9 @@ class MuonStandalone(ConfiguredMuonRec):
         #
         # add the algorithm (which uses the MuonTrackSteering)
         # 
-        TrackBuilder = CfgMgr.MuPatTrackBuilder("MuPatTrackBuilder", TrackSteering = getPublicTool("MuonTrackSteering") )
+        TrackBuilder = CfgMgr.MuPatTrackBuilder("MuPatTrackBuilder", TrackSteering=getPublicTool("MuonTrackSteering"), SpectrometerTrackOutputLocation="MuonSpectrometerTracks", MuonSegmentCollection="TrackMuonSegments")
         self.addAlg( TrackBuilder )
-        
-        self.registerOutputKey("MuonSpectrometerTracks",   self.MuPatTrackBuilder, "SpectrometerTrackOutputLocation")
-        self.registerInputKey ("MuonSegments", self.MuPatTrackBuilder, "MuonSegmentCollection"   )
 
-        
         if muonStandaloneFlags.createTrackParticles():
             xAODTrackParticleCnvAlg = MuonStandaloneTrackParticleCnvAlg("MuonStandaloneTrackParticleCnvAlg")
             self.addAlg( xAODTrackParticleCnvAlg )
diff --git a/MuonSpectrometer/MuonReconstruction/MuonRecExample/share/MuonRecOutputItemList_jobOptions.py b/MuonSpectrometer/MuonReconstruction/MuonRecExample/share/MuonRecOutputItemList_jobOptions.py
index b9b149554ae0..20be4a64712d 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonRecExample/share/MuonRecOutputItemList_jobOptions.py
+++ b/MuonSpectrometer/MuonReconstruction/MuonRecExample/share/MuonRecOutputItemList_jobOptions.py
@@ -82,8 +82,8 @@ if DetFlags.detdescr.Muon_on() and rec.doWriteESD():
    MuonESDList+=["RpcSectorLogicContainer#RPC_SECTORLOGIC"]
 
    # Segments
-   MuonESDList+=["Trk::SegmentCollection#MuonSegments"]
-   MuonESDList+=["Trk::SegmentCollection#NCB_MuonSegments"]
+   MuonESDList+=["Trk::SegmentCollection#TrackMuonSegments"]
+   MuonESDList+=["Trk::SegmentCollection#NCB_TrackMuonSegments"]
 
    # Tracks
    MuonESDList+=["TrackCollection#MuonSpectrometerTracks"] 
diff --git a/MuonSpectrometer/MuonReconstruction/MuonSegmentCombiners/MuonSegmentCombinerTools/MooSegmentCombinationFinder/src/MuonSegmentFinderAlg.h b/MuonSpectrometer/MuonReconstruction/MuonSegmentCombiners/MuonSegmentCombinerTools/MooSegmentCombinationFinder/src/MuonSegmentFinderAlg.h
index 9d974f2d0fcb..8b9dd8c52d36 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonSegmentCombiners/MuonSegmentCombinerTools/MooSegmentCombinationFinder/src/MuonSegmentFinderAlg.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonSegmentCombiners/MuonSegmentCombinerTools/MooSegmentCombinationFinder/src/MuonSegmentFinderAlg.h
@@ -106,11 +106,11 @@ class MuonSegmentFinderAlg : public AthReentrantAlgorithm {
         "Csc4dSegmentMaker/Csc4dSegmentMaker",
     };
 
-    // the following Trk::SegmentCollection MuonSegments are sttandard MuonSegments, the MuGirl segments are stored in MuonCreatorAlg.h
+    // the following Trk::SegmentCollection MuonSegments are standard MuonSegments, the MuGirl segments are stored in MuonCreatorAlg.h
     SG::WriteHandleKey<Trk::SegmentCollection> m_segmentCollectionKey{
         this,
         "SegmentCollectionName",
-        "MuonSegments",
+        "TrackMuonSegments",
         "Muon Segments",
     };
     SG::ReadHandleKey<Muon::CscPrepDataContainer> m_cscPrdsKey{
diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonPhysValMonitoring/src/MuonPhysValMonitoringTool.cxx b/MuonSpectrometer/MuonValidation/MuonDQA/MuonPhysValMonitoring/src/MuonPhysValMonitoringTool.cxx
index e0760b9afdc0..e706b0081e11 100644
--- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonPhysValMonitoring/src/MuonPhysValMonitoringTool.cxx
+++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonPhysValMonitoring/src/MuonPhysValMonitoringTool.cxx
@@ -10,7 +10,6 @@
 // PhysVal includes
 #include "MuonPhysValMonitoringTool.h"
 
-// FrameWork includes
 #include "GaudiKernel/IToolSvc.h"
 #include "xAODMuon/MuonContainer.h"
 #include "xAODMuon/MuonAuxContainer.h"
@@ -18,7 +17,6 @@
 #include "xAODMuon/SlowMuonContainer.h"
 #include "xAODMuon/SlowMuonAuxContainer.h"
 #include "xAODMuon/SlowMuon.h"
-
 #include "xAODTrigger/MuonRoI.h"
 #include "xAODTrigger/MuonRoIContainer.h"
 #include "xAODTrigMuon/L2StandAloneMuonContainer.h"
@@ -29,9 +27,6 @@
 #include "xAODTruth/TruthVertexContainer.h"
 #include "xAODTruth/TruthVertexAuxContainer.h"
 #include "MuonHistUtils/MuonEnumDefs.h"
-
-#include "MuonCombinedToolInterfaces/IMuonPrintingTool.h"
-
 #include "xAODCore/ShallowCopy.h"
 #include "xAODBase/IParticleHelpers.h"
 
@@ -71,8 +66,6 @@ MuonPhysValMonitoringTool::MuonPhysValMonitoringTool( const std::string& type,
   m_muonPrinter("Rec::MuonPrintingTool/MuonPrintingTool"),
   m_trigDec("Trig::TrigDecisionTool/TrigDecisionTool"),
   m_trackSelector("InDet::InDetDetailedTrackSelectorTool/MuonCombinedInDetDetailedTrackSelectorTool"),
-  // m_muonResonanceSelectionTool("MuonResonanceSelectionTool/MuonZSelectionTool"),
-  // m_muonResonancePairingTool("MuonResonancePairingTool/ZmumuResonancePairingTool"),
   m_oUnmatchedRecoMuonPlots(nullptr),
   m_oUnmatchedTruthMuonPlots(nullptr),
   m_oUnmatchedRecoMuonTrackPlots(nullptr),
@@ -83,20 +76,6 @@ MuonPhysValMonitoringTool::MuonPhysValMonitoringTool( const std::string& type,
   m_h_overview_Z_mass_ID(nullptr)
 {
   // default for muon chains
-
-  declareProperty( "IsData", m_isData = false );
-  declareProperty( "MuonContainerName", m_muonsName = "Muons" );
-  declareProperty( "SlowMuonContainerName", m_slowMuonsName = "SlowMuons" );
-  declareProperty( "MuonTruthParticleContainerName", m_muonsTruthName = "MuonTruthParticles" );
-
-  declareProperty( "TrackContainerName", m_tracksName);
-  declareProperty( "FwdTrackContainerName", m_fwdtracksName);
-  declareProperty( "MuonTrackContainerName", m_muonTracksName );
-  declareProperty( "MuonExtrapolatedTrackContainerName", m_muonExtrapolatedTracksName);
-  declareProperty( "MuonOnlyExtrapolatedTrackContainerName", m_muonMSOnlyExtrapolatedTracksName);
-  declareProperty( "MuonSegmentContainerName", m_muonSegmentsName);
-  declareProperty( "MuonTruthSegmentContainerName", m_muonSegmentsTruthName = "MuonTruthSegments" );
-  
   declareProperty( "TrackSelector", m_trackSelector);
   declareProperty( "IsoTool", m_isoTool );
   
@@ -107,24 +86,9 @@ MuonPhysValMonitoringTool::MuonPhysValMonitoringTool( const std::string& type,
   declareProperty( "SelectMuonCategories", m_selectMuonCategories );
   declareProperty( "DoBinnedResolutionPlots", m_doBinnedResolutionPlots = true);
 
-  declareProperty( "DoTrigMuonValidation", m_doTrigMuonValidation = false);
-  declareProperty( "DoTrigMuonL1Validation", m_doTrigMuonL1Validation = false);
-  declareProperty( "DoTrigMuonL2Validation", m_doTrigMuonL2Validation = false);
-  declareProperty( "DoTrigMuonEFValidation", m_doTrigMuonEFValidation = false);
-  declareProperty( "L1TrigMuonContainerName", m_muonL1TrigName = "LVL1MuonRoIs");
-  declareProperty( "L2SAMuonContainerName",m_muonL2SAName = "HLT_xAOD__L2StandAloneMuonContainer_MuonL2SAInfo");
-  declareProperty( "L2CBMuonContainerName",m_muonL2CBName = "HLT_xAOD__L2CombinedMuonContainer_MuonL2CBInfo");
-  declareProperty( "EFCombTrigMuonContainerName", m_muonEFCombTrigName = "HLT_xAOD__MuonContainer_MuonEFInfo");
-  declareProperty( "DoMuonTree", m_doMuonTree = false);
-
   m_SelectedAuthor = 0;
 }
 
-// Destructor
-///////////////
-MuonPhysValMonitoringTool::~MuonPhysValMonitoringTool()
-{}
-
 // Athena algtool's Hooks
 ////////////////////////////
 StatusCode MuonPhysValMonitoringTool::initialize()
@@ -239,6 +203,7 @@ StatusCode MuonPhysValMonitoringTool::bookHistograms()
   bool separateSAFMuons = true;
   if (m_slowMuonsName!="") separateSAFMuons = false; // no such muons in case of SlowMuon reco
   
+  std::string muonContainerName = m_muonsName.name();
   for (const auto category : m_selectMuonCategoriesStr) {
     std::string categoryPath = m_muonsName+"/"+category+"/";
     m_muonValidationPlots.push_back( new MuonValidationPlots(0, categoryPath,
@@ -255,7 +220,7 @@ StatusCode MuonPhysValMonitoringTool::bookHistograms()
     }
     if (m_muonTracksName!="") {
       m_muonMSTrackValidationPlots.push_back(new MuonTrackValidationPlots(0, categoryPath, "MSTrackParticles", m_isData));
-      if (!m_isData) m_oUnmatchedRecoMuonTrackPlots = new Muon::RecoMuonTrackPlotOrganizer(0, Form("%s/UnmatchedRecoMuonTracks/",m_muonsName.c_str()));
+      if (!m_isData) m_oUnmatchedRecoMuonTrackPlots = new Muon::RecoMuonTrackPlotOrganizer(0, Form("%s/UnmatchedRecoMuonTracks/",muonContainerName.c_str()));
     }
     if (m_muonExtrapolatedTracksName!="") m_muonMETrackValidationPlots.push_back(new MuonTrackValidationPlots(0, categoryPath, "METrackParticles", m_isData));
     if (m_muonMSOnlyExtrapolatedTracksName!="") m_muonMSOnlyMETrackValidationPlots.push_back(new MuonTrackValidationPlots(0, categoryPath, "MSOnlyMETrackParticles", m_isData));
@@ -269,13 +234,13 @@ StatusCode MuonPhysValMonitoringTool::bookHistograms()
     if (m_muonSegmentsName!="") {
       if (category!=theMuonCategories[ALL]) continue; //cannot identify the truth origin of segments...
       m_muonSegmentValidationPlots.push_back(new MuonSegmentValidationPlots(0, categoryPath, m_isData));
-      if (!m_isData) m_oUnmatchedRecoMuonSegmentPlots = new Muon::MuonSegmentPlots(0, Form("%s/UnmatchedRecoMuonSegments/",m_muonsName.c_str()));	    
+      if (!m_isData) m_oUnmatchedRecoMuonSegmentPlots = new Muon::MuonSegmentPlots(0, Form("%s/UnmatchedRecoMuonSegments/",muonContainerName.c_str()));
     }
   }
 
   if (!m_isData) {
-    m_oUnmatchedRecoMuonPlots = new Muon::RecoMuonPlotOrganizer(0, Form("%s/UnmatchedRecoMuons/",m_muonsName.c_str()));
-    m_oUnmatchedTruthMuonPlots = new Muon::TruthMuonPlotOrganizer(0, Form("%s/UnmatchedTruthMuons/",m_muonsName.c_str()));
+    m_oUnmatchedRecoMuonPlots = new Muon::RecoMuonPlotOrganizer(0, Form("%s/UnmatchedRecoMuons/",muonContainerName.c_str()));
+    m_oUnmatchedTruthMuonPlots = new Muon::TruthMuonPlotOrganizer(0, Form("%s/UnmatchedTruthMuons/",muonContainerName.c_str()));
   }   
 
   for (const auto plots : m_muonValidationPlots)                 bookValidationPlots(*plots).ignore();
@@ -295,37 +260,37 @@ StatusCode MuonPhysValMonitoringTool::bookHistograms()
     if (m_oUnmatchedRecoMuonSegmentPlots) bookValidationPlots(*m_oUnmatchedRecoMuonSegmentPlots).ignore();
   }
   //book overview hists
-  m_h_overview_Z_mass = new TH1F(Form("%s_Overview_Z_mass",m_muonsName.c_str()),"",20,76,106);
-  ATH_CHECK(regHist(m_h_overview_Z_mass,Form("%s/Overview",m_muonsName.c_str()),all));
-  m_h_overview_Z_mass_ME = new TH1F(Form("%s_Overview_Z_mass_ME",m_muonsName.c_str()),"",20,76,106);
-  ATH_CHECK(regHist(m_h_overview_Z_mass_ME,Form("%s/Overview",m_muonsName.c_str()),all));
-  m_h_overview_Z_mass_ID = new TH1F(Form("%s_Overview_Z_mass_ID",m_muonsName.c_str()),"",20,76,106);
-  ATH_CHECK(regHist(m_h_overview_Z_mass_ID,Form("%s/Overview",m_muonsName.c_str()),all));
+  m_h_overview_Z_mass = new TH1F(Form("%s_Overview_Z_mass",muonContainerName.c_str()),"",20,76,106);
+  ATH_CHECK(regHist(m_h_overview_Z_mass,Form("%s/Overview",muonContainerName.c_str()),all));
+  m_h_overview_Z_mass_ME = new TH1F(Form("%s_Overview_Z_mass_ME",muonContainerName.c_str()),"",20,76,106);
+  ATH_CHECK(regHist(m_h_overview_Z_mass_ME,Form("%s/Overview",muonContainerName.c_str()),all));
+  m_h_overview_Z_mass_ID = new TH1F(Form("%s_Overview_Z_mass_ID",muonContainerName.c_str()),"",20,76,106);
+  ATH_CHECK(regHist(m_h_overview_Z_mass_ID,Form("%s/Overview",muonContainerName.c_str()),all));
   
   m_h_overview_nObjects.clear();
-  m_h_overview_nObjects.push_back(new TH1F(Form("%s_Overview_N_perevent_truth_muons",m_muonsName.c_str()), "Number of truth Muons per event", 20, -0.5, 19.5));
-  m_h_overview_nObjects.push_back(new TH1F(Form("%s_Overview_N_perevent_muons",m_muonsName.c_str()), "Number of Muons per event", 20, -0.5, 19.5));
-  m_h_overview_nObjects.push_back(new TH1F(Form("%s_Overview_N_perevent_tracks",m_muonsName.c_str()), "Number of Tracks per event", 50, -0.5, 49.5));
-  m_h_overview_nObjects.push_back(new TH1F(Form("%s_Overview_N_perevent_truth_segments",m_muonsName.c_str()), "Number of truth Segments per event", 200, -0.5, 199.5));
-  m_h_overview_nObjects.push_back(new TH1F(Form("%s_Overview_N_perevent_segments",m_muonsName.c_str()), "Number of Segments per event", 200, -0.5, 199.5));
+  m_h_overview_nObjects.push_back(new TH1F(Form("%s_Overview_N_perevent_truth_muons",muonContainerName.c_str()), "Number of truth Muons per event", 20, -0.5, 19.5));
+  m_h_overview_nObjects.push_back(new TH1F(Form("%s_Overview_N_perevent_muons",muonContainerName.c_str()), "Number of Muons per event", 20, -0.5, 19.5));
+  m_h_overview_nObjects.push_back(new TH1F(Form("%s_Overview_N_perevent_tracks",muonContainerName.c_str()), "Number of Tracks per event", 50, -0.5, 49.5));
+  m_h_overview_nObjects.push_back(new TH1F(Form("%s_Overview_N_perevent_truth_segments",muonContainerName.c_str()), "Number of truth Segments per event", 200, -0.5, 199.5));
+  m_h_overview_nObjects.push_back(new TH1F(Form("%s_Overview_N_perevent_segments",muonContainerName.c_str()), "Number of Segments per event", 200, -0.5, 199.5));
   for (const auto hist : m_h_overview_nObjects) {
-    if (hist) ATH_CHECK(regHist(hist,Form("%s/Overview",m_muonsName.c_str()),all));
+    if (hist) ATH_CHECK(regHist(hist,Form("%s/Overview",muonContainerName.c_str()),all));
   }
 
-  m_h_overview_reco_category = new TH1F(Form("%s_Overview_reco_category",m_muonsName.c_str()),"",4,0,4); //prompt/in-flight/non-isolated/other
+  m_h_overview_reco_category = new TH1F(Form("%s_Overview_reco_category",muonContainerName.c_str()),"",4,0,4); //prompt/in-flight/non-isolated/other
   for (int i=1; i<4; i++) { //skip 'All'
     m_h_overview_reco_category->GetXaxis()->SetBinLabel(i,theMuonCategories[i].c_str());
   } m_h_overview_reco_category->GetXaxis()->SetBinLabel(4,"Other"); //of some other origin or fakes
-  ATH_CHECK(regHist(m_h_overview_reco_category,Form("%s/Overview",m_muonsName.c_str()),all));
+  ATH_CHECK(regHist(m_h_overview_reco_category,Form("%s/Overview",muonContainerName.c_str()),all));
 
   int nAuth = xAOD::Muon::NumberOfMuonAuthors;
   for (int i=1; i<4; i++) {
-    m_h_overview_reco_authors.push_back(new TH1F((m_muonsName+"_"+theMuonCategories[i]+"_reco_authors").c_str(),(m_muonsName+"_"+theMuonCategories[i]+"_reco_authors").c_str(),nAuth+1,-0.5,nAuth+0.5));
+    m_h_overview_reco_authors.push_back(new TH1F((m_muonsName+"_"+theMuonCategories[i]+"_reco_authors").c_str(),(muonContainerName+"_"+theMuonCategories[i]+"_reco_authors").c_str(),nAuth+1,-0.5,nAuth+0.5));
   }
-  m_h_overview_reco_authors.push_back(new TH1F((m_muonsName+"_Overview_Other_reco_authors").c_str(),(m_muonsName+"_Other_reco_authors").c_str(),nAuth+1,-0.5,nAuth+0.5));
+  m_h_overview_reco_authors.push_back(new TH1F((m_muonsName+"_Overview_Other_reco_authors").c_str(),(muonContainerName+"_Other_reco_authors").c_str(),nAuth+1,-0.5,nAuth+0.5));
   
   for (const auto hist : m_h_overview_reco_authors) {
-    if (hist) ATH_CHECK(regHist(hist,Form("%s/Overview",m_muonsName.c_str()),all));
+    if (hist) ATH_CHECK(regHist(hist,Form("%s/Overview",muonContainerName.c_str()),all));
   }
 
   return StatusCode::SUCCESS;
diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonPhysValMonitoring/src/MuonPhysValMonitoringTool.h b/MuonSpectrometer/MuonValidation/MuonDQA/MuonPhysValMonitoring/src/MuonPhysValMonitoringTool.h
index 7af96ecbccbf..fa897be1a74e 100644
--- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonPhysValMonitoring/src/MuonPhysValMonitoringTool.h
+++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonPhysValMonitoring/src/MuonPhysValMonitoringTool.h
@@ -10,11 +10,6 @@
 #ifndef MUONPHYSVALMONITORING_MUONPHYSVALMONITORINGTOOL_H
 #define MUONPHYSVALMONITORING_MUONPHYSVALMONITORINGTOOL_H
 
-// STL includes
-#include <string>
-#include <vector>
-
-// FrameWork includes
 #include "GaudiKernel/ServiceHandle.h"
 #include "StoreGate/ReadHandleKey.h"
 #include "xAODTruth/TruthParticleContainer.h"
@@ -23,32 +18,23 @@
 #include "xAODTrigMuon/L2StandAloneMuon.h"
 #include "xAODTrigMuon/L2CombinedMuonContainer.h"
 #include "xAODTrigMuon/L2CombinedMuon.h"
-
 #include "xAODMuon/SlowMuon.h"
 #include "xAODEventInfo/EventInfo.h"
-
-// Tools
 #include "MuonAnalysisInterfaces/IMuonSelectionTool.h"
 #include "TrigDecisionTool/TrigDecisionTool.h"
 #include "TrkToolInterfaces/ITrackSelectorTool.h"
 #include "IsolationSelection/IIsolationSelectionTool.h"
-
-
-
-// Local includes
+#include "MuonCombinedToolInterfaces/IMuonPrintingTool.h"
 #include "AthenaMonitoring/ManagedMonitorToolBase.h"
-
-// Root includes
 #include "MuonValidationPlots.h"
 #include "TriggerMuonValidationPlots.h"
 #include "MuonTrackValidationPlots.h"
 #include "MuonSegmentValidationPlots.h"
 #include "SlowMuonValidationPlots.h"
 
-// Forward declaration
-namespace Rec {
-  class IMuonPrintingTool;
-}
+#include <string>
+#include <vector>
+
 namespace MuonPhysValMonitoring {
 
 class MuonPhysValMonitoringTool
@@ -67,7 +53,7 @@ class MuonPhysValMonitoringTool
 		  const IInterface* parent );
 
   /// Destructor: 
-  virtual ~MuonPhysValMonitoringTool(); 
+  virtual ~MuonPhysValMonitoringTool()=default;
 
   // Athena algtool's Hooks
   virtual StatusCode initialize();
@@ -124,26 +110,23 @@ class MuonPhysValMonitoringTool
   TH1F* findHistogram(std::vector<HistData> hists,std::string hnameTag,std::string hdirTag,std::string hNewName);
   void modifyHistogram(TH1* hist);
 
-  bool m_isData;
-
-
-
+  Gaudi::Property<bool> m_isData{this,"IsData",false};
 
   // Containers
-  std::string m_tracksName;
-  std::string m_fwdtracksName;
-  std::string m_muonsName;
-  std::string m_slowMuonsName;
-  std::string m_muonsTruthName;
-  std::string m_muonTracksName;
-  std::string m_muonExtrapolatedTracksName;
-  std::string m_muonMSOnlyExtrapolatedTracksName;
-  std::string m_muonSegmentsName;
-  std::string m_muonSegmentsTruthName;
-  std::string m_muonL1TrigName;
-  std::string m_muonL2SAName;
-  std::string m_muonL2CBName;
-  std::string m_muonEFCombTrigName;
+  Gaudi::Property<std::string> m_tracksName{this,"TrackContainerName",""};
+  Gaudi::Property<std::string> m_fwdtracksName{this,"FwdTrackContainerName",""};
+  Gaudi::Property<std::string> m_muonsName{this,"MuonContainerName","Muons"};
+  Gaudi::Property<std::string> m_slowMuonsName{this,"SlowMuonContainerName","SlowMuons"};
+  Gaudi::Property<std::string> m_muonsTruthName{this,"MuonTruthParticleContainerName","MuonTruthParticles"};
+  Gaudi::Property<std::string> m_muonTracksName{this,"MuonTrackContainerName",""};
+  Gaudi::Property<std::string> m_muonExtrapolatedTracksName{this,"MuonExtrapolatedTrackContainerName",""};
+  Gaudi::Property<std::string> m_muonMSOnlyExtrapolatedTracksName{this,"MuonOnlyExtrapolatedTrackContainerName",""};
+  Gaudi::Property<std::string> m_muonSegmentsName{this,"MuonSegmentContainerName",""};
+  Gaudi::Property<std::string> m_muonSegmentsTruthName{this,"MuonTruthSegmentContainerName","MuonTruthSegments"};
+  Gaudi::Property<std::string> m_muonL1TrigName{this,"L1TrigMuonContainerName","LVL1MuonRoIs"};
+  Gaudi::Property<std::string> m_muonL2SAName{this,"L2SAMuonContainerName","HLT_xAOD__L2StandAloneMuonContainer_MuonL2SAInfo"};
+  Gaudi::Property<std::string> m_muonL2CBName{this,"L2CBMuonContainerName","HLT_xAOD__L2CombinedMuonContainer_MuonL2CBInfo"};
+  Gaudi::Property<std::string> m_muonEFCombTrigName{this,"EFCombTrigMuonContainerName","HLT_xAOD__MuonContainer_MuonEFInfo"};
 
   SG::ReadHandleKey<xAOD::EventInfo> m_eventInfo{this,"EventInfo","EventInfo","event info"};
 
@@ -158,13 +141,11 @@ class MuonPhysValMonitoringTool
   int m_SelectedAuthor;
   std::vector<unsigned int> m_selectMuonCategories;  
   bool m_doBinnedResolutionPlots;
-  bool m_doTrigMuonValidation;
-  bool m_doTrigMuonL1Validation;
-  bool m_doTrigMuonL2Validation;
-  bool m_doTrigMuonEFValidation;
-  bool m_doMuonTree;
-
-
+  Gaudi::Property<bool> m_doTrigMuonValidation{this,"DoTrigMuonValidation",false};
+  Gaudi::Property<bool> m_doTrigMuonL1Validation{this,"DoTrigMuonL1Validation",false};
+  Gaudi::Property<bool> m_doTrigMuonL2Validation{this,"DoTrigMuonL2Validation",false};
+  Gaudi::Property<bool> m_doTrigMuonEFValidation{this,"DoTrigMuonEFValidation",false};
+  Gaudi::Property<bool> m_doMuonTree{this,"DoMuonTree",false};
   
   // Tools
   ToolHandle<CP::IMuonSelectionTool> m_muonSelectionTool;
diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CSCSegmValAlg.h b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CSCSegmValAlg.h
index e13ed2a63f06..ceebb0af9f32 100755
--- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CSCSegmValAlg.h
+++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CSCSegmValAlg.h
@@ -90,7 +90,7 @@ class CSCSegmValAlg : public ManagedMonitorToolBase {
   std::vector<std::string> m_sampSelTriggers;
   bool m_doEvtSel;
 
-  SG::ReadHandleKey<Trk::SegmentCollection> m_segmKey{this,"SegmentKey","MuonSegments","muon segments"};
+  SG::ReadHandleKey<Trk::SegmentCollection> m_segmKey{this,"SegmentKey","TrackMuonSegments","muon segments"};
   double m_segmSlope;
 
   bool m_debuglevel;           //!< private member to control debug messages
diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CSCSegmValMonAlg.h b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CSCSegmValMonAlg.h
index 54a68b8bf31d..6408400df38c 100755
--- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CSCSegmValMonAlg.h
+++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/CscRawDataMonitoring/CSCSegmValMonAlg.h
@@ -58,7 +58,8 @@ class CSCSegmValMonAlg : public AthMonitorAlgorithm {
     "Muon::MuonEDMHelperSvc/MuonEDMHelperSvc", 
     "Handle to the service providing the IMuonEDMHelperSvc interface" };
   ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};
-  SG::ReadHandleKey<Trk::SegmentCollection> m_segmKey{this,"SegmentKey","MuonSegments","muon segments"};
+  SG::ReadHandleKey<Trk::SegmentCollection> m_segmKey{this,"SegmentKey","TrackMuonSegments","muon segments"};
+  SG::ReadHandleKey<Trk::SegmentCollection> m_segmKeyAlt{this,"SegmentKey","MuonSegments","muon segments"};
 
   Gaudi::Property<std::vector<std::string>> m_sampSelTriggers{this,"EventSelTriggers",{}};
   Gaudi::Property<bool> m_doEvtSel{this,"DoEventSelection",false};
diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/share/CSCMon_jobOptions.py b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/share/CSCMon_jobOptions.py
index fa5864cfefeb..4cd3a3f39cda 100644
--- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/share/CSCMon_jobOptions.py
+++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/share/CSCMon_jobOptions.py
@@ -36,8 +36,6 @@ def getInputFiles(dir, AODHLTP):
 # Input files
 ##############################
 
-#AODir = ['/raid01/venkat/dataset/data/csc/2011/mcpskim/data10_7TeV.*.phys*', 'data10_7TeV*DESD_ZMUMU*']
-#AODir2 = ['/raid01/jveatch/data/dataset/CSCMon/data11_7TeV.00189751.physics_Muons.recon.DESD_ZMUMU.f405_m716_f405', 'data11_7TeV*DESD_ZMUMU*']
 AODir2=['/afs/cern.ch/work/p/panagoul/CSC_data', 'data15_13TeV.00280950*']
 
 CSCInputFiles = []
@@ -262,7 +260,7 @@ if doCSCSegm:
   ## trigger-aware monitoring: sample seletion triggers (express stream menu physics_pp_v2)
   evtSelectionTriggers = [  "L1_MU10", "L1_MU15", "EF_mu20_muCombTag_NoEF", "EF_mu15", "EF_mu15_mu10_EFFS", "EF_2mu10", "EF_2mu10_loose" ]
 
-  CSCSegmValAlg = CSCSegmValAlg ( name = "CSCSegmValAlg", SegmentKey = "MuonSegments",
+  CSCSegmValAlg = CSCSegmValAlg ( name = "CSCSegmValAlg",
     TrigDecisionTool = ToolSvc.TrigDecisionTool, DoEventSelection = False, EventSelTriggers = evtSelectionTriggers,
     SegmentSlopeCut = 0.07, ClusterStatus = clusStatWords)
 
diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/share/CscRawESD_MonitoringOptions.py b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/share/CscRawESD_MonitoringOptions.py
index a4879b152c0e..abac9f678a9e 100755
--- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/share/CscRawESD_MonitoringOptions.py
+++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/share/CscRawESD_MonitoringOptions.py
@@ -87,8 +87,6 @@ topSequence += cscesdRawMonMan
 # CSC Segment Monitoring
 #---------------------------------------------------------------
 from CscRawDataMonitoring.CscRawDataMonitoringConf import CSCSegmValAlg
-#from MuonDQAMonFlags.MuonDQAFlags import MuonDQAFlags as MuonDQAFlags
-#MuonDQAFlags.doMuonSegmMon = True
 
 ## TDT instance (this should be done already?)
 if(DQMonFlags.useTrigger() and hasattr(ToolSvc, DQMonFlags.nameTrigDecTool())):
@@ -106,8 +104,6 @@ clusStatWords = [ "Unspoiled", "Simple", "Edge", "MultiPeak", "Narrow",
 evtSelectionTriggers = [  "L1_MU10", "L1_MU15", "EF_mu20_muCombTag_NoEF", "EF_mu15", "EF_mu15_mu10_EFFS", "EF_2mu10", "EF_2mu10_loose" ]
 
 CSCSegmESDValAlg = CSCSegmValAlg ( name = "CSCSegmValAlg", 
-                                   SegmentKey = "MuonSegments",
-                                   #TrigDecisionTool = ToolSvc.TrigDecisionTool, 
                                    DoEventSelection = False, 
                                    EventSelTriggers = evtSelectionTriggers,
                                    SegmentSlopeCut = 0.07, 
diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/CSCSegmValMonAlg.cxx b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/CSCSegmValMonAlg.cxx
index 9f5c01e880cd..3ddfb1cf6226 100755
--- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/CSCSegmValMonAlg.cxx
+++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/CscRawDataMonitoring/src/CSCSegmValMonAlg.cxx
@@ -46,6 +46,7 @@ StatusCode CSCSegmValMonAlg::initialize() {
   ATH_CHECK(m_edmHelperSvc.retrieve());
   ATH_CHECK(m_idHelperSvc.retrieve());
   ATH_CHECK(m_segmKey.initialize());
+  ATH_CHECK(m_segmKeyAlt.initialize());
 
   return AthMonitorAlgorithm::initialize();
 }  
@@ -76,6 +77,17 @@ StatusCode CSCSegmValMonAlg::fillHistograms(const EventContext& ctx) const{
     }
 
     SG::ReadHandle<Trk::SegmentCollection> segments(m_segmKey, ctx);
+    if (!segments.isValid()) {
+      if (m_segmKey.key()=="TrackMuonSegments") {
+        // old DataQuality_required input file (/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/q431/21.0/myESD.pool.root) still has 'MuonSegments' stored
+        // -> @TODO: need updated input file (temporary workaround: retrieve 'MuonSegments' instead if 'TrackMuonSegments' here)
+        segments = SG::ReadHandle<Trk::SegmentCollection>(m_segmKeyAlt, ctx);
+      }
+      if (!segments.isValid()) {
+        ATH_MSG_ERROR("Could not retrieve Trk::SegmentCollection "<<m_segmKey.key());
+        return StatusCode::FAILURE;
+      }
+    }
 
     if ( segments->empty() ){
       ATH_MSG_DEBUG( "      Segm Collection is Empty, done...    ");
diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonAlg.h b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonAlg.h
index 351fe161c323..1d7de7822b6c 100755
--- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonAlg.h
+++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonAlg.h
@@ -160,7 +160,8 @@ class MdtRawDataMonAlg: public AthMonitorAlgorithm {
 
   bool m_atlas_ready;
 
-  SG::ReadHandleKey<Trk::SegmentCollection> m_segm_type{this,"Eff_segm_type","MuonSegments","muon segments"};
+  SG::ReadHandleKey<Trk::SegmentCollection> m_segm_type{this,"Eff_segm_type","TrackMuonSegments","muon segments"};
+  SG::ReadHandleKey<Trk::SegmentCollection> m_segm_typeAlt{this,"Eff_segm_typeAlt","MuonSegments","muon segments"};
 
   std::string returnString(int i) const{
     std::stringstream ss;
diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataValAlg.h b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataValAlg.h
index ccac9d53b25d..6df5cbf4b05f 100755
--- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataValAlg.h
+++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataValAlg.h
@@ -176,7 +176,7 @@ class MdtRawDataValAlg: public ManagedMonitorToolBase {
   uint32_t m_firstTime;
   int m_numberOfEvents;
 
-  SG::ReadHandleKey<Trk::SegmentCollection> m_segm_type{this,"Eff_segm_type","MuonSegments","muon segments"};
+  SG::ReadHandleKey<Trk::SegmentCollection> m_segm_type{this,"Eff_segm_type","TrackMuonSegments","muon segments"};
 
   std::string returnString(int i){
     std::stringstream ss;
diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MdtRawDataMonAlg.cxx b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MdtRawDataMonAlg.cxx
index cf5c608a021e..decb471fda62 100755
--- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MdtRawDataMonAlg.cxx
+++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MdtRawDataMonAlg.cxx
@@ -205,6 +205,7 @@ StatusCode MdtRawDataMonAlg::initialize()
   ATH_CHECK(m_l1RoiKey.initialize(SG::AllowEmpty));
   ATH_CHECK(m_muonKey.initialize());
   ATH_CHECK(m_segm_type.initialize());
+  ATH_CHECK(m_segm_typeAlt.initialize());
   ATH_CHECK(m_key_mdt.initialize());
   ATH_CHECK(m_key_rpc.initialize());
   ATH_CHECK(m_eventInfo.initialize());
@@ -528,10 +529,16 @@ StatusCode MdtRawDataMonAlg::fillHistograms(const EventContext& ctx) const
   }   //m_doMdtESD==true
 
   SG::ReadHandle<Trk::SegmentCollection> segms(m_segm_type, ctx);
-  if (!segms.isValid())
-  {
-    ATH_MSG_ERROR("evtStore() does not contain mdt segms Collection with name " << m_segm_type);
-    return StatusCode::FAILURE;
+  if (!segms.isValid()) {
+    if (m_segm_type.key()=="TrackMuonSegments") {
+      // old DataQuality_required input file (/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/Tier0ChainTests/q431/21.0/myESD.pool.root) still has 'MuonSegments' stored
+      // -> @TODO: need updated input file (temporary workaround: retrieve 'MuonSegments' instead if 'TrackMuonSegments' here)
+      segms = SG::ReadHandle<Trk::SegmentCollection>(m_segm_typeAlt, ctx);
+    }
+    if (!segms.isValid()) {
+      ATH_MSG_ERROR("evtStore() does not contain mdt segms Collection with name " << m_segm_type);
+      return StatusCode::FAILURE;
+    }
   }
 
   MDTSegmentHistogramStruct segsPlots[4][4][16]; // [region][layer][phi]
diff --git a/PhysicsAnalysis/PrimaryDPDMaker/share/DESDM_IDALIGN.py b/PhysicsAnalysis/PrimaryDPDMaker/share/DESDM_IDALIGN.py
index 178a553d4897..1b900146981e 100644
--- a/PhysicsAnalysis/PrimaryDPDMaker/share/DESDM_IDALIGN.py
+++ b/PhysicsAnalysis/PrimaryDPDMaker/share/DESDM_IDALIGN.py
@@ -153,8 +153,8 @@ outList = CfgItemList( 'IDALIGN',
     'xAOD::TrigNavigationAuxInfo#TrigNavigationAux.',
     'xAOD::TrigDecision#xTrigDecision',
     'xAOD::JetEtRoI#LVL1JetEtRoI',
-    'Trk::SegmentCollection#MuonSegments',
-    'Trk::SegmentCollection#NCB_MuonSegments',
+    'Trk::SegmentCollection#TrackMuonSegments',
+    'Trk::SegmentCollection#NCB_TrackMuonSegments',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMPFlowAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMTopoAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4LCTopoAux.',
diff --git a/PhysicsAnalysis/PrimaryDPDMaker/share/DESD_DEDX.py b/PhysicsAnalysis/PrimaryDPDMaker/share/DESD_DEDX.py
index b0cd14500f25..95d0fdbf71a1 100644
--- a/PhysicsAnalysis/PrimaryDPDMaker/share/DESD_DEDX.py
+++ b/PhysicsAnalysis/PrimaryDPDMaker/share/DESD_DEDX.py
@@ -152,8 +152,8 @@ outList = CfgItemList( 'DEDX',
     'xAOD::TrigNavigationAuxInfo#TrigNavigationAux.',
     'xAOD::TrigDecision#xTrigDecision',
     'xAOD::JetEtRoI#LVL1JetEtRoI',
-    'Trk::SegmentCollection#MuonSegments',
-    'Trk::SegmentCollection#NCB_MuonSegments',
+    'Trk::SegmentCollection#TrackMuonSegments',
+    'Trk::SegmentCollection#NCB_TrackMuonSegments',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMPFlowAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMTopoAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4LCTopoAux.',
diff --git a/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDESDM_MS.py b/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDESDM_MS.py
index ad5c959959a8..a7b01fe321f8 100644
--- a/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDESDM_MS.py
+++ b/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDESDM_MS.py
@@ -344,7 +344,7 @@ AlignmentTriggerMuonStream.AddItem(["Muon::TgcPrepDataContainer#*"])
 AlignmentTriggerMuonStream.AddItem(["Muon::CscPrepDataContainer#*"])
 AlignmentTriggerMuonStream.AddItem(["Muon::MdtPrepDataContainer#*"])
 #Alignment
-AlignmentTriggerMuonStream.AddItem(["Trk::SegmentCollection#MuonSegments"])
+AlignmentTriggerMuonStream.AddItem(["Trk::SegmentCollection#TrackMuonSegments"])
 AlignmentTriggerMuonStream.AddItem(["xAOD::VertexContainer#PrimaryVertices"])
 AlignmentTriggerMuonStream.AddItem(["xAOD::VertexAuxContainer#PrimaryVerticesAux.-vxTrackAtVertex.-MvfFitInfo.-isInitialized.-VTAV"])
 AlignmentTriggerMuonStream.AddItem(["TrackCollection#MuonSpectrometerTracks"])
diff --git a/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_AllCells.py b/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_AllCells.py
index 92370c88d5d0..8925dacd9863 100644
--- a/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_AllCells.py
+++ b/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_AllCells.py
@@ -152,8 +152,8 @@ outList = CfgItemList( 'ALLCELLS',
     'xAOD::TrigNavigationAuxInfo#TrigNavigationAux.',
     'xAOD::TrigDecision#xTrigDecision',
     'xAOD::JetEtRoI#LVL1JetEtRoI',
-    'Trk::SegmentCollection#MuonSegments',
-    'Trk::SegmentCollection#NCB_MuonSegments',
+    'Trk::SegmentCollection#TrackMuonSegments',
+    'Trk::SegmentCollection#NCB_TrackMuonSegments',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMPFlowAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMTopoAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4LCTopoAux.',
diff --git a/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_EGamma.py b/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_EGamma.py
index 873ea275292f..0500c707c200 100644
--- a/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_EGamma.py
+++ b/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_EGamma.py
@@ -369,8 +369,8 @@ outList = CfgItemList( 'EGAMMA',
     'xAOD::TrigNavigationAuxInfo#TrigNavigationAux.',
     'xAOD::TrigDecision#xTrigDecision',
     'xAOD::JetEtRoI#LVL1JetEtRoI',
-    'Trk::SegmentCollection#MuonSegments',
-    'Trk::SegmentCollection#NCB_MuonSegments',
+    'Trk::SegmentCollection#TrackMuonSegments',
+    'Trk::SegmentCollection#NCB_TrackMuonSegments',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMPFlowAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMTopoAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4LCTopoAux.',
diff --git a/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_EOverP.py b/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_EOverP.py
index 32a9cd5799e5..0d6c6aa615fa 100644
--- a/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_EOverP.py
+++ b/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_EOverP.py
@@ -167,8 +167,8 @@ outList = CfgItemList( 'EOVERP',
     'xAOD::TrigNavigationAuxInfo#TrigNavigationAux.',
     'xAOD::TrigDecision#xTrigDecision',
     'xAOD::JetEtRoI#LVL1JetEtRoI',
-    'Trk::SegmentCollection#MuonSegments',
-    'Trk::SegmentCollection#NCB_MuonSegments',
+    'Trk::SegmentCollection#TrackMuonSegments',
+    'Trk::SegmentCollection#NCB_TrackMuonSegments',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMPFlowAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMTopoAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4LCTopoAux.',
diff --git a/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_Jet.py b/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_Jet.py
index 6821fb98a2a6..15d33cdef832 100644
--- a/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_Jet.py
+++ b/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_Jet.py
@@ -291,8 +291,8 @@ outList = CfgItemList( 'CALJET',
     'xAOD::TrigNavigationAuxInfo#TrigNavigationAux.',
     'xAOD::TrigDecision#xTrigDecision',
     'xAOD::JetEtRoI#LVL1JetEtRoI',
-    'Trk::SegmentCollection#MuonSegments',
-    'Trk::SegmentCollection#NCB_MuonSegments',
+    'Trk::SegmentCollection#TrackMuonSegments',
+    'Trk::SegmentCollection#NCB_TrackMuonSegments',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMPFlowAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMTopoAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4LCTopoAux.',
diff --git a/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_PhotonJet.py b/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_PhotonJet.py
index abf3d52003fa..d965f339be0c 100644
--- a/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_PhotonJet.py
+++ b/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_PhotonJet.py
@@ -119,8 +119,8 @@ outList = CfgItemList( 'PHOJET',
     'xAOD::TrigNavigationAuxInfo#TrigNavigationAux.',
     'xAOD::TrigDecision#xTrigDecision',
     'xAOD::JetEtRoI#LVL1JetEtRoI',
-    'Trk::SegmentCollection#MuonSegments',
-    'Trk::SegmentCollection#NCB_MuonSegments',
+    'Trk::SegmentCollection#TrackMuonSegments',
+    'Trk::SegmentCollection#NCB_TrackMuonSegments',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMPFlowAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMTopoAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4LCTopoAux.',
diff --git a/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_SGLEL.py b/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_SGLEL.py
index 0f143aff0429..5c64c8c8bc80 100644
--- a/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_SGLEL.py
+++ b/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_SGLEL.py
@@ -119,8 +119,8 @@ outList = CfgItemList( 'SGLEL',
     'xAOD::TrigNavigationAuxInfo#TrigNavigationAux.',
     'xAOD::TrigDecision#xTrigDecision',
     'xAOD::JetEtRoI#LVL1JetEtRoI',
-    'Trk::SegmentCollection#MuonSegments',
-    'Trk::SegmentCollection#NCB_MuonSegments',
+    'Trk::SegmentCollection#TrackMuonSegments',
+    'Trk::SegmentCollection#NCB_TrackMuonSegments',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMPFlowAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMTopoAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4LCTopoAux.',
diff --git a/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_TtbarMuon.py b/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_TtbarMuon.py
index b0867f88fef0..190c826e3e5a 100644
--- a/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_TtbarMuon.py
+++ b/PhysicsAnalysis/PrimaryDPDMaker/share/PerfDPD_TtbarMuon.py
@@ -165,8 +165,8 @@ outList = CfgItemList( 'SLTTMU',
     'xAOD::TrigNavigationAuxInfo#TrigNavigationAux.',
     'xAOD::TrigDecision#xTrigDecision',
     'xAOD::JetEtRoI#LVL1JetEtRoI',
-    'Trk::SegmentCollection#MuonSegments',
-    'Trk::SegmentCollection#NCB_MuonSegments',
+    'Trk::SegmentCollection#TrackMuonSegments',
+    'Trk::SegmentCollection#NCB_TrackMuonSegments',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMPFlowAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMTopoAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4LCTopoAux.',
diff --git a/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/share/PhysDPD_HIPs.py b/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/share/PhysDPD_HIPs.py
index 4c9c35e07be4..773475f23e84 100644
--- a/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/share/PhysDPD_HIPs.py
+++ b/PhysicsAnalysis/SUSYPhys/LongLivedParticleDPDMaker/share/PhysDPD_HIPs.py
@@ -117,8 +117,8 @@ outList = CfgItemList( 'HIPsStream',
     'xAOD::TrigNavigationAuxInfo#TrigNavigationAux.',
     'xAOD::TrigDecision#xTrigDecision',
     'xAOD::JetEtRoI#LVL1JetEtRoI',
-    'Trk::SegmentCollection#MuonSegments',
-    'Trk::SegmentCollection#NCB_MuonSegments',
+    'Trk::SegmentCollection#TrackMuonSegments',
+    'Trk::SegmentCollection#NCB_TrackMuonSegments',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMPFlowAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4EMTopoAux.',
     'xAOD::MissingETAuxAssociationMap#METAssoc_AntiKt4LCTopoAux.',
diff --git a/Reconstruction/MuonIdentification/MuonCombinedAlgs/src/MuonCombinedInDetExtensionAlg.h b/Reconstruction/MuonIdentification/MuonCombinedAlgs/src/MuonCombinedInDetExtensionAlg.h
index dbebf2928022..5e1c2c3386c9 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedAlgs/src/MuonCombinedInDetExtensionAlg.h
+++ b/Reconstruction/MuonIdentification/MuonCombinedAlgs/src/MuonCombinedInDetExtensionAlg.h
@@ -20,7 +20,7 @@
 
 #include <string>
 
-// uses (further down the call chain) the MuPatHitTool that has a mutable cache of pointers to-be-deleted and the end of the event
+// uses (further down the call chain) the MuPatHitTool that has a mutable cache of pointers to-be-deleted at the end of the event
 // thus, currently, the MuonCombinedInDetExtensionAlg cannot become an AthReentrantAlgorithm
 class MuonCombinedInDetExtensionAlg : public AthAlgorithm {
   public:
@@ -92,12 +92,11 @@ class MuonCombinedInDetExtensionAlg : public AthAlgorithm {
         "MuGirlMETracks",
         "ME track collection",
     };
-    // these are the MuGirl segments inputs
     SG::WriteHandleKey<Trk::SegmentCollection> m_segments{
         this,
         "SegmentCollection",
-        "MuGirlSegments",
-        "Segment collection",
+        "",
+        "specify segment collection",
     };
 
     Gaudi::Property<bool> m_usePRDs{this, "usePRDs", false};
diff --git a/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedReconstructionConfig.py b/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedReconstructionConfig.py
index 3ba9de7e4146..eee23de4e0d0 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedReconstructionConfig.py
+++ b/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedReconstructionConfig.py
@@ -32,7 +32,6 @@ def MuonCaloTagAlgCfg(flags, name="MuonCaloTagAlg",**kwargs):
     kwargs.setdefault("TagMap","caloTagMap")
     kwargs.setdefault("CombinedTrackCollection","")
     kwargs.setdefault("METrackCollection","")
-    kwargs.setdefault("SegmentCollection","")
     kwargs.setdefault("HasCSC", flags.Detector.GeometryCSC )
     kwargs.setdefault("HasSTgc", flags.Detector.GeometrysTGC )
     kwargs.setdefault("HasMM", flags.Detector.GeometryMM )
@@ -111,6 +110,7 @@ def MuonInsideOutRecoAlgCfg(flags, name="MuonInsideOutRecoAlg", **kwargs ):
     kwargs.setdefault("HasSTgc", flags.Detector.GeometrysTGC )
     kwargs.setdefault("HasMM", flags.Detector.GeometryMM )
     kwargs.setdefault("TagMap","muGirlTagMap")
+    kwargs.setdefault("SegmentCollection","MuGirlSegments")
     alg = CompFactory.MuonCombinedInDetExtensionAlg(name,**kwargs)
     result.addEventAlgo( alg, primary=True )
     return result
diff --git a/Reconstruction/MuonIdentification/MuonCombinedRecExample/python/MuonCombinedAlgs.py b/Reconstruction/MuonIdentification/MuonCombinedRecExample/python/MuonCombinedAlgs.py
index 3baeb10f2c1e..7bfa7f169bb6 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedRecExample/python/MuonCombinedAlgs.py
+++ b/Reconstruction/MuonIdentification/MuonCombinedRecExample/python/MuonCombinedAlgs.py
@@ -15,24 +15,12 @@ from InDetRecExample.InDetKeys import InDetKeys
 from InDetRecExample.InDetJobProperties import InDetFlags
 from TriggerJobOpts.TriggerFlags import TriggerFlags
 
-def MuonCombinedInDetExtensionAlg(name="MuonCombinedInDetExtensionAlg",**kwargs):
-    tools = []
-    if muonCombinedRecFlags.doCaloTrkMuId():
-        tools.append(getPublicTool("MuonCaloTagTool"))
-        kwargs.setdefault("TagMap", "caloTagMap" )
-    kwargs.setdefault("MuonCombinedInDetExtensionTools", tools )
-    kwargs.setdefault("HasCSC", MuonGeometryFlags.hasCSC() )
-    kwargs.setdefault("HasSTgc", MuonGeometryFlags.hasSTGC() )
-    kwargs.setdefault("HasMM", MuonGeometryFlags.hasMM() )
-    return CfgMgr.MuonCombinedInDetExtensionAlg(name,**kwargs)
-
 def MuonCaloTagAlg(name="MuonCaloTagAlg",**kwargs):
     tools = [getPublicTool("MuonCaloTagTool")]
     kwargs.setdefault("MuonCombinedInDetExtensionTools", tools )
     kwargs.setdefault("TagMap","caloTagMap")
     kwargs.setdefault("CombinedTrackCollection","")
     kwargs.setdefault("METrackCollection","")
-    kwargs.setdefault("SegmentCollection","")
     kwargs.setdefault("HasCSC", MuonGeometryFlags.hasCSC() )
     kwargs.setdefault("HasSTgc", MuonGeometryFlags.hasSTGC() )
     kwargs.setdefault("HasMM", MuonGeometryFlags.hasMM() )
@@ -45,13 +33,11 @@ def MuonCaloTagAlg_LRT(name="MuonCaloTagAlg_LRT", **kwargs):
     kwargs.setdefault("InDetCandidateLocation", MuonCbKeys.InDetTrackParticlesLargeD0())  
     kwargs.setdefault("CombinedTrackCollection","")
     kwargs.setdefault("METrackCollection","")
-    kwargs.setdefault("SegmentCollection","")
     kwargs.setdefault("HasCSC", MuonGeometryFlags.hasCSC() )
     kwargs.setdefault("HasSTgc", MuonGeometryFlags.hasSTGC() )
     kwargs.setdefault("HasMM", MuonGeometryFlags.hasMM() )
     return CfgMgr.MuonCombinedInDetExtensionAlg(name,**kwargs)
 
-
 def MuonSegmentTagAlg( name="MuonSegmentTagAlg", **kwargs ):
     kwargs.setdefault("MuonSegmentTagTool", getPublicTool("MuonSegmentTagTool") )
     return CfgMgr.MuonSegmentTagAlg(name,**kwargs)
@@ -63,7 +49,6 @@ def MuonSegmentTagAlg_LRT( name="MuonSegmentTagAlg_LRT", **kwargs ):
     kwargs.setdefault("MuonSegmentLocation","MuonSegments")
     return CfgMgr.MuonSegmentTagAlg(name,**kwargs)
 
-                                                                        
 def MuonInsideOutRecoAlg( name="MuonInsideOutRecoAlg", **kwargs ):
     tools = [getPublicTool("MuonInsideOutRecoTool") ]
     kwargs.setdefault("MuonCombinedInDetExtensionTools", tools )
@@ -72,9 +57,9 @@ def MuonInsideOutRecoAlg( name="MuonInsideOutRecoAlg", **kwargs ):
     kwargs.setdefault("HasSTgc", MuonGeometryFlags.hasSTGC() )
     kwargs.setdefault("HasMM", MuonGeometryFlags.hasMM() )
     kwargs.setdefault("TagMap","muGirlTagMap")
+    kwargs.setdefault("SegmentCollection","MuGirlSegments")
     return CfgMgr.MuonCombinedInDetExtensionAlg(name,**kwargs)
 
-
 def MuGirlAlg_LRT( name="MuGirlAlg_LRT", **kwargs ):
     tools = [getPublicTool("MuonInsideOutRecoTool") ]
     kwargs.setdefault("MuonCombinedInDetExtensionTools", tools )
@@ -88,11 +73,7 @@ def MuGirlAlg_LRT( name="MuGirlAlg_LRT", **kwargs ):
     kwargs.setdefault("CombinedTrackCollection",MuonCbKeys.MuGirlMuonsLargeD0())
     kwargs.setdefault("InDetCandidateLocation",MuonCbKeys.InDetTrackParticlesLargeD0())
     return CfgMgr.MuonCombinedInDetExtensionAlg(name,**kwargs)
-    
 
-                                  
-                               
-                                 
 def MuGirlStauAlg(name="MuGirlStauAlg",**kwargs):
     tools = [getPublicTool("MuonStauRecoTool")]
     kwargs.setdefault("MuonCombinedInDetExtensionTools", tools )
diff --git a/Reconstruction/RecBackground/RecBackgroundAlgs/RecBackgroundAlgs/BeamBackgroundFiller.h b/Reconstruction/RecBackground/RecBackgroundAlgs/RecBackgroundAlgs/BeamBackgroundFiller.h
index a1ab60154fd0..3fc5e5a9b5af 100644
--- a/Reconstruction/RecBackground/RecBackgroundAlgs/RecBackgroundAlgs/BeamBackgroundFiller.h
+++ b/Reconstruction/RecBackground/RecBackgroundAlgs/RecBackgroundAlgs/BeamBackgroundFiller.h
@@ -64,10 +64,10 @@ private:
   void PrintMatchMatrix() {};
 
   /** ReadHandleKey for Trk::SegmentCollection from CSC */
-  SG::ReadHandleKey<Trk::SegmentCollection> m_cscSegmentContainerReadHandleKey{this,"cscSegmentContainerKey","NCB_MuonSegments","ReadHandleKey for Trk::SegmentCollection from CSC"};
+  SG::ReadHandleKey<Trk::SegmentCollection> m_cscSegmentContainerReadHandleKey{this,"cscSegmentContainerKey","NCB_TrackMuonSegments","ReadHandleKey for Trk::SegmentCollection from CSC"};
 
   /** ReadHandleKey for Trk::SegmentCollection from MDT */
-  SG::ReadHandleKey<Trk::SegmentCollection> m_mdtSegmentContainerReadHandleKey{this,"mdtSegmentContainerKey","MuonSegments","ReadHandleKey for Trk::SegmentCollection from MDT"};
+  SG::ReadHandleKey<Trk::SegmentCollection> m_mdtSegmentContainerReadHandleKey{this,"mdtSegmentContainerKey","TrackMuonSegments","ReadHandleKey for Trk::SegmentCollection from MDT"};
 
   /** ReadHandleKey for CaloClusterContainer */
   SG::ReadHandleKey<xAOD::CaloClusterContainer> m_caloClusterContainerReadHandleKey{this,"caloClusterContainerKey","CaloCalTopoClusters","ReadHandleKey for CaloClusterContainer"};
diff --git a/Reconstruction/RecBackground/RecBackgroundAlgs/share/RecBackground_jobOptions.py b/Reconstruction/RecBackground/RecBackgroundAlgs/share/RecBackground_jobOptions.py
index 9937ad41a639..df66e6a5dd4f 100644
--- a/Reconstruction/RecBackground/RecBackgroundAlgs/share/RecBackground_jobOptions.py
+++ b/Reconstruction/RecBackground/RecBackgroundAlgs/share/RecBackground_jobOptions.py
@@ -8,7 +8,7 @@ if rec.doInDet() and rec.doMuon() and rec.doCalo() and \
     DetFlags.detdescr.Muon_on() and DetFlags.detdescr.Calo_on() and DetFlags.detdescr.ID_on() :
   include ("LArCellRec/LArCollisionTime_jobOptions.py")
   from RecBackgroundAlgs.RecBackgroundAlgsConf import BeamBackgroundFiller
-  BeamBackgroundFiller=BeamBackgroundFiller(cscSegmentContainerKey=("NCB_MuonSegments" if MuonGeometryFlags.hasCSC() else ""))
+  BeamBackgroundFiller=BeamBackgroundFiller(cscSegmentContainerKey=("NCB_TrackMuonSegments" if MuonGeometryFlags.hasCSC() else ""))
   topSequence+=BeamBackgroundFiller
 
   from BCM_BackgroundAlgs.BCM_BackgroundAlgsConf import BcmCollisionTimeAlg
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py
index b3de9157559c..bfffeaf4b4e5 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py
@@ -613,7 +613,7 @@ def muEFSARecoSequence( RoIs, name ):
       Cleaner.PullCutPhi = 3
       SegmentFinder.TrackCleaner = Cleaner
       
-      theSegmentFinderAlg = CfgMgr.MuonSegmentFinderAlg( "TrigMuonSegmentMaker_"+name,SegmentCollectionName="MuonSegments",
+      theSegmentFinderAlg = CfgMgr.MuonSegmentFinderAlg( "TrigMuonSegmentMaker_"+name,
                                                        MuonPatternCalibration = CfgGetter.getPublicTool("MuonPatternCalibration"), 
                                                        MuonPatternSegmentMaker = CfgGetter.getPublicTool("MuonPatternSegmentMaker"), 
                                                        MuonTruthSummaryTool = None)
@@ -630,7 +630,7 @@ def muEFSARecoSequence( RoIs, name ):
     theSegmentFinderAlg = MooSegmentFinderAlg("TrigMuonSegmentMaker_"+name)
 
   from MuonSegmentTrackMaker.MuonTrackMakerAlgsMonitoring import MuPatTrackBuilderMonitoring
-  TrackBuilder = CfgMgr.MuPatTrackBuilder("TrigMuPatTrackBuilder_"+name ,MuonSegmentCollection = "MuonSegments", 
+  TrackBuilder = CfgMgr.MuPatTrackBuilder("TrigMuPatTrackBuilder_"+name ,MuonSegmentCollection = "TrackMuonSegments", 
                                           TrackSteering=CfgGetter.getPublicToolClone("TrigMuonTrackSteering", "MuonTrackSteering"), 
                                           MonTool = MuPatTrackBuilderMonitoring("MuPatTrackBuilderMonitoringSA_"+name))
   xAODTrackParticleCnvAlg = MuonStandaloneTrackParticleCnvAlg("TrigMuonStandaloneTrackParticleCnvAlg_"+name)
@@ -846,7 +846,7 @@ def muEFInsideOutRecoSequence(RoIs, name):
         Cleaner.PullCutPhi = 3
         SegmentFinder.TrackCleaner = Cleaner
       
-        theSegmentFinderAlg = CfgMgr.MuonSegmentFinderAlg( "TrigMuonSegmentMaker_"+name,SegmentCollectionName="MuonSegments",
+        theSegmentFinderAlg = CfgMgr.MuonSegmentFinderAlg( "TrigMuonSegmentMaker_"+name,
                                                            MuonPatternCalibration = CfgGetter.getPublicTool("MuonPatternCalibration"), 
                                                            MuonPatternSegmentMaker = CfgGetter.getPublicTool("MuonPatternSegmentMaker"), 
                                                            MuonTruthSummaryTool = None)
-- 
GitLab


From 0d00f44ee8ee82f97df99181faae219f32d3e17a Mon Sep 17 00:00:00 2001
From: Mark Sutton <mark.sutton@cern.ch>
Date: Tue, 22 Dec 2020 15:24:08 +0000
Subject: [PATCH 224/225] Finally fix the tau and electron analyses

Typos and mistakes in the chain configuration prevented the analyses working correctly.

In addition, the release for the reference reconstruction is changed so that we can see
the collections in the AOD
---
 .../share/TIDAdata-chains-run3.dat                  | 13 ++++---------
 .../TrigInDetValidation/share/comparitor.json       |  2 +-
 .../test/test_trigID_all_ttbar_pu40.py              |  2 ++
 .../test/test_trigID_el_zee_pu40.py                 |  3 ++-
 .../test/test_trigID_el_zee_pu40_st.py              |  3 ++-
 .../test/test_trigID_tau_ztautau_pu46.py            |  1 +
 .../test/test_trigID_tau_ztautau_pu46_st.py         |  1 +
 7 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-chains-run3.dat b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-chains-run3.dat
index 8e7fca7ed157..deae3973b76b 100644
--- a/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-chains-run3.dat
+++ b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/share/TIDAdata-chains-run3.dat
@@ -19,19 +19,14 @@ testChains = {
     "HLT_mu28_ivarmedium_L1MU20:HLT_IDTrack_MuonIso_FTF:HLT_Roi_MuonIso",
     "HLT_mu28_ivarmedium_L1MU20:HLT_IDTrack_MuonIso_IDTrig:HLT_Roi_MuonIso",
  
-    "HLT_e5_etcut_L1EM3:HLT_IDTrack_Electron_FTF",  
-    "HLT_e5_etcut_L1EM3:HLT_IDTrack_Electron_IDTrig", 
-    "HLT_e17_lhvloose_nod0_L1EM15VH:HLT_IDTrack_Electron_FTF",  
+    "HLT_e5_etcut_L1EM3:HLT_IDTrack_Electron_FTF:HLT_Roi_FastElectron",  
+    "HLT_e5_etcut_L1EM3:HLT_IDTrack_Electron_IDTrig",
+    "HLT_e17_lhvloose_nod0_L1EM15VH:HLT_IDTrack_Electron_FTF:HLT_Roi_FastElectron",
     "HLT_e17_lhvloose_nod0_L1EM15VH:HLT_IDTrack_Electron_IDTrig", 
  
-    "HLT_tau25_idperf_tracktwo_L1TAU12IM:HLT_IDTrack_TauCore_FTF",
     "HLT_tau25_idperf_tracktwo_L1TAU12IM:HLT_IDTrack_TauCore_FTF:HLT_Roi_TauCore",
-    "HLT_tau25_idperf_tracktwo_L1TAU12IM:HLT_IDTrack_TauIso_FTF",
     "HLT_tau25_idperf_tracktwo_L1TAU12IM:HLT_IDTrack_TauIso_FTF:HLT_Roi_TauIso",
-    "HLT_tau25_idperf_tracktwo_L1TAU12IM:HLT_IDTrack_Tau_FTF",
-    "HLT_tau25_idperf_tracktwo_L1TAU12IM:HLT_IDTrack_Tau_FTF:HLT_TAURoI",
-    "HLT_tau25_idperf_tracktwo_L1TAU12IM:HLT_IDTrack_Tau_IDTrig",
-    "HLT_tau25_idperf_tracktwo_L1TAU12IM:HLT_IDTrack_Tau_IDTrig:HLT_TAURoI",
+    "HLT_tau25_idperf_tracktwo_L1TAU12IM:HLT_IDTrack_Tau_IDTrig:HLT_Roi_TauIso",
 
     "HLT_j45_subjesgscIS_ftf_boffperf_split_L1J20:HLT_IDTrack_Bjet_FTF",
     "HLT_j45_subjesgscIS_ftf_boffperf_split_L1J20:HLT_IDTrack_Bjet_IDTrig",
diff --git a/Trigger/TrigValidation/TrigInDetValidation/share/comparitor.json b/Trigger/TrigValidation/TrigInDetValidation/share/comparitor.json
index 8f92f4e743e5..d924fee9e7f3 100644
--- a/Trigger/TrigValidation/TrigInDetValidation/share/comparitor.json
+++ b/Trigger/TrigValidation/TrigInDetValidation/share/comparitor.json
@@ -27,7 +27,7 @@
         "chains" : "HLT_tau25_idperf_tracktwo_L1TAU12IM:HLT_IDTrack_TauCore_FTF:HLT_Roi_TauCore HLT_tau25_idperf_tracktwo_L1TAU12IM:HLT_IDTrack_TauIso_FTF:HLT_Roi_TauIso"
     },
     "EFtau":{ 
-        "chains" : "HLT_tau25_idperf_tracktwo_L1TAU12IM:HLT_IDTrack_TauIso_FTF:HLT_Roi_TauIso HLT_tau25_idperf_tracktwo_L1TAU12IM:HLT_IDTrack_Tau_IDTrig:HLT_TauIso"
+        "chains" : "HLT_tau25_idperf_tracktwo_L1TAU12IM:HLT_IDTrack_TauIso_FTF:HLT_Roi_TauIso HLT_tau25_idperf_tracktwo_L1TAU12IM:HLT_IDTrack_Tau_IDTrig:HLT_Roi_TauIso"
     },
     "L2bjet":{ 
         "chains" : "HLT_j45_subjesgscIS_ftf_boffperf_split_L1J20:HLT_IDTrack_Bjet_FTF"
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40.py
index eb28cde6636c..d15e4aa40811 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_all_ttbar_pu40.py
@@ -29,6 +29,8 @@ Slices  = ['muon','electron','tau','bjet','fsjet']
 Events  = 4000
 Threads = 8 
 Slots   = 8
+Release = "current"
+
 Input   = 'ttbar_ID'    # defined in TrigValTools/share/TrigValInputs.json  
 
 Jobs = [ ( "Offline",     " TIDAdata-run3-offline.dat      -r Offline -o data-hists-offline.root" ),
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40.py
index 4dadf400dbda..1dce5e61cef8 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40.py
@@ -32,7 +32,8 @@ Events  = 16000
 Threads = 8 
 Slots   = 8
 Input   = 'Zee_pu40'    # defined in TrigValTools/share/TrigValInputs.json
-GridFiles=True
+Release = "current"
+GridFiles = True
 
 Jobs = [ ( "Truth",       " TIDAdata-run3.dat                    -o data-hists.root -p 11" ),
          ( "Offline",     " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ) ]
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_st.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_st.py
index 829ea474af30..fc93fd30b035 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_st.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_el_zee_pu40_st.py
@@ -32,7 +32,8 @@ Events  = 8000
 Threads = 1 
 Slots   = 1
 Input   = 'Zee_pu40'    # defined in TrigValTools/share/TrigValInputs.json
-GridFiles=True
+Release = "current"
+GridFiles = True
 
 Jobs = [ ( "Truth",       " TIDAdata-run3.dat                    -o data-hists.root -p 11" ),
          ( "Offline",     " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ) ]
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46.py
index d743d196d530..cc6b814541c1 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46.py
@@ -29,6 +29,7 @@ Slices  = ['tau']
 Events  = 6000
 Threads = 8 
 Slots   = 8
+Release = "current"
 Input   = 'Ztautau_pu46'    # defined in TrigValTools/share/TrigValInputs.json  
 
 Jobs = [ ( "Offline",  " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ),
diff --git a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_st.py b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_st.py
index 27f1c21df5be..abd7eda34e4f 100755
--- a/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_st.py
+++ b/Trigger/TrigValidation/TrigInDetValidation/test/test_trigID_tau_ztautau_pu46_st.py
@@ -29,6 +29,7 @@ Slices  = ['tau']
 Events  = 6000
 Threads = 1 
 Slots   = 1
+Release = "current"
 Input   = 'Ztautau_pu46'    # defined in TrigValTools/share/TrigValInputs.json  
 
 Jobs = [ ( "Offline",  " TIDAdata-run3-offline.dat -r Offline -o data-hists-offline.root" ),
-- 
GitLab


From 3f0313936e92eb0f5821a61b649861f40bf2c4aa Mon Sep 17 00:00:00 2001
From: Scott Snyder <scott.snyder@cern.ch>
Date: Tue, 22 Dec 2020 15:25:04 +0000
Subject: [PATCH 225/225] SGTools: Fix dummy proxy leak.

When we remove a proxy, be sure to decrement the reference count even
if it's not in m_storeMap.  A dummy proxy won't have been entered
there, but it will still have gotten a reference count.
---
 Control/SGTools/src/DataStore.cxx       |  7 ++++++-
 Control/SGTools/test/DataStore_test.cxx | 22 +++++++++++++++++++---
 2 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/Control/SGTools/src/DataStore.cxx b/Control/SGTools/src/DataStore.cxx
index d7e596184fb3..125bf7a485f4 100755
--- a/Control/SGTools/src/DataStore.cxx
+++ b/Control/SGTools/src/DataStore.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "SGTools/DataStore.h"
@@ -208,12 +208,17 @@ DataStore::removeProxy(DataProxy* proxy, bool forceRemove, bool hard)
     int index = it->second.first;
     sc = StatusCode::SUCCESS;
 
+    // Remove primary entry.
     m_keyMap.erase (it);
     if (storeIter != m_storeMap.end()) {
       if (1 == storeIter->second.erase(name)) {
         proxy->release();
       }
     }
+    else {
+      // A dummy proxy.
+      proxy->release();
+    }
 
     // Remove all symlinks too.
     for (CLID symclid : clids) 
diff --git a/Control/SGTools/test/DataStore_test.cxx b/Control/SGTools/test/DataStore_test.cxx
index ce081b63da65..2223c6dc4275 100644
--- a/Control/SGTools/test/DataStore_test.cxx
+++ b/Control/SGTools/test/DataStore_test.cxx
@@ -1,8 +1,6 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
-
-// $Id$
 /**
  * @file DataStore_test.cxx
  * @author scott snyder <snyder@bnl.gov>
@@ -512,6 +510,24 @@ void test_dummy ATLAS_NOT_THREAD_SAFE ()
   assert (dp2->clID() == 456);
   assert (dp2->name() == "dp2");
   assert (dp2->refCount() == 1);
+
+  SG::StringPool::sgkey_t sgkey3 = pool.stringToKey ("dp3", 456);
+  SG::DataProxy* dp3 = make_proxy (0, "", sgkey3);
+  assert (store.addToStore (0, dp3).isSuccess());
+  assert (dp3->refCount() == 1);
+  assert (store.proxy_exact (sgkey3) == dp3);
+
+  dp1->addRef();
+  dp2->addRef();
+  dp3->addRef();
+  assert (dp1->refCount() == 2);
+  assert (dp2->refCount() == 2);
+  assert (dp3->refCount() == 2);
+
+  store.clearStore (true, false, nullptr);
+  assert (dp1->refCount() == 1);
+  assert (dp2->refCount() == 1);
+  assert (dp3->refCount() == 1);
 }
 
 
-- 
GitLab