CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/HLTrigger/HLTfilters/src/TriggerResultsFilterFromDB.cc

Go to the documentation of this file.
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);