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 27 // 28 // Class Description: 29 // 30 // This class uses the singleton pattern to create a single copy of the data 31 // needed for the G4GPS class. As yet, only the largest parts have been split 32 // off. 33 // 34 // Thread Safety considerations: 35 // Singleton creation (G4GeneralParticleSourceData::Instance()) is thread safe. 36 // Getters are thread-safe if no other thread is adding/deleting a source or 37 // normalizing. However, please note that the setters are usually accessed via 38 // messenger. This should be instantiated in master thread. 39 // 40 // For convenience Lock and Unlock methods are provided that can be used to 41 // serialize calls. 42 // For example: 43 // gpsdata=G4GeneralParticleSourceData::Instance(); 44 // gpsdata->Lock(); 45 // gpsdata->AddASource(1.0); 46 // gpsdata->Unlock(); 47 48 // Author: Andrew Green, 20.03.2014 49 // -------------------------------------------------------------------- 50 #ifndef G4GPS_DATA_HH 51 #define G4GPS_DATA_HH 1 52 53 #include "G4SingleParticleSource.hh" 54 #include "G4Threading.hh" 55 56 class G4GeneralParticleSourceData 57 { 58 public: 59 60 static G4GeneralParticleSourceData* Instance(); 61 62 void AddASource(G4double intensity); 63 void DeleteASource(G4int idx); 64 void ClearSources(); 65 66 void IntensityNormalise(); 67 68 inline G4bool Normalised() const 69 { return normalised; } 70 71 G4SingleParticleSource* GetCurrentSource(G4int idx); 72 inline G4SingleParticleSource* GetCurrentSource() const 73 { return currentSource; } 74 75 inline G4int GetSourceVectorSize() const 76 { return G4int(sourceVector.size()); } 77 inline G4int GetIntensityVectorSize() const 78 { return G4int(sourceIntensity.size()); } 79 inline G4double GetIntensity(G4int idx) const 80 { return sourceIntensity.at(idx); } 81 inline G4double GetSourceProbability(G4int idx) const 82 { return sourceProbability.at(idx); } 83 84 void SetCurrentSourceIntensity(G4double); 85 86 inline void SetFlatSampling(G4bool fSamp) 87 { flat_sampling = fSamp; } 88 inline G4bool GetFlatSampling() const 89 { return flat_sampling; } 90 91 inline void SetMultipleVertex(G4bool flag) 92 { multiple_vertex = flag; } 93 inline G4bool GetMultipleVertex() const 94 { return multiple_vertex; } 95 96 inline G4int GetCurrentSourceIdx() const 97 { return currentSourceIdx; } 98 99 void SetVerbosityAllSources(G4int vl); 100 101 void Lock(); 102 void Unlock(); 103 //Lock/Unlock shared mutex 104 105 private: 106 107 G4GeneralParticleSourceData(); 108 ~G4GeneralParticleSourceData(); 109 110 private: 111 112 std::vector<G4SingleParticleSource*> sourceVector; 113 std::vector <G4double> sourceIntensity; 114 std::vector <G4double> sourceProbability; 115 116 G4bool multiple_vertex = false; 117 G4bool flat_sampling = false; 118 G4bool normalised = false; 119 120 G4int currentSourceIdx = 0; 121 G4SingleParticleSource* currentSource = nullptr; 122 G4Mutex mutex; 123 }; 124 125 #endif 126