Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-08-06 09:25:33

0001 // -* C++ -*- header file which defines classes for Real and Complex
0002 // fourmomenta.
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   // Forward declarations
0032   class RealMomentum;
0033   class ComplexMomentum;
0034 
0035 
0036   // Definition of a class for Real four-momenta
0037   class RealMomentum {
0038     
0039   public:
0040 
0041     // Default constructor
0042     RealMomentum(): data(Real(), Real(), Real(), Real()) {}
0043 
0044     // Constructor from four real numbers
0045     RealMomentum(const Real & p0, const Real & p1,
0046                  const Real & p2, const Real & p3)
0047       : data(p0, p1, p2, p3)  {}
0048 
0049     // Constructor from an array of four real numbers
0050     explicit RealMomentum(const Real p[4])
0051       : data(p[0], p[1], p[2], p[3])  {}
0052 
0053     // Copy-constructor
0054     RealMomentum(const RealMomentum & p)
0055       : data( p.data[0], p.data[1], p.data[2], p.data[3])  {}
0056 
0057     // Acces to components with: p(0), p(1), p(2), p(3)
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     // Access to components with: p[0], p[1], p[2], p[3]
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     // Assignment operator =
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     // Operator +=
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     // Operator -=
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     // Operator *=
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     // Operator /=
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     // friend declarations
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   }; // class RealMomentum
0162 
0163 
0164 
0165   // Definition of a class for complex four-momenta
0166   class ComplexMomentum
0167   {
0168 
0169   public:
0170 
0171     // Default constructor
0172     ComplexMomentum(): data(Complex(), Complex(),
0173                             Complex(), Complex()) {}
0174 
0175     // Constructor from four complex numbers
0176     ComplexMomentum(const Complex & p0, const Complex & p1,
0177                     const Complex & p2, const Complex & p3)
0178       : data(p0, p1, p2, p3)  {}
0179 
0180     // Constructor from an array of four complex numbers
0181     explicit ComplexMomentum(const Complex p[4])
0182       : data(p[0], p[1], p[2], p[3])  {}
0183 
0184     // Copy-constructor
0185     ComplexMomentum(const ComplexMomentum & p)
0186       : data(p.data[0], p.data[1], p.data[2], p.data[3])  {}
0187 
0188     // Conversion from real-momentum
0189     ComplexMomentum(const RealMomentum & p)
0190       : data(p.data[0], p.data[1], p.data[2], p.data[3])  {}
0191 
0192     // Access to components with: p(0), p(1), p(2), p(3)
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     // Access to components with: p[0], p[1], p[2], p[3]
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     // Assignment operator =
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     // Operator +=
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     // Operator -=
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     // Multiplication operator *=
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     // Operator /=
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     // Operator /=
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     // friend declarations
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   }; // class ComplexMomentum
0345 
0346 
0347   // Functions and operators for Real Momenta
0348 
0349   // Standard output stream
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   // Unary operators + and -
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   // Binary operator +
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   // Binary operator -
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   // Binary operator *
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   // Binary operator /
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   // Scalar Minkowski-product p1.p2
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   // Square p^2 = p.p (with Minkowski metric)
0415   inline Real mp2(const RealMomentum & p)
0416   {
0417     // consider (p0+p3)*(p0-p3)-p1*p1-p2*p2 --> same n. of operations
0418     // but 1 less multiplication
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   // euclidean p^2
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   // Functions and operators for Complex Momenta
0432 
0433   // Standard output stream
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   // Unary operators + and -
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   // Binary operator +
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   // Binary operator -
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   // Binary operator *
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   // Binary operator /
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   // Scalar Minkowski-product p1.p2
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   // Scalar Minkowski-product p1.p2
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   // Scalar Minkowski-product p1.p2
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   // Square p^2 = p.p (with Minkowski metric)
0575   inline Complex mp2(const ComplexMomentum & p){
0576     // consider (p0+p3)*(p0-p3)-p1*p1-p2*p2 --> same n. of operations
0577     // but 1 less multiplication
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   // Real part of a complex momentum
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   // Immaginary part of a complex momentum
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   // Complex conjugate of a complex momentum
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 } // namespace ninja
0604 
0605 #endif // NINJA_MOMENTUM_HH