00001
00009 #include "RecoEgamma/EgammaHLTProducers/interface/EgammaHLTElectronDetaDphiProducer.h"
00010
00011
00012 #include "FWCore/Framework/interface/Event.h"
00013 #include "FWCore/Framework/interface/EventSetup.h"
00014 #include "DataFormats/Common/interface/Handle.h"
00015 #include "FWCore/Framework/interface/ESHandle.h"
00016 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00017 #include "FWCore/Utilities/interface/Exception.h"
00018
00019 #include "DataFormats/EgammaCandidates/interface/Electron.h"
00020 #include "DataFormats/RecoCandidate/interface/RecoEcalCandidate.h"
00021 #include "DataFormats/EgammaCandidates/interface/ElectronIsolationAssociation.h"
00022 #include "DataFormats/RecoCandidate/interface/RecoEcalCandidateIsolation.h"
00023
00024 #include "DataFormats/Common/interface/RefToBase.h"
00025
00026 #include "DataFormats/Common/interface/RefProd.h"
00027
00028 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00029 #include "DataFormats/TrackReco/interface/Track.h"
00030 #include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h"
00031 #include "TrackingTools/TransientTrack/interface/TransientTrack.h"
00032 #include "RecoEgamma/EgammaElectronAlgos/interface/ElectronUtilities.h"
00033
00034 #include "DataFormats/TrackReco/interface/Track.h"
00035 #include "DataFormats/EgammaReco/interface/SuperCluster.h"
00036
00037
00038
00039
00040
00041 #include "DataFormats/Math/interface/Point3D.h"
00042
00043 #include "RecoEgamma/EgammaTools/interface/ECALPositionCalculator.h"
00044
00045 #include "FWCore/Framework/interface/EventSetup.h"
00046 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00047 #include "MagneticField/Engine/interface/MagneticField.h"
00048
00049 EgammaHLTElectronDetaDphiProducer::EgammaHLTElectronDetaDphiProducer(const edm::ParameterSet& config)
00050 {
00051
00052 electronProducer_ = config.getParameter<edm::InputTag>("electronProducer");
00053 bsProducer_ = config.getParameter<edm::InputTag>("BSProducer");
00054 useTrackProjectionToEcal_ = config.getParameter<bool>("useTrackProjectionToEcal");
00055 variablesAtVtx_ = config.getParameter<bool>("variablesAtVtx");
00056 recoEcalCandidateProducer_ = config.getParameter<edm::InputTag>("recoEcalCandidateProducer");
00057 useSCRefs_ = config.getParameter<bool>("useSCRefs");
00058
00059
00060 if(!useSCRefs_){
00061 produces < reco::ElectronIsolationMap >( "Deta" ).setBranchAlias( "deta" );
00062 produces < reco::ElectronIsolationMap >( "Dphi" ).setBranchAlias( "dphi" );
00063 }else{
00064 produces < reco::RecoEcalCandidateIsolationMap >( "Deta" ).setBranchAlias( "deta" );
00065 produces < reco::RecoEcalCandidateIsolationMap >( "Dphi" ).setBranchAlias( "dphi" );
00066 }
00067 }
00068
00069 EgammaHLTElectronDetaDphiProducer::~EgammaHLTElectronDetaDphiProducer(){}
00070
00071
00072
00073
00074
00075
00076
00077 void EgammaHLTElectronDetaDphiProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
00078
00079
00080 edm::Handle<reco::ElectronCollection> electronHandle;
00081 iEvent.getByLabel(electronProducer_,electronHandle);
00082
00083 edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
00084 iEvent.getByLabel(bsProducer_,recoBeamSpotHandle);
00085
00086 const reco::BeamSpot::Point& bsPosition = recoBeamSpotHandle->position();
00087
00088 edm::ESHandle<MagneticField> theMagField;
00089 iSetup.get<IdealMagneticFieldRecord>().get(theMagField);
00090
00091 reco::ElectronIsolationMap detaMap;
00092 reco::ElectronIsolationMap dphiMap;
00093 reco::RecoEcalCandidateIsolationMap detaCandMap;
00094 reco::RecoEcalCandidateIsolationMap dphiCandMap;
00095
00096 if(!useSCRefs_){
00097 for(reco::ElectronCollection::const_iterator iElectron = electronHandle->begin(); iElectron != electronHandle->end(); iElectron++){
00098
00099 reco::ElectronRef eleref(reco::ElectronRef(electronHandle,iElectron - electronHandle->begin()));
00100 std::pair<float,float> dEtaDPhi = calDEtaDPhiSCTrk(eleref,bsPosition,theMagField.product());
00101
00102 detaMap.insert(eleref, dEtaDPhi.first);
00103 dphiMap.insert(eleref, dEtaDPhi.second);
00104 }
00105 }else {
00106 edm::Handle<reco::RecoEcalCandidateCollection> recoEcalCandHandle;
00107 iEvent.getByLabel(recoEcalCandidateProducer_,recoEcalCandHandle);
00108 for(reco::RecoEcalCandidateCollection::const_iterator iRecoEcalCand = recoEcalCandHandle->begin(); iRecoEcalCand != recoEcalCandHandle->end(); iRecoEcalCand++){
00109
00110 reco::RecoEcalCandidateRef recoEcalCandRef(recoEcalCandHandle,iRecoEcalCand-recoEcalCandHandle->begin());
00111
00112 reco::ElectronRef eleRef = getEleRef(recoEcalCandRef,electronHandle);
00113 std::pair<float,float> dEtaDPhi(999999,999999);
00114 if(eleRef.isNonnull()) dEtaDPhi = calDEtaDPhiSCTrk(eleRef,bsPosition,theMagField.product());
00115 detaCandMap.insert(recoEcalCandRef, dEtaDPhi.first);
00116 dphiCandMap.insert(recoEcalCandRef, dEtaDPhi.second);
00117 }
00118 }
00119
00120 if(!useSCRefs_){
00121 std::auto_ptr<reco::ElectronIsolationMap> detMap(new reco::ElectronIsolationMap(detaMap));
00122 std::auto_ptr<reco::ElectronIsolationMap> dphMap(new reco::ElectronIsolationMap(dphiMap));
00123 iEvent.put(detMap, "Deta" );
00124 iEvent.put(dphMap, "Dphi" );
00125 }else{
00126 std::auto_ptr<reco::RecoEcalCandidateIsolationMap> detaCandMapForEvent(new reco::RecoEcalCandidateIsolationMap(detaCandMap));
00127 std::auto_ptr<reco::RecoEcalCandidateIsolationMap> dphiCandMapForEvent(new reco::RecoEcalCandidateIsolationMap(dphiCandMap));
00128 iEvent.put(detaCandMapForEvent, "Deta" );
00129 iEvent.put(dphiCandMapForEvent, "Dphi" );
00130 }
00131 }
00132
00133 std::pair<float,float> EgammaHLTElectronDetaDphiProducer::calDEtaDPhiSCTrk(reco::ElectronRef& eleref, const reco::BeamSpot::Point& bsPosition,const MagneticField *magField) {
00134
00135 const reco::SuperClusterRef theClus = eleref->superCluster();
00136 const math::XYZVector trackMom = eleref->track()->momentum();
00137
00138 math::XYZPoint SCcorrPosition(theClus->x()-bsPosition.x(), theClus->y()-bsPosition.y() , theClus->z()-eleref->track()->vz() );
00139 float deltaeta = fabs(SCcorrPosition.eta()-eleref->track()->eta());
00140 float deltaphi = 999.;
00141
00142 bool recoveryForFailingPropagation = false;
00143 if (variablesAtVtx_) {
00144 reco::TrackRef track = eleref->track();
00145 reco::TransientTrack tt(track, magField_);
00146 TrajectoryStateOnSurface sclTSOS = tt.stateOnSurface(GlobalPoint(theClus->x(),theClus->y(),theClus->z()));
00147
00148 if (sclTSOS.isValid()) {
00149 EleRelPointPair scAtVtx(theClus->position(), sclTSOS.globalPosition(), bsPosition);
00150 deltaeta = fabs(scAtVtx.dEta());
00151 deltaphi = fabs(scAtVtx.dPhi());
00152 } else {
00153 recoveryForFailingPropagation = true;
00154 }
00155 } else if (useTrackProjectionToEcal_ or recoveryForFailingPropagation) {
00156 ECALPositionCalculator posCalc;
00157 const math::XYZPoint vertex(bsPosition.x(),bsPosition.y(),eleref->track()->vz());
00158
00159 float phi1= posCalc.ecalPhi(magField,trackMom,vertex,1);
00160 float phi2= posCalc.ecalPhi(magField,trackMom,vertex,-1);
00161
00162 float deltaphi1=fabs( phi1 - theClus->position().phi() );
00163 if(deltaphi1>6.283185308) deltaphi1 -= 6.283185308;
00164 if(deltaphi1>3.141592654) deltaphi1 = 6.283185308-deltaphi1;
00165
00166 float deltaphi2=fabs( phi2 - theClus->position().phi() );
00167 if(deltaphi2>6.283185308) deltaphi2 -= 6.283185308;
00168 if(deltaphi2>3.141592654) deltaphi2 = 6.283185308-deltaphi2;
00169
00170 deltaphi = deltaphi1;
00171 if(deltaphi2<deltaphi1){ deltaphi = deltaphi2;}
00172 } else {
00173 deltaphi=fabs(eleref->track()->outerPosition().phi()-theClus->phi());
00174 if(deltaphi>6.283185308) deltaphi -= 6.283185308;
00175 if(deltaphi>3.141592654) deltaphi = 6.283185308-deltaphi;
00176 }
00177
00178 return std::make_pair(deltaeta,deltaphi);
00179 }
00180
00181 reco::ElectronRef EgammaHLTElectronDetaDphiProducer::getEleRef(const reco::RecoEcalCandidateRef& recoEcalCandRef,const edm::Handle<reco::ElectronCollection>& electronHandle)
00182 {
00183 reco::ElectronRef eleRef;
00184 for(reco::ElectronCollection::const_iterator eleIt = electronHandle->begin(); eleIt != electronHandle->end(); eleIt++){
00185 if(eleIt->superCluster()==recoEcalCandRef->superCluster()){
00186 eleRef = reco::ElectronRef(electronHandle,eleIt - electronHandle->begin());
00187 break;
00188 }
00189 }
00190 return eleRef;
00191 }
00192
00193
00194 void EgammaHLTElectronDetaDphiProducer::beginRun(edm::Run&, edm::EventSetup const& iSetup) {
00195 using namespace edm;
00196
00197 ESHandle<MagneticField> magneticField;
00198 iSetup.get<IdealMagneticFieldRecord>().get(magneticField);
00199 magField_ = magneticField.product();
00200
00201 }
00202
00203 void EgammaHLTElectronDetaDphiProducer::endRun(edm::Run&, edm::EventSetup const&){}
00204
00205
00206