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