00001
00002
00003
00004
00005
00006
00007 #include "DataFormats/EgammaReco/interface/SuperCluster.h"
00008 #include "DataFormats/EgammaReco/interface/SuperClusterFwd.h"
00009 #include "DataFormats/EgammaReco/interface/BasicClusterFwd.h"
00010 #include "Calibration/EcalCalibAlgos/interface/ElectronRecalibSuperClusterAssociator.h"
00011
00012 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
00013 #include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h"
00014 #include "DataFormats/EgammaCandidates/interface/GsfElectronCoreFwd.h"
00015 #include "DataFormats/EgammaCandidates/interface/GsfElectronCore.h"
00016
00017 #include <iostream>
00018
00019
00020
00021 using namespace reco;
00022 using namespace edm;
00023
00024 ElectronRecalibSuperClusterAssociator::ElectronRecalibSuperClusterAssociator(const edm::ParameterSet& iConfig)
00025 {
00026 #ifdef DEBUG
00027 std::cout<< "ElectronRecalibSuperClusterAssociator::ElectronRecalibSuperClusterAssociator" << std::endl;
00028 #endif
00029
00030
00031 produces<GsfElectronCollection>();
00032 produces<GsfElectronCoreCollection>() ;
00033 produces<SuperClusterCollection>();
00034
00035 scProducer_ = iConfig.getParameter<std::string>("scProducer");
00036 scCollection_ = iConfig.getParameter<std::string>("scCollection");
00037
00038 scIslandProducer_ = iConfig.getParameter<std::string>("scIslandProducer");
00039 scIslandCollection_ = iConfig.getParameter<std::string>("scIslandCollection");
00040
00041 electronProducer_ = iConfig.getParameter<std::string > ("electronProducer");
00042 electronCollection_ = iConfig.getParameter<std::string > ("electronCollection");
00043 #ifdef DEBUG
00044 std::cout<< "ElectronRecalibSuperClusterAssociator::ElectronRecalibSuperClusterAssociator::end" << std::endl;
00045 #endif
00046 }
00047
00048 ElectronRecalibSuperClusterAssociator::~ElectronRecalibSuperClusterAssociator()
00049 {
00050 }
00051
00052
00053 void ElectronRecalibSuperClusterAssociator::produce(edm::Event& e, const edm::EventSetup& iSetup)
00054 {
00055 #ifdef DEBUG
00056 std::cout<< "ElectronRecalibSuperClusterAssociator::produce" << std::endl;
00057 #endif
00058
00059 std::auto_ptr<GsfElectronCollection> pOutEle(new GsfElectronCollection);
00060 std::auto_ptr<GsfElectronCoreCollection> pOutEleCore(new GsfElectronCoreCollection);
00061 std::auto_ptr<SuperClusterCollection> pOutNewEndcapSC(new SuperClusterCollection);
00062
00063 reco::SuperClusterRefProd rSC = e.getRefBeforePut<SuperClusterCollection>();
00064 edm::Ref<SuperClusterCollection>::key_type idxSC = 0;
00065
00066
00067 Handle<reco::SuperClusterCollection> pSuperClusters;
00068 e.getByLabel(scProducer_, scCollection_, pSuperClusters);
00069 if (!pSuperClusters.isValid()) {
00070 std::cerr << "Error! can't get the product SuperClusterCollection "<< std::endl;
00071 }
00072 const reco::SuperClusterCollection* scCollection = pSuperClusters.product();
00073
00074 #ifdef DEBUG
00075 std::cout<<"scCollection->size()"<<scCollection->size()<<std::endl;
00076 #endif
00077
00078
00079 Handle<reco::SuperClusterCollection> pIslandSuperClusters;
00080 e.getByLabel(scIslandProducer_, scIslandCollection_, pIslandSuperClusters);
00081 if (!pIslandSuperClusters.isValid()) {
00082 std::cerr << "Error! can't get the product IslandSuperClusterCollection "<< std::endl;
00083 }
00084 const reco::SuperClusterCollection* scIslandCollection = pIslandSuperClusters.product();
00085
00086 #ifdef DEBUG
00087 std::cout<<"scEECollection->size()"<<scIslandCollection->size()<<std::endl;
00088 #endif
00089
00090
00091 Handle<reco::GsfElectronCollection> pElectrons;
00092 e.getByLabel(electronProducer_, electronCollection_, pElectrons);
00093 if (!pElectrons.isValid()) {
00094 std::cerr << "Error! can't get the product ElectronCollection "<< std::endl;
00095 }
00096 const reco::GsfElectronCollection* electronCollection = pElectrons.product();
00097
00098 for(reco::GsfElectronCollection::const_iterator eleIt = electronCollection->begin(); eleIt != electronCollection->end(); eleIt++)
00099 {
00100 float DeltaRMineleSCbarrel(0.15);
00101 float DeltaRMineleSCendcap(0.15);
00102 const reco::SuperCluster* nearestSCbarrel=0;
00103 const reco::SuperCluster* nearestSCendcap=0;
00104 int iscRef=-1;
00105 int iSC=0;
00106
00107
00108 for(reco::SuperClusterCollection::const_iterator scIt = scCollection->begin();
00109 scIt != scCollection->end(); scIt++){
00110 #ifdef DEBUG
00111 std::cout << scIt->energy() << " " << scIt->eta() << " " << scIt->phi() << " " << eleIt->eta() << " " << eleIt->phi() << std::endl;
00112 #endif
00113
00114 double DeltaReleSC = sqrt ( pow( eleIt->eta() - scIt->eta(),2) + pow(eleIt->phi() - scIt->phi(),2));
00115
00116 if(DeltaReleSC<DeltaRMineleSCbarrel)
00117 {
00118 DeltaRMineleSCbarrel = DeltaReleSC;
00119 nearestSCbarrel = &*scIt;
00120 iscRef = iSC;
00121 }
00122 iSC++;
00123 }
00124 iSC = 0;
00125
00126
00127
00128 for(reco::SuperClusterCollection::const_iterator scItEndcap = scIslandCollection->begin();
00129 scItEndcap != scIslandCollection->end(); scItEndcap++){
00130 #ifdef DEBUG
00131 std::cout << "EE " << scItEndcap->energy() << " " << scItEndcap->eta() << " " << scItEndcap->phi() << " " << eleIt->eta() << " " << eleIt->phi() << std::endl;
00132 #endif
00133
00134 double DeltaReleSC = sqrt ( pow( eleIt->eta() - scItEndcap->eta(),2) + pow(eleIt->phi() - scItEndcap->phi(),2));
00135
00136 if(DeltaReleSC<DeltaRMineleSCendcap)
00137 {
00138 DeltaRMineleSCendcap = DeltaReleSC;
00139 nearestSCendcap = &*scItEndcap;
00140 }
00141 iSC++;
00142 }
00144
00145 GsfElectronCoreRefProd rEleCore=e.getRefBeforePut<GsfElectronCoreCollection>();
00146 edm::Ref<GsfElectronCoreCollection>::key_type idxEleCore = 0;
00147
00148 if(nearestSCbarrel && !nearestSCendcap){
00149 reco::GsfElectronCore newEleCore(*(eleIt->core()));
00150 newEleCore.setGsfTrack(eleIt->gsfTrack());
00151 reco::SuperClusterRef scRef(reco::SuperClusterRef(pSuperClusters, iscRef));
00152 newEleCore.setSuperCluster(scRef);
00153 reco::GsfElectronCoreRef newEleCoreRef(reco::GsfElectronCoreRef(rEleCore, idxEleCore ++));
00154 pOutEleCore->push_back(newEleCore);
00155 reco::GsfElectron newEle(*eleIt,newEleCoreRef,CaloClusterPtr(),
00156
00157 TrackRef(),TrackBaseRef(), GsfTrackRefVector());
00158 newEle.setP4(eleIt->p4()*(nearestSCbarrel->energy()/eleIt->ecalEnergy()));
00159
00160 pOutEle->push_back(newEle);
00161 #ifdef DEBUG
00162 std::cout << "Association is with EB superCluster "<< std::endl;
00163 #endif
00164 }
00165
00166 if(!nearestSCbarrel && nearestSCendcap)
00167 {
00168 #ifdef DEBUG
00169 std::cout << "Starting Association is with EE superCluster "<< std::endl;
00170 #endif
00171
00172 float preshowerEnergy=eleIt->superCluster()->preshowerEnergy();
00173 #ifdef DEBUG
00174 std::cout << "preshowerEnergy"<< preshowerEnergy << std::endl;
00175 #endif
00176
00177 CaloClusterPtrVector newBCRef;
00178 for (CaloCluster_iterator bcRefIt=nearestSCendcap->clustersBegin();bcRefIt!=nearestSCendcap->clustersEnd();++bcRefIt){
00179 CaloClusterPtr cPtr(*bcRefIt);
00180 newBCRef.push_back(cPtr);
00181 }
00182
00183
00184 reco::SuperCluster newSC(nearestSCendcap->energy() + preshowerEnergy, nearestSCendcap->position() , nearestSCendcap->seed(),newBCRef , preshowerEnergy );
00185 pOutNewEndcapSC->push_back(newSC);
00186 reco::SuperClusterRef scRef(reco::SuperClusterRef(rSC, idxSC ++));
00187
00188 reco::GsfElectronCore newEleCore(*(eleIt->core()));
00189 newEleCore.setGsfTrack(eleIt->gsfTrack());
00190 newEleCore.setSuperCluster(scRef);
00191 reco::GsfElectronCoreRef newEleCoreRef(reco::GsfElectronCoreRef(rEleCore, idxEleCore ++));
00192 pOutEleCore->push_back(newEleCore);
00193 reco::GsfElectron newEle(*eleIt,newEleCoreRef,CaloClusterPtr(),
00194
00195 TrackRef(),TrackBaseRef(), GsfTrackRefVector());
00196
00197 newEle.setP4(eleIt->p4()*(newSC.energy()/eleIt->ecalEnergy())) ;
00198 pOutEle->push_back(newEle);
00199
00200 #ifdef DEBUG
00201 std::cout << "Association is with EE superCluster "<< std::endl;
00202 #endif
00203 }
00204
00205 if(nearestSCbarrel && nearestSCendcap){
00206 reco::GsfElectronCore newEleCore(*(eleIt->core()));
00207 newEleCore.setGsfTrack(eleIt->gsfTrack());
00208
00209
00210 if(DeltaRMineleSCendcap>=DeltaRMineleSCbarrel)
00211 {
00212 reco::SuperClusterRef scRef(reco::SuperClusterRef(pSuperClusters, iscRef));
00213 newEleCore.setSuperCluster(scRef);
00214 reco::GsfElectronCoreRef newEleCoreRef(reco::GsfElectronCoreRef(rEleCore, idxEleCore ++));
00215 pOutEleCore->push_back(newEleCore);
00216 reco::GsfElectron newEle(*eleIt,newEleCoreRef,CaloClusterPtr(),
00217
00218 TrackRef(),TrackBaseRef(), GsfTrackRefVector());
00219 newEle.setP4(eleIt->p4()*(nearestSCbarrel->energy()/eleIt->ecalEnergy()));
00220 pOutEle->push_back(newEle);
00221
00222
00223 #ifdef DEBUG
00224 std::cout << "Association is with EB superCluster, after quarrel "<< std::endl;
00225 #endif
00226 }
00227 else if(DeltaRMineleSCendcap<DeltaRMineleSCbarrel)
00228 {
00229 float preshowerEnergy=eleIt->superCluster()->preshowerEnergy();
00230 CaloClusterPtrVector newBCRef;
00231 for (CaloCluster_iterator bcRefIt=nearestSCendcap->clustersBegin();bcRefIt!=nearestSCendcap->clustersEnd();++bcRefIt){
00232 CaloClusterPtr cPtr(*bcRefIt);
00233 newBCRef.push_back(*bcRefIt);}
00234 reco::SuperCluster newSC(nearestSCendcap->energy() + preshowerEnergy, nearestSCendcap->position() , nearestSCendcap->seed(), newBCRef , preshowerEnergy );
00235 pOutNewEndcapSC->push_back(newSC);
00236 reco::SuperClusterRef scRef(reco::SuperClusterRef(rSC, idxSC ++));
00237 newEleCore.setSuperCluster(scRef);
00238 reco::GsfElectronCoreRef newEleCoreRef(reco::GsfElectronCoreRef(rEleCore, idxEleCore ++));
00239 pOutEleCore->push_back(newEleCore);
00240 reco::GsfElectron newEle(*eleIt,newEleCoreRef,CaloClusterPtr(),
00241
00242 TrackRef(),TrackBaseRef(), GsfTrackRefVector());
00243 newEle.setP4(eleIt->p4()*(newSC.energy()/eleIt->ecalEnergy())) ;
00244 pOutEle->push_back(newEle);
00245 #ifdef DEBUG
00246 std::cout << "Association is with EE superCluster, after quarrel "<< std::endl;
00247 #endif
00248 }
00249
00250 }
00251
00252
00253 }
00254
00255
00256
00257 #ifdef DEBUG
00258 std::cout << "Filled new electrons " << pOutEle->size() << std::endl;
00259 std::cout << "Filled new electronsCore " << pOutEleCore->size() << std::endl;
00260 std::cout << "Filled new endcapSC " << pOutNewEndcapSC->size() << std::endl;
00261 #endif
00262
00263
00264
00265 e.put(pOutEle);
00266 e.put(pOutEleCore);
00267 e.put(pOutNewEndcapSC);
00268
00269 }
00270
00271