diff --git a/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx b/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx index ccb83610c5e551aca9cf62d15bf38d043b16c9e8..9a586d49ec74533af417317db9b0350084ce8007 100644 --- a/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx +++ b/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx @@ -2096,14 +2096,14 @@ StatusCode TrigFastTrackFinder::finddEdxTrk(const EventContext& ctx, const Track xAOD::TrigComposite *dEdxTrk = new xAOD::TrigComposite(); dEdxTrk->makePrivateStore(); dEdxTrkContainer->push_back(dEdxTrk); - dEdxTrk->setDetail<int> ("dEdxTrk_id", i_track); - dEdxTrk->setDetail<float>("dEdxTrk_pt", pt); + dEdxTrk->setDetail<int> ("dEdxTrk_id", i_track); + dEdxTrk->setDetail<float>("dEdxTrk_pt", pt); float eta = -log(tan(0.5*theta)); - dEdxTrk->setDetail<float>("dEdxTrk_eta", eta); - dEdxTrk->setDetail<float>("dEdxTrk_phi", phi0); - dEdxTrk->setDetail<float>("dEdxTrk_dedx", dedx); + dEdxTrk->setDetail<float>("dEdxTrk_eta", eta); + dEdxTrk->setDetail<float>("dEdxTrk_phi", phi0); + dEdxTrk->setDetail<float>("dEdxTrk_a0beam", a0beam); + dEdxTrk->setDetail<float>("dEdxTrk_dedx", dedx); dEdxTrk->setDetail<int> ("dEdxTrk_dedx_n_usedhits", n_usedhits); - dEdxTrk->setDetail<float>("dEdxTrk_a0beam", a0beam); dEdxTrk->setDetail<int> ("dEdxTrk_n_hits_innermost", n_hits_innermost); dEdxTrk->setDetail<int> ("dEdxTrk_n_hits_inner", n_hits_inner); dEdxTrk->setDetail<int> ("dEdxTrk_n_hits_pix", n_hits_pix); diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigDisappearingTrackTriggerHypoTool.py b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigDisappearingTrackHypoConfig.py similarity index 93% rename from Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigDisappearingTrackTriggerHypoTool.py rename to Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigDisappearingTrackHypoConfig.py index c315fc5d07351e3346b59f25ead6821404de791a..b2601bf9e3a516c79e1fd8712abda1cfe9a540f3 100644 --- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigDisappearingTrackTriggerHypoTool.py +++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigDisappearingTrackHypoConfig.py @@ -1,22 +1,19 @@ # Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration from AthenaCommon.Logging import logging -log = logging.getLogger("TrigLongLivedParticlesHypo.TrigDisapperingTrackTriggerHypoTool") from AthenaMonitoringKernel.GenericMonitoringTool import GenericMonitoringTool +def createTrigDisappearingTrackHypoAlg(name): + # make the Hypo + from TrigLongLivedParticlesHypo.TrigLongLivedParticlesHypoConf import (TrigDisappearingTrackHypoAlg) + # Setup the hypothesis algorithm + theDisTrkHypo = TrigDisappearingTrackHypoAlg(name) + + from TrigEDMConfig.TriggerEDMRun3 import recordable + theDisTrkHypo.DisTrkBDTSel = recordable("HLT_DisTrkBDTSel") -log = logging.getLogger('TrigDisappearingTrackTriggerHypoTool') - -def TrigDisappearingTrackTriggerHypoToolFromDict( chainDict ): - """ Use menu decoded chain dictionary to configure the tool """ - cparts = [i for i in chainDict['chainParts'] if i['signature']=='UnconventionalTracking'] - thresholds = sum([ [cpart['threshold']]*int(cpart['multiplicity']) for cpart in cparts], []) - - name = chainDict['chainName'] - from AthenaConfiguration.ComponentFactory import CompFactory - tool = CompFactory.TrigDisappearingTrackTriggerHypoTool(name) - + # monioring monTool = GenericMonitoringTool("IM_MonTool"+name) monTool.defineHistogram('category', type='TH1F', path='EXPERT', title="DisTrk Category;DisTrk Category;Nevents", xbins=5, xmin=-0.5, xmax=4.5) # @@ -77,8 +74,25 @@ def TrigDisappearingTrackTriggerHypoToolFromDict( chainDict ): monTool.defineHistogram('pix3_sct1p_refit_chi2ndof',type='TH1F', path='EXPERT', title="Pix3Sct1p refit #chi^{2}/ndof;refit #chi^{2}/ndof;Nevents", xbins=50, xmin=0, xmax=10) monTool.defineHistogram('pix3_sct1p_bdtscore', type='TH1F', path='EXPERT', title="Pix3lSct1p BDT score;BDT score;Nevents", xbins=50, xmin=-1, xmax=1) # - monTool.HistPath = 'disappearingTrackTriggerHypoAlg/'+tool.getName() - tool.MonTool = monTool + monTool.HistPath = 'disappearingTrackHypoAlg' + theDisTrkHypo.MonTool = monTool + + return theDisTrkHypo + + +def TrigDisappearingTrackHypoToolFromDict( chainDict ): + + log = logging.getLogger('TrigDisappearingTrackHypoTool') + + """ Use menu decoded chain dictionary to configure the tool """ + cparts = [i for i in chainDict['chainParts'] if i['signature']=='UnconventionalTracking'] + thresholds = sum([ [cpart['threshold']]*int(cpart['multiplicity']) for cpart in cparts], []) + + name = chainDict['chainName'] + from AthenaConfiguration.ComponentFactory import CompFactory + tool = CompFactory.TrigDisappearingTrackHypoTool(name) + + # set thresholds strThr = "" @@ -122,7 +136,7 @@ def TrigDisappearingTrackTriggerHypoToolFromDict( chainDict ): return tool -def TrigDisappearingTrackTriggerHypoToolFromName( name, conf ): +def TrigDisappearingTrackHypoToolFromName( name, conf ): """ provides configuration of the hypo tool given the chain name The argument will be replaced by "parsed" chain dict. For now it only serves simplest chain HLT_eXYZ. """ @@ -130,11 +144,4 @@ def TrigDisappearingTrackTriggerHypoToolFromName( name, conf ): decodedDict = dictFromChainName(conf) - return TrigDisappearingTrackTriggerHypoToolFromDict( decodedDict ) - - - -if __name__ == "__main__": - tool = TrigDisappearingTrackTriggerHypoToolFromName("HLT_unconvtrk20_dedx_medium_L1XE50", "HLT_unconvtrk20_dedx_medium_L1XE50") - assert tool, "Not configured simple tool" - log.debug("ALL OK") + return TrigDisappearingTrackHypoToolFromDict( decodedDict ) diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigdEdxTrackTriggerHypoTool.py b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigdEdxTrackHypoConfig.py similarity index 76% rename from Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigdEdxTrackTriggerHypoTool.py rename to Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigdEdxTrackHypoConfig.py index dfcd44cbfd7740570f0e19cd158bfb4d9572ccb5..93e6a7e14bf365a3af8ab301334c04be21fa13ca 100644 --- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigdEdxTrackTriggerHypoTool.py +++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigdEdxTrackHypoConfig.py @@ -1,21 +1,20 @@ # Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration from AthenaCommon.Logging import logging -log = logging.getLogger("TrigLongLivedParticlesHypo.TrigdEdxTrackTriggerHypoTool") from AthenaMonitoringKernel.GenericMonitoringTool import GenericMonitoringTool +def createTrigdEdxTrackHypoAlg(name): + # make the Hypo + from TrigLongLivedParticlesHypo.TrigLongLivedParticlesHypoConf import TrigdEdxTrackHypoAlg + + # Setup the hypothesis algorithm + thedEdxTrackHypo = TrigdEdxTrackHypoAlg(name) + + from TrigEDMConfig.TriggerEDMRun3 import recordable + thedEdxTrackHypo.HPtdEdxTrk = recordable("HLT_HPtdEdxTrk") -log = logging.getLogger('TrigdEdxTrackTriggerHypoTool') - -def TrigdEdxTrackTriggerHypoToolFromDict( chainDict ): - """ Use menu decoded chain dictionary to configure the tool """ - cparts = [i for i in chainDict['chainParts'] if i['signature']=='UnconventionalTracking'] - thresholds = sum([ [cpart['threshold']]*int(cpart['multiplicity']) for cpart in cparts], []) - - name = chainDict['chainName'] - from AthenaConfiguration.ComponentFactory import CompFactory - tool = CompFactory.TrigdEdxTrackTriggerHypoTool(name) + # monioring monTool = GenericMonitoringTool("IM_MonTool"+name) monTool.defineHistogram('trackPtGeV', type='TH1F', path='EXPERT', title="Hypo p_{T}^{track};p_{T}^{track} [GeV];Nevents", xbins=50, xmin=0, xmax=100) @@ -24,8 +23,25 @@ def TrigdEdxTrackTriggerHypoToolFromDict( chainDict ): monTool.defineHistogram('trackdEdx', type='TH1F', path='EXPERT', title="Hypo dE/dx (after a0beam cut);dE/dx;Nevents", xbins=50, xmin=0, xmax=10) monTool.defineHistogram('trackNhighdEdxHits', type='TH1F', path='EXPERT', title="Hypo Nr high dE/dx hits (after dEdx cut);N high dE/dx hits;Nevents", xbins=10, xmin=0, xmax=10) - monTool.HistPath = 'dEdxTrackTriggerHypoAlg/'+tool.getName() - tool.MonTool = monTool + monTool.HistPath = 'dEdxTrackHypoAlg' + thedEdxTrackHypo.MonTool = monTool + + return thedEdxTrackHypo + + +def TrigdEdxTrackHypoToolFromDict( chainDict ): + + log = logging.getLogger('TrigdEdxTrackHypoTool') + + """ Use menu decoded chain dictionary to configure the tool """ + cparts = [i for i in chainDict['chainParts'] if i['signature']=='UnconventionalTracking'] + thresholds = sum([ [cpart['threshold']]*int(cpart['multiplicity']) for cpart in cparts], []) + + name = chainDict['chainName'] + from AthenaConfiguration.ComponentFactory import CompFactory + tool = CompFactory.TrigdEdxTrackHypoTool(name) + + # set thresholds strThr = "" @@ -34,7 +50,7 @@ def TrigdEdxTrackTriggerHypoToolFromDict( chainDict ): for THR in thresholds: strThr += str(THR)+", " - log.info("UTT: Threshold Values are: %s",strThr) + log.info("Threshold Values are: %s",strThr) tool.cutTrackPtGeV = thresholds @@ -51,21 +67,21 @@ def TrigdEdxTrackTriggerHypoToolFromDict( chainDict ): trackdEdx.append(1.5) tracka0beam.append(5.0) trackNhighdEdxHits.append(1) - trackHighdEdxDef.append(1.5) + trackHighdEdxDef.append("1p50") elif cpart['IDinfo'] =="tight": log.info("UTT: Tight ID working point is set") trackEta.append(2.5) trackdEdx.append(1.8) tracka0beam.append(1.5) trackNhighdEdxHits.append(2) - trackHighdEdxDef.append(1.8) + trackHighdEdxDef.append("1p80") else: log.info("UTT: Medium ID working point is set") trackEta.append(2.5) trackdEdx.append(1.7) tracka0beam.append(2.5) trackNhighdEdxHits.append(2) - trackHighdEdxDef.append(1.7) + trackHighdEdxDef.append("1p70") tool.cutTrackEta = trackEta tool.cutTrackdEdx = trackdEdx @@ -76,7 +92,7 @@ def TrigdEdxTrackTriggerHypoToolFromDict( chainDict ): return tool -def TrigdEdxTrackTriggerHypoToolFromName( name, conf ): +def TrigdEdxTrackHypoToolFromName( name, conf ): """ provides configuration of the hypo tool given the chain name The argument will be replaced by "parsed" chain dict. For now it only serves simplest chain HLT_eXYZ. """ @@ -84,11 +100,4 @@ def TrigdEdxTrackTriggerHypoToolFromName( name, conf ): decodedDict = dictFromChainName(conf) - return TrigdEdxTrackTriggerHypoToolFromDict( decodedDict ) - - - -if __name__ == "__main__": - tool = TrigdEdxTrackTriggerHypoToolFromName("HLT_unconvtrk20_dedx_medium_L1XE50", "HLT_unconvtrk20_dedx_medium_L1XE50") - assert tool, "Not configured simple tool" - log.debug("ALL OK") + return TrigdEdxTrackHypoToolFromDict( decodedDict ) diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoAlg.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoAlg.cxx new file mode 100644 index 0000000000000000000000000000000000000000..47ef2a61576e7c6b9e33062312322a48b009c535 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoAlg.cxx @@ -0,0 +1,632 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration + + * Trigger Hypo Tool, that is aimed at triggering disappearing tracks + * author Kunihiro Nagano <kunihiro.nagano@cern.ch> +*/ +#include "TrigDisappearingTrackHypoAlg.h" +#include "AthViews/ViewHelper.h" +#include "TrigCompositeUtils/TrigCompositeUtils.h" +#include "GaudiKernel/SystemOfUnits.h" +#include "AthenaMonitoringKernel/Monitored.h" +#include "PathResolver/PathResolver.h" + +using TrigCompositeUtils::createAndStore; +using TrigCompositeUtils::DecisionContainer; +using TrigCompositeUtils::DecisionAuxContainer; +using TrigCompositeUtils::DecisionIDContainer; +using TrigCompositeUtils::decisionIDs; +using TrigCompositeUtils::newDecisionIn; +using TrigCompositeUtils::linkToPrevious; +using TrigCompositeUtils::viewString; +using TrigCompositeUtils::featureString; +using TrigCompositeUtils::hypoAlgNodeName; +using TrigCompositeUtils::findLink; +using TrigCompositeUtils::LinkInfo; +using TrigCompositeUtils::Decision; +using TrigCompositeUtils::allFailed; + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +TrigDisappearingTrackHypoAlg::TrigDisappearingTrackHypoAlg( const std::string& name, + ISvcLocator* pSvcLocator ) : + ::HypoBase( name, pSvcLocator ) {} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +StatusCode TrigDisappearingTrackHypoAlg::initialize() +{ + CHECK( m_hypoTools.retrieve() ); + CHECK( m_DisTrkCandKey.initialize() ); + CHECK( m_DisTrkBDTSelKey.initialize()); + + if ( !m_monTool.empty() ) CHECK( m_monTool.retrieve() ); + + for (size_t slot = 0; slot < SG::getNSlots(); ++slot) { + EventContext dummyContext(/*dummyEventNumber*/0, slot); + + m_tmva_pix4l_sct0_reader.get(dummyContext)->reset( new TMVA::Reader( "!Color:!Silent" )); + m_tmva_pix4l_sct1p_reader.get(dummyContext)->reset(new TMVA::Reader( "!Color:!Silent" )); + m_tmva_pix3l_sct0_reader.get(dummyContext)->reset( new TMVA::Reader( "!Color:!Silent" )); + m_tmva_pix3l_sct1p_reader.get(dummyContext)->reset(new TMVA::Reader( "!Color:!Silent" )); + + // --- declare variables to the reader + // pix4l_sct0 + (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("pt", m_tmva_pix4l_sct0_pt.get(dummyContext)); + (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("z0", m_tmva_pix4l_sct0_z0.get(dummyContext)); + (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("d0", m_tmva_pix4l_sct0_d0.get(dummyContext)); + (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("trkiso3_dr01", m_tmva_pix4l_sct0_trkiso3_dr01.get(dummyContext)); + (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("trkiso3_dr0201", m_tmva_pix4l_sct0_trkiso3_dr0201.get(dummyContext)); + (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("chi2ndof", m_tmva_pix4l_sct0_chi2ndof.get(dummyContext)); + (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("chi2ndof_pix", m_tmva_pix4l_sct0_chi2ndof_pix.get(dummyContext)); + (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("refit_pt", m_tmva_pix4l_sct0_refit_pt.get(dummyContext)); + (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("n_pix", m_tmva_pix4l_sct0_n_pix.get(dummyContext)); + (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("refit_ptratio", m_tmva_pix4l_sct0_refit_ptratio.get(dummyContext)); + (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("refit_chi2ndof", m_tmva_pix4l_sct0_refit_chi2ndof.get(dummyContext)); + (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("n_bl", m_tmva_pix4l_sct0_n_bl.get(dummyContext)); + + // pix4l_sct1p + (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("pt", m_tmva_pix4l_sct1p_pt.get(dummyContext)); + (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("refit_pt", m_tmva_pix4l_sct1p_refit_pt.get(dummyContext)); + (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("refit_z0", m_tmva_pix4l_sct1p_refit_z0.get(dummyContext)); + (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("refit_d0", m_tmva_pix4l_sct1p_refit_d0.get(dummyContext)); + (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("n_sct", m_tmva_pix4l_sct1p_n_sct.get(dummyContext)); + (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("refit_ptratio", m_tmva_pix4l_sct1p_refit_ptratio.get(dummyContext)); + (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("refit_chi2ndof_ratio", m_tmva_pix4l_sct1p_refit_chi2ndof_ratio.get(dummyContext)); + (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("trkiso3_dr01", m_tmva_pix4l_sct1p_trkiso3_dr01.get(dummyContext)); + (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("trkiso3_dr0201", m_tmva_pix4l_sct1p_trkiso3_dr0201.get(dummyContext)); + (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("is_fail", m_tmva_pix4l_sct1p_is_fail.get(dummyContext)); + (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("chi2ndof_pix", m_tmva_pix4l_sct1p_chi2ndof_pix.get(dummyContext)); + (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("n_pix", m_tmva_pix4l_sct1p_n_pix.get(dummyContext)); + + // pix3l_sct0 + (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("pt", m_tmva_pix3l_sct0_pt.get(dummyContext)); + (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("z0", m_tmva_pix3l_sct0_z0.get(dummyContext)); + (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("d0", m_tmva_pix3l_sct0_d0.get(dummyContext)); + (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("chi2ndof", m_tmva_pix3l_sct0_chi2ndof.get(dummyContext)); + (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("chi2ndof_pix", m_tmva_pix3l_sct0_chi2ndof_pix.get(dummyContext)); + (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("trkiso3_dr01", m_tmva_pix3l_sct0_trkiso3_dr01.get(dummyContext)); + (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("trkiso3_dr0201", m_tmva_pix3l_sct0_trkiso3_dr0201.get(dummyContext)); + (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("refit_pt", m_tmva_pix3l_sct0_refit_pt.get(dummyContext)); + (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("refit_z0", m_tmva_pix3l_sct0_refit_z0.get(dummyContext)); + (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("refit_d0", m_tmva_pix3l_sct0_refit_d0.get(dummyContext)); + (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("n_pix", m_tmva_pix4l_sct0_n_pix.get(dummyContext)); + (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("n_bl", m_tmva_pix3l_sct0_n_bl.get(dummyContext)); + + // pix3l_sct1p + (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("pt", m_tmva_pix3l_sct1p_pt.get(dummyContext)); + (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("z0", m_tmva_pix3l_sct1p_z0.get(dummyContext)); + (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("d0", m_tmva_pix3l_sct1p_d0.get(dummyContext)); + (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("refit_pt", m_tmva_pix3l_sct1p_refit_pt.get(dummyContext)); + (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("refit_z0", m_tmva_pix3l_sct1p_refit_z0.get(dummyContext)); + (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("refit_d0", m_tmva_pix3l_sct1p_refit_d0.get(dummyContext)); + (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("n_pix", m_tmva_pix3l_sct1p_n_pix.get(dummyContext)); + (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("n_sct", m_tmva_pix3l_sct1p_n_sct.get(dummyContext)); + (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("refit_ptratio", m_tmva_pix3l_sct1p_refit_ptratio.get(dummyContext)); + (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("is_fail", m_tmva_pix3l_sct1p_is_fail.get(dummyContext)); + (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("n_bl", m_tmva_pix3l_sct1p_n_bl.get(dummyContext)); + (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("chi2ndof", m_tmva_pix3l_sct1p_chi2ndof.get(dummyContext)); + (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("trkiso3_dr01", m_tmva_pix3l_sct1p_trkiso3_dr01.get(dummyContext)); + (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("trkiso3_dr0201", m_tmva_pix3l_sct1p_trkiso3_dr0201.get(dummyContext)); + (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("refit_chi2ndof", m_tmva_pix3l_sct1p_refit_chi2ndof.get(dummyContext)); + + // --- Book the MVA methods + std::string file; + std::string weightfile; + std::string tuningVer; + const std::string methodName = "BDT method"; + // + tuningVer = "v21a"; + file = "TrigDisappearingTrackTriggerHypo/pix4l_sct0.BDT.weights." + tuningVer + ".xml"; + weightfile = PathResolver::find_calib_file(file.c_str()); + ATH_MSG_INFO( "opening weightfile for Pix4l_SCT0 = " << weightfile ); + (**m_tmva_pix4l_sct0_reader.get(dummyContext)).BookMVA(methodName, weightfile); + // + tuningVer = "v21b"; // "b" only for this category + file = "TrigDisappearingTrackTriggerHypo/pix4l_sct1p.BDT.weights." + tuningVer + ".xml"; + weightfile = PathResolver::find_calib_file(file.c_str()); + ATH_MSG_INFO( "opening weightfile for Pix4l_SCT1p = " << weightfile ); + (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).BookMVA(methodName, weightfile); + // + tuningVer = "v21a"; + file = "TrigDisappearingTrackTriggerHypo/pix3l_sct0.BDT.weights." + tuningVer + ".xml"; + weightfile = PathResolver::find_calib_file(file.c_str()); + ATH_MSG_INFO( "opening weightfile for Pix3l_SCT0 = " << weightfile ); + (**m_tmva_pix3l_sct0_reader.get(dummyContext)).BookMVA(methodName, weightfile); + // + tuningVer = "v21a"; + file = "TrigDisappearingTrackTriggerHypo/pix3l_sct1p.BDT.weights." + tuningVer + ".xml"; + weightfile = PathResolver::find_calib_file(file.c_str()); + ATH_MSG_INFO( "opening weightfile for Pix3l_SCT1p = " << weightfile ); + (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).BookMVA(methodName, weightfile); + } + + return StatusCode::SUCCESS; +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +StatusCode TrigDisappearingTrackHypoAlg::execute( const EventContext& context ) const +{ + // previous decisions + ATH_MSG_DEBUG( "Retrieving pervious decision: \"" << decisionInput().key() << "\"" ); + auto previousDecisionsHandle = SG::makeHandle( decisionInput(), context ); + ATH_CHECK( previousDecisionsHandle.isValid() ); + + ATH_MSG_DEBUG( "Running with " << previousDecisionsHandle->size() << " previous decisions" ); + if( previousDecisionsHandle->size()!=1 ) { + ATH_MSG_ERROR( "Previous decision handle size is not 1. It is" << previousDecisionsHandle->size() ); + return StatusCode::FAILURE; + } + const Decision * previousDecision = previousDecisionsHandle->at(0); + + TrigCompositeUtils::DecisionIDContainer previousDecisionIDs; + TrigCompositeUtils::decisionIDs(previousDecision, previousDecisionIDs); + ATH_MSG_VERBOSE( "IDs of active legs:" ); + for(auto decisionID: previousDecisionIDs) { ATH_MSG_VERBOSE( " " << decisionID ); } + + // new output decisions + ATH_MSG_DEBUG( "Creating new output decision handle" ); + SG::WriteHandle<DecisionContainer> outputHandle = createAndStore(decisionOutput(), context ); + auto outputDecisions = outputHandle.ptr(); + + // input disappearing track objects + auto DisTrkCandHandle = SG::makeHandle(m_DisTrkCandKey, context ); + ATH_CHECK( DisTrkCandHandle.isValid() ); + ATH_MSG_DEBUG( "DisTrkCand handle size: " << DisTrkCandHandle->size() ); + + const xAOD::TrigCompositeContainer * disTrkCandContainer = DisTrkCandHandle.get(); + if( disTrkCandContainer == nullptr ) { + ATH_MSG_ERROR( "ERROR Cannot get DisappearingTrks container" ); + return StatusCode::FAILURE; + } + + // output EDM object + auto DisTrkBDTSelContainer = std::make_unique<xAOD::TrigCompositeContainer>(); + auto DisTrkBDTSelContainerAux = std::make_unique<xAOD::TrigCompositeAuxContainer>(); + DisTrkBDTSelContainer->setStore(DisTrkBDTSelContainerAux.get()); + + xAOD::TrigCompositeContainer* disTrkContainer = DisTrkBDTSelContainer.get(); + + // Prepare inputs to HypoTool + ATH_CHECK( createCandidates(context, disTrkCandContainer, disTrkContainer) ); + + std::vector<TrigDisappearingTrackHypoTool::DisTrkHypoInfo> disTrkHypoInputs; + + for ( auto distrk : *disTrkContainer ) { + Decision* newDecision = TrigCompositeUtils::newDecisionIn( outputDecisions, previousDecision, TrigCompositeUtils::hypoAlgNodeName(), context); + + ElementLink<xAOD::TrigCompositeContainer> distrkEL = ElementLink<xAOD::TrigCompositeContainer>(*outputHandle, distrk->index()); + ATH_CHECK( distrkEL.isValid() ); + + ATH_CHECK( newDecision->setObjectLink<xAOD::TrigCompositeContainer>(TrigCompositeUtils::featureString(), distrkEL) ); + + TrigDisappearingTrackHypoTool::DisTrkHypoInfo hypoInfo{ newDecision, distrk, previousDecisionIDs }; + disTrkHypoInputs.push_back( hypoInfo ); + } + + // Loop over all hypoToolinputs and get their decisions + for ( auto & tool: m_hypoTools ) { + ATH_MSG_VERBOSE( "+++++ Now computing decision for " << tool->name() ); + ATH_CHECK( tool->decide( disTrkHypoInputs ) ); + } + + DecisionContainer::iterator it = outputDecisions->begin(); + while(it != outputDecisions->end()) { + ATH_MSG_VERBOSE( "+++++ outputDecision: " << *it << " +++++" ); + if ( allFailed( *it ) ) { + ATH_MSG_VERBOSE( "---> all failed, erasing" ); + it = outputDecisions->erase(it); + } else { + ATH_MSG_VERBOSE( "---> not all failed" ); + ++it; + } + } + + // record + SG::WriteHandle<xAOD::TrigCompositeContainer> DisTrkBDTSelHandle(m_DisTrkBDTSelKey, context); + ATH_CHECK( DisTrkBDTSelHandle.record( std::move( DisTrkBDTSelContainer ), std::move( DisTrkBDTSelContainerAux ) ) ); + ATH_MSG_VERBOSE( "recorded DisTrkBDTSel object to SG" ); + + // + ATH_CHECK( hypoBaseOutputProcessing(outputHandle) ); + + // + return StatusCode::SUCCESS; +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +StatusCode TrigDisappearingTrackHypoAlg::createCandidates( const EventContext& context, const xAOD::TrigCompositeContainer* disTrkCandContainer, + xAOD::TrigCompositeContainer* disTrkBDTSelContainer) const +{ + // monitoring + std::vector<int> mnt_category; + auto mon_category = Monitored::Collection("category", mnt_category); + auto monDisTrk = Monitored::Group(m_monTool, mon_category); + + std::vector<float> mnt_cat1_pt; + std::vector<float> mnt_cat1_z0; + std::vector<float> mnt_cat1_d0; + std::vector<float> mnt_cat1_iso01; + std::vector<float> mnt_cat1_iso0201; + std::vector<float> mnt_cat1_chi2ndof; + std::vector<float> mnt_cat1_chi2ndof_pix; + std::vector<float> mnt_cat1_refit_pt; + std::vector<int> mnt_cat1_n_pix; + std::vector<float> mnt_cat1_refit_ptratio; + std::vector<float> mnt_cat1_refit_chi2ndof; + std::vector<int> mnt_cat1_n_bl; + std::vector<float> mnt_cat1_bdtscore; + auto mon_cat1_pt = Monitored::Collection("pix4_sct0_pt", mnt_cat1_pt); + auto mon_cat1_z0 = Monitored::Collection("pix4_sct0_z0", mnt_cat1_z0); + auto mon_cat1_d0 = Monitored::Collection("pix4_sct0_d0", mnt_cat1_d0); + auto mon_cat1_iso01 = Monitored::Collection("pix4_sct0_iso01", mnt_cat1_iso01); + auto mon_cat1_iso0201 = Monitored::Collection("pix4_sct0_iso0201", mnt_cat1_iso0201); + auto mon_cat1_chi2ndof = Monitored::Collection("pix4_sct0_chi2ndof", mnt_cat1_chi2ndof); + auto mon_cat1_chi2ndof_pix = Monitored::Collection("pix4_sct0_chi2ndof_pix", mnt_cat1_chi2ndof_pix); + auto mon_cat1_refit_pt = Monitored::Collection("pix4_sct0_refit_pt", mnt_cat1_refit_pt); + auto mon_cat1_n_pix = Monitored::Collection("pix4_sct0_n_pix", mnt_cat1_n_pix); + auto mon_cat1_refit_ptratio = Monitored::Collection("pix4_sct0_refit_ptratio", mnt_cat1_refit_ptratio); + auto mon_cat1_refit_chi2ndof = Monitored::Collection("pix4_sct0_refit_chi2ndof", mnt_cat1_refit_chi2ndof); + auto mon_cat1_n_bl = Monitored::Collection("pix4_sct0_n_bl", mnt_cat1_n_bl); + auto mon_cat1_bdtscore = Monitored::Collection("pix4_sct0_bdtscore", mnt_cat1_bdtscore); + auto monDisTrkCat1 = Monitored::Group(m_monTool, mon_cat1_pt, mon_cat1_z0, mon_cat1_d0, mon_cat1_iso01, mon_cat1_iso0201, mon_cat1_chi2ndof, + mon_cat1_chi2ndof_pix, mon_cat1_refit_pt, mon_cat1_n_pix, mon_cat1_refit_ptratio, + mon_cat1_refit_chi2ndof, mon_cat1_n_bl, mon_cat1_bdtscore); + // + std::vector<float> mnt_cat2_pt; + std::vector<float> mnt_cat2_refit_pt; + std::vector<float> mnt_cat2_refit_z0; + std::vector<float> mnt_cat2_refit_d0; + std::vector<int> mnt_cat2_n_sct; + std::vector<float> mnt_cat2_refit_ptratio; + std::vector<float> mnt_cat2_refit_chi2ndof_ratio; + std::vector<float> mnt_cat2_iso01; + std::vector<float> mnt_cat2_iso0201; + std::vector<float> mnt_cat2_chi2ndof_pix; + std::vector<int> mnt_cat2_n_pix; + std::vector<float> mnt_cat2_bdtscore; + auto mon_cat2_pt = Monitored::Collection("pix4_sct1p_pt", mnt_cat2_pt); + auto mon_cat2_refit_pt = Monitored::Collection("pix4_sct1p_refit_pt", mnt_cat2_refit_pt); + auto mon_cat2_refit_z0 = Monitored::Collection("pix4_sct1p_refit_z0", mnt_cat2_refit_z0); + auto mon_cat2_refit_d0 = Monitored::Collection("pix4_sct1p_refit_d0", mnt_cat2_refit_d0); + auto mon_cat2_n_sct = Monitored::Collection("pix4_sct1p_n_sct", mnt_cat2_n_sct); + auto mon_cat2_refit_ptratio = Monitored::Collection("pix4_sct1p_refit_ptratio", mnt_cat2_refit_ptratio); + auto mon_cat2_refit_chi2ndof_ratio = Monitored::Collection("pix4_sct1p_refit_chi2ndof_ratio", mnt_cat2_refit_chi2ndof_ratio); + auto mon_cat2_iso01 = Monitored::Collection("pix4_sct1p_iso01", mnt_cat2_iso01); + auto mon_cat2_iso0201 = Monitored::Collection("pix4_sct1p_iso0201", mnt_cat2_iso0201); + auto mon_cat2_chi2ndof_pix = Monitored::Collection("pix4_sct1p_chi2ndof_pix", mnt_cat2_chi2ndof_pix); + auto mon_cat2_n_pix = Monitored::Collection("pix4_sct1p_n_pix", mnt_cat2_n_pix); + auto mon_cat2_bdtscore = Monitored::Collection("pix4_sct1p_bdtscore", mnt_cat2_bdtscore); + auto monDisTrkCat2 = Monitored::Group(m_monTool, mon_cat2_pt, mon_cat2_refit_pt, mon_cat2_refit_z0, mon_cat2_refit_d0, mon_cat2_n_sct, + mon_cat2_refit_ptratio, mon_cat2_refit_chi2ndof_ratio, mon_cat2_iso01, mon_cat2_iso0201, + mon_cat2_chi2ndof_pix, mon_cat2_n_pix, mon_cat2_bdtscore); + // + std::vector<float> mnt_cat3_pt; + std::vector<float> mnt_cat3_z0; + std::vector<float> mnt_cat3_d0; + std::vector<float> mnt_cat3_chi2ndof; + std::vector<float> mnt_cat3_chi2ndof_pix; + std::vector<float> mnt_cat3_iso01; + std::vector<float> mnt_cat3_iso0201; + std::vector<float> mnt_cat3_refit_pt; + std::vector<float> mnt_cat3_refit_z0; + std::vector<float> mnt_cat3_refit_d0; + std::vector<int> mnt_cat3_n_pix; + std::vector<int> mnt_cat3_n_bl; + std::vector<float> mnt_cat3_bdtscore; + auto mon_cat3_pt = Monitored::Collection("pix3_sct0_pt", mnt_cat3_pt); + auto mon_cat3_z0 = Monitored::Collection("pix3_sct0_z0", mnt_cat3_z0); + auto mon_cat3_d0 = Monitored::Collection("pix3_sct0_d0", mnt_cat3_d0); + auto mon_cat3_chi2ndof = Monitored::Collection("pix3_sct0_chi2ndof", mnt_cat3_chi2ndof); + auto mon_cat3_chi2ndof_pix = Monitored::Collection("pix3_sct0_chi2ndof_pix", mnt_cat3_chi2ndof_pix); + auto mon_cat3_iso01 = Monitored::Collection("pix3_sct0_iso01", mnt_cat3_iso01); + auto mon_cat3_iso0201 = Monitored::Collection("pix3_sct0_iso0201", mnt_cat3_iso0201); + auto mon_cat3_refit_pt = Monitored::Collection("pix3_sct0_refit_pt", mnt_cat3_refit_pt); + auto mon_cat3_refit_z0 = Monitored::Collection("pix3_sct0_refit_z0", mnt_cat3_refit_z0); + auto mon_cat3_refit_d0 = Monitored::Collection("pix3_sct0_refit_d0", mnt_cat3_refit_d0); + auto mon_cat3_n_pix = Monitored::Collection("pix3_sct0_n_pix", mnt_cat3_n_pix); + auto mon_cat3_n_bl = Monitored::Collection("pix3_sct0_n_bl", mnt_cat3_n_bl); + auto mon_cat3_bdtscore = Monitored::Collection("pix3_sct0_bdtscore", mnt_cat3_bdtscore); + auto monDisTrkCat3 = Monitored::Group(m_monTool, mon_cat3_pt, mon_cat3_z0, mon_cat3_d0, mon_cat3_chi2ndof, mon_cat3_chi2ndof_pix, + mon_cat3_iso01, mon_cat3_iso0201, mon_cat3_refit_pt, mon_cat3_refit_z0, mon_cat3_refit_d0, + mon_cat3_n_pix, mon_cat3_n_bl, mon_cat3_bdtscore); + // + std::vector<float> mnt_cat4_pt; + std::vector<float> mnt_cat4_z0; + std::vector<float> mnt_cat4_d0; + std::vector<float> mnt_cat4_refit_pt; + std::vector<float> mnt_cat4_refit_z0; + std::vector<float> mnt_cat4_refit_d0; + std::vector<int> mnt_cat4_n_pix; + std::vector<int> mnt_cat4_n_sct; + std::vector<float> mnt_cat4_refit_ptratio; + std::vector<int> mnt_cat4_n_bl; + std::vector<float> mnt_cat4_chi2ndof; + std::vector<float> mnt_cat4_iso01; + std::vector<float> mnt_cat4_iso0201; + std::vector<float> mnt_cat4_refit_chi2ndof; + std::vector<float> mnt_cat4_bdtscore; + auto mon_cat4_pt = Monitored::Collection("pix3_sct1p_pt", mnt_cat4_pt); + auto mon_cat4_z0 = Monitored::Collection("pix3_sct1p_z0", mnt_cat4_z0); + auto mon_cat4_d0 = Monitored::Collection("pix3_sct1p_d0", mnt_cat4_d0); + auto mon_cat4_refit_pt = Monitored::Collection("pix3_sct1p_refit_pt", mnt_cat4_refit_pt); + auto mon_cat4_refit_z0 = Monitored::Collection("pix3_sct1p_refit_z0", mnt_cat4_refit_z0); + auto mon_cat4_refit_d0 = Monitored::Collection("pix3_sct1p_refit_d0", mnt_cat4_refit_d0); + auto mon_cat4_n_pix = Monitored::Collection("pix3_sct1p_n_pix", mnt_cat4_n_pix); + auto mon_cat4_n_sct = Monitored::Collection("pix3_sct1p_n_sct", mnt_cat4_n_sct); + auto mon_cat4_refit_ptratio = Monitored::Collection("pix3_sct1p_refit_ptratio", mnt_cat4_refit_ptratio); + auto mon_cat4_n_bl = Monitored::Collection("pix3_sct1p_n_bl", mnt_cat4_n_bl); + auto mon_cat4_chi2ndof = Monitored::Collection("pix3_sct1p_chi2ndof", mnt_cat4_chi2ndof); + auto mon_cat4_iso01 = Monitored::Collection("pix3_sct1p_iso01", mnt_cat4_iso01); + auto mon_cat4_iso0201 = Monitored::Collection("pix3_sct1p_iso0201", mnt_cat4_iso0201); + auto mon_cat4_refit_chi2ndof = Monitored::Collection("pix3_sct1p_refit_chi2ndof", mnt_cat4_refit_chi2ndof); + auto mon_cat4_bdtscore = Monitored::Collection("pix3_sct1p_bdtscore", mnt_cat4_bdtscore); + auto monDisTrkCat4 = Monitored::Group(m_monTool, mon_cat4_pt, mon_cat4_z0, mon_cat4_d0, mon_cat4_refit_pt, mon_cat4_refit_z0, mon_cat4_refit_d0, + mon_cat4_n_pix, mon_cat4_n_sct, mon_cat4_refit_ptratio, mon_cat4_n_bl, mon_cat4_chi2ndof, + mon_cat4_iso01, mon_cat4_iso0201, mon_cat4_refit_chi2ndof, mon_cat4_bdtscore); + + // + + const std::string prefixIn = "disTrkCand"; + const std::string prefixOut = "disTrk"; + + unsigned int i_cand=0; + + for ( const xAOD::TrigComposite* cand : *disTrkCandContainer ) { + + ATH_MSG_VERBOSE("===== i_cand: " << i_cand++ << " =====" ); + + // category + int category = cand->getDetail<int>(prefixIn+"_category"); + if( category<=0 || category>=5 ) { + ATH_MSG_VERBOSE("category is out of range = " << category); + continue; + } + mnt_category.push_back(category); + + // get values + float pt = cand->getDetail<float>(prefixIn+"_pt"); + float refit_pt = cand->getDetail<float>(prefixIn+"_refit_pt"); + pt /= 1000.0; + refit_pt /= 1000.0; + int is_fail = cand->getDetail<int> (prefixIn+"_is_fail"); + float d0_wrtVtx = cand->getDetail<float>(prefixIn+"_d0_wrtVtx"); + float z0_wrtVtx = cand->getDetail<float>(prefixIn+"_z0_wrtVtx"); + float chi2 = cand->getDetail<float>(prefixIn+"_chi2"); + float ndof = cand->getDetail<float>(prefixIn+"_ndof"); + float chi2ndof = ( std::abs(ndof) > 1e-4 ) ? chi2 / ndof : 20; + int n_hits_pix = cand->getDetail<int> (prefixIn+"_n_hits_pix"); + int n_hits_sct = cand->getDetail<int> (prefixIn+"_n_hits_sct"); + int n_hits_bl = cand->getDetail<int> (prefixIn+"_n_hits_innermost"); + float iso3_dr01 = cand->getDetail<float>(prefixIn+"_iso3_dr01"); + iso3_dr01 /= 1000; + float iso3_dr02 = cand->getDetail<float>(prefixIn+"_iso3_dr02"); + iso3_dr02 /= 1000; + float refit_ptratio = ( std::abs(pt) > 1e-4 ) ? refit_pt / pt : 0; + float refit_d0_wrtVtx = cand->getDetail<float>(prefixIn+"_refit_d0_wrtVtx"); + float refit_z0_wrtVtx = cand->getDetail<float>(prefixIn+"_refit_z0_wrtVtx"); + float refit_chi2 = cand->getDetail<float>(prefixIn+"_refit_chi2"); + float refit_ndof = cand->getDetail<float>(prefixIn+"_refit_ndof"); + float refit_chi2ndof = ( std::abs(refit_ndof) > 1e-4 ) ? refit_chi2 / refit_ndof : 20; + float refit_chi2ndof_ratio = (std::abs(chi2ndof) > 1e-4 ) ? refit_chi2ndof / chi2ndof : 0; + float chi2_pix=0; float ndof_pix=0; + chi2_pix += cand->getDetail<float>(prefixIn+"_chi2sum_br_ibl"); + chi2_pix += cand->getDetail<float>(prefixIn+"_chi2sum_br_pix1"); + chi2_pix += cand->getDetail<float>(prefixIn+"_chi2sum_br_pix2"); + chi2_pix += cand->getDetail<float>(prefixIn+"_chi2sum_br_pix3"); + ndof_pix += cand->getDetail<float>(prefixIn+"_ndofsum_br_ibl"); + ndof_pix += cand->getDetail<float>(prefixIn+"_ndofsum_br_pix1"); + ndof_pix += cand->getDetail<float>(prefixIn+"_ndofsum_br_pix2"); + ndof_pix += cand->getDetail<float>(prefixIn+"_ndofsum_br_pix3"); + float chi2ndof_pix = ( std::abs(ndof_pix) > 1e-4 ) ? chi2_pix / ndof_pix : 0; + + // BDT score + float bdt_score = 0.0; + if( category==1 ) { + bdt_score = bdt_eval_pix4l_sct0(context, pt, z0_wrtVtx, d0_wrtVtx, iso3_dr01, iso3_dr02-iso3_dr01, chi2ndof, chi2ndof_pix, + refit_pt, n_hits_pix, refit_ptratio, refit_chi2ndof, n_hits_bl); + mnt_cat1_pt.push_back(pt); + mnt_cat1_z0.push_back(z0_wrtVtx); + mnt_cat1_d0.push_back(d0_wrtVtx); + mnt_cat1_iso01.push_back(iso3_dr01); + mnt_cat1_iso0201.push_back(iso3_dr02-iso3_dr01); + mnt_cat1_chi2ndof.push_back(chi2ndof); + mnt_cat1_chi2ndof_pix.push_back(chi2ndof_pix); + mnt_cat1_refit_pt.push_back(refit_pt); + mnt_cat1_n_pix.push_back(n_hits_pix); + mnt_cat1_refit_ptratio.push_back(refit_ptratio); + mnt_cat1_refit_chi2ndof.push_back(refit_chi2ndof); + mnt_cat1_n_bl.push_back(n_hits_bl); + mnt_cat1_bdtscore.push_back(bdt_score); + } + else if( category==2 ) { + bdt_score = bdt_eval_pix4l_sct1p(context, pt, refit_pt, refit_z0_wrtVtx, refit_d0_wrtVtx, n_hits_sct, refit_ptratio, + refit_chi2ndof_ratio, iso3_dr01, iso3_dr02-iso3_dr01, is_fail, chi2ndof_pix, n_hits_pix); + mnt_cat2_pt.push_back(pt); + mnt_cat2_refit_pt.push_back(refit_pt); + mnt_cat2_refit_z0.push_back(refit_z0_wrtVtx); + mnt_cat2_refit_d0.push_back(refit_d0_wrtVtx); + mnt_cat2_n_sct.push_back(n_hits_sct); + mnt_cat2_refit_ptratio.push_back(refit_ptratio); + mnt_cat2_refit_chi2ndof_ratio.push_back(refit_chi2ndof_ratio); + mnt_cat2_iso01.push_back(iso3_dr01); + mnt_cat2_iso0201.push_back(iso3_dr02-iso3_dr01); + mnt_cat2_chi2ndof_pix.push_back(chi2ndof_pix); + mnt_cat2_n_pix.push_back(n_hits_pix); + mnt_cat2_bdtscore.push_back(bdt_score); + } + else if( category==3 ) { + bdt_score = bdt_eval_pix3l_sct0(context, pt, z0_wrtVtx, d0_wrtVtx, chi2ndof, chi2ndof_pix, iso3_dr01, iso3_dr02-iso3_dr01, + refit_pt, refit_z0_wrtVtx, refit_d0_wrtVtx, n_hits_pix, n_hits_bl); + mnt_cat3_pt.push_back(pt); + mnt_cat3_z0.push_back(z0_wrtVtx); + mnt_cat3_d0.push_back(d0_wrtVtx); + mnt_cat3_chi2ndof.push_back(chi2ndof); + mnt_cat3_chi2ndof_pix.push_back(chi2ndof_pix); + mnt_cat3_iso01.push_back(iso3_dr01); + mnt_cat3_iso0201.push_back(iso3_dr02-iso3_dr01); + mnt_cat3_refit_pt.push_back(refit_pt); + mnt_cat3_refit_z0.push_back(refit_z0_wrtVtx); + mnt_cat3_refit_d0.push_back(refit_d0_wrtVtx); + mnt_cat3_n_pix.push_back(n_hits_pix); + mnt_cat3_n_bl.push_back(n_hits_bl); + mnt_cat3_bdtscore.push_back(bdt_score); + } + else if( category==4 ) { + bdt_score = bdt_eval_pix3l_sct1p(context, pt, z0_wrtVtx, d0_wrtVtx, refit_pt, refit_z0_wrtVtx, refit_d0_wrtVtx, n_hits_pix, n_hits_sct, + refit_ptratio, is_fail, n_hits_bl, chi2ndof, iso3_dr01, iso3_dr02-iso3_dr01, refit_chi2ndof); + mnt_cat4_pt.push_back(pt); + mnt_cat4_z0.push_back(z0_wrtVtx); + mnt_cat4_d0.push_back(d0_wrtVtx); + mnt_cat4_refit_pt.push_back(refit_pt); + mnt_cat4_refit_z0.push_back(refit_z0_wrtVtx); + mnt_cat4_refit_d0.push_back(refit_d0_wrtVtx); + mnt_cat4_n_pix.push_back(n_hits_pix); + mnt_cat4_n_sct.push_back(n_hits_sct); + mnt_cat4_refit_ptratio.push_back(refit_ptratio); + mnt_cat4_n_bl.push_back(n_hits_bl); + mnt_cat4_chi2ndof.push_back(chi2ndof); + mnt_cat4_iso01.push_back(iso3_dr01); + mnt_cat4_iso0201.push_back(iso3_dr02-iso3_dr01); + mnt_cat4_refit_chi2ndof.push_back(refit_chi2ndof); + mnt_cat4_bdtscore.push_back(bdt_score); + } + ATH_MSG_VERBOSE("BDT score = " << bdt_score); + + // create EDM object + xAOD::TrigComposite *distrk = new xAOD::TrigComposite(); + distrk->makePrivateStore(); + disTrkBDTSelContainer->push_back(distrk); + + distrk->setDetail<int> (prefixOut+"_category", category); + distrk->setDetail<float>(prefixOut+"_pt", pt*1000.0); + float eta = cand->getDetail<float>(prefixIn+"_eta"); + float phi = cand->getDetail<float>(prefixIn+"_phi"); + distrk->setDetail<float>(prefixOut+"_eta", eta); + distrk->setDetail<float>(prefixOut+"_phi", phi); + distrk->setDetail<float>(prefixOut+"_refit_pt", refit_pt*1000.0); + distrk->setDetail<int> (prefixOut+"_is_fail", is_fail); + distrk->setDetail<float>(prefixOut+"_d0_wrtVtx", d0_wrtVtx); + distrk->setDetail<float>(prefixOut+"_z0_wrtVtx", z0_wrtVtx); + distrk->setDetail<float>(prefixOut+"_chi2", chi2); + distrk->setDetail<float>(prefixOut+"_ndof", ndof); + distrk->setDetail<int> (prefixOut+"_n_hits_pix", n_hits_pix); + distrk->setDetail<int> (prefixOut+"_n_hits_sct", n_hits_sct); + distrk->setDetail<int> (prefixOut+"_n_hits_innermost", n_hits_bl); + distrk->setDetail<float>(prefixOut+"_iso3_dr01", iso3_dr01*1000.0); + distrk->setDetail<float>(prefixOut+"_iso3_dr02", iso3_dr02*1000.0); + distrk->setDetail<float>(prefixOut+"_refit_d0_wrtVtx", refit_d0_wrtVtx); + distrk->setDetail<float>(prefixOut+"_refit_z0_wrtVtx", refit_z0_wrtVtx); + distrk->setDetail<float>(prefixOut+"_refit_chi2", refit_chi2); + distrk->setDetail<float>(prefixOut+"_refit_ndof", refit_ndof); + distrk->setDetail<float>(prefixOut+"_chi2ndof_pix", chi2ndof_pix); + distrk->setDetail<float>(prefixOut+"_bdtscore", bdt_score); + + ATH_MSG_VERBOSE("Created a new entry EDM" ); + } + + return StatusCode::SUCCESS; +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +inline float TrigDisappearingTrackHypoAlg::BDTinput(float var) const { return ( std::abs(var) < 1e-5 ) ? 1e-5 : var; } + +float TrigDisappearingTrackHypoAlg::bdt_eval_pix4l_sct0 +(const EventContext& context, + float pt, float z0, float d0, float trkiso3_dr01, float trkiso3_dr0201, float chi2ndof, float chi2ndof_pix, + float refit_pt, int n_pix, float refit_ptratio, float refit_chi2ndof, int n_bl) const +{ + *m_tmva_pix4l_sct0_pt.get(context) = BDTinput(pt); + *m_tmva_pix4l_sct0_z0.get(context) = BDTinput(z0); + *m_tmva_pix4l_sct0_d0.get(context) = BDTinput(d0); + *m_tmva_pix4l_sct0_trkiso3_dr01.get(context) = BDTinput(trkiso3_dr01); + *m_tmva_pix4l_sct0_trkiso3_dr0201.get(context) = BDTinput(trkiso3_dr0201); + *m_tmva_pix4l_sct0_chi2ndof.get(context) = BDTinput(chi2ndof); + *m_tmva_pix4l_sct0_chi2ndof_pix.get(context) = BDTinput(chi2ndof_pix); + *m_tmva_pix4l_sct0_refit_pt.get(context) = BDTinput(refit_pt); + *m_tmva_pix4l_sct0_n_pix.get(context) = BDTinput((float)n_pix); + *m_tmva_pix4l_sct0_refit_ptratio.get(context) = BDTinput(refit_ptratio); + *m_tmva_pix4l_sct0_refit_chi2ndof.get(context) = BDTinput(refit_chi2ndof); + *m_tmva_pix4l_sct0_n_bl.get(context) = BDTinput((float)n_bl); + // + return (**m_tmva_pix4l_sct0_reader.get(context)).EvaluateMVA("BDT method"); +} + +float TrigDisappearingTrackHypoAlg::bdt_eval_pix4l_sct1p +(const EventContext& context, + float pt, float refit_pt, float refit_z0, float refit_d0, int n_sct, float refit_ptratio, + float refit_chi2ndof_ratio, float trkiso3_dr01, float trkiso3_dr0201, int is_fail, float chi2ndof_pix, int n_pix) const +{ + *m_tmva_pix4l_sct1p_pt.get(context) = BDTinput(pt); + *m_tmva_pix4l_sct1p_refit_pt.get(context) = BDTinput(refit_pt); + *m_tmva_pix4l_sct1p_refit_z0.get(context) = BDTinput(refit_z0); + *m_tmva_pix4l_sct1p_refit_d0.get(context) = BDTinput(refit_d0); + *m_tmva_pix4l_sct1p_n_sct.get(context) = BDTinput((float)n_sct); + *m_tmva_pix4l_sct1p_refit_ptratio.get(context) = BDTinput(refit_ptratio); + *m_tmva_pix4l_sct1p_refit_chi2ndof_ratio.get(context) = BDTinput(refit_chi2ndof_ratio); + *m_tmva_pix4l_sct1p_trkiso3_dr01.get(context) = BDTinput(trkiso3_dr01); + *m_tmva_pix4l_sct1p_trkiso3_dr0201.get(context) = BDTinput(trkiso3_dr0201); + *m_tmva_pix4l_sct1p_is_fail.get(context) = BDTinput((float)is_fail); + *m_tmva_pix4l_sct1p_chi2ndof_pix.get(context) = BDTinput(chi2ndof_pix); + *m_tmva_pix4l_sct1p_n_pix.get(context) = BDTinput((float)n_pix); + + return (**m_tmva_pix4l_sct1p_reader.get(context)).EvaluateMVA("BDT method"); +} + +float TrigDisappearingTrackHypoAlg::bdt_eval_pix3l_sct0 +(const EventContext& context, + float pt, float z0, float d0, float chi2ndof, float chi2ndof_pix, float trkiso3_dr01, float trkiso3_dr0201, + float refit_pt, float refit_z0, float refit_d0, int n_pix, int n_bl) const +{ + *m_tmva_pix3l_sct0_pt.get(context) = BDTinput(pt); + *m_tmva_pix3l_sct0_z0.get(context) = BDTinput(z0); + *m_tmva_pix3l_sct0_d0.get(context) = BDTinput(d0); + *m_tmva_pix3l_sct0_chi2ndof.get(context) = BDTinput(chi2ndof); + *m_tmva_pix3l_sct0_chi2ndof_pix.get(context) = BDTinput(chi2ndof_pix); + *m_tmva_pix3l_sct0_trkiso3_dr01.get(context) = BDTinput(trkiso3_dr01); + *m_tmva_pix3l_sct0_trkiso3_dr0201.get(context) = BDTinput(trkiso3_dr0201); + *m_tmva_pix3l_sct0_refit_pt.get(context) = BDTinput(refit_pt); + *m_tmva_pix3l_sct0_refit_z0.get(context) = BDTinput(refit_z0); + *m_tmva_pix3l_sct0_refit_d0.get(context) = BDTinput(refit_d0); + *m_tmva_pix3l_sct0_n_pix.get(context) = BDTinput((float)n_pix); + *m_tmva_pix3l_sct0_n_bl.get(context) = BDTinput((float)n_bl); + + return (**m_tmva_pix3l_sct0_reader.get(context)).EvaluateMVA("BDT method"); +} + +float TrigDisappearingTrackHypoAlg::bdt_eval_pix3l_sct1p +(const EventContext& context, + float pt, float z0, float d0, float refit_pt, float refit_z0, float refit_d0, + int n_pix, int n_sct, float refit_ptratio, int is_fail, int n_bl, + float chi2ndof, float trkiso3_dr01, float trkiso3_dr0201, float refit_chi2ndof) const +{ + *m_tmva_pix3l_sct1p_pt.get(context) = BDTinput(pt); + *m_tmva_pix3l_sct1p_z0.get(context) = BDTinput(z0); + *m_tmva_pix3l_sct1p_d0.get(context) = BDTinput(d0); + *m_tmva_pix3l_sct1p_refit_pt.get(context) = BDTinput(refit_pt); + *m_tmva_pix3l_sct1p_refit_z0.get(context) = BDTinput(refit_z0); + *m_tmva_pix3l_sct1p_refit_d0.get(context) = BDTinput(refit_d0); + *m_tmva_pix3l_sct1p_n_pix.get(context) = BDTinput((float)n_pix); + *m_tmva_pix3l_sct1p_n_sct.get(context) = BDTinput((float)n_sct); + *m_tmva_pix3l_sct1p_refit_ptratio.get(context) = BDTinput(refit_ptratio); + *m_tmva_pix3l_sct1p_is_fail.get(context) = BDTinput((float)is_fail); + *m_tmva_pix3l_sct1p_n_bl.get(context) = BDTinput((float)n_bl); + *m_tmva_pix3l_sct1p_chi2ndof.get(context) = BDTinput(chi2ndof); + *m_tmva_pix3l_sct1p_trkiso3_dr01.get(context) = BDTinput(trkiso3_dr01); + *m_tmva_pix3l_sct1p_trkiso3_dr0201.get(context) = BDTinput(trkiso3_dr0201); + *m_tmva_pix3l_sct1p_refit_chi2ndof.get(context) = BDTinput(refit_chi2ndof); + + return (**m_tmva_pix3l_sct1p_reader.get(context)).EvaluateMVA("BDT method"); +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoAlg.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoAlg.h new file mode 100644 index 0000000000000000000000000000000000000000..5eaad82dcb4d11de1d4f322e30186477f0325590 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoAlg.h @@ -0,0 +1,115 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ +#ifndef TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKHYPOALG_H +#define TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKHYPOALG_H + +#include <string> + +#include "Gaudi/Property.h" +#include "DecisionHandling/HypoBase.h" +#include "TrigDisappearingTrackHypoTool.h" +#include "AthenaMonitoringKernel/GenericMonitoringTool.h" +#include "AthenaKernel/SlotSpecificObj.h" +#include "TMVA/Reader.h" + +/** + * @class TrigDisappearingTrackHypoAlg + * @brief Implements Hypo selection on triggering disappearing tracks + * @author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK + **/ + +class TrigDisappearingTrackHypoAlg : public ::HypoBase +{ +public: + + TrigDisappearingTrackHypoAlg( const std::string& name, ISvcLocator* pSvcLocator ); + + virtual StatusCode initialize() override; + virtual StatusCode execute(const EventContext& context) const override; + +private: + + ToolHandleArray< TrigDisappearingTrackHypoTool > m_hypoTools {this, "HypoTools", {}, "Tools to perfrom selection"}; + SG::ReadHandleKey< xAOD::TrigCompositeContainer > m_DisTrkCandKey {this, "DisTrkCand", "HLT_DisTrkCand", ""}; + SG::WriteHandleKey<xAOD::TrigCompositeContainer> m_DisTrkBDTSelKey {this, "DisTrkBDTSel","HLT_DisTrkBDTSel", ""}; + + StatusCode createCandidates(const EventContext&, const xAOD::TrigCompositeContainer*, xAOD::TrigCompositeContainer*) const; + + ToolHandle<GenericMonitoringTool> m_monTool{ this, "MonTool", "", "Monitoring tool" }; + + // BDT selection methods + float bdt_eval_pix4l_sct0 (const EventContext&, float, float, float, float, float, float, float, float, int, float, float, int) const; + float bdt_eval_pix4l_sct1p(const EventContext&, float, float, float, float, int, float, float, float, float, int, float, int) const; + float bdt_eval_pix3l_sct0 (const EventContext&, float, float, float, float, float, float, float, float, float, float, int, int) const; + float bdt_eval_pix3l_sct1p(const EventContext&, float, float, float, float, float, float, int, int, float, int, int, float, float, float, float) const; + inline float BDTinput(float) const; + + // TMVA reader + mutable SG::SlotSpecificObj<std::unique_ptr<TMVA::Reader> > m_tmva_pix4l_sct0_reader ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<std::unique_ptr<TMVA::Reader> > m_tmva_pix4l_sct1p_reader ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<std::unique_ptr<TMVA::Reader> > m_tmva_pix3l_sct0_reader ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<std::unique_ptr<TMVA::Reader> > m_tmva_pix3l_sct1p_reader ATLAS_THREAD_SAFE; + + // TMVA variables + // pix4l_sct0 + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_pt ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_z0 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_d0 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_trkiso3_dr01 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_trkiso3_dr0201 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_chi2ndof ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_chi2ndof_pix ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_refit_pt ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_n_pix ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_refit_ptratio ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_refit_chi2ndof ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_n_bl ATLAS_THREAD_SAFE; + + // pix4l_sct1p + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_pt ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_refit_pt ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_refit_z0 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_refit_d0 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_n_sct ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_refit_ptratio ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_refit_chi2ndof_ratio ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_trkiso3_dr01 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_trkiso3_dr0201 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_is_fail ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_chi2ndof_pix ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_n_pix ATLAS_THREAD_SAFE; + + // pix3l_sct0 + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_pt ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_z0 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_d0 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_chi2ndof ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_chi2ndof_pix ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_trkiso3_dr01 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_trkiso3_dr0201 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_refit_pt ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_refit_z0 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_refit_d0 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_n_pix ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_n_bl ATLAS_THREAD_SAFE; + + // pix3l_sct1p + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_pt ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_z0 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_d0 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_refit_pt ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_refit_z0 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_refit_d0 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_n_pix ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_n_sct ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_refit_ptratio ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_is_fail ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_n_bl ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_chi2ndof ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_trkiso3_dr01 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_trkiso3_dr0201 ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_refit_chi2ndof ATLAS_THREAD_SAFE; +}; + +#endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKHYPOALG_H diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoTool.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoTool.cxx new file mode 100644 index 0000000000000000000000000000000000000000..68ca254133fcd667736f5668c740a85f0454bba7 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoTool.cxx @@ -0,0 +1,180 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration + + * Trigger Hypo Tool, that is aimed at triggering disappearing track candidates + * author Kunihiro Nagano <kunihiro.nagano@cern.ch> +*/ + +#include "TrigCompositeUtils/TrigCompositeUtils.h" +#include "TrigCompositeUtils/HLTIdentifier.h" +#include "TrigCompositeUtils/Combinators.h" +#include "AthenaMonitoringKernel/Monitored.h" +#include "TrigDisappearingTrackHypoTool.h" +#include "GaudiKernel/PhysicalConstants.h" + +using namespace TrigCompositeUtils; + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +TrigDisappearingTrackHypoTool::TrigDisappearingTrackHypoTool( const std::string& type, + const std::string& name, + const IInterface* parent ) + : AthAlgTool( type, name, parent ), + m_decisionId( HLT::Identifier::fromToolName( name ) ) {} + +TrigDisappearingTrackHypoTool::~TrigDisappearingTrackHypoTool() {} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +StatusCode TrigDisappearingTrackHypoTool::initialize() +{ + ATH_MSG_INFO( "Initialization completed successfully:" ); + ATH_MSG_INFO( " cutTrackPtGeV = " << m_cutTrackPtGeV ); + ATH_MSG_INFO( "Tool configured for chain/id: " << m_decisionId ); + + return StatusCode::SUCCESS; +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +StatusCode TrigDisappearingTrackHypoTool::decide( std::vector<DisTrkHypoInfo>& toolInputs ) const +{ + size_t numTrigger = m_cutTrackPtGeV.size(); + size_t numDisTrks = toolInputs.size(); + + ATH_MSG_VERBOSE( "Number of DisTrks = " << numDisTrks ); + + if ( numTrigger == 1 ) { + ATH_MSG_VERBOSE( "Applying selection of single for " << m_decisionId ); + return inclusiveSelection(toolInputs); + } + else { + ATH_MSG_VERBOSE( "Applying selection of multiplicity for " << m_decisionId ); + return multiplicitySelection(toolInputs); + } + + return StatusCode::SUCCESS; +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +StatusCode TrigDisappearingTrackHypoTool::inclusiveSelection(std::vector<DisTrkHypoInfo>& toolInputs) const +{ + bool isPassed = false; + unsigned int iDisTrk=0; + for ( auto& input: toolInputs ) { + ATH_MSG_VERBOSE( "--- iDisTrk=" << iDisTrk << " ---" ); + if ( TrigCompositeUtils::passed( m_decisionId.numeric(), input.previousDecisionsIDs ) ) { + if ( decideOnSingleObject( input, 0 )==true ) { + ATH_MSG_VERBOSE( " Passed selection --> adding DecisionID" ); + isPassed = true; + TrigCompositeUtils::addDecisionID(m_decisionId, input.decision); + } + } else { + ATH_MSG_VERBOSE( " Not match DecisionID: " << m_decisionId ); + } + ++iDisTrk; + } + + ATH_MSG_VERBOSE( "Inclusive selection isPassed = " << isPassed ); + return StatusCode::SUCCESS; +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +StatusCode TrigDisappearingTrackHypoTool::multiplicitySelection(std::vector<DisTrkHypoInfo>& toolInputs) const +{ + HLT::Index2DVec passingSelection( m_cutTrackPtGeV.size() ); + + for ( size_t cutIndex=0; cutIndex < m_cutTrackPtGeV.size(); ++cutIndex ) { + size_t elementIndex{ 0 }; + for ( auto& input: toolInputs ) { + if ( TrigCompositeUtils::passed( m_decisionId.numeric(), input.previousDecisionsIDs ) ) { + if ( decideOnSingleObject( input, cutIndex ) == true ) { + ATH_MSG_VERBOSE( "Pass through selection " << m_decisionId << " : Event[" << elementIndex << "]" ); + passingSelection[cutIndex].push_back( elementIndex ); + } + } + else { + ATH_MSG_VERBOSE( "Not match DecisionID " << m_decisionId ); + } + elementIndex++; + } + // If no object passes the selection, multipul selection should stop. + if ( passingSelection[cutIndex].empty() ) { + ATH_MSG_VERBOSE( "No object passed selection " << cutIndex << " rejecting" ); + return StatusCode::SUCCESS; + } + } + + std::set<size_t> passingIndices; + HLT::elementsInUniqueCombinations( passingSelection, passingIndices ); + + if ( passingIndices.empty() ) { + ATH_MSG_VERBOSE( "No track passed through selection " << m_decisionId ); + return StatusCode::SUCCESS; + } + + for ( auto idx: passingIndices ) { + ATH_MSG_VERBOSE( "track[" << idx << "] passes through Chain/ID " << m_decisionId << " with pT" ); + TrigCompositeUtils::addDecisionID( m_decisionId.numeric(), toolInputs[idx].decision ); + } + + return StatusCode::SUCCESS; +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +bool TrigDisappearingTrackHypoTool::decideOnSingleObject( DisTrkHypoInfo& input, size_t cutIndex ) const +{ + // values + const std::string prefix = "disTrk"; + + auto distrk = input.disTrk; + + int category = distrk->getDetail<int> (prefix+"_category"); + float pt = distrk->getDetail<float>(prefix+"_pt"); + float refit_pt = distrk->getDetail<float>(prefix+"_refit_pt"); + float bdt_score = distrk->getDetail<float>(prefix+"_bdtscore"); + pt /= 1000.0; + refit_pt /= 1000.0; + + // selection + bool is_passed = false; + if( category==1 ) { + float bdt_threshold_pix4l_sct0 = m_cutBDTPix4Sct0[cutIndex]; + float pt_threshold_pix4l_sct0 = m_cutTrackPtGeV[cutIndex]; + if( pt >= pt_threshold_pix4l_sct0 && bdt_score >= bdt_threshold_pix4l_sct0 ) is_passed = true; + } + else if( category==2 ) { + float bdt_threshold_pix4l_sct1p = m_cutBDTPix4Sct1p[cutIndex]; + float refit_pt_threshold_pix4l_sct1p = m_cutTrackPtGeV[cutIndex]; + if( refit_pt >= refit_pt_threshold_pix4l_sct1p && bdt_score >= bdt_threshold_pix4l_sct1p ) is_passed = true; + } + else if( category==3 ) { + float bdt_threshold_pix3l_sct0 = m_cutBDTPix3Sct0[cutIndex]; + float pt_threshold_pix3l_sct0 = m_cutTrackPtGeV[cutIndex]; + if( pt >= pt_threshold_pix3l_sct0 && bdt_score >= bdt_threshold_pix3l_sct0 ) is_passed = true; + } + else if( category==4 ) { + float bdt_threshold_pix3l_sct1p = m_cutBDTPix3Sct1p[cutIndex]; + float refit_pt_threshold_pix3l_sct1p = m_cutTrackPtGeV[cutIndex]; + if( refit_pt >= refit_pt_threshold_pix3l_sct1p && bdt_score >= bdt_threshold_pix3l_sct1p ) is_passed = true; + } + else { + ATH_MSG_VERBOSE( " category is out of range = " << category ); + } + ATH_MSG_VERBOSE( " isPassed = " << is_passed << ", cut index / pT / refitPt / BDT score = " << cutIndex << " / " << pt << " / " << refit_pt << " / " << bdt_score); + + // + return is_passed; +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoTool.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoTool.h new file mode 100644 index 0000000000000000000000000000000000000000..2a43b834d684fc987a75f0d98d0cface1fcca989 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoTool.h @@ -0,0 +1,56 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ +#ifndef TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKHYPOTOOL_H +#define TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKHYPOTOOL_H + +#include "Gaudi/Property.h" +#include "AthenaBaseComps/AthAlgTool.h" +#include "TrigCompositeUtils/TrigCompositeUtils.h" +#include "xAODTracking/TrackParticlexAODHelpers.h" +#include "xAODTracking/TrackParticleContainer.h" +#include <string> + +/** + * @class TrigDisappearingTrackHypoTool + * @brief Generated the decision for hypo thats triggers disappearing track + * @author Kunihiro Nagano <kunihiro.nagano@cern.ch> + **/ + +class TrigDisappearingTrackHypoTool : virtual public ::AthAlgTool +{ +public: + TrigDisappearingTrackHypoTool( const std::string& type, + const std::string& name, + const IInterface* parent ); + + virtual ~TrigDisappearingTrackHypoTool(); + virtual StatusCode initialize() override; + + struct DisTrkHypoInfo { + TrigCompositeUtils::Decision* decision; + const xAOD::TrigComposite* disTrk; + const TrigCompositeUtils::DecisionIDContainer previousDecisionsIDs; + }; + + /** + * @brief decides upon a collection of tracks + **/ + StatusCode decide( std::vector<DisTrkHypoInfo>& ) const; + +private: + + HLT::Identifier m_decisionId; + Gaudi::Property< std::vector<float> > m_cutTrackPtGeV { this, "cutTrackPtGeV", { float(10.0) }, "Track pT requirement in GeV" }; + Gaudi::Property< std::vector<float> > m_cutBDTPix4Sct0 { this, "cutBDTPix4Sct0", { float(0.05) }, "BDT score thershold for Pix4l_Sct0 category" }; + Gaudi::Property< std::vector<float> > m_cutBDTPix4Sct1p { this, "cutBDTPix4Sct1p",{ float(0.04) }, "BDT score thershold for Pix4l_Sct1p category" }; + Gaudi::Property< std::vector<float> > m_cutBDTPix3Sct0 { this, "cutBDTPix3Sct0", { float(0.05) }, "BDT score thershold for Pix3l_Sct0 category" }; + Gaudi::Property< std::vector<float> > m_cutBDTPix3Sct1p { this, "cutBDTPix3Sct1p",{ float(0.04) }, "BDT score thershold for Pix3l_Sct1p category" }; + + // + StatusCode inclusiveSelection( std::vector<DisTrkHypoInfo>& ) const; + StatusCode multiplicitySelection( std::vector<DisTrkHypoInfo>& ) const; + bool decideOnSingleObject( DisTrkHypoInfo&, size_t ) const; +}; + +#endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKHYPOTOOL_H diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoAlg.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoAlg.cxx deleted file mode 100644 index bbc55e9f769457c7c365f64ac3b79d9c5c881c2f..0000000000000000000000000000000000000000 --- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoAlg.cxx +++ /dev/null @@ -1,111 +0,0 @@ -/* - Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration - - * Trigger Hypo Tool, that is aimed at triggering large dEdx tracks - * author Kunihiro Nagano <kunihiro.nagano@cern.ch> -*/ -#include "TrigDisappearingTrackTriggerHypoAlg.h" -#include "AthViews/ViewHelper.h" -#include "TrigCompositeUtils/TrigCompositeUtils.h" -#include "GaudiKernel/SystemOfUnits.h" - -using TrigCompositeUtils::createAndStore; -using TrigCompositeUtils::DecisionContainer; -using TrigCompositeUtils::DecisionAuxContainer; -using TrigCompositeUtils::DecisionIDContainer; -using TrigCompositeUtils::decisionIDs; -using TrigCompositeUtils::newDecisionIn; -using TrigCompositeUtils::linkToPrevious; -using TrigCompositeUtils::viewString; -using TrigCompositeUtils::featureString; -using TrigCompositeUtils::hypoAlgNodeName; -using TrigCompositeUtils::findLink; -using TrigCompositeUtils::LinkInfo; -using TrigCompositeUtils::Decision; -using TrigCompositeUtils::allFailed; - -TrigDisappearingTrackTriggerHypoAlg::TrigDisappearingTrackTriggerHypoAlg( const std::string& name, - ISvcLocator* pSvcLocator ) : - ::HypoBase( name, pSvcLocator ) {} - - -StatusCode TrigDisappearingTrackTriggerHypoAlg::initialize() -{ - CHECK( m_hypoTools.retrieve() ); - CHECK( m_DisTrkCandKey.initialize() ); - CHECK( m_DisTrkBDTSelKey.initialize()); - return StatusCode::SUCCESS; -} - -StatusCode TrigDisappearingTrackTriggerHypoAlg::execute( const EventContext& context ) const -{ - ATH_MSG_DEBUG( name() << "..." ); - auto previousDecisionsHandle = SG::makeHandle( decisionInput(), context ); - ATH_CHECK( previousDecisionsHandle.isValid() ); - - // new output decisions - ATH_MSG_DEBUG( "Creating new output decision handle" ); - SG::WriteHandle<DecisionContainer> outputHandle = createAndStore(decisionOutput(), context ); - auto decisions = outputHandle.ptr(); - - // previous decisions - ATH_MSG_DEBUG( "Running with " << previousDecisionsHandle->size() << " previous decisions" ); - if(previousDecisionsHandle->size()!=1) { - ATH_MSG_ERROR( "Previous decision handle size isn't 1. It is" << previousDecisionsHandle->size() ); - return StatusCode::FAILURE; - } - const Decision * previousDecision = previousDecisionsHandle->at(0); - - TrigCompositeUtils::DecisionIDContainer previousDecisionIDs; - TrigCompositeUtils::decisionIDs(previousDecision, previousDecisionIDs); - - // input Disappearing objects - auto DisTrkCandHandle = SG::makeHandle(m_DisTrkCandKey, context ); - ATH_CHECK( DisTrkCandHandle.isValid() ); - ATH_MSG_DEBUG( "DisTrkCand handle size: " << DisTrkCandHandle->size() ); - - const xAOD::TrigCompositeContainer * DisTrkCandContainer = DisTrkCandHandle.get(); - - if( DisTrkCandContainer == nullptr ) { - ATH_MSG_ERROR( "ERROR Cannot get DisappearingTrks container" ); - return StatusCode::FAILURE; - } - - // output EDM object - auto DisTrkBDTSelContainer = std::make_unique<xAOD::TrigCompositeContainer>(); - auto DisTrkBDTSelContainerAux = std::make_unique<xAOD::TrigCompositeAuxContainer>(); - DisTrkBDTSelContainer->setStore(DisTrkBDTSelContainerAux.get()); - - // create decision - auto d = newDecisionIn( decisions , previousDecision, hypoAlgNodeName(), context ); - TrigDisappearingTrackTriggerHypoTool::TrackInfo trkInfo{ d, DisTrkCandContainer, *DisTrkBDTSelContainer, previousDecisionIDs }; - - // Loop over all hypoToolinputs and get their decisions - for ( auto & tool: m_hypoTools ) { - ATH_CHECK( tool->decide( trkInfo ) ); - } - - DecisionContainer::iterator it = decisions->begin(); - bool isPassed = false; - while(it != decisions->end()) { - if (allFailed( *it )) { - it = decisions->erase(it); - } else { - isPassed = true; - ++it; - } - } - - // record link to EDM object if it is passed - if( isPassed ) { - SG::WriteHandle<xAOD::TrigCompositeContainer> DisTrkBDTSelHandle(m_DisTrkBDTSelKey, context); - ATH_CHECK( DisTrkBDTSelHandle.record( std::move( DisTrkBDTSelContainer ), std::move( DisTrkBDTSelContainerAux ) ) ); - ATH_CHECK( d->setObjectLink( featureString(), ElementLink<xAOD::TrigCompositeContainer>( m_DisTrkBDTSelKey.key(), 0) ) ); - } - - ATH_CHECK( hypoBaseOutputProcessing(outputHandle) ); - - // - return StatusCode::SUCCESS; -} - diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoAlg.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoAlg.h deleted file mode 100644 index 52658ca3beccf04691a7c922477eea2f21b38018..0000000000000000000000000000000000000000 --- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoAlg.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration -*/ -#ifndef TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKTRIGGERHYPOALG_H -#define TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKTRIGGERHYPOALG_H - -#include "Gaudi/Property.h" - -#include <string> -#include "TrigDisappearingTrackTriggerHypoTool.h" -#include "DecisionHandling/HypoBase.h" - -/** - * @class TrigDisappearingTrackTriggerHypoAlg - * @brief Implements Hypo selection on triggering large Disappearing tracks - * @author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK - **/ - -class TrigDisappearingTrackTriggerHypoAlg : public ::HypoBase -{ -public: - - TrigDisappearingTrackTriggerHypoAlg( const std::string& name, ISvcLocator* pSvcLocator ); - - virtual StatusCode initialize() override; - virtual StatusCode execute(const EventContext& context) const override; - -private: - ToolHandleArray< TrigDisappearingTrackTriggerHypoTool > m_hypoTools {this, "HypoTools", {}, "Tools to perfrom selection"}; - SG::ReadHandleKey< xAOD::TrigCompositeContainer > m_DisTrkCandKey {this, "DisTrkCand", "HLT_DisTrkCand", ""}; - // - SG::WriteHandleKey<xAOD::TrigCompositeContainer> m_DisTrkBDTSelKey {this, "DisTrkBDTSel","HLT_DisTrkBDTSel", ""}; -}; - -#endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKTRIGGERHYPOALG_H diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoTool.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoTool.cxx deleted file mode 100644 index 363162f4ba918d2555b576f35f3f8126bfad3011..0000000000000000000000000000000000000000 --- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoTool.cxx +++ /dev/null @@ -1,594 +0,0 @@ -/* - Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration - - * Trigger Hypo Tool, that is aimed at triggering disappearing track candidates - * author Kunihiro Nagano <kunihiro.nagano@cern.ch> -*/ - -#include "TrigCompositeUtils/TrigCompositeUtils.h" -#include "TrigCompositeUtils/HLTIdentifier.h" -#include "TrigCompositeUtils/Combinators.h" -#include "AthenaMonitoringKernel/Monitored.h" -#include "TrigDisappearingTrackTriggerHypoTool.h" -#include "GaudiKernel/PhysicalConstants.h" - -#include "PathResolver/PathResolver.h" - -using namespace TrigCompositeUtils; - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ - -TrigDisappearingTrackTriggerHypoTool::TrigDisappearingTrackTriggerHypoTool( const std::string& type, - const std::string& name, - const IInterface* parent ) - : AthAlgTool( type, name, parent ), - m_decisionId( HLT::Identifier::fromToolName( name ) ) {} - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ - -TrigDisappearingTrackTriggerHypoTool::~TrigDisappearingTrackTriggerHypoTool() {} - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ - -StatusCode TrigDisappearingTrackTriggerHypoTool::initialize() -{ - if ( !m_monTool.empty() ) CHECK( m_monTool.retrieve() ); - - ATH_MSG_INFO( "Initialization completed successfully:" ); - ATH_MSG_INFO( "cutTrackPtGeV = " << m_cutTrackPtGeV ); - ATH_MSG_INFO( "Tool configured for chain/id: " << m_decisionId ); - - TMVA::Reader reader; - m_tmva_pix4l_sct0_reader = new TMVA::Reader( "!Color:!Silent" ); - m_tmva_pix4l_sct1p_reader = new TMVA::Reader( "!Color:!Silent" ); - m_tmva_pix3l_sct0_reader = new TMVA::Reader( "!Color:!Silent" ); - m_tmva_pix3l_sct1p_reader = new TMVA::Reader( "!Color:!Silent" ); - - // --- declare variables to the reader - // pix4l_sct0 - m_tmva_pix4l_sct0_reader->AddVariable("pt", &m_tmva_pix4l_sct0_pt); - m_tmva_pix4l_sct0_reader->AddVariable("z0", &m_tmva_pix4l_sct0_z0); - m_tmva_pix4l_sct0_reader->AddVariable("d0", &m_tmva_pix4l_sct0_d0); - m_tmva_pix4l_sct0_reader->AddVariable("trkiso3_dr01", &m_tmva_pix4l_sct0_trkiso3_dr01); - m_tmva_pix4l_sct0_reader->AddVariable("trkiso3_dr0201", &m_tmva_pix4l_sct0_trkiso3_dr0201); - m_tmva_pix4l_sct0_reader->AddVariable("chi2ndof", &m_tmva_pix4l_sct0_chi2ndof); - m_tmva_pix4l_sct0_reader->AddVariable("chi2ndof_pix", &m_tmva_pix4l_sct0_chi2ndof_pix); - m_tmva_pix4l_sct0_reader->AddVariable("refit_pt", &m_tmva_pix4l_sct0_refit_pt); - m_tmva_pix4l_sct0_reader->AddVariable("n_pix", &m_tmva_pix4l_sct0_n_pix); - m_tmva_pix4l_sct0_reader->AddVariable("refit_ptratio", &m_tmva_pix4l_sct0_refit_ptratio); - m_tmva_pix4l_sct0_reader->AddVariable("refit_chi2ndof", &m_tmva_pix4l_sct0_refit_chi2ndof); - m_tmva_pix4l_sct0_reader->AddVariable("n_bl", &m_tmva_pix4l_sct0_n_bl); - - // pix4l_sct1p - m_tmva_pix4l_sct1p_reader->AddVariable("pt", &m_tmva_pix4l_sct1p_pt); - m_tmva_pix4l_sct1p_reader->AddVariable("refit_pt", &m_tmva_pix4l_sct1p_refit_pt); - m_tmva_pix4l_sct1p_reader->AddVariable("refit_z0", &m_tmva_pix4l_sct1p_refit_z0); - m_tmva_pix4l_sct1p_reader->AddVariable("refit_d0", &m_tmva_pix4l_sct1p_refit_d0); - m_tmva_pix4l_sct1p_reader->AddVariable("n_sct", &m_tmva_pix4l_sct1p_n_sct); - m_tmva_pix4l_sct1p_reader->AddVariable("refit_ptratio", &m_tmva_pix4l_sct1p_refit_ptratio); - m_tmva_pix4l_sct1p_reader->AddVariable("refit_chi2ndof_ratio", &m_tmva_pix4l_sct1p_refit_chi2ndof_ratio); - m_tmva_pix4l_sct1p_reader->AddVariable("trkiso3_dr01", &m_tmva_pix4l_sct1p_trkiso3_dr01); - m_tmva_pix4l_sct1p_reader->AddVariable("trkiso3_dr0201", &m_tmva_pix4l_sct1p_trkiso3_dr0201); - m_tmva_pix4l_sct1p_reader->AddVariable("is_fail", &m_tmva_pix4l_sct1p_is_fail); - m_tmva_pix4l_sct1p_reader->AddVariable("chi2ndof_pix", &m_tmva_pix4l_sct1p_chi2ndof_pix); - m_tmva_pix4l_sct1p_reader->AddVariable("n_pix", &m_tmva_pix4l_sct1p_n_pix); - - // pix3l_sct0 - m_tmva_pix3l_sct0_reader->AddVariable("pt", &m_tmva_pix3l_sct0_pt); - m_tmva_pix3l_sct0_reader->AddVariable("z0", &m_tmva_pix3l_sct0_z0); - m_tmva_pix3l_sct0_reader->AddVariable("d0", &m_tmva_pix3l_sct0_d0); - m_tmva_pix3l_sct0_reader->AddVariable("chi2ndof", &m_tmva_pix3l_sct0_chi2ndof); - m_tmva_pix3l_sct0_reader->AddVariable("chi2ndof_pix", &m_tmva_pix3l_sct0_chi2ndof_pix); - m_tmva_pix3l_sct0_reader->AddVariable("trkiso3_dr01", &m_tmva_pix3l_sct0_trkiso3_dr01); - m_tmva_pix3l_sct0_reader->AddVariable("trkiso3_dr0201", &m_tmva_pix3l_sct0_trkiso3_dr0201); - m_tmva_pix3l_sct0_reader->AddVariable("refit_pt", &m_tmva_pix3l_sct0_refit_pt); - m_tmva_pix3l_sct0_reader->AddVariable("refit_z0", &m_tmva_pix3l_sct0_refit_z0); - m_tmva_pix3l_sct0_reader->AddVariable("refit_d0", &m_tmva_pix3l_sct0_refit_d0); - m_tmva_pix3l_sct0_reader->AddVariable("n_pix", &m_tmva_pix4l_sct0_n_pix); - m_tmva_pix3l_sct0_reader->AddVariable("n_bl", &m_tmva_pix3l_sct0_n_bl); - - // pix3l_sct1p - m_tmva_pix3l_sct1p_reader->AddVariable("pt", &m_tmva_pix3l_sct1p_pt); - m_tmva_pix3l_sct1p_reader->AddVariable("z0", &m_tmva_pix3l_sct1p_z0); - m_tmva_pix3l_sct1p_reader->AddVariable("d0", &m_tmva_pix3l_sct1p_d0); - m_tmva_pix3l_sct1p_reader->AddVariable("refit_pt", &m_tmva_pix3l_sct1p_refit_pt); - m_tmva_pix3l_sct1p_reader->AddVariable("refit_z0", &m_tmva_pix3l_sct1p_refit_z0); - m_tmva_pix3l_sct1p_reader->AddVariable("refit_d0", &m_tmva_pix3l_sct1p_refit_d0); - m_tmva_pix3l_sct1p_reader->AddVariable("n_pix", &m_tmva_pix3l_sct1p_n_pix); - m_tmva_pix3l_sct1p_reader->AddVariable("n_sct", &m_tmva_pix3l_sct1p_n_sct); - m_tmva_pix3l_sct1p_reader->AddVariable("refit_ptratio", &m_tmva_pix3l_sct1p_refit_ptratio); - m_tmva_pix3l_sct1p_reader->AddVariable("is_fail", &m_tmva_pix3l_sct1p_is_fail); - m_tmva_pix3l_sct1p_reader->AddVariable("n_bl", &m_tmva_pix3l_sct1p_n_bl); - m_tmva_pix3l_sct1p_reader->AddVariable("chi2ndof", &m_tmva_pix3l_sct1p_chi2ndof); - m_tmva_pix3l_sct1p_reader->AddVariable("trkiso3_dr01", &m_tmva_pix3l_sct1p_trkiso3_dr01); - m_tmva_pix3l_sct1p_reader->AddVariable("trkiso3_dr0201", &m_tmva_pix3l_sct1p_trkiso3_dr0201); - m_tmva_pix3l_sct1p_reader->AddVariable("refit_chi2ndof", &m_tmva_pix3l_sct1p_refit_chi2ndof); - - // --- Book the MVA methods - std::string file; - std::string weightfile; - std::string tuningVer; - const std::string methodName = "BDT method"; - // - tuningVer = "v21a"; - file = "TrigDisappearingTrackTriggerHypo/pix4l_sct0.BDT.weights." + tuningVer + ".xml"; - weightfile = PathResolver::find_calib_file(file.c_str()); - ATH_MSG_INFO("opening weightfile for Pix4l_SCT0 = " << weightfile); - m_tmva_pix4l_sct0_reader->BookMVA(methodName, weightfile); - // - tuningVer = "v21b"; // "b" only for this category - file = "TrigDisappearingTrackTriggerHypo/pix4l_sct1p.BDT.weights." + tuningVer + ".xml"; - weightfile = PathResolver::find_calib_file(file.c_str()); - ATH_MSG_INFO("opening weightfile for Pix4l_SCT1p = " << weightfile); - m_tmva_pix4l_sct1p_reader->BookMVA(methodName, weightfile); - // - tuningVer = "v21a"; - file = "TrigDisappearingTrackTriggerHypo/pix3l_sct0.BDT.weights." + tuningVer + ".xml"; - weightfile = PathResolver::find_calib_file(file.c_str()); - ATH_MSG_INFO("opening weightfile for Pix3l_SCT0 = " << weightfile); - m_tmva_pix3l_sct0_reader->BookMVA(methodName, weightfile); - // - tuningVer = "v21a"; - file = "TrigDisappearingTrackTriggerHypo/pix3l_sct1p.BDT.weights." + tuningVer + ".xml"; - weightfile = PathResolver::find_calib_file(file.c_str()); - ATH_MSG_INFO("opening weightfile for Pix3l_SCT1p = " << weightfile); - m_tmva_pix3l_sct1p_reader->BookMVA(methodName, weightfile); - - // - return StatusCode::SUCCESS; -} - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ - -StatusCode TrigDisappearingTrackTriggerHypoTool::decide( TrackInfo& input ) const -{ - // monitoring - std::vector<int> mnt_category; - auto mon_category = Monitored::Collection("category", mnt_category); - auto monDisTrk = Monitored::Group(m_monTool, mon_category); - - std::vector<float> mnt_cat1_pt; - std::vector<float> mnt_cat1_z0; - std::vector<float> mnt_cat1_d0; - std::vector<float> mnt_cat1_iso01; - std::vector<float> mnt_cat1_iso0201; - std::vector<float> mnt_cat1_chi2ndof; - std::vector<float> mnt_cat1_chi2ndof_pix; - std::vector<float> mnt_cat1_refit_pt; - std::vector<int> mnt_cat1_n_pix; - std::vector<float> mnt_cat1_refit_ptratio; - std::vector<float> mnt_cat1_refit_chi2ndof; - std::vector<int> mnt_cat1_n_bl; - std::vector<float> mnt_cat1_bdtscore; - auto mon_cat1_pt = Monitored::Collection("pix4_sct0_pt", mnt_cat1_pt); - auto mon_cat1_z0 = Monitored::Collection("pix4_sct0_z0", mnt_cat1_z0); - auto mon_cat1_d0 = Monitored::Collection("pix4_sct0_d0", mnt_cat1_d0); - auto mon_cat1_iso01 = Monitored::Collection("pix4_sct0_iso01", mnt_cat1_iso01); - auto mon_cat1_iso0201 = Monitored::Collection("pix4_sct0_iso0201", mnt_cat1_iso0201); - auto mon_cat1_chi2ndof = Monitored::Collection("pix4_sct0_chi2ndof", mnt_cat1_chi2ndof); - auto mon_cat1_chi2ndof_pix = Monitored::Collection("pix4_sct0_chi2ndof_pix", mnt_cat1_chi2ndof_pix); - auto mon_cat1_refit_pt = Monitored::Collection("pix4_sct0_refit_pt", mnt_cat1_refit_pt); - auto mon_cat1_n_pix = Monitored::Collection("pix4_sct0_n_pix", mnt_cat1_n_pix); - auto mon_cat1_refit_ptratio = Monitored::Collection("pix4_sct0_refit_ptratio", mnt_cat1_refit_ptratio); - auto mon_cat1_refit_chi2ndof = Monitored::Collection("pix4_sct0_refit_chi2ndof", mnt_cat1_refit_chi2ndof); - auto mon_cat1_n_bl = Monitored::Collection("pix4_sct0_n_bl", mnt_cat1_n_bl); - auto mon_cat1_bdtscore = Monitored::Collection("pix4_sct0_bdtscore", mnt_cat1_bdtscore); - auto monDisTrkCat1 = Monitored::Group(m_monTool, mon_cat1_pt, mon_cat1_z0, mon_cat1_d0, mon_cat1_iso01, mon_cat1_iso0201, mon_cat1_chi2ndof, - mon_cat1_chi2ndof_pix, mon_cat1_refit_pt, mon_cat1_n_pix, mon_cat1_refit_ptratio, - mon_cat1_refit_chi2ndof, mon_cat1_n_bl, mon_cat1_bdtscore); - // - std::vector<float> mnt_cat2_pt; - std::vector<float> mnt_cat2_refit_pt; - std::vector<float> mnt_cat2_refit_z0; - std::vector<float> mnt_cat2_refit_d0; - std::vector<int> mnt_cat2_n_sct; - std::vector<float> mnt_cat2_refit_ptratio; - std::vector<float> mnt_cat2_refit_chi2ndof_ratio; - std::vector<float> mnt_cat2_iso01; - std::vector<float> mnt_cat2_iso0201; - std::vector<float> mnt_cat2_chi2ndof_pix; - std::vector<int> mnt_cat2_n_pix; - std::vector<float> mnt_cat2_bdtscore; - auto mon_cat2_pt = Monitored::Collection("pix4_sct1p_pt", mnt_cat2_pt); - auto mon_cat2_refit_pt = Monitored::Collection("pix4_sct1p_refit_pt", mnt_cat2_refit_pt); - auto mon_cat2_refit_z0 = Monitored::Collection("pix4_sct1p_refit_z0", mnt_cat2_refit_z0); - auto mon_cat2_refit_d0 = Monitored::Collection("pix4_sct1p_refit_d0", mnt_cat2_refit_d0); - auto mon_cat2_n_sct = Monitored::Collection("pix4_sct1p_n_sct", mnt_cat2_n_sct); - auto mon_cat2_refit_ptratio = Monitored::Collection("pix4_sct1p_refit_ptratio", mnt_cat2_refit_ptratio); - auto mon_cat2_refit_chi2ndof_ratio = Monitored::Collection("pix4_sct1p_refit_chi2ndof_ratio", mnt_cat2_refit_chi2ndof_ratio); - auto mon_cat2_iso01 = Monitored::Collection("pix4_sct1p_iso01", mnt_cat2_iso01); - auto mon_cat2_iso0201 = Monitored::Collection("pix4_sct1p_iso0201", mnt_cat2_iso0201); - auto mon_cat2_chi2ndof_pix = Monitored::Collection("pix4_sct1p_chi2ndof_pix", mnt_cat2_chi2ndof_pix); - auto mon_cat2_n_pix = Monitored::Collection("pix4_sct1p_n_pix", mnt_cat2_n_pix); - auto mon_cat2_bdtscore = Monitored::Collection("pix4_sct1p_bdtscore", mnt_cat2_bdtscore); - auto monDisTrkCat2 = Monitored::Group(m_monTool, mon_cat2_pt, mon_cat2_refit_pt, mon_cat2_refit_z0, mon_cat2_refit_d0, mon_cat2_n_sct, - mon_cat2_refit_ptratio, mon_cat2_refit_chi2ndof_ratio, mon_cat2_iso01, mon_cat2_iso0201, - mon_cat2_chi2ndof_pix, mon_cat2_n_pix, mon_cat2_bdtscore); - // - std::vector<float> mnt_cat3_pt; - std::vector<float> mnt_cat3_z0; - std::vector<float> mnt_cat3_d0; - std::vector<float> mnt_cat3_chi2ndof; - std::vector<float> mnt_cat3_chi2ndof_pix; - std::vector<float> mnt_cat3_iso01; - std::vector<float> mnt_cat3_iso0201; - std::vector<float> mnt_cat3_refit_pt; - std::vector<float> mnt_cat3_refit_z0; - std::vector<float> mnt_cat3_refit_d0; - std::vector<int> mnt_cat3_n_pix; - std::vector<int> mnt_cat3_n_bl; - std::vector<float> mnt_cat3_bdtscore; - auto mon_cat3_pt = Monitored::Collection("pix3_sct0_pt", mnt_cat3_pt); - auto mon_cat3_z0 = Monitored::Collection("pix3_sct0_z0", mnt_cat3_z0); - auto mon_cat3_d0 = Monitored::Collection("pix3_sct0_d0", mnt_cat3_d0); - auto mon_cat3_chi2ndof = Monitored::Collection("pix3_sct0_chi2ndof", mnt_cat3_chi2ndof); - auto mon_cat3_chi2ndof_pix = Monitored::Collection("pix3_sct0_chi2ndof_pix", mnt_cat3_chi2ndof_pix); - auto mon_cat3_iso01 = Monitored::Collection("pix3_sct0_iso01", mnt_cat3_iso01); - auto mon_cat3_iso0201 = Monitored::Collection("pix3_sct0_iso0201", mnt_cat3_iso0201); - auto mon_cat3_refit_pt = Monitored::Collection("pix3_sct0_refit_pt", mnt_cat3_refit_pt); - auto mon_cat3_refit_z0 = Monitored::Collection("pix3_sct0_refit_z0", mnt_cat3_refit_z0); - auto mon_cat3_refit_d0 = Monitored::Collection("pix3_sct0_refit_d0", mnt_cat3_refit_d0); - auto mon_cat3_n_pix = Monitored::Collection("pix3_sct0_n_pix", mnt_cat3_n_pix); - auto mon_cat3_n_bl = Monitored::Collection("pix3_sct0_n_bl", mnt_cat3_n_bl); - auto mon_cat3_bdtscore = Monitored::Collection("pix3_sct0_bdtscore", mnt_cat3_bdtscore); - auto monDisTrkCat3 = Monitored::Group(m_monTool, mon_cat3_pt, mon_cat3_z0, mon_cat3_d0, mon_cat3_chi2ndof, mon_cat3_chi2ndof_pix, - mon_cat3_iso01, mon_cat3_iso0201, mon_cat3_refit_pt, mon_cat3_refit_z0, mon_cat3_refit_d0, - mon_cat3_n_pix, mon_cat3_n_bl, mon_cat3_bdtscore); - // - std::vector<float> mnt_cat4_pt; - std::vector<float> mnt_cat4_z0; - std::vector<float> mnt_cat4_d0; - std::vector<float> mnt_cat4_refit_pt; - std::vector<float> mnt_cat4_refit_z0; - std::vector<float> mnt_cat4_refit_d0; - std::vector<int> mnt_cat4_n_pix; - std::vector<int> mnt_cat4_n_sct; - std::vector<float> mnt_cat4_refit_ptratio; - std::vector<int> mnt_cat4_n_bl; - std::vector<float> mnt_cat4_chi2ndof; - std::vector<float> mnt_cat4_iso01; - std::vector<float> mnt_cat4_iso0201; - std::vector<float> mnt_cat4_refit_chi2ndof; - std::vector<float> mnt_cat4_bdtscore; - auto mon_cat4_pt = Monitored::Collection("pix3_sct1p_pt", mnt_cat4_pt); - auto mon_cat4_z0 = Monitored::Collection("pix3_sct1p_z0", mnt_cat4_z0); - auto mon_cat4_d0 = Monitored::Collection("pix3_sct1p_d0", mnt_cat4_d0); - auto mon_cat4_refit_pt = Monitored::Collection("pix3_sct1p_refit_pt", mnt_cat4_refit_pt); - auto mon_cat4_refit_z0 = Monitored::Collection("pix3_sct1p_refit_z0", mnt_cat4_refit_z0); - auto mon_cat4_refit_d0 = Monitored::Collection("pix3_sct1p_refit_d0", mnt_cat4_refit_d0); - auto mon_cat4_n_pix = Monitored::Collection("pix3_sct1p_n_pix", mnt_cat4_n_pix); - auto mon_cat4_n_sct = Monitored::Collection("pix3_sct1p_n_sct", mnt_cat4_n_sct); - auto mon_cat4_refit_ptratio = Monitored::Collection("pix3_sct1p_refit_ptratio", mnt_cat4_refit_ptratio); - auto mon_cat4_n_bl = Monitored::Collection("pix3_sct1p_n_bl", mnt_cat4_n_bl); - auto mon_cat4_chi2ndof = Monitored::Collection("pix3_sct1p_chi2ndof", mnt_cat4_chi2ndof); - auto mon_cat4_iso01 = Monitored::Collection("pix3_sct1p_iso01", mnt_cat4_iso01); - auto mon_cat4_iso0201 = Monitored::Collection("pix3_sct1p_iso0201", mnt_cat4_iso0201); - auto mon_cat4_refit_chi2ndof = Monitored::Collection("pix3_sct1p_refit_chi2ndof", mnt_cat4_refit_chi2ndof); - auto mon_cat4_bdtscore = Monitored::Collection("pix3_sct1p_bdtscore", mnt_cat4_bdtscore); - auto monDisTrkCat4 = Monitored::Group(m_monTool, mon_cat4_pt, mon_cat4_z0, mon_cat4_d0, mon_cat4_refit_pt, mon_cat4_refit_z0, mon_cat4_refit_d0, - mon_cat4_n_pix, mon_cat4_n_sct, mon_cat4_refit_ptratio, mon_cat4_n_bl, mon_cat4_chi2ndof, - mon_cat4_iso01, mon_cat4_iso0201, mon_cat4_refit_chi2ndof, mon_cat4_bdtscore); - - // loop for each DisTrkCand - const xAOD::TrigCompositeContainer* disTrkCandContainer = input.disTrkCandContainer; - xAOD::TrigCompositeContainer& disTrkBDTSelContainer = input.disTrkBDTSelContainer; - - const int cutIndex = 0; - const std::string prefix = "disTrkCand"; - - float bdt_threshold_pix4l_sct0 = m_cutBDTPix4Sct0[cutIndex]; - float bdt_threshold_pix4l_sct1p = m_cutBDTPix4Sct1p[cutIndex]; - float bdt_threshold_pix3l_sct0 = m_cutBDTPix3Sct0[cutIndex]; - float bdt_threshold_pix3l_sct1p = m_cutBDTPix3Sct1p[cutIndex]; - - // for future, these threshold can be tuned separately for each category - float pt_threshold_pix4l_sct0 = m_cutTrackPtGeV[cutIndex]; - float refit_pt_threshold_pix4l_sct1p = m_cutTrackPtGeV[cutIndex]; - float pt_threshold_pix3l_sct0 = m_cutTrackPtGeV[cutIndex]; - float refit_pt_threshold_pix3l_sct1p = m_cutTrackPtGeV[cutIndex]; - - unsigned int i_cand=0; - unsigned int n_passed_cand=0; - for ( const xAOD::TrigComposite* cand : *disTrkCandContainer ) { - ATH_MSG_DEBUG("UTT: ===== i_cand: " << i_cand++ << " =====" ); - - // category - int category = cand->getDetail<int>(prefix+"_category"); - if( category<=0 || category>=5 ) { - ATH_MSG_DEBUG("UTT: category is out of range = " << category); - continue; - } - - // pt cut - float pt = cand->getDetail<float>(prefix+"_pt"); - float refit_pt = cand->getDetail<float>(prefix+"_refit_pt"); - pt /= 1000; - refit_pt /= 1000; - if( pt < m_cutTrackPtGeV[cutIndex] || refit_pt < m_cutTrackPtGeV[cutIndex] ) { - ATH_MSG_DEBUG("UTT: Fails pt cut, pt / refit_pt = " << pt << " / " << refit_pt); - continue; - } - mnt_category.push_back(category); - - // get values - int is_fail = cand->getDetail<int> (prefix+"_is_fail"); - float d0_wrtVtx = cand->getDetail<float>(prefix+"_d0_wrtVtx"); - float z0_wrtVtx = cand->getDetail<float>(prefix+"_z0_wrtVtx"); - float chi2 = cand->getDetail<float>(prefix+"_chi2"); - float ndof = cand->getDetail<float>(prefix+"_ndof"); - float chi2ndof = ( std::abs(ndof) > 1e-4 ) ? chi2 / ndof : 20; - int n_hits_pix = cand->getDetail<int> (prefix+"_n_hits_pix"); - int n_hits_sct = cand->getDetail<int> (prefix+"_n_hits_sct"); - int n_hits_bl = cand->getDetail<int> (prefix+"_n_hits_innermost"); - float iso3_dr01 = cand->getDetail<float>(prefix+"_iso3_dr01"); - iso3_dr01 /= 1000; - float iso3_dr02 = cand->getDetail<float>(prefix+"_iso3_dr02"); - iso3_dr02 /= 1000; - float refit_ptratio = ( std::abs(pt) > 1e-4 ) ? refit_pt / pt : 0; - float refit_d0_wrtVtx = cand->getDetail<float>(prefix+"_refit_d0_wrtVtx"); - float refit_z0_wrtVtx = cand->getDetail<float>(prefix+"_refit_z0_wrtVtx"); - float refit_chi2 = cand->getDetail<float>(prefix+"_refit_chi2"); - float refit_ndof = cand->getDetail<float>(prefix+"_refit_ndof"); - float refit_chi2ndof = ( std::abs(refit_ndof) > 1e-4 ) ? refit_chi2 / refit_ndof : 20; - float refit_chi2ndof_ratio = (std::abs(chi2ndof) > 1e-4 ) ? refit_chi2ndof / chi2ndof : 0; - float chi2_pix=0; float ndof_pix=0; - chi2_pix += cand->getDetail<float>(prefix+"_chi2sum_br_ibl"); - chi2_pix += cand->getDetail<float>(prefix+"_chi2sum_br_pix1"); - chi2_pix += cand->getDetail<float>(prefix+"_chi2sum_br_pix2"); - chi2_pix += cand->getDetail<float>(prefix+"_chi2sum_br_pix3"); - ndof_pix += cand->getDetail<float>(prefix+"_ndofsum_br_ibl"); - ndof_pix += cand->getDetail<float>(prefix+"_ndofsum_br_pix1"); - ndof_pix += cand->getDetail<float>(prefix+"_ndofsum_br_pix2"); - ndof_pix += cand->getDetail<float>(prefix+"_ndofsum_br_pix3"); - float chi2ndof_pix = ( std::abs(ndof_pix) > 1e-4 ) ? chi2_pix / ndof_pix : 0; - - // BDT score - float bdt_score = 0.0; - if( category==1 ) { - bdt_score = bdt_eval_pix4l_sct0(pt, z0_wrtVtx, d0_wrtVtx, iso3_dr01, iso3_dr02-iso3_dr01, chi2ndof, chi2ndof_pix, - refit_pt, n_hits_pix, refit_ptratio, refit_chi2ndof, n_hits_bl); - mnt_cat1_pt.push_back(pt); - mnt_cat1_z0.push_back(z0_wrtVtx); - mnt_cat1_d0.push_back(d0_wrtVtx); - mnt_cat1_iso01.push_back(iso3_dr01); - mnt_cat1_iso0201.push_back(iso3_dr02-iso3_dr01); - mnt_cat1_chi2ndof.push_back(chi2ndof); - mnt_cat1_chi2ndof_pix.push_back(chi2ndof_pix); - mnt_cat1_refit_pt.push_back(refit_pt); - mnt_cat1_n_pix.push_back(n_hits_pix); - mnt_cat1_refit_ptratio.push_back(refit_ptratio); - mnt_cat1_refit_chi2ndof.push_back(refit_chi2ndof); - mnt_cat1_n_bl.push_back(n_hits_bl); - mnt_cat1_bdtscore.push_back(bdt_score); - } - else if( category==2 ) { - bdt_score = bdt_eval_pix4l_sct1p(pt, refit_pt, refit_z0_wrtVtx, refit_d0_wrtVtx, n_hits_sct, refit_ptratio, - refit_chi2ndof_ratio, iso3_dr01, iso3_dr02-iso3_dr01, is_fail, chi2ndof_pix, n_hits_pix); - mnt_cat2_pt.push_back(pt); - mnt_cat2_refit_pt.push_back(refit_pt); - mnt_cat2_refit_z0.push_back(refit_z0_wrtVtx); - mnt_cat2_refit_d0.push_back(refit_d0_wrtVtx); - mnt_cat2_n_sct.push_back(n_hits_sct); - mnt_cat2_refit_ptratio.push_back(refit_ptratio); - mnt_cat2_refit_chi2ndof_ratio.push_back(refit_chi2ndof_ratio); - mnt_cat2_iso01.push_back(iso3_dr01); - mnt_cat2_iso0201.push_back(iso3_dr02-iso3_dr01); - mnt_cat2_chi2ndof_pix.push_back(chi2ndof_pix); - mnt_cat2_n_pix.push_back(n_hits_pix); - mnt_cat2_bdtscore.push_back(bdt_score); - } - else if( category==3 ) { - bdt_score = bdt_eval_pix3l_sct0(pt, z0_wrtVtx, d0_wrtVtx, chi2ndof, chi2ndof_pix, iso3_dr01, iso3_dr02-iso3_dr01, - refit_pt, refit_z0_wrtVtx, refit_d0_wrtVtx, n_hits_pix, n_hits_bl); - mnt_cat3_pt.push_back(pt); - mnt_cat3_z0.push_back(z0_wrtVtx); - mnt_cat3_d0.push_back(d0_wrtVtx); - mnt_cat3_chi2ndof.push_back(chi2ndof); - mnt_cat3_chi2ndof_pix.push_back(chi2ndof_pix); - mnt_cat3_iso01.push_back(iso3_dr01); - mnt_cat3_iso0201.push_back(iso3_dr02-iso3_dr01); - mnt_cat3_refit_pt.push_back(refit_pt); - mnt_cat3_refit_z0.push_back(refit_z0_wrtVtx); - mnt_cat3_refit_d0.push_back(refit_d0_wrtVtx); - mnt_cat3_n_pix.push_back(n_hits_pix); - mnt_cat3_n_bl.push_back(n_hits_bl); - mnt_cat3_bdtscore.push_back(bdt_score); - } - else if( category==4 ) { - bdt_score = bdt_eval_pix3l_sct1p(pt, z0_wrtVtx, d0_wrtVtx, refit_pt, refit_z0_wrtVtx, refit_d0_wrtVtx, n_hits_pix, n_hits_sct, - refit_ptratio, is_fail, n_hits_bl, chi2ndof, iso3_dr01, iso3_dr02-iso3_dr01, refit_chi2ndof); - mnt_cat4_pt.push_back(pt); - mnt_cat4_z0.push_back(z0_wrtVtx); - mnt_cat4_d0.push_back(d0_wrtVtx); - mnt_cat4_refit_pt.push_back(refit_pt); - mnt_cat4_refit_z0.push_back(refit_z0_wrtVtx); - mnt_cat4_refit_d0.push_back(refit_d0_wrtVtx); - mnt_cat4_n_pix.push_back(n_hits_pix); - mnt_cat4_n_sct.push_back(n_hits_sct); - mnt_cat4_refit_ptratio.push_back(refit_ptratio); - mnt_cat4_n_bl.push_back(n_hits_bl); - mnt_cat4_chi2ndof.push_back(chi2ndof); - mnt_cat4_iso01.push_back(iso3_dr01); - mnt_cat4_iso0201.push_back(iso3_dr02-iso3_dr01); - mnt_cat4_refit_chi2ndof.push_back(refit_chi2ndof); - mnt_cat4_bdtscore.push_back(bdt_score); - } - ATH_MSG_DEBUG("UTT: BDT score = " << bdt_score); - - // selection - - bool is_passed = false; - if( category==1 ) { - if( pt >= pt_threshold_pix4l_sct0 && bdt_score >= bdt_threshold_pix4l_sct0 ) is_passed = true; - } - else if( category==2 ) { - if( refit_pt >= refit_pt_threshold_pix4l_sct1p && bdt_score >= bdt_threshold_pix4l_sct1p ) is_passed = true; - } - else if( category==3 ) { - if( pt >= pt_threshold_pix3l_sct0 && bdt_score >= bdt_threshold_pix3l_sct0 ) is_passed = true; - } - else if( category==4 ) { - if( refit_pt >= refit_pt_threshold_pix3l_sct1p && bdt_score >= bdt_threshold_pix3l_sct1p ) is_passed = true; - } - ATH_MSG_DEBUG("UTT: BDT selection isPassed = " << is_passed); - if( ! is_passed ) continue; - - // passed selection - ATH_MSG_DEBUG("UTT: Passed selection" ); - n_passed_cand++; - - // create EDM object - xAOD::TrigComposite *distrk = new xAOD::TrigComposite(); - distrk->makePrivateStore(); - disTrkBDTSelContainer.push_back(distrk); - // - const std::string prefixOut = "disTrk"; - // - distrk->setDetail<int> (prefixOut+"_category", category); - distrk->setDetail<float>(prefixOut+"_pt", pt*1000.0); - float eta = cand->getDetail<float>(prefix+"_eta"); - float phi = cand->getDetail<float>(prefix+"_phi"); - distrk->setDetail<float>(prefixOut+"_eta", eta); - distrk->setDetail<float>(prefixOut+"_phi", phi); - distrk->setDetail<float>(prefixOut+"_refit_pt", refit_pt*1000.0); - distrk->setDetail<int> (prefixOut+"_is_fail", is_fail); - distrk->setDetail<float>(prefixOut+"_d0_wrtVtx", d0_wrtVtx); - distrk->setDetail<float>(prefixOut+"_z0_wrtVtx", z0_wrtVtx); - distrk->setDetail<float>(prefixOut+"_chi2", chi2); - distrk->setDetail<float>(prefixOut+"_ndof", ndof); - distrk->setDetail<int> (prefixOut+"_n_hits_pix", n_hits_pix); - distrk->setDetail<int> (prefixOut+"_n_hits_sct", n_hits_sct); - distrk->setDetail<int> (prefixOut+"_n_hits_innermost", n_hits_bl); - distrk->setDetail<float>(prefixOut+"_iso3_dr01", iso3_dr01*1000.0); - distrk->setDetail<float>(prefixOut+"_iso3_dr02", iso3_dr02*1000.0); - distrk->setDetail<float>(prefixOut+"_refit_d0_wrtVtx", refit_d0_wrtVtx); - distrk->setDetail<float>(prefixOut+"_refit_z0_wrtVtx", refit_z0_wrtVtx); - distrk->setDetail<float>(prefixOut+"_refit_chi2", refit_chi2); - distrk->setDetail<float>(prefixOut+"_refit_ndof", refit_ndof); - distrk->setDetail<float>(prefixOut+"_chi2ndof_pix", chi2ndof_pix); - distrk->setDetail<float>(prefixOut+"_bdtscore", bdt_score); - // - ATH_MSG_DEBUG("UTT: Created a new entry EDM" ); - } - - // - if( n_passed_cand > 0 ) { - addDecisionID( m_decisionId.numeric(), input.decision ); - ATH_MSG_DEBUG("UTT: REGTEST event accepted" ); - return StatusCode::SUCCESS; - } - else { - return StatusCode::SUCCESS; - } -} - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ - -inline float TrigDisappearingTrackTriggerHypoTool::BDTinput(float var) const { return ( std::abs(var) < 1e-5 ) ? 1e-5 : var; } - -float TrigDisappearingTrackTriggerHypoTool::bdt_eval_pix4l_sct0 -(float pt, float z0, float d0, float trkiso3_dr01, float trkiso3_dr0201, float chi2ndof, float chi2ndof_pix, - float refit_pt, int n_pix, float refit_ptratio, float refit_chi2ndof, int n_bl) const -{ - m_tmva_pix4l_sct0_pt = BDTinput(pt); - m_tmva_pix4l_sct0_z0 = BDTinput(z0); - m_tmva_pix4l_sct0_d0 = BDTinput(d0); - m_tmva_pix4l_sct0_trkiso3_dr01 = BDTinput(trkiso3_dr01); - m_tmva_pix4l_sct0_trkiso3_dr0201 = BDTinput(trkiso3_dr0201); - m_tmva_pix4l_sct0_chi2ndof = BDTinput(chi2ndof); - m_tmva_pix4l_sct0_chi2ndof_pix = BDTinput(chi2ndof_pix); - m_tmva_pix4l_sct0_refit_pt = BDTinput(refit_pt); - m_tmva_pix4l_sct0_n_pix = BDTinput((float)n_pix); - m_tmva_pix4l_sct0_refit_ptratio = BDTinput(refit_ptratio); - m_tmva_pix4l_sct0_refit_chi2ndof = BDTinput(refit_chi2ndof); - m_tmva_pix4l_sct0_n_bl = BDTinput((float)n_bl); - // - return m_tmva_pix4l_sct0_reader->EvaluateMVA("BDT method"); -} - -float TrigDisappearingTrackTriggerHypoTool::bdt_eval_pix4l_sct1p -(float pt, float refit_pt, float refit_z0, float refit_d0, int n_sct, float refit_ptratio, - float refit_chi2ndof_ratio, float trkiso3_dr01, float trkiso3_dr0201, int is_fail, float chi2ndof_pix, int n_pix) const -{ - m_tmva_pix4l_sct1p_pt = BDTinput(pt); - m_tmva_pix4l_sct1p_refit_pt = BDTinput(refit_pt); - m_tmva_pix4l_sct1p_refit_z0 = BDTinput(refit_z0); - m_tmva_pix4l_sct1p_refit_d0 = BDTinput(refit_d0); - m_tmva_pix4l_sct1p_n_sct = BDTinput((float)n_sct); - m_tmva_pix4l_sct1p_refit_ptratio = BDTinput(refit_ptratio); - m_tmva_pix4l_sct1p_refit_chi2ndof_ratio = BDTinput(refit_chi2ndof_ratio); - m_tmva_pix4l_sct1p_trkiso3_dr01 = BDTinput(trkiso3_dr01); - m_tmva_pix4l_sct1p_trkiso3_dr0201 = BDTinput(trkiso3_dr0201); - m_tmva_pix4l_sct1p_is_fail = BDTinput((float)is_fail); - m_tmva_pix4l_sct1p_chi2ndof_pix = BDTinput(chi2ndof_pix); - m_tmva_pix4l_sct1p_n_pix = BDTinput((float)n_pix); - // - /* - ATH_MSG_INFO("UTT: pt=" << pt); - ATH_MSG_INFO("UTT: refit_pt=" << refit_pt); - ATH_MSG_INFO("UTT: refit_z0=" << refit_z0); - ATH_MSG_INFO("UTT: refit_d0=" << refit_d0); - ATH_MSG_INFO("UTT: n_sct=" << n_sct); - ATH_MSG_INFO("UTT: refit_ptratio=" << refit_ptratio); - ATH_MSG_INFO("UTT: refit_chi2ndof_ratio=" << refit_chi2ndof_ratio); - ATH_MSG_INFO("UTT: trkiso3_dr01=" << trkiso3_dr01); - ATH_MSG_INFO("UTT: trkiso3_dr02dr01=" << trkiso3_dr0201); - ATH_MSG_INFO("UTT: is_fail=" << is_fail); - ATH_MSG_INFO("UTT: chi2ndof_pix=" << chi2ndof_pix); - ATH_MSG_INFO("UTT: n_pix=" << n_pix); - */ - // - return m_tmva_pix4l_sct1p_reader->EvaluateMVA("BDT method"); -} - -float TrigDisappearingTrackTriggerHypoTool::bdt_eval_pix3l_sct0 -(float pt, float z0, float d0, float chi2ndof, float chi2ndof_pix, float trkiso3_dr01, float trkiso3_dr0201, - float refit_pt, float refit_z0, float refit_d0, int n_pix, int n_bl) const -{ - m_tmva_pix3l_sct0_pt = BDTinput(pt); - m_tmva_pix3l_sct0_z0 = BDTinput(z0); - m_tmva_pix3l_sct0_d0 = BDTinput(d0); - m_tmva_pix3l_sct0_chi2ndof = BDTinput(chi2ndof); - m_tmva_pix3l_sct0_chi2ndof_pix = BDTinput(chi2ndof_pix); - m_tmva_pix3l_sct0_trkiso3_dr01 = BDTinput(trkiso3_dr01); - m_tmva_pix3l_sct0_trkiso3_dr0201 = BDTinput(trkiso3_dr0201); - m_tmva_pix3l_sct0_refit_pt = BDTinput(refit_pt); - m_tmva_pix3l_sct0_refit_z0 = BDTinput(refit_z0); - m_tmva_pix3l_sct0_refit_d0 = BDTinput(refit_d0); - m_tmva_pix3l_sct0_n_pix = BDTinput((float)n_pix); - m_tmva_pix3l_sct0_n_bl = BDTinput((float)n_bl); - // - return m_tmva_pix3l_sct0_reader->EvaluateMVA("BDT method"); -} - -float TrigDisappearingTrackTriggerHypoTool::bdt_eval_pix3l_sct1p -(float pt, float z0, float d0, float refit_pt, float refit_z0, float refit_d0, - int n_pix, int n_sct, float refit_ptratio, int is_fail, int n_bl, - float chi2ndof, float trkiso3_dr01, float trkiso3_dr0201, float refit_chi2ndof) const -{ - m_tmva_pix3l_sct1p_pt = BDTinput(pt); - m_tmva_pix3l_sct1p_z0 = BDTinput(z0); - m_tmva_pix3l_sct1p_d0 = BDTinput(d0); - m_tmva_pix3l_sct1p_refit_pt = BDTinput(refit_pt); - m_tmva_pix3l_sct1p_refit_z0 = BDTinput(refit_z0); - m_tmva_pix3l_sct1p_refit_d0 = BDTinput(refit_d0); - m_tmva_pix3l_sct1p_n_pix = BDTinput((float)n_pix); - m_tmva_pix3l_sct1p_n_sct = BDTinput((float)n_sct); - m_tmva_pix3l_sct1p_refit_ptratio = BDTinput(refit_ptratio); - m_tmva_pix3l_sct1p_is_fail = BDTinput((float)is_fail); - m_tmva_pix3l_sct1p_n_bl = BDTinput((float)n_bl); - m_tmva_pix3l_sct1p_chi2ndof = BDTinput(chi2ndof); - m_tmva_pix3l_sct1p_trkiso3_dr01 = BDTinput(trkiso3_dr01); - m_tmva_pix3l_sct1p_trkiso3_dr0201 = BDTinput(trkiso3_dr0201); - m_tmva_pix3l_sct1p_refit_chi2ndof = BDTinput(refit_chi2ndof); - // - return m_tmva_pix3l_sct1p_reader->EvaluateMVA("BDT method"); -} - -// ------------------------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------------------------ diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoTool.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoTool.h deleted file mode 100644 index 640532de87ec0165bc6706bd7f6fcb0f126ee9ab..0000000000000000000000000000000000000000 --- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoTool.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration -*/ -#ifndef TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKTRIGGERHYPOTOOL_H -#define TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKTRIGGERHYPOTOOL_H - -#include "Gaudi/Property.h" -#include "AthenaBaseComps/AthAlgTool.h" -#include "AthenaMonitoringKernel/GenericMonitoringTool.h" -#include "TrigCompositeUtils/TrigCompositeUtils.h" -#include "xAODTracking/TrackParticlexAODHelpers.h" -#include "xAODTracking/TrackParticleContainer.h" -#include <string> - -#include "TMVA/Reader.h" - -/** - * @class TrigDisappearingTrackTriggerHypoTool - * @brief Generated the decision for hypo thats triggers disappearing track - * @author Kunihiro Nagano <kunihiro.nagano@cern.ch> - **/ - -class TrigDisappearingTrackTriggerHypoTool : virtual public ::AthAlgTool -{ -public: - TrigDisappearingTrackTriggerHypoTool( const std::string& type, - const std::string& name, - const IInterface* parent ); - - virtual ~TrigDisappearingTrackTriggerHypoTool(); - virtual StatusCode initialize() override; - - struct TrackInfo { - TrigCompositeUtils::Decision* decision; - const xAOD::TrigCompositeContainer* disTrkCandContainer; - xAOD::TrigCompositeContainer& disTrkBDTSelContainer; - const TrigCompositeUtils::DecisionIDContainer previousDecisionsIDs; - }; - - /** - * @brief decides upon a collection of tracks - **/ - StatusCode decide( TrackInfo& input ) const; - -private: - - HLT::Identifier m_decisionId; - Gaudi::Property< std::vector<float> > m_cutTrackPtGeV { this, "cutTrackPtGeV", { float(10.0) }, "Track pT requirement in GeV" }; - Gaudi::Property< std::vector<float> > m_cutBDTPix4Sct0 { this, "cutBDTPix4Sct0", { float(0.05) }, "BDT score thershold for Pix4l_Sct0 category" }; - Gaudi::Property< std::vector<float> > m_cutBDTPix4Sct1p { this, "cutBDTPix4Sct1p",{ float(0.04) }, "BDT score thershold for Pix4l_Sct1p category" }; - Gaudi::Property< std::vector<float> > m_cutBDTPix3Sct0 { this, "cutBDTPix3Sct0", { float(0.05) }, "BDT score thershold for Pix3l_Sct0 category" }; - Gaudi::Property< std::vector<float> > m_cutBDTPix3Sct1p { this, "cutBDTPix3Sct1p",{ float(0.04) }, "BDT score thershold for Pix3l_Sct1p category" }; - // - ToolHandle<GenericMonitoringTool> m_monTool{ this, "MonTool", "", "Monitoring tool" }; - - // BDT selection methods - float bdt_eval_pix4l_sct0 (float, float, float, float, float, float, float, float, int, float, float, int) const; - float bdt_eval_pix4l_sct1p(float, float, float, float, int, float, float, float, float, int, float, int) const; - float bdt_eval_pix3l_sct0 (float, float, float, float, float, float, float, float, float, float, int, int) const; - float bdt_eval_pix3l_sct1p(float, float, float, float, float, float, int, int, float, int, int, float, float, float, float) const; - inline float BDTinput(float) const; - - // TMVA reader - TMVA::Reader* m_tmva_pix4l_sct0_reader; - TMVA::Reader* m_tmva_pix4l_sct1p_reader; - TMVA::Reader* m_tmva_pix3l_sct0_reader; - TMVA::Reader* m_tmva_pix3l_sct1p_reader; - - // TMVA variables - // pix4l_sct0 - mutable float m_tmva_pix4l_sct0_pt ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct0_z0 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct0_d0 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct0_trkiso3_dr01 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct0_trkiso3_dr0201 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct0_chi2ndof ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct0_chi2ndof_pix ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct0_refit_pt ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct0_n_pix ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct0_refit_ptratio ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct0_refit_chi2ndof ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct0_n_bl ATLAS_THREAD_SAFE; - - // pix4l_sct1p - mutable float m_tmva_pix4l_sct1p_pt ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct1p_refit_pt ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct1p_refit_z0 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct1p_refit_d0 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct1p_n_sct ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct1p_refit_ptratio ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct1p_refit_chi2ndof_ratio ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct1p_trkiso3_dr01 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct1p_trkiso3_dr0201 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct1p_is_fail ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct1p_chi2ndof_pix ATLAS_THREAD_SAFE; - mutable float m_tmva_pix4l_sct1p_n_pix ATLAS_THREAD_SAFE; - - // pix3l_sct0 - mutable float m_tmva_pix3l_sct0_pt ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct0_z0 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct0_d0 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct0_chi2ndof ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct0_chi2ndof_pix ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct0_trkiso3_dr01 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct0_trkiso3_dr0201 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct0_refit_pt ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct0_refit_z0 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct0_refit_d0 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct0_n_pix ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct0_n_bl ATLAS_THREAD_SAFE; - - // pix3l_sct1p - mutable float m_tmva_pix3l_sct1p_pt ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct1p_z0 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct1p_d0 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct1p_refit_pt ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct1p_refit_z0 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct1p_refit_d0 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct1p_n_pix ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct1p_n_sct ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct1p_refit_ptratio ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct1p_is_fail ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct1p_n_bl ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct1p_chi2ndof ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct1p_trkiso3_dr01 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct1p_trkiso3_dr0201 ATLAS_THREAD_SAFE; - mutable float m_tmva_pix3l_sct1p_refit_chi2ndof ATLAS_THREAD_SAFE; -}; - -#endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKTRIGGERHYPOTOOL_H diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigHitDVHypoAlg.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigHitDVHypoAlg.cxx index dd9f7b15313e3255de4611aeba3986dbcda7f7f1..e7da4addd10f2fa46d808886e4c9cffd97990291 100644 --- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigHitDVHypoAlg.cxx +++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigHitDVHypoAlg.cxx @@ -570,15 +570,15 @@ StatusCode TrigHitDVHypoAlg::calculateBDT(const EventContext& context, ATH_MSG_VERBOSE("nr of quality tracks in jet = " << n_qtrk_injet); // evaluate BDT - (*(const_cast<float*>(m_tmva_n_track_qual.get(context)))) = static_cast<float>(n_qtrk_injet); - (*(const_cast<float*>(m_tmva_ly0_sp_frac.get(context)))) = v_ly_sp_frac[0]; - (*(const_cast<float*>(m_tmva_ly1_sp_frac.get(context)))) = v_ly_sp_frac[1]; - (*(const_cast<float*>(m_tmva_ly2_sp_frac.get(context)))) = v_ly_sp_frac[2]; - (*(const_cast<float*>(m_tmva_ly3_sp_frac.get(context)))) = v_ly_sp_frac[3]; - (*(const_cast<float*>(m_tmva_ly4_sp_frac.get(context)))) = v_ly_sp_frac[4]; - (*(const_cast<float*>(m_tmva_ly5_sp_frac.get(context)))) = v_ly_sp_frac[5]; - (*(const_cast<float*>(m_tmva_ly6_sp_frac.get(context)))) = v_ly_sp_frac[6]; - (*(const_cast<float*>(m_tmva_ly7_sp_frac.get(context)))) = v_ly_sp_frac[7]; + *m_tmva_n_track_qual.get(context) = static_cast<float>(n_qtrk_injet); + *m_tmva_ly0_sp_frac.get(context) = v_ly_sp_frac[0]; + *m_tmva_ly1_sp_frac.get(context) = v_ly_sp_frac[1]; + *m_tmva_ly2_sp_frac.get(context) = v_ly_sp_frac[2]; + *m_tmva_ly3_sp_frac.get(context) = v_ly_sp_frac[3]; + *m_tmva_ly4_sp_frac.get(context) = v_ly_sp_frac[4]; + *m_tmva_ly5_sp_frac.get(context) = v_ly_sp_frac[5]; + *m_tmva_ly6_sp_frac.get(context) = v_ly_sp_frac[6]; + *m_tmva_ly7_sp_frac.get(context) = v_ly_sp_frac[7]; float bdt_score = (**m_tmva_reader.get(context)).EvaluateMVA("BDT method"); // BDT threshold diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigHitDVHypoAlg.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigHitDVHypoAlg.h index 0babfcf61a314b074d8f9116a561f609c228e7f6..a20da90b3612d521ee894bc35e81f67e00b194f5 100644 --- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigHitDVHypoAlg.h +++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigHitDVHypoAlg.h @@ -61,16 +61,16 @@ private: const float&, const int, xAOD::TrigCompositeContainer*, int&) const; // BDT - SG::SlotSpecificObj<std::unique_ptr<TMVA::Reader> > m_tmva_reader ATLAS_THREAD_SAFE; - SG::SlotSpecificObj<float> m_tmva_n_track_qual ATLAS_THREAD_SAFE; - SG::SlotSpecificObj<float> m_tmva_ly0_sp_frac ATLAS_THREAD_SAFE; - SG::SlotSpecificObj<float> m_tmva_ly1_sp_frac ATLAS_THREAD_SAFE; - SG::SlotSpecificObj<float> m_tmva_ly2_sp_frac ATLAS_THREAD_SAFE; - SG::SlotSpecificObj<float> m_tmva_ly3_sp_frac ATLAS_THREAD_SAFE; - SG::SlotSpecificObj<float> m_tmva_ly4_sp_frac ATLAS_THREAD_SAFE; - SG::SlotSpecificObj<float> m_tmva_ly5_sp_frac ATLAS_THREAD_SAFE; - SG::SlotSpecificObj<float> m_tmva_ly6_sp_frac ATLAS_THREAD_SAFE; - SG::SlotSpecificObj<float> m_tmva_ly7_sp_frac ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<std::unique_ptr<TMVA::Reader> > m_tmva_reader ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_n_track_qual ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_ly0_sp_frac ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_ly1_sp_frac ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_ly2_sp_frac ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_ly3_sp_frac ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_ly4_sp_frac ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_ly5_sp_frac ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_ly6_sp_frac ATLAS_THREAD_SAFE; + mutable SG::SlotSpecificObj<float> m_tmva_ly7_sp_frac ATLAS_THREAD_SAFE; }; #endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGHITDVHYPOALG_H diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoAlg.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoAlg.cxx new file mode 100644 index 0000000000000000000000000000000000000000..941b324a18d01fee431bb00d6dec2bc7a4c08646 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoAlg.cxx @@ -0,0 +1,264 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration + + * Trigger Hypo Tool, that is aimed at triggering large dEdx tracks + * author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK +*/ +#include "TrigdEdxTrackHypoAlg.h" +#include "AthViews/ViewHelper.h" +#include "TrigCompositeUtils/TrigCompositeUtils.h" +#include "GaudiKernel/SystemOfUnits.h" +#include "AthenaMonitoringKernel/Monitored.h" + +using TrigCompositeUtils::createAndStore; +using TrigCompositeUtils::DecisionContainer; +using TrigCompositeUtils::DecisionAuxContainer; +using TrigCompositeUtils::DecisionIDContainer; +using TrigCompositeUtils::decisionIDs; +using TrigCompositeUtils::newDecisionIn; +using TrigCompositeUtils::linkToPrevious; +using TrigCompositeUtils::viewString; +using TrigCompositeUtils::featureString; +using TrigCompositeUtils::hypoAlgNodeName; +using TrigCompositeUtils::findLink; +using TrigCompositeUtils::LinkInfo; +using TrigCompositeUtils::Decision; +using TrigCompositeUtils::allFailed; + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +TrigdEdxTrackHypoAlg::TrigdEdxTrackHypoAlg( const std::string& name, + ISvcLocator* pSvcLocator ) : + ::HypoBase( name, pSvcLocator ) {} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +StatusCode TrigdEdxTrackHypoAlg::initialize() +{ + CHECK( m_hypoTools.retrieve() ); + CHECK( m_dEdxTrkKey.initialize() ); + CHECK( m_dEdxHitKey.initialize() ); + CHECK( m_HPtdEdxTrkKey.initialize()); + + if ( !m_monTool.empty() ) CHECK( m_monTool.retrieve() ); + + m_highdEdxHitDefThres.clear(); m_highdEdxHitDefNames.clear(); + m_highdEdxHitDefThres.push_back(1.45); m_highdEdxHitDefNames.push_back("1p45"); + m_highdEdxHitDefThres.push_back(1.50); m_highdEdxHitDefNames.push_back("1p50"); + m_highdEdxHitDefThres.push_back(1.55); m_highdEdxHitDefNames.push_back("1p55"); + m_highdEdxHitDefThres.push_back(1.60); m_highdEdxHitDefNames.push_back("1p60"); + m_highdEdxHitDefThres.push_back(1.65); m_highdEdxHitDefNames.push_back("1p65"); + m_highdEdxHitDefThres.push_back(1.70); m_highdEdxHitDefNames.push_back("1p70"); + m_highdEdxHitDefThres.push_back(1.75); m_highdEdxHitDefNames.push_back("1p75"); + m_highdEdxHitDefThres.push_back(1.80); m_highdEdxHitDefNames.push_back("1p80"); + + return StatusCode::SUCCESS; +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +StatusCode TrigdEdxTrackHypoAlg::execute( const EventContext& context ) const +{ + // previous decisions + ATH_MSG_DEBUG( "Retrieving pervious decision: \"" << decisionInput().key() << "\"" ); + auto previousDecisionsHandle = SG::makeHandle( decisionInput(), context ); + ATH_CHECK( previousDecisionsHandle.isValid() ); + + ATH_MSG_DEBUG( "Running with " << previousDecisionsHandle->size() << " previous decisions" ); + if( previousDecisionsHandle->size()!=1 ) { + ATH_MSG_ERROR( "Previous decision handle size is not 1. It is" << previousDecisionsHandle->size() ); + return StatusCode::FAILURE; + } + const Decision * previousDecision = previousDecisionsHandle->at(0); + + TrigCompositeUtils::DecisionIDContainer previousDecisionIDs; + TrigCompositeUtils::decisionIDs(previousDecision, previousDecisionIDs); + ATH_MSG_VERBOSE( "IDs of active legs:" ); + for(auto decisionID: previousDecisionIDs) { ATH_MSG_VERBOSE( " " << decisionID ); } + + // new output decisions + ATH_MSG_DEBUG( "Creating new output decision handle" ); + SG::WriteHandle<DecisionContainer> outputHandle = createAndStore(decisionOutput(), context ); + auto outputDecisions = outputHandle.ptr(); + + // input objects + + // tracks + auto dEdxTrkHandle = SG::makeHandle(m_dEdxTrkKey, context ); + ATH_CHECK( dEdxTrkHandle.isValid() ); + ATH_MSG_DEBUG( "dEdxTrk handle size: " << dEdxTrkHandle->size() ); + + // hits + auto dEdxHitHandle = SG::makeHandle(m_dEdxHitKey, context ); + ATH_CHECK( dEdxHitHandle.isValid() ); + ATH_MSG_DEBUG( "dEdxHit handle size: " << dEdxHitHandle->size() ); + + const xAOD::TrigCompositeContainer * dEdxTrksContainer = dEdxTrkHandle.get(); + const xAOD::TrigCompositeContainer * dEdxHitsContainer = dEdxHitHandle.get(); + + if( dEdxTrksContainer == nullptr ) { + ATH_MSG_ERROR( "ERROR Cannot get dEdxTrks container"); + return StatusCode::FAILURE; + } + if( dEdxHitsContainer == nullptr ) { + ATH_MSG_ERROR( "ERROR Cannot get dEdxHits container"); + return StatusCode::FAILURE; + } + + // output EDM object + auto HPtdEdxTrkContainer = std::make_unique<xAOD::TrigCompositeContainer>(); + auto HPtdEdxTrkContainerAux = std::make_unique<xAOD::TrigCompositeAuxContainer>(); + HPtdEdxTrkContainer->setStore(HPtdEdxTrkContainerAux.get()); + + xAOD::TrigCompositeContainer* dedxContainer = HPtdEdxTrkContainer.get(); + + // Prepare inputs to HypoTool + int n_cands = 0; + ATH_CHECK( createCandidates(dEdxTrksContainer, dEdxHitsContainer, dedxContainer, n_cands) ); + ATH_MSG_DEBUG( "nr of cands by createCandidates = " << n_cands ); + + std::vector<TrigdEdxTrackHypoTool::dEdxTrkHypoInfo> dEdxTrkHypoInputs; + + for ( auto dedx : *dedxContainer ) { + Decision* newDecision = TrigCompositeUtils::newDecisionIn( outputDecisions, previousDecision, TrigCompositeUtils::hypoAlgNodeName(), context); + + ElementLink<xAOD::TrigCompositeContainer> dedxEL = ElementLink<xAOD::TrigCompositeContainer>(*outputHandle, dedx->index()); + ATH_CHECK( dedxEL.isValid() ); + + ATH_CHECK( newDecision->setObjectLink<xAOD::TrigCompositeContainer>(TrigCompositeUtils::featureString(), dedxEL) ); + + TrigdEdxTrackHypoTool::dEdxTrkHypoInfo hypoInfo{ newDecision, dedx, previousDecisionIDs }; + dEdxTrkHypoInputs.push_back( hypoInfo ); + } + + // monitor + ATH_CHECK( doMonitor(dedxContainer) ); + + // Loop over all hypoToolinputs and get their decisions + for ( auto & tool: m_hypoTools ) { + ATH_MSG_VERBOSE( "+++++ Now computing decision for " << tool->name() ); + ATH_CHECK( tool->decide( dEdxTrkHypoInputs ) ); + } + + DecisionContainer::iterator it = outputDecisions->begin(); + while(it != outputDecisions->end()) { + ATH_MSG_VERBOSE( "+++++ outputDecision: " << *it << " +++++" ); + if ( allFailed( *it ) ) { + ATH_MSG_VERBOSE( "---> all failed, erasing" ); + it = outputDecisions->erase(it); + } else { + ATH_MSG_VERBOSE( "---> not all failed" ); + ++it; + } + } + + // record + SG::WriteHandle<xAOD::TrigCompositeContainer> HPtdEdxTrkHandle(m_HPtdEdxTrkKey, context); + ATH_CHECK( HPtdEdxTrkHandle.record( std::move( HPtdEdxTrkContainer ), std::move( HPtdEdxTrkContainerAux ) ) ); + ATH_MSG_VERBOSE( "recorded HPtdEdxTrk object to SG" ); + + // + ATH_CHECK( hypoBaseOutputProcessing(outputHandle) ); + + // + return StatusCode::SUCCESS; +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +StatusCode TrigdEdxTrackHypoAlg::doMonitor(const xAOD::TrigCompositeContainer* dedxContainer ) const +{ + auto monTrackPtGeV = Monitored::Scalar( "trackPtGeV", -999. ); + auto monTrackEta = Monitored::Scalar( "trackEta", -999. ); + auto monTracka0beam = Monitored::Scalar( "tracka0beam", -999. ); + auto monTrackdEdx = Monitored::Scalar( "trackdEdx", -999. ); + auto monTrackNhighdEdxHits = Monitored::Scalar( "trackNhighdEdxHits", -999. ); + auto monitorIt = Monitored::Group( m_monTool, monTrackdEdx, monTrackPtGeV, monTrackEta, monTracka0beam, monTrackNhighdEdxHits ); + + for ( const xAOD::TrigComposite* trk : *dedxContainer ) { + float trackPt = trk->getDetail<float>("HPtdEdxTrk_pt"); + float trackEta = trk->getDetail<float>("HPtdEdxTrk_eta"); + float tracka0beam = trk->getDetail<float>("HPtdEdxTrk_a0beam"); + float trackdEdx = trk->getDetail<float>("HPtdEdxTrk_dedx"); + int trackNhighdEdxHits = (int)trk->getDetail<int16_t>("HPtdEdxTrk_n_hdedx_hits_1p70"); + monTrackPtGeV = trackPt / 1000.0; + monTrackEta = trackEta; + monTracka0beam = tracka0beam; + monTrackdEdx = trackdEdx; + monTrackNhighdEdxHits = trackNhighdEdxHits; + } + + return StatusCode::SUCCESS; +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +StatusCode TrigdEdxTrackHypoAlg::createCandidates( const xAOD::TrigCompositeContainer* trksContainer, const xAOD::TrigCompositeContainer* hitsContainer, + xAOD::TrigCompositeContainer* dedxContainer, int& n_trks) const +{ + n_trks = 0; + + for ( const xAOD::TrigComposite* trk : *trksContainer ) { + + ATH_MSG_VERBOSE("+++++ i_trk: " << n_trks << " +++++"); + + float trackPt = trk->getDetail<float>("dEdxTrk_pt"); + float trackEta = trk->getDetail<float>("dEdxTrk_eta"); + float trackPhi = trk->getDetail<float>("dEdxTrk_phi"); + float tracka0beam = trk->getDetail<float>("dEdxTrk_a0beam"); + float trackdEdx = trk->getDetail<float>("dEdxTrk_dedx"); + int trackId = trk->getDetail<int> ("dEdxTrk_id"); + ATH_MSG_VERBOSE( "track pt / eta / a0beam / dEdx / Id = " << trackPt << " / " << trackEta << " / " << tracka0beam << " / " << trackdEdx << " / " << trackId ); + + std::vector<int16_t> n_hdedx_hits; + for(unsigned int idef=0; idef<m_highdEdxHitDefThres.size(); ++idef) { n_hdedx_hits.push_back(0); } + + for ( const xAOD::TrigComposite* hit : *hitsContainer ) { + int id = hit->getDetail<int>("dEdxHit_trkid"); + if( id != trackId ) continue; + float dedx = hit->getDetail<float>("dEdxHit_dedx"); + for(unsigned int idef=0; idef<m_highdEdxHitDefThres.size(); ++idef) { + if( dedx >= m_highdEdxHitDefThres[idef] ) n_hdedx_hits[idef]++; + } + } + for(unsigned int idef=0; idef<m_highdEdxHitDefThres.size(); ++idef) { + ATH_MSG_VERBOSE( m_highdEdxHitDefNames[idef] << ", thres=" << m_highdEdxHitDefThres[idef] << ": nr of high dEdx hits=" << n_hdedx_hits[idef] ); + } + + int16_t n_hits_innermost = (int16_t)trk->getDetail<int>("dEdxTrk_n_hits_innermost"); + int16_t n_hits_inner = (int16_t)trk->getDetail<int>("dEdxTrk_n_hits_inner"); + int16_t n_hits_pix = (int16_t)trk->getDetail<int>("dEdxTrk_n_hits_pix"); + int16_t n_hits_sct = (int16_t)trk->getDetail<int>("dEdxTrk_n_hits_sct"); + + // create EDM object + ++n_trks; + xAOD::TrigComposite *dedx = new xAOD::TrigComposite(); + dedx->makePrivateStore(); + dedxContainer->push_back(dedx); + + dedx->setDetail<float>("HPtdEdxTrk_pt", trackPt); + dedx->setDetail<float>("HPtdEdxTrk_eta", trackEta); + dedx->setDetail<float>("HPtdEdxTrk_phi", trackPhi); + dedx->setDetail<float>("HPtdEdxTrk_a0beam",tracka0beam); + dedx->setDetail<float>("HPtdEdxTrk_dedx", trackdEdx); + for(unsigned int idef=0; idef<m_highdEdxHitDefThres.size(); ++idef) { + std::string name = "HPtdEdxTrk_n_hdedx_hits_" + m_highdEdxHitDefNames[idef]; + dedx->setDetail<int16_t>(name, n_hdedx_hits[idef]); + } + dedx->setDetail<int16_t>("HPtdEdxTrk_n_hits_innermost", n_hits_innermost); + dedx->setDetail<int16_t>("HPtdEdxTrk_n_hits_inner", n_hits_inner); + dedx->setDetail<int16_t>("HPtdEdxTrk_n_hits_pix", n_hits_pix); + dedx->setDetail<int16_t>("HPtdEdxTrk_n_hits_sct", n_hits_sct); + } + + // + return StatusCode::SUCCESS; +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoAlg.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoAlg.h new file mode 100644 index 0000000000000000000000000000000000000000..485bacdf141dc51e502f0858e79db3bacd0be5fb --- /dev/null +++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoAlg.h @@ -0,0 +1,46 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ +#ifndef TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKHYPOALG_H +#define TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKHYPOALG_H + +#include <string> + +#include "Gaudi/Property.h" +#include "DecisionHandling/HypoBase.h" +#include "TrigdEdxTrackHypoTool.h" +#include "AthenaMonitoringKernel/GenericMonitoringTool.h" + +/** + * @class TrigdEdxTrackHypoAlg + * @brief Implements Hypo selection on triggering large dEdx tracks + * @author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK + **/ + +class TrigdEdxTrackHypoAlg : public ::HypoBase +{ +public: + + TrigdEdxTrackHypoAlg( const std::string& name, ISvcLocator* pSvcLocator ); + + virtual StatusCode initialize() override; + virtual StatusCode execute(const EventContext& context) const override; + +private: + + ToolHandleArray< TrigdEdxTrackHypoTool > m_hypoTools {this, "HypoTools", {}, "Tools to perfrom selection"}; + + SG::ReadHandleKey< xAOD::TrigCompositeContainer > m_dEdxTrkKey {this, "dEdxTrk", "HLT_dEdxTrk", ""}; + SG::ReadHandleKey< xAOD::TrigCompositeContainer> m_dEdxHitKey {this, "dEdxHit", "HLT_dEdxHit", ""}; + SG::WriteHandleKey<xAOD::TrigCompositeContainer> m_HPtdEdxTrkKey {this, "HPtdEdxTrk", "HLT_HPtdEdxTrk", ""}; + + StatusCode createCandidates(const xAOD::TrigCompositeContainer*, const xAOD::TrigCompositeContainer*, xAOD::TrigCompositeContainer*, int&) const; + + ToolHandle<GenericMonitoringTool> m_monTool{ this, "MonTool", "", "Monitoring tool" }; + StatusCode doMonitor(const xAOD::TrigCompositeContainer*) const; + + std::vector<float> m_highdEdxHitDefThres; + std::vector<std::string> m_highdEdxHitDefNames; +}; + +#endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKHYPOALG_H diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoTool.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoTool.cxx new file mode 100644 index 0000000000000000000000000000000000000000..601b0078ba10a807dfb0ffb63f435ebcbe9fc6fc --- /dev/null +++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoTool.cxx @@ -0,0 +1,177 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration + + * Trigger Hypo Tool, that is aimed at triggering large dEdx tracks + * author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK +*/ + +#include "TrigCompositeUtils/TrigCompositeUtils.h" +#include "TrigCompositeUtils/HLTIdentifier.h" +#include "TrigCompositeUtils/Combinators.h" +#include "AthenaMonitoringKernel/Monitored.h" +#include "TrigdEdxTrackHypoTool.h" +#include "GaudiKernel/PhysicalConstants.h" + +using namespace TrigCompositeUtils; + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +TrigdEdxTrackHypoTool::TrigdEdxTrackHypoTool( const std::string& type, + const std::string& name, + const IInterface* parent ) + : AthAlgTool( type, name, parent ), + m_decisionId( HLT::Identifier::fromToolName( name ) ) {} + +TrigdEdxTrackHypoTool::~TrigdEdxTrackHypoTool() {} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +StatusCode TrigdEdxTrackHypoTool::initialize() +{ + ATH_MSG_INFO( "Initialization completed successfully:" ); + ATH_MSG_INFO( " cutTrackPtGeV = " << m_cutTrackPtGeV) ; + ATH_MSG_INFO( " cutTrackEta = " << m_cutTrackEta ); + ATH_MSG_INFO( " cutTrackdEdx = " << m_cutTrackdEdx ); + ATH_MSG_INFO( " cutTrackNhighdEdxHits = " << m_cutTrackNhighdEdxHits ); + ATH_MSG_INFO( " cutTrackHighdEdxDef = " << m_cutTrackHighdEdxDef ); + ATH_MSG_INFO( "Tool configured for chain/id: " << m_decisionId ); + + return StatusCode::SUCCESS; +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +StatusCode TrigdEdxTrackHypoTool::decide( std::vector<dEdxTrkHypoInfo>& toolInputs ) const +{ + size_t numTrigger = m_cutTrackPtGeV.size(); + size_t numdEdxTrks = toolInputs.size(); + + ATH_MSG_VERBOSE( "Number of dEdxTrks = " << numdEdxTrks ); + + if ( numTrigger == 1 ) { + ATH_MSG_VERBOSE( "Applying selection of single for " << m_decisionId ); + return inclusiveSelection(toolInputs); + } + else { + ATH_MSG_VERBOSE( "Applying selection of multiplicity for " << m_decisionId ); + return multiplicitySelection(toolInputs); + } + + return StatusCode::SUCCESS; +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +StatusCode TrigdEdxTrackHypoTool::inclusiveSelection(std::vector<dEdxTrkHypoInfo>& toolInputs) const +{ + bool isPassed = false; + unsigned int idEdxTrk=0; + for ( auto& input: toolInputs ) { + ATH_MSG_VERBOSE( "--- idEdxTrk=" << idEdxTrk << " ---"); + if ( TrigCompositeUtils::passed( m_decisionId.numeric(), input.previousDecisionsIDs ) ) { + if ( decideOnSingleObject( input, 0 )==true ) { + ATH_MSG_VERBOSE( " Passed selection --> adding DecisionID"); + isPassed = true; + TrigCompositeUtils::addDecisionID(m_decisionId, input.decision); + } + } else { + ATH_MSG_VERBOSE( " Not match DecisionID: " << m_decisionId ); + } + ++idEdxTrk; + } + + ATH_MSG_VERBOSE( "Inclusive selection isPassed = " << isPassed); + return StatusCode::SUCCESS; +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +StatusCode TrigdEdxTrackHypoTool::multiplicitySelection(std::vector<dEdxTrkHypoInfo>& toolInputs) const +{ + HLT::Index2DVec passingSelection( m_cutTrackPtGeV.size() ); + + for ( size_t cutIndex=0; cutIndex < m_cutTrackPtGeV.size(); ++cutIndex ) { + size_t elementIndex{ 0 }; + for ( auto& input: toolInputs ) { + if ( TrigCompositeUtils::passed( m_decisionId.numeric(), input.previousDecisionsIDs ) ) { + if ( decideOnSingleObject( input, cutIndex ) == true ) { + ATH_MSG_VERBOSE( "Pass through selection " << m_decisionId << " : Event[" << elementIndex << "]" ); + passingSelection[cutIndex].push_back( elementIndex ); + } + } + else { + ATH_MSG_VERBOSE( "Not match DecisionID " << m_decisionId ); + } + elementIndex++; + } + // If no object passes the selection, multipul selection should stop. + if ( passingSelection[cutIndex].empty() ) { + ATH_MSG_VERBOSE( "No object passed selection " << cutIndex << " rejecting" ); + return StatusCode::SUCCESS; + } + } + + std::set<size_t> passingIndices; + HLT::elementsInUniqueCombinations( passingSelection, passingIndices ); + + if ( passingIndices.empty() ) { + ATH_MSG_VERBOSE( "No track passed through selection " << m_decisionId ); + return StatusCode::SUCCESS; + } + + for ( auto idx: passingIndices ) { + ATH_MSG_VERBOSE( "track[" << idx << "] passes through Chain/ID " << m_decisionId << " with pT" ); + TrigCompositeUtils::addDecisionID( m_decisionId.numeric(), toolInputs[idx].decision ); + } + + return StatusCode::SUCCESS; +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ + +bool TrigdEdxTrackHypoTool::decideOnSingleObject( dEdxTrkHypoInfo& input, size_t cutIndex ) const +{ + const xAOD::TrigComposite* trk = input.dedxTrk; + + // pT cut + float trackPt = trk->getDetail<float>("HPtdEdxTrk_pt"); + float trackPtGeV = trackPt / 1000.0; + float ptThreshold = m_cutTrackPtGeV[cutIndex]; + if( trackPtGeV < ptThreshold ) return false; + + // eta cut + float trackEta = trk->getDetail<float>("HPtdEdxTrk_eta"); + float etaThreshold = m_cutTrackEta[cutIndex]; + if( std::abs(trackEta) > etaThreshold ) return false; + + // a0beam cut + float tracka0beam = trk->getDetail<float>("HPtdEdxTrk_a0beam"); + float a0Threshold = m_cutTracka0beam[cutIndex]; + if( std::abs(tracka0beam) > a0Threshold ) return false; + + // dEdx cut + float trackdEdx = trk->getDetail<float>("HPtdEdxTrk_dedx"); + float dedxThreshold = m_cutTrackdEdx[cutIndex]; + if( trackdEdx < dedxThreshold ) return false; + + // nr of high dEdx hits + std::string name = "HPtdEdxTrk_n_hdedx_hits_" + m_cutTrackHighdEdxDef[cutIndex]; + if( ! trk->hasDetail<int16_t>(name) ) ATH_MSG_ERROR( "HPtdEdxTrk container does not have entry for " << name ); + int n_hdedx_hits = (int)trk->getDetail<int16_t>(name); + int n_hdedx_hits_threshold = m_cutTrackNhighdEdxHits[cutIndex]; + if( n_hdedx_hits < n_hdedx_hits_threshold ) return false; + + // + ATH_MSG_VERBOSE( " Selected, cut index / pT / eta / a0 / dEdx / n high dEdx hits = " << cutIndex << " / " << trackPtGeV << " / " << trackEta << " / " << tracka0beam << " / " << trackdEdx << " / " << n_hdedx_hits); + + return true; +} + +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoTool.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoTool.h new file mode 100644 index 0000000000000000000000000000000000000000..6ff744238ee22ad339722b10818a0505ade35524 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoTool.h @@ -0,0 +1,57 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ +#ifndef TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKHYPOTOOL_H +#define TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKHYPOTOOL_H + +#include "Gaudi/Property.h" +#include "AthenaBaseComps/AthAlgTool.h" +#include "TrigCompositeUtils/TrigCompositeUtils.h" +#include "xAODTracking/TrackParticlexAODHelpers.h" +#include "xAODTracking/TrackParticleContainer.h" +#include <string> + +/** + * @class TrigdEdxTrackHypoTool + * @brief Generated the decision for hypo thats triggers on high pt isolated tracks + * @author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK + **/ + +class TrigdEdxTrackHypoTool : virtual public ::AthAlgTool +{ +public: + TrigdEdxTrackHypoTool( const std::string& type, + const std::string& name, + const IInterface* parent ); + + virtual ~TrigdEdxTrackHypoTool(); + virtual StatusCode initialize() override; + + struct dEdxTrkHypoInfo { + TrigCompositeUtils::Decision* decision; + const xAOD::TrigComposite* dedxTrk; + const TrigCompositeUtils::DecisionIDContainer previousDecisionsIDs; + }; + + /** + * @brief decides upon a collection of tracks + **/ + StatusCode decide( std::vector<dEdxTrkHypoInfo>& ) const; + +private: + + HLT::Identifier m_decisionId; + Gaudi::Property< std::vector<float> > m_cutTrackPtGeV { this, "cutTrackPtGeV", { float(20.0) }, "Track pT requirement in GeV" }; + Gaudi::Property< std::vector<float> > m_cutTrackEta { this, "cutTrackEta", { float(2.5) }, "Track Eta requirement" }; + Gaudi::Property< std::vector<float> > m_cutTracka0beam { this, "cutTracka0beam", { float(2.5) }, "Track a0beam requirement" }; + Gaudi::Property< std::vector<float> > m_cutTrackdEdx { this, "cutTrackdEdx", { float(1.7) }, "Track dE/dx requirement" }; + Gaudi::Property< std::vector<int> > m_cutTrackNhighdEdxHits { this, "cutTrackNhighdEdxHits", { int(2) }, "N high dEdx of pixel hits requirement" }; + Gaudi::Property< std::vector<std::string> > m_cutTrackHighdEdxDef { this, "cutTrackHighdEdxDef", { std::string("1p70") }, "Definition / threshold of high dEdx hits" }; + + // + StatusCode inclusiveSelection(std::vector<dEdxTrkHypoInfo>& ) const; + StatusCode multiplicitySelection(std::vector<dEdxTrkHypoInfo>& ) const; + bool decideOnSingleObject( dEdxTrkHypoInfo&, size_t ) const; +}; + +#endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKHYPOTOOL_H diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoAlg.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoAlg.cxx deleted file mode 100644 index f866a267a84698e0f81b1c683294004c6aa15bdd..0000000000000000000000000000000000000000 --- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoAlg.cxx +++ /dev/null @@ -1,122 +0,0 @@ -/* - Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration - - * Trigger Hypo Tool, that is aimed at triggering large dEdx tracks - * author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK -*/ -#include "TrigdEdxTrackTriggerHypoAlg.h" -#include "AthViews/ViewHelper.h" -#include "TrigCompositeUtils/TrigCompositeUtils.h" -#include "GaudiKernel/SystemOfUnits.h" - -using TrigCompositeUtils::createAndStore; -using TrigCompositeUtils::DecisionContainer; -using TrigCompositeUtils::DecisionAuxContainer; -using TrigCompositeUtils::DecisionIDContainer; -using TrigCompositeUtils::decisionIDs; -using TrigCompositeUtils::newDecisionIn; -using TrigCompositeUtils::linkToPrevious; -using TrigCompositeUtils::viewString; -using TrigCompositeUtils::featureString; -using TrigCompositeUtils::hypoAlgNodeName; -using TrigCompositeUtils::findLink; -using TrigCompositeUtils::LinkInfo; -using TrigCompositeUtils::Decision; -using TrigCompositeUtils::allFailed; - -TrigdEdxTrackTriggerHypoAlg::TrigdEdxTrackTriggerHypoAlg( const std::string& name, - ISvcLocator* pSvcLocator ) : - ::HypoBase( name, pSvcLocator ) {} - - -StatusCode TrigdEdxTrackTriggerHypoAlg::initialize() -{ - CHECK( m_hypoTools.retrieve() ); - CHECK( m_dEdxTrkKey.initialize() ); - CHECK( m_dEdxHitKey.initialize() ); - CHECK( m_HPtdEdxTrkKey.initialize()); - return StatusCode::SUCCESS; -} - -StatusCode TrigdEdxTrackTriggerHypoAlg::execute( const EventContext& context ) const -{ - const std::string header = "UTT: "; - - ATH_MSG_DEBUG( header << name() << "..." ); - auto previousDecisionsHandle = SG::makeHandle( decisionInput(), context ); - ATH_CHECK( previousDecisionsHandle.isValid() ); - - // new output decisions - ATH_MSG_DEBUG( header << "Creating new output decision handle" ); - SG::WriteHandle<DecisionContainer> outputHandle = createAndStore(decisionOutput(), context ); - auto decisions = outputHandle.ptr(); - - // previous decisions - ATH_MSG_DEBUG( header << "Running with " << previousDecisionsHandle->size() << " previous decisions" ); - if(previousDecisionsHandle->size()!=1) { - ATH_MSG_ERROR( header << "Previous decision handle size isn't 1. It is" << previousDecisionsHandle->size() ); - return StatusCode::FAILURE; - } - const Decision * previousDecision = previousDecisionsHandle->at(0); - - TrigCompositeUtils::DecisionIDContainer previousDecisionIDs; - TrigCompositeUtils::decisionIDs(previousDecision, previousDecisionIDs); - - // input dEdx objects - auto dEdxTrkHandle = SG::makeHandle(m_dEdxTrkKey, context ); - ATH_CHECK( dEdxTrkHandle.isValid() ); - ATH_MSG_DEBUG( header << "dEdxTrk handle size: " << dEdxTrkHandle->size() ); - - auto dEdxHitHandle = SG::makeHandle(m_dEdxHitKey, context ); - ATH_CHECK( dEdxHitHandle.isValid() ); - ATH_MSG_DEBUG( header << "dEdxHit handle size: " << dEdxHitHandle->size() ); - - const xAOD::TrigCompositeContainer * dEdxTrksContainer = dEdxTrkHandle.get(); - const xAOD::TrigCompositeContainer * dEdxHitsContainer = dEdxHitHandle.get(); - - if( dEdxTrksContainer == nullptr ) { - ATH_MSG_ERROR( header << "ERROR Cannot get dEdxTrks container"); - return StatusCode::FAILURE; - } - if( dEdxHitsContainer == nullptr ) { - ATH_MSG_ERROR( header << "ERROR Cannot get dEdxHits container"); - return StatusCode::FAILURE; - } - - // output EDM object - auto HPtdEdxTrkContainer = std::make_unique<xAOD::TrigCompositeContainer>(); - auto HPtdEdxTrkContainerAux = std::make_unique<xAOD::TrigCompositeAuxContainer>(); - HPtdEdxTrkContainer->setStore(HPtdEdxTrkContainerAux.get()); - - // create decision - auto d = newDecisionIn( decisions , previousDecision, hypoAlgNodeName(), context ); - TrigdEdxTrackTriggerHypoTool::TrackInfo trkInfo{ d, dEdxTrksContainer, dEdxHitsContainer, *HPtdEdxTrkContainer, previousDecisionIDs }; - - // Loop over all hypoToolinputs and get their decisions - for ( auto & tool: m_hypoTools ) { - ATH_CHECK( tool->decide( trkInfo ) ); - } - - DecisionContainer::iterator it = decisions->begin(); - bool isPassed = false; - while(it != decisions->end()) { - if (allFailed( *it )) { - it = decisions->erase(it); - } else { - isPassed = true; - ++it; - } - } - - // record link to EDM object if it is passed - if( isPassed ) { - SG::WriteHandle<xAOD::TrigCompositeContainer> HPtdEdxTrkHandle(m_HPtdEdxTrkKey, context); - ATH_CHECK( HPtdEdxTrkHandle.record( std::move( HPtdEdxTrkContainer ), std::move( HPtdEdxTrkContainerAux ) ) ); - ATH_CHECK( d->setObjectLink( featureString(), ElementLink<xAOD::TrigCompositeContainer>( m_HPtdEdxTrkKey.key(), 0) ) ); - } - - ATH_CHECK( hypoBaseOutputProcessing(outputHandle) ); - - // - return StatusCode::SUCCESS; -} diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoAlg.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoAlg.h deleted file mode 100644 index eceecebe0abd6bf10ed6d86308bd06589b23a377..0000000000000000000000000000000000000000 --- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoAlg.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration -*/ -#ifndef TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKTRIGGERHYPOALG_H -#define TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKTRIGGERHYPOALG_H - -#include "Gaudi/Property.h" - -#include <string> -#include "TrigdEdxTrackTriggerHypoTool.h" -#include "DecisionHandling/HypoBase.h" - -/** - * @class TrigdEdxTrackTriggerHypoAlg - * @brief Implements Hypo selection on triggering large dEdx tracks - * @author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK - **/ - -class TrigdEdxTrackTriggerHypoAlg : public ::HypoBase -{ -public: - - TrigdEdxTrackTriggerHypoAlg( const std::string& name, ISvcLocator* pSvcLocator ); - - virtual StatusCode initialize() override; - virtual StatusCode execute(const EventContext& context) const override; - -private: - ToolHandleArray< TrigdEdxTrackTriggerHypoTool > m_hypoTools {this, "HypoTools", {}, "Tools to perfrom selection"}; - SG::ReadHandleKey< xAOD::TrigCompositeContainer > m_dEdxTrkKey {this, "dEdxTrk", "HLT_dEdxTrk", ""}; - SG::ReadHandleKey< xAOD::TrigCompositeContainer> m_dEdxHitKey {this, "dEdxHit", "HLT_dEdxHit", ""}; - SG::WriteHandleKey<xAOD::TrigCompositeContainer> m_HPtdEdxTrkKey {this, "HPtdEdxTrk", "HLT_HPtdEdxTrk", ""}; -}; - -#endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKTRIGGERHYPOALG_H diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoTool.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoTool.cxx deleted file mode 100644 index 702ceb8a3dfe68f135c7ad949b46daf2197f1e18..0000000000000000000000000000000000000000 --- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoTool.cxx +++ /dev/null @@ -1,149 +0,0 @@ -/* - Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration - - * Trigger Hypo Tool, that is aimed at triggering large dEdx tracks - * author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK -*/ - -#include "TrigCompositeUtils/TrigCompositeUtils.h" -#include "TrigCompositeUtils/HLTIdentifier.h" -#include "TrigCompositeUtils/Combinators.h" -#include "AthenaMonitoringKernel/Monitored.h" -#include "TrigdEdxTrackTriggerHypoTool.h" -#include "GaudiKernel/PhysicalConstants.h" - -using namespace TrigCompositeUtils; - -TrigdEdxTrackTriggerHypoTool::TrigdEdxTrackTriggerHypoTool( const std::string& type, - const std::string& name, - const IInterface* parent ) - : AthAlgTool( type, name, parent ), - m_decisionId( HLT::Identifier::fromToolName( name ) ) {} - -StatusCode TrigdEdxTrackTriggerHypoTool::initialize() -{ - if ( !m_monTool.empty() ) CHECK( m_monTool.retrieve() ); - - ATH_MSG_INFO("Initialization completed successfully:"); - ATH_MSG_INFO("cutTrackPtGeV = " << m_cutTrackPtGeV); - ATH_MSG_INFO("cutTrackEta = " << m_cutTrackEta); - ATH_MSG_INFO("cutTrackdEdx = " << m_cutTrackdEdx); - ATH_MSG_INFO("cutTrackNhighdEdxHits = " << m_cutTrackNhighdEdxHits); - ATH_MSG_INFO("cutTrackHighdEdxDef = " << m_cutTrackHighdEdxDef); - ATH_MSG_INFO("Tool configured for chain/id: " << m_decisionId); - - return StatusCode::SUCCESS; -} - -TrigdEdxTrackTriggerHypoTool::~TrigdEdxTrackTriggerHypoTool() {} - -StatusCode TrigdEdxTrackTriggerHypoTool::decide( TrackInfo& input ) const -{ - auto monTrackPtGeV = Monitored::Scalar( "trackPtGeV", -999. ); - auto monTrackEta = Monitored::Scalar( "trackEta", -999. ); - auto monTracka0beam = Monitored::Scalar( "tracka0beam", -999. ); - auto monTrackdEdx = Monitored::Scalar( "trackdEdx", -999. ); - auto monTrackNhighdEdxHits = Monitored::Scalar( "trackNhighdEdxHits", -999. ); - auto monitorIt = Monitored::Group( m_monTool, monTrackdEdx, monTrackPtGeV, monTrackEta, monTracka0beam, monTrackNhighdEdxHits ); - - const xAOD::TrigCompositeContainer* trksContainer = input.trksContainer; - const xAOD::TrigCompositeContainer* hitsContainer = input.hitsContainer; - xAOD::TrigCompositeContainer& dedxContainer = input.dedxContainer; - - const int cutIndex = 0; - - unsigned int i_trk=0; - unsigned int n_passed_trk=0; - for ( const xAOD::TrigComposite* trk : *trksContainer ) { - ATH_MSG_DEBUG("+++++ i_trk: " << i_trk++ << " +++++"); - - // values - float trackPt = trk->getDetail<float>("dEdxTrk_pt"); - float trackEta = trk->getDetail<float>("dEdxTrk_eta"); - float tracka0beam = trk->getDetail<float>("dEdxTrk_a0beam"); - float trackdEdx = trk->getDetail<float>("dEdxTrk_dedx"); - int trackId = trk->getDetail<int> ("dEdxTrk_id"); - ATH_MSG_DEBUG("track pt / eta / a0beam / dEdx / Id = " << trackPt << " / " << trackEta << " / " << tracka0beam << " / " << trackdEdx << " / " << trackId ); - - // pT cut - float trackPtGeV = trackPt / 1000.0; - monTrackPtGeV = trackPtGeV; - if( trackPtGeV < m_cutTrackPtGeV[cutIndex] ) { - ATH_MSG_DEBUG("Fails pt cut in GeV: " << trackPtGeV << " < " << m_cutTrackPtGeV[cutIndex] ); - continue; - } - - // eta cut - monTrackEta = trackEta; - if( std::abs(trackEta) > m_cutTrackEta[cutIndex] ) { - ATH_MSG_DEBUG("Fails eta cut: " << trackEta << " < " << m_cutTrackEta[cutIndex] ); - continue; - } - - // a0beam cut - monTracka0beam = tracka0beam; - if( std::abs(tracka0beam) > m_cutTracka0beam[cutIndex] ) { - ATH_MSG_DEBUG("Fails a0beam cut: " << tracka0beam << " < " << m_cutTracka0beam[cutIndex] ); - continue; - } - - // dEdx cut - monTrackdEdx = trackdEdx; - if( trackdEdx < m_cutTrackdEdx[cutIndex] ) { - ATH_MSG_DEBUG("Fails dEdx cut: " << trackdEdx << " < " << m_cutTrackdEdx[cutIndex] ); - continue; - } - - // nr of high dEdx hits cut - int n_hdedx_hits = 0; - ATH_MSG_DEBUG("looping hits for trackId=" << trackId); - for ( const xAOD::TrigComposite* hit : *hitsContainer ) { - int id = hit->getDetail<int>("dEdxHit_trkid"); - if( id != trackId ) continue; - float dedx = hit->getDetail<float>("dEdxHit_dedx"); - ATH_MSG_DEBUG("... dEdx = " << dedx); - if( dedx < m_cutTrackHighdEdxDef[cutIndex] ) continue; - n_hdedx_hits++; - } - monTrackNhighdEdxHits = n_hdedx_hits; - if( n_hdedx_hits < m_cutTrackNhighdEdxHits[cutIndex] ) { - ATH_MSG_DEBUG("Fails nr of high dEdx hits cut" << n_hdedx_hits << " < " << m_cutTrackNhighdEdxHits[cutIndex] ); - continue; - } - - // passed selection - ATH_MSG_DEBUG("Passed selection"); - n_passed_trk++; - - // create EDM object - xAOD::TrigComposite *dedx = new xAOD::TrigComposite(); - dedx->makePrivateStore(); - dedxContainer.push_back(dedx); - float trackPhi = trk->getDetail<float>("dEdxTrk_phi"); - int n_hits_innermost = trk->getDetail<int> ("dEdxTrk_n_hits_innermost"); - int n_hits_inner = trk->getDetail<int> ("dEdxTrk_n_hits_inner"); - int n_hits_pix = trk->getDetail<int> ("dEdxTrk_n_hits_pix"); - int n_hits_sct = trk->getDetail<int> ("dEdxTrk_n_hits_sct"); - dedx->setDetail<float>("HPtdEdxTrk_pt", trackPt); - dedx->setDetail<float>("HPtdEdxTrk_eta", trackEta); - dedx->setDetail<float>("HPtdEdxTrk_phi", trackPhi); - dedx->setDetail<float>("HPtdEdxTrk_dedx", trackdEdx); - dedx->setDetail<int> ("HPtdEdxTrk_n_hdedx_hits", n_hdedx_hits); - dedx->setDetail<float>("HPtdEdxTrk_a0beam", tracka0beam); - dedx->setDetail<int> ("HPtdEdxTrk_n_hits_innermost", n_hits_innermost); - dedx->setDetail<int> ("HPtdEdxTrk_n_hits_inner", n_hits_inner); - dedx->setDetail<int> ("HPtdEdxTrk_n_hits_pix", n_hits_pix); - dedx->setDetail<int> ("HPtdEdxTrk_n_hits_sct", n_hits_sct); - ATH_MSG_DEBUG("Created a new entry EDM"); - } - - // - if( n_passed_trk > 0 ) { - addDecisionID( m_decisionId.numeric(), input.decision ); - ATH_MSG_DEBUG("REGTEST event accepted"); - return StatusCode::SUCCESS; - } - else { - return StatusCode::SUCCESS; - } -} diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoTool.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoTool.h deleted file mode 100644 index 8a3ce90031141fd818e8c491c48a681c8260bcd3..0000000000000000000000000000000000000000 --- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoTool.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration -*/ -#ifndef TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKTRIGGERHYPOTOOL_H -#define TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKTRIGGERHYPOTOOL_H - -#include "Gaudi/Property.h" -#include "AthenaBaseComps/AthAlgTool.h" -#include "AthenaMonitoringKernel/GenericMonitoringTool.h" -#include "TrigCompositeUtils/TrigCompositeUtils.h" -#include "xAODTracking/TrackParticlexAODHelpers.h" -#include "xAODTracking/TrackParticleContainer.h" -#include <string> - -/** - * @class TrigdEdxTrackTriggerHypoTool - * @brief Generated the decision for hypo thats triggers on high pt isolated tracks - * @author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK - **/ - -class TrigdEdxTrackTriggerHypoTool : virtual public ::AthAlgTool -{ -public: - TrigdEdxTrackTriggerHypoTool( const std::string& type, - const std::string& name, - const IInterface* parent ); - - virtual ~TrigdEdxTrackTriggerHypoTool(); - virtual StatusCode initialize() override; - - struct TrackInfo { - TrigCompositeUtils::Decision* decision; - const xAOD::TrigCompositeContainer* trksContainer; - const xAOD::TrigCompositeContainer* hitsContainer; - xAOD::TrigCompositeContainer& dedxContainer; - const TrigCompositeUtils::DecisionIDContainer previousDecisionsIDs; - }; - - /** - * @brief decides upon a collection of tracks - **/ - StatusCode decide( TrackInfo& input ) const; - -private: - HLT::Identifier m_decisionId; - Gaudi::Property< std::vector<float> > m_cutTrackPtGeV { this, "cutTrackPtGeV", { float(20.0) }, "Track pT requirement in GeV" }; - Gaudi::Property< std::vector<float> > m_cutTrackEta { this, "cutTrackEta", { float(2.5) }, "Track Eta requirement" }; - Gaudi::Property< std::vector<float> > m_cutTracka0beam { this, "cutTracka0beam", { float(2.5) }, "Track a0beam requirement" }; - Gaudi::Property< std::vector<float> > m_cutTrackdEdx { this, "cutTrackdEdx", { float(1.7) }, "Track dE/dx requirement" }; - Gaudi::Property< std::vector<int> > m_cutTrackNhighdEdxHits{ this, "cutTrackNhighdEdxHits", { int(2) }, "N high dEdx of pixel hits requirement" }; - Gaudi::Property< std::vector<float> > m_cutTrackHighdEdxDef { this, "cutTrackHighdEdxDef", { float(1.7) }, "Definition / threshold of high dEdx hits" }; - - ToolHandle<GenericMonitoringTool> m_monTool{ this, "MonTool", "", "Monitoring tool" }; -}; - -#endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKTRIGGERHYPOTOOL_H diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/components/TrigLongLivedParticlesHypo_entries.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/components/TrigLongLivedParticlesHypo_entries.cxx index f73444f60c8f15f924207370c9b459e4c76245de..e2a3d5f207eedd892b49fe2b6e72620a16391c13 100644 --- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/components/TrigLongLivedParticlesHypo_entries.cxx +++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/components/TrigLongLivedParticlesHypo_entries.cxx @@ -2,19 +2,19 @@ #include "../FastTrackFinderLRTHypoAlg.h" #include "../TrigIsoHPtTrackTriggerHypoAlg.h" #include "../TrigIsoHPtTrackTriggerHypoTool.h" -#include "../TrigdEdxTrackTriggerHypoAlg.h" -#include "../TrigdEdxTrackTriggerHypoTool.h" +#include "../TrigdEdxTrackHypoAlg.h" +#include "../TrigdEdxTrackHypoTool.h" #include "../TrigHitDVHypoAlg.h" #include "../TrigHitDVHypoTool.h" -#include "../TrigDisappearingTrackTriggerHypoAlg.h" -#include "../TrigDisappearingTrackTriggerHypoTool.h" +#include "../TrigDisappearingTrackHypoAlg.h" +#include "../TrigDisappearingTrackHypoTool.h" -DECLARE_COMPONENT( TrigDisappearingTrackTriggerHypoAlg ) -DECLARE_COMPONENT( TrigDisappearingTrackTriggerHypoTool ) +DECLARE_COMPONENT( TrigDisappearingTrackHypoAlg ) +DECLARE_COMPONENT( TrigDisappearingTrackHypoTool ) DECLARE_COMPONENT( TrigHitDVHypoAlg ) DECLARE_COMPONENT( TrigHitDVHypoTool ) -DECLARE_COMPONENT( TrigdEdxTrackTriggerHypoAlg ) -DECLARE_COMPONENT( TrigdEdxTrackTriggerHypoTool ) +DECLARE_COMPONENT( TrigdEdxTrackHypoAlg ) +DECLARE_COMPONENT( TrigdEdxTrackHypoTool ) DECLARE_COMPONENT( TrigIsoHPtTrackTriggerHypoAlg ) DECLARE_COMPONENT( TrigIsoHPtTrackTriggerHypoTool ) DECLARE_COMPONENT( FastTrackFinderLRTHypoTool ) diff --git a/Trigger/TrigSteer/TrigOutputHandling/TrigOutputHandling/TriggerEDMAuxAccessors.h b/Trigger/TrigSteer/TrigOutputHandling/TrigOutputHandling/TriggerEDMAuxAccessors.h index 794b34f6a8566ec1676a1b3ec5e1899c9ec4a20f..451f09a28d7c38f722061006cc322b093c4c5c38 100644 --- a/Trigger/TrigSteer/TrigOutputHandling/TrigOutputHandling/TriggerEDMAuxAccessors.h +++ b/Trigger/TrigSteer/TrigOutputHandling/TrigOutputHandling/TriggerEDMAuxAccessors.h @@ -21,8 +21,7 @@ constexpr auto initAccessors(U... names) { auto boolAccessors = initAccessors<bool>( "hasGenericRoiError", "hasGenericDaqError", "hasCrcTobError", "hasCrcFibreError", - "hasCrcDaqError", "hasRoibDaqDifference", "hasRoibCtpDifference", "hasDaqCtpDifference", - "hitDVSP_isPix","hitDVSP_isSct"); + "hasCrcDaqError", "hasRoibDaqDifference", "hasRoibCtpDifference", "hasDaqCtpDifference"); auto charAccessors = initAccessors<char>( "IP2D_isDefaults", "IP3D_isDefaults", "SV1_isDefaults", "rnnip_isDefaults", @@ -39,15 +38,12 @@ auto intAccessors = initAccessors<int>( "nCells", "sctSP", "sctSPBarrel", "sctSPEndcapA", "sctSPEndcapC", "zfinder_tool", - "hitDVTrk_id","hitDVTrk_n_hits_innermost","hitDVTrk_n_hits_pix","hitDVTrk_n_hits_sct", "hitDV_seed_type","hitDV_n_track_qual", "dEdxTrk_id","dEdxTrk_dedx_n_usedhits", "dEdxTrk_n_hits_innermost","dEdxTrk_n_hits_inner","dEdxTrk_n_hits_pix","dEdxTrk_n_hits_sct", "dEdxHit_trkid","dEdxHit_iblovfl","dEdxHit_loc","dEdxHit_layer", - "HPtdEdxTrk_dedx_n_usedhits","HPtdEdxTrk_n_hits_innermost", - "HPtdEdxTrk_n_hits_inner","HPtdEdxTrk_n_hits_pix","HPtdEdxTrk_n_hits_sct", "disTrk_category","disTrk_is_fail","disTrk_n_hits_pix","disTrk_n_hits_sct","disTrk_n_hits_innermost", - "disTrkCand_category","disTrkCand_n_hits_innermost","disTrkCand_n_hits_inner","disTrkCand_n_hits_pix","disTrkCand_n_hits_sct", + "disTrkCand_category","disTrkCand_is_fail","disTrkCand_n_hits_innermost","disTrkCand_n_hits_inner","disTrkCand_n_hits_pix","disTrkCand_n_hits_sct", "disTrkCand_n_brhits_ibl","disTrkCand_n_brhits_pix1","disTrkCand_n_brhits_pix2","disTrkCand_n_brhits_pix3", "disTrkCand_n_brhits_sct1","disTrkCand_n_brhits_sct2","disTrkCand_n_brhits_sct3","disTrkCand_n_brhits_sct4", "disTrkCand_n_brhits_good_ibl","disTrkCand_n_brhits_good_pix1","disTrkCand_n_brhits_good_pix2","disTrkCand_n_brhits_good_pix3", @@ -58,7 +54,10 @@ auto intAccessors = initAccessors<int>( "disTrkCand_refit_n_brhits_good_ibl","disTrkCand_refit_n_brhits_good_pix1","disTrkCand_refit_n_brhits_good_pix2","disTrkCand_refit_n_brhits_good_pix3", "disTrkCand_refit_n_brhits_good_sct1","disTrkCand_refit_n_brhits_good_sct2","disTrkCand_refit_n_brhits_good_sct3","disTrkCand_refit_n_brhits_good_sct4"); -auto int16Accessors = initAccessors<int16_t>("view", "hitDVSP_layer", "hitDVSP_usedTrkId"); +auto int16Accessors = initAccessors<int16_t>("view", + "HPtdEdxTrk_n_hdedx_hits_1p45","HPtdEdxTrk_n_hdedx_hits_1p50","HPtdEdxTrk_n_hdedx_hits_1p55","HPtdEdxTrk_n_hdedx_hits_1p60", + "HPtdEdxTrk_n_hdedx_hits_1p65","HPtdEdxTrk_n_hdedx_hits_1p70","HPtdEdxTrk_n_hdedx_hits_1p75","HPtdEdxTrk_n_hdedx_hits_1p80", + "HPtdEdxTrk_n_hits_innermost","HPtdEdxTrk_n_hits_inner","HPtdEdxTrk_n_hits_pix","HPtdEdxTrk_n_hits_sct"); auto int32Accessors = initAccessors<int32_t>("roi"); @@ -102,8 +101,6 @@ auto floatAccessors = initAccessors<float>( "btagIp_d0", "btagIp_d0Uncertainty", "btagIp_z0SinTheta", "btagIp_z0SinThetaUncertainty", "EOverP", "RErr", "etConeCore", "muonScore", "ptCone20", "trackIso", "trkPtFraction", "zfinder_vtx_z", "zfinder_vtx_weight", "caloIso", "calE", "calEta", "calPhi", - "hitDVTrk_pt","hitDVTrk_eta","hitDVTrk_phi","hitDVTrk_a0beam", - "hitDVSP_eta","hitDVSP_r","hitDVSP_phi", "hitDV_seed_pt","hitDV_seed_eta","hitDV_seed_phi","hitDV_ly0_sp_frac","hitDV_ly1_sp_frac","hitDV_ly2_sp_frac", "hitDV_ly3_sp_frac","hitDV_ly4_sp_frac","hitDV_ly5_sp_frac","hitDV_ly6_sp_frac","hitDV_ly7_sp_frac","hitDV_bdt_score", "dEdxTrk_pt","dEdxTrk_eta","dEdxTrk_phi","dEdxTrk_dedx","dEdxTrk_a0beam", diff --git a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref index ea6b84ed7d0c2750c5bc2e253d7ace7f4beefbbf..cd3706579368b2e31db7d5e276a43997a1048051 100644 --- a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref +++ b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref @@ -11038,7 +11038,7 @@ HLT_xe80_tcpufit_unconvtrk25_dedx_medium_L1XE50: stepFeatures: 0: 4 1: 4 - 2: 1 + 2: 3 HLT_xe80_tcpufit_unconvtrk50_dedx_medium_L1XE50: eventCount: 1 stepCounts: @@ -11048,4 +11048,4 @@ HLT_xe80_tcpufit_unconvtrk50_dedx_medium_L1XE50: stepFeatures: 0: 4 1: 4 - 2: 1 + 2: 2 diff --git a/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py b/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py index cb2c8d83fa45016071dcdf7be773da0113e9ab13..583e1d61ee688d4e9cfb3b4df7c214be12570e3e 100644 --- a/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py +++ b/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py @@ -110,18 +110,6 @@ BTagVars = '.'.join(BTagOutput) BTagJetOutput = ['btaggingLink', 'Jvt', 'JVFCorr', 'SumPtTrkPt500'] BTagJetVars ='.'.join(BTagJetOutput) -hitDVTrkToKeepBase = ['id','pt','eta','phi','n_hits_innermost','n_hits_pix','n_hits_sct','a0beam'] -hitDVTrkToKeep = [] -for var in hitDVTrkToKeepBase: - hitDVTrkToKeep.append('hitDVTrk_'+var) -hitDVTrkVars = '.'.join(hitDVTrkToKeep) - -hitDVSPToKeepBase = ['eta','r','phi','layer','isPix','isSct','usedTrkId'] -hitDVSPToKeep = [] -for var in hitDVSPToKeepBase: - hitDVSPToKeep.append('hitDVSP_'+var) -hitDVSPVars = '.'.join(hitDVSPToKeep) - hitDVToKeepBase = ['seed_eta','seed_phi','seed_type','n_track_qual','ly0_sp_frac','ly1_sp_frac','ly2_sp_frac','ly3_sp_frac','ly4_sp_frac','ly5_sp_frac','ly6_sp_frac','ly7_sp_frac','bdt_score'] hitDVToKeep = [] for var in hitDVToKeepBase: @@ -140,7 +128,8 @@ for var in dEdxHitToKeepBase: dEdxHitToKeep.append('dEdxHit_'+var) dEdxHitVars = '.'.join(dEdxHitToKeep) -HPtdEdxTrkToKeepBase = ['pt','eta','phi','dedx','dedx_n_usedhits','a0beam','n_hits_innermost','n_hits_inner','n_hits_pix','n_hits_sct'] +HPtdEdxTrkToKeepBase = ['pt','eta','phi','a0beam','dedx','n_hits_innermost','n_hits_inner','n_hits_pix','n_hits_sct', + 'n_hdedx_hits_1p45','n_hdedx_hits_1p50','n_hdedx_hits_1p55','n_hdedx_hits_1p60','n_hdedx_hits_1p65','n_hdedx_hits_1p70','n_hdedx_hits_1p75','n_hdedx_hits_1p80'] HPtdEdxTrkToKeep = [] for var in HPtdEdxTrkToKeepBase: HPtdEdxTrkToKeep.append('HPtdEdxTrk_'+var) @@ -153,7 +142,7 @@ DisTrkToKeepNoIso = ['pt','eta','phi','d0','z0','chi2','ndof','n_hits_innermost' 'ndofsum_br_ibl','ndofsum_br_pix1','ndofsum_br_pix2','ndofsum_br_pix3','ndofsum_br_sct1','ndofsum_br_sct2','ndofsum_br_sct3','ndofsum_br_sct4', 'n_brhits_good_ibl','n_brhits_good_pix1','n_brhits_good_pix2','n_brhits_good_pix3', 'n_brhits_good_sct1','n_brhits_good_sct2','n_brhits_good_sct3','n_brhits_good_sct4'] -DisTrkToKeepIso = ['iso1_dr01','iso1_dr02','iso1_dr04','iso2_dr01','iso2_dr02','iso2_dr04','iso3_dr01','iso3_dr02','iso3_dr04'] +DisTrkToKeepIso = ['category','is_fail','iso1_dr01','iso1_dr02','iso1_dr04','iso2_dr01','iso2_dr02','iso2_dr04','iso3_dr01','iso3_dr02','iso3_dr04'] DisTrkVars = [] for var in DisTrkToKeepNoIso: DisTrkVars.append('disTrkCand_'+var) @@ -787,11 +776,6 @@ TriggerHLTListRun3 = [ # UTT # hit-based displaced vertex - # commented out temporarly due to HLT truncation issue (ATR-23958) - #('xAOD::TrigCompositeContainer#HLT_HitDVTrk', 'BS ESD', 'ID'), - #('xAOD::TrigCompositeAuxContainer#HLT_HitDVTrkAux.'+hitDVTrkVars, 'BS ESD', 'ID'), - #('xAOD::TrigCompositeContainer#HLT_HitDVSP', 'BS ESD AODFULL', 'ID'), - #('xAOD::TrigCompositeAuxContainer#HLT_HitDVSPAux.'+hitDVSPVars, 'BS ESD AODFULL', 'ID'), ('xAOD::TrigCompositeContainer#HLT_HitDV', 'BS ESD AODFULL AODSLIM', 'ID'), ('xAOD::TrigCompositeAuxContainer#HLT_HitDVAux.'+hitDVVars, 'BS ESD AODFULL AODSLIM', 'ID'), diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/UnconventionalTracking/DisTrkTriggerConfiguration.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/UnconventionalTracking/DisTrkTriggerConfiguration.py index b4a9736a7bf61ae27898986e09eeb6b9f2ac785c..594823cd1957bb1eec260a1331a92c6c25eeb706 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/UnconventionalTracking/DisTrkTriggerConfiguration.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/UnconventionalTracking/DisTrkTriggerConfiguration.py @@ -8,14 +8,11 @@ log = logging.getLogger(__name__) def DisTrkTriggerHypoSequence(): - from TrigLongLivedParticlesHypo.TrigDisappearingTrackTriggerHypoTool import TrigDisappearingTrackTriggerHypoToolFromDict - from TrigLongLivedParticlesHypo.TrigLongLivedParticlesHypoConf import (TrigDisappearingTrackTriggerHypoAlg) - # Setup the hypothesis algorithm - theDisTrkTrackTriggerHypo = TrigDisappearingTrackTriggerHypoAlg("DisTrkTrack") + from TrigLongLivedParticlesHypo.TrigDisappearingTrackHypoConfig import TrigDisappearingTrackHypoToolFromDict + from TrigLongLivedParticlesHypo.TrigDisappearingTrackHypoConfig import createTrigDisappearingTrackHypoAlg - from TrigEDMConfig.TriggerEDMRun3 import recordable - theDisTrkTrackTriggerHypo.DisTrkBDTSel = recordable("HLT_DisTrkBDTSel") + theDisTrkHypo = createTrigDisappearingTrackHypoAlg("DisTrkTrack") from AthenaConfiguration.ComponentAccumulator import conf2toConfigurable from AthenaConfiguration.ComponentFactory import CompFactory @@ -25,6 +22,6 @@ def DisTrkTriggerHypoSequence(): log.debug("Building the Step dictinary for DisTrk") return MenuSequence( Sequence = seqAND("DisTrkEmptyStep",[DummyInputMakerAlg]), Maker = DummyInputMakerAlg, - Hypo = theDisTrkTrackTriggerHypo, - HypoToolGen = TrigDisappearingTrackTriggerHypoToolFromDict, + Hypo = theDisTrkHypo, + HypoToolGen = TrigDisappearingTrackHypoToolFromDict, ) diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/UnconventionalTracking/dEdxTriggerConfiguration.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/UnconventionalTracking/dEdxTriggerConfiguration.py index 2a1ade8c193f0069972b1b741490dfb2484c585a..ab3b3d7617b07678be0e59ec2fba02d24c566ae7 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/UnconventionalTracking/dEdxTriggerConfiguration.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/UnconventionalTracking/dEdxTriggerConfiguration.py @@ -8,23 +8,18 @@ log = logging.getLogger(__name__) def dEdxTriggerHypoSequence(): - from TrigLongLivedParticlesHypo.TrigdEdxTrackTriggerHypoTool import TrigdEdxTrackTriggerHypoToolFromDict - from TrigLongLivedParticlesHypo.TrigLongLivedParticlesHypoConf import (TrigdEdxTrackTriggerHypoAlg) - - # Setup the hypothesis algorithm - thedEdxTrackTriggerHypo = TrigdEdxTrackTriggerHypoAlg("dEdxTrack") - - from TrigEDMConfig.TriggerEDMRun3 import recordable - thedEdxTrackTriggerHypo.HPtdEdxTrk = recordable("HLT_HPtdEdxTrk") + from TrigLongLivedParticlesHypo.TrigdEdxTrackHypoConfig import TrigdEdxTrackHypoToolFromDict + from TrigLongLivedParticlesHypo.TrigdEdxTrackHypoConfig import createTrigdEdxTrackHypoAlg + + thedEdxTrackHypo = createTrigdEdxTrackHypoAlg("dEdxTrack") from AthenaConfiguration.ComponentAccumulator import conf2toConfigurable from AthenaConfiguration.ComponentFactory import CompFactory DummyInputMakerAlg = conf2toConfigurable(CompFactory.InputMakerForRoI( "IM_dEdxTrack_HypoOnlyStep" )) DummyInputMakerAlg.RoITool = conf2toConfigurable(CompFactory.ViewCreatorInitialROITool()) - log.debug("Building the Step dictinary for dEdx") return MenuSequence( Sequence = seqAND("dEdxEmptyStep",[DummyInputMakerAlg]), Maker = DummyInputMakerAlg, - Hypo = thedEdxTrackTriggerHypo, - HypoToolGen = TrigdEdxTrackTriggerHypoToolFromDict, - ) + Hypo = thedEdxTrackHypo, + HypoToolGen = TrigdEdxTrackHypoToolFromDict, + )