ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4LinLogLogInterpolation.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4LinLogLogInterpolation.cc
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 //
27 // Author: Vladimir Ivanchenko (Vladimir.Ivantchenko@cern.ch)
28 //
29 // History:
30 // -----------
31 // 29 May 2002 VI Created
32 //
33 // -------------------------------------------------------------------
34 
36 
37 // Constructor
38 
40 { }
41 
42 // Destructor
43 
45 { }
46 
48 { return new G4LinLogLogInterpolation; }
49 
50 
52  const G4DataVector& points,
53  const G4DataVector& data) const
54 {
55  //G4cout << "G4LinLogLogInterpolation is performed (2 arguments) " << G4endl;
56  G4int nBins = data.size() - 1;
57  G4double value = 0.;
58  if (x < points[0])
59  {
60  value = 0.;
61  }
62  else if (bin < nBins)
63  {
64  G4double e1 = points[bin];
65  G4double e2 = points[bin+1];
66  G4double d1 = data[bin];
67  G4double d2 = data[bin+1];
68  if(d1 > 0.0 && d2 > 0.0) {
69  value = (std::log10(d1)*std::log10(e2/x) + std::log10(d2)*std::log10(x/e1)) / std::log10(e2/e1);
70  value = std::pow(10.,value);
71  } else {
72  value = (d1*std::log10(e2/x) + d2*std::log10(x/e1)) / std::log10(e2/e1);
73  }
74  }
75  else
76  {
77  value = data[nBins];
78  }
79 
80  return value;
81 }
82 
84  const G4DataVector& points,
85  const G4DataVector& data,
86  const G4DataVector& log_points,
87  const G4DataVector& log_data) const
88 {
89  //G4cout << "G4LinLogLogInterpolation is performed(4 arguments) " << G4endl;
90  G4int nBins = data.size() - 1;
91  G4double value = 0.;
92  G4double log_x = std::log10(x);
93  if (x < points[0])
94  {
95  value = 0.;
96  }
97  else if (bin < nBins)
98  {
99  G4double e1 = points[bin];
100  G4double e2 = points[bin+1];
101  G4double d1 = data[bin];
102  G4double d2 = data[bin+1];
103  G4double log_e1 = log_points[bin];
104  G4double log_e2 = log_points[bin+1];
105  G4double log_d1 = log_data[bin];
106  G4double log_d2 = log_data[bin+1];
107  //G4cout << "x = " << x << " , log_x = " << log_x << " , bin = " << bin << G4endl;
108  //G4cout << "e1 = " << e1 << " , d1 = " << d1 << G4endl;
109  //G4cout << "e2 = " << e2 << " , d2 = " << d2 << G4endl;
110  //G4cout << "log_e1 = " << log_e1 << " , log_d1 = " << log_d1 << G4endl;
111  //G4cout << "log_e2 = " << log_e2 << " , log_d2 = " << log_d2 <<G4endl;
112  if (d1 > 0.0 && d2 > 0.0)
113  {
114  // Values e1, e2, d1 and d2 are the log values of the corresponding
115  // original energy and data values. Simple linear interpolation performed
116  // on loagarithmic data should be equivalent to log-log interpolation
117  value = log_d1 + (log_d2 - log_d1)*(log_x - log_e1)/(log_e2 - log_e1);
118 
119  //G4cout << "Case of normal log-log interpolation" << G4endl;
120  //G4cout << "Temp log interpolated value: log_value = " << value << G4endl;
121 
122  // Delogarithmize to obtain interpolated value
123  value = std::pow(10.,value);
124 
125  //G4cout << "Final Interpolated value: " << value << G4endl << G4endl;
126  }
127  else
128  {
129  // Case of semi log-log interpolation
130  //G4cout << "G4LinLogLogInterpolation - Case of SemiLogInterpolation" << G4endl;
131  if (e1 == 0.0) e1 = 1e-300;
132  if (e2 == 0.0) e2 = 1e-300;
133  value = d1 + (d2 - d1)*(log_x - log_e1)/(log_e2 - log_e1);
134  //G4cout << "LinLogInterpolation: Final Interpolated value: " << value << G4endl << G4endl;
135  }
136  }
137  else
138  {
139  value = data[nBins];
140  }
141  return value;
142 }