TrackMultiplicityFilter

Line Code
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);