Go to the documentation of this file.00001 #include "FWCore/Common/interface/TriggerNames.h"
00002 #include "FWCore/Common/interface/TriggerResultsByName.h"
00003 #include "CommonTools/TriggerUtils/interface/CandidateTriggerObjectProducer.h"
00004 #include "DataFormats/Candidate/interface/CandidateFwd.h"
00005 #include "DataFormats/Candidate/interface/Candidate.h"
00006 #include "DataFormats/Candidate/interface/LeafCandidate.h"
00007 #include "TString.h"
00008 #include "TRegexp.h"
00009 #include <cassert>
00010
00011 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00012
00013
00014
00015 CandidateTriggerObjectProducer::CandidateTriggerObjectProducer(const edm::ParameterSet& ps) :
00016 triggerResultsTag_(ps.getParameter<edm::InputTag>("triggerResults")),
00017 triggerEventTag_(ps.getParameter<edm::InputTag>("triggerEvent")),
00018 triggerName_(ps.getParameter<std::string>("triggerName"))
00019 {
00020 using namespace edm;
00021
00022
00023
00024
00025
00026 produces<reco::CandidateCollection>();
00027
00028 }
00029
00030 CandidateTriggerObjectProducer::~CandidateTriggerObjectProducer()
00031 {
00032 }
00033
00034
00035
00036
00037 void
00038 CandidateTriggerObjectProducer::beginRun(edm::Run& iRun, edm::EventSetup const& iSetup)
00039 {
00040 using namespace edm;
00041
00042 bool changed(false);
00043 if(!hltConfig_.init(iRun,iSetup,triggerEventTag_.process(),changed) ){
00044 edm::LogError( "CandidateTriggerObjectProducer" ) <<
00045 "Error! Can't initialize HLTConfigProvider";
00046 throw cms::Exception("HLTConfigProvider::init() returned non 0");
00047 }
00048
00049 return;
00050
00051 }
00052
00053
00054 void
00055 CandidateTriggerObjectProducer::produce(edm::Event & iEvent, const edm::EventSetup & iSetup)
00056 {
00057 using namespace edm;
00058 using namespace reco;
00059 using namespace trigger;
00060
00061 std::auto_ptr<reco::CandidateCollection> coll( new reco::CandidateCollection );
00062
00063
00064 iEvent.getByLabel(triggerResultsTag_,triggerResultsHandle_);
00065 if (!triggerResultsHandle_.isValid()) {
00066 edm::LogError( "CandidateTriggerObjectProducer" ) << "CandidateTriggerObjectProducer::analyze: Error in getting TriggerResults product from Event!" ;
00067 return;
00068 }
00069 iEvent.getByLabel(triggerEventTag_,triggerEventHandle_);
00070 if (!triggerEventHandle_.isValid()) {
00071 edm::LogError( "CandidateTriggerObjectProducer" ) << "CandidateTriggerObjectProducer::analyze: Error in getting TriggerEvent product from Event!" ;
00072 return;
00073 }
00074
00075
00076
00077 assert(triggerResultsHandle_->size()==hltConfig_.size());
00078
00079 const unsigned int n(hltConfig_.size());
00080 std::vector<std::string> activeHLTPathsInThisEvent = hltConfig_.triggerNames();
00081 std::map<std::string, bool> triggerInMenu;
00082 std::map<std::string, bool> triggerUnprescaled;
00083
00084 for (std::vector<std::string>::const_iterator iHLT = activeHLTPathsInThisEvent.begin();
00085 iHLT != activeHLTPathsInThisEvent.end(); ++iHLT)
00086 {
00087
00088 if (TString(*iHLT).Contains(TRegexp(TString(triggerName_))))
00089 {
00090 triggerInMenu[*iHLT] = true;
00091 const std::pair<int,int> prescales(hltConfig_.prescaleValues(iEvent,iSetup,*iHLT));
00092 if (prescales.first * prescales.second == 1)
00093 triggerUnprescaled[*iHLT] = true;
00094 }
00095 }
00096
00097 for (std::map<std::string, bool>::const_iterator iMyHLT = triggerInMenu.begin();
00098 iMyHLT != triggerInMenu.end(); ++iMyHLT)
00099 {
00100
00101 if (!(iMyHLT->second && triggerUnprescaled[iMyHLT->first]))
00102 continue;
00103 const unsigned int triggerIndex(hltConfig_.triggerIndex(iMyHLT->first));
00104
00105 assert(triggerIndex==iEvent.triggerNames(*triggerResultsHandle_).triggerIndex(iMyHLT->first));
00106
00107
00108 if (triggerIndex>=n) {
00109 edm::LogError( "CandidateTriggerObjectProducer" ) << "CandidateTriggerObjectProducer::analyzeTrigger: path "
00110 << triggerName_ << " - not found!" ;
00111 return;
00112 }
00113
00114
00115
00116 const std::vector<std::string>& moduleLabels(hltConfig_.saveTagsModules(triggerIndex));
00117
00118
00119 if (!(triggerResultsHandle_->wasrun(triggerIndex)) ||
00120 !(triggerResultsHandle_->accept(triggerIndex)) ||
00121 (triggerResultsHandle_->error(triggerIndex)))
00122 {
00123 continue;
00124 }
00125
00126
00127
00128
00129
00130
00131 for (unsigned int imodule=0;imodule<moduleLabels.size();++imodule)
00132 {
00133 const std::string& moduleLabel(moduleLabels[imodule]);
00134 const std::string moduleType(hltConfig_.moduleType(moduleLabel));
00135
00136 if (moduleType.find("Level1GTSeed") != std::string::npos)
00137 continue;
00138
00139 const unsigned int filterIndex(triggerEventHandle_->filterIndex(InputTag(moduleLabel,"",triggerEventTag_.process())));
00140 if (filterIndex<triggerEventHandle_->sizeFilters()) {
00141
00142 const Vids& VIDS (triggerEventHandle_->filterIds(filterIndex));
00143 const Keys& KEYS(triggerEventHandle_->filterKeys(filterIndex));
00144 const size_type nI(VIDS.size());
00145 const size_type nK(KEYS.size());
00146 assert(nI==nK);
00147 const size_type n(std::max(nI,nK));
00148
00149 const TriggerObjectCollection& TOC(triggerEventHandle_->getObjects());
00150 for (size_type i=0; i!=n; ++i) {
00151 const TriggerObject& TO(TOC[KEYS[i]]);
00152 coll->push_back(reco::LeafCandidate( 0, TO.particle().p4(), reco::Particle::Point( 0., 0., 0. ), TO.id() ));
00153
00154
00155
00156 }
00157 }
00158 }
00159 }
00160
00161
00162 iEvent.put(coll);
00163 return;
00164 }
00165
00166 #include "FWCore/Framework/interface/MakerMacros.h"
00167
00168 DEFINE_FWK_MODULE(CandidateTriggerObjectProducer);
00169
00170