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 inputTagPFClustersHO_
00066 = iConfig.getParameter<InputTag>("PFClustersHO");
00067
00068 inputTagPFClustersHFEM_
00069 = iConfig.getParameter<InputTag>("PFClustersHFEM");
00070
00071 inputTagPFClustersHFHAD_
00072 = iConfig.getParameter<InputTag>("PFClustersHFHAD");
00073
00074 inputTagPFClustersPS_
00075 = iConfig.getParameter<InputTag>("PFClustersPS");
00076
00077 useEGPhotons_ = iConfig.getParameter<bool>("useEGPhotons");
00078
00079 if(useEGPhotons_) {
00080 inputTagEGPhotons_
00081 = iConfig.getParameter<InputTag>("EGPhotons");
00082 }
00083
00084 useSuperClusters_ = iConfig.existsAs<bool>("useSuperClusters") ? iConfig.getParameter<bool>("useSuperClusters") : false;
00085
00086 if (useSuperClusters_) {
00087 inputTagSCBarrel_
00088 = iConfig.getParameter<InputTag>("SCBarrel");
00089 inputTagSCEndcap_
00090 = iConfig.getParameter<InputTag>("SCEndcap");
00091 }
00092
00093 verbose_ =
00094 iConfig.getUntrackedParameter<bool>("verbose",false);
00095
00096 bool debug_ =
00097 iConfig.getUntrackedParameter<bool>("debug",false);
00098
00099 usePFatHLT_ = iConfig.getParameter<bool>("usePFatHLT");
00100
00101 useNuclear_ = iConfig.getParameter<bool>("useNuclear");
00102
00103 useConversions_ = iConfig.getParameter<bool>("useConversions");
00104
00105 useConvBremGsfTracks_ = iConfig.getParameter<bool>("useConvBremGsfTracks");
00106
00107 bool useConvBremPFRecTracks = iConfig.getParameter<bool>("useConvBremPFRecTracks");
00108
00109 useV0_ = iConfig.getParameter<bool>("useV0");
00110
00111 useHO_= iConfig.getParameter<bool>("useHO");
00112
00113 produces<reco::PFBlockCollection>();
00114
00115
00116 useKDTreeTrackEcalLinker_ = iConfig.getParameter<bool>("useKDTreeTrackEcalLinker");
00117
00118
00119
00120
00121 std::vector<double> DPtovPtCut
00122 = iConfig.getParameter<std::vector<double> >("pf_DPtoverPt_Cut");
00123 if (DPtovPtCut.size()!=5)
00124 {
00125 edm::LogError("MisConfiguration")<<" vector pf_DPtoverPt_Cut has to be of size 5";
00126 throw;
00127 }
00128
00129 std::vector<unsigned> NHitCut
00130 = iConfig.getParameter<std::vector<unsigned> >("pf_NHit_Cut");
00131 if (NHitCut.size()!=5)
00132 {
00133 edm::LogError("MisConfiguration")<<" vector pf_NHit_Cut has to be of size 5";
00134 throw;
00135 }
00136
00137 bool useIterTracking
00138 = iConfig.getParameter<bool>("useIterTracking");
00139
00140 int nuclearInteractionsPurity
00141 = iConfig.getParameter<unsigned>("nuclearInteractionsPurity");
00142
00143
00144 std::vector<double> EGPhotonSelectionCuts ;
00145
00146 if (useEGPhotons_)
00147 EGPhotonSelectionCuts = iConfig.getParameter<std::vector<double> >("PhotonSelectionCuts");
00148
00149
00150 if (useNuclear_){
00151 if (nuclearInteractionsPurity > 3 || nuclearInteractionsPurity < 1) {
00152 nuclearInteractionsPurity = 1;
00153 edm::LogInfo("PFBlockProducer") << "NI purity not properly implemented. Set it to the strongest level " << nuclearInteractionsPurity << endl;
00154 }
00155 vector<string> securityLevel;
00156 securityLevel.push_back("isNucl"); securityLevel.push_back("isNucl && isNuclLoose"); securityLevel.push_back("isNucl && isNuclLoose && isNuclKink");
00157 edm::LogInfo("PFBlockProducer") << "NI interactions are corrected in PFlow for " << securityLevel[nuclearInteractionsPurity-1].c_str() << endl;
00158 }
00159
00160
00161 pfBlockAlgo_.setParameters( DPtovPtCut,
00162 NHitCut,
00163 useConvBremPFRecTracks,
00164 useIterTracking,
00165 nuclearInteractionsPurity,
00166 useEGPhotons_,
00167 EGPhotonSelectionCuts,
00168 useSuperClusters_
00169 );
00170
00171 pfBlockAlgo_.setDebug(debug_);
00172
00173
00174 pfBlockAlgo_.setUseOptimization(useKDTreeTrackEcalLinker_);
00175
00176
00177
00178 pfBlockAlgo_.setHOTag(useHO_);
00179
00180 }
00181
00182
00183
00184 PFBlockProducer::~PFBlockProducer() { }
00185
00186
00187
00188 void
00189 PFBlockProducer::produce(Event& iEvent,
00190 const EventSetup& iSetup) {
00191
00192 LogDebug("PFBlockProducer")<<"START event: "<<iEvent.id().event()
00193 <<" in run "<<iEvent.id().run()<<endl;
00194
00195
00196
00197
00198 Handle< reco::PFRecTrackCollection > recTracks;
00199
00200
00201 bool found = iEvent.getByLabel(inputTagRecTracks_, recTracks);
00202
00203 if(!found )
00204 LogError("PFBlockProducer")<<" cannot get rectracks: "
00205 <<inputTagRecTracks_<<endl;
00206
00207
00208
00209
00210 Handle< reco::GsfPFRecTrackCollection > GsfrecTracks;
00211
00212 if(!usePFatHLT_) {
00213 found = iEvent.getByLabel(inputTagGsfRecTracks_,GsfrecTracks);
00214
00215 if(!found )
00216 LogError("PFBlockProducer")<<" cannot get Gsfrectracks: "
00217 << inputTagGsfRecTracks_ <<endl;
00218 }
00219
00220
00221 Handle< reco::GsfPFRecTrackCollection > convBremGsfrecTracks;
00222
00223 if(useConvBremGsfTracks_) {
00224 found = iEvent.getByLabel(inputTagConvBremGsfRecTracks_,convBremGsfrecTracks);
00225
00226 if(!found )
00227 LogError("PFBlockProducer")<<" cannot get ConvBremGsfrectracks: "
00228 << inputTagConvBremGsfRecTracks_ <<endl;
00229 }
00230
00231
00232 Handle< reco::MuonCollection > recMuons;
00233
00234
00235
00236 found = iEvent.getByLabel(inputTagRecMuons_, recMuons);
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246 Handle< reco::PFDisplacedTrackerVertexCollection > pfNuclears;
00247
00248 if( useNuclear_ ) {
00249
00250 found = iEvent.getByLabel(inputTagPFNuclear_, pfNuclears);
00251 if(!found )
00252 LogError("PFBlockProducer")<<" cannot get PFNuclearInteractions : "
00253 <<inputTagPFNuclear_<<endl;
00254 }
00255
00256
00257 Handle< reco::PFConversionCollection > pfConversions;
00258 if( useConversions_ ) {
00259 found = iEvent.getByLabel(inputTagPFConversions_, pfConversions);
00260
00261 if(!found )
00262 LogError("PFBlockProducer")<<" cannot get PFConversions : "
00263 <<inputTagPFConversions_<<endl;
00264 }
00265
00266
00267
00268 Handle< reco::PFV0Collection > pfV0;
00269 if( useV0_ ) {
00270 found = iEvent.getByLabel(inputTagPFV0_, pfV0);
00271
00272 if(!found )
00273 LogError("PFBlockProducer")<<" cannot get PFV0 : "
00274 <<inputTagPFV0_<<endl;
00275 }
00276
00277
00278
00279
00280
00281
00282 Handle< reco::PFClusterCollection > clustersECAL;
00283 found = iEvent.getByLabel(inputTagPFClustersECAL_,
00284 clustersECAL);
00285 if(!found )
00286 LogError("PFBlockProducer")<<" cannot get ECAL clusters: "
00287 <<inputTagPFClustersECAL_<<endl;
00288
00289
00290 Handle< reco::PFClusterCollection > clustersHCAL;
00291 found = iEvent.getByLabel(inputTagPFClustersHCAL_,
00292 clustersHCAL);
00293 if(!found )
00294 LogError("PFBlockProducer")<<" cannot get HCAL clusters: "
00295 <<inputTagPFClustersHCAL_<<endl;
00296
00297 Handle< reco::PFClusterCollection > clustersHO;
00298 if (useHO_) {
00299 found = iEvent.getByLabel(inputTagPFClustersHO_,
00300 clustersHO);
00301 if(!found )
00302 LogError("PFBlockProducer")<<" cannot get HO clusters: "
00303 <<inputTagPFClustersHO_<<endl;
00304 }
00305
00306 Handle< reco::PFClusterCollection > clustersHFEM;
00307 found = iEvent.getByLabel(inputTagPFClustersHFEM_,
00308 clustersHFEM);
00309 if(!found )
00310 LogError("PFBlockProducer")<<" cannot get HFEM clusters: "
00311 <<inputTagPFClustersHFEM_<<endl;
00312
00313 Handle< reco::PFClusterCollection > clustersHFHAD;
00314 found = iEvent.getByLabel(inputTagPFClustersHFHAD_,
00315 clustersHFHAD);
00316 if(!found )
00317 LogError("PFBlockProducer")<<" cannot get HFHAD clusters: "
00318 <<inputTagPFClustersHFHAD_<<endl;
00319
00320
00321 Handle< reco::PFClusterCollection > clustersPS;
00322 found = iEvent.getByLabel(inputTagPFClustersPS_,
00323 clustersPS);
00324 if(!found )
00325 LogError("PFBlockProducer")<<" cannot get PS clusters: "
00326 <<inputTagPFClustersPS_<<endl;
00327
00328
00329 Handle< reco::PFRecTrackCollection > nuclearRecTracks;
00330
00331
00332 Handle< reco::PhotonCollection > egPhotons;
00333 found = iEvent.getByLabel(inputTagEGPhotons_,
00334 egPhotons);
00335
00336 if(!found && useEGPhotons_ )
00337 LogError("PFBlockProducer")<<" cannot get photons"
00338 << inputTagEGPhotons_ << endl;
00339
00340 Handle< reco::SuperClusterCollection > sceb;
00341 Handle< reco::SuperClusterCollection > scee;
00342
00343 if (useSuperClusters_) {
00344 found = iEvent.getByLabel(inputTagSCBarrel_,
00345 sceb);
00346
00347 if(!found)
00348 LogError("PFBlockProducer")<<" cannot get sceb"
00349 << inputTagSCBarrel_ << endl;
00350
00351
00352
00353 found = iEvent.getByLabel(inputTagSCEndcap_,
00354 scee);
00355
00356 if(!found)
00357 LogError("PFBlockProducer")<<" cannot get scee"
00358 << inputTagSCEndcap_ << endl;
00359
00360 }
00361
00362 if( usePFatHLT_ ) {
00363 pfBlockAlgo_.setInput( recTracks,
00364 recMuons,
00365 clustersECAL,
00366 clustersHCAL,
00367 clustersHO,
00368 clustersHFEM,
00369 clustersHFHAD,
00370 clustersPS);
00371 } else {
00372 pfBlockAlgo_.setInput( recTracks,
00373 GsfrecTracks,
00374 convBremGsfrecTracks,
00375 recMuons,
00376 pfNuclears,
00377 nuclearRecTracks,
00378 pfConversions,
00379 pfV0,
00380 clustersECAL,
00381 clustersHCAL,
00382 clustersHO,
00383 clustersHFEM,
00384 clustersHFHAD,
00385 clustersPS,
00386 egPhotons,
00387 sceb,
00388 scee);
00389 }
00390 pfBlockAlgo_.findBlocks();
00391
00392 if(verbose_) {
00393 ostringstream str;
00394 str<<pfBlockAlgo_<<endl;
00395 LogInfo("PFBlockProducer") << str.str()<<endl;
00396 }
00397
00398 auto_ptr< reco::PFBlockCollection >
00399 pOutputBlockCollection( pfBlockAlgo_.transferBlocks() );
00400
00401 iEvent.put(pOutputBlockCollection);
00402
00403 LogDebug("PFBlockProducer")<<"STOP event: "<<iEvent.id().event()
00404 <<" in run "<<iEvent.id().run()<<endl;
00405 }