diff --git a/Trigger/TrigHypothesis/TrigCaloHypo/TrigCaloHypo/TrigL2JetHypo.h b/Trigger/TrigHypothesis/TrigCaloHypo/TrigCaloHypo/TrigL2JetHypo.h new file mode 100644 index 0000000000000000000000000000000000000000..c1d0fff500e9365f02a83e0bdd43aa1345f391d6 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigCaloHypo/TrigCaloHypo/TrigL2JetHypo.h @@ -0,0 +1,115 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef TRIGL2JETHYPO_H +#define TRIGL2JETHYPO_H +///////////////////////////////////////////////////////////////////////////////////////////////////// +/// Name : TrigL2JetHypo.h +/// Package : Trigger/TrigHypothesis/TrigCaloHypo/ +/// Author : Ester Segura (segura@ifae.es) +/// Created : June 2006 +/// +/// DESCRIPTION: simple hypo algorithms for Lvl2 Jet, cut on energy +/// +/////////////////////////////////////////////////////////////////////////////////////////////////////// +#include <vector> + +#include "TrigInterfaces/HypoAlgo.h" +#include "TrigTimeAlgs/TrigTimerSvc.h" + +class StoreGateSvc; +class TriggerElement; + +class TrigL2JetHypo : public HLT::HypoAlgo { + + public: + + TrigL2JetHypo(const std::string& name, ISvcLocator* pSvcLocator); + ~TrigL2JetHypo(); + + HLT::ErrorCode hltInitialize(); + HLT::ErrorCode hltFinalize(); + HLT::ErrorCode hltExecute(const HLT::TriggerElement* outputTE, bool& pass); + + + private: + + // define the properties: + //---------------------------- + + // Cuts to be applied: + + double m_EtCut_L2; + + int m_accepted_L2; + int m_rejected_L2; + int m_errors_L2; + + // Switch to accept all the events. + + bool m_acceptAll; + + // Switch on Monitoring: + + bool m_doMonitoring; + + // cleaning: + // --------- + // flags (do specific jet cleaning or don't): + bool m_doHECfnLeadingCellsCleaning; + bool m_doEMfJetQualityCleaning; + bool m_doHECfJetQualityCleaning; + bool m_doTimeQualityCleaning; + bool m_doEMfCleaningHighEta; + bool m_doEMfCleaningLowEta; + bool m_applyCleaningToHighEtJets; + bool m_applyCleaningToLowEtJets; + // depending on the flags m_applyCleaningToHighEtJets and m_applyCleaningToLowEtJets, the cleaning + // is only applied to jets with Et > cleaningLowEtThreshold and/or Et < cleaningHighEtThreshold. + float m_cleaningLowEtThreshold; // in MeV + float m_cleaningHighEtThreshold; // in MeV + // thresholds for cleaning cuts: + int m_leadingCellsThr; // threshold for number of leading cells in hecf > m_leadingCellsThr && nLeadingCells <= m_leadingCellsThr cut + float m_hecfThrN; // hecf threshold for cut in combination with nLeadingCells (i.e. hecf > m_leadingCellsThr && nLeadingCells <= m_leadingCellsThr) + float m_hecfThrQ; // hecf threshold for cut in combination with jet Quality (i.e. hecf > m_hecfThrQ && |quality| > m_jetQualityThrH) + float m_jetQualityThrH; // quality threshold for cut in combination with hecf (i.e. hecf > m_hecfThrQ && |quality| > m_jetQualityThrH) + float m_jetQualityThrE; // quality threshold for cut in combination with emf (i.e. emf > m_emfThrQ && |quality| > m_jetQualityThrE && |eta| < m_etaThrEmfQ) + float m_emfThrQ; // emf threshold for cut in combination with m_jetQualityThrE (i.e. emf > m_emfThrQ && |quality| > m_jetQualityThrE && |eta| < m_etaThrEmfQ) + float m_etaThrEmfQ; // eta threshold for cut in combination with m_jetQualityThrE (i.e. emf > m_emfThrQ && |quality| > m_jetQualityThrE && |eta| < m_etaThrEmfQ) + float m_emfThrEmfHighEta; // emf threshold for cut at high eta (i.e. emf < m_emfThrEmfHighEta && |eta| >= m_etaThrEmfHighEta) + float m_etaThrEmfHighEta; // eta threshold for cut at high eta (i.e. emf < m_emfThrEmfHighEta && |eta| >= m_etaThrEmfHighEta) + float m_emfThrEmfLowEta; // emf threshold for cut at low eta (i.e. emf < m_emfThrEmfLowEta && |eta| < m_etaThrEmfLowEta) + float m_etaThrEmfLowEta; // eta threshold for cut at low eta (i.e. emf < m_emfThrEmfLowEta && |eta| < m_etaThrEmfLowEta) + float m_timeThrTimeQuality; // time threshold for identification of out-of-time jets (i.e. |time| > m_timeThrTimeQuality && |quality| > m_qualityThrTimeQuality) + float m_qualityThrTimeQuality; // quality threshold for identification of out-of-time jets (i.e. |time| > m_timeThrTimeQuality && |quality| > m_qualityThrTimeQuality) + + // basic cleaning default for every chain + bool m_doBasicCleaning; + float m_n90Threshold; + float m_presamplerThreshold; + float m_negativeEThreshold; + + int m_cutCounter; + double m_e; // total energy of the jet after calibration + double m_et; + double m_eta; + double m_phi; + // cleaning: + float m_hecf; + int m_nLeadingCells; + float m_emf; + float m_jetQuality; + float m_jetTimeCells; + + // Histogram Service: + //IHistogramSvc* m_histsvc; + + //StoreGateSvc* m_storeGate; + + // Timing: + + ITrigTimerSvc* m_timersvc; + std::vector<TrigTimer*> m_timers; +}; +#endif diff --git a/Trigger/TrigHypothesis/TrigCaloHypo/python/TrigCaloHypoConfig.py b/Trigger/TrigHypothesis/TrigCaloHypo/python/TrigCaloHypoConfig.py index ecc372f6ab96dc1626a3afcf5beedbea225d6981..c70c6b8101a9913de882d5b77c379b765df21444 100644 --- a/Trigger/TrigHypothesis/TrigCaloHypo/python/TrigCaloHypoConfig.py +++ b/Trigger/TrigHypothesis/TrigCaloHypo/python/TrigCaloHypoConfig.py @@ -14,3 +14,36 @@ class EFCaloHypoNoiseConfig (TrigEFCaloHypoNoise): self.BadFEBCut=3 theLArNoisyROTool=LArNoisyROTool(SaturatedCellTightCut=20,MNBLooseCut=5,MNBTightCut=17) self.NoiseTool = theLArNoisyROTool + +from TrigJetHypo.TrigJetHypoConf import TrigL2JetHypo + +class L2JetHypoBase (TrigL2JetHypo): + __slots__ = [] + def __init__(self, name): + super( L2JetHypoBase, self ).__init__( name ) + + #validation = TrigL2JetHypoValidationMonitoring() + #online = TrigL2JetHypoOnlineMonitoring() + #cosmic = TrigL2JetHypoCosmicMonitoring() + + from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig + time = TrigTimeHistToolConfig("L2JetHypo_Time") + + self.AthenaMonTools = [ time ] + + # switch on basic cleaning by default for all chains + self.n90CleaningThreshold = 2 + self.presamplerCleaningThreshold = 0.9 + +class L2JetHypo (L2JetHypoBase): + __slots__ = [] + def __init__(self, name = "L2JetHypo",l2_thr=20*GeV): + super( L2JetHypo, self ).__init__( name ) + + self.Etcut_L2 = l2_thr + self.doHECfnLeadingCellsCleaning = False + self.doEMfJetQualityCleaning = False + self.doHECfJetQualityCleaning = False + self.doTimeQualityCleaning = False + self.doEMfCleaningHighEta = False + self.doEMfCleaningLowEta = False diff --git a/Trigger/TrigHypothesis/TrigCaloHypo/src/TrigL2JetHypo.cxx b/Trigger/TrigHypothesis/TrigCaloHypo/src/TrigL2JetHypo.cxx new file mode 100644 index 0000000000000000000000000000000000000000..a7447e5d71918288d273d0a7ee7f472edeee9739 --- /dev/null +++ b/Trigger/TrigHypothesis/TrigCaloHypo/src/TrigL2JetHypo.cxx @@ -0,0 +1,336 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// ******************************************************************** +// +// NAME: TrigL2JetHypo.cxx +// PACKAGE: Trigger/TrigHypothesis/TrigCaloHypo +// +// AUTHOR: +// +// ******************************************************************** + +#include "GaudiKernel/MsgStream.h" +#include "GaudiKernel/IToolSvc.h" +#include "GaudiKernel/StatusCode.h" + +//#include "TrigSteeringEvent/TriggerElement.h" + +#include "TrigSteeringEvent/TrigRoiDescriptor.h" + +#include "TrigCaloEvent/TrigT2Jet.h" +//#include "TrigCaloEvent/TrigT2JetContainer.h" // Not needed anymore + +#include "TrigCaloHypo/TrigL2JetHypo.h" + +#include "CLHEP/Units/SystemOfUnits.h" + +class ISvcLocator; + +///////////////////////////////////////////////////////////////////// +// CONSTRUCTOR: +///////////////////////////////////////////////////////////////////// +// +TrigL2JetHypo::TrigL2JetHypo(const std::string& name, ISvcLocator* pSvcLocator): + HLT::HypoAlgo(name, pSvcLocator) { + + declareProperty("Etcut_L2", m_EtCut_L2 = 20*CLHEP::GeV, "cut value for L2 jet et"); // Default: 20 GeV + declareProperty("doMonitoring_L2", m_doMonitoring = false, "switch on/off monitoring" ); + declareProperty("AcceptAll", m_acceptAll=false); + //declareProperty("histoPath", m_path = "/stat/Monitoring/EventFilter" ); + + // cleaning: + // -------- + // flags to set which jet cleaning cuts are to be applied + declareProperty("doHECfnLeadingCellsCleaning", m_doHECfnLeadingCellsCleaning = false); + declareProperty("doEMfJetQualityCleaning", m_doEMfJetQualityCleaning = false); + declareProperty("doHECfJetQualityCleaning", m_doHECfJetQualityCleaning = false); + declareProperty("doTimeQualityCleaning", m_doTimeQualityCleaning = false); + declareProperty("doEMfCleaningHighEta", m_doEMfCleaningHighEta = false); + declareProperty("doEMfCleaningLowEta", m_doEMfCleaningLowEta = false); + declareProperty("applyCleaningToHighEtJets", m_applyCleaningToHighEtJets = true); + declareProperty("applyCleaningToLowEtJets", m_applyCleaningToLowEtJets = true); + // Et-threshold: if(applyCleaningToHighEtJets==false) then don't apply cleaning cuts to jets with Et > highEtThreshold: + declareProperty("cleaningHighEtThreshold", m_cleaningHighEtThreshold = 1000.*CLHEP::GeV); + // Et-threshold: if(applyCleaningToLowEtJets==false) then don't apply cleaning cuts to jets with Et < lowEtThreshold: + declareProperty("cleaningLowEtThreshold", m_cleaningLowEtThreshold = 20.*CLHEP::GeV); + // threshold for number of leading cells in hecf > m_leadingCellsThr && nLeadingCells <= m_leadingCellsThr cut: + declareProperty("leadingCellsThr", m_leadingCellsThr = 1); + // hecf threshold for cut in combination with nLeadingCells (i.e. hecf > m_hecfThrN && nLeadingCells <= m_leadingCellsThr): + declareProperty("hecfThrN", m_hecfThrN = 0.9); + // hecf threshold for cut in combination with jet Quality (i.e. hecf > m_hecfThrQ && |quality| > m_jetQualityThrH): + declareProperty("hecfThrQ", m_hecfThrQ = 0.8); + // quality threshold for cut in combination with hecf (i.e. hecf > m_hecfThrQ && |quality| > m_jetQualityThrH): + declareProperty("jetQualityThrH", m_jetQualityThrH= 0.8); + // quality threshold for cut in combination with emf (i.e. emf > m_emfThrQ && |quality| > m_jetQualityThrE): + declareProperty("jetQualityThrE", m_jetQualityThrE = 0.9); + // emf threshold for cut in combination with m_jetQualityThrE (i.e. emf > m_emfThrQ && |quality| > m_jetQualityThrE): + declareProperty("emfThrQ", m_emfThrQ = 0.99); + // eta threshold for cut in combination with m_jetQualityThrE (i.e. emf > m_emfThrQ && |quality| > m_jetQualityThrE && |eta| < m_etaThrEmfQ) + declareProperty("etaThrEmfQ", m_etaThrEmfQ = 2.7); + // emf threshold for emf cut at high eta (i.e. emf < m_emfThrE && |eta| >= m_etaThrEemf): + declareProperty("emfThrEmfHighEta", m_emfThrEmfHighEta = 0.02); + // eta threshold for emf cut at high eta (i.e. emf < m_emfThrE && |eta| >= m_etaThrEemf): + declareProperty("etaThrEmfHighEta", m_etaThrEmfHighEta = 2.1); + // emf threshold for emf cut at low eta (i.e. emf < m_emfThrE && |eta| < m_etaThrEemf): + declareProperty("emfThrEmfLowEta", m_emfThrEmfLowEta = 0.01); + // eta threshold for emf cut at low eta (i.e. emf < m_emfThrE && |eta| < m_etaThrEemf): + declareProperty("etaThrEmfLowEta", m_etaThrEmfLowEta = 2.1); + // time threshold for identification of out-of-time jets (i.e. |time| > m_timeThrTimeQuality && |quality| > m_qualityThrTimeQuality): + declareProperty("timeThrTimeQuality", m_timeThrTimeQuality = 35.); + // quality threshold for identification of out-of-time jets (i.e. |time| > m_timeThrTimeQuality && |quality| > m_qualityThrTimeQuality): + declareProperty("qualityThrTimeQuality", m_qualityThrTimeQuality = 0.5); + + // basic cleaning + declareProperty("doBasicCleaning", m_doBasicCleaning = false ); + + declareProperty("n90CleaningThreshold", m_n90Threshold = 2 ); + declareProperty("presamplerCleaningThreshold", m_presamplerThreshold = 0.9 ); + declareProperty("negativeECleaningThreshold", m_negativeEThreshold = -60e3 ); // 60 GeV + + + declareMonitoredVariable("CutCounter", m_cutCounter); + declareMonitoredVariable("E", m_e); + declareMonitoredVariable("Et", m_et); + declareMonitoredVariable("Eta", m_eta); + declareMonitoredVariable("Phi", m_phi); + // cleaning: + declareMonitoredVariable("HECf", m_hecf); + declareMonitoredVariable("nLeadingCells", m_nLeadingCells); + declareMonitoredVariable("EMf", m_emf); + declareMonitoredVariable("jetQuality", m_jetQuality); + declareMonitoredVariable("jetTimeCells", m_jetTimeCells); + +} +///////////////////////////////////////////////////////////////////// +// DESTRUCTOR: +///////////////////////////////////////////////////////////////////// +// +TrigL2JetHypo::~TrigL2JetHypo() +{ } + +// ---------------------------------------------------------------------- +HLT::ErrorCode TrigL2JetHypo::hltInitialize() +// ---------------------------------------------------------------------- +{ + msg() << MSG::INFO << "in initialize()" << endmsg; + + // Initialize timing service + //------------------------------ + if( service( "TrigTimerSvc", m_timersvc).isFailure() ) { + msg() << MSG::WARNING << name() + << ": Unable to locate TrigTimer Service" << endmsg; + } + if (m_timersvc) { + + TrigTimer* tmp = m_timersvc->addItem("TrigL2JetHypo.TrigL2JetHypoTot"); + m_timers.push_back(tmp); + } + + m_accepted_L2=0; + m_rejected_L2=0; + m_errors_L2=0; + + return HLT::OK; +} + +// ---------------------------------------------------------------------- +HLT::ErrorCode TrigL2JetHypo::hltFinalize(){ +// ---------------------------------------------------------------------- + + msg() << MSG::INFO << "in finalize()" << endmsg; + msg() << MSG::INFO << "Events (Lvl2) accepted/rejected/errors: "<< m_accepted_L2 <<" / "<<m_rejected_L2<< " / "<< m_errors_L2<< endmsg; + + return HLT::OK; +} + +// ---------------------------------------------------------------------- +HLT::ErrorCode TrigL2JetHypo::hltExecute(const HLT::TriggerElement* outputTE, bool& pass) { +// ---------------------------------------------------------------------- + + // Time total TrigL2JetHypo execution time. + + if (m_timersvc) m_timers[0]->start(); + + m_cutCounter = -1; + m_e = -99; + m_et = -99; + m_eta = -99; + m_phi = -99; + m_hecf = -99; + m_nLeadingCells = -99; + m_emf = -99; + m_jetQuality = -99; + m_jetTimeCells = -999; + + pass=false; + + // get the trigger element and extract the RoI information + + if(msgLvl() <= MSG::DEBUG) { // pure debug purposes... + const TrigRoiDescriptor* roiDescriptor = 0; + if ( getFeature(outputTE, roiDescriptor, "a_label")==HLT::OK ) { + if ( roiDescriptor ) { + msg() << MSG::DEBUG << "REGTEST: RoI id " << roiDescriptor->roiId() + << " located at phi = " << roiDescriptor->phi() << ", eta = " << roiDescriptor->eta() << endmsg; + } else { + msg() << MSG::DEBUG << "Failed to find RoiDescriptor " << endmsg; + } + } else { + msg() << MSG::DEBUG << "Failed to find RoiDescriptor " << endmsg; + } + } + + std::vector<const TrigT2Jet*> vectorOfJets; + + HLT::ErrorCode ec = getFeatures(outputTE, vectorOfJets); + + if(ec!=HLT::OK) { + msg() << MSG::WARNING << " Failed to get the L2 Jets " << endmsg; + if (m_timersvc) m_timers[0]->stop(); + return ec; + } + + m_cutCounter = 0; + + // Check that there is only one JETROI. + // We only expect ONE input RoI. + if (vectorOfJets.size() != 1){ + msg() << MSG::ERROR << "The number of Jets attached to the TE is not 1" << endmsg; + m_errors_L2++; + if (m_acceptAll) m_cutCounter = 1; + if (m_timersvc) m_timers[0]->stop(); + return HLT::OK; + } + + // Get first (and only) RoI: + const TrigT2Jet* pJet = vectorOfJets.back(); + if(!pJet){ + msg() << MSG::ERROR << "Retrieval of RoI from vector failed" << endmsg; + m_errors_L2++; + if (m_acceptAll) m_cutCounter = 1; + if (m_timersvc) m_timers[0]->stop(); + return HLT::OK; + } + + // Build the "uses" relation for the outputTE to the Cluster: + //sc = writeHistoryOfTE(outputTE, uses, pJet); + /*if (!sc){ + log << MSG::ERROR + << "Write of TrigT2Jet into outputTE failed" + << endmsg; + return StatusCode::FAILURE; + } */ // Not used anymore. + + //double etjet = pJet->e(); + double etjet = pJet->et(); + + if(msgLvl() <= MSG::DEBUG) msg() << MSG::DEBUG << "Jet energy (L2): " << etjet << endmsg; + + // --------------------------------------------------------- + // jet cleaning: + // ============= + // global flag cleaningVeto: if this flag is set to true, + // the hypo will reject the event (if in addition m_acceptAll == false) + bool cleaningVeto = false; + + // depending on the values of the two flags applyCleaningToHighEtJets and applyCleaningToLowEtJets, the cleaning + // is only applied to jets with Et > cleaningLowEtThreshold and/or Et < cleaningHighEtThreshold. + bool applyCleaning = true; + + if(m_applyCleaningToHighEtJets == false && etjet > m_cleaningHighEtThreshold){ + applyCleaning = false; + } + else if(m_applyCleaningToLowEtJets == false && etjet < m_cleaningLowEtThreshold){ // else if construct for performance + applyCleaning = false; + } + + if(applyCleaning == true){ + // n90 and hecfraction cut: + if( m_doHECfnLeadingCellsCleaning == true && pJet->nLeadingCells() <= m_leadingCellsThr && pJet->hecf() > m_hecfThrN ){ + cleaningVeto = true; + } + // else if constructs for performance (once cleaning veto is true, the decision to reject the jet is taken) + // bad quality in EMC: + else if( m_doEMfJetQualityCleaning == true && + pJet->emf() > m_emfThrQ && fabs(pJet->jetQuality()) > m_jetQualityThrE && fabs(pJet->eta()) < m_etaThrEmfQ ){ + cleaningVeto = true; + } + // bad quality in HEC + else if( m_doHECfJetQualityCleaning == true && pJet->hecf() > m_hecfThrQ && fabs(pJet->jetQuality()) > m_jetQualityThrH ){ + cleaningVeto = true; + } + // out-of-time jets + else if( m_doTimeQualityCleaning == true && + fabs(pJet->jetTimeCells()) > m_timeThrTimeQuality && fabs(pJet->jetQuality()) > m_qualityThrTimeQuality ){ + cleaningVeto = true; + } + // very small fraction of energy in EMC at high eta: + else if(m_doEMfCleaningHighEta == true && pJet->emf() < m_emfThrEmfHighEta && fabs(pJet->eta()) >= m_etaThrEmfHighEta ){ + cleaningVeto = true; + } + // very small fraction of energy in EMC at low eta: + else if(m_doEMfCleaningLowEta == true && pJet->emf() < m_emfThrEmfLowEta && fabs(pJet->eta()) < m_etaThrEmfLowEta ){ + cleaningVeto = true; + } + } + + if(m_doBasicCleaning) + { + if(pJet->nLeadingCells() < m_n90Threshold) + { + msg() << MSG::DEBUG << " L2 basic jet cleaning: n90 < " << m_n90Threshold << endmsg; + cleaningVeto = true; + } + +/* if(pJet->presamplerFraction() > m_presamplerThreshold) + { + msg() << MSG::DEBUG << " L2 basic jet cleaning: presampler fraction > " << m_presamplerThreshold << endmsg; + cleaningVeto = true; + } + + if(pJet->?() < m_negativeEThreshold) + { + msg() << MSG::DEBUG << " EF jet cleaning: Negative energy < " << m_negativeEThreshold << endmsg; + cleaningVeto = true; + }*/ + } + // end of jet cleaning + // --------------------------------------------------------- + + // Et and Jet Quality Cut + if( (etjet > m_EtCut_L2 && cleaningVeto == false) || m_acceptAll) { + pass = true; + m_accepted_L2++; + m_cutCounter=1; + + if ( etjet > m_EtCut_L2 && cleaningVeto == false) { + m_e = pJet->e(); + m_eta = pJet->eta(); + m_phi = pJet->phi(); + m_et = m_e/cosh(m_eta); + // monitor cleaning variables: + m_emf = pJet->emf(); + m_hecf = pJet->hecf(); + m_nLeadingCells = pJet->nLeadingCells(); + m_jetQuality = pJet-> jetQuality(); + m_jetTimeCells = pJet-> jetTimeCells(); + } + + if(msgLvl() <= MSG::DEBUG) msg() << MSG::DEBUG << " Event accepted ! " << endmsg; + } else { + m_rejected_L2++; + if(msgLvl() <= MSG::DEBUG) msg() << MSG::DEBUG << " Event rejected !" << endmsg; + } + + //m_cutCounter>1 not yet implemented + + // Time total TrigL2JetHypo execution time. + // ------------------------------------- + + if (m_timersvc) m_timers[0]->stop(); + + return HLT::OK; + +} diff --git a/Trigger/TrigHypothesis/TrigCaloHypo/src/components/TrigCaloHypo_entries.cxx b/Trigger/TrigHypothesis/TrigCaloHypo/src/components/TrigCaloHypo_entries.cxx index c189df1945ec9e697b35441a9314d0dbd1c2cfcb..856b1564af2f88ad5ee649c269fb70737c91cb7c 100644 --- a/Trigger/TrigHypothesis/TrigCaloHypo/src/components/TrigCaloHypo_entries.cxx +++ b/Trigger/TrigHypothesis/TrigCaloHypo/src/components/TrigCaloHypo_entries.cxx @@ -1,12 +1,15 @@ #include "TrigCaloHypo/TrigEFCaloHypoNoise.h" +#include "TrigCaloHypo/TrigL2JetHypo.h" #include "GaudiKernel/DeclareFactoryEntries.h" DECLARE_ALGORITHM_FACTORY( TrigEFCaloHypoNoise ) +DECLARE_ALGORITHM_FACTORY( TrigL2JetHypo ) DECLARE_FACTORY_ENTRIES( TrigCaloHypo ) { DECLARE_ALGORITHM( TrigEFCaloHypoNoise ) + DECLARE_ALGORITHM( TrigL2JetHypo ) }