Go to the documentation of this file.00001 #include "RecoParticleFlow/PFProducer/plugins/PFBlockProducer.h"
00002
00003 #include "RecoParticleFlow/PFClusterTools/interface/PFEnergyCalibration.h"
00004 #include "RecoParticleFlow/PFClusterTools/interface/PFEnergyResolution.h"
00005
00006 #include "DataFormats/ParticleFlowReco/interface/PFLayer.h"
00007 #include "DataFormats/ParticleFlowReco/interface/PFCluster.h"
00008 #include "DataFormats/ParticleFlowReco/interface/PFRecTrack.h"
00009 #include "DataFormats/ParticleFlowReco/interface/PFDisplacedVertexFwd.h"
00010 #include "DataFormats/ParticleFlowReco/interface/PFDisplacedVertex.h"
00011 #include "DataFormats/ParticleFlowReco/interface/PFConversionFwd.h"
00012 #include "DataFormats/ParticleFlowReco/interface/PFConversion.h"
00013 #include "DataFormats/ParticleFlowReco/interface/PFV0Fwd.h"
00014 #include "DataFormats/ParticleFlowReco/interface/PFV0.h"
00015
00016 #include "DataFormats/EgammaCandidates/interface/Photon.h"
00017 #include "DataFormats/EgammaCandidates/interface/PhotonFwd.h"
00018
00019 #include "FWCore/Framework/interface/ESHandle.h"
00020
00021 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00022 #include "FWCore/Utilities/interface/Exception.h"
00023 #include "FWCore/Framework/interface/EventSetup.h"
00024
00025 #include "DataFormats/MuonReco/interface/MuonFwd.h"
00026
00027 #include "FWCore/ParameterSet/interface/FileInPath.h"
00028
00029 #include <set>
00030
00031 using namespace std;
00032 using namespace edm;
00033
00034 PFBlockProducer::PFBlockProducer(const edm::ParameterSet& iConfig) {
00035
00036
00037
00038 inputTagRecTracks_
00039 = iConfig.getParameter<InputTag>("RecTracks");
00040
00041 inputTagGsfRecTracks_
00042 = iConfig.getParameter<InputTag>("GsfRecTracks");
00043
00044 inputTagConvBremGsfRecTracks_
00045 = iConfig.getParameter<InputTag>("ConvBremGsfRecTracks");
00046
00047 inputTagRecMuons_
00048 = iConfig.getParameter<InputTag>("RecMuons");
00049
00050 inputTagPFNuclear_
00051 = iConfig.getParameter<InputTag>("PFNuclear");
00052
00053 inputTagPFConversions_
00054 = iConfig.getParameter<InputTag>("PFConversions");
00055
00056 inputTagPFV0_
00057 = iConfig.getParameter<InputTag>("PFV0");
00058
00059 inputTagPFClustersECAL_
00060 = iConfig.getParameter<InputTag>("PFClustersECAL");
00061
00062 inputTagPFClustersHCAL_
00063 = iConfig.getParameter<InputTag>("PFClustersHCAL");
00064
00065 inputTagPFClustersHFEM_
00066 = iConfig.getParameter<InputTag>("PFClustersHFEM");
00067
00068 inputTagPFClustersHFHAD_
00069 = iConfig.getParameter<InputTag>("PFClustersHFHAD");
00070
00071 inputTagPFClustersPS_
00072 = iConfig.getParameter<InputTag>("PFClustersPS");
00073
00074 useEGPhotons_ = iConfig.getParameter<bool>("useEGPhotons");
00075
00076 if(useEGPhotons_) {
00077 inputTagEGPhotons_
00078 = iConfig.getParameter<InputTag>("EGPhotons");
00079 }
00080
00081 verbose_ =
00082 iConfig.getUntrackedParameter<bool>("verbose",false);
00083
00084 bool debug_ =
00085 iConfig.getUntrackedParameter<bool>("debug",false);
00086
00087 usePFatHLT_ = iConfig.getParameter<bool>("usePFatHLT");
00088
00089 useNuclear_ = iConfig.getParameter<bool>("useNuclear");
00090
00091 useConversions_ = iConfig.getParameter<bool>("useConversions");
00092
00093 useConvBremGsfTracks_ = iConfig.getParameter<bool>("useConvBremGsfTracks");
00094
00095 bool useConvBremPFRecTracks = iConfig.getParameter<bool>("useConvBremPFRecTracks");
00096
00097 useV0_ = iConfig.getParameter<bool>("useV0");
00098
00099 produces<reco::PFBlockCollection>();
00100
00101
00102 useKDTreeTrackEcalLinker_ = iConfig.getParameter<bool>("useKDTreeTrackEcalLinker");
00103
00104
00105
00106
00107 std::vector<double> DPtovPtCut
00108 = iConfig.getParameter<std::vector<double> >("pf_DPtoverPt_Cut");
00109 if (DPtovPtCut.size()!=5)
00110 {
00111 edm::LogError("MisConfiguration")<<" vector pf_DPtoverPt_Cut has to be of size 5";
00112 throw;
00113 }
00114
00115 std::vector<unsigned> NHitCut
00116 = iConfig.getParameter<std::vector<unsigned> >("pf_NHit_Cut");
00117 if (NHitCut.size()!=5)
00118 {
00119 edm::LogError("MisConfiguration")<<" vector pf_NHit_Cut has to be of size 5";
00120 throw;
00121 }
00122
00123 bool useIterTracking
00124 = iConfig.getParameter<bool>("useIterTracking");
00125
00126 int nuclearInteractionsPurity
00127 = iConfig.getParameter<unsigned>("nuclearInteractionsPurity");
00128
00129
00130 std::vector<double> EGPhotonSelectionCuts ;
00131
00132 if (useEGPhotons_)
00133 EGPhotonSelectionCuts = iConfig.getParameter<std::vector<double> >("PhotonSelectionCuts");
00134
00135
00136 if (useNuclear_){
00137 if (nuclearInteractionsPurity > 3 || nuclearInteractionsPurity < 1) {
00138 nuclearInteractionsPurity = 1;
00139 edm::LogInfo("PFBlockProducer") << "NI purity not properly implemented. Set it to the strongest level " << nuclearInteractionsPurity << endl;
00140 }
00141 vector<string> securityLevel;
00142 securityLevel.push_back("isNucl"); securityLevel.push_back("isNucl && isNuclLoose"); securityLevel.push_back("isNucl && isNuclLoose && isNuclKink");
00143 edm::LogInfo("PFBlockProducer") << "NI interactions are corrected in PFlow for " << securityLevel[nuclearInteractionsPurity-1].c_str() << endl;
00144 }
00145
00146
00147 pfBlockAlgo_.setParameters( DPtovPtCut,
00148 NHitCut,
00149 useConvBremPFRecTracks,
00150 useIterTracking,
00151 nuclearInteractionsPurity,
00152 useEGPhotons_,
00153 EGPhotonSelectionCuts );
00154
00155 pfBlockAlgo_.setDebug(debug_);
00156
00157
00158 pfBlockAlgo_.setUseOptimization(useKDTreeTrackEcalLinker_);
00159
00160 }
00161
00162
00163
00164 PFBlockProducer::~PFBlockProducer() { }
00165
00166
00167
00168 void
00169 PFBlockProducer::beginJob() { }
00170
00171 void
00172 PFBlockProducer::beginRun(edm::Run & run,
00173 const edm::EventSetup & es) { }
00174
00175
00176 void
00177 PFBlockProducer::produce(Event& iEvent,
00178 const EventSetup& iSetup) {
00179
00180 LogDebug("PFBlockProducer")<<"START event: "<<iEvent.id().event()
00181 <<" in run "<<iEvent.id().run()<<endl;
00182
00183
00184
00185
00186 Handle< reco::PFRecTrackCollection > recTracks;
00187
00188
00189 bool found = iEvent.getByLabel(inputTagRecTracks_, recTracks);
00190
00191 if(!found )
00192 LogError("PFBlockProducer")<<" cannot get rectracks: "
00193 <<inputTagRecTracks_<<endl;
00194
00195
00196
00197
00198 Handle< reco::GsfPFRecTrackCollection > GsfrecTracks;
00199
00200 if(!usePFatHLT_) {
00201 found = iEvent.getByLabel(inputTagGsfRecTracks_,GsfrecTracks);
00202
00203 if(!found )
00204 LogError("PFBlockProducer")<<" cannot get Gsfrectracks: "
00205 << inputTagGsfRecTracks_ <<endl;
00206 }
00207
00208
00209 Handle< reco::GsfPFRecTrackCollection > convBremGsfrecTracks;
00210
00211 if(useConvBremGsfTracks_) {
00212 found = iEvent.getByLabel(inputTagConvBremGsfRecTracks_,convBremGsfrecTracks);
00213
00214 if(!found )
00215 LogError("PFBlockProducer")<<" cannot get ConvBremGsfrectracks: "
00216 << inputTagConvBremGsfRecTracks_ <<endl;
00217 }
00218
00219
00220 Handle< reco::MuonCollection > recMuons;
00221
00222
00223
00224 found = iEvent.getByLabel(inputTagRecMuons_, recMuons);
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234 Handle< reco::PFDisplacedTrackerVertexCollection > pfNuclears;
00235
00236 if( useNuclear_ ) {
00237
00238 found = iEvent.getByLabel(inputTagPFNuclear_, pfNuclears);
00239 if(!found )
00240 LogError("PFBlockProducer")<<" cannot get PFNuclearInteractions : "
00241 <<inputTagPFNuclear_<<endl;
00242 }
00243
00244
00245
00246
00247
00248 Handle< reco::PFConversionCollection > pfConversions;
00249 if( useConversions_ ) {
00250 found = iEvent.getByLabel(inputTagPFConversions_, pfConversions);
00251
00252 if(!found )
00253 LogError("PFBlockProducer")<<" cannot get PFConversions : "
00254 <<inputTagPFConversions_<<endl;
00255 }
00256
00257
00258
00259 Handle< reco::PFV0Collection > pfV0;
00260 if( useV0_ ) {
00261 found = iEvent.getByLabel(inputTagPFV0_, pfV0);
00262
00263 if(!found )
00264 LogError("PFBlockProducer")<<" cannot get PFV0 : "
00265 <<inputTagPFV0_<<endl;
00266 }
00267
00268
00269
00270
00271
00272
00273 Handle< reco::PFClusterCollection > clustersECAL;
00274 found = iEvent.getByLabel(inputTagPFClustersECAL_,
00275 clustersECAL);
00276 if(!found )
00277 LogError("PFBlockProducer")<<" cannot get ECAL clusters: "
00278 <<inputTagPFClustersECAL_<<endl;
00279
00280
00281 Handle< reco::PFClusterCollection > clustersHCAL;
00282 found = iEvent.getByLabel(inputTagPFClustersHCAL_,
00283 clustersHCAL);
00284 if(!found )
00285 LogError("PFBlockProducer")<<" cannot get HCAL clusters: "
00286 <<inputTagPFClustersHCAL_<<endl;
00287
00288 Handle< reco::PFClusterCollection > clustersHFEM;
00289 found = iEvent.getByLabel(inputTagPFClustersHFEM_,
00290 clustersHFEM);
00291 if(!found )
00292 LogError("PFBlockProducer")<<" cannot get HFEM clusters: "
00293 <<inputTagPFClustersHFEM_<<endl;
00294
00295 Handle< reco::PFClusterCollection > clustersHFHAD;
00296 found = iEvent.getByLabel(inputTagPFClustersHFHAD_,
00297 clustersHFHAD);
00298 if(!found )
00299 LogError("PFBlockProducer")<<" cannot get HFHAD clusters: "
00300 <<inputTagPFClustersHFHAD_<<endl;
00301
00302
00303 Handle< reco::PFClusterCollection > clustersPS;
00304 found = iEvent.getByLabel(inputTagPFClustersPS_,
00305 clustersPS);
00306 if(!found )
00307 LogError("PFBlockProducer")<<" cannot get PS clusters: "
00308 <<inputTagPFClustersPS_<<endl;
00309
00310
00311 Handle< reco::PFRecTrackCollection > nuclearRecTracks;
00312
00313
00314 Handle< reco::PhotonCollection > egPhotons;
00315 found = iEvent.getByLabel(inputTagEGPhotons_,
00316 egPhotons);
00317
00318 if(!found && useEGPhotons_ )
00319 LogError("PFBlockProducer")<<" cannot get photons"
00320 << inputTagEGPhotons_ << endl;
00321
00322 if( usePFatHLT_ ) {
00323 pfBlockAlgo_.setInput( recTracks,
00324 recMuons,
00325 clustersECAL,
00326 clustersHCAL,
00327 clustersHFEM,
00328 clustersHFHAD,
00329 clustersPS );
00330 } else {
00331 pfBlockAlgo_.setInput( recTracks,
00332 GsfrecTracks,
00333 convBremGsfrecTracks,
00334 recMuons,
00335 pfNuclears,
00336 nuclearRecTracks,
00337 pfConversions,
00338 pfV0,
00339 clustersECAL,
00340 clustersHCAL,
00341 clustersHFEM,
00342 clustersHFHAD,
00343 clustersPS,
00344 egPhotons);
00345 }
00346 pfBlockAlgo_.findBlocks();
00347
00348 if(verbose_) {
00349 ostringstream str;
00350 str<<pfBlockAlgo_<<endl;
00351 LogInfo("PFBlockProducer") << str.str()<<endl;
00352 }
00353
00354 auto_ptr< reco::PFBlockCollection >
00355 pOutputBlockCollection( pfBlockAlgo_.transferBlocks() );
00356
00357
00358 iEvent.put(pOutputBlockCollection);
00359
00360 LogDebug("PFBlockProducer")<<"STOP event: "<<iEvent.id().event()
00361 <<" in run "<<iEvent.id().run()<<endl;
00362 }