// @(#)root/roostats:$Id: ConfInterval.h 31276 2009-11-18 15:06:42Z moneta $
// Author: Kyle Cranmer, Lorenzo Moneta, Gregory Schott, Wouter Verkerke
/*************************************************************************
 * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOSTATS_ConfInterval
#define ROOSTATS_ConfInterval

#ifndef ROOT_TNamed
#include "TNamed.h"
#endif

#ifndef ROO_ARG_SET
#include "RooArgSet.h"
#endif

//_________________________________________________________________
//
// BEGIN_HTML
// ConfInterval is an interface class for a generic interval in the RooStats framework.
// Any tool inheriting from IntervalCalculator can return a ConfInterval.
// There are many types of intervals, they may be a simple range [a,b] in 1 dimension,
// or they may be disconnected regions in multiple dimensions.
// So the common interface is simply to ask the interval if a given point "IsInInterval".
// The Interval also knows what confidence level it was constructed at and the space of 
// parameters for which it was constructed.
// Note, one could use the same class for a Bayesian "credible interval".
// END_HTML
//
//


namespace RooStats {

   class ConfInterval : public TNamed {

   public:

      // constructor given name and title 
      explicit ConfInterval(const char* name = 0) : TNamed(name,name) {} 

      // destructor
      virtual ~ConfInterval() {}
    
      // check if given point is in the interval
      virtual Bool_t IsInInterval(const RooArgSet&) const = 0; 
    
      // used to set confidence level.  Keep pure virtual
      virtual void SetConfidenceLevel(Double_t cl) = 0;

      // return confidence level
      virtual Double_t ConfidenceLevel() const = 0;

      // return list of parameters of interest defining this interval (return a new cloned list)
      virtual RooArgSet* GetParameters() const = 0;

      // check if parameters are correct (i.e. they are the POI of this interval)
      virtual Bool_t CheckParameters(const RooArgSet&) const = 0;


   protected:

      ClassDef(ConfInterval,1) // Interface for Confidence Intervals

   };
}


#endif
