CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch9/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/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   // 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 
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   // particle flow parameters  -----------------------------------
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   // get rectracks
00156   
00157   Handle< reco::PFRecTrackCollection > recTracks;
00158   
00159   // LogDebug("PFBlockProducer")<<"get reco tracks"<<endl;
00160   bool found = iEvent.getByLabel(inputTagRecTracks_, recTracks);
00161     
00162   if(!found )
00163     LogError("PFBlockProducer")<<" cannot get rectracks: "
00164                                <<inputTagRecTracks_<<endl;
00165 
00166 
00167 
00168   // get GsfTracks 
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   // get ConvBremGsfTracks 
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   // get recmuons
00191   Handle< reco::MuonCollection > recMuons;
00192 
00193   // LogDebug("PFBlockProducer")<<"get reco muons"<<endl;
00194   if(!usePFatHLT_) {
00195     found = iEvent.getByLabel(inputTagRecMuons_, recMuons);
00196   
00197     //if(!found )
00198     //  LogError("PFBlockProducer")<<" cannot get recmuons: "
00199     //                   <<inputTagRecMuons_<<endl;
00200 
00201   // get PFNuclearInteractions
00202   }
00203   //---------- Gouzevitch
00204   //  Handle< reco::PFNuclearInteractionCollection > pfNuclears; 
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   // get conversions
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   // get V0s
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   // get ECAL, HCAL and PS clusters
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 }