CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/FWCore/Common/src/EventBase.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:     FWCore/Common
00004 // Class  :     EventBase
00005 // 
00006 // Implementation:
00007 //     <Notes on implementation>
00008 //
00009 // Original Author:  Chris Jones
00010 //         Created:  Thu Aug 27 11:20:06 CDT 2009
00011 //
00012 
00013 // system include files
00014 #include <vector>
00015 #include <map>
00016 
00017 // user include files
00018 #include "FWCore/Common/interface/EventBase.h"
00019 #include "FWCore/Common/interface/TriggerNames.h"
00020 #include "DataFormats/Provenance/interface/ParameterSetID.h"
00021 #include "DataFormats/Common/interface/TriggerResults.h"
00022 #include "FWCore/Utilities/interface/Exception.h"
00023 #include "FWCore/Utilities/interface/ThreadSafeRegistry.h"
00024 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00025 #include "FWCore/ParameterSet/interface/Registry.h"
00026 
00027 namespace edm
00028 {
00029    typedef std::map<edm::ParameterSetID, edm::TriggerNames> TriggerNamesMap;
00030    static TriggerNamesMap triggerNamesMap;
00031    static TriggerNamesMap::const_iterator previousTriggerName;
00032 
00033    EventBase::EventBase()
00034    {
00035    }
00036 
00037    EventBase::~EventBase()
00038    {
00039    }
00040 
00041    TriggerNames const*
00042    EventBase::triggerNames_(edm::TriggerResults const& triggerResults) {
00043 
00044       // If the current and previous requests are for the same TriggerNames
00045       // then just return it.  
00046       if (!triggerNamesMap.empty() &&
00047           previousTriggerName->first == triggerResults.parameterSetID()) {
00048          return &previousTriggerName->second;
00049       }
00050 
00051       // If TriggerNames was already created and cached here in the map,
00052       // then look it up and return that one
00053       TriggerNamesMap::const_iterator iter =
00054          triggerNamesMap.find(triggerResults.parameterSetID());
00055       if (iter != triggerNamesMap.end()) {
00056          previousTriggerName = iter;
00057          return &iter->second;
00058       }
00059 
00060       // Look for the parameter set containing the trigger names in the parameter
00061       // set registry using the ID from TriggerResults as the key used to find it.
00062       edm::pset::Registry* psetRegistry = edm::pset::Registry::instance();
00063       edm::ParameterSet const* pset=0;
00064       if (0!=(pset=psetRegistry->getMapped(triggerResults.parameterSetID()))) {
00065 
00066          if (pset->existsAs<std::vector<std::string> >("@trigger_paths", true)) {
00067             TriggerNames triggerNames(*pset);
00068 
00069             // This should never happen
00070             if (triggerNames.size() != triggerResults.size()) {
00071                throw cms::Exception("LogicError")
00072                   << "edm::EventBase::triggerNames_ Encountered vector\n"
00073                      "of trigger names and a TriggerResults object with\n"
00074                      "different sizes.  This should be impossible.\n"
00075                      "Please send information to reproduce this problem to\n"
00076                      "the edm developers.\n";
00077             }
00078 
00079             std::pair<TriggerNamesMap::iterator, bool> ret =
00080                triggerNamesMap.insert(std::pair<edm::ParameterSetID, edm::TriggerNames>(triggerResults.parameterSetID(), triggerNames));
00081             previousTriggerName = ret.first;
00082             return &(ret.first->second);
00083          }
00084       }
00085       // For backward compatibility to very old data
00086       if (triggerResults.getTriggerNames().size() > 0U) {
00087          edm::ParameterSet fakePset;
00088          fakePset.addParameter<std::vector<std::string> >("@trigger_paths", triggerResults.getTriggerNames());
00089          fakePset.registerIt();
00090          TriggerNames triggerNames(fakePset);
00091 
00092          // This should never happen
00093          if (triggerNames.size() != triggerResults.size()) {
00094             throw cms::Exception("LogicError")
00095                << "edm::EventBase::triggerNames_ Encountered vector\n"
00096                   "of trigger names and a TriggerResults object with\n"
00097                   "different sizes.  This should be impossible.\n"
00098                   "Please send information to reproduce this problem to\n"
00099                   "the edm developers (2).\n";
00100          }
00101 
00102          std::pair<TriggerNamesMap::iterator, bool> ret =
00103             triggerNamesMap.insert(std::pair<edm::ParameterSetID, edm::TriggerNames>(fakePset.id(), triggerNames));
00104          previousTriggerName = ret.first;
00105          return &(ret.first->second);
00106       }
00107       return 0;
00108    }
00109 }