CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
PhotonPFIsolationWithMapBasedVeto.cc
Go to the documentation of this file.
3 
6 
9 
12 
14 
17 
20 
23 
26 
28 
29 #include <unordered_map>
30 
31 namespace reco {
33 }
34 
35 namespace pat {
38 } // namespace pat
39 
40 namespace {
41  // This template function finds whether theCandidate is in thefootprint
42  // collection. It is templated to be able to handle both reco and pat
43  // photons (from AOD and miniAOD, respectively).
44  template <class T, class U>
45  bool isInFootprint(const T& thefootprint, const U& theCandidate) {
46  for (auto itr = thefootprint.begin(); itr != thefootprint.end(); ++itr) {
47  if (itr->key() == theCandidate.key())
48  return true;
49  }
50  return false;
51  }
52 
53  //This function is needed because pfNoPileUpCandidates have changed keys,
54  //and thus the solution is to use sourceCandidatePtr(0)
55  // This function *shouldn't be used for packedCandidate*
56  template <class T, class U>
57  bool isInFootprintAlternative(const T& thefootprint, const U& theCandidate) {
58  for (auto itr = thefootprint.begin(); itr != thefootprint.end(); ++itr) {
59  if (itr->key() == theCandidate->sourceCandidatePtr(0).key())
60  return true;
61  }
62  return false;
63  }
64 } // namespace
65 
67 public:
69  : citk::IsolationConeDefinitionBase(c),
70  _isolateAgainst(c.getParameter<std::string>("isolateAgainst")), //isolate against either h+, h0 or gamma
71  _miniAODVertexCodes(c.getParameter<std::vector<unsigned> >(
72  "miniAODVertexCodes")), //quality flags to be used for association with the vertex configurable, the vertex can be chosen
73  _vertexIndex(c.getParameter<int>("vertexIndex")), //vertex of interest
74  _particleBasedIsolation(c.getParameter<edm::InputTag>("particleBasedIsolation")) {}
75 
78 
79  bool isInIsolationCone(const reco::CandidatePtr& photon, const reco::CandidatePtr& pfCandidate) const final;
80 
81  // this object is needed for reco case
84 
85  void getEventInfo(const edm::Event& iEvent) override {
87  };
88 
89  //As far as I understand now, the object particleBasedIsolationMap should be fixed, so we don't configure the name
90  void setConsumes(edm::ConsumesCollector iC) override {
93  }
94 
97 
98 private:
100  const std::vector<unsigned> _miniAODVertexCodes;
101  const unsigned _vertexIndex;
103 };
104 
107  "PhotonPFIsolationWithMapBasedVeto");
108 
109 //This function defines whether particular PFCandidate is inside of isolation cone of photon or not by checking deltaR and whether footprint removal for this candidate should be done. Additionally, for miniAOD charged hadrons from the PV are considered. *** For AOD this should be done by the corresponding sequence beforehand!!! ***
110 
112  const reco::CandidatePtr& pfCandidate) const {
113  //convert the photon and candidate objects to the corresponding pat or reco objects. What is used depends on what is user running on: miniAOD or AOD
114  pat::patPhotonPtr aspat_photonptr(photon);
115 
116  pat::PackedCandidatePtr aspacked(pfCandidate);
117  reco::PFCandidatePtr aspf(pfCandidate);
118 
119  bool inFootprint = false;
120  bool result = true;
121  const float deltar2 =
122  reco::deltaR2(*photon, *pfCandidate); //calculate deltaR2 distance between PFCandidate and photon
123 
124  // dealing here with patObjects: miniAOD case
125  if (aspacked.get()) {
126  inFootprint = isInFootprint(aspat_photonptr->associatedPackedPFCandidates(), aspacked);
127 
128  //checking if the charged candidates come from the appropriate vertex
129  if (aspacked->charge() != 0) {
130  bool is_vertex_allowed = false;
131  for (const unsigned vtxtype : _miniAODVertexCodes) {
132  if (vtxtype == aspacked->fromPV(_vertexIndex)) {
133  is_vertex_allowed = true;
134  break;
135  }
136  }
137 
138  result &= (is_vertex_allowed);
139  }
140  //return true if the candidate is inside the cone and not in the footprint
141  result &= deltar2 < _coneSize2 && (!inFootprint);
142 
143  }
144 
145  // dealing here with recoObjects: AOD case
146  else if (aspf.get() && aspf.isNonnull()) {
147  inFootprint = isInFootprintAlternative((*particleBasedIsolationMap)[photon], aspf);
148  result &= deltar2 < _coneSize2 && (!inFootprint);
149 
150  }
151 
152  // throw exception if it is not a patObject or recoObject
153  else {
154  throw cms::Exception("InvalidIsolationInput") << "The supplied candidate to be used as isolation "
155  << "was neither a reco::Photon nor a pat::Photon!";
156  }
157 
158  return result;
159 }
IsolationConeDefinitionBase(const edm::ParameterSet &c)
const edm::EventSetup & c
EDGetTokenT< ProductType > mayConsume(edm::InputTag const &tag)
edm::Handle< edm::ValueMap< std::vector< reco::PFCandidateRef > > > particleBasedIsolationMap
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
T const * get() const
Returns C++ pointer to the item.
Definition: Ptr.h:139
edm::Ptr< pat::PackedCandidate > PackedCandidatePtr
tuple result
Definition: mps_fire.py:311
int iEvent
Definition: GenABIO.cc:224
void getEventInfo(const edm::Event &iEvent) override
void setConsumes(edm::ConsumesCollector iC) override
PhotonPFIsolationWithMapBasedVeto & operator=(const PhotonPFIsolationWithMapBasedVeto &)=delete
bool isNonnull() const
Checks for non-null.
Definition: Ptr.h:146
edm::Ptr< reco::Photon > recoPhotonPtr
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
PhotonPFIsolationWithMapBasedVeto(const edm::ParameterSet &c)
edm::Ptr< pat::Photon > patPhotonPtr
#define DEFINE_EDM_PLUGIN(factory, type, name)
long double T
bool isInIsolationCone(const reco::CandidatePtr &photon, const reco::CandidatePtr &pfCandidate) const final
edm::EDGetTokenT< edm::ValueMap< std::vector< reco::PFCandidateRef > > > particleBasedIsolationToken_