From 71d3f147ceef67680f48d8dc2eb7c2d4faef5d50 Mon Sep 17 00:00:00 2001 From: Christian Nass <christian.nass@cern.ch> Date: Wed, 1 Apr 2020 12:51:12 +0200 Subject: [PATCH] Changes from Develop --- .../BTagging/BTagging/BTagTrackAugmenterAlg.h | 1 + .../BTagging/python/BTagToolConfig.py | 22 +++---- .../BTagging/python/BTaggingConfigFlags.py | 1 + .../BTagging/python/BTaggingFlags.py | 9 ++- .../BTagging/python/JetBTaggingAlgConfig.py | 10 ++- .../BTagging/src/BTagTrackAugmenterAlg.cxx | 14 +++- .../JetTagTools/python/DL1TagConfig.py | 2 + .../JetTagTools/python/IP2DTagConfig.py | 4 +- .../JetTagTools/python/IP3DTagConfig.py | 4 +- .../python/JetFitterNNToolConfig.py | 5 +- .../JetTagTools/python/JetFitterTagConfig.py | 4 +- .../python/JetVertexChargeConfig.py | 5 +- .../JetTagTools/python/MV2TagConfig.py | 2 + .../JetTagTools/python/MultiSVTagConfig.py | 6 +- .../python/MultivariateTagManagerConfig.py | 21 +++--- .../python/NewLikelihoodToolConfig.py | 5 +- .../JetTagTools/python/RNNIPTagConfig.py | 2 + .../JetTagTools/python/SV1TagConfig.py | 3 +- .../JetTagTools/python/SoftMuonTagConfig.py | 7 +- .../python/SpecialTrackAssociatorConfig.py | 2 + .../TrigBjetHypo/src/TrigBtagFexMT.cxx | 41 ++++++++++++ .../TrigBjetHypo/src/TrigBtagFexMT.h | 8 +++ .../TrigOutputHandling/src/HLTEDMCreator.cxx | 2 + .../TrigOutputHandling/src/HLTEDMCreator.h | 3 + .../src/EventViewCreatorAlgorithmWithJets.cxx | 14 ++-- .../TrigEDMConfig/python/TriggerEDMRun3.py | 32 ++++++++- .../python/JetTagCalibConfig.py | 53 +++++++++++++++ .../TriggerJobOpts/share/runHLT_standalone.py | 7 ++ .../Bjet/BjetFlavourTaggingConfiguration.py | 65 ++++++++++++++++++- .../HLTMenuConfig/Bjet/BjetSequenceSetup.py | 37 ++++++----- 30 files changed, 320 insertions(+), 71 deletions(-) create mode 100644 Trigger/TriggerCommon/TriggerJobOpts/python/JetTagCalibConfig.py diff --git a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/BTagging/BTagTrackAugmenterAlg.h b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/BTagging/BTagTrackAugmenterAlg.h index fe90d494f178..4418f9d48f7e 100644 --- a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/BTagging/BTagTrackAugmenterAlg.h +++ b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/BTagging/BTagTrackAugmenterAlg.h @@ -56,3 +56,4 @@ namespace Analysis { } #endif + diff --git a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/BTagToolConfig.py b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/BTagToolConfig.py index 8a9d4bed5a4c..ba0c1eefe9e1 100644 --- a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/BTagToolConfig.py +++ b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/BTagToolConfig.py @@ -5,7 +5,7 @@ from AthenaConfiguration.ComponentFactory import CompFactory Analysis__BTagTool=CompFactory.Analysis__BTagTool from BTagging.BTaggingFlags import BTaggingFlags -def BTagToolCfg(ConfigFlags, TaggerList, useBTagFlagsDefaults = True): +def BTagToolCfg(ConfigFlags, TaggerList, scheme = '', useBTagFlagsDefaults = True): """Adds a new myBTagTool instance and registers it. input: jetcol: The name of the jet collections. @@ -26,47 +26,47 @@ def BTagToolCfg(ConfigFlags, TaggerList, useBTagFlagsDefaults = True): if 'IP2D' in TaggerList: from JetTagTools.IP2DTagConfig import IP2DTagCfg - ip2dtool = acc.popToolsAndMerge(IP2DTagCfg(ConfigFlags, 'IP2DTag')) + ip2dtool = acc.popToolsAndMerge(IP2DTagCfg(ConfigFlags, 'IP2DTag', scheme)) tagToolList.append(ip2dtool) if 'IP3D' in TaggerList: from JetTagTools.IP3DTagConfig import IP3DTagCfg - ip3dtool = acc.popToolsAndMerge(IP3DTagCfg(ConfigFlags, 'IP3DTag')) + ip3dtool = acc.popToolsAndMerge(IP3DTagCfg(ConfigFlags, 'IP3DTag', scheme)) tagToolList.append(ip3dtool) if 'SV1' in TaggerList: from JetTagTools.SV1TagConfig import SV1TagCfg - sv1tool = acc.popToolsAndMerge(SV1TagCfg(ConfigFlags, 'SV1Tag')) + sv1tool = acc.popToolsAndMerge(SV1TagCfg(ConfigFlags, 'SV1Tag', scheme)) tagToolList.append(sv1tool) if 'RNNIP' in TaggerList: from JetTagTools.RNNIPTagConfig import RNNIPTagCfg - rnniptool = acc.popToolsAndMerge(RNNIPTagCfg(ConfigFlags, 'RNNIPTag')) + rnniptool = acc.popToolsAndMerge(RNNIPTagCfg(ConfigFlags, 'RNNIPTag', scheme)) tagToolList.append(rnniptool) if 'JetFitterNN' in TaggerList: from JetTagTools.JetFitterTagConfig import JetFitterTagCfg - jetfitterNNtool = acc.popToolsAndMerge(JetFitterTagCfg(ConfigFlags, 'JetFitterTagNN')) + jetfitterNNtool = acc.popToolsAndMerge(JetFitterTagCfg(ConfigFlags, 'JetFitterTagNN', scheme)) tagToolList.append(jetfitterNNtool) if 'SoftMu' in TaggerList: from JetTagTools.SoftMuonTagConfig import SoftMuonTagCfg - softmutool = acc.popToolsAndMerge(SoftMuonTagCfg(ConfigFlags, 'SoftMuonTag')) + softmutool = acc.popToolsAndMerge(SoftMuonTagCfg(ConfigFlags, 'SoftMuonTag', scheme)) tagToolList.append(softmutool) if 'MultiSVbb1' in TaggerList: from JetTagTools.MultiSVTagConfig import MultiSVTagCfg - multisvbb1tool = acc.popToolsAndMerge(MultiSVTagCfg(ConfigFlags,'MultiSVbb1Tag','MultiSVbb1')) + multisvbb1tool = acc.popToolsAndMerge(MultiSVTagCfg(ConfigFlags,'MultiSVbb1Tag','MultiSVbb1', scheme)) tagToolList.append(multisvbb1tool) if 'MultiSVbb2' in TaggerList: from JetTagTools.MultiSVTagConfig import MultiSVTagCfg - multisvbb2tool = acc.popToolsAndMerge(MultiSVTagCfg(ConfigFlags, 'MultiSVbb2Tag','MultiSVbb2')) + multisvbb2tool = acc.popToolsAndMerge(MultiSVTagCfg(ConfigFlags, 'MultiSVbb2Tag','MultiSVbb2', scheme)) tagToolList.append(multisvbb2tool) if 'JetVertexCharge' in TaggerList: from JetTagTools.JetVertexChargeConfig import JetVertexChargeCfg - jvc = acc.popToolsAndMerge(JetVertexChargeCfg(ConfigFlags, 'JetVertexCharge')) + jvc = acc.popToolsAndMerge(JetVertexChargeCfg(ConfigFlags, 'JetVertexCharge', scheme)) tagToolList.append(jvc) # list of taggers that use MultivariateTagManager @@ -79,7 +79,7 @@ def BTagToolCfg(ConfigFlags, TaggerList, useBTagFlagsDefaults = True): mvtm_active_taggers = list(set(mvtm_taggers) & set(TaggerList)) if len(mvtm_active_taggers) > 0: from JetTagTools.MultivariateTagManagerConfig import MultivariateTagManagerCfg - mvtm = acc.popToolsAndMerge(MultivariateTagManagerCfg(ConfigFlags, 'mvtm', TaggerList = mvtm_active_taggers)) + mvtm = acc.popToolsAndMerge(MultivariateTagManagerCfg(ConfigFlags, 'mvtm', TaggerList = mvtm_active_taggers, scheme = scheme)) tagToolList.append(mvtm) options = {} diff --git a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/BTaggingConfigFlags.py b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/BTaggingConfigFlags.py index d7ccc2101d3a..bfb03758759d 100644 --- a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/BTaggingConfigFlags.py +++ b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/BTaggingConfigFlags.py @@ -6,6 +6,7 @@ def createBTaggingConfigFlags(): btagcf = AthConfigFlags() btagcf.addFlag("BTagging.run2TaggersList", ['IP2D','IP3D','SV1','SoftMu','JetFitterNN','MV2c10','MV2c10mu','MV2c10rnn','MV2c100','MV2cl100','RNNIP','DL1','DL1mu','DL1rnn']) + btagcf.addFlag("BTagging.TrigTaggersList", ['IP2D','IP3D','SV1','JetFitterNN','MV2c10','MV2c100']) # Disable JetVertexCharge ATLASRECTS-4506 btagcf.addFlag("BTagging.RunModus", "analysis") # reference mode used in FlavourTagPerformanceFramework (RetagFragment.py) btagcf.addFlag("BTagging.JetPtMinRef", 15e3) # in MeV for uncalibrated pt diff --git a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/BTaggingFlags.py b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/BTaggingFlags.py index 6ce33e8b321b..5767b4e8a5c8 100755 --- a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/BTaggingFlags.py +++ b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/BTaggingFlags.py @@ -355,13 +355,15 @@ class _BTaggingFlags: setattr(self, attr, 'matchQuark') for attr in self._TrackParticleCollectionName: - setattr(self, attr, 'InDetTrackParticles') + #setattr(self, attr, 'InDetTrackParticles') + setattr(self, attr, 'HLT_IDTrack_bjet_IDTrig') for attr in self._TrackParticleTruthCollectionName: setattr(self, attr, 'TrackParticleTruthCandidate') for attr in self._PrimaryVertexCollectionName: - setattr(self, attr, 'PrimaryVertices') + #setattr(self, attr, 'PrimaryVertices') + setattr(self, attr, 'HLT_EFHistoPrmVtx') for attr in self._MuonCollectionName: setattr(self, attr, 'Muons') @@ -396,7 +398,8 @@ class _BTaggingFlags: #defaultJetCollections = ['AntiKt4LCTopo','AntiKt6LCTopo','AntiKt4TopoEM','AntiKt6TopoEM'] - defaultJetCollections = ['AntiKt4EMTopo'] + #defaultJetCollections = ['AntiKt4EMTopo'] + defaultJetCollections = ['InView'] for attr in self._Jets: setattr(self, attr, defaultJetCollections[:]) diff --git a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/JetBTaggingAlgConfig.py b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/JetBTaggingAlgConfig.py index bdc8f1d29675..b6adb0b99a96 100644 --- a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/JetBTaggingAlgConfig.py +++ b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/python/JetBTaggingAlgConfig.py @@ -20,7 +20,7 @@ def JetBTaggingAlgCfg(ConfigFlags, JetCollection="", TaggerList=[], SetupScheme= for assoc in BTagTrackToJetAssocNameList: TrackToJetAssociatorNameList.append(jetcol.replace('Track', 'PV0Track') + 'Jets.' + assoc) - options.setdefault('BTagTool', acc.popToolsAndMerge(BTagToolCfg(ConfigFlags, TaggerList))) + options.setdefault('BTagTool', acc.popToolsAndMerge(BTagToolCfg(ConfigFlags, TaggerList, SetupScheme))) timestamp = options.get('TimeStamp', None) if not timestamp: @@ -39,8 +39,12 @@ def JetBTaggingAlgCfg(ConfigFlags, JetCollection="", TaggerList=[], SetupScheme= options['name'] = (btagname + ConfigFlags.BTagging.GeneralToolSuffix).lower() options['JetCollectionName'] = jetcol.replace('Track', 'PV0Track') + 'Jets' options['TrackToJetAssociatorNames'] = TrackToJetAssociatorNameList - options['BTagSVCollectionName'] = btagname + 'SecVtx' - options['BTagJFVtxCollectionName'] = btagname + 'JFVtx' + if SetupScheme == "Trig": + options['BTagSVCollectionName'] = 'HLT_SecVtx' + options['BTagJFVtxCollectionName'] = 'HLT_JFVtx' + else: + options['BTagSVCollectionName'] = btagname + 'SecVtx' + options['BTagJFVtxCollectionName'] = btagname + 'JFVtx' options['JetCalibrationName'] = jetcol.replace('Track', 'PV0Track') options['BTaggingCollectionName'] = btagname options['BTaggingLinkName'] = '.btaggingLink'+ts diff --git a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/src/BTagTrackAugmenterAlg.cxx b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/src/BTagTrackAugmenterAlg.cxx index b3125b3bab4f..deb29ae2691c 100644 --- a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/src/BTagTrackAugmenterAlg.cxx +++ b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/src/BTagTrackAugmenterAlg.cxx @@ -94,7 +94,8 @@ namespace Analysis { SG::ReadHandle< xAOD::TrackParticleContainer > trackContainerHandle = SG::makeHandle< xAOD::TrackParticleContainer >( m_TrackContainerKey,ctx); CHECK( trackContainerHandle.isValid() ); const xAOD::TrackParticleContainer* tracks = trackContainerHandle.get(); - ATH_MSG_DEBUG( "Retrieved " << tracks->size() << " input tracks..." ); + ATH_MSG_INFO( "Retrieved " << tracks->size() << " input tracks..." ); + // ========================================================================================================================== // ** Make Decorators (these are outputs) @@ -122,6 +123,10 @@ namespace Analysis { decor_z0(*track) = ip->IPz0SinTheta; decor_d0_sigma(*track) = ip->sigmad0; decor_z0_sigma(*track) = ip->sigmaz0SinTheta; + ATH_MSG_DEBUG( " d0= " << ip->IPd0 << + " z0SinTheta= " << ip->IPz0SinTheta << + " sigmad0= " << ip->sigmad0 << + " sigmaz0SinTheta= " << ip->sigmaz0SinTheta ); } else { ATH_MSG_WARNING( "failed to estimate track impact parameter, using dummy values" ); decor_d0(*track) = NAN; @@ -141,6 +146,12 @@ namespace Analysis { const Amg::Vector3D position = track_pos - vertex_pos; const Amg::Vector3D momentum = extrap_pars->momentum(); + //Test output for cross checking output with stored values + ATH_MSG_DEBUG( "vertex_pos (x,y,z)= (" << vertex_pos.x() << ", " << vertex_pos.y() << ", " << vertex_pos.z() << ")"); + ATH_MSG_DEBUG( "track_pos (x,y,z)= (" << track_pos.x() << ", " << track_pos.y() << ", " << track_pos.z() << ")"); + ATH_MSG_DEBUG( "track_displacement (x,y,z)= (" << position.x() << ", " << position.y() << ", " << position.z() << ")"); + ATH_MSG_DEBUG( "track_momentum (x,y,z)= (" << momentum.x() << ", " << momentum.y() << ", " << momentum.z() << ")"); + std::vector< float > out_vec_pos( position.data(), position.data() + position.size() ); std::vector< float > out_vec_mom( momentum.data(), momentum.data() + momentum.size() ); @@ -178,3 +189,4 @@ namespace Analysis { } + diff --git a/PhysicsAnalysis/JetTagging/JetTagTools/python/DL1TagConfig.py b/PhysicsAnalysis/JetTagging/JetTagTools/python/DL1TagConfig.py index 61e3e4917017..fb2773d1925e 100644 --- a/PhysicsAnalysis/JetTagging/JetTagTools/python/DL1TagConfig.py +++ b/PhysicsAnalysis/JetTagging/JetTagTools/python/DL1TagConfig.py @@ -28,6 +28,8 @@ def DL1TagCfg(flags, name = 'DL1', scheme = '', useBTagFlagsDefaults = True, **o basename = name options['xAODBaseName'] = basename options['LocalNNConfigurationFile'] = BTaggingFlags.DL1LocalNNConfig + if scheme == 'Trig': + options['HistosKey'] = 'JetTagTrigCalibHistosKey' if useBTagFlagsDefaults: defaults = { 'Runmodus' : flags.BTagging.RunModus, diff --git a/PhysicsAnalysis/JetTagging/JetTagTools/python/IP2DTagConfig.py b/PhysicsAnalysis/JetTagging/JetTagTools/python/IP2DTagConfig.py index 3023534b7f0d..ff0fc1762e04 100644 --- a/PhysicsAnalysis/JetTagging/JetTagTools/python/IP2DTagConfig.py +++ b/PhysicsAnalysis/JetTagging/JetTagTools/python/IP2DTagConfig.py @@ -35,7 +35,7 @@ def IP2DTagCfg( flags, name = 'IP2DTag', scheme = '', useBTagFlagsDefaults = Tru options['name'] = name options['xAODBaseName'] = 'IP2D' options['trackAssociationName'] = 'BTagTrackToJetAssociator' - if (scheme == ""): + if True: if useBTagFlagsDefaults: grades= [ "0HitIn0HitNInExp2","0HitIn0HitNInExpIn","0HitIn0HitNInExpNIn","0HitIn0HitNIn", "0HitInExp", "0HitIn", @@ -47,7 +47,7 @@ def IP2DTagCfg( flags, name = 'IP2DTag', scheme = '', useBTagFlagsDefaults = Tru svForIPTool = acc.popToolsAndMerge(SVForIPToolCfg('SVForIPTool')) trackGradeFactory = acc.popToolsAndMerge(IPDetailedTrackGradeFactoryCfg('IP2DDetailedTrackGradeFactory')) trackSelectorTool = acc.popToolsAndMerge(IPTrackSelectorCfg(flags, 'IP2DTrackSelector')) - likelihood = acc.popToolsAndMerge(NewLikelihoodToolCfg(flags, 'IP2DNewLikelihoodTool', 'IP2D')) + likelihood = acc.popToolsAndMerge(NewLikelihoodToolCfg(flags, 'IP2DNewLikelihoodTool', 'IP2D', scheme)) defaults = { 'Runmodus' : flags.BTagging.RunModus, 'referenceType' : BTaggingFlags.ReferenceType, diff --git a/PhysicsAnalysis/JetTagging/JetTagTools/python/IP3DTagConfig.py b/PhysicsAnalysis/JetTagging/JetTagTools/python/IP3DTagConfig.py index 7adc949a3559..29265f1e8337 100644 --- a/PhysicsAnalysis/JetTagging/JetTagTools/python/IP3DTagConfig.py +++ b/PhysicsAnalysis/JetTagging/JetTagTools/python/IP3DTagConfig.py @@ -38,7 +38,7 @@ def IP3DTagCfg( flags, name = 'IP3DTag', scheme = '', useBTagFlagsDefaults = Tru options['xAODBaseName'] = 'IP3D' options['trackAssociationName'] = 'BTagTrackToJetAssociator' - if (scheme == ""): + if True: if useBTagFlagsDefaults: grades= [ "0HitIn0HitNInExp2","0HitIn0HitNInExpIn","0HitIn0HitNInExpNIn","0HitIn0HitNIn", "0HitInExp", "0HitIn", @@ -50,7 +50,7 @@ def IP3DTagCfg( flags, name = 'IP3DTag', scheme = '', useBTagFlagsDefaults = Tru svForIPTool = acc.popToolsAndMerge(SVForIPToolCfg('SVForIPTool')) trackGradeFactory = acc.popToolsAndMerge(IPDetailedTrackGradeFactoryCfg('IP3DDetailedTrackGradeFactory')) trackSelectorTool = acc.popToolsAndMerge(IPTrackSelectorCfg(flags, 'IP3DTrackSelector')) - likelihood = acc.popToolsAndMerge(NewLikelihoodToolCfg(flags, 'IP3DNewLikelihoodTool', 'IP3D')) + likelihood = acc.popToolsAndMerge(NewLikelihoodToolCfg(flags, 'IP3DNewLikelihoodTool', 'IP3D', scheme)) inDetTrackSelectionTool = acc.popToolsAndMerge(InDetTrackSelectorCfg('InDetTrackSelector')) trackVertexAssociationTool = acc.popToolsAndMerge(SpecialTrackAssociatorCfg('SpecialTrackAssociator')) diff --git a/PhysicsAnalysis/JetTagging/JetTagTools/python/JetFitterNNToolConfig.py b/PhysicsAnalysis/JetTagging/JetTagTools/python/JetFitterNNToolConfig.py index b54459d5b7d9..e2545879de19 100644 --- a/PhysicsAnalysis/JetTagging/JetTagTools/python/JetFitterNNToolConfig.py +++ b/PhysicsAnalysis/JetTagging/JetTagTools/python/JetFitterNNToolConfig.py @@ -8,7 +8,7 @@ from JetTagTools.NeuralNetworkToHistoToolConfig import NeuralNetworkToHistoToolC # import the JetFitterNNTool configurable Analysis__JetFitterNNTool=CompFactory.Analysis__JetFitterNNTool -def JetFitterNNToolCfg( name = 'JetFitterNNTool', CombinedIPNN = False, useBTagFlagsDefaults = True, **options ): +def JetFitterNNToolCfg( name = 'JetFitterNNTool', scheme='', CombinedIPNN = False, useBTagFlagsDefaults = True, **options ): """Sets up a JetFitterNNTool tool and returns it. The following options have BTaggingFlags defaults: @@ -24,6 +24,8 @@ def JetFitterNNToolCfg( name = 'JetFitterNNTool', CombinedIPNN = False, useBTagF output: The actual tool.""" acc = ComponentAccumulator() options['name'] = name + if scheme == 'Trig': + options['HistosKey'] = 'JetTagTrigCalibHistosKey' if not BTaggingFlags.RunJetFitterNNTool: raise ValueError("This case is not implemented because always True during Run2. Contact BTagging software team.") if useBTagFlagsDefaults: @@ -45,3 +47,4 @@ def JetFitterNNToolCfg( name = 'JetFitterNNTool', CombinedIPNN = False, useBTagF acc.setPrivateTools(Analysis__JetFitterNNTool( **options)) return acc + diff --git a/PhysicsAnalysis/JetTagging/JetTagTools/python/JetFitterTagConfig.py b/PhysicsAnalysis/JetTagging/JetTagTools/python/JetFitterTagConfig.py index e4329e95fd83..ff52a354680e 100644 --- a/PhysicsAnalysis/JetTagging/JetTagTools/python/JetFitterTagConfig.py +++ b/PhysicsAnalysis/JetTagging/JetTagTools/python/JetFitterTagConfig.py @@ -32,11 +32,11 @@ def JetFitterTagCfg(flags, name = 'JetFitterTagNN', scheme = '', CombinedIPNN = options['name'] = name options['xAODBaseName'] = 'JetFitter' - if (scheme == ""): + if True: if useBTagFlagsDefaults: if not CombinedIPNN: jetFitterNtupleWriterNN = acc.popToolsAndMerge(JetFitterNtupleWriterNNCfg('JetFitterNtupleWriterNN')) - jetfitterClassifier = acc.popToolsAndMerge(JetFitterNNToolCfg('JetFitterNNTool')) + jetfitterClassifier = acc.popToolsAndMerge(JetFitterNNToolCfg('JetFitterNNTool', scheme)) defaults = { 'Runmodus' : flags.BTagging.RunModus, 'jetCollectionList' : BTaggingFlags.Jets, 'SecVxFinderName' : 'JetFitter', diff --git a/PhysicsAnalysis/JetTagging/JetTagTools/python/JetVertexChargeConfig.py b/PhysicsAnalysis/JetTagging/JetTagTools/python/JetVertexChargeConfig.py index 5a7edddcee4f..5f6930d681be 100644 --- a/PhysicsAnalysis/JetTagging/JetTagTools/python/JetVertexChargeConfig.py +++ b/PhysicsAnalysis/JetTagging/JetTagTools/python/JetVertexChargeConfig.py @@ -7,7 +7,7 @@ from JetTagTools.MuonCorrectionsToolConfig import MuonCorrectionsToolCfg # import the JetVertexCharger configurable from JetTagTools.JetTagToolsConf import Analysis__JetVertexCharge -def JetVertexChargeCfg(flags, name = 'JetVertexCharge', useBTagFlagsDefaults = True, **options ): +def JetVertexChargeCfg(flags, name = 'JetVertexCharge', scheme = '', useBTagFlagsDefaults = True, **options ): """Sets up a JetVertexCharge tool and returns it. @@ -63,5 +63,8 @@ def JetVertexChargeCfg(flags, name = 'JetVertexCharge', useBTagFlagsDefaults = T for option in defaults: options.setdefault(option, defaults[option]) options['name'] = name + if scheme == 'Trig': + options['HistosKey'] = 'JetTagTrigCalibHistosKey' acc.setPrivateTools(Analysis__JetVertexCharge(**options)) return acc + diff --git a/PhysicsAnalysis/JetTagging/JetTagTools/python/MV2TagConfig.py b/PhysicsAnalysis/JetTagging/JetTagTools/python/MV2TagConfig.py index b407a1e78a2f..14eeb6a02dc4 100644 --- a/PhysicsAnalysis/JetTagging/JetTagTools/python/MV2TagConfig.py +++ b/PhysicsAnalysis/JetTagging/JetTagTools/python/MV2TagConfig.py @@ -28,6 +28,8 @@ def MV2TagCfg( flags, name = 'MV2c10', scheme = '', useBTagFlagsDefaults = True, options['name'] = name + 'Tag' basename = name options['xAODBaseName'] = basename + if scheme == 'Trig': + options['HistosKey'] = 'JetTagTrigCalibHistosKey' if useBTagFlagsDefaults: defaults = { 'Runmodus' : flags.BTagging.RunModus, diff --git a/PhysicsAnalysis/JetTagging/JetTagTools/python/MultiSVTagConfig.py b/PhysicsAnalysis/JetTagging/JetTagTools/python/MultiSVTagConfig.py index d3f2fffa06d5..cb7494fa32a0 100644 --- a/PhysicsAnalysis/JetTagging/JetTagTools/python/MultiSVTagConfig.py +++ b/PhysicsAnalysis/JetTagging/JetTagTools/python/MultiSVTagConfig.py @@ -7,7 +7,7 @@ from AthenaConfiguration.ComponentFactory import CompFactory Analysis__MultiSVTag=CompFactory.Analysis__MultiSVTag -def MultiSVTagCfg(flags, name = 'MultiSVbb1Tag', taggerNameBase = 'MultiSVbb1', useBTagFlagsDefaults = True, **options): +def MultiSVTagCfg(flags, name = 'MultiSVbb1Tag', taggerNameBase = 'MultiSVbb1', scheme = '', useBTagFlagsDefaults = True, **options): """Sets up a MultiSVTag tool and returns it. The following options have BTaggingFlags defaults: @@ -23,6 +23,9 @@ def MultiSVTagCfg(flags, name = 'MultiSVbb1Tag', taggerNameBase = 'MultiSVbb1', acc = ComponentAccumulator() options['name'] = name options['xAODBaseName'] = 'MSV' + if scheme == 'Trig': + options['HistosKey'] = 'JetTagTrigCalibHistosKey' + if useBTagFlagsDefaults: defaults = { 'Runmodus' : flags.BTagging.RunModus, 'taggerNameBase' : taggerNameBase, @@ -32,3 +35,4 @@ def MultiSVTagCfg(flags, name = 'MultiSVbb1Tag', taggerNameBase = 'MultiSVbb1', acc.setPrivateTools(Analysis__MultiSVTag( **options)) return acc + diff --git a/PhysicsAnalysis/JetTagging/JetTagTools/python/MultivariateTagManagerConfig.py b/PhysicsAnalysis/JetTagging/JetTagTools/python/MultivariateTagManagerConfig.py index 1b2c372c3686..8bc6a430f311 100644 --- a/PhysicsAnalysis/JetTagging/JetTagTools/python/MultivariateTagManagerConfig.py +++ b/PhysicsAnalysis/JetTagging/JetTagTools/python/MultivariateTagManagerConfig.py @@ -26,42 +26,37 @@ def MultivariateTagManagerCfg(flags, name = 'MultivariateTagManager', TaggerList MultivariateTagManagerAuxBranches = [] MultivariateTagManagerAuxBranches += ['SMT_discriminant'] #ATLASRECTS-5381 - if 'DL1rnn' in TaggerList or 'MV2c10rnn' in TaggerList: - #RNNIP output variables are needed - rnnip_outputs = ['b','c','u','tau'] - MultivariateTagManagerAuxBranches += ['rnnip_p' + x for x in rnnip_outputs] - if 'DL1' in TaggerList: - dl1 = acc.popToolsAndMerge(DL1TagCfg(flags, 'DL1')) + dl1 = acc.popToolsAndMerge(DL1TagCfg(flags, 'DL1', scheme)) mvtagtoollist.append(dl1) if 'DL1mu' in TaggerList: - dl1 = acc.popToolsAndMerge(DL1TagCfg(flags, 'DL1mu')) + dl1 = acc.popToolsAndMerge(DL1TagCfg(flags, 'DL1mu', scheme)) mvtagtoollist.append(dl1) if 'DL1rnn' in TaggerList: - dl1 = acc.popToolsAndMerge(DL1TagCfg(flags, 'DL1rnn')) + dl1 = acc.popToolsAndMerge(DL1TagCfg(flags, 'DL1rnn', scheme)) mvtagtoollist.append(dl1) if 'MV2c10' in TaggerList: - mv2 = acc.popToolsAndMerge(MV2TagCfg(flags, 'MV2c10')) + mv2 = acc.popToolsAndMerge(MV2TagCfg(flags, 'MV2c10', scheme)) mvtagtoollist.append(mv2) if 'MV2c10mu' in TaggerList: - mv2 = acc.popToolsAndMerge(MV2TagCfg(flags, 'MV2c10mu')) + mv2 = acc.popToolsAndMerge(MV2TagCfg(flags, 'MV2c10mu', scheme)) mvtagtoollist.append(mv2) if 'MV2c10rnn' in TaggerList: - mv2 = acc.popToolsAndMerge(MV2TagCfg(flags, 'MV2c10rnn')) + mv2 = acc.popToolsAndMerge(MV2TagCfg(flags, 'MV2c10rnn', scheme)) mvtagtoollist.append(mv2) if 'MV2c100' in TaggerList: - mv2 = acc.popToolsAndMerge(MV2TagCfg(flags, 'MV2c100')) + mv2 = acc.popToolsAndMerge(MV2TagCfg(flags, 'MV2c100', scheme)) mvtagtoollist.append(mv2) if 'MV2cl100' in TaggerList: - mv2 = acc.popToolsAndMerge(MV2TagCfg(flags, 'MV2cl100')) + mv2 = acc.popToolsAndMerge(MV2TagCfg(flags, 'MV2cl100', scheme)) mvtagtoollist.append(mv2) #Check if input has been scheduled diff --git a/PhysicsAnalysis/JetTagging/JetTagTools/python/NewLikelihoodToolConfig.py b/PhysicsAnalysis/JetTagging/JetTagTools/python/NewLikelihoodToolConfig.py index b65d82620175..93910f65860d 100644 --- a/PhysicsAnalysis/JetTagging/JetTagTools/python/NewLikelihoodToolConfig.py +++ b/PhysicsAnalysis/JetTagging/JetTagTools/python/NewLikelihoodToolConfig.py @@ -6,7 +6,7 @@ from AthenaConfiguration.ComponentFactory import CompFactory # import the NewLikelihoodTool configurable Analysis__NewLikelihoodTool=CompFactory.Analysis__NewLikelihoodTool -def NewLikelihoodToolCfg( flags, name = 'NewLikelihoodTool', taggername = 'IP2D', useBTagFlagsDefaults = True, **options): +def NewLikelihoodToolCfg( flags, name = 'NewLikelihoodTool', taggername = 'IP2D', scheme = '', useBTagFlagsDefaults = True, **options): """Sets up a NewLikelihoodTool tool and returns it. The following options have BTaggingFlags defaults: @@ -31,6 +31,9 @@ def NewLikelihoodToolCfg( flags, name = 'NewLikelihoodTool', taggername = 'IP2D' for option in defaults: options.setdefault(option, defaults[option]) options['name'] = name + if scheme == 'Trig': + options['HistosKey'] = 'JetTagTrigCalibHistosKey' acc.setPrivateTools(Analysis__NewLikelihoodTool(**options)) return acc + diff --git a/PhysicsAnalysis/JetTagging/JetTagTools/python/RNNIPTagConfig.py b/PhysicsAnalysis/JetTagging/JetTagTools/python/RNNIPTagConfig.py index b81b22b344a0..14510668b2cf 100644 --- a/PhysicsAnalysis/JetTagging/JetTagTools/python/RNNIPTagConfig.py +++ b/PhysicsAnalysis/JetTagging/JetTagTools/python/RNNIPTagConfig.py @@ -30,6 +30,8 @@ def RNNIPTagCfg( flags, name = 'RNNIP', scheme = '', calibration=None, useBTagFl basename = 'RNNIP' options['xAODBaseName'] = basename options['trackAssociationName'] = 'BTagTrackToJetAssociator' + if scheme == 'Trig': + options['HistosKey'] = 'JetTagTrigCalibHistosKey' cal_dir = calibration or basename is_flipped=False if (scheme == "Flip"): diff --git a/PhysicsAnalysis/JetTagging/JetTagTools/python/SV1TagConfig.py b/PhysicsAnalysis/JetTagging/JetTagTools/python/SV1TagConfig.py index 940d9a91e216..80aa021a91bc 100644 --- a/PhysicsAnalysis/JetTagging/JetTagTools/python/SV1TagConfig.py +++ b/PhysicsAnalysis/JetTagging/JetTagTools/python/SV1TagConfig.py @@ -29,7 +29,7 @@ def SV1TagCfg( flags, name = 'SV1Tag', scheme = '', useBTagFlagsDefaults = True, options['name'] = name options['xAODBaseName'] = 'SV1' if useBTagFlagsDefaults: - likelihood = acc.popToolsAndMerge(NewLikelihoodToolCfg(flags, 'SV1NewLikelihoodTool', 'SV1')) + likelihood = acc.popToolsAndMerge(NewLikelihoodToolCfg(flags, 'SV1NewLikelihoodTool', 'SV1', scheme)) defaults = { 'Runmodus' : flags.BTagging.RunModus, 'referenceType' : BTaggingFlags.ReferenceType, 'jetPtMinRef' : flags.BTagging.JetPtMinRef, @@ -43,3 +43,4 @@ def SV1TagCfg( flags, name = 'SV1Tag', scheme = '', useBTagFlagsDefaults = True, acc.setPrivateTools(Analysis__SVTag(**options)) return acc + diff --git a/PhysicsAnalysis/JetTagging/JetTagTools/python/SoftMuonTagConfig.py b/PhysicsAnalysis/JetTagging/JetTagTools/python/SoftMuonTagConfig.py index 6051780bc599..97cffab28a13 100644 --- a/PhysicsAnalysis/JetTagging/JetTagTools/python/SoftMuonTagConfig.py +++ b/PhysicsAnalysis/JetTagging/JetTagTools/python/SoftMuonTagConfig.py @@ -10,7 +10,7 @@ from JetTagTools.MuonSelectorToolConfig import MuonSelectorToolCfg # import the SoftMuonTag configurable Analysis__SoftMuonTag=CompFactory.Analysis__SoftMuonTag -def SoftMuonTagCfg( flags, name = 'SoftMu', useBTagFlagsDefaults = True, **options ): +def SoftMuonTagCfg( flags, name = 'SoftMu', scheme = '', useBTagFlagsDefaults = True, **options ): """Sets up a SoftMuonTag tool and returns it. The following options have BTaggingFlags defaults: @@ -29,7 +29,7 @@ def SoftMuonTagCfg( flags, name = 'SoftMu', useBTagFlagsDefaults = True, **optio if useBTagFlagsDefaults: trackToVertexIPEstimator = acc.popToolsAndMerge(BTagTrackToVertexIPEstimatorCfg(flags, 'TrkToVxIPEstimator')) muonSelectorTool = acc.popToolsAndMerge(MuonSelectorToolCfg('MuonSelectorTool')) - likelihood = acc.popToolsAndMerge(NewLikelihoodToolCfg(flags, 'SoftMuonTagNewLikelihoodTool', 'SMT')) + likelihood = acc.popToolsAndMerge(NewLikelihoodToolCfg(flags, 'SoftMuonTagNewLikelihoodTool', 'SMT', scheme)) defaults = { 'Runmodus' : flags.BTagging.RunModus, 'jetCollectionList' : BTaggingFlags.Jets, @@ -43,6 +43,9 @@ def SoftMuonTagCfg( flags, name = 'SoftMu', useBTagFlagsDefaults = True, **optio for option in defaults: options.setdefault(option, defaults[option]) options['name'] = name + if scheme == 'Trig': + options['HistosKey'] = 'JetTagTrigCalibHistosKey' acc.setPrivateTools(Analysis__SoftMuonTag( **options)) return acc + diff --git a/PhysicsAnalysis/JetTagging/JetTagTools/python/SpecialTrackAssociatorConfig.py b/PhysicsAnalysis/JetTagging/JetTagTools/python/SpecialTrackAssociatorConfig.py index 8bae9502fa8e..359f879007e6 100644 --- a/PhysicsAnalysis/JetTagging/JetTagTools/python/SpecialTrackAssociatorConfig.py +++ b/PhysicsAnalysis/JetTagging/JetTagTools/python/SpecialTrackAssociatorConfig.py @@ -2,6 +2,7 @@ from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator from AthenaConfiguration.ComponentFactory import CompFactory +from BTagging.BTaggingFlags import BTaggingFlags # import the TrackToVertexIPEstimator configurable CP__TrackVertexAssociationTool=CompFactory.CP__TrackVertexAssociationTool @@ -22,6 +23,7 @@ def SpecialTrackAssociatorCfg( name = 'SpecialTrackAssociator', useBTagFlagsDefa for option in defaults: options.setdefault(option, defaults[option]) options['name'] = name + options['VertexContainer'] = BTaggingFlags.PrimaryVertexCollectionName acc.setPrivateTools(CP__TrackVertexAssociationTool( **options)) return acc diff --git a/Trigger/TrigHypothesis/TrigBjetHypo/src/TrigBtagFexMT.cxx b/Trigger/TrigHypothesis/TrigBjetHypo/src/TrigBtagFexMT.cxx index e26748fbb9da..9faf7bbd6321 100755 --- a/Trigger/TrigHypothesis/TrigBjetHypo/src/TrigBtagFexMT.cxx +++ b/Trigger/TrigHypothesis/TrigBjetHypo/src/TrigBtagFexMT.cxx @@ -117,6 +117,47 @@ StatusCode TrigBtagFexMT::execute() { " eta=" << trk->eta() << " phi=" << trk->phi() ); + // Test retrieval of properties decorated in BTagTrackAugmenterAlg + ATH_MSG_DEBUG( "Attempting to retrieve TrackParticleContainer with key " << m_d0ContainerKey.key() ); + SG::ReadDecorHandle< xAOD::TrackParticleContainer, float > trkContainer_d0_Handle ( m_d0ContainerKey,ctx ); + CHECK( trkContainer_d0_Handle.isValid() ); + ATH_MSG_DEBUG("trkContainerHandle->size(): " << trkContainerHandle->size() << " trkContainer_d0_Handle->size(): " << trkContainer_d0_Handle->size() ); + for ( long unsigned int i=0; i< trkContainer_d0_Handle->size(); i++) + ATH_MSG_DEBUG("Track " << i <<": d0 =" << trkContainer_d0_Handle(i)); + + SG::ReadDecorHandle< xAOD::TrackParticleContainer, float > trkContainer_z0SinTheta_Handle ( m_z0SinThetaContainerKey,ctx ); + CHECK( trkContainer_z0SinTheta_Handle.isValid() ); + for ( long unsigned int i=0; i< trkContainer_z0SinTheta_Handle->size(); i++) + ATH_MSG_DEBUG("Track " << i <<": z0SinTheta =" << trkContainer_z0SinTheta_Handle(i)); + + SG::ReadDecorHandle< xAOD::TrackParticleContainer, float > trkContainer_d0Uncertainty_Handle ( m_d0UncertaintyContainerKey,ctx ); + CHECK( trkContainer_d0Uncertainty_Handle.isValid() ); + for ( long unsigned int i=0; i< trkContainer_d0Uncertainty_Handle->size(); i++) + ATH_MSG_DEBUG("Track " << i << ": d0Uncertainty =" << trkContainer_d0Uncertainty_Handle(i)); + + SG::ReadDecorHandle< xAOD::TrackParticleContainer, float > trkContainer_z0SinThetaUncertainty_Handle ( m_z0SinThetaUncertaintyContainerKey,ctx ); + CHECK( trkContainer_z0SinThetaUncertainty_Handle.isValid() ); + for ( long unsigned int i=0; i< trkContainer_z0SinThetaUncertainty_Handle->size(); i++) + ATH_MSG_DEBUG("Track " << i << ": z0SinThetaUncertainty =" << trkContainer_z0SinThetaUncertainty_Handle(i)); + + SG::ReadDecorHandle< xAOD::TrackParticleContainer, std::vector< float > > trkContainer_trackpos_Handle ( m_trackposContainerKey,ctx ); + CHECK( trkContainer_trackpos_Handle.isValid() ); + for ( long unsigned int i=0; i< trkContainer_trackpos_Handle->size(); i++){ + ATH_MSG_DEBUG("Track " << i << ": Displacement (x,y,z) = "); + for (auto pos: trkContainer_trackpos_Handle(i)){ + ATH_MSG_DEBUG( pos << ' '); + } + } + + SG::ReadDecorHandle< xAOD::TrackParticleContainer, std::vector< float > > trkContainer_trackmom_Handle ( m_trackmomContainerKey,ctx ); + CHECK( trkContainer_trackmom_Handle.isValid() ); + for ( long unsigned int i=0; i< trkContainer_trackmom_Handle->size(); i++){ + ATH_MSG_DEBUG("Track " << i << ": Momentum = "); + for (auto mom: trkContainer_trackmom_Handle(i)){ + ATH_MSG_DEBUG( mom << ' '); + } + } + // Test retrieval of VertexContainer ATH_MSG_DEBUG( "Attempting to retrieve VertexContainer with key " << m_VertexContainerKey.key() ); diff --git a/Trigger/TrigHypothesis/TrigBjetHypo/src/TrigBtagFexMT.h b/Trigger/TrigHypothesis/TrigBjetHypo/src/TrigBtagFexMT.h index 04d5ccced32f..9ef1abd8cf6b 100755 --- a/Trigger/TrigHypothesis/TrigBjetHypo/src/TrigBtagFexMT.h +++ b/Trigger/TrigHypothesis/TrigBjetHypo/src/TrigBtagFexMT.h @@ -95,6 +95,14 @@ class TrigBtagFexMT: public AthAlgorithm { SG::ReadHandleKey< xAOD::VertexContainer > m_VertexContainerKey {this,"PriVtxKey","xPrimVx","Key of primary vertexes"}; // SG::ReadHandleKey< xAOD::VertexContainer > m_BackUpVertexContainerKey {this,"PriVtxKeyBackup","EFHistoPrmVtx","Back-Up Key of primary vertexes"}; SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trkContainerKey {this,"TracksKey","tracks__COLL","Key for track particle container"}; + SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_d0ContainerKey {this,"d0Key","d0Key","Key for Particles d0 value"}; + SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_z0SinThetaContainerKey {this,"z0SinThetaKey","z0SinThetaKey","Key for Particles z0SinTheta value"}; + SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_d0UncertaintyContainerKey {this,"d0UncertaintyKey","d0UncertaintyKey","Key for Particles d0Uncertainty value"}; + SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_z0SinThetaUncertaintyContainerKey {this,"z0SinThetaUncertaintyKey","z0SinThetaUncertaintyKey","Key for Particles z0SinThetaUncertainty value"}; + SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_trackposContainerKey {this,"trackposKey","trackposKey","Key for Track Displacement"}; + SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_trackmomContainerKey {this,"trackmomKey","trackmomKey","Key for Track Momentum"}; + + SG::WriteHandleKey< xAOD::BTaggingContainer > m_outputBTaggingContainerKey {this,"OutputBTagging","Undefined","Output Btagging Container Key"}; // SG::WriteHandleKey< xAOD::VertexContainer > m_outputVertexContainerKey {this,"OutputVtxKey","HLT_BjetVertexFex","Output Vertex Container Key"}; diff --git a/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.cxx b/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.cxx index 200a07fd586b..5df2c6eb9043 100644 --- a/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.cxx +++ b/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.cxx @@ -94,6 +94,7 @@ StatusCode HLTEDMCreator::initialize() INIT_XAOD( VertexContainer ); INIT_XAOD( TrigBphysContainer ); INIT_XAOD( BTaggingContainer ); + INIT_XAOD( BTagVertexContainer ); INIT_XAOD( CaloClusterContainer ); @@ -331,6 +332,7 @@ StatusCode HLTEDMCreator::createOutput(const EventContext& context) const { CREATE_XAOD( VertexContainer,VertexAuxContainer ); CREATE_XAOD( TrigBphysContainer, TrigBphysAuxContainer ); CREATE_XAOD( BTaggingContainer,BTaggingAuxContainer ); + CREATE_XAOD( BTagVertexContainer,BTagVertexAuxContainer ); ATH_CHECK( fixLinks() ); diff --git a/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.h b/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.h index bed802d14a42..0e700a28e6a1 100644 --- a/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.h +++ b/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.h @@ -61,6 +61,8 @@ #include "xAODTrigBphys/TrigBphysAuxContainer.h" #include "xAODBTagging/BTaggingContainer.h" #include "xAODBTagging/BTaggingAuxContainer.h" +#include "xAODBTagging/BTagVertexContainer.h" +#include "xAODBTagging/BTagVertexAuxContainer.h" #include "xAODCaloEvent/CaloClusterContainer.h" #include "xAODTrigCalo/CaloClusterTrigAuxContainer.h" @@ -137,6 +139,7 @@ class HLTEDMCreator: public extends<AthAlgTool, IHLTOutputTool> { DEF_XAOD_KEY( JetContainer ); DEF_XAOD_KEY( VertexContainer ); DEF_XAOD_KEY( BTaggingContainer ); + DEF_XAOD_KEY( BTagVertexContainer ); DEF_XAOD_KEY( TrigBphysContainer ); #undef DEF_VIEWS #undef DEF_KEY diff --git a/Trigger/TrigSteer/ViewAlgs/src/EventViewCreatorAlgorithmWithJets.cxx b/Trigger/TrigSteer/ViewAlgs/src/EventViewCreatorAlgorithmWithJets.cxx index e043757b8e13..059c67e0f85c 100644 --- a/Trigger/TrigSteer/ViewAlgs/src/EventViewCreatorAlgorithmWithJets.cxx +++ b/Trigger/TrigSteer/ViewAlgs/src/EventViewCreatorAlgorithmWithJets.cxx @@ -124,16 +124,18 @@ StatusCode EventViewCreatorAlgorithmWithJets::execute( const EventContext& conte } StatusCode EventViewCreatorAlgorithmWithJets::placeJetInView( const xAOD::Jet* theObject, SG::View* view, const EventContext& context ) const { - // fill the Jet output collection - ATH_MSG_DEBUG( "Adding Jet To View : " << m_inViewJets.key() ); - auto oneObjectCollection = std::make_unique< ConstDataVector< xAOD::JetContainer > >(); - oneObjectCollection->clear( SG::VIEW_ELEMENTS ); - oneObjectCollection->push_back( theObject ); + auto oneObjectCollection = std::make_unique<xAOD::JetContainer>(); + auto oneObjectCollectionAux = std::make_unique<xAOD::JetAuxContainer>(); + oneObjectCollection->setStore(oneObjectCollectionAux.get()); + xAOD::Jet* copiedJet = new xAOD::Jet(); + oneObjectCollection->push_back(copiedJet); + *copiedJet = *theObject; //store in the view auto handle = SG::makeHandle( m_inViewJets,context ); ATH_CHECK( handle.setProxyDict( view ) ); - ATH_CHECK( handle.record( std::move( oneObjectCollection ) ) ); + ATH_CHECK( handle.record( std::move(oneObjectCollection), std::move(oneObjectCollectionAux) ) ); return StatusCode::SUCCESS; } + diff --git a/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py b/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py index 3dde971ea819..4b17ed1bf249 100644 --- a/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py +++ b/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py @@ -61,6 +61,19 @@ JetVarsToKeep = ['ActiveArea', 'ActiveArea4vec_eta', 'ActiveArea4vec_m', 'Active 'Jvt', 'JVFCorr', 'NumTrkPt500', 'NumTrkPt1000', 'SizeParameter', 'SumPtTrkPt500', 'SumPtTrkPt1000', 'TrackWidthPt1000',] JetVars = '.'.join(JetVarsToKeep) +BTagOutput = ['SV1_TrackParticleLinks','IP2D_TrackParticleLinks','IP3D_TrackParticleLinks','BTagTrackToJetAssociator','Muons', + 'JetFitter_N2Tpair','JetFitter_JFvertices','JetFitter_fittedPosition','JetFitter_fittedCov','JetFitter_tracksAtPVchi2', + 'JetFitter_tracksAtPVndf','JetFitter_tracksAtPVlinks','JetFitter_massUncorr','JetFitter_chi2','JetFitter_ndof','JetFitter_dRFlightDir', + 'JetFitter_nVTX','JetFitter_nSingleTracks','JetFitter_nTracksAtVtx','JetFitter_mass','JetFitter_energyFraction','JetFitter_significance3d', + 'JetFitter_deltaeta','JetFitter_deltaphi','SV1_vertices','SV1_energyTrkInJet','SV1_dstToMatLay','SV1_masssvx','SV1_efracsvx','SV1_N2Tpair', + 'SV1_NGTinSvx','SV1_badTracksIP','IP2D_sigD0wrtPVofTracks','IP2D_weightBofTracks','IP2D_weightUofTracks','IP2D_weightCofTracks', + 'IP2D_flagfromV0ofTracks','IP2D_gradeOfTracks','trkSum_ntrk','trkSum_SPt','trkSum_VPt','trkSum_VEta','IP3D_valD0wrtPVofTracks', + 'IP3D_valZ0wrtPVofTracks','IP3D_sigD0wrtPVofTracks','IP3D_sigZ0wrtPVofTracks','IP3D_weightBofTracks','IP3D_weightUofTracks', + 'IP3D_weightCofTracks','IP3D_flagfromV0ofTracks','IP3D_gradeOfTracks','SV1_normdist','SV1_significance3d','SV1_deltaR','SV1_Lxy','SV1_L3d', + 'MV2c10_discriminant','MV2c100_discriminant',] #komma am ende! +BTagVars = '.'.join(BTagOutput) + + TriggerHLTListRun3 = [ #framework/steering @@ -328,18 +341,35 @@ TriggerHLTListRun3 = [ # ('xAOD::TrackParticleAuxContainer#HLT_IDTrack_Bjet_IDTrigAux.', 'BS ESD AODFULL', 'Bjet'), - #bjet jets + #bjet jets first step ('xAOD::JetContainer#HLT_GSCJet', 'BS ESD AODFULL AODSLIM AODVERYSLIM', 'Bjet', 'inViews:FullScanBjetView'), ('xAOD::JetAuxContainer#HLT_GSCJetAux.', 'BS ESD AODFULL AODSLIM AODVERYSLIM', 'Bjet'), + #bjet jets second step + ('xAOD::JetContainer#HLT_InViewJets', 'BS ESD AODFULL AODSLIM AODVERYSLIM', 'Bjet', 'inViews:BTagViews'), + ('xAOD::JetAuxContainer#HLT_InViewJetsAux.', 'BS ESD AODFULL AODSLIM AODVERYSLIM', 'Bjet'), + + # vertex for b-jets ('xAOD::VertexContainer#HLT_EFHistoPrmVtx', 'BS ESD AODFULL AODSLIM AODVERYSLIM', 'Bjet'), ('xAOD::VertexAuxContainer#HLT_EFHistoPrmVtxAux.', 'BS ESD AODFULL AODSLIM AODVERYSLIM', 'Bjet'), + # secvertex for b-jets + ('xAOD::VertexContainer#HLT_SecVtx', 'BS ESD AODFULL AODSLIM AODVERYSLIM', 'Bjet', 'inViews:BTagViews'), + ('xAOD::VertexAuxContainer#HLT_SecVtxAux.', 'BS ESD AODFULL AODSLIM AODVERYSLIM', 'Bjet'), + + # btagvertex for b-jets + ('xAOD::BTagVertexContainer#HLT_JFVtx', 'BS ESD AODFULL AODSLIM AODVERYSLIM', 'Bjet', 'inViews:BTagViews'), + ('xAOD::BTagVertexAuxContainer#HLT_JFVtxAux.', 'BS ESD AODFULL AODSLIM AODVERYSLIM', 'Bjet'), + # bjet b-tagging ('xAOD::BTaggingContainer#HLT_BTagging', 'BS ESD AODFULL AODSLIM AODVERYSLIM', 'Bjet', 'inViews:BTagViews'), ('xAOD::BTaggingAuxContainer#HLT_BTaggingAux.', 'BS ESD AODFULL AODSLIM AODVERYSLIM', 'Bjet'), + # bjet b-tagging offline + ('xAOD::BTaggingContainer#HLT_OfflineBTagging', 'BS ESD AODFULL AODSLIM AODVERYSLIM', 'Bjet', 'inViews:BTagViews'), + ('xAOD::BTaggingAuxContainer#HLT_OfflineBTaggingAux.'+BTagVars, 'BS ESD AODFULL AODSLIM AODVERYSLIM', 'Bjet'), + # MinBias ('xAOD::TrackParticleContainer#HLT_IDTrack_MinBias', 'BS ESD AODFULL', 'MinBias'), ('xAOD::TrackParticleAuxContainer#HLT_IDTrack_MinBiasAux.', 'BS ESD AODFULL', 'MinBias'), diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/JetTagCalibConfig.py b/Trigger/TriggerCommon/TriggerJobOpts/python/JetTagCalibConfig.py new file mode 100644 index 000000000000..2fce8bc1d92f --- /dev/null +++ b/Trigger/TriggerCommon/TriggerJobOpts/python/JetTagCalibConfig.py @@ -0,0 +1,53 @@ +# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +from IOVDbSvc.CondDB import conddb +from AthenaConfiguration.ComponentFactory import CompFactory +from IOVDbSvc.IOVDbSvcConfig import addFolders +from BTagging.BTaggingFlags import BTaggingFlags + +def JetTagCalibCfg(ConfigFlags, scheme="", TaggerList = [], ChannelAlias = ""): + + grades= [ "0HitIn0HitNInExp2","0HitIn0HitNInExpIn","0HitIn0HitNInExpNIn","0HitIn0HitNIn", + "0HitInExp", "0HitIn", + "0HitNInExp", "0HitNIn", + "InANDNInShared", "PixShared", "SctShared", + "InANDNInSplit", "PixSplit", + "Good"] + JetTagCalibCondAlg,=CompFactory.getComps("Analysis__JetTagCalibCondAlg",) + jettagcalibcondalg = "JetTagCalibCondAlg" + readkeycalibpath = "/GLOBAL/Onl/TrigBTagCalib/RUN12" + connSchema = "GLOBAL" + histoskey = "JetTagTrigCalibHistosKey" + conddb.addFolder("GLOBAL_ONL", "/GLOBAL/Onl/TrigBTagCalib/RUN12", className='CondAttrListCollection') + + CalibrationChannelAliases = [ "myOwnCollection->AntiKt4TopoEM,AntiKt4EMTopo", + "AntiKt4Tower->AntiKt4Tower,AntiKt4H1Tower,AntiKt4TopoEM,AntiKt4EMTopo", + "AntiKt4Topo->AntiKt4Topo,AntiKt4TopoEM,AntiKt4EMTopo,AntiKt4H1Topo", + "AntiKt4LCTopo->AntiKt4LCTopo,AntiKt4TopoEM,AntiKt4EMTopo,AntiKt4Topo,AntiKt4H1Topo", + "AntiKt6Tower->AntiKt6Tower,AntiKt6H1Tower,AntiKt4TopoEM,AntiKt4EMTopo", + "AntiKt6Topo->AntiKt6Topo,AntiKt6TopoEM,AntiKt6H1Topo,AntiKt6H1Tower,AntiKt4TopoEM,AntiKt4EMTopo", + "AntiKt6LCTopo->AntiKt6LCTopo,AntiKt6TopoEM,AntiKt6Topo,AntiKt6H1Topo,AntiKt6H1Tower,AntiKt4TopoEM,AntiKt4EMTopo", + "AntiKt4TopoEM->AntiKt4TopoEM,AntiKt4EMTopo,AntiKt4H1Topo,AntiKt4LCTopo", + "AntiKt6TopoEM->AntiKt6TopoEM,AntiKt6H1Topo,AntiKt6H1Tower,AntiKt4TopoEM,AntiKt4EMTopo", + #WOUTER: I added some more aliases here that were previously set up at ./python/BTagging_jobOptions.py. But it cannot + #stay there if we want support for JetRec to setup b-tagging from their end. + "AntiKt4EMTopo->AntiKt4EMTopo,AntiKt4TopoEM,AntiKt4LCTopo", + "AntiKt4LCTopo->AntiKt4LCTopo,AntiKt4TopoEM,AntiKt4EMTopo", + "AntiKt4EMTopoOrigin->AntiKt4EMTopoOrigin,AntiKt4EMTopo,AntiKt4TopoEM,AntiKt4LCTopo", + "AntiKt4LCTopoOrigin->AntiKt4LCTopoOrigin,AntiKt4LCTopo,AntiKt4TopoEM,AntiKt4EMTopo", + "AntiKt10LCTopo->AntiKt10LCTopo,AntiKt6LCTopo,AntiKt6TopoEM,AntiKt4LCTopo,AntiKt4TopoEM,AntiKt4EMTopo", + "AntiKt10Truth->AntiKt6TopoEM,AntiKt4TopoEM,AntiKt4EMTopo,AntiKt4LCTopo", + "AntiKt10TruthWZ->AntiKt10TruthWZ,AntiKt6TopoEM,AntiKt4TopoEM,AntiKt4EMTopo,AntiKt4LCTopo", + "AntiKt4Truth->AntiKt4TopoEM,AntiKt4EMTopo,AntiKt4LCTopo", + "AntiKt4TruthWZ->AntiKt4TruthWZ,AntiKt4TopoEM,AntiKt4EMTopo,AntiKt4LCTopo", + "AntiKt4Track->AntiKt4Track,AntiKt4TopoEM,AntiKt4EMTopo,AntiKt4LCTopo", + "AntiKt3Track->AntiKt3Track,AntiKt4Track,AntiKt4TopoEM,AntiKt4EMTopo,AntiKt4LCTopo", + "AntiKt2Track->AntiKt2Track,AntiKt4Track,AntiKt4TopoEM,AntiKt4EMTopo,AntiKt4LCTopo", + "AntiKt4EMPFlow->AntiKt4EMPFlow,AntiKt4EMTopo,AntiKt4TopoEM,AntiKt4LCTopo", + "AntiKt4HI->AntiKt4HI,AntiKt4EMTopo,AntiKt4TopoEM,AntiKt4LCTopo"] + + CalibrationChannelAliases += ChannelAlias + + JetTagCalib = JetTagCalibCondAlg(jettagcalibcondalg, ReadKeyCalibPath=readkeycalibpath, HistosKey = histoskey, taggers = ConfigFlags.BTagging.TrigTaggersList, channelAliases = CalibrationChannelAliases, IP2D_TrackGradePartitions = grades, RNNIP_NetworkConfig = BTaggingFlags.RNNIPConfig) + + return JetTagCalib + diff --git a/Trigger/TriggerCommon/TriggerJobOpts/share/runHLT_standalone.py b/Trigger/TriggerCommon/TriggerJobOpts/share/runHLT_standalone.py index 9da25d053027..7dd579889440 100644 --- a/Trigger/TriggerCommon/TriggerJobOpts/share/runHLT_standalone.py +++ b/Trigger/TriggerCommon/TriggerJobOpts/share/runHLT_standalone.py @@ -557,6 +557,13 @@ ConfigFlags.lock() triggerIDCCacheCreatorsCfg(ConfigFlags).appendToGlobals() Configurable.configurableRun3Behavior-=1 +# B-jet output file +log.info("opt.enabledSignatures") +log.info(opt.enabledSignatures) +from TriggerJobOpts.JetTagCalibConfig import JetTagCalibCfg +alias = ["HLT_InView->HLT_InView,AntiKt4EMTopo"] +topSequence+=JetTagCalibCfg(ConfigFlags, ChannelAlias = alias) + # Trigger output if opt.doWriteBS or opt.doWriteRDOTrigger: from TriggerJobOpts.TriggerConfig import collectHypos, collectFilters, collectDecisionObjects, collectHypoDecisionObjects, triggerOutputCfg diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Bjet/BjetFlavourTaggingConfiguration.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Bjet/BjetFlavourTaggingConfiguration.py index 2d349cb26dfd..878ceb4298af 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Bjet/BjetFlavourTaggingConfiguration.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Bjet/BjetFlavourTaggingConfiguration.py @@ -1,19 +1,80 @@ +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator from TrigEDMConfig.TriggerEDMRun3 import recordable #from AthenaCommon.Constants import DEBUG def getFlavourTagging( inputJets, inputVertex, inputTracks ): + + acc = ComponentAccumulator() algSequence = [] - + + nThreads=1 + filesInput="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data18_13TeV.00360026.physics_EnhancedBias.merge.RAW._lb0151._SFO-1._0001.1" + kwargs = {} + + from AthenaConfiguration.AllConfigFlags import ConfigFlags + ConfigFlags.Output.ESDFileName="esdOut.pool.root" + ConfigFlags.Input.isMC=False + ConfigFlags.Input.Files=filesInput.split(",") + ConfigFlags.Concurrency.NumThreads = nThreads + ConfigFlags.Scheduler.ShowDataDeps = True + ConfigFlags.Scheduler.ShowDataFlow = True + ConfigFlags.Scheduler.ShowControlFlow = True + ConfigFlags.Concurrency.NumConcurrentEvents = nThreads + + from BTagging.BTaggingConf import Analysis__BTagTrackAugmenterAlg + bTagTrackAugmenter = Analysis__BTagTrackAugmenterAlg( "Analysis__BTagTrackAugmenterAlg" ) + bTagTrackAugmenter.TrackContainer = inputTracks + bTagTrackAugmenter.PrimaryVertexContainer = inputVertex + algSequence.append( bTagTrackAugmenter ) + from TrigBjetHypo.TrigBjetHypoConf import TrigBtagFexMT bTagFex = TrigBtagFexMT( "TrigBtagFexMT" ) bTagFex.JetKey = inputJets bTagFex.PriVtxKey = inputVertex bTagFex.TracksKey = inputTracks + bTagFex.d0Key = inputTracks + ".btagIp_d0" + bTagFex.z0SinThetaKey = inputTracks + ".btagIp_d0Uncertainty" + bTagFex.d0UncertaintyKey = inputTracks + ".btagIp_z0SinTheta" + bTagFex.z0SinThetaUncertaintyKey = inputTracks + ".btagIp_z0SinThetaUncertainty" + bTagFex.trackposKey = inputTracks + ".btagIp_trackDisplacement" + bTagFex.trackmomKey = inputTracks + ".btagIp_trackMomentum" bTagFex.OutputBTagging = recordable( "HLT_BTagging" ) algSequence.append( bTagFex ) - return algSequence + from BTagging.JetParticleAssociationAlgConfig import JetParticleAssociationAlgCfg + from BTagging.JetSecVtxFindingAlgConfig import JetSecVtxFindingAlgCfg + from BTagging.JetSecVertexingAlgConfig import JetSecVertexingAlgCfg + from BTagging.JetBTaggingAlgConfig import JetBTaggingAlgCfg + + TrackToJetAssociators = ['BTagTrackToJetAssociator', 'BTagTrackToJetAssociatorBB'] + kwargs['Release'] = '22' + acc.merge(JetParticleAssociationAlgCfg(ConfigFlags, inputJets.replace("Jets",""), inputTracks, 'BTagTrackToJetAssociator', **kwargs)) + kwargs['Release'] = '21' + acc.merge(JetParticleAssociationAlgCfg(ConfigFlags, inputJets.replace("Jets",""), inputTracks, 'BTagTrackToJetAssociatorBB', **kwargs)) + del kwargs['Release'] + + SecVertexingAndAssociators = {'JetFitter':'BTagTrackToJetAssociator','SV1':'BTagTrackToJetAssociator'} + for k, v in SecVertexingAndAssociators.items(): + if v not in TrackToJetAssociators: + raise RuntimeError( v + ' is not configured') + acc.merge(JetSecVtxFindingAlgCfg(ConfigFlags, inputJets, inputTracks, k, v)) + JetSecVertexingAlg = JetSecVertexingAlgCfg(ConfigFlags, inputJets.replace("Jets",""), inputTracks, k, v) + if k == "JetFitter": + SecVertexingAlg = JetSecVertexingAlg.getEventAlgo("hlt_inview_jetfitter_secvtx") + SecVertexingAlg.BTagJFVtxCollectionName = recordable("HLT_JFVtx") + elif k == "SV1": + SecVertexingAlg = JetSecVertexingAlg.getEventAlgo("hlt_inview_sv1_secvtx") + SecVertexingAlg.BTagSVCollectionName = recordable("HLT_SecVtx") + acc.merge(JetSecVertexingAlg) + + JetBTaggingAlg = JetBTaggingAlgCfg(ConfigFlags, JetCollection = inputJets.replace("Jets",""), TaggerList = ConfigFlags.BTagging.TrigTaggersList, SetupScheme = "Trig", SVandAssoc = SecVertexingAndAssociators, **kwargs) + BTaggingAlg = JetBTaggingAlg.getEventAlgo("btagging_hlt_inview") + BTaggingAlg.BTaggingCollectionName = recordable("HLT_OfflineBTagging") + acc.merge(JetBTaggingAlg) + + + return [ acc, algSequence] diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Bjet/BjetSequenceSetup.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Bjet/BjetSequenceSetup.py index f5451678be46..bfff81135c89 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Bjet/BjetSequenceSetup.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Bjet/BjetSequenceSetup.py @@ -81,41 +81,42 @@ def bJetStep2Sequence(): roisLink = "step1RoI" prmVtxKey = "HLT_EFHistoPrmVtx" - from ViewAlgs.ViewAlgsConf import EventViewCreatorAlgorithmWithJets, ViewCreatorInitialROITool + from ViewAlgs.ViewAlgsConf import EventViewCreatorAlgorithmWithJets InputMakerAlg = EventViewCreatorAlgorithmWithJets( "IMBJet_step3",RoIsLink=roisLink ) InputMakerAlg.ViewFallThrough = True InputMakerAlg.RequireParentView = True - InputMakerAlg.RoITool = ViewCreatorInitialROITool() # NOT USED! TO BE REPLACED WITH NEW TOOL ON CONVERTING EventViewCreatorAlgorithmWithJets -> EventViewCreatorAlgorithm InputMakerAlg.Views = "BTagViews" InputMakerAlg.InViewRoIs = "InViewRoIs" - InputMakerAlg.InViewJets = "InViewJets" - - + InputMakerAlg.InViewJets = "HLT_InViewJets" + InputMakerAlg.ViewNodeName = "bJetBtagSequenceInView" + # Second stage of Fast Tracking and Precision Tracking from TriggerMenuMT.HLTMenuConfig.Bjet.BjetTrackingConfiguration import getSecondStageBjetTracking secondStageAlgs, PTTracks, PTTrackParticles = getSecondStageBjetTracking( inputRoI=InputMakerAlg.InViewRoIs ) + from AthenaCommon.Configurable import Configurable + Configurable.configurableRun3Behavior=1 + # Flavour Tagging from TriggerMenuMT.HLTMenuConfig.Bjet.BjetFlavourTaggingConfiguration import getFlavourTagging - flavourTaggingAlgs = getFlavourTagging( inputJets=InputMakerAlg.InViewJets, inputVertex=prmVtxKey, inputTracks=PTTrackParticles[0] ) - - preAlgs = [] - - bJetBtagSequence = seqAND( "bJetBtagSequence", preAlgs + secondStageAlgs + flavourTaggingAlgs ) - InputMakerAlg.ViewNodeName = "bJetBtagSequence" - - # Sequence - BjetAthSequence = seqAND( "BjetAthSequence_step2",[InputMakerAlg,bJetBtagSequence] ) - + acc_flavourTaggingAlgs, flavourTaggingAlgs = getFlavourTagging( inputJets=InputMakerAlg.InViewJets, inputVertex=prmVtxKey, inputTracks=PTTrackParticles[0] ) + + inViewReco = InViewReco("bJetBtagSequence", viewMaker= InputMakerAlg) + inViewReco.addRecoAlg(secondStageAlgs) + inViewReco.addRecoAlg(flavourTaggingAlgs) + inViewReco.mergeReco(acc_flavourTaggingAlgs) + + Configurable.configurableRun3Behavior=0 + from TrigBjetHypo.TrigBjetHypoConf import TrigBjetBtagHypoAlgMT hypo = TrigBjetBtagHypoAlgMT( "TrigBjetBtagHypoAlg" ) hypo.Tracks = PTTrackParticles[0] from TrigBjetHypo.TrigBjetBtagHypoTool import TrigBjetBtagHypoToolFromDict - return MenuSequence( Sequence = BjetAthSequence, - Maker = InputMakerAlg, + return MenuSequence( Sequence = inViewReco.sequence(), + Maker = inViewReco.inputMaker(), Hypo = hypo, - HypoToolGen = TrigBjetBtagHypoToolFromDict ) + HypoToolGen = TrigBjetBtagHypoToolFromDict) -- GitLab