38 #include <boost/numeric/ublas/io.hpp>
40 #include "physUtils.hpp"
47 using namespace boost::numeric::ublas;
52 bool massDependence::_debug =
false;
56 massDependence::print(ostream& out)
const
68 printDebug << name() <<
" = 1" << endl;
80 const double M = parent->lzVec().M();
81 const double m1 = v.
daughter1()->lzVec().M();
82 const double m2 = v.
daughter2()->lzVec().M();
83 const double q = breakupMomentum(M, m1, m2);
84 const double M0 = parent->mass();
85 const double q02 = breakupMomentumSquared(M0, m1, m2,
true);
87 const double q0 = sqrt(fabs(q02));
88 const double Gamma0 = parent->width();
89 const unsigned int L = v.
L();
91 const complex<double> bw =
breitWigner(M, M0, Gamma0, L, q, q0);
93 printDebug << name() <<
"(m = " << maxPrecision(M) <<
" GeV/c^2, m_0 = " << maxPrecision(M0)
94 <<
" GeV/c^2, Gamma_0 = " << maxPrecision(Gamma0) <<
" GeV/c^2, L = " << spinQn(L)
95 <<
", q = " << maxPrecision(q) <<
" GeV/c, q0 = "
96 << maxPrecision(q0) <<
" GeV/c) = " << maxPrecisionDouble(bw) << endl;
108 const double M = parent->lzVec().M();
109 const double M0 = parent->mass();
110 const double Gamma0 = parent->width();
113 const double A = M0 * Gamma0;
114 const double B = M0 * M0 - M *
M;
115 const complex<double> bw = (A / (B * B + A *
A)) * complex<double>(B,
A);
118 printDebug << name() <<
"(m = " << maxPrecision(M) <<
" GeV/c^2, m_0 = " << maxPrecision(M0)
119 <<
" GeV/c^2, Gamma_0 = " << maxPrecision(Gamma0) <<
" GeV/c^2) = "
120 << maxPrecisionDouble(bw) << endl;
132 const double M = parent->lzVec().M();
133 const double m1 = v.
daughter1()->lzVec().M();
134 const double m2 = v.
daughter2()->lzVec().M();
135 const double q2 = breakupMomentumSquared(M, m1, m2);
136 const double q = sqrt(q2);
137 const double M0 = parent->mass();
138 const double q02 = breakupMomentumSquared(M0, m1, m2);
139 const double q0 = sqrt(q02);
140 const double Gamma0 = parent->width();
142 const double F = 2 * q2 / (q02 + q2);
143 const double Gamma = Gamma0 * (M0 /
M) * (q / q0) *
F;
148 const double A = M0 * Gamma0 * sqrt(F);
151 const double B = M0 * M0 - M *
M;
152 const double C = M0 * Gamma;
153 const complex<double> bw = (A / (B * B + C * C)) * std::complex<double>(B, C);
156 printDebug << name() <<
"(m = " << maxPrecision(M) <<
" GeV/c^2, m_0 = " << maxPrecision(M0)
157 <<
" GeV/c^2, Gamma_0 = " << maxPrecision(Gamma0) <<
" GeV/c^2, "
158 <<
"q = " << maxPrecision(q) <<
" GeV/c, q0 = " << maxPrecision(q0) <<
" GeV/c) "
159 <<
"= " << maxPrecisionDouble(bw) << endl;
171 const double M = parent->lzVec().M();
172 const double m1 = v.
daughter1()->lzVec().M();
173 const double m2 = v.
daughter2()->lzVec().M();
174 const double q = breakupMomentum(M, m1, m2);
175 const double M0 = parent->mass();
176 const double q0 = breakupMomentum(M0, m1, m2);
177 const double Gamma0 = parent->width();
179 const double Gamma = Gamma0 * (q / q0);
182 const double C = M0 * Gamma;
183 const double A = C * M /
q;
184 const double B = M0 * M0 - M *
M;
185 const complex<double> bw = (A / (B * B + C * C)) * std::complex<double>(B, C);
188 printDebug << name() <<
"(m = " << maxPrecision(M) <<
" GeV/c^2, m_0 = " << maxPrecision(M0)
189 <<
" GeV/c^2, Gamma_0 = " << maxPrecision(Gamma0) <<
" GeV/c^2, "
190 <<
"q = " << maxPrecision(q) <<
" GeV/c, q0 = " << maxPrecision(q0) <<
" GeV/c) "
191 <<
"= " << maxPrecisionDouble(bw) << endl;
197 piPiSWaveAuMorganPenningtonM::piPiSWaveAuMorganPenningtonM()
200 _a (2,
matrix<complex<double> >(2, 2)),
201 _c (5,
matrix<complex<double> >(2, 2)),
205 const double f[2] = {0.1968, -0.0154};
207 _a[0](0, 0) = 0.1131;
208 _a[0](0, 1) = 0.0150;
209 _a[0](1, 0) = 0.0150;
210 _a[0](1, 1) = -0.3216;
211 _a[1](0, 0) = f[0] * f[0];
212 _a[1](0, 1) = f[0] * f[1];
213 _a[1](1, 0) = f[1] * f[0];
214 _a[1](1, 1) = f[1] * f[1];
216 _c[0](0, 0) = 0.0337;
217 _c[1](0, 0) = -0.3185;
218 _c[2](0, 0) = -0.0942;
219 _c[3](0, 0) = -0.5927;
220 _c[4](0, 0) = 0.1957;
221 _c[0](0, 1) = _c[0](1, 0) = -0.2826;
222 _c[1](0, 1) = _c[1](1, 0) = 0.0918;
223 _c[2](0, 1) = _c[2](1, 0) = 0.1669;
224 _c[3](0, 1) = _c[3](1, 0) = -0.2082;
225 _c[4](0, 1) = _c[4](1, 0) = -0.1386;
226 _c[0](1, 1) = 0.3010;
227 _c[1](1, 1) = -0.5140;
228 _c[2](1, 1) = 0.1176;
229 _c[3](1, 1) = 0.5204;
230 _c[4](1, 1) = -0.3977;
236 const string partList[] = {
"pi+",
"pi0",
"K+",
"K0"};
237 for (
unsigned int i = 0;
i <
sizeof(partList) /
sizeof(partList[0]); ++
i)
239 printErr <<
"cannot find particle " << partList[
i] <<
" in particle data table. "
240 <<
"aborting." << endl;
254 const complex<double> imag(0, 1);
257 double s = mass *
mass;
258 if (fabs(s -
_sP(0, 1)) < 1e-6) {
271 if (qKmKm.imag() > 0)
273 rho(0, 0) = (2. * qPiPi) / mass;
274 rho(1, 1) = (2. * qKmKm) / mass;
276 rho(0, 0) = ((2. * qPiPi) / mass + (2. * qPi0Pi0) /
mass) / 2.;
277 rho(1, 1) = ((2. * qKK) / mass + (2. * qK0K0) /
mass) / 2.;
279 rho(0, 1) =
rho(1, 0) = 0;
284 for (
unsigned int i = 0;
i <
_sP.size2(); ++
i) {
285 const complex<double> fa = 1. / (s -
_sP(0,
i));
288 for (
unsigned int i = 0;
i <
_c.size(); ++
i) {
289 const complex<double> sc = pow(scale, (
int)
i);
297 invertMatrix<complex<double> >(M - imag *
rho,
_T);
298 const complex<double>
amp =
_T(0, 0);
300 printDebug <<
name() <<
"(m = " << maxPrecision(mass) <<
" GeV) = "
301 << maxPrecisionDouble(amp) << endl;
318 const double M = v.
parent()->lzVec().M();
320 const double f0Mass = 0.9837;
321 const double f0Width = 0.0376;
322 const complex<double> coupling(-0.3743, 0.3197);
326 complex<double> bw = 0;
330 const double Gamma = f0Width * (q / q0);
332 const double C = f0Mass * Gamma;
333 const double A = C * (M /
q);
334 const double B = f0Mass * f0Mass - M *
M;
335 bw = (A / (B * B + C * C)) * complex<double>(B, C);
338 const complex<double>
amp = ampM - coupling * bw;
340 printDebug <<
name() <<
"(m = " << maxPrecision(M) <<
" GeV) = "
341 << maxPrecisionDouble(amp) << endl;
373 const double M = parent->lzVec().M();
374 const double m1 = v.
daughter1()->lzVec().M();
375 const double m2 = v.
daughter2()->lzVec().M();
376 const double q = breakupMomentum(M, m1, m2);
380 const unsigned int L = v.
L();
383 const double M01 = 1.465;
384 const double Gamma01 = 0.235;
385 const double M02 = 1.700;
386 const double Gamma02 = 0.220;
389 const double q102 = breakupMomentumSquared(M01, m1, m2,
true);
390 const double q10 = sqrt(fabs(q102));
391 const double q202 = breakupMomentumSquared(M02, m1, m2,
true);
392 const double q20 = sqrt(fabs(q202));
396 const complex<double> bw1 =
breitWigner(M, M01, Gamma01, L, q, q10);
397 const complex<double> bw2 =
breitWigner(M, M02, Gamma02, L, q, q20);
398 const complex<double>
amp = (4 * bw1 - 3 * bw2) / 7;
404 printDebug <<
name() <<
"(m = " << maxPrecision(M) <<
" GeV/c^2, "
405 <<
"L = " << spinQn(L) <<
", q = " << maxPrecision(q) <<
" GeV/c, "
406 <<
"q1_0 = " << maxPrecision(q10) <<
" GeV/c, "
407 <<
"q2_0 = " << maxPrecision(q20) <<
" GeV/c) = " << maxPrecisionDouble(amp) << endl;