Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 /* 26 /* 27 * MoleculeGun.cc 27 * MoleculeGun.cc 28 * 28 * 29 * Created on: 29 janv. 2014 29 * Created on: 29 janv. 2014 30 * Author: kara 30 * Author: kara 31 */ 31 */ 32 32 33 #include "G4MoleculeGun.hh" 33 #include "G4MoleculeGun.hh" 34 #include "G4MoleculeTable.hh" 34 #include "G4MoleculeTable.hh" 35 #include "G4Molecule.hh" 35 #include "G4Molecule.hh" 36 #include "G4MoleculeGunMessenger.hh" 36 #include "G4MoleculeGunMessenger.hh" 37 #include "G4PhysicalVolumeStore.hh" 37 #include "G4PhysicalVolumeStore.hh" 38 #include "G4VPhysicalVolume.hh" 38 #include "G4VPhysicalVolume.hh" 39 #include <cassert> 39 #include <cassert> 40 #include "Randomize.hh" 40 #include "Randomize.hh" 41 //#include "G4MIWorkspace.hh" 41 //#include "G4MIWorkspace.hh" 42 #include "G4MolecularConfiguration.hh" 42 #include "G4MolecularConfiguration.hh" 43 43 44 //-------------------------------------------- 44 //------------------------------------------------------------------------------ 45 45 46 template<> 46 template<> 47 void TG4MoleculeShoot<G4Track>::ShootAtRandomP 47 void TG4MoleculeShoot<G4Track>::ShootAtRandomPosition(G4MoleculeGun* gun) 48 { 48 { 49 G4ThreeVector positionInLocalCoordinate; 49 G4ThreeVector positionInLocalCoordinate; 50 50 51 for(G4int i = 0; i < fNumber; ++i) << 51 for(int i = 0; i < fNumber; ++i) 52 { 52 { 53 RandomPosInBox(*fBoxSize, positionInLocalC 53 RandomPosInBox(*fBoxSize, positionInLocalCoordinate); 54 gun->BuildAndPushTrack(fMoleculeName, 54 gun->BuildAndPushTrack(fMoleculeName, 55 fPosition + positionInLocalCo 55 fPosition + positionInLocalCoordinate, 56 fTime); 56 fTime); 57 } 57 } 58 } 58 } 59 59 60 //-------------------------------------------- 60 //------------------------------------------------------------------------------ 61 61 62 template<> 62 template<> 63 void TG4MoleculeShoot<G4Track>::ShootAtFixedPo 63 void TG4MoleculeShoot<G4Track>::ShootAtFixedPosition(G4MoleculeGun* gun) 64 { 64 { 65 for(G4int i = 0; i < fNumber; ++i) << 65 for(int i = 0; i < fNumber; ++i) 66 { 66 { 67 gun->BuildAndPushTrack(fMoleculeName, fPos 67 gun->BuildAndPushTrack(fMoleculeName, fPosition, fTime); 68 } 68 } 69 } 69 } 70 70 71 //-------------------------------------------- 71 //------------------------------------------------------------------------------ 72 72 73 template<> 73 template<> 74 void TG4MoleculeShoot<G4Track>::Shoot(G4Molecu 74 void TG4MoleculeShoot<G4Track>::Shoot(G4MoleculeGun* gun) 75 { 75 { 76 if(fBoxSize != nullptr) ShootAtRandomPositio << 76 if(fBoxSize) ShootAtRandomPosition(gun); 77 else ShootAtFixedPosition(gun); 77 else ShootAtFixedPosition(gun); 78 } 78 } 79 79 80 //-------------------------------------------- 80 //------------------------------------------------------------------------------ 81 81 82 //template<> 82 //template<> 83 //void TG4MoleculeShoot<G4ContinuousMedium>::S 83 //void TG4MoleculeShoot<G4ContinuousMedium>::Shoot(G4MoleculeGun*) 84 //{ 84 //{ 85 // G4MolecularConfiguration* conf = G4Molec 85 // G4MolecularConfiguration* conf = G4MoleculeTable::Instance() 86 // ->GetConfiguration(fMoleculeName); 86 // ->GetConfiguration(fMoleculeName); 87 // G4MIWorkspace::GetWorldWorkspace()->GetS 87 // G4MIWorkspace::GetWorldWorkspace()->GetSpeciesInCM().Add(conf, 88 // 88 // fNumber); 89 //} 89 //} 90 90 91 //-------------------------------------------- 91 //------------------------------------------------------------------------------ 92 92 93 G4MoleculeGun::G4MoleculeGun() 93 G4MoleculeGun::G4MoleculeGun() 94 { 94 { 95 fpMessenger = new G4MoleculeGunMessenger(thi 95 fpMessenger = new G4MoleculeGunMessenger(this); 96 } 96 } 97 97 98 //-------------------------------------------- 98 //------------------------------------------------------------------------------ 99 99 100 G4MoleculeGun::~G4MoleculeGun() 100 G4MoleculeGun::~G4MoleculeGun() 101 { 101 { 102 delete fpMessenger; << 102 if (fpMessenger) delete fpMessenger; 103 } 103 } 104 104 105 //-------------------------------------------- 105 //------------------------------------------------------------------------------ 106 106 107 void G4MoleculeGun::DefineTracks() 107 void G4MoleculeGun::DefineTracks() 108 { 108 { 109 for (const auto & fShoot : fShoots) << 109 for (size_t i = 0; i < fShoots.size(); i++) 110 { 110 { 111 fShoot->Shoot(this); << 111 fShoots[i]->Shoot(this); 112 } 112 } 113 } 113 } 114 114 115 //-------------------------------------------- 115 //------------------------------------------------------------------------------ 116 116 117 void G4MoleculeGun::AddMolecule(const G4String 117 void G4MoleculeGun::AddMolecule(const G4String& name, 118 const G4ThreeV 118 const G4ThreeVector& position, 119 G4double time) << 119 double time) 120 { 120 { 121 G4shared_ptr<G4MoleculeShoot> shoot(new TG4M 121 G4shared_ptr<G4MoleculeShoot> shoot(new TG4MoleculeShoot<G4Track>()); 122 shoot->fMoleculeName = name; 122 shoot->fMoleculeName = name; 123 shoot->fPosition = position; 123 shoot->fPosition = position; 124 shoot->fTime = time; 124 shoot->fTime = time; 125 fShoots.push_back(std::move(shoot)); << 125 fShoots.push_back(shoot); 126 } 126 } 127 127 128 //-------------------------------------------- 128 //------------------------------------------------------------------------------ 129 129 130 void G4MoleculeGun::AddNMolecules(std::size_t << 130 void G4MoleculeGun::AddNMolecules(size_t n, 131 const G4Stri 131 const G4String& moleculeName, 132 const G4Thre 132 const G4ThreeVector& position, 133 G4double tim << 133 double time) 134 { 134 { 135 G4shared_ptr<G4MoleculeShoot> shoot(new TG4M 135 G4shared_ptr<G4MoleculeShoot> shoot(new TG4MoleculeShoot<G4Track>()); 136 shoot->fNumber = (G4int)n; << 136 shoot->fNumber = n; 137 shoot->fMoleculeName = moleculeName; 137 shoot->fMoleculeName = moleculeName; 138 shoot->fPosition = position; 138 shoot->fPosition = position; 139 shoot->fTime = time; 139 shoot->fTime = time; 140 fShoots.push_back(std::move(shoot)); << 140 fShoots.push_back(shoot); 141 } 141 } 142 142 143 //-------------------------------------------- 143 //------------------------------------------------------------------------------ 144 144 145 void 145 void 146 G4MoleculeGun::AddMoleculesRandomPositionInBox << 146 G4MoleculeGun::AddMoleculesRandomPositionInBox(size_t n, 147 147 const G4String& moleculeName, 148 148 const G4ThreeVector& boxCenter, 149 149 const G4ThreeVector& boxSize, 150 << 150 double time) 151 { 151 { 152 G4shared_ptr<G4MoleculeShoot> shoot(new TG4M 152 G4shared_ptr<G4MoleculeShoot> shoot(new TG4MoleculeShoot<G4Track>()); 153 shoot->fNumber = (G4int)n; << 153 shoot->fNumber = n; 154 shoot->fMoleculeName = moleculeName; 154 shoot->fMoleculeName = moleculeName; 155 shoot->fPosition = boxCenter; 155 shoot->fPosition = boxCenter; 156 shoot->fBoxSize = new G4ThreeVector(boxSize) 156 shoot->fBoxSize = new G4ThreeVector(boxSize); 157 shoot->fTime = time; 157 shoot->fTime = time; 158 fShoots.push_back(std::move(shoot)); << 158 fShoots.push_back(shoot); 159 } 159 } 160 160 161 //-------------------------------------------- 161 //------------------------------------------------------------------------------ 162 162 163 void G4MoleculeGun::BuildAndPushTrack(const G4 163 void G4MoleculeGun::BuildAndPushTrack(const G4String& name, 164 const G4 << 164 const G4ThreeVector& position, 165 G4double << 165 double time) 166 { 166 { 167 G4MolecularConfiguration* conf = 167 G4MolecularConfiguration* conf = 168 G4MoleculeTable::Instance()->GetConfigur 168 G4MoleculeTable::Instance()->GetConfiguration(name); 169 assert(conf != 0); 169 assert(conf != 0); 170 auto molecule = new G4Molecule(conf); << 170 G4Molecule* molecule = new G4Molecule(conf); 171 171 172 PushTrack(molecule->BuildTrack(time, positio 172 PushTrack(molecule->BuildTrack(time, position)); 173 } 173 } 174 174 175 //-------------------------------------------- 175 //------------------------------------------------------------------------------ 176 176 177 void G4MoleculeGun::GetNameAndNumber(G4Molecul 177 void G4MoleculeGun::GetNameAndNumber(G4MoleculeGun::NameNumber& output) 178 { 178 { 179 for(const auto & fShoot : fShoots) << 179 for(size_t i = 0 ; i < fShoots.size() ; ++i) 180 { 180 { 181 output[fShoot->fMoleculeName]+=fShoot->fNu << 181 output[fShoots[i]->fMoleculeName]+=fShoots[i]->fNumber; 182 } 182 } 183 } 183 } 184 184 185 //-------------------------------------------- 185 //------------------------------------------------------------------------------ 186 186 187 void G4MoleculeShoot::RandomPosInBox(const G4T 187 void G4MoleculeShoot::RandomPosInBox(const G4ThreeVector& boxSize, 188 G4ThreeVe 188 G4ThreeVector& output) 189 { 189 { 190 output[0] = boxSize.x() * G4UniformRand() - 190 output[0] = boxSize.x() * G4UniformRand() - boxSize.x()/2; 191 output[1] = boxSize.y() * G4UniformRand() - 191 output[1] = boxSize.y() * G4UniformRand() - boxSize.y()/2; 192 output[2] = boxSize.z() * G4UniformRand() - 192 output[2] = boxSize.z() * G4UniformRand() - boxSize.z()/2; 193 } 193 } 194 194 195 //-------------------------------------------- 195 //------------------------------------------------------------------------------ 196 196 197 G4MoleculeShoot::G4MoleculeShoot() << 197 G4MoleculeShoot::G4MoleculeShoot() : >> 198 G4enable_shared_from_this<G4MoleculeShoot>() 198 { 199 { 199 fMoleculeName = ""; 200 fMoleculeName = ""; 200 fTime = 0; 201 fTime = 0; 201 fNumber = 1; 202 fNumber = 1; 202 fBoxSize = nullptr; << 203 fBoxSize = 0; 203 } 204 } 204 205 205 //-------------------------------------------- 206 //------------------------------------------------------------------------------ 206 207 207 G4MoleculeShoot::~G4MoleculeShoot() 208 G4MoleculeShoot::~G4MoleculeShoot() 208 { 209 { 209 delete fBoxSize; << 210 if(fBoxSize) delete fBoxSize; 210 } 211 } 211 212 212 //-------------------------------------------- 213 //------------------------------------------------------------------------------ 213 214 214 void 215 void 215 G4MoleculeGun::AddMoleculeShoot(G4shared_ptr<G 216 G4MoleculeGun::AddMoleculeShoot(G4shared_ptr<G4MoleculeShoot> shoot) 216 { 217 { 217 fShoots.push_back(shoot); 218 fShoots.push_back(shoot); 218 } 219 } 219 220 220 void G4MoleculeGun::AddMoleculeInCMRepresentat << 221 void G4MoleculeGun::AddMoleculeInCMRepresentation(size_t n, 221 222 const G4String& moleculeName, 222 << 223 double time) 223 { 224 { 224 G4shared_ptr<G4MoleculeShoot> shoot(new TG4M 225 G4shared_ptr<G4MoleculeShoot> shoot(new TG4MoleculeShoot<G4ContinuousMedium>()); 225 shoot->fNumber = (G4int)n; << 226 shoot->fNumber = n; 226 shoot->fMoleculeName = moleculeName; 227 shoot->fMoleculeName = moleculeName; 227 shoot->fTime = time; 228 shoot->fTime = time; 228 fShoots.push_back(std::move(shoot)); << 229 fShoots.push_back(shoot); 229 } 230 } 230 231