00001
00009
00010 #include "DataFormats/Math/interface/LorentzVector.h"
00011 #include "DataFormats/Math/interface/deltaR.h"
00012 #include "DataFormats/Math/interface/deltaPhi.h"
00013 #include "CLHEP/Vector/LorentzVector.h"
00014 #include <iostream>
00015 #include "DataFormats/RecoCandidate/interface/RecoEcalCandidate.h"
00016 #include "RecoEgamma/EgammaHFProducers/interface/HFRecoEcalCandidateAlgo.h"
00017 using namespace std;
00018 using namespace reco;
00019
00020 HFRecoEcalCandidateAlgo::HFRecoEcalCandidateAlgo(bool correct,double e9e25Cut,double intercept2DCut) :
00021 m_correct(correct),
00022 m_e9e25Cut(e9e25Cut),
00023 m_intercept2DCut(intercept2DCut){
00024
00025 }
00026
00027 RecoEcalCandidate HFRecoEcalCandidateAlgo::correctEPosition(const SuperCluster& original , const HFEMClusterShape& shape) {
00028 double energyCorrect=0.811474;
00029 double etaCorrect=.0131-.00319*sin(5.08*shape.CellEta());
00030 double phiAmpCorrect=-.00404;
00031 double phiFreqCorrect=6.331;
00032
00033 double corEnergy= original.energy()/energyCorrect;
00034 double corEta=original.eta();
00035 corEta+=(original.eta()>0)?(etaCorrect):(-etaCorrect);
00036 double corPhi=original.phi()+phiAmpCorrect*sin(phiFreqCorrect*shape.CellPhi());
00037 double corPx=corEnergy*cos(corPhi)/cosh(corEta);
00038 double corPy=corEnergy*sin(corPhi)/cosh(corEta);
00039 double corPz=corEnergy*tanh(corEta);
00040 RecoEcalCandidate corCand(0,
00041 math::XYZTLorentzVector(corPx,corPy,corPz,corEnergy),
00042 math::XYZPoint(0,0,0));
00043
00044 return corCand;
00045 }
00046
00047 void HFRecoEcalCandidateAlgo::produce(const edm::Handle<SuperClusterCollection>& SuperClusters,
00048 const HFEMClusterShapeAssociationCollection& AssocShapes,
00049 RecoEcalCandidateCollection& RecoECand) {
00050
00051
00052
00053
00054 for (unsigned int i=0; i < SuperClusters->size(); ++i) {
00055 const SuperCluster& supClus=(*SuperClusters)[i];
00056 reco::SuperClusterRef theClusRef=edm::Ref<SuperClusterCollection>(SuperClusters,i);
00057 const HFEMClusterShapeRef clusShapeRef=AssocShapes.find(theClusRef)->val;
00058 const HFEMClusterShape& clusShape=*clusShapeRef;
00059
00060
00061 double px=supClus.energy()*cos(supClus.phi())/cosh(supClus.eta());
00062 double py=supClus.energy()*sin(supClus.phi())/cosh(supClus.eta());
00063 double pz=supClus.energy()*tanh(supClus.eta());
00064 RecoEcalCandidate theCand(0,
00065 math::XYZTLorentzVector(px,py,pz,supClus.energy()),
00066 math::XYZPoint(0,0,0));
00067
00068
00069 if (m_correct)
00070 theCand=correctEPosition(supClus,clusShape);
00071
00072
00073
00074 if((clusShape.e9e25()> m_e9e25Cut)&&((clusShape.eCOREe9()-(clusShape.eSeL()*1.125)) > m_intercept2DCut)){
00075 theCand.setSuperCluster(theClusRef);
00076 RecoECand.push_back(theCand);
00077 }
00078 }
00079 }