text: // Implementation of the Szczepaniak-Pennington-Veneziano amplitudes from
  // [arXiv:1403.5782 [hep-ph]]
  //
  // Dependencies: none
  //
  // Author:       Daniel Winney (2019)
  // Affiliation:  Joint Physics Analysis Center (JPAC)
  // Email:        dwinney@iu.edu
  // -----------------------------------------------------------------------------
  
  #ifndef _VENEZ_
  #define _VENEZ_
  
  #include "constants.hpp"
  
  #include <TCanvas.h>
  #include <TGraph.h>
  #include <TLegend.h>
  #include <TStyle.h>
  #include <TLine.h>
  #include <TError.h>
  
  #include <complex>
  #include <cmath>
  #include <fstream>
  #include <string>
  #include <iostream>
  #include <iomanip>
  #include <vector>
  
  using std::vector;
  using std::setw;
  using std::cout;
  using std::endl;
  using std::string;
  using std::complex;
  
  // -----------------------------------------------------------------------------
  // The spv_amp is parameterized in terms of the values fo the regge trajectory,
  // \alpha(s) and \alpha(t), for channels s and t.
  //
  // To initiate an spv_amp object you need to select the maximal number of
  // low energy poles to consider, max_l, and the background cutoff parameter, N,
  // which supresses the Regge background.
  // -----------------------------------------------------------------------------
  class spv_amp
  {
  protected:
    int N, ell;
  
    vector<double> couplings;
  
    // -----------------------------------------------------------------------------
    // Low energy parameterization of the amplitudes
    // Sum of Breit-Wigner poles with polynomial residue
    complex<double> low_energy(int l, complex<double> as, complex<double> at) const;
  
    // High energy parameterization with Regge behavior suppressed by the
    // parameter N. Order unity at as & at << N
    complex<double> background(int l, complex<double> as, complex<double> at) const;
  
  public:
    spv_amp()
    {};
  
    // -----------------------------------------------------------------------------
    // Default constructor without setting couplings, use this for fitting
    spv_amp(int max_ell, int eN)
    : N(eN), ell(max_ell)
    {};
  
    spv_amp(vector<int> parms)
    : N(parms[0]), ell(parms[1])
    {};
  
    // Parameteized constructor with a vector of couplings
    spv_amp(int max_ell, int eN, vector<double> coups)
    : N(eN), ell(max_ell), couplings(coups)
    {
      if (coups.size() != max_ell + 1)
      {
        cout << "spv_amp: Couplings vector in constructor does not match max_l + 1. Quitting...";
        cout << endl;
        exit(0);
      }
    };
  
    // -----------------------------------------------------------------------------
    // Evaluate the amplitude at some values of a trajectory as and at.
    complex<double> eval(complex<double> as, complex<double> at, vector<double> couplings) const;
  };
  
  #endif
  