source: trunk/source/global/management/src/G4PhysicsVector.cc @ 1058

Last change on this file since 1058 was 1058, checked in by garnier, 15 years ago

file release beta

File size: 8.0 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: G4PhysicsVector.cc,v 1.27 2008/10/16 12:14:36 gcosmo Exp $
28// GEANT4 tag $Name: geant4-09-02-ref-02 $
29//
30//
31// --------------------------------------------------------------
32//      GEANT 4 class implementation file
33//
34//  G4PhysicsVector.cc
35//
36//  History:
37//    02 Dec. 1995, G.Cosmo : Structure created based on object model
38//    03 Mar. 1996, K.Amako : Implemented the 1st version
39//    01 Jul. 1996, K.Amako : Hidden bin from the user introduced
40//    12 Nov. 1998, K.Amako : A bug in GetVectorLength() fixed
41//    11 Nov. 2000, H.Kurashige : use STL vector for dataVector and binVector
42//    18 Jan. 2001, H.Kurashige : removed ptrNextTable
43//    09 Mar. 2001, H.Kurashige : added G4PhysicsVector type
44//    05 Sep. 2008, V.Ivanchenko : added protections for zero-length vector
45// --------------------------------------------------------------
46
47#include "G4PhysicsVector.hh"
48#include <iomanip>
49
50// --------------------------------------------------------------
51
52G4PhysicsVector::G4PhysicsVector(G4bool spline)
53 : type(T_G4PhysicsVector),
54   edgeMin(0.), edgeMax(0.), numberOfBin(0),
55   lastEnergy(0.), lastValue(0.), lastBin(0), 
56   secDerivative(0), useSpline(spline)
57{}
58
59// --------------------------------------------------------------
60
61G4PhysicsVector::~G4PhysicsVector() 
62{
63  DeleteData();
64}
65
66// --------------------------------------------------------------
67
68G4PhysicsVector::G4PhysicsVector(const G4PhysicsVector& right)
69{
70  CopyData(right);
71}
72
73// --------------------------------------------------------------
74
75G4PhysicsVector& G4PhysicsVector::operator=(const G4PhysicsVector& right)
76{
77  if (&right==this)  { return *this; }
78  if (type != right.type)  { return *this; }
79
80  DeleteData();
81  CopyData(right);
82
83  return *this;
84}
85
86// --------------------------------------------------------------
87
88G4int G4PhysicsVector::operator==(const G4PhysicsVector &right) const
89{
90  return (this == &right);
91}
92
93// --------------------------------------------------------------
94
95G4int G4PhysicsVector::operator!=(const G4PhysicsVector &right) const
96{
97  return (this != &right);
98}
99
100// --------------------------------------------------------------
101
102void G4PhysicsVector::DeleteData()
103{
104  delete [] secDerivative;
105  secDerivative = 0;
106}
107
108// --------------------------------------------------------------
109
110void G4PhysicsVector::CopyData(const G4PhysicsVector& vec)
111{
112  type = vec.type;
113  edgeMin = vec.edgeMin;
114  edgeMax = vec.edgeMax;
115  numberOfBin = vec.numberOfBin;
116  lastEnergy = vec.lastEnergy;
117  lastValue = vec.lastValue;
118  lastBin = vec.lastBin;
119  dataVector = vec.dataVector;
120  binVector = vec.binVector;
121  useSpline = vec.useSpline;
122  comment = vec.comment;
123  if (vec.secDerivative)
124  {
125    secDerivative = new G4double [numberOfBin];
126    for (size_t i=0; i<numberOfBin; i++)
127    {
128       secDerivative[i] = vec.secDerivative[i];
129    }
130  }
131  else
132  {
133    secDerivative = 0;
134  }
135}
136
137// --------------------------------------------------------------
138
139G4double G4PhysicsVector::GetLowEdgeEnergy(size_t binNumber) const
140{
141  return binVector[binNumber];
142}
143
144// --------------------------------------------------------------
145
146G4bool G4PhysicsVector::Store(std::ofstream& fOut, G4bool ascii)
147{
148  // Ascii mode
149  if (ascii)
150  {
151    fOut << *this;
152    return true;
153  } 
154  // Binary Mode
155
156  // binning
157  fOut.write((char*)(&edgeMin), sizeof edgeMin);
158  fOut.write((char*)(&edgeMax), sizeof edgeMax);
159  fOut.write((char*)(&numberOfBin), sizeof numberOfBin);
160
161  // contents
162  size_t size = dataVector.size(); 
163  fOut.write((char*)(&size), sizeof size);
164
165  G4double* value = new G4double[2*size];
166  for(size_t i = 0; i < size; i++)
167  {
168    value[2*i]  =  binVector[i];
169    value[2*i+1]=  dataVector[i];
170  }
171  fOut.write((char*)(value), 2*size*(sizeof (G4double)));
172  delete [] value;
173
174  return true;
175}
176
177// --------------------------------------------------------------
178
179G4bool G4PhysicsVector::Retrieve(std::ifstream& fIn, G4bool ascii)
180{
181  // clear properties;
182  lastEnergy=0.;
183  lastValue =0.;
184  lastBin   =0;
185  dataVector.clear();
186  binVector.clear();
187  comment = "";
188
189  // retrieve in ascii mode
190  if (ascii)
191  {
192    // binning
193    fIn >> edgeMin >> edgeMax >> numberOfBin; 
194    if (fIn.fail())  { return false; }
195    // contents
196    size_t size=0;
197    fIn >> size;
198    if (fIn.fail())  { return false; }
199
200    binVector.reserve(size);
201    dataVector.reserve(size);
202    G4double vBin, vData;
203
204    for(size_t i = 0; i < size ; i++)
205    {
206      vBin = 0.;
207      vData= 0.;
208      fIn >> vBin >> vData;
209      if (fIn.fail())  { return false; }
210      binVector.push_back(vBin);
211      dataVector.push_back(vData);
212    }
213    return true ;
214  }
215
216  // retrieve in binary mode
217  // binning
218  fIn.read((char*)(&edgeMin), sizeof edgeMin);
219  fIn.read((char*)(&edgeMax), sizeof edgeMax);
220  fIn.read((char*)(&numberOfBin), sizeof numberOfBin ); 
221 
222  // contents
223  size_t size;
224  fIn.read((char*)(&size), sizeof size); 
225 
226  G4double* value = new G4double[2*size];
227  fIn.read((char*)(value),  2*size*(sizeof(G4double)) );
228  if (G4int(fIn.gcount()) != G4int(2*size*(sizeof(G4double))) )
229  {
230    delete [] value;
231    return false;
232  }
233
234  binVector.reserve(size);
235  dataVector.reserve(size);
236  for(size_t i = 0; i < size; i++)
237  {
238    binVector.push_back(value[2*i]);
239    dataVector.push_back(value[2*i+1]);
240  }
241  delete [] value;
242  return true;
243}
244
245// --------------------------------------------------------------
246
247void G4PhysicsVector::FillSecondDerivatives()
248{ 
249  secDerivative = new G4double [numberOfBin];
250
251  size_t n = numberOfBin-1;
252
253  // cannot compute derivatives for less than 3 points
254  if(3 > numberOfBin)
255  {
256    secDerivative[0] = 0.0;
257    secDerivative[n] = 0.0;
258    return;
259  }
260
261  for(size_t i=1; i<n; i++)
262  {
263    secDerivative[i] = 
264      3.0*((dataVector[i+1]-dataVector[i])/(binVector[i+1]-binVector[i]) -
265           (dataVector[i]-dataVector[i-1])/(binVector[i]-binVector[i-1]))
266      /(binVector[i+1]-binVector[i-1]);
267  }
268  secDerivative[n] = secDerivative[n-1];
269  secDerivative[0] = secDerivative[1];
270}
271   
272// --------------------------------------------------------------
273
274std::ostream& operator<<(std::ostream& out, const G4PhysicsVector& pv)
275{
276  // binning
277  out << std::setprecision(12) << pv.edgeMin;
278  out <<" " << pv.edgeMax <<" "  << pv.numberOfBin << G4endl; 
279
280  // contents
281  out << pv.dataVector.size() << G4endl; 
282  for(size_t i = 0; i < pv.dataVector.size(); i++)
283  {
284    out << std::setprecision(12) << pv.binVector[i] << "  "
285        << pv.dataVector[i] << G4endl;
286  }
287  return out;
288}
Note: See TracBrowser for help on using the repository browser.