// This -*- C++ -*- file has been generated by the Python package
// ninjanumgen, which is distributed with the Ninja library.

#ifndef FOURPHOTONS_HH
#define FOURPHOTONS_HH

#include <ninja/ninja.hh>

#define NINJA_NUM FourPhotons
#define NINJA_NUM_NAMESPACE 0

#if NINJA_NUM_NAMESPACE
namespace NINJA_NUM_NAMESPACE {
#endif


  class NINJA_NUM : public ninja::Numerator {

  public:

    virtual ninja::Complex evaluate(const ninja::ComplexMomentum & ninjaQ,
                                    const ninja::Complex & ninjaMu2,
                                    int ninja_cut,
                                    const ninja::PartitionInt ninja_cutidx[]);
  
    virtual void muExpansion(const ninja::ComplexMomentum ninjaV[],
                             const ninja::PartitionInt ninja_cutidx[],
                             ninja::Complex ninjaC[]);
  
    virtual void t3Expansion(const ninja::ComplexMomentum & ninjaA,
                             const ninja::ComplexMomentum & ninjaE3,
                             const ninja::ComplexMomentum & ninjaE4,
                             const ninja::Complex & ninjaP,
                             int ninja_mindeg, int ninja_cut,
                             const ninja::PartitionInt ninja_cutidx[],
                             ninja::Complex ninjaC[]);
  
    virtual void t2Expansion(const ninja::ComplexMomentum & ninjaA0,
                             const ninja::ComplexMomentum & ninjaA1,
                             const ninja::ComplexMomentum & ninjaE3,
                             const ninja::ComplexMomentum & ninjaE4,
                             const ninja::Complex ninjaP[],
                             int ninja_mindeg, int ninja_cut,
                             const ninja::PartitionInt ninja_cutidx[],
                             ninja::Complex ninjaC[]);
  
  public:

    // initialization
    void init(const ninja::RealMomentum k[],
              const ninja::Complex & fermion_mass,
              const char * helicities);

    // get pointer to internal momenta of the loop
    ninja::RealMomentum * getInternalMomenta()
    {
      return pi_;
    }

    // get pointer to internal masses of the loop
    ninja::Complex * getInternalMasses()
    {
      return m2_;
    }

    // get SMatrix
    ninja::SMatrix & getSMatrix()
    {
      return s_mat_;
    }

  private:
    ninja::RealMomentum k1,k4,p2;
    ninja::RealMomentum pi_[4];
    ninja::Complex m2_[4];
    ninja::SMatrix s_mat_;

    ninja::ComplexMomentum eps12, eps21;
    ninja::ComplexMomentum eps23, eps32;
    ninja::ComplexMomentum eps34, eps43;
    ninja::ComplexMomentum eps41, eps14;
    ninja::Complex spae23,spbe23,spae34,spbe34,spae41,spbe41,spae21,spbe21;

    ninja::Complex mf2_;
  };


#if NINJA_NUM_NAMESPACE
} // namespace NINJA_NUM_NAMESPACE
#endif

#undef NINJA_NUM
#undef NINJA_NUM_NAMESPACE

#endif // FOURPHOTONS_HH

