//----------------------------------------------------------------------- // File and Version Information: // $Id: EvtDalitzPlot.cc,v 1.23 2004/12/21 19:58:42 ryd Exp $ // // Environment: // This software is part of the EvtGen package developed jointly // for the BaBar and CLEO collaborations. If you use all or part // of it, please give an appropriate acknowledgement. // // Copyright Information: // Copyright (C) 1998 Caltech, UCSB // // Module creator: // Alexei Dvoretskii, Caltech, 2001-2002. //----------------------------------------------------------------------- #include "EvtGenBase/EvtPatches.hh" // Global 3-body Dalitz decay kinematics as defined by the mass // of the mother and the daughters. Spins are not considered. #include #include #include #include "EvtGenBase/EvtPatches.hh" #include "EvtGenBase/EvtDalitzPlot.hh" #include "EvtGenBase/EvtTwoBodyVertex.hh" #include "EvtGenBase/EvtPDL.hh" #include "EvtGenBase/EvtDecayMode.hh" using namespace EvtCyclic3; EvtDalitzPlot::EvtDalitzPlot() : _mA(0.), _mB(0.), _mC(0.), _bigM(0.), _ldel(0.), _rdel(0.) {} EvtDalitzPlot::EvtDalitzPlot(double mA, double mB, double mC, double bigM, double ldel, double rdel) : _mA(mA), _mB(mB), _mC(mC), _bigM(bigM), _ldel(ldel), _rdel(rdel) { sanityCheck(); } EvtDalitzPlot::EvtDalitzPlot(const EvtDecayMode& mode, double ldel, double rdel ) { _mA = EvtPDL::getMeanMass(EvtPDL::getId(mode.dau(A))); _mB = EvtPDL::getMeanMass(EvtPDL::getId(mode.dau(B))); _mC = EvtPDL::getMeanMass(EvtPDL::getId(mode.dau(C))); _bigM = EvtPDL::getMeanMass(EvtPDL::getId(mode.mother())); _ldel = ldel; _rdel = rdel; sanityCheck(); } EvtDalitzPlot::EvtDalitzPlot(const EvtDalitzPlot& other) : _mA(other._mA), _mB(other._mB), _mC(other._mC), _bigM(other._bigM), _ldel(other._ldel), _rdel(other._rdel) {} EvtDalitzPlot::~EvtDalitzPlot() {} bool EvtDalitzPlot::operator==(const EvtDalitzPlot& other) const { bool ret = false; if(_mA == other._mA && _mB == other._mB && _mC == other._mC && _bigM == other._bigM) ret = true; return ret; } const EvtDalitzPlot* EvtDalitzPlot::clone() const { return new EvtDalitzPlot(*this); } void EvtDalitzPlot::sanityCheck() const { if(_mA < 0 || _mB < 0 || _mC < 0 || _bigM <= 0 || _bigM - _mA - _mB - _mC < 0.) { printf("Invalid Dalitz plot %f %f %f %f\n",_mA,_mB,_mC,_bigM); assert(0); } assert(_ldel <= 0.); assert(_rdel >= 0.); } double EvtDalitzPlot::m(Index i) const { double m = _mA; if(i == B) m = _mB; else if(i == C) m = _mC; return m; } double EvtDalitzPlot::sum() const { return _mA*_mA + _mB*_mB + _mC*_mC + _bigM*_bigM; } double EvtDalitzPlot::qAbsMin(Pair i) const { Index j = first(i); Index k = second(i); return (m(j) + m(k))*(m(j) + m(k)); } double EvtDalitzPlot::qAbsMax(Pair i) const { Index j = other(i); return (_bigM-m(j))*(_bigM-m(j)); } double EvtDalitzPlot::qResAbsMin(EvtCyclic3::Pair i) const { return qAbsMin(i) - sum()/3.; } double EvtDalitzPlot::qResAbsMax(EvtCyclic3::Pair i) const { return qAbsMax(i) - sum()/3.; } double EvtDalitzPlot::qHelAbsMin(EvtCyclic3::Pair i) const { Pair j = next(i); Pair k = prev(i); return (qAbsMin(j) - qAbsMax(k))/2.; } double EvtDalitzPlot::qHelAbsMax(EvtCyclic3::Pair i) const { Pair j = next(i); Pair k = prev(i); return (qAbsMax(j) - qAbsMin(k))/2.; } double EvtDalitzPlot::mAbsMin(Pair i) const { return sqrt(qAbsMin(i)); } double EvtDalitzPlot::mAbsMax(Pair i) const { return sqrt(qAbsMax(i)); } // parallel double EvtDalitzPlot::qMin(Pair i, Pair j, double q) const { if(i == j) return q; else { // Particle pair j defines the rest-frame // 0 - particle common to r.f. and angle calculations // 1 - particle belonging to r.f. but not angle // 2 - particle not belonging to r.f. Index k0 = common(i,j); Index k2 = other(j); Index k1 = other(k0,k2); // Energy, momentum of particle common to rest-frame and angle EvtTwoBodyKine jpair(m(k0),m(k1),sqrt(q)); double pk = jpair.p(); double ek = jpair.e(EvtTwoBodyKine::A,EvtTwoBodyKine::AB); // Energy and momentum of the other particle EvtTwoBodyKine mother(sqrt(q),m(k2),bigM()); double ej = mother.e(EvtTwoBodyKine::B,EvtTwoBodyKine::A); double pj = mother.p(EvtTwoBodyKine::A); // See PDG 34.4.3.1 return (ek+ej)*(ek+ej) - (pk+pj)*(pk+pj); } } // antiparallel double EvtDalitzPlot::qMax(Pair i, Pair j, double q) const { if(i == j) return q; else { // Particle pair j defines the rest-frame // 0 - particle common to r.f. and angle calculations // 1 - particle belonging to r.f. but not angle // 2 - particle not belonging to r.f. Index k0 = common(i,j); Index k2 = other(j); Index k1 = other(k0,k2); // Energy, momentum of particle common to rest-frame and angle EvtTwoBodyKine jpair(m(k0),m(k1),sqrt(q)); double ek = jpair.e(EvtTwoBodyKine::A,EvtTwoBodyKine::AB); double pk = jpair.p(); // Energy and momentum of the other particle EvtTwoBodyKine mother(sqrt(q),m(k2),bigM()); double ej = mother.e(EvtTwoBodyKine::B,EvtTwoBodyKine::A); double pj = mother.p(EvtTwoBodyKine::A); // See PDG 34.4.3.1 return (ek+ej)*(ek+ej) - (pk-pj)*(pk-pj); } } double EvtDalitzPlot::getArea(int N, Pair i, Pair j) const { // Trapezoidal integral over qi. qj can be calculated. // The first and the last point are zero, so they are not counted double dh = (qAbsMax(i) - qAbsMin(i))/((double) N); double sum = 0; int ii; for(ii=1;ii