Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4MoleculeGun.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// Author: Mathieu Karamitros
27
28// The code is developed in the framework of the ESA AO7146
29//
30// We would be very happy hearing from you, send us your feedback! :)
31//
32// In order for Geant4-DNA to be maintained and still open-source,
33// article citations are crucial.
34// If you use Geant4-DNA chemistry and you publish papers about your software,
35// in addition to the general paper on Geant4-DNA:
36//
37// Int. J. Model. Simul. Sci. Comput. 1 (2010) 157–178
38//
39// we would be very happy if you could please also cite the following
40// reference papers on chemistry:
41//
42// J. Comput. Phys. 274 (2014) 841-882
43// Prog. Nucl. Sci. Tec. 2 (2011) 503-508
44
45#ifndef MOLECULEGUN_HH_
46#define MOLECULEGUN_HH_
47
48#include "G4ITGun.hh"
49#include "globals.hh"
50#include "G4ThreeVector.hh"
51#include "G4memory.hh"
52
53#include <vector>
54#include <map>
55
56class G4Track;
59class G4MoleculeGun;
60
62
63//------------------------------------------------------------------------------
64
65/*
66 * Define a specific species shoot
67 * Multiple shoots maybe be defined
68 * TODO: make the shoots fully time dependent with
69 * user access in the new framework
70 */
71
72class G4MoleculeShoot : public G4enable_shared_from_this<G4MoleculeShoot>
73{
74public:
75
77 virtual ~G4MoleculeShoot();
78 virtual void Shoot(G4MoleculeGun*) = 0;
79
80 template<typename TYPE> G4shared_ptr<G4MoleculeShoot> ChangeType();
81
87
88 static void RandomPosInBox(const G4ThreeVector& boxSize,
89 G4ThreeVector& output);
90};
91
92//------------------------------------------------------------------------------
93
94/*
95 * Define a shoot type =
96 * track (used by the Smoluchowski code)
97 * or continuous medium (used by the gillespie code)
98 */
99
100template<typename TYPE>
102{
103public:
105 ~TG4MoleculeShoot() override= default;
106 void Shoot(G4MoleculeGun*) override{}
107
108protected:
111};
112
113template<>
115
116template<>
118
119template<>
121
122template<typename TYPE>
124{
126 output->fMoleculeName = fMoleculeName;
127 output->fPosition = fPosition;
128 output->fTime = fTime;
129 output->fNumber = fNumber;
130 output->fBoxSize = fBoxSize;
131 return output;
132}
133
134
135//------------------------------------------------------------------------------
136
137class G4MoleculeGun : public G4ITGun
138{
139public:
141 ~G4MoleculeGun() override;
142
143 void DefineTracks() override;
144
145 /*
146 * Create a single molecule
147 * @param moleculeName name of the molecule such as recorded in molecule table
148 * @param position position where the molecule should pop up
149 * @param time time at which the molecule should pop up
150 */
151 void AddMolecule(const G4String& moleculeName,
152 const G4ThreeVector& position,
153 G4double time = 0);
154
155 /*
156 * Create N molecules at a single point
157 * @param n number of molecules to create
158 * @param moleculeName name of the molecules such as recorded in molecule table
159 * @param position position where the molecules should pop up
160 * @param time time at which the molecules should pop up
161 */
162 void AddNMolecules(std::size_t n,
163 const G4String& moleculeName,
164 const G4ThreeVector& position,
165 G4double time = 0);
166
167 /*
168 * Create N molecules in a box
169 * @param n number of molecules to create
170 * @param moleculeName name of the molecules such as recorded in molecule table
171 * @param boxCenter center of the box
172 * @param boxExtension size of the box
173 * @param time time at which the molecules should pop up
174 */
175 void AddMoleculesRandomPositionInBox(std::size_t n,
176 const G4String& moleculeName,
177 const G4ThreeVector& boxCenter,
178 const G4ThreeVector& boxExtension,
179 G4double time = 0);
180
181 /*
182 * Create N molecules as component of the continuous medium in a box
183 * @param n number of molecules to create
184 * @param moleculeName name of the molecules such as recorded in molecule table
185 * @param boxCenter center of the box
186 * @param boxExtension size of the box
187 * @param time time at which the molecules should pop up
188 */
189// void AddMoleculeInCMRepresentation(std::size_t n,
190// const G4String& moleculeName,
191// const G4ThreeVector& boxCenter,
192// const G4ThreeVector& boxExtension,
193// G4double time = 0);
194
195 void AddMoleculeInCMRepresentation(std::size_t n,
196 const G4String& moleculeName,
197 G4double time = 0);
198
199 const std::vector<G4shared_ptr<G4MoleculeShoot> >&
201 return fShoots;
202 }
203
204 using NameNumber = std::map<G4String, G4int>;
206
207
209
210protected:
211 void BuildAndPushTrack(const G4String& name,
212 const G4ThreeVector& position,
213 G4double time = 0);
215
216 std::vector<G4shared_ptr<G4MoleculeShoot> > fShoots;
217 friend class G4MoleculeShoot;
218 template<class T> friend class TG4MoleculeShoot;
219};
220
221#endif /* MOLECULEGUN_HH_ */
G4int G4ContinuousMedium
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
#define G4shared_ptr
Definition G4memory.hh:32
void AddMoleculeInCMRepresentation(std::size_t n, const G4String &moleculeName, G4double time=0)
std::map< G4String, G4int > NameNumber
void AddMoleculeShoot(G4shared_ptr< G4MoleculeShoot >)
G4MoleculeGunMessenger * fpMessenger
void DefineTracks() override
void AddMoleculesRandomPositionInBox(std::size_t n, const G4String &moleculeName, const G4ThreeVector &boxCenter, const G4ThreeVector &boxExtension, G4double time=0)
std::vector< G4shared_ptr< G4MoleculeShoot > > fShoots
const std::vector< G4shared_ptr< G4MoleculeShoot > > & GetMoleculeShoot()
void AddMolecule(const G4String &moleculeName, const G4ThreeVector &position, G4double time=0)
void BuildAndPushTrack(const G4String &name, const G4ThreeVector &position, G4double time=0)
void GetNameAndNumber(NameNumber &)
~G4MoleculeGun() override
void AddNMolecules(std::size_t n, const G4String &moleculeName, const G4ThreeVector &position, G4double time=0)
virtual void Shoot(G4MoleculeGun *)=0
G4ThreeVector * fBoxSize
G4shared_ptr< G4MoleculeShoot > ChangeType()
static void RandomPosInBox(const G4ThreeVector &boxSize, G4ThreeVector &output)
G4ThreeVector fPosition
virtual ~G4MoleculeShoot()
G4String fMoleculeName
~TG4MoleculeShoot() override=default
void ShootAtRandomPosition(G4MoleculeGun *)
void ShootAtFixedPosition(G4MoleculeGun *)
void Shoot(G4MoleculeGun *) override