Go to the documentation of this file.00001
00002
00003
00004
00005
00013
00014
00015
00016
00017
00018
00019
00020 #include <memory>
00021
00022
00023 #include "FWCore/Framework/interface/Frameworkfwd.h"
00024 #include "FWCore/Framework/interface/EDAnalyzer.h"
00025 #include "FWCore/Framework/interface/Event.h"
00026 #include "FWCore/Framework/interface/MakerMacros.h"
00027 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00028 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00029
00030
00031
00032 #include "FWCore/Framework/interface/Run.h"
00033 #include "FWCore/Framework/interface/EventSetup.h"
00034
00035
00036 #include "DQMOffline/Trigger/interface/HLTMuonMatchAndPlot.h"
00037 #include "DQMOffline/Trigger/interface/HLTMuonOverlap.h"
00038
00039 #include "HLTrigger/HLTcore/interface/HLTConfigProvider.h"
00040 #include "FWCore/ServiceRegistry/interface/Service.h"
00041
00042 #include "CommonTools/Utils/interface/StringCutObjectSelector.h"
00043
00044 #include "TFile.h"
00045 #include "TDirectory.h"
00046 #include "TPRegexp.h"
00047
00048
00049 using namespace std;
00050 using namespace edm;
00051 using reco::Muon;
00052
00053
00054 class OfflineDQMMuonTrigAnalyzer : public edm::EDAnalyzer {
00055
00056 public:
00057 explicit OfflineDQMMuonTrigAnalyzer(const edm::ParameterSet&);
00058 ~OfflineDQMMuonTrigAnalyzer();
00059
00060 private:
00061 virtual void beginJob() ;
00062
00063 virtual void beginRun(edm::Run const& currentRun, edm::EventSetup const& currentEventSetup);
00064 virtual void analyze(const edm::Event&, const edm::EventSetup&);
00065 virtual void endRun (const edm::Run& r, const edm::EventSetup& c);
00066 virtual void endJob() ;
00067
00068 int theNumberOfTriggers;
00069 std::vector<HLTMuonMatchAndPlot*> theTriggerAnalyzers;
00070
00071
00072 bool weHaveProcessedTheFirstRun;
00073 bool useDQMStore;
00074
00075 vector<string> triggerNames;
00076 string theHltProcessName;
00077 vector<edm::ParameterSet> customCollection;
00078
00079 const ParameterSet& initialPset;
00080
00081 vector<TPRegexp> trigRegExps;
00082
00083
00084 };
00085
00086
00087
00088 OfflineDQMMuonTrigAnalyzer::OfflineDQMMuonTrigAnalyzer(const ParameterSet& pset):
00089 initialPset(pset)
00090 {
00091
00092 LogTrace ("HLTMuonVal") << "\n\n Inside MuonTriggerRate Constructor\n\n";
00093
00094 triggerNames = initialPset.getParameter< vector<string> >
00095 ("TriggerRegExpStrings");
00096
00097
00098
00099 for (vector<string>::const_iterator iTrigName = triggerNames.begin();
00100 iTrigName != triggerNames.end();
00101 iTrigName ++) {
00102
00103 trigRegExps.push_back( TPRegexp((*iTrigName).c_str()) );
00104
00105 LogTrace ("HLTMuonVal") << "Trigger Reg Exp = " << trigRegExps.back().GetPattern() << endl;
00106 }
00107
00108 useDQMStore = initialPset.getUntrackedParameter<bool>("DQMStore", false);
00109
00110
00111 theHltProcessName = initialPset.getParameter<string>("HltProcessName");
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 customCollection = initialPset.getParameter<vector<edm::ParameterSet> > ("customCollection");
00125
00126 weHaveProcessedTheFirstRun = false;
00127
00128
00129 }
00130
00131 void OfflineDQMMuonTrigAnalyzer::beginRun(edm::Run const& currentRun, edm::EventSetup const& currentEventSetup) {
00132
00133
00134 if (!weHaveProcessedTheFirstRun) {
00135 weHaveProcessedTheFirstRun= true;
00136 vector<edm::ParameterSet>::iterator iPSet;
00137
00138 LogTrace ("HLTMuonVal") << "customCollection is a vector of size = " << customCollection.size() << std::endl
00139 << "looping over entries" << std::endl;
00140
00141
00142 DQMStore * dbe_ = 0;
00143 if ( useDQMStore ) {
00144 dbe_ = Service<DQMStore>().operator->();
00145 dbe_->setVerbose(0);
00146 }
00147
00148
00149 vector < MuonSelectionStruct > customSelectors;
00150 vector < string > customNames;
00151
00152 for ( iPSet = customCollection.begin();
00153 iPSet != customCollection.end();
00154 iPSet++) {
00155 string customCuts = iPSet->getUntrackedParameter<string> ("recoCuts");
00156 string customName = iPSet->getUntrackedParameter<string> ("collectionName");
00157 string hltCuts = iPSet->getUntrackedParameter<string> ("hltCuts");
00158 string targetTrackCollection = iPSet->getUntrackedParameter<string> ("trackCollection");
00159 double customD0Cut = iPSet->getUntrackedParameter<double> ("d0cut");
00160 double customZ0Cut = iPSet->getUntrackedParameter<double> ("z0cut");
00161
00162 vector<string> requiredTriggers = iPSet->getUntrackedParameter< vector<string> > ("requiredTriggers");
00163
00164 LogTrace("HLTMuonVal") << "customTargetCollection = " << customName << std::endl
00165 << "customCuts = " << customCuts << std::endl
00166 << "targetTrackCollection = " << targetTrackCollection << std::endl
00167 << "d0 cut = " << customD0Cut << std::endl
00168 << "z0 cut = " << customZ0Cut << std:: endl ;
00169
00170 if (dbe_) {
00171
00172 string description = customName + ", reco cuts = " + customCuts
00173 + ", hlt cuts = " + hltCuts + ", trackCollection = " + targetTrackCollection
00174 + ", required triggers, ";
00175
00176
00177 for (vector <string>::const_iterator trigit = requiredTriggers.begin();
00178 trigit != requiredTriggers.end();
00179 trigit++){
00180 description += (*trigit) + ", ";
00181 }
00182
00183
00184 ostringstream ossd0, ossz0, osschi2, osshits;
00185
00186
00187 ossd0 << customD0Cut;
00188 ossz0 << customZ0Cut;
00189
00190
00191
00192 description += "|d0| < " + ossd0.str() + ", |z0| < " + ossz0.str();
00193
00194
00195 LogTrace ("HLTMuonVal") << "Storing description = " << description << endl;
00196
00197 dbe_->setCurrentFolder("HLT/Muon/Distributions/");
00198
00199 dbe_->bookString (customName, description);
00200
00201 }
00202
00203
00204 StringCutObjectSelector<Muon> tempRecoSelector(customCuts);
00205 StringCutObjectSelector<trigger::TriggerObject> tempHltSelector(hltCuts);
00206
00207
00208 MuonSelectionStruct tempStruct(tempRecoSelector, tempHltSelector,
00209 customName, customD0Cut, customZ0Cut,
00210 targetTrackCollection, requiredTriggers);
00211
00212
00213 customNames.push_back ( customName);
00214 customSelectors.push_back(tempStruct);
00215 }
00216
00217
00218
00219 LogTrace ("HLTMuonVal") << "Initializing HLTConfigProvider with HLT process name: " << theHltProcessName << endl;
00220
00221
00222
00223
00224
00225 HLTConfigProvider hltConfig;
00226
00227 bool hltConfigChanged;
00228 bool hltConfigInitSuccess = hltConfig.init(currentRun, currentEventSetup, theHltProcessName, hltConfigChanged);
00229
00230
00231 vector<string> validTriggerNames;
00232
00233 if (hltConfigInitSuccess)
00234 validTriggerNames = hltConfig.triggerNames();
00235
00236 if (validTriggerNames.size() < 1) {
00237 LogInfo ("HLTMuonVal") << endl << endl << endl
00238 << "---> WARNING: The HLT Config Provider gave you an empty list of valid trigger names" << endl
00239 << "Could be a problem with the HLT Process Name (you provided " << theHltProcessName <<")" << endl
00240 << "W/o valid triggers we can't produce plots, exiting..."
00241 << endl << endl << endl;
00242
00243
00244
00245 }
00246
00247 vector<string>::const_iterator iDumpName;
00248 unsigned int numTriggers = 0;
00249
00250 vector<string> parsedMuonTrigNames;
00251
00252
00253
00254
00255
00256 TPRegexp l1l2MuTrigExp ("HLT_L[12]Mu[^_]*$");
00257 TPRegexp isoMuTrigExp ("HLT_[iI]soMu[^_]*$");
00258 TPRegexp normalMuExp ("HLT_Mu[^_]*$");
00259 TPRegexp l1l2DoubleExp ("HLT_L[12]DoubleMu[^_]*$");
00260 TPRegexp normalDoubleExp ("HLT_DoubleMu[^_]*$");
00261
00262
00263
00264
00265 for (iDumpName = validTriggerNames.begin();
00266 iDumpName != validTriggerNames.end();
00267 iDumpName++) {
00268
00269 LogTrace ("HLTMuonVal") << "Trigger " << numTriggers
00270 << " is called " << (*iDumpName)
00271 << endl;
00272 numTriggers++;
00273
00274 TString tempTStringModName(*iDumpName);
00275
00276 bool matchesAnyRegexp = false;
00277 for (vector<TPRegexp>::const_iterator iTrigRegExp = trigRegExps.begin();
00278 iTrigRegExp != trigRegExps.end();
00279 iTrigRegExp ++) {
00280 TPRegexp tempRegExp((*iTrigRegExp));
00281 if (tempTStringModName.Contains(tempRegExp))
00282 matchesAnyRegexp = true;
00283 }
00284
00285 if (matchesAnyRegexp) {
00286
00287 LogTrace ("HLTMuonVal") << "------> This is a muon trigger"
00288 << endl;
00289
00290 parsedMuonTrigNames.push_back(*iDumpName);
00291
00292 }
00293
00294 }
00295
00296
00297
00298
00299 vector<MuonSelectionStruct>::iterator iMuonSelector;
00300 vector<string>::iterator iName = customNames.begin();
00301
00302 LogTrace ("HLTMuonVal") << "Looping over custom selectors" << endl;
00303 unsigned numSelectors = 0;
00304 for ( iMuonSelector = customSelectors.begin();
00305 iMuonSelector != customSelectors.end();
00306 iMuonSelector++) {
00307
00308 LogTrace ("HLTMuonVal") << "Num selectors = " << numSelectors << endl;
00309
00310 for( size_t i = 0; i < parsedMuonTrigNames.size(); i++) {
00311
00312 LogTrace ("HLTMuonVal") << "PARSED: Making match and plot for trigger " << parsedMuonTrigNames[i] << endl;
00313
00314 vector<string> moduleNames = hltConfig.moduleLabels( parsedMuonTrigNames[i] );
00315 HLTMuonMatchAndPlot *analyzer;
00316 analyzer = new HLTMuonMatchAndPlot( initialPset, parsedMuonTrigNames[i], moduleNames, (*iMuonSelector), (*iName), validTriggerNames, currentRun, currentEventSetup );
00317 theTriggerAnalyzers.push_back( analyzer );
00318
00319 }
00320 numSelectors++;
00321 iName++;
00322 }
00323
00324 theNumberOfTriggers = theTriggerAnalyzers.size();
00325
00326 LogTrace ("HLTMuonVal") << "You have created " << theNumberOfTriggers
00327 << " trigger analyzers" << endl;
00328
00329
00331
00332
00333 vector<HLTMuonMatchAndPlot *>::iterator thisAnalyzer;
00334 int nTotalAnalyzers = 0;
00335 for ( thisAnalyzer = theTriggerAnalyzers.begin();
00336 thisAnalyzer != theTriggerAnalyzers.end();
00337 ++thisAnalyzer )
00338 {
00339
00340 LogTrace ("HLTMuonVal")
00341 << "Calling begin for analyzer " << nTotalAnalyzers;
00342
00343 (*thisAnalyzer)->begin();
00344
00345
00346 nTotalAnalyzers++;
00347 }
00348
00349 LogTrace ("HLTMuonVal")
00350 << "OfflineDQMMuonTrigAnalyzer: Calling being for overlap analyzer" << endl;
00351
00352
00353 }
00354 }
00355
00356 OfflineDQMMuonTrigAnalyzer::~OfflineDQMMuonTrigAnalyzer()
00357 {
00358
00359 LogTrace ("HLTMuonVal")
00360 << "Inside OfflineDQMMuonTrigAnalyzer destructor" << endl;
00361
00362 vector<HLTMuonMatchAndPlot *>::iterator thisAnalyzer;
00363 for ( thisAnalyzer = theTriggerAnalyzers.begin();
00364 thisAnalyzer != theTriggerAnalyzers.end();
00365 ++thisAnalyzer )
00366 {
00367 delete *thisAnalyzer;
00368 }
00369 theTriggerAnalyzers.clear();
00370
00371 }
00372
00373
00374
00375
00376
00377
00378 void
00379 OfflineDQMMuonTrigAnalyzer::analyze(const Event& iEvent, const EventSetup& iSetup)
00380 {
00381 LogTrace ("HLTMuonVal")
00382 << "Inside OfflineDQMMuonTrigAnalyzer analyze" << endl;
00383
00384 vector<HLTMuonMatchAndPlot *>::iterator thisAnalyzer;
00385 for ( thisAnalyzer = theTriggerAnalyzers.begin();
00386 thisAnalyzer != theTriggerAnalyzers.end(); ++thisAnalyzer )
00387 {
00388 (*thisAnalyzer)->analyze(iEvent);
00389 }
00390
00391 }
00392
00393
00394
00395 void
00396 OfflineDQMMuonTrigAnalyzer::beginJob()
00397 {
00398
00399 LogTrace ("HLTMuonVal")
00400 << "Inside OfflineDQMMuonTrigAnalyzer beginJob" << endl;
00401
00402 LogTrace ("HLTMuonVal")
00403 << "Looking at a vector of analyzers, with size " << theTriggerAnalyzers.size() << endl;
00404
00405
00406
00407
00408 }
00409
00410 void
00411 OfflineDQMMuonTrigAnalyzer::endRun ( const edm::Run& theRun, const edm::EventSetup& theEventSetup) {
00412
00413 LogTrace ("HLTMuonVal")
00414 << "Inside OfflineDQMMuonTrigAnalyzer endRun()" << endl;
00415
00416
00417 vector<HLTMuonMatchAndPlot *>::iterator thisAnalyzer;
00418 for ( thisAnalyzer = theTriggerAnalyzers.begin();
00419 thisAnalyzer != theTriggerAnalyzers.end();
00420 ++thisAnalyzer )
00421 {
00422 (*thisAnalyzer)->endRun(theRun, theEventSetup);
00423 }
00424
00425 }
00426
00427
00428
00429 void
00430 OfflineDQMMuonTrigAnalyzer::endJob() {
00431
00432 LogTrace ("HLTMuonVal")
00433 << "Inside OfflineDQMMuonTrigAnalyzer endJob()" << endl;
00434
00435
00436 vector<HLTMuonMatchAndPlot *>::iterator thisAnalyzer;
00437 for ( thisAnalyzer = theTriggerAnalyzers.begin();
00438 thisAnalyzer != theTriggerAnalyzers.end();
00439 ++thisAnalyzer )
00440 {
00441 (*thisAnalyzer)->finish();
00442 }
00443
00444 }
00445
00446
00447 DEFINE_FWK_MODULE(OfflineDQMMuonTrigAnalyzer);