1 |
#ifndef TRIGGERREADER_H
|
2 |
#define TRIGGERREADER_H
|
3 |
#include "DataFormats/FWLite/interface/Event.h"
|
4 |
#include "DataFormats/FWLite/interface/Handle.h"
|
5 |
#include "DataFormats/Common/interface/TriggerResults.h"
|
6 |
#include "FWCore/Common/interface/TriggerNames.h"
|
7 |
#include <string>
|
8 |
#include <map>
|
9 |
#include <TString.h>
|
10 |
#include <TRegexp.h>
|
11 |
#include <regex.h>
|
12 |
#include <stdio.h>
|
13 |
|
14 |
class TriggerReader {
|
15 |
public:
|
16 |
TriggerReader(bool passAllEvents=false) : cacheRun(0), passAll(passAllEvents) {}
|
17 |
|
18 |
void setEvent( fwlite::Event * e) { ev=e;}
|
19 |
|
20 |
bool accept(const std::string & triggername)
|
21 |
{
|
22 |
if(passAll) return true;
|
23 |
fwlite::Handle<edm::TriggerResults> hTriggerResults;
|
24 |
hTriggerResults.getByLabel(*ev,"TriggerResults","","HLT");
|
25 |
|
26 |
|
27 |
regex_t regex;
|
28 |
int reti;
|
29 |
|
30 |
|
31 |
reti = regcomp(®ex, triggername.c_str(), 0);
|
32 |
// reti = regcomp(®ex, "HLT_Ele32_CaloIdVT_CaloIsoT_TrkIdT_TrkIsoT_v.*", 0);
|
33 |
if( reti ){ std::cerr << "Could not compile regex" << std::endl;}
|
34 |
|
35 |
|
36 |
std::map<std::string,size_t>::iterator nit;
|
37 |
if(ev->getRun().run() != cacheRun || nameMap.find(triggername) == nameMap.end())
|
38 |
{
|
39 |
cacheRun=ev->getRun().run();
|
40 |
edm::TriggerNames const& triggerNames = ev->triggerNames(*hTriggerResults);
|
41 |
std::string oldiname="whatever";
|
42 |
nit=nameMap.find(triggername);
|
43 |
if(nit!=nameMap.end() && nit->second < triggerNames.size())
|
44 |
{
|
45 |
oldiname=triggerNames.triggerName(nit->second);
|
46 |
}
|
47 |
// std::cout << "whatever3" << std::endl;
|
48 |
// std::cout << "reg1 " << regexec(®ex, oldiname.c_str(), 0, NULL, 0) << std::endl;
|
49 |
if(nit==nameMap.end() || ( regexec(®ex, oldiname.c_str(), 0, NULL, 0) != 0 )) //; ! oldiname.Contains( TRegexp(triggername)) ) // changed, search it
|
50 |
{
|
51 |
std::cout << "searching " << triggername << std::endl;
|
52 |
for (unsigned i = 0; i < triggerNames.size(); ++i) {
|
53 |
std::string iname(triggerNames.triggerName(i));
|
54 |
|
55 |
if( regexec(®ex, iname.c_str(), 0, NULL, 0) == 0 ) //iname.Contains(TRegexp(triggername)) )
|
56 |
{
|
57 |
nameMap[triggername]= i;
|
58 |
std::cout << "FOUND: " << triggerNames.triggerName(i) << " is bit " << i << std::endl;
|
59 |
}
|
60 |
}
|
61 |
|
62 |
}
|
63 |
}
|
64 |
nit=nameMap.find(triggername);
|
65 |
if(nit==nameMap.end())
|
66 |
{
|
67 |
std::cout << "ERROR: trigger name not found" << std::endl;
|
68 |
edm::TriggerNames const& triggerNames = ev->triggerNames(*hTriggerResults);
|
69 |
for (unsigned i = 0; i < triggerNames.size(); ++i) std::cout << triggerNames.triggerName(i) << " is bit " << i << "looking for: "<< triggername << std::endl;
|
70 |
|
71 |
|
72 |
return false;
|
73 |
}
|
74 |
return hTriggerResults->accept(nit->second);
|
75 |
}
|
76 |
|
77 |
private:
|
78 |
std::map<std::string,size_t> nameMap;
|
79 |
unsigned int cacheRun;
|
80 |
fwlite::Event * ev;
|
81 |
bool passAll;
|
82 |
|
83 |
};
|
84 |
|
85 |
#endif
|