00001
00002 #include "GsfElectronBaseProducer.h"
00003
00004 #include "RecoEcal/EgammaCoreTools/interface/EcalClusterFunctionFactory.h"
00005
00006 #include "FWCore/Framework/interface/Frameworkfwd.h"
00007 #include "FWCore/Framework/interface/MakerMacros.h"
00008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00009 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
00010 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
00011 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00012 #include "FWCore/ParameterSet/interface/Registry.h"
00013
00014 #include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h"
00015 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
00016 #include "DataFormats/EgammaReco/interface/ElectronSeed.h"
00017 #include "DataFormats/GsfTrackReco/interface/GsfTrack.h"
00018 #include "DataFormats/TrackCandidate/interface/TrackCandidateCollection.h"
00019 #include "DataFormats/TrackingRecHit/interface/TrackingRecHitFwd.h"
00020 #include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h"
00021
00022
00023 #include <iostream>
00024
00025 using namespace reco;
00026
00027 void GsfElectronBaseProducer::fillDescription( edm::ParameterSetDescription & desc )
00028 {
00029
00030 desc.add<edm::InputTag>("previousGsfElectronsTag",edm::InputTag("ecalDrivenGsfElectrons")) ;
00031 desc.add<edm::InputTag>("pflowGsfElectronsTag",edm::InputTag("pflowGsfElectrons")) ;
00032 desc.add<edm::InputTag>("gsfElectronCoresTag",edm::InputTag("gsfElectronCores")) ;
00033 desc.add<edm::InputTag>("hcalTowers",edm::InputTag("towerMaker")) ;
00034 desc.add<edm::InputTag>("reducedBarrelRecHitCollectionTag",edm::InputTag("ecalRecHit","EcalRecHitsEB")) ;
00035 desc.add<edm::InputTag>("reducedEndcapRecHitCollectionTag",edm::InputTag("ecalRecHit","EcalRecHitsEE")) ;
00036
00037 desc.add<edm::InputTag>("seedsTag",edm::InputTag("ecalDrivenElectronSeeds")) ;
00038 desc.add<edm::InputTag>("beamSpotTag",edm::InputTag("offlineBeamSpot")) ;
00039 desc.add<edm::InputTag>("gsfPfRecTracksTag",edm::InputTag("pfTrackElec")) ;
00040
00041
00042 desc.add<bool>("ctfTracksCheck",true) ;
00043 desc.add<edm::InputTag>("ctfTracksTag",edm::InputTag("generalTracks")) ;
00044
00045
00046 desc.add<bool>("useGsfPfRecTracks",true) ;
00047 desc.add<bool>("applyPreselection",false) ;
00048 desc.add<bool>("applyEtaCorrection",false) ;
00049 desc.add<bool>("applyAmbResolution",false) ;
00050 desc.add<unsigned>("ambSortingStrategy",1) ;
00051 desc.add<unsigned>("ambClustersOverlapStrategy",1) ;
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 desc.add<double>("intRadiusBarrelTk",0.015) ;
00111 desc.add<double>("intRadiusEndcapTk",0.015) ;
00112 desc.add<double>("stripBarrelTk",0.015) ;
00113 desc.add<double>("stripEndcapTk",0.015) ;
00114 desc.add<double>("ptMinTk",0.7) ;
00115 desc.add<double>("maxVtxDistTk",0.2) ;
00116 desc.add<double>("maxDrbTk",999999999.) ;
00117 desc.add<double>("intRadiusHcal",0.15) ;
00118 desc.add<double>("etMinHcal",0.0) ;
00119 desc.add<double>("intRadiusEcalBarrel",3.0) ;
00120 desc.add<double>("intRadiusEcalEndcaps",3.0) ;
00121 desc.add<double>("jurassicWidth",1.5) ;
00122 desc.add<double>("etMinBarrel",0.0) ;
00123 desc.add<double>("eMinBarrel",0.08) ;
00124 desc.add<double>("etMinEndcaps",0.1) ;
00125 desc.add<double>("eMinEndcaps",0.0) ;
00126 desc.add<bool>("vetoClustered",false) ;
00127 desc.add<bool>("useNumCrystals",true) ;
00128 desc.add<int>("severityLevelCut",4) ;
00129
00130
00131
00132 desc.add<std::vector<int> >("recHitFlagsToBeExcluded") ;
00133
00134 edm::ParameterSetDescription descNested ;
00135 descNested.add<std::string>("propagatorAlongTISE","PropagatorWithMaterial") ;
00136 descNested.add<std::string>("propagatorOppositeTISE","PropagatorWithMaterialOpposite") ;
00137 desc.add<edm::ParameterSetDescription>("TransientInitialStateEstimatorParameters",descNested) ;
00138
00139
00140 desc.add<std::string>("superClusterErrorFunction","EcalClusterEnergyUncertainty") ;
00141 }
00142
00143 GsfElectronBaseProducer::GsfElectronBaseProducer( const edm::ParameterSet& cfg )
00144 : ecalSeedingParametersChecked_(false)
00145 {
00146 produces<GsfElectronCollection>();
00147
00148 inputCfg_.previousGsfElectrons = cfg.getParameter<edm::InputTag>("previousGsfElectronsTag");
00149 inputCfg_.pflowGsfElectronsTag = cfg.getParameter<edm::InputTag>("pflowGsfElectronsTag");
00150 inputCfg_.gsfElectronCores = cfg.getParameter<edm::InputTag>("gsfElectronCoresTag");
00151 inputCfg_.hcalTowersTag = cfg.getParameter<edm::InputTag>("hcalTowers") ;
00152
00153 inputCfg_.reducedBarrelRecHitCollection = cfg.getParameter<edm::InputTag>("reducedBarrelRecHitCollectionTag") ;
00154 inputCfg_.reducedEndcapRecHitCollection = cfg.getParameter<edm::InputTag>("reducedEndcapRecHitCollectionTag") ;
00155 inputCfg_.pfMVA = cfg.getParameter<edm::InputTag>("pfMvaTag") ;
00156 inputCfg_.ctfTracks = cfg.getParameter<edm::InputTag>("ctfTracksTag");
00157 inputCfg_.seedsTag = cfg.getParameter<edm::InputTag>("seedsTag");
00158 inputCfg_.beamSpotTag = cfg.getParameter<edm::InputTag>("beamSpotTag") ;
00159 inputCfg_.gsfPfRecTracksTag = cfg.getParameter<edm::InputTag>("gsfPfRecTracksTag") ;
00160
00161 strategyCfg_.useGsfPfRecTracks = cfg.getParameter<bool>("useGsfPfRecTracks") ;
00162 strategyCfg_.applyPreselection = cfg.getParameter<bool>("applyPreselection") ;
00163 strategyCfg_.applyEtaCorrection = cfg.getParameter<bool>("applyEtaCorrection") ;
00164 strategyCfg_.applyAmbResolution = cfg.getParameter<bool>("applyAmbResolution") ;
00165 strategyCfg_.ambSortingStrategy = cfg.getParameter<unsigned>("ambSortingStrategy") ;
00166 strategyCfg_.ambClustersOverlapStrategy = cfg.getParameter<unsigned>("ambClustersOverlapStrategy") ;
00167 strategyCfg_.addPflowElectrons = cfg.getParameter<bool>("addPflowElectrons") ;
00168 strategyCfg_.ctfTracksCheck = cfg.getParameter<bool>("ctfTracksCheck");
00169
00170 cutsCfg_.minSCEtBarrel = cfg.getParameter<double>("minSCEtBarrel") ;
00171 cutsCfg_.minSCEtEndcaps = cfg.getParameter<double>("minSCEtEndcaps") ;
00172 cutsCfg_.maxEOverPBarrel = cfg.getParameter<double>("maxEOverPBarrel") ;
00173 cutsCfg_.maxEOverPEndcaps = cfg.getParameter<double>("maxEOverPEndcaps") ;
00174 cutsCfg_.minEOverPBarrel = cfg.getParameter<double>("minEOverPBarrel") ;
00175 cutsCfg_.minEOverPEndcaps = cfg.getParameter<double>("minEOverPEndcaps") ;
00176
00177
00178 cutsCfg_.maxHOverEBarrel = cfg.getParameter<double>("maxHOverEBarrel") ;
00179 cutsCfg_.maxHOverEEndcaps = cfg.getParameter<double>("maxHOverEEndcaps") ;
00180 cutsCfg_.maxHBarrel = cfg.getParameter<double>("maxHBarrel") ;
00181 cutsCfg_.maxHEndcaps = cfg.getParameter<double>("maxHEndcaps") ;
00182
00183 cutsCfg_.maxDeltaEtaBarrel = cfg.getParameter<double>("maxDeltaEtaBarrel") ;
00184 cutsCfg_.maxDeltaEtaEndcaps = cfg.getParameter<double>("maxDeltaEtaEndcaps") ;
00185 cutsCfg_.maxDeltaPhiBarrel = cfg.getParameter<double>("maxDeltaPhiBarrel") ;
00186 cutsCfg_.maxDeltaPhiEndcaps = cfg.getParameter<double>("maxDeltaPhiEndcaps") ;
00187 cutsCfg_.maxDeltaPhiBarrel = cfg.getParameter<double>("maxDeltaPhiBarrel") ;
00188 cutsCfg_.maxDeltaPhiEndcaps = cfg.getParameter<double>("maxDeltaPhiEndcaps") ;
00189 cutsCfg_.maxDeltaPhiBarrel = cfg.getParameter<double>("maxDeltaPhiBarrel") ;
00190 cutsCfg_.maxDeltaPhiEndcaps = cfg.getParameter<double>("maxDeltaPhiEndcaps") ;
00191 cutsCfg_.maxSigmaIetaIetaBarrel = cfg.getParameter<double>("maxSigmaIetaIetaBarrel") ;
00192 cutsCfg_.maxSigmaIetaIetaEndcaps = cfg.getParameter<double>("maxSigmaIetaIetaEndcaps") ;
00193 cutsCfg_.maxFbremBarrel = cfg.getParameter<double>("maxFbremBarrel") ;
00194 cutsCfg_.maxFbremEndcaps = cfg.getParameter<double>("maxFbremEndcaps") ;
00195 cutsCfg_.isBarrel = cfg.getParameter<bool>("isBarrel") ;
00196 cutsCfg_.isEndcaps = cfg.getParameter<bool>("isEndcaps") ;
00197 cutsCfg_.isFiducial = cfg.getParameter<bool>("isFiducial") ;
00198 cutsCfg_.minMVA = cfg.getParameter<double>("minMVA") ;
00199 cutsCfg_.maxTIP = cfg.getParameter<double>("maxTIP") ;
00200 cutsCfg_.seedFromTEC = cfg.getParameter<bool>("seedFromTEC") ;
00201
00202 cutsCfgPflow_.minSCEtBarrel = cfg.getParameter<double>("minSCEtBarrelPflow") ;
00203 cutsCfgPflow_.minSCEtEndcaps = cfg.getParameter<double>("minSCEtEndcapsPflow") ;
00204 cutsCfgPflow_.maxEOverPBarrel = cfg.getParameter<double>("maxEOverPBarrelPflow") ;
00205 cutsCfgPflow_.maxEOverPEndcaps = cfg.getParameter<double>("maxEOverPEndcapsPflow") ;
00206 cutsCfgPflow_.minEOverPBarrel = cfg.getParameter<double>("minEOverPBarrelPflow") ;
00207 cutsCfgPflow_.minEOverPEndcaps = cfg.getParameter<double>("minEOverPEndcapsPflow") ;
00208
00209
00210 cutsCfgPflow_.maxHOverEBarrel = cfg.getParameter<double>("maxHOverEBarrelPflow") ;
00211 cutsCfgPflow_.maxHOverEEndcaps = cfg.getParameter<double>("maxHOverEEndcapsPflow") ;
00212 cutsCfgPflow_.maxHBarrel = cfg.getParameter<double>("maxHBarrelPflow") ;
00213 cutsCfgPflow_.maxHEndcaps = cfg.getParameter<double>("maxHEndcapsPflow") ;
00214
00215 cutsCfgPflow_.maxDeltaEtaBarrel = cfg.getParameter<double>("maxDeltaEtaBarrelPflow") ;
00216 cutsCfgPflow_.maxDeltaEtaEndcaps = cfg.getParameter<double>("maxDeltaEtaEndcapsPflow") ;
00217 cutsCfgPflow_.maxDeltaPhiBarrel = cfg.getParameter<double>("maxDeltaPhiBarrelPflow") ;
00218 cutsCfgPflow_.maxDeltaPhiEndcaps = cfg.getParameter<double>("maxDeltaPhiEndcapsPflow") ;
00219 cutsCfgPflow_.maxDeltaPhiBarrel = cfg.getParameter<double>("maxDeltaPhiBarrelPflow") ;
00220 cutsCfgPflow_.maxDeltaPhiEndcaps = cfg.getParameter<double>("maxDeltaPhiEndcapsPflow") ;
00221 cutsCfgPflow_.maxDeltaPhiBarrel = cfg.getParameter<double>("maxDeltaPhiBarrelPflow") ;
00222 cutsCfgPflow_.maxDeltaPhiEndcaps = cfg.getParameter<double>("maxDeltaPhiEndcapsPflow") ;
00223 cutsCfgPflow_.maxSigmaIetaIetaBarrel = cfg.getParameter<double>("maxSigmaIetaIetaBarrelPflow") ;
00224 cutsCfgPflow_.maxSigmaIetaIetaEndcaps = cfg.getParameter<double>("maxSigmaIetaIetaEndcapsPflow") ;
00225 cutsCfgPflow_.maxFbremBarrel = cfg.getParameter<double>("maxFbremBarrelPflow") ;
00226 cutsCfgPflow_.maxFbremEndcaps = cfg.getParameter<double>("maxFbremEndcapsPflow") ;
00227 cutsCfgPflow_.isBarrel = cfg.getParameter<bool>("isBarrelPflow") ;
00228 cutsCfgPflow_.isEndcaps = cfg.getParameter<bool>("isEndcapsPflow") ;
00229 cutsCfgPflow_.isFiducial = cfg.getParameter<bool>("isFiducialPflow") ;
00230 cutsCfgPflow_.minMVA = cfg.getParameter<double>("minMVAPflow") ;
00231 cutsCfgPflow_.maxTIP = cfg.getParameter<double>("maxTIPPflow") ;
00232 cutsCfgPflow_.seedFromTEC = true ;
00233
00234
00235 hcalCfg_.hOverEConeSize = cfg.getParameter<double>("hOverEConeSize") ;
00236 if (hcalCfg_.hOverEConeSize>0)
00237 {
00238 hcalCfg_.useTowers = true ;
00239 hcalCfg_.hcalTowers = cfg.getParameter<edm::InputTag>("hcalTowers") ;
00240 hcalCfg_.hOverEPtMin = cfg.getParameter<double>("hOverEPtMin") ;
00241 }
00242 hcalCfgPflow_.hOverEConeSize = cfg.getParameter<double>("hOverEConeSizePflow") ;
00243 if (hcalCfgPflow_.hOverEConeSize>0)
00244 {
00245 hcalCfgPflow_.useTowers = true ;
00246 hcalCfgPflow_.hcalTowers = cfg.getParameter<edm::InputTag>("hcalTowers") ;
00247 hcalCfgPflow_.hOverEPtMin = cfg.getParameter<double>("hOverEPtMinPflow") ;
00248 }
00249
00250
00251 GsfElectronAlgo::IsolationConfiguration isoCfg ;
00252 isoCfg.intRadiusBarrelTk = cfg.getParameter<double>("intRadiusBarrelTk") ;
00253 isoCfg.intRadiusEndcapTk = cfg.getParameter<double>("intRadiusEndcapTk") ;
00254 isoCfg.stripBarrelTk = cfg.getParameter<double>("stripBarrelTk") ;
00255 isoCfg.stripEndcapTk = cfg.getParameter<double>("stripEndcapTk") ;
00256 isoCfg.ptMinTk = cfg.getParameter<double>("ptMinTk") ;
00257 isoCfg.maxVtxDistTk = cfg.getParameter<double>("maxVtxDistTk") ;
00258 isoCfg.maxDrbTk = cfg.getParameter<double>("maxDrbTk") ;
00259 isoCfg.intRadiusHcal = cfg.getParameter<double>("intRadiusHcal") ;
00260 isoCfg.etMinHcal = cfg.getParameter<double>("etMinHcal") ;
00261 isoCfg.intRadiusEcalBarrel = cfg.getParameter<double>("intRadiusEcalBarrel") ;
00262 isoCfg.intRadiusEcalEndcaps = cfg.getParameter<double>("intRadiusEcalEndcaps") ;
00263 isoCfg.jurassicWidth = cfg.getParameter<double>("jurassicWidth") ;
00264 isoCfg.etMinBarrel = cfg.getParameter<double>("etMinBarrel") ;
00265 isoCfg.eMinBarrel = cfg.getParameter<double>("eMinBarrel") ;
00266 isoCfg.etMinEndcaps = cfg.getParameter<double>("etMinEndcaps") ;
00267 isoCfg.eMinEndcaps = cfg.getParameter<double>("eMinEndcaps") ;
00268 isoCfg.vetoClustered = cfg.getParameter<bool>("vetoClustered") ;
00269 isoCfg.useNumCrystals = cfg.getParameter<bool>("useNumCrystals") ;
00270
00271
00272 GsfElectronAlgo::SpikeConfiguration spikeCfg ;
00273 spikeCfg.severityLevelCut = cfg.getParameter<int>("severityLevelCut") ;
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286 spikeCfg.recHitFlagsToBeExcluded = cfg.getParameter<std::vector<int> >("recHitFlagsToBeExcluded") ;
00287
00288
00289 EcalClusterFunctionBaseClass * superClusterErrorFunction = 0 ;
00290 std::string superClusterErrorFunctionName
00291 = cfg.getParameter<std::string>("superClusterErrorFunction") ;
00292 if (superClusterErrorFunctionName!="")
00293 {
00294 superClusterErrorFunction
00295 = EcalClusterFunctionFactory::get()->create(superClusterErrorFunctionName,cfg) ;
00296 }
00297
00298
00299 algo_ = new GsfElectronAlgo
00300 ( inputCfg_, strategyCfg_,
00301 cutsCfg_,cutsCfgPflow_,
00302 hcalCfg_,hcalCfgPflow_,
00303 isoCfg,spikeCfg,
00304 superClusterErrorFunction ) ;
00305 }
00306
00307 GsfElectronBaseProducer::~GsfElectronBaseProducer()
00308 { delete algo_ ; }
00309
00310 void GsfElectronBaseProducer::beginEvent( edm::Event & event, const edm::EventSetup & setup )
00311 {
00312
00313 if (!ecalSeedingParametersChecked_)
00314 {
00315 ecalSeedingParametersChecked_ = true ;
00316 edm::Handle<reco::ElectronSeedCollection> seeds ;
00317 event.getByLabel(inputCfg_.seedsTag,seeds) ;
00318 if (!seeds.isValid())
00319 {
00320 edm::LogWarning("GsfElectronAlgo|UnreachableSeedsProvenance")
00321 <<"Cannot check consistency of parameters with ecal seeding ones,"
00322 <<" because the original collection of seeds is not any more available." ;
00323 }
00324 else
00325 {
00326 checkEcalSeedingParameters(seeds.provenance()->psetID()) ;
00327 }
00328 }
00329
00330
00331 algo_->checkSetup(setup) ;
00332 algo_->beginEvent(event) ;
00333 }
00334
00335 void GsfElectronBaseProducer::fillEvent( edm::Event & event )
00336 {
00337
00338 algo_->displayInternalElectrons("GsfElectronAlgo Info (before preselection)") ;
00339
00340
00341 if (strategyCfg_.applyPreselection)
00342 {
00343 algo_->removeNotPreselectedElectrons() ;
00344 algo_->displayInternalElectrons("GsfElectronAlgo Info (after preselection)") ;
00345 }
00346
00347
00348 algo_->setAmbiguityData() ;
00349 if (strategyCfg_.applyAmbResolution)
00350 {
00351 algo_->removeAmbiguousElectrons() ;
00352 algo_->displayInternalElectrons("GsfElectronAlgo Info (after amb. solving)") ;
00353 }
00354
00355
00356 std::auto_ptr<GsfElectronCollection> finalCollection( new GsfElectronCollection ) ;
00357 algo_->copyElectrons(*finalCollection) ;
00358 event.put(finalCollection) ;
00359 }
00360
00361 void GsfElectronBaseProducer::endEvent()
00362 {
00363 algo_->endEvent() ;
00364 }
00365
00366 void GsfElectronBaseProducer::checkEcalSeedingParameters( edm::ParameterSetID const & psetid )
00367 {
00368 edm::ParameterSet pset ;
00369 edm::pset::Registry::instance()->getMapped(psetid,pset) ;
00370 edm::ParameterSet seedConfiguration = pset.getParameter<edm::ParameterSet>("SeedConfiguration") ;
00371
00372
00373
00374 if (seedConfiguration.getParameter<bool>("applyHOverECut"))
00375 {
00376 if ((hcalCfg_.hOverEConeSize!=0)&&(hcalCfg_.hOverEConeSize!=seedConfiguration.getParameter<double>("hOverEConeSize")))
00377 { edm::LogWarning("GsfElectronAlgo|InconsistentParameters") <<"The H/E cone size ("<<hcalCfg_.hOverEConeSize<<") is different from ecal seeding ("<<seedConfiguration.getParameter<double>("hOverEConeSize")<<")." ; }
00378 if (cutsCfg_.maxHOverEBarrel<seedConfiguration.getParameter<double>("maxHOverEBarrel"))
00379 { edm::LogWarning("GsfElectronAlgo|InconsistentParameters") <<"The max barrel H/E is lower than during ecal seeding." ; }
00380 if (cutsCfg_.maxHOverEEndcaps<seedConfiguration.getParameter<double>("maxHOverEEndcaps"))
00381 { edm::LogWarning("GsfElectronAlgo|InconsistentParameters") <<"The max endcaps H/E is lower than during ecal seeding." ; }
00382 }
00383
00384 if (cutsCfg_.minSCEtBarrel<seedConfiguration.getParameter<double>("SCEtCut"))
00385 { edm::LogWarning("GsfElectronAlgo|InconsistentParameters") <<"The minimum super-cluster Et in barrel is lower than during ecal seeding." ; }
00386 if (cutsCfg_.minSCEtEndcaps<seedConfiguration.getParameter<double>("SCEtCut"))
00387 { edm::LogWarning("GsfElectronAlgo|InconsistentParameters") <<"The minimum super-cluster Et in endcaps is lower than during ecal seeding." ; }
00388 }
00389
00390