source: JEM-EUSO/esaf_cc_at_lal/packages/simulation/tools/src/Interpolate.cc @ 114

Last change on this file since 114 was 114, checked in by moretto, 11 years ago

actual version of ESAF at CCin2p3

File size: 3.0 KB
Line 
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
9ClassImp(Interpolate)
10
11Bool_t row_less( vector<Double_t> x, vector<Double_t> y) {
12        return (x[0] < y[0]);
13}
14
15//______________________________________________________________________________
16Interpolate::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//______________________________________________________________________________
43Interpolate::~Interpolate() {
44    //
45    // Destructor
46    //
47
48}
49
50//______________________________________________________________________________
51Double_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//______________________________________________________________________________
82void 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//______________________________________________________________________________
99void 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
Note: See TracBrowser for help on using the repository browser.