File indexing completed on 2026-08-06 09:25:33
0001
0002
0003
0004
0005 #ifndef NINJA_MOMENTUM_HH
0006 #define NINJA_MOMENTUM_HH
0007
0008 #include <iostream>
0009
0010 #include <ninja/types.hh>
0011 #include <ninja/static_arrays.hh>
0012
0013 #if 1
0014 # define NINJA_MOM_EXPR(mu,expr) do { \
0015 unsigned mu = 0; expr; \
0016 mu = 1; expr; \
0017 mu = 2; expr; \
0018 mu = 3; expr; \
0019 } while(0)
0020 #endif
0021 #if 0
0022 # define NINJA_MOM_EXPR(mu,expr) do { \
0023 for (unsigned mu=0; mu<4; ++mu) { \
0024 expr; \
0025 } \
0026 } while(0)
0027 #endif
0028
0029 namespace ninja {
0030
0031
0032 class RealMomentum;
0033 class ComplexMomentum;
0034
0035
0036
0037 class RealMomentum {
0038
0039 public:
0040
0041
0042 RealMomentum(): data(Real(), Real(), Real(), Real()) {}
0043
0044
0045 RealMomentum(const Real & p0, const Real & p1,
0046 const Real & p2, const Real & p3)
0047 : data(p0, p1, p2, p3) {}
0048
0049
0050 explicit RealMomentum(const Real p[4])
0051 : data(p[0], p[1], p[2], p[3]) {}
0052
0053
0054 RealMomentum(const RealMomentum & p)
0055 : data( p.data[0], p.data[1], p.data[2], p.data[3]) {}
0056
0057
0058 Real operator() (unsigned i) const
0059 {
0060 return data[i];
0061 }
0062 Real & operator() (unsigned i)
0063 {
0064 return data[i];
0065 }
0066
0067
0068 Real operator[] (unsigned i) const
0069 {
0070 return data[i];
0071 }
0072 Real & operator[] (unsigned i)
0073 {
0074 return data[i];
0075 }
0076
0077
0078 RealMomentum & operator = (const RealMomentum & p)
0079 {
0080 data[0] = p.data[0];
0081 data[1] = p.data[1];
0082 data[2] = p.data[2];
0083 data[3] = p.data[3];
0084 return *this;
0085 }
0086
0087
0088 RealMomentum & operator += (const RealMomentum & p)
0089 {
0090 data[0] += p.data[0];
0091 data[1] += p.data[1];
0092 data[2] += p.data[2];
0093 data[3] += p.data[3];
0094 return *this;
0095 }
0096
0097
0098 RealMomentum & operator -= (const RealMomentum & p)
0099 {
0100 data[0] -= p.data[0];
0101 data[1] -= p.data[1];
0102 data[2] -= p.data[2];
0103 data[3] -= p.data[3];
0104 return *this;
0105 }
0106
0107
0108 RealMomentum & operator *= (const Real s)
0109 {
0110 data[0] *= s;
0111 data[1] *= s;
0112 data[2] *= s;
0113 data[3] *= s;
0114 return *this;
0115 }
0116
0117
0118 RealMomentum & operator /= (const Real s)
0119 {
0120 data[0] /= s;
0121 data[1] /= s;
0122 data[2] /= s;
0123 data[3] /= s;
0124 return *this;
0125 }
0126
0127
0128 friend std::ostream & operator << (std::ostream & os,
0129 const RealMomentum & p);
0130 friend const RealMomentum & operator +(const RealMomentum & p1);
0131 friend RealMomentum operator -(const RealMomentum & p1);
0132 friend RealMomentum operator+(const RealMomentum & p1,
0133 const RealMomentum & p2);
0134 friend RealMomentum operator-(const RealMomentum & p1,
0135 const RealMomentum & p2);
0136 friend RealMomentum operator *(const RealMomentum & p, const Real & s );
0137 friend RealMomentum operator *(const Real & s, const RealMomentum & p);
0138 friend RealMomentum operator /(const RealMomentum & p, const Real & s );
0139 friend Real mp(const RealMomentum & p1, const RealMomentum & p2);
0140 friend Real mp2(const RealMomentum & p);
0141 friend Real eucl_mp2(const RealMomentum & p);
0142 friend class ComplexMomentum;
0143 friend ComplexMomentum operator+(const RealMomentum & p1,
0144 const ComplexMomentum & p2);
0145 friend ComplexMomentum operator+(const ComplexMomentum & p1,
0146 const RealMomentum & p2);
0147 friend ComplexMomentum operator-(const RealMomentum & p1,
0148 const ComplexMomentum & p2);
0149 friend ComplexMomentum operator-(const ComplexMomentum & p1,
0150 const RealMomentum & p2);
0151 friend ComplexMomentum operator *(const RealMomentum & p,
0152 const Complex & s );
0153 friend ComplexMomentum operator *(const Complex & s,
0154 const RealMomentum & p);
0155 friend Complex mp(const ComplexMomentum & p1, const RealMomentum & p2);
0156 friend Complex mp(const RealMomentum & p1, const ComplexMomentum & p2);
0157
0158 private:
0159 ninja::details::Array4D<Real> data;
0160
0161 };
0162
0163
0164
0165
0166 class ComplexMomentum
0167 {
0168
0169 public:
0170
0171
0172 ComplexMomentum(): data(Complex(), Complex(),
0173 Complex(), Complex()) {}
0174
0175
0176 ComplexMomentum(const Complex & p0, const Complex & p1,
0177 const Complex & p2, const Complex & p3)
0178 : data(p0, p1, p2, p3) {}
0179
0180
0181 explicit ComplexMomentum(const Complex p[4])
0182 : data(p[0], p[1], p[2], p[3]) {}
0183
0184
0185 ComplexMomentum(const ComplexMomentum & p)
0186 : data(p.data[0], p.data[1], p.data[2], p.data[3]) {}
0187
0188
0189 ComplexMomentum(const RealMomentum & p)
0190 : data(p.data[0], p.data[1], p.data[2], p.data[3]) {}
0191
0192
0193 const Complex operator() (unsigned i) const
0194 {
0195 return data[i];
0196 }
0197 Complex & operator() (unsigned i)
0198 {
0199 return data[i];
0200 }
0201
0202
0203 const Complex operator[] (unsigned i) const
0204 {
0205 return data[i];
0206 }
0207 Complex & operator[] (unsigned i)
0208 {
0209 return data[i];
0210 }
0211
0212
0213 ComplexMomentum & operator = (const ComplexMomentum & p)
0214 {
0215 data[0] = p.data[0];
0216 data[1] = p.data[1];
0217 data[2] = p.data[2];
0218 data[3] = p.data[3];
0219 return *this;
0220 }
0221 ComplexMomentum & operator = (const RealMomentum & p)
0222 {
0223 data[0] = p[0];
0224 data[1] = p[1];
0225 data[2] = p[2];
0226 data[3] = p[3];
0227 return *this;
0228 }
0229
0230
0231 ComplexMomentum & operator += (const ComplexMomentum & p)
0232 {
0233 data[0] += p.data[0];
0234 data[1] += p.data[1];
0235 data[2] += p.data[2];
0236 data[3] += p.data[3];
0237 return *this;
0238 }
0239 ComplexMomentum & operator += (const RealMomentum & p)
0240 {
0241 data[0] += p[0];
0242 data[1] += p[1];
0243 data[2] += p[2];
0244 data[3] += p[3];
0245 return *this;
0246 }
0247
0248
0249 ComplexMomentum & operator -= (const ComplexMomentum & p)
0250 {
0251 data[0] -= p.data[0];
0252 data[1] -= p.data[1];
0253 data[2] -= p.data[2];
0254 data[3] -= p.data[3];
0255 return *this;
0256 }
0257 ComplexMomentum & operator -= (const RealMomentum & p)
0258 {
0259 data[0] -= p[0];
0260 data[1] -= p[1];
0261 data[2] -= p[2];
0262 data[3] -= p[3];
0263 return *this;
0264 }
0265
0266
0267 ComplexMomentum & operator *= (const Complex s)
0268 {
0269 data[0] *= s;
0270 data[1] *= s;
0271 data[2] *= s;
0272 data[3] *= s;
0273 return *this;
0274 }
0275 ComplexMomentum & operator *= (const Real s)
0276 {
0277 data[0] *= s;
0278 data[1] *= s;
0279 data[2] *= s;
0280 data[3] *= s;
0281 return *this;
0282 }
0283
0284
0285 ComplexMomentum & operator /= (const Complex s)
0286 {
0287 data[0] /= s;
0288 data[1] /= s;
0289 data[2] /= s;
0290 data[3] /= s;
0291 return *this;
0292 }
0293
0294 ComplexMomentum & operator /= (const Real s)
0295 {
0296 data[0] /= s;
0297 data[1] /= s;
0298 data[2] /= s;
0299 data[3] /= s;
0300 return *this;
0301 }
0302
0303
0304 friend std::ostream & operator << (std::ostream & os,
0305 const ComplexMomentum & p);
0306 friend const ComplexMomentum & operator +(const ComplexMomentum & p1);
0307 friend ComplexMomentum operator -(const ComplexMomentum & p1);
0308 friend ComplexMomentum operator+(const ComplexMomentum & p1,
0309 const ComplexMomentum & p2);
0310 friend ComplexMomentum operator+(const RealMomentum & p1,
0311 const ComplexMomentum & p2);
0312 friend ComplexMomentum operator+(const ComplexMomentum & p1,
0313 const RealMomentum & p2);
0314 friend ComplexMomentum operator-(const ComplexMomentum & p1,
0315 const ComplexMomentum & p2);
0316 friend ComplexMomentum operator-(const RealMomentum & p1,
0317 const ComplexMomentum & p2);
0318 friend ComplexMomentum operator-(const ComplexMomentum & p1,
0319 const RealMomentum & p2);
0320 friend ComplexMomentum operator *(const ComplexMomentum & p,
0321 const Complex & s );
0322 friend ComplexMomentum operator *(const Complex & s,
0323 const ComplexMomentum & p);
0324 friend ComplexMomentum operator *(const ComplexMomentum & p,
0325 const Real & s );
0326 friend ComplexMomentum operator *(const Real & s,
0327 const ComplexMomentum & p);
0328 friend ComplexMomentum operator *(const RealMomentum & p,
0329 const Complex & s );
0330 friend ComplexMomentum operator *(const Complex & s,
0331 const RealMomentum & p);
0332 friend ComplexMomentum operator /(const ComplexMomentum & p,
0333 const Complex & s );
0334 friend ComplexMomentum operator /(const ComplexMomentum & p,
0335 const Real & s );
0336 friend Complex mp(const ComplexMomentum & p1, const ComplexMomentum & p2);
0337 friend Complex mp(const RealMomentum & p1, const ComplexMomentum & p2);
0338 friend Complex mp(const ComplexMomentum & p1, const RealMomentum & p2);
0339 friend Complex mp2(const ComplexMomentum & p);
0340
0341 private:
0342 ninja::details::Array4D<Complex> data;
0343
0344 };
0345
0346
0347
0348
0349
0350 inline std::ostream & operator << (std::ostream & os,
0351 const RealMomentum & p)
0352 {
0353 return os << "{"<< p.data[0]<<", " << p.data[1]
0354 << ", " << p.data[2] << ", " << p.data[3] << "}";
0355 }
0356
0357
0358 inline const RealMomentum & operator +(const RealMomentum & p1)
0359 {
0360 return p1;
0361 }
0362 inline RealMomentum operator -(const RealMomentum & p1)
0363 {
0364 return RealMomentum(-p1.data[0], -p1.data[1], -p1.data[2], -p1.data[3]);
0365 }
0366
0367
0368
0369 inline RealMomentum operator+(const RealMomentum & p1,
0370 const RealMomentum & p2)
0371 {
0372 return RealMomentum(p1.data[0] + p2.data[0],
0373 p1.data[1] + p2.data[1],
0374 p1.data[2] + p2.data[2],
0375 p1.data[3] + p2.data[3]);
0376 }
0377
0378
0379 inline RealMomentum operator-(const RealMomentum & p1,
0380 const RealMomentum & p2)
0381 {
0382 return RealMomentum(p1.data[0] - p2.data[0],
0383 p1.data[1] - p2.data[1],
0384 p1.data[2] - p2.data[2],
0385 p1.data[3] - p2.data[3]);
0386 }
0387
0388
0389 inline RealMomentum operator *(const RealMomentum & p, const Real & s )
0390 {
0391 return RealMomentum(s*p.data[0], s*p.data[1],
0392 s*p.data[2], s*p.data[3]);
0393 }
0394 inline RealMomentum operator *(const Real & s, const RealMomentum & p)
0395 {
0396 return RealMomentum(s*p.data[0], s*p.data[1],
0397 s*p.data[2], s*p.data[3]);
0398 }
0399
0400
0401 inline RealMomentum operator /(const RealMomentum & p, const Real & s )
0402 {
0403 return RealMomentum(p.data[0]/s, p.data[1]/s,
0404 p.data[2]/s, p.data[3]/s);
0405 }
0406
0407
0408 inline Real mp(const RealMomentum & p1, const RealMomentum & p2)
0409 {
0410 return p1.data[0]*p2.data[0]
0411 -p1.data[1]*p2.data[1] - p1.data[2]*p2.data[2] - p1.data[3]*p2.data[3];
0412 }
0413
0414
0415 inline Real mp2(const RealMomentum & p)
0416 {
0417
0418
0419 return p.data[0]*p.data[0]
0420 -p.data[1]*p.data[1] - p.data[2]*p.data[2] - p.data[3]*p.data[3];
0421 }
0422
0423
0424 inline Real eucl_mp2(const RealMomentum & p)
0425 {
0426 return p.data[0]*p.data[0]
0427 +p.data[1]*p.data[1] + p.data[2]*p.data[2] + p.data[3]*p.data[3];
0428 }
0429
0430
0431
0432
0433
0434 inline std::ostream & operator << (std::ostream & os,
0435 const ComplexMomentum & p)
0436 {
0437 return os << "{"<< p.data[0]<<", " << p.data[1]
0438 << ", " << p.data[2] << ", " << p.data[3] << "}";
0439 }
0440
0441
0442 inline const ComplexMomentum & operator +(const ComplexMomentum & p1)
0443 {
0444 return p1;
0445 }
0446 inline ComplexMomentum operator -(const ComplexMomentum & p1)
0447 {
0448 return ComplexMomentum(-p1.data[0],-p1.data[1],-p1.data[2],-p1.data[3]);
0449 }
0450
0451
0452 inline ComplexMomentum operator+(const ComplexMomentum & p1,
0453 const ComplexMomentum & p2)
0454 {
0455 return ComplexMomentum(p1.data[0] + p2.data[0],
0456 p1.data[1] + p2.data[1],
0457 p1.data[2] + p2.data[2],
0458 p1.data[3] + p2.data[3]);
0459 }
0460 inline ComplexMomentum operator+(const RealMomentum & p1,
0461 const ComplexMomentum & p2)
0462 {
0463 return ComplexMomentum(p1.data[0] + p2.data[0],
0464 p1.data[1] + p2.data[1],
0465 p1.data[2] + p2.data[2],
0466 p1.data[3] + p2.data[3]);
0467 }
0468 inline ComplexMomentum operator+(const ComplexMomentum & p1,
0469 const RealMomentum & p2)
0470 {
0471 return ComplexMomentum(p1.data[0] + p2.data[0],
0472 p1.data[1] + p2.data[1],
0473 p1.data[2] + p2.data[2],
0474 p1.data[3] + p2.data[3]);
0475 }
0476
0477
0478 inline ComplexMomentum operator-(const ComplexMomentum & p1,
0479 const ComplexMomentum & p2)
0480 {
0481 return ComplexMomentum( p1.data[0] - p2.data[0],
0482 p1.data[1] - p2.data[1],
0483 p1.data[2] - p2.data[2],
0484 p1.data[3] - p2.data[3]);
0485 }
0486 inline ComplexMomentum operator-(const RealMomentum & p1,
0487 const ComplexMomentum & p2)
0488 {
0489 return ComplexMomentum(p1.data[0] - p2.data[0],
0490 p1.data[1] - p2.data[1],
0491 p1.data[2] - p2.data[2],
0492 p1.data[3] - p2.data[3]);
0493 }
0494 inline ComplexMomentum operator-(const ComplexMomentum & p1,
0495 const RealMomentum & p2)
0496 {
0497 return ComplexMomentum(p1.data[0] - p2.data[0],
0498 p1.data[1] - p2.data[1],
0499 p1.data[2] - p2.data[2],
0500 p1.data[3] - p2.data[3]);
0501 }
0502
0503
0504 inline ComplexMomentum operator *(const ComplexMomentum & p,
0505 const Complex & s )
0506 {
0507 return ComplexMomentum(s*p.data[0], s*p.data[1],
0508 s*p.data[2], s*p.data[3]);
0509 }
0510 inline ComplexMomentum operator *(const Complex & s,
0511 const ComplexMomentum & p)
0512 {
0513 return ComplexMomentum(s*p.data[0], s*p.data[1],
0514 s*p.data[2], s*p.data[3]);
0515 }
0516 inline ComplexMomentum operator *(const ComplexMomentum & p,
0517 const Real & s )
0518 {
0519 return ComplexMomentum(s*p.data[0], s*p.data[1],
0520 s*p.data[2], s*p.data[3]);
0521 }
0522 inline ComplexMomentum operator *(const Real & s,
0523 const ComplexMomentum & p)
0524 {
0525 return ComplexMomentum(s*p.data[0], s*p.data[1],
0526 s*p.data[2], s*p.data[3]);
0527 }
0528 inline ComplexMomentum operator *(const RealMomentum & p,
0529 const Complex & s )
0530 {
0531 return ComplexMomentum(s*p.data[0], s*p.data[1],
0532 s*p.data[2], s*p.data[3]);
0533 }
0534 inline ComplexMomentum operator *(const Complex & s,
0535 const RealMomentum & p)
0536 {
0537 return ComplexMomentum(s*p.data[0], s*p.data[1],
0538 s*p.data[2], s*p.data[3]);
0539 }
0540
0541
0542 inline ComplexMomentum operator /(const ComplexMomentum & p,
0543 const Complex & s )
0544 {
0545 return ComplexMomentum( p.data[0]/s, p.data[1]/s,
0546 p.data[2]/s, p.data[3]/s);
0547 }
0548 inline ComplexMomentum operator /(const ComplexMomentum & p,
0549 const Real & s )
0550 {
0551 return ComplexMomentum(p.data[0]/s, p.data[1]/s,
0552 p.data[2]/s, p.data[3]/s);
0553 }
0554
0555
0556 inline Complex mp(const ComplexMomentum & p1, const ComplexMomentum & p2)
0557 {
0558 return p1.data[0]*p2.data[0]
0559 -p1.data[1]*p2.data[1] - p1.data[2]*p2.data[2] - p1.data[3]*p2.data[3];
0560 }
0561
0562 inline Complex mp(const RealMomentum & p1, const ComplexMomentum & p2)
0563 {
0564 return p1.data[0]*p2.data[0]
0565 -p1.data[1]*p2.data[1] - p1.data[2]*p2.data[2] - p1.data[3]*p2.data[3];
0566 }
0567
0568 inline Complex mp(const ComplexMomentum & p1, const RealMomentum & p2)
0569 {
0570 return p1.data[0]*p2.data[0]
0571 -p1.data[1]*p2.data[1] - p1.data[2]*p2.data[2] - p1.data[3]*p2.data[3];
0572 }
0573
0574
0575 inline Complex mp2(const ComplexMomentum & p){
0576
0577
0578 return p.data[0]*p.data[0]
0579 -p.data[1]*p.data[1] - p.data[2]*p.data[2] - p.data[3]*p.data[3];
0580 }
0581
0582
0583 inline RealMomentum real(const ComplexMomentum & p)
0584 {
0585 return RealMomentum(ninja::real(p[0]), ninja::real(p[1]),
0586 ninja::real(p[2]), ninja::real(p[3]));
0587 }
0588
0589
0590 inline RealMomentum imag(const ComplexMomentum & p)
0591 {
0592 return RealMomentum(ninja::imag(p[0]), ninja::imag(p[1]),
0593 ninja::imag(p[2]), ninja::imag(p[3]));
0594 }
0595
0596
0597 inline ComplexMomentum conj(const ComplexMomentum & p)
0598 {
0599 return ComplexMomentum(ninja::conj(p[0]), ninja::conj(p[1]),
0600 ninja::conj(p[2]), ninja::conj(p[3]));
0601 }
0602
0603 }
0604
0605 #endif