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/ParticleFlowReco/interface/PFBlock.h"
00017 #include "DataFormats/ParticleFlowReco/interface/PFBlockFwd.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
00075
00076 verbose_ =
00077 iConfig.getUntrackedParameter<bool>("verbose",false);
00078
00079 bool debug_ =
00080 iConfig.getUntrackedParameter<bool>("debug",false);
00081
00082 usePFatHLT_ = iConfig.getParameter<bool>("usePFatHLT");
00083
00084 useNuclear_ = iConfig.getParameter<bool>("useNuclear");
00085
00086 useConversions_ = iConfig.getParameter<bool>("useConversions");
00087
00088 useConvBremGsfTracks_ = iConfig.getParameter<bool>("useConvBremGsfTracks");
00089
00090 bool useConvBremPFRecTracks = iConfig.getParameter<bool>("useConvBremPFRecTracks");
00091
00092 useV0_ = iConfig.getParameter<bool>("useV0");
00093
00094 produces<reco::PFBlockCollection>();
00095
00096
00097
00098
00099
00100 std::vector<double> DPtovPtCut
00101 = iConfig.getParameter<std::vector<double> >("pf_DPtoverPt_Cut");
00102
00103 std::vector<unsigned> NHitCut
00104 = iConfig.getParameter<std::vector<unsigned> >("pf_NHit_Cut");
00105
00106 bool useIterTracking
00107 = iConfig.getParameter<bool>("useIterTracking");
00108
00109 int nuclearInteractionsPurity
00110 = iConfig.getParameter<unsigned>("nuclearInteractionsPurity");
00111
00112 if (useNuclear_){
00113 if (nuclearInteractionsPurity > 3 || nuclearInteractionsPurity < 1) {
00114 nuclearInteractionsPurity = 1;
00115 edm::LogInfo("PFBlockProducer") << "NI purity not properly implemented. Set it to the strongest level " << nuclearInteractionsPurity << endl;
00116 }
00117 vector<string> securityLevel;
00118 securityLevel.push_back("isNucl"); securityLevel.push_back("isNucl && isNuclLoose"); securityLevel.push_back("isNucl && isNuclLoose && isNuclKink");
00119 edm::LogInfo("PFBlockProducer") << "NI interactions are corrected in PFlow for " << securityLevel[nuclearInteractionsPurity-1].c_str() << endl;
00120 }
00121
00122
00123 pfBlockAlgo_.setParameters( DPtovPtCut,
00124 NHitCut,
00125 useConvBremPFRecTracks,
00126 useIterTracking,
00127 nuclearInteractionsPurity);
00128
00129 pfBlockAlgo_.setDebug(debug_);
00130
00131 }
00132
00133
00134
00135 PFBlockProducer::~PFBlockProducer() { }
00136
00137
00138
00139 void
00140 PFBlockProducer::beginJob() { }
00141
00142 void
00143 PFBlockProducer::beginRun(edm::Run & run,
00144 const edm::EventSetup & es) { }
00145
00146
00147 void
00148 PFBlockProducer::produce(Event& iEvent,
00149 const EventSetup& iSetup) {
00150
00151 LogDebug("PFBlockProducer")<<"START event: "<<iEvent.id().event()
00152 <<" in run "<<iEvent.id().run()<<endl;
00153
00154
00155
00156
00157 Handle< reco::PFRecTrackCollection > recTracks;
00158
00159
00160 bool found = iEvent.getByLabel(inputTagRecTracks_, recTracks);
00161
00162 if(!found )
00163 LogError("PFBlockProducer")<<" cannot get rectracks: "
00164 <<inputTagRecTracks_<<endl;
00165
00166
00167
00168
00169 Handle< reco::GsfPFRecTrackCollection > GsfrecTracks;
00170
00171 if(!usePFatHLT_) {
00172 found = iEvent.getByLabel(inputTagGsfRecTracks_,GsfrecTracks);
00173
00174 if(!found )
00175 LogError("PFBlockProducer")<<" cannot get Gsfrectracks: "
00176 << inputTagGsfRecTracks_ <<endl;
00177 }
00178
00179
00180 Handle< reco::GsfPFRecTrackCollection > convBremGsfrecTracks;
00181
00182 if(useConvBremGsfTracks_) {
00183 found = iEvent.getByLabel(inputTagConvBremGsfRecTracks_,convBremGsfrecTracks);
00184
00185 if(!found )
00186 LogError("PFBlockProducer")<<" cannot get ConvBremGsfrectracks: "
00187 << inputTagConvBremGsfRecTracks_ <<endl;
00188 }
00189
00190
00191 Handle< reco::MuonCollection > recMuons;
00192
00193
00194 if(!usePFatHLT_) {
00195 found = iEvent.getByLabel(inputTagRecMuons_, recMuons);
00196
00197
00198
00199
00200
00201
00202 }
00203
00204
00205 Handle< reco::PFDisplacedTrackerVertexCollection > pfNuclears;
00206
00207 if( useNuclear_ ) {
00208
00209 found = iEvent.getByLabel(inputTagPFNuclear_, pfNuclears);
00210 if(!found )
00211 LogError("PFBlockProducer")<<" cannot get PFNuclearInteractions : "
00212 <<inputTagPFNuclear_<<endl;
00213 }
00214
00215
00216
00217
00218
00219 Handle< reco::PFConversionCollection > pfConversions;
00220 if( useConversions_ ) {
00221 found = iEvent.getByLabel(inputTagPFConversions_, pfConversions);
00222
00223 if(!found )
00224 LogError("PFBlockProducer")<<" cannot get PFConversions : "
00225 <<inputTagPFConversions_<<endl;
00226 }
00227
00228
00229
00230 Handle< reco::PFV0Collection > pfV0;
00231 if( useV0_ ) {
00232 found = iEvent.getByLabel(inputTagPFV0_, pfV0);
00233
00234 if(!found )
00235 LogError("PFBlockProducer")<<" cannot get PFV0 : "
00236 <<inputTagPFV0_<<endl;
00237 }
00238
00239
00240
00241
00242
00243
00244 Handle< reco::PFClusterCollection > clustersECAL;
00245 found = iEvent.getByLabel(inputTagPFClustersECAL_,
00246 clustersECAL);
00247 if(!found )
00248 LogError("PFBlockProducer")<<" cannot get ECAL clusters: "
00249 <<inputTagPFClustersECAL_<<endl;
00250
00251
00252 Handle< reco::PFClusterCollection > clustersHCAL;
00253 found = iEvent.getByLabel(inputTagPFClustersHCAL_,
00254 clustersHCAL);
00255 if(!found )
00256 LogError("PFBlockProducer")<<" cannot get HCAL clusters: "
00257 <<inputTagPFClustersHCAL_<<endl;
00258
00259 Handle< reco::PFClusterCollection > clustersHFEM;
00260 found = iEvent.getByLabel(inputTagPFClustersHFEM_,
00261 clustersHFEM);
00262 if(!found )
00263 LogError("PFBlockProducer")<<" cannot get HFEM clusters: "
00264 <<inputTagPFClustersHFEM_<<endl;
00265
00266 Handle< reco::PFClusterCollection > clustersHFHAD;
00267 found = iEvent.getByLabel(inputTagPFClustersHFHAD_,
00268 clustersHFHAD);
00269 if(!found )
00270 LogError("PFBlockProducer")<<" cannot get HFHAD clusters: "
00271 <<inputTagPFClustersHFHAD_<<endl;
00272
00273
00274 Handle< reco::PFClusterCollection > clustersPS;
00275 found = iEvent.getByLabel(inputTagPFClustersPS_,
00276 clustersPS);
00277 if(!found )
00278 LogError("PFBlockProducer")<<" cannot get PS clusters: "
00279 <<inputTagPFClustersPS_<<endl;
00280
00281 Handle< reco::PFRecTrackCollection > nuclearRecTracks;
00282
00283 if( usePFatHLT_ ) {
00284 pfBlockAlgo_.setInput( recTracks,
00285 clustersECAL,
00286 clustersHCAL,
00287 clustersHFEM,
00288 clustersHFHAD,
00289 clustersPS );
00290 } else {
00291 pfBlockAlgo_.setInput( recTracks,
00292 GsfrecTracks,
00293 convBremGsfrecTracks,
00294 recMuons,
00295 pfNuclears,
00296 nuclearRecTracks,
00297 pfConversions,
00298 pfV0,
00299 clustersECAL,
00300 clustersHCAL,
00301 clustersHFEM,
00302 clustersHFHAD,
00303 clustersPS );
00304 }
00305 pfBlockAlgo_.findBlocks();
00306
00307 if(verbose_) {
00308 ostringstream str;
00309 str<<pfBlockAlgo_<<endl;
00310 LogInfo("PFBlockProducer") << str.str()<<endl;
00311 }
00312
00313 auto_ptr< reco::PFBlockCollection >
00314 pOutputBlockCollection( pfBlockAlgo_.transferBlocks() );
00315
00316
00317 iEvent.put(pOutputBlockCollection);
00318
00319 LogDebug("PFBlockProducer")<<"STOP event: "<<iEvent.id().event()
00320 <<" in run "<<iEvent.id().run()<<endl;
00321 }