AlcaRecoTrackSelector

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 81 82 83 84 85 86 87 88 89 90
// system include files
#include <memory>
#include <algorithm>

// user include files
#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/global/EDProducer.h"
#include "FWCore/MessageLogger/interface/MessageLogger.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 "FWCore/Utilities/interface/StreamID.h"

// class declaration
class AlcaRecoTrackSelector : public edm::global::EDProducer<> {
public:
  explicit AlcaRecoTrackSelector(const edm::ParameterSet&);
  ~AlcaRecoTrackSelector() override = default;
  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);

private:
  void produce(edm::StreamID streamID, edm::Event& iEvent, edm::EventSetup const& iSetup) const override;

  const edm::InputTag tracksTag_;
  const edm::EDGetTokenT<reco::TrackCollection> tracksToken_;
  const double ptmin_;
  const double pmin_;
  const double etamin_;
  const double etamax_;
  const int nhits_;
};

void AlcaRecoTrackSelector::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
  edm::ParameterSetDescription desc;
  desc.addUntracked<edm::InputTag>("trackInputTag", edm::InputTag("generalTracks"));
  desc.addUntracked<double>("ptmin", 0.);
  desc.addUntracked<double>("pmin", 0.);
  desc.addUntracked<double>("etamin", -4.);
  desc.addUntracked<double>("etamax", 4.);
  desc.addUntracked<unsigned int>("nhits", 1);
  descriptions.addWithDefaultLabel(desc);
}

AlcaRecoTrackSelector::AlcaRecoTrackSelector(const edm::ParameterSet& ps)
    : tracksTag_(ps.getUntrackedParameter<edm::InputTag>("trackInputTag", edm::InputTag("generalTracks"))),
      tracksToken_(consumes<reco::TrackCollection>(tracksTag_)),
      ptmin_(ps.getUntrackedParameter<double>("ptmin", 0.)),
      pmin_(ps.getUntrackedParameter<double>("pmin", 0.)),
      etamin_(ps.getUntrackedParameter<double>("etamin", -4.)),
      etamax_(ps.getUntrackedParameter<double>("etamax", 4.)),
      nhits_(ps.getUntrackedParameter<uint32_t>("nhits", 1)) {
  produces<reco::TrackCollection>("");
}

void AlcaRecoTrackSelector::produce(edm::StreamID streamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const {
  std::unique_ptr<reco::TrackCollection> outputTColl(new reco::TrackCollection());

  // Read Track collection
  edm::Handle<reco::TrackCollection> tracks;
  iEvent.getByToken(tracksToken_, tracks);

  if (tracks.isValid()) {
    for (auto const& trk : *tracks) {
      if (trk.pt() < ptmin_)
        continue;
      if (trk.p() < pmin_)
        continue;
      if (trk.eta() < etamin_)
        continue;
      if (trk.eta() > etamax_)
        continue;
      if (trk.hitPattern().numberOfAllHits(reco::HitPattern::TRACK_HITS) <= nhits_)
        continue;
      outputTColl->push_back(trk);
    }
  } else {
    edm::LogError("AlcaRecoTrackSelector") << "Error >> Failed to get AlcaRecoTrackSelector for label: " << tracksTag_;
  }
  iEvent.put(std::move(outputTColl));
}

// Define this as a plug-in
#include "FWCore/Framework/interface/MakerMacros.h"
DEFINE_FWK_MODULE(AlcaRecoTrackSelector);