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 // G4ParticleTable << 27 // 26 // 28 // Class description: << 27 // $Id: G4ParticleTable.hh 73711 2013-09-09 09:57:29Z gcosmo $ >> 28 // >> 29 // >> 30 // ------------------------------------------------------------ >> 31 // GEANT 4 class header file >> 32 // >> 33 // History: first implementation, based on object model of >> 34 // 27 June 1996, H.Kurashige >> 35 // ------------------------------------------------------------ >> 36 // added fParticleMessenger 14 Nov., 97 H.Kurashige >> 37 // added Create/DeleteMessenger 06 Jul., 98 H.Kurashige >> 38 // modified FindIon 02 Aug., 98 H.Kurashige >> 39 // added dictionary for encoding 24 Sep., 98 H.Kurashige >> 40 // added RemoveAllParticles() 8 Nov., 98 H.Kurashige >> 41 // -------------------------------- >> 42 // fixed some improper codings 08 Apr., 99 H.Kurashige >> 43 // modified FindIon/GetIon methods 17 AUg., 99 H.Kurashige >> 44 // implement new version for using STL map instaed of RW PtrHashedDictionary >> 45 // 28 ct., 99 H.Kurashige >> 46 // modified implementation of Remove 21 Mar.,08 H.Kurashige >> 47 // remove G4ShortLivedTable 25 July, 13 H.Kurashige 29 // 48 // 30 // G4ParticleTable is the table of pointers to << 31 // It is a "singleton" (only one static object << 32 // Each G4ParticleDefinition pointer is stored << 33 // to itself. So, each G4ParticleDefinition ob << 34 // name. << 35 << 36 // Authors: G.Cosmo, 2 December 1995 - Design, << 37 // H.Kurashige, 27 June 1996 - First << 38 // History: << 39 // - 14 Nov 1997, H.Kurashige - Added messenge << 40 // - 24 Sep 1998, H.Kurashige - Added dictiona << 41 // - 28 Oct 1999, H.Kurashige - Migration to S << 42 // - 15 Sep 2017, K.L.Genser - Added support f << 43 // ------------------------------------------- << 44 #ifndef G4ParticleTable_hh << 45 #define G4ParticleTable_hh 1 << 46 49 47 #include "G4ParticleDefinition.hh" << 50 #ifndef G4ParticleTable_h 48 #include "G4ParticleTableIterator.hh" << 51 #define G4ParticleTable_h 1 49 #include "G4Threading.hh" << 50 #include "G4ios.hh" << 51 #include "globals.hh" << 52 52 53 #include <map> 53 #include <map> 54 54 >> 55 #include "G4ios.hh" >> 56 #include "globals.hh" >> 57 #include "G4Threading.hh" >> 58 #include "G4ParticleDefinition.hh" >> 59 #include "G4ParticleTableIterator.hh" >> 60 55 class G4UImessenger; 61 class G4UImessenger; 56 class G4ParticleMessenger; 62 class G4ParticleMessenger; 57 class G4IonTable; 63 class G4IonTable; 58 64 59 class G4ParticleTable 65 class G4ParticleTable 60 { 66 { 61 public: << 67 // Class Description 62 using G4PTblDictionary = G4ParticleTableIt << 68 // G4ParticleTable is the table of pointer to G4ParticleDefinition 63 using G4PTblDicIterator = G4ParticleTableI << 69 // G4ParticleTable is a "singleton" (only one and staic object) 64 using G4PTblEncodingDictionary = G4Particl << 70 // In G4ParticleTable, each G4ParticleDefinition pointer is stored 65 using G4PTblEncodingDicIterator = G4Partic << 71 // with its name as a key to itself. So, each G4ParticleDefinition 66 << 72 // object must have unique name for itself. 67 virtual ~G4ParticleTable(); << 73 // 68 << 74 69 // Copy constructor and assignment operato << 75 public: 70 G4ParticleTable(const G4ParticleTable&) = << 76 71 G4ParticleTable& operator=(const G4Particl << 77 typedef G4ParticleTableIterator<G4String, G4ParticleDefinition*>::Map G4PTblDictionary; 72 << 78 typedef G4ParticleTableIterator<G4String, G4ParticleDefinition*> G4PTblDicIterator; 73 // This method is similar to the construct << 79 typedef G4ParticleTableIterator<G4int, G4ParticleDefinition*>::Map G4PTblEncodingDictionary; 74 // thread to achieve the partial effect as << 80 typedef G4ParticleTableIterator<G4int, G4ParticleDefinition*> G4PTblEncodingDicIterator; 75 void WorkerG4ParticleTable(); << 81 76 << 82 protected: 77 // This method is similar to the destructo << 83 // default constructor 78 // thread to achieve the partial effect as << 84 G4ParticleTable(); 79 void DestroyWorkerG4ParticleTable(); << 85 // Copy constructor and assignment operator 80 << 86 G4ParticleTable(const G4ParticleTable &right); 81 // Return the pointer to the G4ParticleTab << 87 G4ParticleTable & operator=(const G4ParticleTable &); 82 // G4ParticleTable is a "singleton" and ca << 88 83 // function. At the first time of calling << 89 public: 84 // G4ParticleTable object is instantiated << 90 85 static G4ParticleTable* GetParticleTable() << 91 void SlaveG4ParticleTable(); 86 << 92 void WorkerG4ParticleTable(); 87 // Returns TRUE if the ParticleTable conta << 93 // This method is similar to the constructor. It is used by each worker 88 inline G4bool contains(const G4ParticleDef << 94 // thread to achieve the partial effect as that of the master thread. 89 G4bool contains(const G4String& particle_n << 95 90 << 96 virtual ~G4ParticleTable(); 91 // Returns the number of particles in the << 97 // Do we need DestroySlaveG4ParticleTable()? 92 G4int entries() const; << 98 93 G4int size() const; << 99 public: // With Description 94 << 100 static G4ParticleTable* GetParticleTable(); 95 // Returns a pointer to the i-th particle << 101 // return the pointer to G4ParticleTable object 96 // 0 <= index < entries() << 102 // G4ParticleTable is a "singleton" and can get its pointer by this function 97 G4ParticleDefinition* GetParticle(G4int in << 103 // At the first time of calling this function, the G4ParticleTable object 98 << 104 // is instantiated 99 // Returns the name of i-th particle in th << 105 100 const G4String& GetParticleName(G4int inde << 106 G4bool contains(const G4ParticleDefinition *particle) const; 101 << 107 G4bool contains(const G4String &particle_name) const; 102 // Returns a pointer to the particle (0 if << 108 // returns TRUE if the ParticleTable contains 103 G4ParticleDefinition* FindParticle(G4int P << 109 104 G4ParticleDefinition* FindParticle(const G << 110 G4int entries() const; 105 G4ParticleDefinition* FindParticle(const G << 111 G4int size() const; 106 << 112 // returns the number of Particles in the ParticleTable 107 // Returns a pointer to its anti-particle << 113 108 inline G4ParticleDefinition* FindAntiParti << 114 G4ParticleDefinition* GetParticle(G4int index) const; 109 inline G4ParticleDefinition* FindAntiParti << 115 // returns a pointer to i-th particles in the ParticleTable 110 inline G4ParticleDefinition* FindAntiParti << 116 // 0<= index < entries() 111 << 117 112 // Returns the pointer to the Iterator << 118 const G4String& GetParticleName(G4int index) const; 113 G4PTblDicIterator* GetIterator() const; << 119 // returns name of i-th particles in the ParticleTable 114 << 120 115 // Dumps information of particles specifie << 121 G4ParticleDefinition* FindParticle(G4int PDGEncoding ); 116 void DumpTable(const G4String& particle_na << 122 G4ParticleDefinition* FindParticle(const G4String &particle_name); 117 << 123 G4ParticleDefinition* FindParticle(const G4ParticleDefinition *particle); 118 // Returns the pointer to the G4IonTable o << 124 // returns a pointer to the particle (0 if not contained) 119 G4IonTable* GetIonTable() const; << 125 120 << 126 G4ParticleDefinition* FindAntiParticle(G4int PDGEncoding ); 121 // Inserts the particle into ParticleTable << 127 G4ParticleDefinition* FindAntiParticle(const G4String &particle_name); 122 // Returned value is the same as particle << 128 G4ParticleDefinition* FindAntiParticle(const G4ParticleDefinition *particle); 123 // or the pointer to another G4ParticleD << 129 // returns a pointer to its anti-particle (0 if not contained) 124 // which has same particle name << 130 125 // or nullptr if failing to insert by ot << 131 G4PTblDicIterator* GetIterator() const; 126 G4ParticleDefinition* Insert(G4ParticleDef << 132 // return the pointer of Iterator (RW compatible) 127 << 133 128 // Removes the particle from the table (no << 134 void DumpTable(const G4String &particle_name = "ALL"); 129 G4ParticleDefinition* Remove(G4ParticleDef << 135 // dump information of particles specified by name 130 << 136 131 // Removes all particles from G4ParticleTa << 137 public: //With Description 132 void RemoveAllParticles(); << 138 133 << 139 G4IonTable* GetIonTable() const; 134 // Removes and deletes all particles from << 140 // return the pointer to G4IonTable object 135 void DeleteAllParticles(); << 141 136 << 142 /////////////////////////////////////////////////////////////////////// 137 // Creates messenger << 143 // NOTE :: 138 G4UImessenger* CreateMessenger(); << 144 // Following FindIon/GetIon methods will be removed in future relases 139 << 145 // Use FindIon/GetIon methods of G4IonTable instead 140 void SelectParticle(const G4String& name); << 146 // 141 << 147 G4ParticleDefinition* FindIon( G4int atomicNumber, 142 inline const G4ParticleDefinition* GetSele << 148 G4int atomicMass, 143 << 149 G4double excitationEnergy ); 144 inline void SetVerboseLevel(G4int value); << 150 G4ParticleDefinition* FindIon( G4int atomicNumber, 145 inline G4int GetVerboseLevel() const; << 151 G4int atomicMass, 146 << 152 G4int numberOfLambda, 147 inline void SetReadiness(G4bool val = true << 153 G4double excitationEnergy ); 148 inline G4bool GetReadiness() const; << 154 // return the pointer to an ion (returns 0 if the ion does not exist) 149 << 155 // the ion has excitation energy nearest to given excitationEnergy (0: ground state) 150 inline G4ParticleDefinition* GetGenericIon << 156 151 inline void SetGenericIon(G4ParticleDefini << 157 G4ParticleDefinition* GetIon( G4int atomicNumber, 152 << 158 G4int atomicMass, 153 inline G4ParticleDefinition* GetGenericMuo << 159 G4double excitationEnergy); 154 inline void SetGenericMuonicAtom(G4Particl << 160 G4ParticleDefinition* GetIon( G4int atomicNumber, 155 << 161 G4int atomicMass, 156 // Public data --------------------------- << 162 G4int numberOfLambda, 157 << 163 G4double excitationEnergy); 158 // These fields should be thread local or << 164 159 // class, we can change any member field a << 165 G4ParticleDefinition* GetIon(G4int atomicNumber, G4int atomicMass, 160 // because there is only one instance. The << 166 G4int level); 161 // "G4ThreadLocal" << 167 162 G4ParticleMessenger* fParticleMessenger = << 168 // return the pointer to an ion ( create ion if the ion does not exist) 163 static G4ThreadLocal G4PTblDictionary* fDi << 169 // It has excitation energy nearest to given excitationEnergy (0: ground state) 164 static G4ThreadLocal G4PTblDicIterator* fI << 170 165 static G4ThreadLocal G4PTblEncodingDiction << 171 G4ParticleDefinition* FindIon( G4int atomicNumber, 166 << 172 G4int atomicMass, 167 // Particle table is being shared << 173 G4int dummy1, 168 static G4ParticleTable* fgParticleTable; << 174 G4int dummy2 ); 169 << 175 // return the pointer to an ion 170 // This field should be thread private. Ho << 176 // !! This routine behaves same as GetIon( atomicNumber, atomicMass, 0) 171 // of the ion table pointer. So we change << 177 // !! The third and fourth arguments are meaningless 172 // G4IonTable to be thread local << 178 // !! This routine is provided for compatibility to old version 173 G4IonTable* fIonTable = nullptr; << 179 /////////////////////////////////////////////////////////////////////////////////////// 174 << 180 175 // These shadow pointers are used by each << 181 176 // from the master thread << 182 177 // << 183 public: // With Description 178 static G4PTblDictionary* fDictionaryShadow << 184 G4ParticleDefinition* Insert(G4ParticleDefinition *particle); 179 static G4PTblDicIterator* fIteratorShadow; << 185 // insert the particle into ParticleTable 180 static G4PTblEncodingDictionary* fEncoding << 186 // return value is same as particle if successfully inserted 181 << 187 // or pointer to another G4ParticleDefinition object 182 #ifdef G4MULTITHREADED << 188 // which has same name of particle 183 // Shared instance of a mutex << 189 // or 0 if fail to insert by another reason 184 static G4GLOB_DLL G4Mutex& particleTableMu << 190 185 static G4GLOB_DLL G4int& lockCount(); << 191 G4ParticleDefinition* Remove(G4ParticleDefinition *particle); 186 #endif << 192 // Remove the particle from the table (not delete) 187 << 193 >> 194 void RemoveAllParticles(); >> 195 // remove all particles from G4ParticleTable >> 196 >> 197 void DeleteAllParticles(); >> 198 // remove and delete all particles from G4ParticleTable >> 199 >> 200 public: >> 201 G4UImessenger* CreateMessenger(); >> 202 void DeleteMessenger(); >> 203 // create/delete messenger for the particle table >> 204 // these methods are supposed to be invoked by G4RunManager only >> 205 188 protected: 206 protected: 189 const G4PTblDictionary* GetDictionary() co << 190 << 191 // Returns key value of the particle (i.e. << 192 inline const G4String& GetKey(const G4Part << 193 207 194 // Returns the pointer to EncodingDictiona << 208 const G4PTblDictionary* GetDictionary() const; 195 const G4PTblEncodingDictionary* GetEncodin << 196 209 197 private: << 210 const G4String& GetKey(const G4ParticleDefinition *particle) const; 198 // Provate default constructor << 211 // return key value of the particle (i.e. particle name) 199 G4ParticleTable(); << 200 212 201 void CheckReadiness() const; << 213 const G4PTblEncodingDictionary* GetEncodingDictionary() const; >> 214 // return the pointer to EncodingDictionary 202 215 203 // Private data -------------------------- << 216 private: >> 217 G4int verboseLevel; >> 218 // controle flag for output message >> 219 // 0: Silent >> 220 // 1: Warning message >> 221 // 2: More >> 222 >> 223 public: >> 224 void SetVerboseLevel(G4int value); >> 225 G4int GetVerboseLevel() const; >> 226 >> 227 static G4ThreadLocal G4ParticleMessenger* fParticleMessenger; >> 228 static G4ThreadLocal G4PTblDictionary* fDictionary; >> 229 static G4ThreadLocal G4PTblDicIterator* fIterator; >> 230 static G4ThreadLocal G4PTblEncodingDictionary* fEncodingDictionary; >> 231 // These fields should be thread local or thread private. For a singleton >> 232 // class, we can change any member field as static without any problem >> 233 // because there is only one instance. Then we are allowed to add >> 234 // "G4ThreadLocal". >> 235 >> 236 //01.25.2009 Xin Dong: Phase II change for Geant4 multi-threading. >> 237 //Phase I changes this member to be thread local while each thread holds >> 238 //its own copy of particles. >> 239 //Phase II changes this member back in order to share particles. >> 240 static G4ParticleTable* fgParticleTable; >> 241 >> 242 static G4IonTable* fIonTable; >> 243 // This field should be thread private. However, we have to keep one copy >> 244 // of the ion table pointer. So we change all important fields of G4IonTable >> 245 // to the thread local variable. >> 246 >> 247 // These shadow pointers are used by each worker thread to copy the content >> 248 // from the master thread. >> 249 >> 250 static G4ParticleMessenger* fParticleMessengerShadow; >> 251 static G4PTblDictionary* fDictionaryShadow; >> 252 static G4PTblDicIterator* fIteratorShadow; >> 253 static G4PTblEncodingDictionary* fEncodingDictionaryShadow; >> 254 >> 255 private: >> 256 const G4String noName; >> 257 >> 258 G4bool readyToUse; >> 259 G4ParticleDefinition* genericIon; >> 260 >> 261 public: >> 262 void SetReadiness(G4bool val=true); >> 263 G4bool GetReadiness() const; >> 264 G4ParticleDefinition* GetGenericIon() const; >> 265 void SetGenericIon(G4ParticleDefinition*); >> 266 private: >> 267 void CheckReadiness() const; 204 268 205 G4ParticleDefinition* genericIon = nullptr << 206 G4ParticleDefinition* genericMuonicAtom = << 207 const G4ParticleDefinition* selectedPartic << 208 269 209 const G4String noName = " "; << 270 #ifdef G4MULTITHREADED 210 G4String selectedName = "undefined"; << 271 public: 211 << 272 //Andrea Dotti January 16. Shared instance of a mutex 212 // Control flag for output message << 273 static G4Mutex particleTableMutex; 213 // 0: Silent << 274 static G4int lockCount; 214 // 1: Warning message << 275 #endif 215 // 2: More << 216 G4int verboseLevel = 1; << 217 << 218 G4bool readyToUse = false; << 219 }; 276 }; 220 << 221 #include "G4ParticleTable.icc" 277 #include "G4ParticleTable.icc" 222 278 223 #endif 279 #endif 224 280