ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4MoleculeGun.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4MoleculeGun.hh
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 <vector>
52 #include <map>
53 #include <G4memory.hh>
54 
55 class G4Track;
59 typedef int G4ContinuousMedium;
60 
61 //------------------------------------------------------------------------------
62 
63 /*
64  * Define a specific species shoot
65  * Multiple shoots maybe be defined
66  * TODO: make the shoots fully time dependent with
67  * user access in the new framework
68  */
69 
70 class G4MoleculeShoot : public G4enable_shared_from_this<G4MoleculeShoot>
71 {
72 public:
73 
75  virtual ~G4MoleculeShoot();
76  virtual void Shoot(G4MoleculeGun*) = 0;
77 
78  template<typename TYPE> G4shared_ptr<G4MoleculeShoot> ChangeType();
79 
85 
86  static void RandomPosInBox(const G4ThreeVector& boxSize,
87  G4ThreeVector& output);
88 };
89 
90 //------------------------------------------------------------------------------
91 
92 /*
93  * Define a shoot type =
94  * track (used by the Smoluchowski code)
95  * or continuous medium (used by the gillespie code)
96  */
97 
98 template<typename TYPE>
100 {
101 public:
103  virtual ~TG4MoleculeShoot(){;}
105 
106 protected:
109 };
110 
111 template<typename TYPE>
112 G4shared_ptr<G4MoleculeShoot> G4MoleculeShoot::ChangeType()
113 {
114  G4shared_ptr<G4MoleculeShoot> output(new TG4MoleculeShoot<TYPE>);
115  output->fMoleculeName = fMoleculeName;
116  output->fPosition = fPosition;
117  output->fTime = fTime;
118  output->fNumber = fNumber;
119  output->fBoxSize = fBoxSize;
120  return output;
121 }
122 
123 
124 //------------------------------------------------------------------------------
125 
126 class G4MoleculeGun : public G4ITGun
127 {
128 public:
129  G4MoleculeGun();
130  virtual ~G4MoleculeGun();
131 
132  virtual void DefineTracks();
133 
134  /*
135  * Create a single molecule
136  * @param moleculeName name of the molecule such as recorded in molecule table
137  * @param position position where the molecule should pop up
138  * @param time time at which the molecule should pop up
139  */
140  void AddMolecule(const G4String& moleculeName,
141  const G4ThreeVector& position,
142  double time = 0);
143 
144  /*
145  * Create N molecules at a single point
146  * @param n number of molecules to create
147  * @param moleculeName name of the molecules such as recorded in molecule table
148  * @param position position where the molecules should pop up
149  * @param time time at which the molecules should pop up
150  */
151  void AddNMolecules(size_t n,
152  const G4String& moleculeName,
153  const G4ThreeVector& position,
154  double time = 0);
155 
156  /*
157  * Create N molecules in a box
158  * @param n number of molecules to create
159  * @param moleculeName name of the molecules such as recorded in molecule table
160  * @param boxCenter center of the box
161  * @param boxExtension size of the box
162  * @param time time at which the molecules should pop up
163  */
164  void AddMoleculesRandomPositionInBox(size_t n,
165  const G4String& moleculeName,
166  const G4ThreeVector& boxCenter,
167  const G4ThreeVector& boxExtension,
168  double time = 0);
169 
170  /*
171  * Create N molecules as component of the continuous medium in a box
172  * @param n number of molecules to create
173  * @param moleculeName name of the molecules such as recorded in molecule table
174  * @param boxCenter center of the box
175  * @param boxExtension size of the box
176  * @param time time at which the molecules should pop up
177  */
178 // void AddMoleculeInCMRepresentation(size_t n,
179 // const G4String& moleculeName,
180 // const G4ThreeVector& boxCenter,
181 // const G4ThreeVector& boxExtension,
182 // double time = 0);
183 
184  void AddMoleculeInCMRepresentation(size_t n,
185  const G4String& moleculeName,
186  double time = 0);
187 
188  const std::vector<G4shared_ptr<G4MoleculeShoot> >&
190  return fShoots;
191  }
192 
193  typedef std::map<G4String, int> NameNumber;
195 
196 
197  void AddMoleculeShoot(G4shared_ptr<G4MoleculeShoot>);
198 
199 protected:
200  void BuildAndPushTrack(const G4String& name,
201  const G4ThreeVector& position,
202  double time = 0);
204 
205  std::vector<G4shared_ptr<G4MoleculeShoot> > fShoots;
206  friend class G4MoleculeShoot;
207  template<class T> friend class TG4MoleculeShoot;
208 };
209 
210 #endif /* MOLECULEGUN_HH_ */