double pat::helper::ResolutionHelper::getResolE | ( | pat::CandKinResolution::Parametrization | parametrization, |
const AlgebraicSymMatrix44 & | covariance, | ||
const pat::CandKinResolution::LorentzVector & | p4 | ||
) |
Definition at line 276 of file ResolutionHelper.cc.
References a, b, pat::CandKinResolution::Cart, funct::cos(), pat::CandKinResolution::ECart, pat::CandKinResolution::ESpher, pat::CandKinResolution::EtEtaPhi, pat::CandKinResolution::EtThetaPhi, Exception, pat::CandKinResolution::Invalid, pat::CandKinResolution::MCCart, pat::CandKinResolution::MCPInvSpher, pat::CandKinResolution::MCSpher, AlCaHLTBitMon_ParallelJobs::p, funct::sin(), pat::CandKinResolution::Spher, and mathSSE::sqrt().
Referenced by getResolP(), and pat::CandKinResolution::resolE().
{ switch (parametrization) { // ======= ENERGY BASED ========== case pat::CandKinResolution::ECart: case pat::CandKinResolution::ESpher: return sqrt(covariance(3,3)); // ======= ET BASED ========== case pat::CandKinResolution::EtThetaPhi: { // E = Et/Sin(theta) double a = 1.0/sin(p4.Theta()); // dE/dEt double b = - a*a* p4.Et() * cos(p4.Theta()); // dE/dTh return sqrt(a*a*covariance(0,0) + b*b*covariance(1,1) + 2*a*b*covariance(0,1)); } case pat::CandKinResolution::EtEtaPhi: { // E = Et/Sin(Theta(eta)) double th = p4.Theta(); double a = 1.0/sin(th); // dE/dEt double b = a* p4.Et() * cos(th); // dE/dEta: dTh/dEta = - 1.0/sin(theta) = - dE/dEt return sqrt(a*a*covariance(0,0) + b*b*covariance(1,1) + 2*a*b*covariance(0,1)); } // ======= MASS BASED ========== case pat::CandKinResolution::Cart: { AlgebraicVector4 xoE(p4.X(), p4.Y(), p4.Z(), p4.M()); xoE *= 1/p4.E(); return sqrt(ROOT::Math::Similarity(xoE, covariance)); } case pat::CandKinResolution::MCCart: { AlgebraicVector4 xoE(p4.X(), p4.Y(), p4.Z(), 0); xoE *= 1/p4.E(); return sqrt(ROOT::Math::Similarity(xoE, covariance)); } case pat::CandKinResolution::Spher: { // E = sqrt(P^2 + m^2) double einv = 1.0/p4.E(); double a = p4.P()*einv; // dE/dP double b = p4.M()*einv; // dE/dm return sqrt(a*a*covariance(0,0) + b*b*covariance(3,3) + 2*a*b*covariance(0,3)); } case pat::CandKinResolution::MCSpher: { // E = sqrt(P^2 + m^2); |dE/dP| = |P/E| = P/E return p4.P()/p4.E() * sqrt(covariance(0,0)); } case pat::CandKinResolution::MCPInvSpher: // { // E = sqrt(P^2 + m^2); |dE/d(1/P)| = P^2 |dE/dP| = P^3/E double p = p4.P(); return p*p*p/p4.E()*sqrt(covariance(0,0)); } // ======= OTHER ========== case pat::CandKinResolution::Invalid: throw cms::Exception("Invalid parametrization") << parametrization; default: throw cms::Exception("Not Implemented") << "getResolE not yet implemented for parametrization " << parametrization ; } }
double pat::helper::ResolutionHelper::getResolEt | ( | pat::CandKinResolution::Parametrization | parametrization, |
const AlgebraicSymMatrix44 & | covariance, | ||
const pat::CandKinResolution::LorentzVector & | p4 | ||
) |
dEt/dPx * Et
dEt/dPx * Et
dEt/dPx * Et
Definition at line 340 of file ResolutionHelper.cc.
References a, b, trackerHits::c, pat::CandKinResolution::Cart, funct::cos(), alignCSCRings::e, pat::CandKinResolution::ECart, pat::CandKinResolution::ESpher, pat::CandKinResolution::EtEtaPhi, pat::CandKinResolution::EtThetaPhi, Exception, pat::CandKinResolution::Invalid, pat::CandKinResolution::MCCart, pat::CandKinResolution::MCPInvSpher, pat::CandKinResolution::MCSpher, AlCaHLTBitMon_ParallelJobs::p, p2, pi2, alignCSCRings::s, indexGen::s2, funct::sin(), pat::CandKinResolution::Spher, and mathSSE::sqrt().
Referenced by pat::CandKinResolution::resolEt().
{ switch (parametrization) { // ======= ENERGY BASED ========== case pat::CandKinResolution::ECart: { // Et^2 = E^2 * (Pt^2/P^2) double pt2 = p4.Perp2(); double pz2 = ROOT::Math::Square(p4.Pz()), p2 = pt2 + pz2; double e2OverP4 = ROOT::Math::Square(p4.E()/p2); AlgebraicVector4 derivs(p4.Px(), p4.Py(), p4.Pz(), p4.E()); derivs *= (1.0/p4.Et()); derivs[0] *= pz2 * e2OverP4; derivs[1] *= pz2 * e2OverP4; derivs[2] *= -pt2 * e2OverP4; derivs[3] *= pt2/p2; return sqrt(ROOT::Math::Similarity(derivs, covariance)); } case pat::CandKinResolution::ESpher: { // Et = E * Sin(Theta) double st = sin(p4.Theta()), ct = cos(p4.Theta()); return sqrt( st*st * covariance(3,3) + ROOT::Math::Square(ct*p4.E()) * covariance(1,1) + 2*st*ct*p4.E() * covariance(1,3) ); } // ======= ET BASED ========== case pat::CandKinResolution::EtThetaPhi: case pat::CandKinResolution::EtEtaPhi: return sqrt(covariance(0,0)); // ======= MASS BASED ========== case pat::CandKinResolution::Cart: case pat::CandKinResolution::MCCart: { // Et^2 = E^2 Sin^2(th) = (p^2 + m^2) * (pt^2) / p^2 double pt2 = p4.Perp2(); double p2 = pt2 + ROOT::Math::Square(p4.Pz()); double e2 = p2 + p4.M2(); double s2 = pt2/p2, pi2 = 1.0/p2; double et = sqrt(e2 * s2); AlgebraicVector4 derivs(p4.Px(), p4.Py(), p4.Pz(), p4.M()); derivs *= 1.0/et; derivs[0] *= (s2 + e2*pi2*(1.0 - pt2*pi2) ); derivs[1] *= (s2 + e2*pi2*(1.0 - pt2*pi2) ); derivs[2] *= (s2 - e2*pt2*pi2*pi2); if (parametrization == pat::CandKinResolution::Cart) { derivs[3] *= s2; return sqrt(ROOT::Math::Similarity(derivs, covariance)); } else { derivs[3] = 0; return sqrt(ROOT::Math::Similarity(derivs, covariance)); // test if Sub<33> is faster } } case pat::CandKinResolution::Spher: { // Et = E sin(theta); dE/dM = M/E, dE/dP = P/E double s = sin(p4.Theta()), c = cos(p4.Theta()); double e = p4.E(); AlgebraicVector4 derivs( p4.P()/e * s, e * c, 0, p4.M()/e * s); return sqrt(ROOT::Math::Similarity(derivs, covariance)); } case pat::CandKinResolution::MCSpher: { // Et = E sin(theta); dE/dP = P/E double s = sin(p4.Theta()), c = cos(p4.Theta()); double e = p4.E(); double a = p4.P()* s / e; double b = e * c; return sqrt(a*a*covariance(0,0) + b*b*covariance(1,1) + 2*a*b*covariance(0,1)); } case pat::CandKinResolution::MCPInvSpher: { // Et = E sin(theta); dE/dP = P/E -> dE/d(1/P) = - P^2 dE/dP = - P^3 / E double s = sin(p4.Theta()), c = cos(p4.Theta()); double p = p4.P(), e = p4.E(); double a = ( - p * p * p / e ) * s; double b = e * c; return sqrt(a*a*covariance(0,0) + b*b*covariance(1,1) + 2*a*b*covariance(0,1)); } // ======= OTHER ========== case pat::CandKinResolution::Invalid: throw cms::Exception("Invalid parametrization") << parametrization; default: throw cms::Exception("Not Implemented") << "getResolEt not yet implemented for parametrization " << parametrization ; } }
double pat::helper::ResolutionHelper::getResolEta | ( | pat::CandKinResolution::Parametrization | parametrization, |
const AlgebraicSymMatrix44 & | covariance, | ||
const pat::CandKinResolution::LorentzVector & | p4 | ||
) |
Definition at line 479 of file ResolutionHelper.cc.
References abs, pat::CandKinResolution::Cart, DetaDtheta(), pat::CandKinResolution::ECart, pat::CandKinResolution::ESpher, pat::CandKinResolution::EtEtaPhi, pat::CandKinResolution::EtThetaPhi, Exception, getResolTheta(), pat::CandKinResolution::Invalid, pat::CandKinResolution::MCCart, pat::CandKinResolution::MCPInvSpher, pat::CandKinResolution::MCSpher, pat::CandKinResolution::Spher, and mathSSE::sqrt().
Referenced by pat::CandKinResolution::resolEta().
{ switch (parametrization) { case pat::CandKinResolution::Cart: case pat::CandKinResolution::ECart: case pat::CandKinResolution::MCCart: // dEta = dTheta * dEta/dTheta return abs(DetaDtheta(p4.Theta())) * getResolTheta(parametrization, covariance, p4); case pat::CandKinResolution::ESpher: // all the ones which have case pat::CandKinResolution::MCPInvSpher: // theta as parameter 1 case pat::CandKinResolution::MCSpher: case pat::CandKinResolution::EtThetaPhi: case pat::CandKinResolution::Spher: return sqrt(covariance(1,1))*abs(DetaDtheta(p4.Theta())); case pat::CandKinResolution::EtEtaPhi: // as simple as that return sqrt(covariance(1,1)); case pat::CandKinResolution::Invalid: throw cms::Exception("Invalid parametrization") << parametrization; default: throw cms::Exception("Not Implemented") << "getResolEta not yet implemented for parametrization " << parametrization ; } }
double pat::helper::ResolutionHelper::getResolM | ( | pat::CandKinResolution::Parametrization | parametrization, |
const AlgebraicSymMatrix44 & | covariance, | ||
const pat::CandKinResolution::LorentzVector & | p4 | ||
) |
Definition at line 430 of file ResolutionHelper.cc.
References pat::CandKinResolution::Cart, pat::CandKinResolution::ECart, pat::CandKinResolution::ESpher, pat::CandKinResolution::EtEtaPhi, pat::CandKinResolution::EtThetaPhi, Exception, pat::CandKinResolution::Invalid, pat::CandKinResolution::MCCart, pat::CandKinResolution::MCPInvSpher, pat::CandKinResolution::MCSpher, pat::CandKinResolution::Spher, and mathSSE::sqrt().
Referenced by pat::CandKinResolution::resolM().
{ switch (parametrization) { // ====== MASS CONSTRAINED ===== case pat::CandKinResolution::MCSpher: case pat::CandKinResolution::MCPInvSpher: case pat::CandKinResolution::MCCart: case pat::CandKinResolution::EtThetaPhi: case pat::CandKinResolution::EtEtaPhi: return 0; // ======= MASS BASED ========== case pat::CandKinResolution::Cart: case pat::CandKinResolution::Spher: return sqrt(covariance(3,3)); // ======= ENERGY BASED ========== case pat::CandKinResolution::ESpher: { // M^2 = E^2 - P^2 double dMdE = p4.E()/p4.M(), dMdP = - p4.P()/p4.M(); return sqrt( dMdP*dMdP*covariance(0,0) + 2*dMdP*dMdE*covariance(0,3) + dMdE*dMdE*covariance(3,3)); } case pat::CandKinResolution::ECart: { // M^2 = E^2 - sum_i P_i^2 AlgebraicVector4 derivs(-p4.Px(), -p4.Py(), -p4.Pz(), p4.E()); derivs *= 1.0/p4.M(); return sqrt(ROOT::Math::Similarity(derivs, covariance)); } throw cms::Exception("Not Implemented") << "getResolM not yet implemented for parametrization " << parametrization ; case pat::CandKinResolution::Invalid: throw cms::Exception("Invalid parametrization") << parametrization; default: throw cms::Exception("Not Implemented") << "getResolM not yet implemented for parametrization " << parametrization ; } }
double pat::helper::ResolutionHelper::getResolP | ( | pat::CandKinResolution::Parametrization | parametrization, |
const AlgebraicSymMatrix44 & | covariance, | ||
const pat::CandKinResolution::LorentzVector & | p4 | ||
) |
Definition at line 37 of file ResolutionHelper.cc.
References pat::CandKinResolution::Cart, pat::CandKinResolution::ECart, pat::CandKinResolution::ESpher, pat::CandKinResolution::EtEtaPhi, pat::CandKinResolution::EtThetaPhi, Exception, getResolE(), pat::CandKinResolution::Invalid, pat::CandKinResolution::MCCart, pat::CandKinResolution::MCPInvSpher, pat::CandKinResolution::MCSpher, pat::CandKinResolution::Spher, and mathSSE::sqrt().
Referenced by getResolPInv(), and pat::CandKinResolution::resolP().
{ switch (parametrization) { // ==== CARTESIAN ==== case pat::CandKinResolution::Cart: case pat::CandKinResolution::ECart: case pat::CandKinResolution::MCCart: { // p2 = px^2 + py^2 + pz^2 // dp/dp_i = p_i/p ==> it is a unit vector! AlgebraicVector3 derivs(p4.X(), p4.Y(), p4.Z()); derivs.Unit(); return sqrt(ROOT::Math::Similarity(derivs, covariance.Sub<AlgebraicSymMatrix33>(0,0))); } // ==== SPHERICAL (P) ==== case pat::CandKinResolution::Spher: case pat::CandKinResolution::ESpher: case pat::CandKinResolution::MCSpher: return sqrt(covariance(0,0)); // ==== SPHERICAL (1/P) ==== case pat::CandKinResolution::MCPInvSpher: return sqrt(covariance(0,0)) * (p4.P2()); // ==== HEP CYLINDRICAL (with Pt = Et, P = E) ==== case pat::CandKinResolution::EtThetaPhi: case pat::CandKinResolution::EtEtaPhi: return getResolE(parametrization,covariance,p4); // ==== OTHER ==== case pat::CandKinResolution::Invalid: throw cms::Exception("Invalid parametrization") << parametrization; default: throw cms::Exception("Not Implemented") << "getResolP not yet implemented for parametrization " << parametrization ; } }
double pat::helper::ResolutionHelper::getResolPhi | ( | pat::CandKinResolution::Parametrization | parametrization, |
const AlgebraicSymMatrix44 & | covariance, | ||
const pat::CandKinResolution::LorentzVector & | p4 | ||
) |
Definition at line 534 of file ResolutionHelper.cc.
References pat::CandKinResolution::Cart, pat::CandKinResolution::ECart, pat::CandKinResolution::ESpher, pat::CandKinResolution::EtEtaPhi, pat::CandKinResolution::EtThetaPhi, Exception, pat::CandKinResolution::Invalid, pat::CandKinResolution::MCCart, pat::CandKinResolution::MCPInvSpher, pat::CandKinResolution::MCSpher, pat::CandKinResolution::Spher, and mathSSE::sqrt().
Referenced by pat::CandKinResolution::resolPhi().
{ double pt2 = p4.Perp2(); switch (parametrization) { case pat::CandKinResolution::Cart: case pat::CandKinResolution::ECart: case pat::CandKinResolution::MCCart: return sqrt( ROOT::Math::Square(p4.Px()) * covariance(1,1) + ROOT::Math::Square(p4.Py()) * covariance(0,0) + -2*p4.Px()*p4.Py() * covariance(0,1) )/pt2; case pat::CandKinResolution::ESpher: // all the ones which have case pat::CandKinResolution::MCPInvSpher: // phi as parameter 2 case pat::CandKinResolution::MCSpher: case pat::CandKinResolution::EtThetaPhi: case pat::CandKinResolution::Spher: case pat::CandKinResolution::EtEtaPhi: return sqrt(covariance(2,2)); case pat::CandKinResolution::Invalid: throw cms::Exception("Invalid parametrization") << parametrization; default: throw cms::Exception("Not Implemented") << "getResolPhi not yet implemented for parametrization " << parametrization ; } }
double pat::helper::ResolutionHelper::getResolPInv | ( | pat::CandKinResolution::Parametrization | parametrization, |
const AlgebraicSymMatrix44 & | covariance, | ||
const pat::CandKinResolution::LorentzVector & | p4 | ||
) |
Definition at line 115 of file ResolutionHelper.cc.
References pat::CandKinResolution::Cart, pat::CandKinResolution::ECart, pat::CandKinResolution::ESpher, pat::CandKinResolution::EtEtaPhi, pat::CandKinResolution::EtThetaPhi, Exception, getResolP(), pat::CandKinResolution::Invalid, pat::CandKinResolution::MCCart, pat::CandKinResolution::MCPInvSpher, pat::CandKinResolution::MCSpher, pat::CandKinResolution::Spher, and mathSSE::sqrt().
Referenced by pat::CandKinResolution::resolPInv().
{ switch (parametrization) { // ==== SPHERICAL (P) ==== case pat::CandKinResolution::Spher: case pat::CandKinResolution::ESpher: case pat::CandKinResolution::MCSpher: return 1.0/p4.P2() * sqrt(covariance(0,0)); // ==== SPHERICAL (1/P) ==== case pat::CandKinResolution::MCPInvSpher: return sqrt(covariance(0,0)); // ==== OTHER ==== case pat::CandKinResolution::Cart: case pat::CandKinResolution::ECart: case pat::CandKinResolution::MCCart: case pat::CandKinResolution::EtThetaPhi: case pat::CandKinResolution::EtEtaPhi: return 1.0/p4.P2() * getResolP(parametrization, covariance, p4); case pat::CandKinResolution::Invalid: throw cms::Exception("Invalid parametrization") << parametrization; default: throw cms::Exception("Not Implemented") << "getResolPInv not yet implemented for parametrization " << parametrization ; } }
double pat::helper::ResolutionHelper::getResolPt | ( | pat::CandKinResolution::Parametrization | parametrization, |
const AlgebraicSymMatrix44 & | covariance, | ||
const pat::CandKinResolution::LorentzVector & | p4 | ||
) |
Definition at line 71 of file ResolutionHelper.cc.
References a, b, pat::CandKinResolution::Cart, funct::cos(), pat::CandKinResolution::ECart, pat::CandKinResolution::ESpher, pat::CandKinResolution::EtEtaPhi, pat::CandKinResolution::EtThetaPhi, Exception, pat::CandKinResolution::Invalid, pat::CandKinResolution::MCCart, pat::CandKinResolution::MCPInvSpher, pat::CandKinResolution::MCSpher, AlCaHLTBitMon_ParallelJobs::p, funct::sin(), pat::CandKinResolution::Spher, and mathSSE::sqrt().
Referenced by pat::CandKinResolution::resolPt().
{ switch (parametrization) { // ==== CARTESIAN ==== case pat::CandKinResolution::Cart: case pat::CandKinResolution::ECart: case pat::CandKinResolution::MCCart: { double pti2 = 1.0/(p4.Perp2()); return sqrt( ( covariance(0,0) * p4.Px()*p4.Px() + covariance(1,1) * p4.Py()*p4.Py() + 2*covariance(0,1) * p4.Px()*p4.Py()) * pti2 ); } // ==== SPHERICAL (P, Theta) ==== case pat::CandKinResolution::Spher: case pat::CandKinResolution::ESpher: case pat::CandKinResolution::MCSpher: { // pt = p * sin(theta) double a = sin(p4.Theta()); double b = p4.P() * cos(p4.Theta()); return sqrt(a*a*covariance(0,0) + b*b*covariance(1,1) + 2*a*b*covariance(0,1)); } // ==== SPHERICAL (1/P) ==== case pat::CandKinResolution::MCPInvSpher: { // pt = (1/pi) * sin(theta) double p = p4.P(); double a = - (p*p) * sin(p4.Theta()); double b = p * cos(p4.Theta()); return sqrt(a*a*covariance(0,0) + b*b*covariance(1,1) + 2*a*b*covariance(0,1)); } // ==== HEP CYLINDRICAL (with Pt = Et) ==== case pat::CandKinResolution::EtThetaPhi: case pat::CandKinResolution::EtEtaPhi: return sqrt(covariance(0,0)); case pat::CandKinResolution::Invalid: throw cms::Exception("Invalid parametrization") << parametrization; default: throw cms::Exception("Not Implemented") << "getResolPt not yet implemented for parametrization " << parametrization ; } }
double pat::helper::ResolutionHelper::getResolPx | ( | pat::CandKinResolution::Parametrization | parametrization, |
const AlgebraicSymMatrix44 & | covariance, | ||
const pat::CandKinResolution::LorentzVector & | p4 | ||
) |
Definition at line 141 of file ResolutionHelper.cc.
References a, b, pat::CandKinResolution::Cart, funct::cos(), pat::CandKinResolution::ECart, pat::CandKinResolution::ESpher, pat::CandKinResolution::EtEtaPhi, pat::CandKinResolution::EtThetaPhi, Exception, pat::CandKinResolution::Invalid, pat::CandKinResolution::MCCart, pat::CandKinResolution::MCPInvSpher, pat::CandKinResolution::MCSpher, AlCaHLTBitMon_ParallelJobs::p, funct::sin(), pat::CandKinResolution::Spher, and mathSSE::sqrt().
Referenced by pat::CandKinResolution::resolPx().
{ switch (parametrization) { // ==== CARTESIAN ==== case pat::CandKinResolution::Cart: case pat::CandKinResolution::ECart: case pat::CandKinResolution::MCCart: return sqrt(covariance(0,0)); // ==== SPHERICAL (P) ==== case pat::CandKinResolution::Spher: case pat::CandKinResolution::ESpher: case pat::CandKinResolution::MCSpher: case pat::CandKinResolution::MCPInvSpher: { // Px = P * sin(theta) * cos(phi) double p = p4.P(); AlgebraicVector3 derivs; derivs[0] = sin(p4.Theta()) * cos(p4.Phi()); // now let's hope gcc does common subexpr optimiz. if (parametrization == pat::CandKinResolution::MCPInvSpher) { derivs[0] *= -(p*p); } derivs[1] = p * cos(p4.Theta()) * cos(p4.Phi()); derivs[2] = p * sin(p4.Theta()) * -sin(p4.Phi()); return sqrt(ROOT::Math::Similarity(derivs, covariance.Sub<AlgebraicSymMatrix33>(0,0))); } // ==== HEP CYLINDRICAL (with Pt = Et) ==== case pat::CandKinResolution::EtThetaPhi: case pat::CandKinResolution::EtEtaPhi: { // Px = Pt * cos(phi) double a = cos(p4.Phi()); double b = - p4.Pt() * sin(p4.Phi()); return sqrt(a*a*covariance(0,0) + 2*a*b*covariance(2,0) + b*b*covariance(2,2)); } // ==== OTHERS ==== case pat::CandKinResolution::Invalid: throw cms::Exception("Invalid parametrization") << parametrization; default: throw cms::Exception("Not Implemented") << "getResolPx not yet implemented for parametrization " << parametrization ; } }
double pat::helper::ResolutionHelper::getResolPy | ( | pat::CandKinResolution::Parametrization | parametrization, |
const AlgebraicSymMatrix44 & | covariance, | ||
const pat::CandKinResolution::LorentzVector & | p4 | ||
) |
Definition at line 183 of file ResolutionHelper.cc.
References a, b, pat::CandKinResolution::Cart, funct::cos(), pat::CandKinResolution::ECart, pat::CandKinResolution::ESpher, pat::CandKinResolution::EtEtaPhi, pat::CandKinResolution::EtThetaPhi, Exception, pat::CandKinResolution::Invalid, pat::CandKinResolution::MCCart, pat::CandKinResolution::MCPInvSpher, pat::CandKinResolution::MCSpher, AlCaHLTBitMon_ParallelJobs::p, funct::sin(), pat::CandKinResolution::Spher, and mathSSE::sqrt().
Referenced by pat::CandKinResolution::resolPy().
{ switch (parametrization) { // ==== CARTESIAN ==== case pat::CandKinResolution::Cart: case pat::CandKinResolution::ECart: case pat::CandKinResolution::MCCart: return sqrt(covariance(1,1)); // ==== SPHERICAL (P) ==== case pat::CandKinResolution::Spher: case pat::CandKinResolution::ESpher: case pat::CandKinResolution::MCSpher: case pat::CandKinResolution::MCPInvSpher: { // Py = P * sin(theta) * sin(phi) double p = p4.P(); AlgebraicVector3 derivs; derivs[0] = sin(p4.Theta()) * sin(p4.Phi()); // now let's hope gcc does common subexpr optimiz. if (parametrization == pat::CandKinResolution::MCPInvSpher) { derivs[0] *= -(p*p); } derivs[1] = p * cos(p4.Theta()) * sin(p4.Phi()); derivs[2] = p * sin(p4.Theta()) * cos(p4.Phi()); return sqrt(ROOT::Math::Similarity(derivs, covariance.Sub<AlgebraicSymMatrix33>(0,0))); } // ==== HEP CYLINDRICAL (with Pt = Et) ==== case pat::CandKinResolution::EtThetaPhi: case pat::CandKinResolution::EtEtaPhi: { // Py = Pt * sin(phi) double a = sin(p4.Phi()); double b = p4.Pt() * cos(p4.Phi()); return sqrt(a*a*covariance(0,0) + 2*a*b*covariance(2,0) + b*b*covariance(2,2)); } // ==== OTHERS ==== case pat::CandKinResolution::Invalid: throw cms::Exception("Invalid parametrization") << parametrization; default: throw cms::Exception("Not Implemented") << "getResolPy not yet implemented for parametrization " << parametrization ; } }
double pat::helper::ResolutionHelper::getResolPz | ( | pat::CandKinResolution::Parametrization | parametrization, |
const AlgebraicSymMatrix44 & | covariance, | ||
const pat::CandKinResolution::LorentzVector & | p4 | ||
) |
Definition at line 225 of file ResolutionHelper.cc.
References a, b, trackerHits::c, pat::CandKinResolution::Cart, funct::cos(), pat::CandKinResolution::ECart, pat::CandKinResolution::ESpher, pat::CandKinResolution::EtEtaPhi, pat::CandKinResolution::EtThetaPhi, Exception, pat::CandKinResolution::Invalid, pat::CandKinResolution::MCCart, pat::CandKinResolution::MCPInvSpher, pat::CandKinResolution::MCSpher, AlCaHLTBitMon_ParallelJobs::p, alignCSCRings::s, funct::sin(), pat::CandKinResolution::Spher, and mathSSE::sqrt().
Referenced by pat::CandKinResolution::resolPz().
{ switch (parametrization) { // ==== CARTESIAN ==== case pat::CandKinResolution::Cart: case pat::CandKinResolution::ECart: case pat::CandKinResolution::MCCart: return sqrt(covariance(2,2)); // ==== SPHERICAL (P) ==== case pat::CandKinResolution::Spher: case pat::CandKinResolution::ESpher: case pat::CandKinResolution::MCSpher: { // Pz = P * cos(theta) double a = cos(p4.Theta()); double b = -p4.P() * sin(p4.Theta()); return sqrt(a*a*covariance(0,0) + 2*a*b*covariance(1,0) + b*b*covariance(1,1)); } case pat::CandKinResolution::MCPInvSpher: { // Pz = P * cos(theta) double p = p4.P(); double a = -p*p*cos(p4.Theta()); double b = -p * sin(p4.Theta()); return sqrt(a*a*covariance(0,0) + 2*a*b*covariance(1,0) + b*b*covariance(1,1)); } // ==== HEP CYLINDRICAL (with Pt = Et) ==== case pat::CandKinResolution::EtThetaPhi: { // Pz = Pt * ctg(theta) d ctg(x) = -1/sin^2(x) double s = sin(p4.Theta()), c = cos(p4.Theta()); double a = c/s; double b = - p4.Pt() / (s*s); return sqrt(a*a*covariance(0,0) + 2*a*b*covariance(1,0) + b*b*covariance(1,1)); } case pat::CandKinResolution::EtEtaPhi: { // Pz = Pt * sinh(eta) double a = sinh(p4.Eta()); double b = p4.Et() * cosh(p4.Eta()); return sqrt(a*a*covariance(0,0) + 2*a*b*covariance(1,0) + b*b*covariance(1,1)); } // ==== OTHERS ==== case pat::CandKinResolution::Invalid: throw cms::Exception("Invalid parametrization") << parametrization; default: throw cms::Exception("Not Implemented") << "getResolPz not yet implemented for parametrization " << parametrization ; } }
double pat::helper::ResolutionHelper::getResolTheta | ( | pat::CandKinResolution::Parametrization | parametrization, |
const AlgebraicSymMatrix44 & | covariance, | ||
const pat::CandKinResolution::LorentzVector & | p4 | ||
) |
Definition at line 502 of file ResolutionHelper.cc.
References abs, pat::CandKinResolution::Cart, DthetaDeta(), pat::CandKinResolution::ECart, pat::CandKinResolution::ESpher, pat::CandKinResolution::EtEtaPhi, pat::CandKinResolution::EtThetaPhi, Exception, pat::CandKinResolution::Invalid, pat::CandKinResolution::MCCart, pat::CandKinResolution::MCPInvSpher, pat::CandKinResolution::MCSpher, AlCaHLTBitMon_ParallelJobs::p, pi, pat::CandKinResolution::Spher, and mathSSE::sqrt().
Referenced by getResolEta(), and pat::CandKinResolution::resolTheta().
{ switch (parametrization) { case pat::CandKinResolution::Cart: case pat::CandKinResolution::ECart: case pat::CandKinResolution::MCCart: { // theta = acos( pz / p ) ; d acos(x) = - 1 / sqrt( 1 - x*x) dx = - p/pt dx double pt2 = p4.Perp2(); double p = p4.P(), pi = 1.0/p, pi3 = pi*pi*pi; double dacos = - p/sqrt(pt2); AlgebraicVector3 derivs; derivs[0] = -p4.Px() * p4.Pz() * dacos * pi3; derivs[1] = -p4.Py() * p4.Pz() * dacos * pi3; derivs[2] = pt2 * dacos * pi3; return sqrt(ROOT::Math::Similarity(derivs, covariance.Sub<AlgebraicSymMatrix33>(0,0))); } case pat::CandKinResolution::ESpher: // all the ones which have case pat::CandKinResolution::MCPInvSpher: // theta as parameter 1 case pat::CandKinResolution::MCSpher: case pat::CandKinResolution::EtThetaPhi: case pat::CandKinResolution::Spher: return sqrt(covariance(1,1)); case pat::CandKinResolution::EtEtaPhi: return sqrt(covariance(1,1))*abs(DthetaDeta(p4.Eta())); case pat::CandKinResolution::Invalid: throw cms::Exception("Invalid parametrization") << parametrization; default: throw cms::Exception("Not Implemented") << "getResolTheta not yet implemented for parametrization " << parametrization ; } }
void pat::helper::ResolutionHelper::rescaleForKinFitter | ( | const pat::CandKinResolution::Parametrization | parametrization, |
AlgebraicSymMatrix44 & | covariance, | ||
const math::XYZTLorentzVector & | initialP4 | ||
) |
Definition at line 9 of file ResolutionHelper.cc.
References pat::CandKinResolution::Cart, pat::CandKinResolution::ESpher, i, python::tagInventory::inv, and pat::CandKinResolution::Spher.
{ double inv; switch (parametrization) { case pat::CandKinResolution::Cart: case pat::CandKinResolution::Spher: // for us parameter[3] = mass, for KinFitter parameter[3] = mass/initialP4.mass(); inv = 1.0/initialP4.mass(); for (int i = 0; i < 4; i++) { covariance(3,i) *= inv; } covariance(3,3) *= inv; break; case pat::CandKinResolution::ESpher: // for us parameter[3] = energy, for KinFitter parameter[3] = energy/initialP4.energy(); inv = 1.0/initialP4.energy(); for (int i = 0; i < 4; i++) { covariance(3,i) *= inv; } covariance(3,3) *= inv; break; default: ;// nothing to do } }