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