Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/particles/management/include/G4ParticleTable.hh

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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 // G4ParticleTable
 27 //
 28 // Class description:
 29 //
 30 // G4ParticleTable is the table of pointers to G4ParticleDefinition.
 31 // It is a "singleton" (only one static object).
 32 // Each G4ParticleDefinition pointer is stored with its name as a key
 33 // to itself. So, each G4ParticleDefinition object must have unique
 34 // name.
 35 
 36 // Authors: G.Cosmo, 2 December 1995 - Design, based on object model
 37 //          H.Kurashige, 27 June 1996 - First implementation
 38 // History:
 39 // - 14 Nov 1997, H.Kurashige - Added messenger
 40 // - 24 Sep 1998, H.Kurashige - Added dictionary for encoding
 41 // - 28 Oct 1999, H.Kurashige - Migration to STL maps
 42 // - 15 Sep 2017, K.L.Genser - Added support for MuonicAtom
 43 // --------------------------------------------------------------------
 44 #ifndef G4ParticleTable_hh
 45 #define G4ParticleTable_hh 1
 46 
 47 #include "G4ParticleDefinition.hh"
 48 #include "G4ParticleTableIterator.hh"
 49 #include "G4Threading.hh"
 50 #include "G4ios.hh"
 51 #include "globals.hh"
 52 
 53 #include <map>
 54 
 55 class G4UImessenger;
 56 class G4ParticleMessenger;
 57 class G4IonTable;
 58 
 59 class G4ParticleTable
 60 {
 61   public:
 62     using G4PTblDictionary = G4ParticleTableIterator<G4String, G4ParticleDefinition*>::Map;
 63     using G4PTblDicIterator = G4ParticleTableIterator<G4String, G4ParticleDefinition*>;
 64     using G4PTblEncodingDictionary = G4ParticleTableIterator<G4int, G4ParticleDefinition*>::Map;
 65     using G4PTblEncodingDicIterator = G4ParticleTableIterator<G4int, G4ParticleDefinition*>;
 66 
 67     virtual ~G4ParticleTable();
 68 
 69     // Copy constructor and assignment operator not allowed
 70     G4ParticleTable(const G4ParticleTable&) = delete;
 71     G4ParticleTable& operator=(const G4ParticleTable&) = delete;
 72 
 73     // This method is similar to the constructor. It is used by each worker
 74     // thread to achieve the partial effect as that of the master thread
 75     void WorkerG4ParticleTable();
 76 
 77     // This method is similar to the destructor. It is used by each worker
 78     // thread to achieve the partial effect as that of the master thread
 79     void DestroyWorkerG4ParticleTable();
 80 
 81     // Return the pointer to the G4ParticleTable object
 82     // G4ParticleTable is a "singleton" and can get its pointer by this
 83     // function. At the first time of calling this function, the
 84     // G4ParticleTable object is instantiated
 85     static G4ParticleTable* GetParticleTable();
 86 
 87     // Returns TRUE if the ParticleTable contains the particle's pointer
 88     inline G4bool contains(const G4ParticleDefinition* particle) const;
 89     G4bool contains(const G4String& particle_name) const;
 90 
 91     // Returns the number of particles in the ParticleTable
 92     G4int entries() const;
 93     G4int size() const;
 94 
 95     // Returns a pointer to the i-th particle in the ParticleTable
 96     // 0 <= index < entries()
 97     G4ParticleDefinition* GetParticle(G4int index) const;
 98 
 99     // Returns the name of i-th particle in the ParticleTable
100     const G4String& GetParticleName(G4int index) const;
101 
102     // Returns a pointer to the particle (0 if not contained)
103     G4ParticleDefinition* FindParticle(G4int PDGEncoding);
104     G4ParticleDefinition* FindParticle(const G4String& particle_name);
105     G4ParticleDefinition* FindParticle(const G4ParticleDefinition* particle);
106 
107     // Returns a pointer to its anti-particle (0 if not contained)
108     inline G4ParticleDefinition* FindAntiParticle(G4int PDGEncoding);
109     inline G4ParticleDefinition* FindAntiParticle(const G4String& p_name);
110     inline G4ParticleDefinition* FindAntiParticle(const G4ParticleDefinition* p);
111 
112     // Returns the pointer to the Iterator
113     G4PTblDicIterator* GetIterator() const;
114 
115     // Dumps information of particles specified by name
116     void DumpTable(const G4String& particle_name = "ALL");
117 
118     // Returns the pointer to the G4IonTable object
119     G4IonTable* GetIonTable() const;
120 
121     // Inserts the particle into ParticleTable.
122     // Returned value is the same as particle if successfully inserted
123     //   or the pointer to another G4ParticleDefinition object
124     //      which has same particle name
125     //   or nullptr if failing to insert by other reason
126     G4ParticleDefinition* Insert(G4ParticleDefinition* particle);
127 
128     // Removes the particle from the table (not delete)
129     G4ParticleDefinition* Remove(G4ParticleDefinition* particle);
130 
131     // Removes all particles from G4ParticleTable
132     void RemoveAllParticles();
133 
134     // Removes and deletes all particles from G4ParticleTable
135     void DeleteAllParticles();
136 
137     // Creates messenger
138     G4UImessenger* CreateMessenger();
139 
140     void SelectParticle(const G4String& name);
141 
142     inline const G4ParticleDefinition* GetSelectedParticle() const;
143 
144     inline void SetVerboseLevel(G4int value);
145     inline G4int GetVerboseLevel() const;
146 
147     inline void SetReadiness(G4bool val = true);
148     inline G4bool GetReadiness() const;
149 
150     inline G4ParticleDefinition* GetGenericIon() const;
151     inline void SetGenericIon(G4ParticleDefinition*);
152 
153     inline G4ParticleDefinition* GetGenericMuonicAtom() const;
154     inline void SetGenericMuonicAtom(G4ParticleDefinition*);
155 
156     // Public data ----------------------------------------------------
157 
158     // These fields should be thread local or thread private. For a singleton
159     // class, we can change any member field as static without any problem
160     // because there is only one instance. Then we are allowed to add
161     // "G4ThreadLocal"
162     G4ParticleMessenger* fParticleMessenger = nullptr;
163     static G4ThreadLocal G4PTblDictionary* fDictionary;
164     static G4ThreadLocal G4PTblDicIterator* fIterator;
165     static G4ThreadLocal G4PTblEncodingDictionary* fEncodingDictionary;
166 
167     // Particle table is being shared
168     static G4ParticleTable* fgParticleTable;
169 
170     // This field should be thread private. However, we have to keep one copy
171     // of the ion table pointer. So we change all important fields of
172     // G4IonTable to be thread local
173     G4IonTable* fIonTable = nullptr;
174 
175     // These shadow pointers are used by each worker thread to copy the content
176     // from the master thread
177     //
178     static G4PTblDictionary* fDictionaryShadow;
179     static G4PTblDicIterator* fIteratorShadow;
180     static G4PTblEncodingDictionary* fEncodingDictionaryShadow;
181 
182 #ifdef G4MULTITHREADED
183     // Shared instance of a mutex
184     static G4GLOB_DLL G4Mutex& particleTableMutex();
185     static G4GLOB_DLL G4int& lockCount();
186 #endif
187 
188   protected:
189     const G4PTblDictionary* GetDictionary() const;
190 
191     // Returns key value of the particle (i.e. particle name)
192     inline const G4String& GetKey(const G4ParticleDefinition* particle) const;
193 
194     // Returns the pointer to EncodingDictionary
195     const G4PTblEncodingDictionary* GetEncodingDictionary() const;
196 
197   private:
198     // Provate default constructor
199     G4ParticleTable();
200 
201     void CheckReadiness() const;
202 
203     // Private data ---------------------------------------------------
204 
205     G4ParticleDefinition* genericIon = nullptr;
206     G4ParticleDefinition* genericMuonicAtom = nullptr;
207     const G4ParticleDefinition* selectedParticle = nullptr;
208 
209     const G4String noName = " ";
210     G4String selectedName = "undefined";
211 
212     // Control flag for output message
213     //  0: Silent
214     //  1: Warning message
215     //  2: More
216     G4int verboseLevel = 1;
217 
218     G4bool readyToUse = false;
219 };
220 
221 #include "G4ParticleTable.icc"
222 
223 #endif
224