1 | // |
---|
2 | // $Id: Interpolate.cc 2804 2008-10-09 12:10:06Z biktem $ |
---|
3 | // |
---|
4 | #include <vector> |
---|
5 | #include <functional> |
---|
6 | #include <algorithm> |
---|
7 | #include "Interpolate.hh" |
---|
8 | |
---|
9 | ClassImp(Interpolate) |
---|
10 | |
---|
11 | Bool_t row_less( vector<Double_t> x, vector<Double_t> y) { |
---|
12 | return (x[0] < y[0]); |
---|
13 | } |
---|
14 | |
---|
15 | //______________________________________________________________________________ |
---|
16 | Interpolate::Interpolate(const string &fn, size_t nval): fFilename(fn) { |
---|
17 | // |
---|
18 | // Contructor |
---|
19 | // |
---|
20 | |
---|
21 | NumbersFileParser parser(fFilename, nval+1); |
---|
22 | |
---|
23 | size_t nRows=parser.GetCol(0).size(); |
---|
24 | |
---|
25 | for(size_t i=0; i<nRows; i++) { |
---|
26 | vector<Double_t> row = parser.GetRow(i); |
---|
27 | |
---|
28 | fValues.push_back(row); |
---|
29 | } |
---|
30 | |
---|
31 | sort(fValues.begin(), fValues.end(), row_less); |
---|
32 | |
---|
33 | fXmin = fValues[0][0]; |
---|
34 | fXmax = fValues[nRows-1][0]; |
---|
35 | |
---|
36 | for (size_t i(0); i<nval+1; i++) |
---|
37 | fUnits.push_back(1.); |
---|
38 | |
---|
39 | |
---|
40 | } |
---|
41 | |
---|
42 | //______________________________________________________________________________ |
---|
43 | Interpolate::~Interpolate() { |
---|
44 | // |
---|
45 | // Destructor |
---|
46 | // |
---|
47 | |
---|
48 | } |
---|
49 | |
---|
50 | //______________________________________________________________________________ |
---|
51 | Double_t Interpolate::GetValue(Double_t x, size_t col) { |
---|
52 | // |
---|
53 | // Return interpolation in x |
---|
54 | // |
---|
55 | // if x is out of range return last value |
---|
56 | if(x > fXmax) { |
---|
57 | MsgForm(EsafMsg::Warning,"Parameter out of range [%.3f,%.f] (file=%s , x = %f)", |
---|
58 | fXmin, fXmax, fFilename.c_str(), x); |
---|
59 | return fValues[fValues.size()-1][col+1]; |
---|
60 | } else if(x < fXmin) { |
---|
61 | MsgForm(EsafMsg::Warning,"Parameter out of range [%.3f,%.3f] (file=%s , x = %f)", |
---|
62 | fXmin, fXmax, fFilename.c_str(), x); |
---|
63 | return fValues[0][col+1]; |
---|
64 | } |
---|
65 | |
---|
66 | // x in range |
---|
67 | size_t i; |
---|
68 | for(i=1; i<fValues.size(); i++) |
---|
69 | if(fValues[i][0]>=x) break; |
---|
70 | i--; |
---|
71 | Double_t x1=fValues[i][0]; |
---|
72 | Double_t y1=fValues[i][col+1]; |
---|
73 | Double_t x2=fValues[i+1][0]; |
---|
74 | Double_t y2=fValues[i+1][col+1]; |
---|
75 | |
---|
76 | // linear interpolation |
---|
77 | Double_t value= (y2-y1)/(x2-x1)*(x-x1)+y1; |
---|
78 | return value; |
---|
79 | } |
---|
80 | |
---|
81 | //______________________________________________________________________________ |
---|
82 | void Interpolate::SetXUnit(Double_t unit) { |
---|
83 | // |
---|
84 | // Set the unit of measure for x variable |
---|
85 | // |
---|
86 | |
---|
87 | Double_t ratio = unit/fUnits[0]; |
---|
88 | |
---|
89 | for (size_t r(0); r < fValues.size(); r++) |
---|
90 | fValues[r][0] = fValues[r][0]*ratio; |
---|
91 | |
---|
92 | fUnits[0] = unit; |
---|
93 | |
---|
94 | fXmin = fValues[0][0]; |
---|
95 | fXmax = fValues[fValues.size()-1][0]; |
---|
96 | } |
---|
97 | |
---|
98 | //______________________________________________________________________________ |
---|
99 | void Interpolate::SetUnit(Double_t unit, size_t nval) { |
---|
100 | // |
---|
101 | // Set the unit of measure for n-th variable |
---|
102 | // |
---|
103 | |
---|
104 | if ( nval >= fValues[0].size() ) |
---|
105 | Msg(EsafMsg::Panic) << "SetUnit: variable number out of range "<< MsgDispatch; |
---|
106 | |
---|
107 | // data index goes from 1 to fValues[0].size() |
---|
108 | nval++; |
---|
109 | |
---|
110 | Double_t ratio = unit/fUnits[nval]; |
---|
111 | |
---|
112 | for (size_t r(0); r < fValues.size(); r++) |
---|
113 | fValues[r][nval] = fValues[r][nval]*ratio; |
---|
114 | |
---|
115 | fUnits[nval] = unit; |
---|
116 | } |
---|
117 | |
---|