Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // G4GeneralParticleSourceData class implement 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; // 38 } 39 40 G4GeneralParticleSourceData::G4GeneralParticle 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::~G4GeneralParticl 54 { 55 G4MUTEXDESTROY(mutex); 56 for (const auto it : sourceVector) 57 { 58 delete it; 59 } 60 sourceVector.clear(); 61 } 62 63 G4GeneralParticleSourceData* G4GeneralParticle 64 { 65 G4AutoLock lock(&singMutex); 66 static G4GeneralParticleSourceData instance; 67 return &instance; 68 } 69 70 void G4GeneralParticleSourceData::IntensityNor 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> sourceNormalizedInten 80 sourceNormalizedIntensity.clear(); 81 82 sourceNormalizedIntensity.push_back(sourceIn 83 sourceProbability.push_back(sourceNormalized 84 85 for (i = 1 ; i < sourceIntensity.size(); ++ 86 { 87 sourceNormalizedIntensity.push_back(source 88 sourceProbability.push_back(sourceNormaliz 89 } 90 91 // set source weights here based on sampling 92 // and intensities 93 // 94 for (i = 0 ; i < sourceIntensity.size(); ++ 95 { 96 if (!flat_sampling) 97 { 98 GetCurrentSource((G4int)i)->GetBiasRndm( 99 } 100 else 101 { 102 GetCurrentSource((G4int)i)->GetBiasRndm( 103 ->SetIntensityWeight(sourceNormalizedInt 104 } 105 } 106 normalised = true; 107 } 108 109 void G4GeneralParticleSourceData::SetCurrentSo 110 { 111 sourceIntensity.at(currentSourceIdx) = inten 112 normalised = false; 113 } 114 115 void G4GeneralParticleSourceData::AddASource(G 116 { 117 currentSource = new G4SingleParticleSource() 118 sourceVector.push_back(currentSource); 119 sourceIntensity.push_back(intensity); 120 currentSourceIdx = G4int(sourceVector.size() 121 normalised = false; 122 } 123 124 void G4GeneralParticleSourceData::DeleteASourc 125 { 126 delete sourceVector[idx]; 127 sourceVector.erase(sourceVector.begin() + id 128 sourceIntensity.erase(sourceIntensity.begin( 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::SetVerbosity 159 { 160 for (const auto it : sourceVector) 161 { 162 it->SetVerbosity(vl); 163 } 164 } 165 166 G4SingleParticleSource* G4GeneralParticleSourc 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