13 #ifndef ROOT_Fit_DataRange 
   14 #define ROOT_Fit_DataRange 
   38    typedef std::vector<std::pair<double,double> > RangeSet;
 
   39    typedef std::vector< RangeSet >   RangeIntervals;
 
   44    explicit DataRange (
unsigned int dim = 1) :
 
   45       fRanges ( std::vector<RangeSet> (dim) )
 
   51    DataRange(
double xmin, 
double xmax);
 
   56    DataRange(
double xmin, 
double xmax, 
double ymin, 
double ymax);
 
   60    DataRange(
double xmin, 
double xmax, 
double ymin, 
double ymax, 
double zmin, 
double zmax);
 
   64    unsigned int NDim()
 const { 
return fRanges.size(); }
 
   70    unsigned int Size(
unsigned int icoord = 0)
 const {
 
   71       return icoord <  fRanges.size() ? fRanges[icoord].size() : 0;
 
   80       for (
unsigned int icoord = 0; icoord < fRanges.size(); ++icoord)
 
   81          if (fRanges[icoord].size() > 0) 
return true;
 
   88    const RangeSet & Ranges(
unsigned int icoord = 0)
 const {
 
   90       return fRanges.at(icoord);
 
   97    std::pair<double, double> operator() (
unsigned int icoord = 0,
unsigned int irange = 0) 
const;
 
  103    void GetRange(
unsigned int irange, 
unsigned int icoord, 
double & xmin, 
double & xmax)
 const {
 
  104       if (Size(icoord)<= irange) GetInfRange(xmin,xmax);
 
  106          xmin = fRanges[icoord][irange].first;
 
  107          xmax = fRanges[icoord][irange].second;
 
  114    void GetRange(
unsigned int icoord, 
double & xmin, 
double & xmax)
 const {
 
  115       if (Size(icoord) == 0) GetInfRange(xmin,xmax);
 
  117          xmin = fRanges[icoord].front().first;
 
  118          xmax = fRanges[icoord].front().second;
 
  124    void GetRange(
double & xmin, 
double & xmax,
unsigned int irange = 0)
 const {  GetRange(irange,0,xmin,xmax); }
 
  128    void GetRange(
double & xmin, 
double & xmax, 
double & ymin, 
double & ymax,
unsigned int irange = 0)
 const {
 
  129       GetRange(irange,0,xmin,xmax); GetRange(irange,1,ymin,ymax);
 
  134    void GetRange(
double & xmin, 
double & xmax, 
double & ymin, 
double & ymax, 
double & zmin, 
double & zmax,
unsigned int irange=0)
 const {
 
  135       GetRange(irange,0,xmin,xmax); GetRange(irange,1,ymin,ymax); GetRange(irange,2,zmin,zmax);
 
  140    void GetRange(
double * xmin, 
double * xmax, 
unsigned int irange = 0)
   const {
 
  141       for (
unsigned int i = 0; i < fRanges.size(); ++i)
 
  142          GetRange(irange,i,xmin[i],xmax[i]);
 
  158    void AddRange(
unsigned  int  icoord , 
double xmin, 
double xmax );
 
  163    void AddRange(
double xmin, 
double xmax ) { AddRange(0,xmin,xmax); }
 
  167    void AddRange(
double xmin, 
double xmax, 
double ymin, 
double ymax ) { AddRange(0,xmin,xmax); AddRange(1,ymin,ymax); }
 
  172    void AddRange(
double xmin, 
double xmax, 
double ymin, 
double ymax, 
double zmin, 
double zmax ) {
 
  173       AddRange(0,xmin,xmax); AddRange(1,ymin,ymax); AddRange(2,zmin,zmax); }
 
  180    void SetRange(
unsigned  int  icoord , 
double xmin, 
double xmax );
 
  185    void SetRange(
double xmin, 
double xmax ) { SetRange(0,xmin,xmax); }
 
  189    void SetRange(
double xmin, 
double xmax, 
double ymin, 
double ymax ) { SetRange(0,xmin,xmax); SetRange(1,ymin,ymax); }
 
  194    void SetRange(
double xmin, 
double xmax, 
double ymin, 
double ymax, 
double zmin, 
double zmax ) {
 
  195       SetRange(0,xmin,xmax); SetRange(1,ymin,ymax); SetRange(2,zmin,zmax); }
 
  200    void Clear (
unsigned  int  icoord = 0 );
 
  205    bool IsInside(
double x, 
unsigned int icoord = 0) 
const;
 
  210    bool IsInside(
const double *x)
 const {
 
  212       for (
unsigned int idim = 0; idim < fRanges.size(); ++idim) { 
 
  213          ret &= IsInside(x[idim],idim);
 
  214          if (!ret) 
return ret;
 
  224    void CleanRangeSet(
unsigned int icoord, 
double xmin, 
double xmax);
 
  227    static void GetInfRange(
double &x1, 
double &x2);
 
  231    RangeIntervals fRanges;