source: trunk/source/processes/electromagnetic/lowenergy/src/G4EMDataSet.cc @ 924

Last change on this file since 924 was 819, checked in by garnier, 16 years ago

import all except CVS

File size: 7.8 KB
Line 
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// $Id: G4EMDataSet.cc,v 1.12 2006/06/29 19:39:44 gunter Exp $
28// GEANT4 tag $Name: geant4-09-01-patch-02 $
29//
30// Author: Maria Grazia Pia (Maria.Grazia.Pia@cern.ch)
31//
32// History:
33// -----------
34// 31 Jul 2001   MGP        Created
35//
36// -------------------------------------------------------------------
37
38#include "G4EMDataSet.hh"
39#include "G4VDataSetAlgorithm.hh"
40#include <fstream>
41#include <sstream>
42
43                                                 G4EMDataSet :: G4EMDataSet(G4int argZ, G4VDataSetAlgorithm * argAlgorithm, G4double argUnitEnergies, G4double argUnitData)
44:
45 z(argZ),
46 energies(0),
47 data(0),
48 algorithm(argAlgorithm),
49 unitEnergies(argUnitEnergies),
50 unitData(argUnitData)
51{
52 if (algorithm == 0) 
53  G4Exception("G4EMDataSet::G4EMDataSet - interpolation == 0");
54}
55
56
57
58                                                 G4EMDataSet :: G4EMDataSet(G4int argZ, G4DataVector * argEnergies, G4DataVector * argData, G4VDataSetAlgorithm * argAlgorithm, G4double argUnitEnergies, G4double argUnitData)
59:
60 z(argZ),
61 energies(argEnergies),
62 data(argData),
63 algorithm(argAlgorithm),
64 unitEnergies(argUnitEnergies),
65 unitData(argUnitData)
66{
67 if (algorithm==0) 
68  G4Exception("G4EMDataSet::G4EMDataSet - interpolation == 0");
69
70 if ((energies==0) ^ (data==0))
71  G4Exception("G4EMDataSet::G4EMDataSet - different size for energies and data (zero case)");
72
73 if (energies==0)
74  return;
75 
76 if (energies->size()!=data->size())
77  G4Exception("G4EMDataSet::G4EMDataSet - different size for energies and data");
78}
79
80
81
82                                                 G4EMDataSet :: ~G4EMDataSet()
83{ 
84 delete algorithm;
85 
86 if (energies)
87  delete energies;
88
89 if (data)
90  delete data;
91}
92
93
94
95
96
97G4double                                        G4EMDataSet :: FindValue(G4double argEnergy, G4int /* argComponentId */) const
98{
99 if (!energies)
100  G4Exception("G4EMDataSet::FindValue - energies == 0");
101 
102 if (energies->empty())
103  return 0;
104
105 if (argEnergy <= (*energies)[0])
106  return (*data)[0];
107
108 size_t i(energies->size()-1);
109
110 if (argEnergy >= (*energies)[i])
111  return (*data)[i];
112
113 return algorithm->Calculate(argEnergy, FindLowerBound(argEnergy), *energies, *data);
114}
115
116
117
118
119
120void                                            G4EMDataSet :: PrintData(void) const
121{
122 if (!energies)
123 {
124  G4cout << "Data not available." << G4endl;
125  return;
126 }
127 
128 size_t size = energies->size();
129 
130 for (size_t i(0); i<size; i++)
131  G4cout << "Point: " << ((*energies)[i]/unitEnergies)
132         << " - Data value : " << ((*data)[i]/unitData) << G4endl; 
133}
134
135
136
137
138
139void                                            G4EMDataSet :: SetEnergiesData(G4DataVector * argEnergies, G4DataVector * argData, G4int /* argComponentId */)
140{
141 if (energies)
142  delete energies;
143 energies=argEnergies;
144
145 if (data)
146  delete data;
147 data=argData;
148 
149 if ((energies==0) ^ (data==0))
150  G4Exception("G4EMDataSet::SetEnergiesData - different size for energies and data (zero case)");
151
152 if (energies==0)
153  return;
154 
155 if (energies->size()!=data->size())
156  G4Exception("G4EMDataSet::SetEnergiesData - different size for energies and data");
157}
158
159
160
161
162
163G4bool                                          G4EMDataSet :: LoadData(const G4String & argFileName)
164{
165 // The file is organized into two columns:
166 // 1st column is the energy
167 // 2nd column is the corresponding value
168 // The file terminates with the pattern: -1   -1
169 //                                       -2   -2
170 
171 G4String fullFileName(FullFileName(argFileName));
172 std::ifstream in(fullFileName);
173
174 if (!in.is_open())
175 {
176  G4String message("G4EMDataSet::LoadData - data file \"");
177  message+=fullFileName;
178  message+="\" not found";
179  G4Exception(message);
180 }
181
182 G4DataVector * argEnergies=new G4DataVector;
183 G4DataVector * argData=new G4DataVector;
184
185 G4double a;
186 bool energyColumn(true);
187
188 do
189 {
190  in >> a;
191 
192  if (a!=-1 && a!=-2)
193  {
194   if (energyColumn)
195    argEnergies->push_back(a*unitEnergies);
196   else
197    argData->push_back(a*unitData);
198   energyColumn=(!energyColumn);
199  }
200 }
201 while (a != -2);
202 
203 SetEnergiesData(argEnergies, argData, 0);
204 
205 return true;
206}
207
208
209
210G4bool                                          G4EMDataSet :: SaveData(const G4String & argFileName) const
211{
212 // The file is organized into two columns:
213 // 1st column is the energy
214 // 2nd column is the corresponding value
215 // The file terminates with the pattern: -1   -1
216 //                                       -2   -2
217 
218 G4String fullFileName(FullFileName(argFileName));
219 std::ofstream out(fullFileName);
220
221 if (!out.is_open())
222 {
223  G4String message("G4EMDataSet::SaveData - cannot open \"");
224  message+=fullFileName;
225  message+="\"";
226  G4Exception(message);
227 }
228 
229 out.precision(10);
230 out.width(15);
231 out.setf(std::ofstream::left);
232 
233 if (energies!=0 && data!=0)
234 {
235  G4DataVector::const_iterator i(energies->begin());
236  G4DataVector::const_iterator endI(energies->end());
237  G4DataVector::const_iterator j(data->begin());
238 
239  while (i!=endI)
240  {
241   out.precision(10);
242   out.width(15);
243   out.setf(std::ofstream::left);
244   out << ((*i)/unitEnergies) << ' ';
245
246   out.precision(10);
247   out.width(15);
248   out.setf(std::ofstream::left);
249   out << ((*j)/unitData) << std::endl;
250
251   i++;
252   j++;
253  }
254 }
255 
256 out.precision(10);
257 out.width(15);
258 out.setf(std::ofstream::left);
259 out << -1.f << ' ';
260
261 out.precision(10);
262 out.width(15);
263 out.setf(std::ofstream::left);
264 out << -1.f << std::endl;
265
266 out.precision(10);
267 out.width(15);
268 out.setf(std::ofstream::left);
269 out << -2.f << ' ';
270
271 out.precision(10);
272 out.width(15);
273 out.setf(std::ofstream::left);
274 out << -2.f << std::endl;
275
276 return true;
277}
278
279
280
281
282
283size_t                                          G4EMDataSet :: FindLowerBound(G4double argEnergy) const
284{
285 size_t lowerBound(0);
286 size_t upperBound(energies->size() - 1);
287 
288 while (lowerBound <= upperBound) 
289 {
290  size_t midBin((lowerBound + upperBound)/2);
291
292  if (argEnergy < (*energies)[midBin])
293   upperBound = midBin-1;
294  else
295   lowerBound = midBin+1;
296 }
297 
298 return upperBound;
299}
300
301
302
303
304
305G4String                                        G4EMDataSet :: FullFileName(const G4String & argFileName) const
306{
307 char* path = getenv("G4LEDATA");
308 if (!path)
309  G4Exception("G4EMDataSet::FullFileName - G4LEDATA environment variable not set");
310 
311 std::ostringstream fullFileName;
312 
313 fullFileName << path << '/' << argFileName << z << ".dat";
314                     
315 return G4String(fullFileName.str().c_str());
316}
Note: See TracBrowser for help on using the repository browser.