![]() |
![]() |
00001 00002 #include "GsfElectronCoreEcalDrivenProducer.h" 00003 00004 #include "FWCore/ParameterSet/interface/ParameterSet.h" 00005 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" 00006 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h" 00007 00008 #include "DataFormats/EgammaCandidates/interface/GsfElectronCore.h" 00009 #include "DataFormats/ParticleFlowReco/interface/GsfPFRecTrack.h" 00010 #include "DataFormats/GsfTrackReco/interface/GsfTrack.h" 00011 #include "DataFormats/EgammaReco/interface/SuperClusterFwd.h" 00012 #include "DataFormats/EgammaReco/interface/ElectronSeedFwd.h" 00013 #include "DataFormats/EgammaReco/interface/ElectronSeed.h" 00014 #include "DataFormats/Common/interface/ValueMap.h" 00015 00016 #include <map> 00017 00018 using namespace reco ; 00019 00020 // void GsfElectronCoreEcalDrivenProducer::fillDescriptions( edm::ConfigurationDescriptions & descriptions ) 00021 // { 00022 // edm::ParameterSetDescription desc ; 00023 // GsfElectronCoreBaseProducer::fillDescriptions(desc) ; 00024 // descriptions.add("produceEcalDrivenGsfElectronCores",desc) ; 00025 // } 00026 00027 GsfElectronCoreEcalDrivenProducer::GsfElectronCoreEcalDrivenProducer( const edm::ParameterSet & config ) 00028 : GsfElectronCoreBaseProducer(config) 00029 {} 00030 00031 void GsfElectronCoreEcalDrivenProducer::produce( edm::Event & event, const edm::EventSetup & setup ) 00032 { 00033 // base input 00034 GsfElectronCoreBaseProducer::initEvent(event,setup) ; 00035 00036 // output 00037 std::auto_ptr<GsfElectronCoreCollection> electrons(new GsfElectronCoreCollection) ; 00038 00039 // loop on ecal driven tracks 00040 if (useGsfPfRecTracks_) 00041 { 00042 const GsfPFRecTrackCollection * gsfPfRecTrackCollection = gsfPfRecTracksH_.product() ; 00043 GsfPFRecTrackCollection::const_iterator gsfPfRecTrack ; 00044 for ( gsfPfRecTrack=gsfPfRecTrackCollection->begin() ; 00045 gsfPfRecTrack!=gsfPfRecTrackCollection->end() ; 00046 ++gsfPfRecTrack ) 00047 { 00048 const GsfTrackRef gsfTrackRef = gsfPfRecTrack->gsfTrackRef() ; 00049 produceEcalDrivenCore(gsfTrackRef,electrons.get()) ; 00050 } 00051 } 00052 else 00053 { 00054 const GsfTrackCollection * gsfTrackCollection = gsfTracksH_.product() ; 00055 for ( unsigned int i=0 ; i<gsfTrackCollection->size() ; ++i ) 00056 { 00057 const GsfTrackRef gsfTrackRef = edm::Ref<GsfTrackCollection>(gsfTracksH_,i) ; 00058 produceEcalDrivenCore(gsfTrackRef,electrons.get()) ; 00059 } 00060 } 00061 00062 event.put(electrons) ; 00063 } 00064 00065 void GsfElectronCoreEcalDrivenProducer::produceEcalDrivenCore( const GsfTrackRef & gsfTrackRef, GsfElectronCoreCollection * electrons ) 00066 { 00067 GsfElectronCore * eleCore = new GsfElectronCore(gsfTrackRef) ; 00068 00069 if (!eleCore->ecalDrivenSeed()) 00070 { delete eleCore ; return ; } 00071 00072 GsfElectronCoreBaseProducer::fillElectronCore(eleCore) ; 00073 00074 edm::RefToBase<TrajectorySeed> seed = gsfTrackRef->extra()->seedRef() ; 00075 ElectronSeedRef elseed = seed.castTo<ElectronSeedRef>() ; 00076 edm::RefToBase<CaloCluster> caloCluster = elseed->caloCluster() ; 00077 SuperClusterRef scRef = caloCluster.castTo<SuperClusterRef>() ; 00078 if (!scRef.isNull()) 00079 { 00080 eleCore->setSuperCluster(scRef) ; 00081 electrons->push_back(*eleCore) ; 00082 } 00083 else 00084 { edm::LogWarning("GsfElectronCoreEcalDrivenProducer")<<"Seed CaloCluster is not a SuperCluster, unexpected..." ; } 00085 00086 delete eleCore ; 00087 } 00088 00089 GsfElectronCoreEcalDrivenProducer::~GsfElectronCoreEcalDrivenProducer() 00090 {} 00091