ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4MoleculeGun.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4MoleculeGun.cc
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 }