1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
/** \class HLTSmartSinglet
*
* See header file for documentation
*
*
* \author Martin Grunewald
*
*/
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "HLTSmartSinglet.h"
#include "DataFormats/Common/interface/Handle.h"
#include "DataFormats/Common/interface/Ref.h"
#include "DataFormats/HLTReco/interface/TriggerFilterObjectWithRefs.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "HLTrigger/HLTcore/interface/defaultModuleLabel.h"
//
// constructors and destructor
//
template <typename T>
HLTSmartSinglet<T>::HLTSmartSinglet(const edm::ParameterSet& iConfig)
: HLTFilter(iConfig),
inputTag_(iConfig.template getParameter<edm::InputTag>("inputTag")),
inputToken_(consumes<std::vector<T>>(inputTag_)),
triggerType_(iConfig.template getParameter<int>("triggerType")),
cut_(iConfig.template getParameter<std::string>("cut")),
min_N_(iConfig.template getParameter<int>("MinN")),
select_(cut_) {
LogDebug("") << "Input/tyre/cut/ncut : " << inputTag_.encode() << " " << triggerType_ << " " << cut_ << " " << min_N_;
}
template <typename T>
HLTSmartSinglet<T>::~HLTSmartSinglet() = default;
template <typename T>
void HLTSmartSinglet<T>::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
edm::ParameterSetDescription desc;
makeHLTFilterDescription(desc);
desc.add<edm::InputTag>("inputTag", edm::InputTag("hltCollection"));
desc.add<int>("triggerType", 0);
desc.add<std::string>("cut", "1>0");
desc.add<int>("MinN", 1);
descriptions.add(defaultModuleLabel<HLTSmartSinglet<T>>(), desc);
}
//
// member functions
//
// ------------ method called to produce the data ------------
template <typename T>
bool HLTSmartSinglet<T>::hltFilter(edm::Event& iEvent,
const edm::EventSetup& iSetup,
trigger::TriggerFilterObjectWithRefs& filterproduct) const {
using namespace std;
using namespace edm;
using namespace reco;
using namespace trigger;
typedef vector<T> TCollection;
typedef Ref<TCollection> TRef;
// All HLT filters must create and fill an HLT filter object,
// recording any reconstructed physics objects satisfying (or not)
// this HLT filter, and place it in the Event.
// The filter object
if (saveTags())
filterproduct.addCollectionTag(inputTag_);
// Ref to Candidate object to be recorded in filter object
TRef ref;
// get hold of collection of objects
Handle<TCollection> objects;
iEvent.getByToken(inputToken_, objects);
// look at all objects, check cuts and add to filter object
int n(0);
typename TCollection::const_iterator i(objects->begin());
for (; i != objects->end(); i++) {
if (select_(*i)) {
n++;
ref = TRef(objects, distance(objects->begin(), i));
filterproduct.addObject(triggerType_, ref);
}
}
// filter decision
bool accept(n >= min_N_);
return accept;
}
|