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
|
// system include files
#include <memory>
#include <algorithm>
// user include files
#include "CommonTools/Utils/interface/StringCutObjectSelector.h"
#include "DataFormats/Common/interface/Handle.h"
#include "DataFormats/TrackReco/interface/HitPattern.h"
#include "DataFormats/TrackReco/interface/Track.h"
#include "DataFormats/TrackReco/interface/TrackFwd.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/Framework/interface/global/EDFilter.h"
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
//
// class declaration
//
class TrackMultiplicityFilter : public edm::global::EDFilter<> {
public:
explicit TrackMultiplicityFilter(const edm::ParameterSet&);
~TrackMultiplicityFilter() override = default;
static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
private:
bool filter(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
// ----------member data ---------------------------
const edm::InputTag tracksTag_;
const edm::EDGetTokenT<reco::TrackCollection> tracksToken_;
const StringCutObjectSelector<reco::Track> selector_;
const unsigned int nmin_;
};
using namespace std;
using namespace edm;
void TrackMultiplicityFilter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
edm::ParameterSetDescription desc;
desc.addUntracked<edm::InputTag>("trackInputTag", edm::InputTag("generalTracks"));
desc.addUntracked<std::string>("cut", std::string(""));
desc.addUntracked<uint32_t>("nmin", 0.);
descriptions.addWithDefaultLabel(desc);
}
TrackMultiplicityFilter::TrackMultiplicityFilter(const edm::ParameterSet& ps)
: tracksTag_(ps.getUntrackedParameter<edm::InputTag>("trackInputTag", edm::InputTag("generalTracks"))),
tracksToken_(consumes<reco::TrackCollection>(tracksTag_)),
selector_(ps.getUntrackedParameter<std::string>("cut", "")),
nmin_(ps.getUntrackedParameter<uint32_t>("nmin", 0.)) {}
//
// member functions
//
// ------------ method called on each new Event ------------
bool TrackMultiplicityFilter::filter(edm::StreamID iStream, edm::Event& iEvent, const edm::EventSetup& iSetup) const {
bool pass = false;
edm::Handle<reco::TrackCollection> tracks;
iEvent.getByToken(tracksToken_, tracks);
if (!tracks.isValid()) {
edm::LogError("TrackMultiplicityFilter")
<< "Error >> Failed to get TrackMultiplicityFilter for label: " << tracksTag_;
return false;
}
double count = std::count_if(tracks->begin(), tracks->end(), selector_);
pass = (count >= nmin_);
edm::LogInfo("TrackMultiplicityFilter") << "pass : " << pass;
return pass;
}
//define this as a plug-in
DEFINE_FWK_MODULE(TrackMultiplicityFilter);
|