![]() |
![]() |
00001 00012 #include <vector> 00013 #include <string> 00014 #include <sstream> 00015 #include <iostream> 00016 #include <iomanip> 00017 #include <boost/foreach.hpp> 00018 00019 #include "DataFormats/Common/interface/Handle.h" 00020 #include "DataFormats/Common/interface/TriggerResults.h" 00021 #include "CondFormats/DataRecord/interface/AlCaRecoTriggerBitsRcd.h" 00022 #include "CondFormats/HLTObjects/interface/AlCaRecoTriggerBits.h" 00023 #include "FWCore/Framework/interface/ESHandle.h" 00024 #include "FWCore/Utilities/interface/Exception.h" 00025 #include "FWCore/MessageLogger/interface/MessageLogger.h" 00026 00027 #include "HLTrigger/HLTcore/interface/TriggerExpressionEvaluator.h" 00028 #include "HLTrigger/HLTcore/interface/TriggerExpressionParser.h" 00029 #include "HLTrigger/HLTfilters/interface/TriggerResultsFilterFromDB.h" 00030 00031 // 00032 // constructors and destructor 00033 // 00034 TriggerResultsFilterFromDB::TriggerResultsFilterFromDB(const edm::ParameterSet & config) : 00035 m_eventSetupPathsKey(config.getParameter<std::string>("eventSetupPathsKey")), 00036 m_eventSetupWatcher(), 00037 m_expression(0), 00038 m_eventCache(config) 00039 { 00040 } 00041 00042 TriggerResultsFilterFromDB::~TriggerResultsFilterFromDB() 00043 { 00044 delete m_expression; 00045 } 00046 00047 void TriggerResultsFilterFromDB::parse(const std::vector<std::string> & expressions) { 00048 // parse the logical expressions into functionals 00049 if (expressions.size() == 0) { 00050 edm::LogWarning("Configuration") << "Empty trigger results expression"; 00051 } else if (expressions.size() == 1) { 00052 parse( expressions[0] ); 00053 } else { 00054 std::stringstream expression; 00055 expression << "(" << expressions[0] << ")"; 00056 for (unsigned int i = 1; i < expressions.size(); ++i) 00057 expression << " OR (" << expressions[i] << ")"; 00058 parse( expression.str() ); 00059 } 00060 } 00061 00062 void TriggerResultsFilterFromDB::parse(const std::string & expression) { 00063 // parse the logical expressions into functionals 00064 m_expression = triggerExpression::parse( expression ); 00065 00066 // check if the expressions were parsed correctly 00067 if (not m_expression) 00068 edm::LogWarning("Configuration") << "Couldn't parse trigger results expression \"" << expression << "\""; 00069 } 00070 00071 // read the triggerConditions from the database 00072 void TriggerResultsFilterFromDB::pathsFromSetup(const edm::EventSetup & setup) 00073 { 00074 // Get map of strings to concatenated list of names of HLT paths from EventSetup: 00075 edm::ESHandle<AlCaRecoTriggerBits> triggerBits; 00076 setup.get<AlCaRecoTriggerBitsRcd>().get(triggerBits); 00077 typedef std::map<std::string, std::string> TriggerMap; 00078 const TriggerMap & triggerMap = triggerBits->m_alcarecoToTrig; 00079 00080 TriggerMap::const_iterator listIter = triggerMap.find(m_eventSetupPathsKey); 00081 if (listIter == triggerMap.end()) { 00082 throw cms::Exception("Configuration") << "TriggerResultsFilterFromDB [instance: " << * moduleLabel() 00083 << " - path: " << * pathName() 00084 << "]: No triggerList with key " << m_eventSetupPathsKey << " in AlCaRecoTriggerBitsRcd"; 00085 } 00086 00087 // avoid a map<string,vector<string> > in DB for performance reason, 00088 // the paths are mapped into one string that we have to decompose: 00089 parse( triggerBits->decompose(listIter->second) ); 00090 } 00091 00092 bool TriggerResultsFilterFromDB::filter(edm::Event & event, const edm::EventSetup & setup) 00093 { 00094 // if the IOV has changed, re-read the triggerConditions from the database 00095 if (m_eventSetupWatcher.check(setup)) 00096 pathsFromSetup(setup); 00097 00098 if (not m_expression) 00099 // no valid expression has been parsed 00100 return false; 00101 00102 if (not m_eventCache.setEvent(event, setup)) 00103 // couldn't properly access all information from the Event 00104 return false; 00105 00106 // if the L1 or HLT configurations have changed, (re)initialize the filters (including during the first event) 00107 if (m_eventCache.configurationUpdated()) { 00108 m_expression->init(m_eventCache); 00109 00110 // log the expanded configuration 00111 edm::LogInfo("Configuration") << "TriggerResultsFilterFromDB configuration updated: " << *m_expression; 00112 } 00113 00114 // run the trigger results filter 00115 return (*m_expression)(m_eventCache); 00116 } 00117 00118 // register as framework plugin 00119 #include "FWCore/Framework/interface/MakerMacros.h" 00120 DEFINE_FWK_MODULE(TriggerResultsFilterFromDB);