Geant4  10.03
G4MoleculeGun.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  * MoleculeGun.cc
28  *
29  * Created on: 29 janv. 2014
30  * Author: kara
31  */
32 
33 #include "G4MoleculeGun.hh"
34 #include "G4MoleculeTable.hh"
35 #include "G4Molecule.hh"
37 #include "G4PhysicalVolumeStore.hh"
38 #include "G4VPhysicalVolume.hh"
39 #include <cassert>
40 #include "Randomize.hh"
41 //#include "G4MIWorkspace.hh"
43 
44 //------------------------------------------------------------------------------
45 
46 template<>
48 {
49  G4ThreeVector positionInLocalCoordinate;
50 
51  for(int i = 0; i < fNumber; ++i)
52  {
53  RandomPosInBox(*fBoxSize, positionInLocalCoordinate);
54  gun->BuildAndPushTrack(fMoleculeName,
55  fPosition + positionInLocalCoordinate,
56  fTime);
57  }
58 }
59 
60 //------------------------------------------------------------------------------
61 
62 template<>
64 {
65  for(int i = 0; i < fNumber; ++i)
66  {
67  gun->BuildAndPushTrack(fMoleculeName, fPosition, fTime);
68  }
69 }
70 
71 //------------------------------------------------------------------------------
72 
73 template<>
75 {
76  if(fBoxSize) ShootAtRandomPosition(gun);
77  else ShootAtFixedPosition(gun);
78 }
79 
80 //------------------------------------------------------------------------------
81 
82 //template<>
83 //void TG4MoleculeShoot<G4ContinuousMedium>::Shoot(G4MoleculeGun*)
84 //{
85 // G4MolecularConfiguration* conf = G4MoleculeTable::Instance()
86 // ->GetConfiguration(fMoleculeName);
87 // G4MIWorkspace::GetWorldWorkspace()->GetSpeciesInCM().Add(conf,
88 // fNumber);
89 //}
90 
91 //------------------------------------------------------------------------------
92 
94 {
96 }
97 
98 //------------------------------------------------------------------------------
99 
101 {
102  if (fpMessenger) delete fpMessenger;
103 }
104 
105 //------------------------------------------------------------------------------
106 
108 {
109  for (size_t i = 0; i < fShoots.size(); i++)
110  {
111  fShoots[i]->Shoot(this);
112  }
113 }
114 
115 //------------------------------------------------------------------------------
116 
118  const G4ThreeVector& position,
119  double time)
120 {
121  G4shared_ptr<G4MoleculeShoot> shoot(new TG4MoleculeShoot<G4Track>());
122  shoot->fMoleculeName = name;
123  shoot->fPosition = position;
124  shoot->fTime = time;
125  fShoots.push_back(shoot);
126 }
127 
128 //------------------------------------------------------------------------------
129 
131  const G4String& moleculeName,
132  const G4ThreeVector& position,
133  double time)
134 {
135  G4shared_ptr<G4MoleculeShoot> shoot(new TG4MoleculeShoot<G4Track>());
136  shoot->fNumber = n;
137  shoot->fMoleculeName = moleculeName;
138  shoot->fPosition = position;
139  shoot->fTime = time;
140  fShoots.push_back(shoot);
141 }
142 
143 //------------------------------------------------------------------------------
144 
145 void
147  const G4String& moleculeName,
148  const G4ThreeVector& boxCenter,
149  const G4ThreeVector& boxSize,
150  double time)
151 {
152  G4shared_ptr<G4MoleculeShoot> shoot(new TG4MoleculeShoot<G4Track>());
153  shoot->fNumber = n;
154  shoot->fMoleculeName = moleculeName;
155  shoot->fPosition = boxCenter;
156  shoot->fBoxSize = new G4ThreeVector(boxSize);
157  shoot->fTime = time;
158  fShoots.push_back(shoot);
159 }
160 
161 //------------------------------------------------------------------------------
162 
164  const G4ThreeVector& position,
165  double time)
166 {
169  assert(conf != 0);
170  G4Molecule* molecule = new G4Molecule(conf);
171 
172  PushTrack(molecule->BuildTrack(time, position));
173 }
174 
175 //------------------------------------------------------------------------------
176 
178 {
179  for(size_t i = 0 ; i < fShoots.size() ; ++i)
180  {
181  output[fShoots[i]->fMoleculeName]+=fShoots[i]->fNumber;
182  }
183 }
184 
185 //------------------------------------------------------------------------------
186 
188  G4ThreeVector& output)
189 {
190  output[0] = boxSize.x() * G4UniformRand() - boxSize.x()/2;
191  output[1] = boxSize.y() * G4UniformRand() - boxSize.y()/2;
192  output[2] = boxSize.z() * G4UniformRand() - boxSize.z()/2;
193 }
194 
195 //------------------------------------------------------------------------------
196 
199 {
200  fMoleculeName = "";
201  fTime = 0;
202  fNumber = 1;
203  fBoxSize = 0;
204 }
205 
206 //------------------------------------------------------------------------------
207 
209 {
210  if(fBoxSize) delete fBoxSize;
211 }
212 
213 //------------------------------------------------------------------------------
214 
215 void
216 G4MoleculeGun::AddMoleculeShoot(G4shared_ptr<G4MoleculeShoot> shoot)
217 {
218  fShoots.push_back(shoot);
219 }
220 
222  const G4String& moleculeName,
223  double time)
224 {
225  G4shared_ptr<G4MoleculeShoot> shoot(new TG4MoleculeShoot<G4ContinuousMedium>());
226  shoot->fNumber = n;
227  shoot->fMoleculeName = moleculeName;
228  shoot->fTime = time;
229  fShoots.push_back(shoot);
230 }
The pointer G4MolecularConfiguration will be shared by all the molecules having the same molecule def...
ThreeVector shoot(const G4int Ap, const G4int Af)
virtual ~G4MoleculeShoot()
void AddMoleculeInCMRepresentation(size_t n, const G4String &moleculeName, double time=0)
void AddMoleculeShoot(G4shared_ptr< G4MoleculeShoot >)
void AddMoleculesRandomPositionInBox(size_t n, const G4String &moleculeName, const G4ThreeVector &boxCenter, const G4ThreeVector &boxExtension, double time=0)
#define G4enable_shared_from_this
Definition: G4memory.hh:37
CLHEP::Hep3Vector G4ThreeVector
G4MoleculeGunMessenger * fpMessenger
virtual void DefineTracks()
void BuildAndPushTrack(const G4String &name, const G4ThreeVector &position, double time=0)
void ShootAtRandomPosition(G4MoleculeGun *)
const char * name(G4int ptype)
void AddMolecule(const G4String &moleculeName, const G4ThreeVector &position, double time=0)
G4ThreeVector * fBoxSize
#define position
Definition: xmlparse.cc:622
#define G4UniformRand()
Definition: Randomize.hh:97
static G4MoleculeTable * Instance()
const G4int n
static void RandomPosInBox(const G4ThreeVector &boxSize, G4ThreeVector &output)
void Shoot(G4MoleculeGun *)
void AddNMolecules(size_t n, const G4String &moleculeName, const G4ThreeVector &position, double time=0)
G4Track * BuildTrack(G4double globalTime, const G4ThreeVector &Position)
Definition: G4Molecule.cc:384
virtual ~G4MoleculeGun()
Class Description The dynamic molecule holds all the data that change for a molecule It has a pointer...
Definition: G4Molecule.hh:94
std::map< G4String, int > NameNumber
void ShootAtFixedPosition(G4MoleculeGun *)
void PushTrack(G4Track *)
Definition: G4ITGun.cc:45
G4String fMoleculeName
std::vector< G4shared_ptr< G4MoleculeShoot > > fShoots
void GetNameAndNumber(NameNumber &)
G4MolecularConfiguration * GetConfiguration(const G4String &, bool mustExist=true)