CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PFPileUp.cc
Go to the documentation of this file.
2 
6 
8 
9 // #include "FWCore/MessageLogger/interface/MessageLogger.h"
12 
13 
14 using namespace std;
15 using namespace edm;
16 using namespace reco;
17 
19 
20  tokenPFCandidates_
21  = consumes<PFCollection>(iConfig.getParameter<InputTag>("PFCandidates"));
22 
23  tokenVertices_
24  = consumes<VertexCollection>(iConfig.getParameter<InputTag>("Vertices"));
25 
26  enable_ = iConfig.getParameter<bool>("Enable");
27 
28  verbose_ =
29  iConfig.getUntrackedParameter<bool>("verbose",false);
30 
31 
32  if ( iConfig.exists("checkClosestZVertex") ) {
33  checkClosestZVertex_ = iConfig.getParameter<bool>("checkClosestZVertex");
34  } else {
35  checkClosestZVertex_ = false;
36  }
37 
38  // Configure the algo
39  pileUpAlgo_.setVerbose(verbose_);
40  pileUpAlgo_.setCheckClosestZVertex(checkClosestZVertex_);
41 
42  //produces<reco::PFCandidateCollection>();
43  produces< PFCollection > ();
44  // produces< PFCollectionByValue > ();
45 }
46 
47 
48 
50 
51 
52 
54 
55 
57  const EventSetup& iSetup) {
58 
59 // LogDebug("PFPileUp")<<"START event: "<<iEvent.id().event()
60 // <<" in run "<<iEvent.id().run()<<endl;
61 
62 
63  // get PFCandidates
64 
65  auto_ptr< PFCollection >
66  pOutput( new PFCollection );
67 
68  auto_ptr< PFCollectionByValue >
69  pOutputByValue ( new PFCollectionByValue );
70 
71  if(enable_) {
72 
73 
74  // get vertices
75  Handle<VertexCollection> vertices;
76  iEvent.getByToken( tokenVertices_, vertices);
77 
78  // get PF Candidates
80  PFCollection const * pfCandidatesRef = 0;
81  PFCollection usedIfNoFwdPtrs;
82  bool getFromFwdPtr = iEvent.getByToken( tokenPFCandidates_, pfCandidates);
83  if ( getFromFwdPtr ) {
84  pfCandidatesRef = pfCandidates.product();
85  }
86  // Maintain backwards-compatibility.
87  // If there is no vector of FwdPtr<PFCandidate> found, then
88  // make a dummy vector<FwdPtr<PFCandidate> > for the PFPileupAlgo,
89  // set the pointer "pfCandidatesRef" to point to it, and
90  // then we can pass it to the PFPileupAlgo.
91  else {
92  Handle<PFView> pfView;
93  bool getFromView = iEvent.getByToken( tokenPFCandidates_, pfView );
94  if ( ! getFromView ) {
95  throw cms::Exception("PFPileUp is misconfigured. This needs to be either vector<FwdPtr<PFCandidate> >, or View<PFCandidate>");
96  }
97  for ( edm::View<reco::PFCandidate>::const_iterator viewBegin = pfView->begin(),
98  viewEnd = pfView->end(), iview = viewBegin;
99  iview != viewEnd; ++iview ) {
100  usedIfNoFwdPtrs.push_back( edm::FwdPtr<reco::PFCandidate>( pfView->ptrAt(iview-viewBegin), pfView->ptrAt(iview-viewBegin) ) );
101  }
102  pfCandidatesRef = &usedIfNoFwdPtrs;
103  }
104 
105  if ( pfCandidatesRef == 0 ) {
106  throw cms::Exception("Something went dreadfully wrong with PFPileUp. pfCandidatesRef should never be zero, so this is a logic error.");
107  }
108 
109 
110 
111  pileUpAlgo_.process(*pfCandidatesRef,*vertices);
112  pOutput->insert(pOutput->end(),pileUpAlgo_.getPFCandidatesFromPU().begin(),pileUpAlgo_.getPFCandidatesFromPU().end());
113 
114  // for ( PFCollection::const_iterator byValueBegin = pileUpAlgo_.getPFCandidatesFromPU().begin(),
115  // byValueEnd = pileUpAlgo_.getPFCandidatesFromPU().end(), ibyValue = byValueBegin;
116  // ibyValue != byValueEnd; ++ibyValue ) {
117  // pOutputByValue->push_back( **ibyValue );
118  // }
119 
120  } // end if enabled
121  // outsize of the loop to fill the collection anyway even when disabled
122  iEvent.put( pOutput );
123  // iEvent.put( pOutputByValue );
124 }
125 
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:81
virtual void produce(edm::Event &, const edm::EventSetup &)
Definition: PFPileUp.cc:56
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:434
bool exists(std::string const &parameterName) const
checks if a parameter exists
std::vector< PFCandidatePtr > pfCandidates(const PFJet &jet, int particleId, bool sort=true)
int iEvent
Definition: GenABIO.cc:243
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:116
std::vector< reco::PFCandidate > PFCollectionByValue
Definition: PFPileUp.h:39
std::vector< edm::FwdPtr< reco::PFCandidate > > PFCollection
Definition: PFPileUp.h:37
~PFPileUp()
Definition: PFPileUp.cc:49
virtual void beginJob()
Definition: PFPileUp.cc:53
T const * product() const
Definition: Handle.h:81
PFPileUp(const edm::ParameterSet &)
Definition: PFPileUp.cc:18