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
99
100
101
102
|
#ifndef RecoAlgos_ObjectSelectorBase_h
#define RecoAlgos_ObjectSelectorBase_h
/** \class ObjectSelectorBase
*
* selects a subset of a collection.
*
* \author Luca Lista, INFN
*
* \version $Revision: 1.3 $
*
* $Id: ObjectSelectorBase.h,v 1.3 2010/02/20 20:55:27 wmtan Exp $
*
*/
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/ConsumesCollector.h"
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
#include "FWCore/Utilities/interface/InputTag.h"
#include "CommonTools/UtilAlgos/interface/ParameterAdapter.h"
#include <utility>
#include <vector>
#include <memory>
#include <algorithm>
template <typename Selector,
typename OutputCollection,
typename SizeSelector,
typename PostProcessor,
typename StoreManager,
typename Base,
typename Init>
class ObjectSelectorBase : public Base {
public:
/// constructor
// ObjectSelectorBase()=default;
explicit ObjectSelectorBase(const edm::ParameterSet& cfg)
: Base(cfg),
srcToken_(
this->template consumes<typename Selector::collection>(cfg.template getParameter<edm::InputTag>("src"))),
filter_(false),
throwOnMissing_(cfg.getUntrackedParameter<bool>("throwOnMissing", true)),
selectorInit_(this->consumesCollector()),
selector_(cfg, this->consumesCollector()),
sizeSelector_(reco::modules::make<SizeSelector>(cfg)),
postProcessor_(cfg, this->consumesCollector()) {
const std::string filter("filter");
std::vector<std::string> bools = cfg.template getParameterNamesForType<bool>();
bool found = std::find(bools.begin(), bools.end(), filter) != bools.end();
if (found)
filter_ = cfg.template getParameter<bool>(filter);
postProcessor_.init(*this);
}
/// destructor
~ObjectSelectorBase() override {}
static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
edm::ParameterSetDescription desc;
desc.add<edm::InputTag>("src", edm::InputTag(""));
Selector::fillPSetDescription(desc);
desc.add<bool>("filter", false);
desc.addUntracked<bool>("throwOnMissing", true);
descriptions.addWithDefaultLabel(desc);
}
private:
/// process one event
bool filter(edm::Event& evt, const edm::EventSetup& es) override {
selectorInit_.init(selector_, evt, es);
edm::Handle<typename Selector::collection> source;
evt.getByToken(srcToken_, source);
// if throwOnMissing is false, but the input source is not valid
// allow all events to pass
if (!throwOnMissing_ && !source.isValid()) {
return !filter_;
}
StoreManager manager(source);
selector_.select(source, evt, es);
manager.cloneAndStore(selector_.begin(), selector_.end(), evt);
bool result = (!filter_ || sizeSelector_(manager.size()));
edm::OrphanHandle<OutputCollection> filtered = manager.put(evt);
postProcessor_.process(filtered, evt);
return result;
}
/// source collection label
edm::EDGetTokenT<typename Selector::collection> srcToken_;
/// filter event
bool filter_;
/// trhow on missing
bool throwOnMissing_;
/// Object collection selector
Init selectorInit_;
Selector selector_;
/// selected object collection size selector
SizeSelector sizeSelector_;
/// post processor
PostProcessor postProcessor_;
};
#endif
|