Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4GeneralParticleSourceData.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// G4GeneralParticleSourceData class implementation
27//
28// Author: Andrew Green, 20.03.2014
29// --------------------------------------------------------------------
30
32#include "G4Threading.hh"
33#include "G4AutoLock.hh"
34
35namespace
36{
37 G4Mutex singMutex = G4MUTEX_INITIALIZER; // Protects singleton access
38}
39
40G4GeneralParticleSourceData::G4GeneralParticleSourceData()
41{
43
44 sourceVector.clear();
45 sourceIntensity.clear();
46 sourceProbability.clear();
47
48 currentSource = new G4SingleParticleSource();
49 sourceVector.push_back(currentSource);
50 sourceIntensity.push_back(1.);
51}
52
53G4GeneralParticleSourceData::~G4GeneralParticleSourceData()
54{
56 for (const auto it : sourceVector)
57 {
58 delete it;
59 }
60 sourceVector.clear();
61}
62
64{
65 G4AutoLock lock(&singMutex);
66 static G4GeneralParticleSourceData instance;
67 return &instance;
68}
69
71{
72 G4double total = 0.;
73 std::size_t i = 0 ;
74 for (i = 0; i < sourceIntensity.size(); ++i)
75 {
76 total += sourceIntensity[i] ;
77 }
78 sourceProbability.clear();
79 std::vector <G4double> sourceNormalizedIntensity;
80 sourceNormalizedIntensity.clear();
81
82 sourceNormalizedIntensity.push_back(sourceIntensity[0]/total);
83 sourceProbability.push_back(sourceNormalizedIntensity[0]);
84
85 for (i = 1 ; i < sourceIntensity.size(); ++i)
86 {
87 sourceNormalizedIntensity.push_back(sourceIntensity[i]/total);
88 sourceProbability.push_back(sourceNormalizedIntensity[i]+sourceProbability[i-1]);
89 }
90
91 // set source weights here based on sampling scheme (analog/flat)
92 // and intensities
93 //
94 for (i = 0 ; i < sourceIntensity.size(); ++i)
95 {
96 if (!flat_sampling)
97 {
99 }
100 else
101 {
103 ->SetIntensityWeight(sourceNormalizedIntensity[i]*sourceIntensity.size());
104 }
105 }
106 normalised = true;
107}
108
110{
111 sourceIntensity.at(currentSourceIdx) = intensity;
112 normalised = false;
113}
114
116{
117 currentSource = new G4SingleParticleSource();
118 sourceVector.push_back(currentSource);
119 sourceIntensity.push_back(intensity);
120 currentSourceIdx = G4int(sourceVector.size() - 1);
121 normalised = false;
122}
123
125{
126 delete sourceVector[idx];
127 sourceVector.erase(sourceVector.begin() + idx);
128 sourceIntensity.erase(sourceIntensity.begin()+idx);
129 normalised = false ;
130 if (currentSourceIdx == idx )
131 {
132 if ( GetIntensityVectorSize() > 0 )
133 {
134 currentSource = GetCurrentSource(0);
135 currentSourceIdx = 0;
136 }
137 else
138 {
139 currentSource = nullptr;
140 currentSourceIdx = -1;
141 }
142 }
143}
144
146{
147 currentSourceIdx = -1;
148 currentSource = nullptr;
149 for (const auto it : sourceVector)
150 {
151 delete it;
152 }
153 sourceVector.clear();
154 sourceIntensity.clear();
155 normalised = false;
156}
157
159{
160 for (const auto it : sourceVector)
161 {
162 it->SetVerbosity(vl);
163 }
164}
165
167{
168 currentSource = sourceVector[idx];
169 currentSourceIdx = idx;
170 return sourceVector[idx];
171}
172
177
#define G4MUTEXDESTROY(mutex)
#define G4MUTEX_INITIALIZER
#define G4MUTEXLOCK(mutex)
#define G4MUTEXUNLOCK(mutex)
std::mutex G4Mutex
#define G4MUTEXINIT(mutex)
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
G4SingleParticleSource * GetCurrentSource() const
static G4GeneralParticleSourceData * Instance()
void SetIntensityWeight(G4double weight)
G4SPSRandomGenerator * GetBiasRndm() const