#ifdef USE_CDFEDM2 ////////////////////////////////////////////////////////////////////////// // // Component: FourVecSummer.cc // Purpose: Implementation of FourVecSummer class // // Created: 20/09/99 Pierre Savard (based on Jodi Lamoureux's class) // History: // ////////////////////////////////////////////////////////////////////////// #include "Calor/FourVectorSummer.hh" const float EPSILON = 1.E-10; Centroid FourVectorSummer::sumTowers(const PhysicsTowerView& view) const{ HepLorentzVector initSum = sumFourVector(view); // calculate e,et,phi,eta,sinTheta from px, py, pz, e float p,pt,theta,phi,eta,et; pt = sqrt(initSum.px()*initSum.px() + initSum.py()*initSum.py()); float pz =initSum.pz(); p = sqrt(pz*pz + pt*pt); theta = atan2(pt,pz); phi = atan2(initSum.py(),initSum.px()); if (phi<0) phi = 2*PI + phi; et = initSum.e()*sin(theta); eta = 0.5*log( (p+pz+EPSILON)/(p-pz+EPSILON) ); return Centroid(eta,phi,et); } HepLorentzVector FourVectorSummer::sumFourVector(const PhysicsTowerView& view) const{ float px =0.; float py =0.; float pz =0.; float e =0.; Towers::const_iterator iterEnd = view.end(); for(Towers::const_iterator iter = view.begin(); iter != iterEnd; ++iter){ px +=(* iter)->fourMomentum().px(); py += (*iter)->fourMomentum().py(); pz += (*iter)->fourMomentum().pz(); e += (*iter)->fourMomentum().e(); } return HepLorentzVector(px,py,pz,e); } float FourVectorSummer::dRsquared(const PhysicsTower* tower, float eta, float phi){ float p = sqrt(tower->px()*tower->px() + tower->py()*tower->py() + tower->pz()*tower->pz()); float towerEta = 0.5*log( (p+tower->pz()+EPSILON)/(p-tower->pz()+EPSILON) ); float towerPhi = atan2(tower->py(), tower->px()); if (towerPhi<0) towerPhi = 2*PI + towerPhi; float phiDiff = towerPhi - phi; if (fabs(phiDiff)>PI) { if (phiDiff>0) { phiDiff = -(2*PI - fabs(phiDiff)); } else if (phiDiff<=0) { phiDiff = (2*PI - fabs(phiDiff)); } } return phiDiff*phiDiff + (towerEta-eta)*(towerEta-eta); } #endif // USE_CDFEDM2