Go to the documentation of this file.00001 #include "RecoParticleFlow/PFProducer/plugins/PFCandidateChecker.h"
00002 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
00003 #include "DataFormats/ParticleFlowReco/interface/PFBlock.h"
00004 #include "DataFormats/JetReco/interface/PFJet.h"
00005
00006 #include "FWCore/Framework/interface/ESHandle.h"
00007
00008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00009 #include "FWCore/Utilities/interface/Exception.h"
00010 #include "FWCore/Framework/interface/EventSetup.h"
00011
00012
00013 using namespace std;
00014 using namespace edm;
00015 using namespace reco;
00016
00017 PFCandidateChecker::PFCandidateChecker(const edm::ParameterSet& iConfig) {
00018
00019
00020
00021 inputTagPFCandidatesReco_
00022 = iConfig.getParameter<InputTag>("pfCandidatesReco");
00023
00024 inputTagPFCandidatesReReco_
00025 = iConfig.getParameter<InputTag>("pfCandidatesReReco");
00026
00027 inputTagPFJetsReco_
00028 = iConfig.getParameter<InputTag>("pfJetsReco");
00029
00030 inputTagPFJetsReReco_
00031 = iConfig.getParameter<InputTag>("pfJetsReReco");
00032
00033 deltaEMax_
00034 = iConfig.getParameter<double>("deltaEMax");
00035
00036 deltaEtaMax_
00037 = iConfig.getParameter<double>("deltaEtaMax");
00038
00039 deltaPhiMax_
00040 = iConfig.getParameter<double>("deltaPhiMax");
00041
00042 verbose_ =
00043 iConfig.getUntrackedParameter<bool>("verbose",false);
00044
00045 printBlocks_ =
00046 iConfig.getUntrackedParameter<bool>("printBlocks",false);
00047
00048 rankByPt_ =
00049 iConfig.getUntrackedParameter<bool>("rankByPt",false);
00050
00051 entry_ = 0;
00052
00053
00054 LogDebug("PFCandidateChecker")
00055 <<" input collections : "<<inputTagPFCandidatesReco_<<" "<<inputTagPFCandidatesReReco_;
00056
00057 }
00058
00059
00060
00061 PFCandidateChecker::~PFCandidateChecker() { }
00062
00063
00064
00065 void
00066 PFCandidateChecker::beginRun(const edm::Run& run,
00067 const edm::EventSetup & es) { }
00068
00069
00070 void
00071 PFCandidateChecker::analyze(const Event& iEvent,
00072 const EventSetup& iSetup) {
00073
00074 LogDebug("PFCandidateChecker")<<"START event: "<<iEvent.id().event()
00075 <<" in run "<<iEvent.id().run()<<endl;
00076
00077
00078
00079
00080
00081 Handle<PFCandidateCollection> pfCandidatesReco;
00082 iEvent.getByLabel(inputTagPFCandidatesReco_, pfCandidatesReco);
00083
00084 Handle<PFCandidateCollection> pfCandidatesReReco;
00085 iEvent.getByLabel(inputTagPFCandidatesReReco_, pfCandidatesReReco);
00086
00087 Handle<PFJetCollection> pfJetsReco;
00088 iEvent.getByLabel(inputTagPFJetsReco_, pfJetsReco);
00089
00090 Handle<PFJetCollection> pfJetsReReco;
00091 iEvent.getByLabel(inputTagPFJetsReReco_, pfJetsReReco);
00092
00093 reco::PFCandidateCollection pfReco, pfReReco;
00094
00095
00096 if(rankByPt_)
00097 {
00098 pfReco=*pfCandidatesReco;
00099 pfReReco=*pfCandidatesReReco;
00100 sort(pfReco.begin(),pfReco.end(),greaterPt);
00101 sort(pfReReco.begin(),pfReReco.end(),greaterPt);
00102 }
00103
00104 unsigned minSize = pfReco.size() < pfReReco.size() ? pfReco.size() : pfReReco.size();
00105 bool differentCand = false;
00106 bool differentSize = pfReco.size() != pfReReco.size();
00107 if ( differentSize )
00108 std::cout << "+++WARNING+++ PFCandidate size changed for entry "
00109 << entry_ << " !" << endl
00110 << " - RECO size : " << pfReco.size() << endl
00111 << " - Re-RECO size : " << pfReReco.size() << endl;
00112
00113 unsigned npr = 0;
00114 for( unsigned i=0; i<minSize; i++ ) {
00115
00116 const reco::PFCandidate & candReco = (rankByPt_) ? pfReco[i] : (*pfCandidatesReco)[i];
00117 const reco::PFCandidate & candReReco = (rankByPt_) ? pfReReco[i] : (*pfCandidatesReReco)[i];
00118
00119 double deltaE = (candReReco.energy()-candReco.energy())/(candReReco.energy()+candReco.energy());
00120 double deltaEta = candReReco.eta()-candReco.eta();
00121 double deltaPhi = candReReco.phi()-candReco.phi();
00122 if ( fabs(deltaE) > deltaEMax_ ||
00123 fabs(deltaEta) > deltaEtaMax_ ||
00124 fabs(deltaPhi) > deltaPhiMax_ ) {
00125 differentCand = true;
00126 std::cout << "+++WARNING+++ PFCandidate " << i
00127 << " changed for entry " << entry_ << " ! " << std::endl
00128 << " - RECO : " << candReco << std::endl
00129 << " - Re-RECO : " << candReReco << std::endl
00130 << " DeltaE = : " << deltaE << std::endl
00131 << " DeltaEta = : " << deltaEta << std::endl
00132 << " DeltaPhi = : " << deltaPhi << std::endl << std::endl;
00133 if (printBlocks_) {
00134 std::cout << "Elements in Block for RECO: " <<std::endl;
00135 printElementsInBlocks(candReco);
00136 std::cout << "Elements in Block for Re-RECO: " <<std::endl;
00137 printElementsInBlocks(candReReco);
00138 }
00139 if ( ++npr == 5 ) break;
00140 }
00141 }
00142
00143 if ( differentSize || differentCand ) {
00144 printJets(*pfJetsReco, *pfJetsReReco);
00145 printMet(pfReco, pfReReco);
00146 }
00147
00148 ++entry_;
00149 LogDebug("PFCandidateChecker")<<"STOP event: "<<iEvent.id().event()
00150 <<" in run "<<iEvent.id().run()<<std::endl;
00151 }
00152
00153
00154 void PFCandidateChecker::printMet(const PFCandidateCollection& pfReco,
00155 const PFCandidateCollection& pfReReco) const {
00156
00157 double metX = 0.;
00158 double metY = 0.;
00159 for( unsigned i=0; i<pfReco.size(); i++ ) {
00160 metX += pfReco[i].px();
00161 metY += pfReco[i].py();
00162 }
00163 double met = std::sqrt(metX*metX + metY*metY);
00164 std::cout << "MET RECO = " << metX << " " << metY << " " << met << std::endl;
00165
00166 metX = 0.;
00167 metY = 0.;
00168 for( unsigned i=0; i<pfReReco.size(); i++ ) {
00169 metX += pfReReco[i].px();
00170 metY += pfReReco[i].py();
00171 }
00172 met = std::sqrt(metX*metX + metY*metY);
00173 std::cout << "MET Re-RECO = " << metX << " " << metY << " " << met << std::endl;
00174
00175 }
00176
00177 void PFCandidateChecker::printJets(const PFJetCollection& pfJetsReco,
00178 const PFJetCollection& pfJetsReReco) const {
00179
00180 bool differentSize = pfJetsReco.size() != pfJetsReReco.size();
00181 if ( differentSize )
00182 std::cout << "+++WARNING+++ PFJet size changed for entry "
00183 << entry_ << " !" << endl
00184 << " - RECO size : " << pfJetsReco.size() << endl
00185 << " - Re-RECO size : " << pfJetsReReco.size() << endl;
00186 unsigned minSize = pfJetsReco.size() < pfJetsReReco.size() ? pfJetsReco.size() : pfJetsReReco.size();
00187 unsigned npr = 0;
00188 for ( unsigned i = 0; i < minSize; ++i) {
00189 const reco::PFJet & candReco = pfJetsReco[i];
00190 const reco::PFJet & candReReco = pfJetsReReco[i];
00191 if ( candReco.et() < 20. && candReReco.et() < 20. ) break;
00192 double deltaE = (candReReco.et()-candReco.et())/(candReReco.et()+candReco.et());
00193 double deltaEta = candReReco.eta()-candReco.eta();
00194 double deltaPhi = candReReco.phi()-candReco.phi();
00195 if ( fabs(deltaE) > deltaEMax_ ||
00196 fabs(deltaEta) > deltaEtaMax_ ||
00197 fabs(deltaPhi) > deltaPhiMax_ ) {
00198 std::cout << "+++WARNING+++ PFJet " << i
00199 << " changed for entry " << entry_ << " ! " << std::endl
00200 << " - RECO : " << candReco.et() << " " << candReco.eta() << " " << candReco.phi() << std::endl
00201 << " - Re-RECO : " << candReReco.et() << " " << candReReco.eta() << " " << candReReco.phi() << std::endl
00202 << " DeltaE = : " << deltaE << std::endl
00203 << " DeltaEta = : " << deltaEta << std::endl
00204 << " DeltaPhi = : " << deltaPhi << std::endl << std::endl;
00205 if ( ++npr == 5 ) break;
00206 } else {
00207 std::cout << "Jet " << i << " " << candReco.et() << std::endl;
00208 }
00209 }
00210
00211 }
00212
00213
00214 void PFCandidateChecker::printElementsInBlocks(const PFCandidate& cand,
00215 ostream& out) const {
00216 if(!out) return;
00217
00218 PFBlockRef firstRef;
00219
00220 assert(!cand.elementsInBlocks().empty() );
00221 for(unsigned i=0; i<cand.elementsInBlocks().size(); i++) {
00222 PFBlockRef blockRef = cand.elementsInBlocks()[i].first;
00223
00224 if(blockRef.isNull()) {
00225 cerr<<"ERROR! no block ref!";
00226 continue;
00227 }
00228
00229 if(!i) {
00230 out<<(*blockRef);
00231 firstRef = blockRef;
00232 }
00233 else if( blockRef!=firstRef) {
00234 cerr<<"WARNING! This PFCandidate is not made from a single block"<<endl;
00235 }
00236
00237 out<<"\t"<<cand.elementsInBlocks()[i].second<<endl;
00238 }
00239 }