CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/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   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   // Glowinski & Gouzevitch
00116   useKDTreeTrackEcalLinker_ = iConfig.getParameter<bool>("useKDTreeTrackEcalLinker");
00117   // !Glowinski & Gouzevitch
00118   
00119   // particle flow parameters  -----------------------------------
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   // if first parameter 0, deactivated 
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   // Glowinski & Gouzevitch
00174   pfBlockAlgo_.setUseOptimization(useKDTreeTrackEcalLinker_);
00175   // !Glowinski & Gouzevitch
00176 
00177   // Use HO clusters for link
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   // get rectracks
00197   
00198   Handle< reco::PFRecTrackCollection > recTracks;
00199   
00200   // LogDebug("PFBlockProducer")<<"get reco tracks"<<endl;
00201   bool found = iEvent.getByLabel(inputTagRecTracks_, recTracks);
00202     
00203   if(!found )
00204     LogError("PFBlockProducer")<<" cannot get rectracks: "
00205                                <<inputTagRecTracks_<<endl;
00206 
00207 
00208 
00209   // get GsfTracks 
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   // get ConvBremGsfTracks 
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   // get recmuons
00232   Handle< reco::MuonCollection > recMuons;
00233 
00234   // LogDebug("PFBlockProducer")<<"get reco muons"<<endl;
00235   //if(!usePFatHLT_) {
00236   found = iEvent.getByLabel(inputTagRecMuons_, recMuons);
00237   
00238     //if(!found )
00239     //  LogError("PFBlockProducer")<<" cannot get recmuons: "
00240     //                   <<inputTagRecMuons_<<endl;
00241 
00242   // get PFNuclearInteractions
00243   //}
00244   //---------- Gouzevitch
00245   //  Handle< reco::PFNuclearInteractionCollection > pfNuclears; 
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   // get conversions
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   // get V0s
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   // get ECAL, HCAL, HO and PS clusters
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   // dummy. Not used in the full framework 
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 }