Geant4 Cross Reference |
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" 36 #include "G4MoleculeGunMessenger.hh" 37 #include "G4PhysicalVolumeStore.hh" 38 #include "G4VPhysicalVolume.hh" 39 #include <cassert> 40 #include "Randomize.hh" 41 //#include "G4MIWorkspace.hh" 42 #include "G4MolecularConfiguration.hh" 43 44 //------------------------------------------------------------------------------ 45 46 template<> 47 void TG4MoleculeShoot<G4Track>::ShootAtRandomPosition(G4MoleculeGun* gun) 48 { 49 G4ThreeVector positionInLocalCoordinate; 50 51 for(G4int 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<> 63 void TG4MoleculeShoot<G4Track>::ShootAtFixedPosition(G4MoleculeGun* gun) 64 { 65 for(G4int i = 0; i < fNumber; ++i) 66 { 67 gun->BuildAndPushTrack(fMoleculeName, fPosition, fTime); 68 } 69 } 70 71 //------------------------------------------------------------------------------ 72 73 template<> 74 void TG4MoleculeShoot<G4Track>::Shoot(G4MoleculeGun* gun) 75 { 76 if(fBoxSize != nullptr) 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 93 G4MoleculeGun::G4MoleculeGun() 94 { 95 fpMessenger = new G4MoleculeGunMessenger(this); 96 } 97 98 //------------------------------------------------------------------------------ 99 100 G4MoleculeGun::~G4MoleculeGun() 101 { 102 delete fpMessenger; 103 } 104 105 //------------------------------------------------------------------------------ 106 107 void G4MoleculeGun::DefineTracks() 108 { 109 for (const auto & fShoot : fShoots) 110 { 111 fShoot->Shoot(this); 112 } 113 } 114 115 //------------------------------------------------------------------------------ 116 117 void G4MoleculeGun::AddMolecule(const G4String& name, 118 const G4ThreeVector& position, 119 G4double 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(std::move(shoot)); 126 } 127 128 //------------------------------------------------------------------------------ 129 130 void G4MoleculeGun::AddNMolecules(std::size_t n, 131 const G4String& moleculeName, 132 const G4ThreeVector& position, 133 G4double time) 134 { 135 G4shared_ptr<G4MoleculeShoot> shoot(new TG4MoleculeShoot<G4Track>()); 136 shoot->fNumber = (G4int)n; 137 shoot->fMoleculeName = moleculeName; 138 shoot->fPosition = position; 139 shoot->fTime = time; 140 fShoots.push_back(std::move(shoot)); 141 } 142 143 //------------------------------------------------------------------------------ 144 145 void 146 G4MoleculeGun::AddMoleculesRandomPositionInBox(std::size_t n, 147 const G4String& moleculeName, 148 const G4ThreeVector& boxCenter, 149 const G4ThreeVector& boxSize, 150 G4double time) 151 { 152 G4shared_ptr<G4MoleculeShoot> shoot(new TG4MoleculeShoot<G4Track>()); 153 shoot->fNumber = (G4int)n; 154 shoot->fMoleculeName = moleculeName; 155 shoot->fPosition = boxCenter; 156 shoot->fBoxSize = new G4ThreeVector(boxSize); 157 shoot->fTime = time; 158 fShoots.push_back(std::move(shoot)); 159 } 160 161 //------------------------------------------------------------------------------ 162 163 void G4MoleculeGun::BuildAndPushTrack(const G4String& name, 164 const G4ThreeVector& position, 165 G4double time) 166 { 167 G4MolecularConfiguration* conf = 168 G4MoleculeTable::Instance()->GetConfiguration(name); 169 assert(conf != 0); 170 auto molecule = new G4Molecule(conf); 171 172 PushTrack(molecule->BuildTrack(time, position)); 173 } 174 175 //------------------------------------------------------------------------------ 176 177 void G4MoleculeGun::GetNameAndNumber(G4MoleculeGun::NameNumber& output) 178 { 179 for(const auto & fShoot : fShoots) 180 { 181 output[fShoot->fMoleculeName]+=fShoot->fNumber; 182 } 183 } 184 185 //------------------------------------------------------------------------------ 186 187 void G4MoleculeShoot::RandomPosInBox(const G4ThreeVector& boxSize, 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 197 G4MoleculeShoot::G4MoleculeShoot() 198 { 199 fMoleculeName = ""; 200 fTime = 0; 201 fNumber = 1; 202 fBoxSize = nullptr; 203 } 204 205 //------------------------------------------------------------------------------ 206 207 G4MoleculeShoot::~G4MoleculeShoot() 208 { 209 delete fBoxSize; 210 } 211 212 //------------------------------------------------------------------------------ 213 214 void 215 G4MoleculeGun::AddMoleculeShoot(G4shared_ptr<G4MoleculeShoot> shoot) 216 { 217 fShoots.push_back(shoot); 218 } 219 220 void G4MoleculeGun::AddMoleculeInCMRepresentation(std::size_t n, 221 const G4String& moleculeName, 222 G4double time) 223 { 224 G4shared_ptr<G4MoleculeShoot> shoot(new TG4MoleculeShoot<G4ContinuousMedium>()); 225 shoot->fNumber = (G4int)n; 226 shoot->fMoleculeName = moleculeName; 227 shoot->fTime = time; 228 fShoots.push_back(std::move(shoot)); 229 } 230