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 // G4GeneralParticleSourceData class implementation 27 // 28 // Author: Andrew Green, 20.03.2014 29 // -------------------------------------------------------------------- 30 31 #include "G4GeneralParticleSourceData.hh" 32 #include "G4Threading.hh" 33 #include "G4AutoLock.hh" 34 35 namespace 36 { 37 G4Mutex singMutex = G4MUTEX_INITIALIZER; // Protects singleton access 38 } 39 40 G4GeneralParticleSourceData::G4GeneralParticleSourceData() 41 { 42 G4MUTEXINIT(mutex); 43 44 sourceVector.clear(); 45 sourceIntensity.clear(); 46 sourceProbability.clear(); 47 48 currentSource = new G4SingleParticleSource(); 49 sourceVector.push_back(currentSource); 50 sourceIntensity.push_back(1.); 51 } 52 53 G4GeneralParticleSourceData::~G4GeneralParticleSourceData() 54 { 55 G4MUTEXDESTROY(mutex); 56 for (const auto it : sourceVector) 57 { 58 delete it; 59 } 60 sourceVector.clear(); 61 } 62 63 G4GeneralParticleSourceData* G4GeneralParticleSourceData::Instance() 64 { 65 G4AutoLock lock(&singMutex); 66 static G4GeneralParticleSourceData instance; 67 return &instance; 68 } 69 70 void G4GeneralParticleSourceData::IntensityNormalise() 71 { 72 G4double total = 0.; 73 std::size_t i = 0 ; 74 for (i = 0; i < sourceIntensity.size(); ++i) 75 { 76 total += sourceIntensity[i] ; 77 } 78 sourceProbability.clear(); 79 std::vector <G4double> sourceNormalizedIntensity; 80 sourceNormalizedIntensity.clear(); 81 82 sourceNormalizedIntensity.push_back(sourceIntensity[0]/total); 83 sourceProbability.push_back(sourceNormalizedIntensity[0]); 84 85 for (i = 1 ; i < sourceIntensity.size(); ++i) 86 { 87 sourceNormalizedIntensity.push_back(sourceIntensity[i]/total); 88 sourceProbability.push_back(sourceNormalizedIntensity[i]+sourceProbability[i-1]); 89 } 90 91 // set source weights here based on sampling scheme (analog/flat) 92 // and intensities 93 // 94 for (i = 0 ; i < sourceIntensity.size(); ++i) 95 { 96 if (!flat_sampling) 97 { 98 GetCurrentSource((G4int)i)->GetBiasRndm()->SetIntensityWeight(1.); 99 } 100 else 101 { 102 GetCurrentSource((G4int)i)->GetBiasRndm() 103 ->SetIntensityWeight(sourceNormalizedIntensity[i]*sourceIntensity.size()); 104 } 105 } 106 normalised = true; 107 } 108 109 void G4GeneralParticleSourceData::SetCurrentSourceIntensity(G4double intensity) 110 { 111 sourceIntensity.at(currentSourceIdx) = intensity; 112 normalised = false; 113 } 114 115 void G4GeneralParticleSourceData::AddASource(G4double intensity) 116 { 117 currentSource = new G4SingleParticleSource(); 118 sourceVector.push_back(currentSource); 119 sourceIntensity.push_back(intensity); 120 currentSourceIdx = G4int(sourceVector.size() - 1); 121 normalised = false; 122 } 123 124 void G4GeneralParticleSourceData::DeleteASource(G4int idx) 125 { 126 delete sourceVector[idx]; 127 sourceVector.erase(sourceVector.begin() + idx); 128 sourceIntensity.erase(sourceIntensity.begin()+idx); 129 normalised = false ; 130 if (currentSourceIdx == idx ) 131 { 132 if ( GetIntensityVectorSize() > 0 ) 133 { 134 currentSource = GetCurrentSource(0); 135 currentSourceIdx = 0; 136 } 137 else 138 { 139 currentSource = nullptr; 140 currentSourceIdx = -1; 141 } 142 } 143 } 144 145 void G4GeneralParticleSourceData::ClearSources() 146 { 147 currentSourceIdx = -1; 148 currentSource = nullptr; 149 for (const auto it : sourceVector) 150 { 151 delete it; 152 } 153 sourceVector.clear(); 154 sourceIntensity.clear(); 155 normalised = false; 156 } 157 158 void G4GeneralParticleSourceData::SetVerbosityAllSources(G4int vl) 159 { 160 for (const auto it : sourceVector) 161 { 162 it->SetVerbosity(vl); 163 } 164 } 165 166 G4SingleParticleSource* G4GeneralParticleSourceData::GetCurrentSource(G4int idx) 167 { 168 currentSource = sourceVector[idx]; 169 currentSourceIdx = idx; 170 return sourceVector[idx]; 171 } 172 173 void G4GeneralParticleSourceData::Lock() 174 { 175 G4MUTEXLOCK(&mutex); 176 } 177 178 void G4GeneralParticleSourceData::Unlock() 179 { 180 G4MUTEXUNLOCK(&mutex); 181 } 182