00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef ROOT_Fit_DataRange
00014 #define ROOT_Fit_DataRange
00015
00016 #include <vector>
00017
00018 namespace ROOT {
00019
00020 namespace Fit {
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 class DataRange {
00035
00036 public:
00037
00038 typedef std::vector<std::pair<double,double> > RangeSet;
00039 typedef std::vector< RangeSet > RangeIntervals;
00040
00041
00042
00043
00044 explicit DataRange (unsigned int dim = 1) :
00045 fRanges ( std::vector<RangeSet> (dim) )
00046 {}
00047
00048
00049
00050
00051 DataRange(double xmin, double xmax);
00052
00053
00054
00055
00056 DataRange(double xmin, double xmax, double ymin, double ymax);
00057
00058
00059
00060 DataRange(double xmin, double xmax, double ymin, double ymax, double zmin, double zmax);
00061
00062
00063
00064 unsigned int NDim() const { return fRanges.size(); }
00065
00066
00067
00068
00069
00070 unsigned int Size(unsigned int icoord = 0) const {
00071 return icoord < fRanges.size() ? fRanges[icoord].size() : 0;
00072 }
00073
00074
00075
00076
00077
00078
00079 bool IsSet() const {
00080 for (unsigned int icoord = 0; icoord < fRanges.size(); ++icoord)
00081 if (fRanges[icoord].size() > 0) return true;
00082 return false;
00083 }
00084
00085
00086
00087
00088 const RangeSet & Ranges(unsigned int icoord = 0) const {
00089
00090 return fRanges.at(icoord);
00091 }
00092
00093
00094
00095
00096
00097 std::pair<double, double> operator() (unsigned int icoord = 0,unsigned int irange = 0) const;
00098
00099
00100
00101
00102
00103 void GetRange(unsigned int icoord, double & xmin, double & xmax) const {
00104 if (Size(icoord) == 0) GetInfRange(xmin,xmax);
00105 else {
00106 xmin = fRanges[icoord].front().first;
00107 xmax = fRanges[icoord].front().second;
00108 }
00109 }
00110
00111
00112
00113 void GetRange(double & xmin, double & xmax) const { GetRange(0,xmin,xmax); }
00114
00115
00116
00117 void GetRange(double & xmin, double & xmax, double & ymin, double & ymax) const {
00118 GetRange(0,xmin,xmax); GetRange(1,ymin,ymax);
00119 }
00120
00121
00122
00123 void GetRange(double & xmin, double & xmax, double & ymin, double & ymax, double & zmin, double & zmax) const {
00124 GetRange(0,xmin,xmax); GetRange(1,ymin,ymax); GetRange(2,zmin,zmax);
00125 }
00126
00127
00128
00129 void GetRange(double * xmin, double * xmax) const {
00130 for (unsigned int i = 0; i < fRanges.size(); ++i)
00131 GetRange(i,xmin[i],xmax[i]);
00132 }
00133
00134
00135
00136
00137 ~DataRange () {}
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 void AddRange(unsigned int icoord , double xmin, double xmax );
00148
00149
00150
00151
00152 void AddRange(double xmin, double xmax ) { AddRange(0,xmin,xmax); }
00153
00154
00155
00156 void AddRange(double xmin, double xmax, double ymin, double ymax ) { AddRange(0,xmin,xmax); AddRange(1,ymin,ymax); }
00157
00158
00159
00160
00161 void AddRange(double xmin, double xmax, double ymin, double ymax, double zmin, double zmax ) {
00162 AddRange(0,xmin,xmax); AddRange(1,ymin,ymax); AddRange(2,zmin,zmax); }
00163
00164
00165
00166
00167
00168
00169 void SetRange(unsigned int icoord , double xmin, double xmax );
00170
00171
00172
00173
00174 void SetRange(double xmin, double xmax ) { SetRange(0,xmin,xmax); }
00175
00176
00177
00178 void SetRange(double xmin, double xmax, double ymin, double ymax ) { SetRange(0,xmin,xmax); SetRange(1,ymin,ymax); }
00179
00180
00181
00182
00183 void SetRange(double xmin, double xmax, double ymin, double ymax, double zmin, double zmax ) {
00184 SetRange(0,xmin,xmax); SetRange(1,ymin,ymax); SetRange(2,zmin,zmax); }
00185
00186
00187
00188
00189 void Clear (unsigned int icoord = 0 );
00190
00191
00192
00193
00194 bool IsInside(double x, unsigned int icoord = 0) const;
00195
00196 protected:
00197
00198
00199
00200
00201 void CleanRangeSet(unsigned int icoord, double xmin, double xmax);
00202
00203
00204 static void GetInfRange(double &x1, double &x2);
00205
00206 private:
00207
00208 RangeIntervals fRanges;
00209
00210
00211 };
00212
00213 }
00214
00215 }
00216
00217
00218 #endif