23 DataRange::DataRange(
double xmin,
double xmax) :
24 fRanges( std::vector<RangeSet> (1) )
29 rx[0] = std::make_pair(xmin, xmax);
35 DataRange::DataRange(
double xmin,
double xmax,
double ymin,
double ymax) :
36 fRanges( std::vector<RangeSet> (2) )
41 rx[0] = std::make_pair(xmin, xmax);
47 ry[0] = std::make_pair(ymin, ymax);
52 DataRange::DataRange(
double xmin,
double xmax,
double ymin,
double ymax,
double zmin,
double zmax) :
53 fRanges( std::vector<RangeSet> (3) )
58 rx[0] = std::make_pair(xmin, xmax);
63 ry[0] = std::make_pair(ymin, ymax);
68 rz[0] = std::make_pair(zmin, zmax);
73 bool lessRange(
const std::pair<double,double> & r1,
const std::pair<double,double> & r2 ) {
75 return r1.second < r2.second;
78 std::pair<double, double> DataRange::operator() (
unsigned int icoord,
unsigned int irange)
const {
79 if ( Size(icoord) > irange )
80 return fRanges[icoord].at(irange);
81 else if (irange == 0) {
83 double xmin = 0;
double xmax = 0;
84 GetInfRange(xmin,xmax);
85 return std::make_pair(xmin,xmax);
89 MATH_ERROR_MSG(
"DataRange::operator()",
"invalid range number - return (0,0)");
90 return std::pair<double,double>(0,0);
94 void DataRange::AddRange(
unsigned int icoord ,
double xmin,
double xmax ) {
97 if (xmin >= xmax)
return;
100 if (icoord >= fRanges.size() ) {
102 rx[0] = std::make_pair(xmin, xmax);
103 fRanges.resize(icoord+1);
104 fRanges[icoord] = rx;
107 RangeSet & rs = fRanges[icoord];
109 if ( rs.size() == 0) {
110 rs.push_back(std::make_pair(xmin,xmax) );
116 CleanRangeSet(icoord,xmin,xmax);
118 rs.push_back(std::make_pair(xmin,xmax) );
120 std::sort( rs.begin(), rs.end() , lessRange);
124 void DataRange::SetRange(
unsigned int icoord ,
double xmin,
double xmax ) {
127 if (xmin >= xmax)
return;
130 if (icoord >= fRanges.size() ) {
131 fRanges.resize(icoord+1);
133 rs[0] = std::make_pair(xmin, xmax);
134 fRanges[icoord] = rs;
138 RangeSet & rs = fRanges[icoord];
140 if (rs.size() > 1) MATH_WARN_MSG(
"DataRange::SetRange",
"remove existing range and keep only the set one");
142 rs[0] = std::make_pair(xmin, xmax);
146 bool DataRange::IsInside(
double x,
unsigned int icoord )
const {
149 if (Size(icoord) == 0)
return true;
150 const RangeSet & ranges = fRanges[icoord];
151 for (RangeSet::const_iterator itr = ranges.begin(); itr != ranges.end(); ++itr) {
152 if ( x < (*itr).first )
return false;
153 if ( x <= (*itr).second)
return true;
158 void DataRange::Clear(
unsigned int icoord ) {
160 if (Size(icoord) == 0)
return;
161 fRanges[icoord].clear();
165 void DataRange::CleanRangeSet(
unsigned int icoord,
double xmin,
double xmax) {
170 RangeSet & ranges = fRanges[icoord];
171 for (RangeSet::iterator itr = ranges.begin(); itr != ranges.end(); ++itr) {
173 if ( itr->first >= xmin && itr->second <= xmax) {
174 itr = ranges.erase(itr);
182 void DataRange::GetInfRange(
double &xmin,
double &xmax) {
184 xmin = -std::numeric_limits<double>::infinity();
185 xmax = std::numeric_limits<double>::infinity();