CMS 3D CMS Logo

ShiftedPFCandidateProducerForPFMVAMEt.cc
Go to the documentation of this file.
2 
4 
5 const double dRDefault = 1000;
6 
8  : moduleLabel_(cfg.getParameter<std::string>("@module_label")),
9  srcPFCandidatesToken_(consumes<reco::PFCandidateCollection>(cfg.getParameter<edm::InputTag>("srcPFCandidates"))),
10  srcUnshiftedObjectsToken_(consumes<CandidateView>(cfg.getParameter<edm::InputTag>("srcUnshiftedObjects"))),
11  srcShiftedObjectsToken_(consumes<CandidateView>(cfg.getParameter<edm::InputTag>("srcShiftedObjects"))) {
12  dRmatch_PFCandidate_ = cfg.getParameter<double>("dRmatch_PFCandidate");
13  dRmatch_Object_ = cfg.exists("dRmatch_Object") ? cfg.getParameter<double>("dRmatch_Object") : 0.1;
14 
16  dR2match_Object_ = dRmatch_Object_ * dRmatch_Object_;
17 
18  produces<reco::PFCandidateCollection>();
19 }
20 
22  // nothing to be done yet...
23 }
24 
26  edm::Handle<reco::PFCandidateCollection> originalPFCandidates;
27  evt.getByToken(srcPFCandidatesToken_, originalPFCandidates);
28 
29  edm::Handle<CandidateView> unshiftedObjects;
30  evt.getByToken(srcUnshiftedObjectsToken_, unshiftedObjects);
31 
32  edm::Handle<CandidateView> shiftedObjects;
33  evt.getByToken(srcShiftedObjectsToken_, shiftedObjects);
34 
35  objects_.clear();
36 
37  std::vector<bool> match(shiftedObjects->size(), false);
38  int prevMatch = -1;
39  int cnt = 0;
40 
41  for (CandidateView::const_iterator unshiftedObject = unshiftedObjects->begin();
42  unshiftedObject != unshiftedObjects->end();
43  ++unshiftedObject) {
44  bool isMatched_Object = false;
45  double dR2bestMatch_Object = dRDefault;
46  reco::Candidate::LorentzVector shiftedObjectP4_matched;
47  prevMatch = -1;
48 
49  for (CandidateView::const_iterator shiftedObject = shiftedObjects->begin(); shiftedObject != shiftedObjects->end();
50  ++shiftedObject) {
51  if (match[cnt])
52  continue;
53 
54  double dR2 = deltaR2(unshiftedObject->p4(), shiftedObject->p4());
55  if (dR2 < dR2match_Object_ && dR2 < dR2bestMatch_Object) {
56  shiftedObjectP4_matched = shiftedObject->p4();
57  isMatched_Object = true;
58  dR2bestMatch_Object = dR2;
59 
60  prevMatch = cnt;
61  }
62  cnt++;
63  }
64  if (isMatched_Object) {
65  //Ambiguity removal
66  match[prevMatch] = true;
67  objects_.push_back(objectEntryType(shiftedObjectP4_matched, unshiftedObject->p4(), sqrt(dR2bestMatch_Object)));
68  }
69  }
70 
71  match.assign(objects_.size(), false);
72 
73  auto shiftedPFCandidates = std::make_unique<reco::PFCandidateCollection>();
74 
75  for (reco::PFCandidateCollection::const_iterator originalPFCandidate = originalPFCandidates->begin();
76  originalPFCandidate != originalPFCandidates->end();
77  ++originalPFCandidate) {
78  double shift = 0.;
79  bool applyShift = false;
80  double dR2bestMatch_PFCandidate = dRDefault;
81  prevMatch = -1;
82  cnt = 0;
83 
84  for (std::vector<objectEntryType>::const_iterator object = objects_.begin(); object != objects_.end(); ++object) {
85  if (!object->isValidMatch_)
86  continue;
87  if (match[cnt])
88  continue;
89 
90  double dR2 = deltaR2(originalPFCandidate->p4(), object->unshiftedObjectP4_);
91  if (dR2 < dR2match_PFCandidate_ && dR2 < dR2bestMatch_PFCandidate) {
92  shift = object->shift_;
93  applyShift = true;
94  dR2bestMatch_PFCandidate = dR2;
95 
96  prevMatch = cnt;
97  }
98  cnt++;
99  }
100 
101  reco::Candidate::LorentzVector shiftedPFCandidateP4 = originalPFCandidate->p4();
102  if (applyShift) {
103  //Ambiguity removal
104  match[prevMatch] = true;
105 
106  shiftedPFCandidateP4 *= (1. + shift);
107  }
108 
109  reco::PFCandidate shiftedPFCandidate(*originalPFCandidate);
110  shiftedPFCandidate.setP4(shiftedPFCandidateP4);
111 
112  shiftedPFCandidates->push_back(shiftedPFCandidate);
113  }
114 
115  evt.put(std::move(shiftedPFCandidates));
116 }
117 
119 
T getParameter(std::string const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
bool exists(std::string const &parameterName) const
checks if a parameter exists
size_type size() const
const double dRDefault
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
const_iterator begin() const
T sqrt(T t)
Definition: SSEVec.h:19
std::vector< reco::PFCandidate > PFCandidateCollection
collection of PFCandidates
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Definition: Candidate.h:37
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:40
fixed size matrix
HLT enums.
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:86
static unsigned int const shift
const_iterator end() const
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
void produce(edm::Event &, const edm::EventSetup &) override
void setP4(const LorentzVector &p4) final
set 4-momentum
def move(src, dest)
Definition: eostools.py:511
edm::EDGetTokenT< CandidateView > srcUnshiftedObjectsToken_
edm::EDGetTokenT< reco::PFCandidateCollection > srcPFCandidatesToken_