Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4Physics2DVector.hh
Go to the documentation of this file.
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// G4Physics2DVector
27//
28// Class description:
29//
30// A 2-dimentional vector with linear interpolation.
31
32// Author: Vladimir Ivanchenko, 25.09.2011
33// --------------------------------------------------------------------
34#ifndef G4Physics2DVector_hh
35#define G4Physics2DVector_hh 1
36
37#include <fstream>
38#include <iostream>
39#include <vector>
40
42#include "G4ios.hh"
43#include "globals.hh"
44
45using G4PV2DDataVector = std::vector<G4double>;
46
48{
49 public:
51 // Vector will be filled via Retrieve method
52
53 explicit G4Physics2DVector(std::size_t nx, std::size_t ny);
54 // Vector will be filled via Put methods
55
58 // Copy constructor and assignment operator
59
60 G4bool operator==(const G4Physics2DVector& right) const = delete;
61 G4bool operator!=(const G4Physics2DVector& right) const = delete;
62
64 // Destructor
65
66 G4double Value(G4double x, G4double y, std::size_t& lastidx,
67 std::size_t& lastidy) const;
69 // Main method to interpolate 2D vector
70 // Consumer class should provide initial values of lastidx and lastidy
71
72 inline void PutX(std::size_t idx, G4double value);
73 inline void PutY(std::size_t idy, G4double value);
74 inline void PutValue(std::size_t idx, std::size_t idy, G4double value);
75 void PutVectors(const std::vector<G4double>& vecX,
76 const std::vector<G4double>& vecY);
77 // Methods to fill vector
78 // Take note that the 'index' starts from '0'
79
80 void ScaleVector(G4double factor);
81 // Scale all values of the vector by factor.
82 // This method may be applied for example after Retrieve a vector
83 // from an external file to convert values into Geant4 units
84
85 G4double FindLinearX(G4double rand, G4double y, std::size_t& lastidy) const;
86 inline G4double FindLinearX(G4double rand, G4double y) const;
87 // Find Y using linear interpolation for Y-vector filled by cumulative
88 // probability function value of rand should be between 0 and 1
89
90 inline G4double GetX(std::size_t index) const;
91 inline G4double GetY(std::size_t index) const;
92 inline G4double GetValue(std::size_t idx, std::size_t idy) const;
93 // Returns simply the values of the vector by index
94 // of the energy vector. The boundary check will not be done
95
96 inline std::size_t FindBinLocationX(const G4double x,
97 const std::size_t lastidx) const;
98 inline std::size_t FindBinLocationY(const G4double y,
99 const std::size_t lastidy) const;
100 // Find the bin# in which theEnergy belongs. Starting from 0
101
102 inline std::size_t GetLengthX() const;
103 inline std::size_t GetLengthY() const;
104 // Get the lengths of the vector
105
107 // Get physics vector type
108
110 // Activate/deactivate bicubic interpolation
111
112 void Store(std::ofstream& fOut) const;
113 G4bool Retrieve(std::ifstream& fIn);
114 // To store/retrieve persistent data to/from file streams
115
116 inline void SetVerboseLevel(G4int value);
117
118 protected:
119 void PrepareVectors();
120
121 void ClearVectors();
122
123 void CopyData(const G4Physics2DVector& vec);
124
126 const std::size_t idx,
127 const std::size_t idy) const;
128 // Bicubic interpolation of 2D vector
129
130 inline std::size_t FindBin(const G4double z, const G4PV2DDataVector&,
131 const std::size_t idz,
132 const std::size_t idzmax) const;
133
134 private:
135 G4double InterpolateLinearX(G4PV2DDataVector& v, G4double rand) const;
136
137 inline G4double DerivativeX(std::size_t idx, std::size_t idy,
138 G4double fac) const;
139 inline G4double DerivativeY(std::size_t idx, std::size_t idy,
140 G4double fac) const;
141 inline G4double DerivativeXY(std::size_t idx, std::size_t idy,
142 G4double fac) const;
143 // computation of derivatives
144
146 // The type of PhysicsVector (enumerator)
147
148 std::size_t numberOfXNodes = 0;
149 std::size_t numberOfYNodes = 0;
150
151 G4PV2DDataVector xVector;
152 G4PV2DDataVector yVector;
153 std::vector<G4PV2DDataVector*> value;
154
155 G4int verboseLevel = 0;
156 G4bool useBicubic = false;
157};
158
159#include "G4Physics2DVector.icc"
160
161#endif
std::vector< G4double > G4PV2DDataVector
G4PhysicsVectorType
@ T_G4PhysicsFreeVector
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4bool Retrieve(std::ifstream &fIn)
G4Physics2DVector & operator=(const G4Physics2DVector &)
void PutY(std::size_t idy, G4double value)
std::size_t FindBinLocationX(const G4double x, const std::size_t lastidx) const
void Store(std::ofstream &fOut) const
std::size_t FindBinLocationY(const G4double y, const std::size_t lastidy) const
void CopyData(const G4Physics2DVector &vec)
void PutVectors(const std::vector< G4double > &vecX, const std::vector< G4double > &vecY)
G4double BicubicInterpolation(const G4double x, const G4double y, const std::size_t idx, const std::size_t idy) const
void SetVerboseLevel(G4int value)
std::size_t GetLengthX() const
std::size_t FindBin(const G4double z, const G4PV2DDataVector &, const std::size_t idz, const std::size_t idzmax) const
G4PhysicsVectorType GetType() const
G4double Value(G4double x, G4double y, std::size_t &lastidx, std::size_t &lastidy) const
std::size_t GetLengthY() const
G4double FindLinearX(G4double rand, G4double y) const
void ScaleVector(G4double factor)
void SetBicubicInterpolation(G4bool)
void PutValue(std::size_t idx, std::size_t idy, G4double value)
G4bool operator!=(const G4Physics2DVector &right) const =delete
G4double Value(G4double x, G4double y) const
G4bool operator==(const G4Physics2DVector &right) const =delete
void PutX(std::size_t idx, G4double value)
G4double GetValue(std::size_t idx, std::size_t idy) const
G4double GetX(std::size_t index) const
G4double GetY(std::size_t index) const
G4double FindLinearX(G4double rand, G4double y, std::size_t &lastidy) const