CMS 3D CMS Logo

CMSSW_4_4_3_patch1/src/RecoParticleFlow/PFProducer/plugins/PFBlockProducer.cc

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   // use configuration file to setup input/output collection names
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   // Glowinski & Gouzevitch
00102   useKDTreeTrackEcalLinker_ = iConfig.getParameter<bool>("useKDTreeTrackEcalLinker");
00103   // !Glowinski & Gouzevitch
00104   
00105   // particle flow parameters  -----------------------------------
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   // if first parameter 0, deactivated 
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   // Glowinski & Gouzevitch
00158   pfBlockAlgo_.setUseOptimization(useKDTreeTrackEcalLinker_);
00159   // !Glowinski & Gouzevitch
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   // get rectracks
00185   
00186   Handle< reco::PFRecTrackCollection > recTracks;
00187   
00188   // LogDebug("PFBlockProducer")<<"get reco tracks"<<endl;
00189   bool found = iEvent.getByLabel(inputTagRecTracks_, recTracks);
00190     
00191   if(!found )
00192     LogError("PFBlockProducer")<<" cannot get rectracks: "
00193                                <<inputTagRecTracks_<<endl;
00194 
00195 
00196 
00197   // get GsfTracks 
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   // get ConvBremGsfTracks 
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   // get recmuons
00220   Handle< reco::MuonCollection > recMuons;
00221 
00222   // LogDebug("PFBlockProducer")<<"get reco muons"<<endl;
00223   //if(!usePFatHLT_) {
00224   found = iEvent.getByLabel(inputTagRecMuons_, recMuons);
00225   
00226     //if(!found )
00227     //  LogError("PFBlockProducer")<<" cannot get recmuons: "
00228     //                   <<inputTagRecMuons_<<endl;
00229 
00230   // get PFNuclearInteractions
00231   //}
00232   //---------- Gouzevitch
00233   //  Handle< reco::PFNuclearInteractionCollection > pfNuclears; 
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   // get conversions
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   // get V0s
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   // get ECAL, HCAL and PS clusters
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   // dummy. Not used in the full framework 
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 }