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 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;
}