/**
 * @file feldman_cousins.hh
 * @author Christoph Langenbruch, David Gerick
 * @date 2020-06-30
 *
 */

#ifndef FELDMAN_COUSINS_H
#define FELDMAN_COUSINS_H

#include <string>
#include <vector>
namespace fcnc {
    //Forward declarations
    class event;
    class fitter;
    class pdf;
    class generator;
    class parameters;
    class options;
 
  class feldman_cousins;

  class feldman_cousins {
  private:
    options* opts;
    int from, to;
  public:
    ///constructor
    feldman_cousins(options* o):
      opts(o),
      from(-1),
      to(-1)
    {
    };
    ///destructor 
    ~feldman_cousins(){};

    ///one-dimensional feldman cousins
    bool fc_1d(std::string parname, unsigned int nsteps, double parmin, double parmax,
               unsigned int ntoys, unsigned int pdfidx, //this parameter just changes output file
               std::vector<pdf*> probs, std::vector<parameters*> params, generator* gen, fitter* f,
               std::vector<std::vector<event> *> events, unsigned int bin=0, int from=-1, int to=-1);

    bool fc_1d(std::string parname, unsigned int nsteps, double parmin, double parmax,
               unsigned int ntoys, //this parameter just changes output file
               pdf* prob, parameters* params, generator* gen, fitter* f,
               std::vector<event> * events, unsigned int bin=0, int from=-1, int to=-1);
    ///two-dimensional feldman cousins
    bool fc_2d(std::string parxname, unsigned int nstepsx, double parxmin, double parxmax,
               std::string paryname, unsigned int nstepsy, double parymin, double parymax,
               unsigned int ntoys, unsigned int pdfidx, //this parameter just changes output file 
               std::vector<pdf*> probs, std::vector<parameters*> params, generator* gen, fitter* f,
               std::vector<std::vector<event> *> events, unsigned int bin=0, int from=-1, int to=-1);

    bool fc_2d(std::string parxname, unsigned int nstepsx, double parxmin, double parxmax, 
               std::string paryname, unsigned int nstepsy, double parymin, double parymax, 
               unsigned int ntoys, //this parameter just changes output file 
               pdf* prob, parameters* params, generator* gen, fitter* f, 
               std::vector<event> * events, unsigned int bin=0, int from=-1, int to=-1);
  };


}//end namespace

#endif
