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
G4PenelopeSamplingData.cc
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//
27// Author: Luciano Pandola
28//
29// History:
30// --------
31// 09 Dec 2009 L Pandola First implementation
32//
34
35//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...
37 fNP(nPoints)
38{
39 //create vectors
40 fX = new G4DataVector();
41 fPAC = new G4DataVector();
42 fA = new G4DataVector();
43 fB = new G4DataVector();
44 fITTL = new std::vector<size_t>;
45 fITTU = new std::vector<size_t>;
46}
47
48//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...
50{
51 if (fX) delete fX;
52 if (fPAC) delete fPAC;
53 if (fA) delete fA;
54 if (fB) delete fB;
55 if (fITTL) delete fITTL;
56 if (fITTU) delete fITTU;
57}
58
59//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.......oooOO0OOooo...
60
62{
63 size_t points = fX->size();
64
65 //check everything is all right
66 if (fPAC->size() != points || fA->size() != points ||
67 fB->size() != points || fITTL->size() != points ||
68 fITTU->size() != points)
69 {
71 ed << "Data vectors look to have different dimensions !" << G4endl;
72 G4Exception("G4PenelopeSamplingData::GetNumberOfStoredPoints()","em2040",
73 FatalException,ed);
74 }
75 return points;
76}
77
78//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...
80{
81 if (fX) delete fX;
82 if (fPAC) delete fPAC;
83 if (fA) delete fA;
84 if (fB) delete fB;
85 if (fITTL) delete fITTL;
86 if (fITTU) delete fITTU;
87 //create vectors
88 fX = new G4DataVector();
89 fPAC = new G4DataVector();
90 fA = new G4DataVector();
91 fB = new G4DataVector();
92 fITTL = new std::vector<size_t>;
93 fITTU = new std::vector<size_t>;
94}
95
96//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...
98 size_t ITTL0,size_t ITTU0)
99{
100 fX->push_back(x0);
101 fPAC->push_back(pac0);
102 fA->push_back(a0);
103 fB->push_back(b0);
104 fITTL->push_back(ITTL0);
105 fITTU->push_back(ITTU0);
106
107 //check how many points we do have now
108 size_t nOfPoints = GetNumberOfStoredPoints();
109
110 if (nOfPoints > ((size_t)fNP))
111 {
112 G4cout << "G4PenelopeSamplingData::AddPoint() " << G4endl;
113 G4cout << "WARNING: Up to now there are " << nOfPoints << " points in the table" << G4endl;
114 G4cout << "while the anticipated (declared) number is " << fNP << G4endl;
115 }
116 return;
117}
118
119//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..
121{
122
123 G4cout << "*************************************************************************" << G4endl;
124 G4cout << GetNumberOfStoredPoints() << " points" << G4endl;
125 G4cout << "*************************************************************************" << G4endl;
126 for (size_t i=0;i<GetNumberOfStoredPoints();i++)
127 {
128 G4cout << i << " " << (*fX)[i] << " " << (*fPAC)[i] << " " << (*fA)[i] << " " <<
129 (*fB)[i] << " " << (*fITTL)[i] << " " << (*fITTU)[i] << G4endl;
130 }
131 G4cout << "*************************************************************************" << G4endl;
132}
133
134//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..
136{
137 if (index < fX->size())
138 return (*fX)[index];
139 else
140 return 0;
141}
142
143//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..
145{
146 if (index < fPAC->size())
147 return (*fPAC)[index];
148 else
149 return 0;
150}
151
152//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..
154{
155 if (index < fA->size())
156 return (*fA)[index];
157 else
158 return 0;
159}
160
161//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..
163{
164 if (index < fB->size())
165 return (*fB)[index];
166 else
167 return 0;
168}
169
170//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..
172{
173 //One passes here a random number in (0,1).
174 //Notice: it possible that is between (0,b) with b<1
175 size_t points = GetNumberOfStoredPoints();
176
177 size_t itn = (size_t) (maxRand*(points-1));
178 size_t i = (*fITTL)[itn];
179 size_t j = (*fITTU)[itn];
180
181 while ((j-i) > 1)
182 {
183 size_t k = (i+j)/2;
184 if (maxRand > (*fPAC)[k])
185 i = k;
186 else
187 j = k;
188 }
189
190 //Sampling from the rational inverse cumulative distribution
191 G4double result = 0;
192
193 G4double rr = maxRand - (*fPAC)[i];
194 if (rr > 1e-16)
195 {
196 G4double d = (*fPAC)[i+1]-(*fPAC)[i];
197 result = (*fX)[i]+
198 ((1.0+(*fA)[i]+(*fB)[i])*d*rr/
199 (d*d+((*fA)[i]*d+(*fB)[i]*rr)*rr))*((*fX)[i+1]-(*fX)[i]);
200 }
201 else
202 result = (*fX)[i];
203
204 return result;
205}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
const G4double a0
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
G4double GetA(size_t index)
G4double GetPAC(size_t index)
void AddPoint(G4double x0, G4double pac0, G4double a0, G4double b0, size_t ITTL0, size_t ITTU0)
G4double GetX(size_t index)
G4PenelopeSamplingData(G4int npoints=150)
G4double SampleValue(G4double rndm)
G4double GetB(size_t index)