IsolatedPFCandidateSelectorDefinition

Macros

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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
#ifndef CommonTools_ParticleFlow_IsolatedPFCandidateSelectorDefinition
#define CommonTools_ParticleFlow_IsolatedPFCandidateSelectorDefinition

#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/ConsumesCollector.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
#include "DataFormats/ParticleFlowCandidate/interface/PFCandidateFwd.h"
#include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
#include "CommonTools/ParticleFlow/interface/PFCandidateSelectorDefinition.h"
#include "DataFormats/Common/interface/ValueMap.h"
#include "FWCore/Utilities/interface/Exception.h"
#include "FWCore/Utilities/interface/transform.h"

namespace pf2pat {

  class IsolatedPFCandidateSelectorDefinition : public PFCandidateSelectorDefinition {
  public:
    typedef edm::ValueMap<double> IsoMap;

    IsolatedPFCandidateSelectorDefinition(const edm::ParameterSet& cfg, edm::ConsumesCollector&& iC)
        : isolationValueMapChargedTokens_(
              edm::vector_transform(cfg.getParameter<std::vector<edm::InputTag> >("isolationValueMapsCharged"),
                                    [&](edm::InputTag const& tag) { return iC.consumes<IsoMap>(tag); })),
          isolationValueMapNeutralTokens_(
              edm::vector_transform(cfg.getParameter<std::vector<edm::InputTag> >("isolationValueMapsNeutral"),
                                    [&](edm::InputTag const& tag) { return iC.consumes<IsoMap>(tag); })),
          doDeltaBetaCorrection_(cfg.getParameter<bool>("doDeltaBetaCorrection")),
          deltaBetaIsolationValueMapToken_(
              iC.mayConsume<IsoMap>(cfg.getParameter<edm::InputTag>("deltaBetaIsolationValueMap"))),
          deltaBetaFactor_(cfg.getParameter<double>("deltaBetaFactor")),
          isRelative_(cfg.getParameter<bool>("isRelative")),
          isolationCut_(cfg.getParameter<double>("isolationCut")) {}

    void select(const HandleToCollection& hc, const edm::Event& e, const edm::EventSetup& s) {
      selected_.clear();

      // read all charged isolation value maps
      std::vector<edm::Handle<IsoMap> > isoMapsCharged(isolationValueMapChargedTokens_.size());
      for (unsigned iMap = 0; iMap < isolationValueMapChargedTokens_.size(); ++iMap) {
        e.getByToken(isolationValueMapChargedTokens_[iMap], isoMapsCharged[iMap]);
      }

      // read all neutral isolation value maps
      std::vector<edm::Handle<IsoMap> > isoMapsNeutral(isolationValueMapNeutralTokens_.size());
      for (unsigned iMap = 0; iMap < isolationValueMapNeutralTokens_.size(); ++iMap) {
        e.getByToken(isolationValueMapNeutralTokens_[iMap], isoMapsNeutral[iMap]);
      }

      edm::Handle<IsoMap> dBetaH;
      if (doDeltaBetaCorrection_) {
        e.getByToken(deltaBetaIsolationValueMapToken_, dBetaH);
      }

      unsigned key = 0;
      for (collection::const_iterator pfc = hc->begin(); pfc != hc->end(); ++pfc, ++key) {
        reco::PFCandidateRef candidate(hc, key);

        bool passed = true;
        double isoSumCharged = 0.0;
        double isoSumNeutral = 0.0;

        for (unsigned iMap = 0; iMap < isoMapsCharged.size(); ++iMap) {
          const IsoMap& isoMap = *(isoMapsCharged[iMap]);
          double val = isoMap[candidate];
          isoSumCharged += val;
        }

        for (unsigned iMap = 0; iMap < isoMapsNeutral.size(); ++iMap) {
          const IsoMap& isoMap = *(isoMapsNeutral[iMap]);
          double val = isoMap[candidate];
          isoSumNeutral += val;
        }

        if (doDeltaBetaCorrection_) {
          const IsoMap& isoMap = *dBetaH;
          double dBetaVal = isoMap[candidate];
          double dBetaCorIsoSumNeutral = isoSumNeutral + deltaBetaFactor_ * dBetaVal;
          isoSumNeutral = dBetaCorIsoSumNeutral > 0 ? dBetaCorIsoSumNeutral : 0;  //follow muon POG definition in 2012
        }

        double isoSum = isoSumCharged + isoSumNeutral;

        if (isRelative_) {
          isoSum /= candidate->pt();
        }

        if (isoSum > isolationCut_) {
          passed = false;
        }

        if (passed) {
          // passed all cuts, selected
          selected_.push_back(reco::PFCandidate(*pfc));
          reco::PFCandidatePtr ptrToMother(hc, key);
          selected_.back().setSourceCandidatePtr(ptrToMother);
        }
      }
    }

    static void fillPSetDescription(edm::ParameterSetDescription& desc) {
      desc.add<std::vector<edm::InputTag> >("isolationValueMapsCharged", {});
      desc.add<std::vector<edm::InputTag> >("isolationValueMapsNeutral", {});
      desc.add<bool>("doDeltaBetaCorrection", false);
      desc.add<edm::InputTag>("deltaBetaIsolationValueMap", edm::InputTag(""));
      desc.add<double>("deltaBetaFactor", -0.5);
      desc.add<bool>("isRelative", true)->setComment("if True isolation is relative to pT");
      desc.add<double>("isolationCut", 999);
    }

  private:
    std::vector<edm::EDGetTokenT<IsoMap> > isolationValueMapChargedTokens_;
    std::vector<edm::EDGetTokenT<IsoMap> > isolationValueMapNeutralTokens_;
    bool doDeltaBetaCorrection_;
    edm::EDGetTokenT<IsoMap> deltaBetaIsolationValueMapToken_;
    double deltaBetaFactor_;
    bool isRelative_;
    double isolationCut_;
  };

}  // namespace pf2pat

#endif