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;