Geant4 Cross Reference |
>> 1 // This code implementation is the intellectual property of >> 2 // the GEANT4 collaboration. 1 // 3 // 2 // ******************************************* << 4 // By copying, distributing or modifying the Program (or any work 3 // * License and Disclaimer << 5 // based on the Program) you indicate your acceptance of this statement, 4 // * << 6 // and all its terms. 5 // * The Geant4 software is copyright of th << 7 // 6 // * the Geant4 Collaboration. It is provided << 8 // $Id: G4VUserPhysicsList.hh,v 1.5 1999/11/07 13:11:49 kurasige Exp $ 7 // * conditions of the Geant4 Software License << 9 // GEANT4 tag $Name: geant4-01-00 $ 8 // * LICENSE and available at http://cern.ch/ << 10 // 9 // * include a list of copyright holders. << 11 // 10 // * << 12 // ------------------------------------------------------------ 11 // * Neither the authors of this software syst << 13 // GEANT 4 class header file 12 // * institutes,nor the agencies providing fin << 14 // Class Description: 13 // * work make any representation or warran << 15 // This class is an abstruct class for 14 // * regarding this software system or assum << 16 // constructing particles and processes. 15 // * use. Please see the license in the file << 17 // User must implement following four virtual methods 16 // * for the full disclaimer and the limitatio << 18 // in his own concrete class derived from this class. 17 // * << 19 // G4VUserPhysicsList::ConstructParticle() 18 // * This code implementation is the result << 20 // Construct particles 19 // * technical work of the GEANT4 collaboratio << 21 // G4VUserPhysicsList::constructPhysics() 20 // * By using, copying, modifying or distri << 22 // Construct procesess and register them to particles 21 // * any work based on the software) you ag << 23 // G4VUserPhysicsList::SetCuts() 22 // * use in resulting scientific publicati << 24 // set cut values in range to all particles 23 // * acceptance of all terms of the Geant4 Sof << 25 // (and rebuilding physics table will be invoked ) 24 // ******************************************* << 26 // 25 // << 27 // ------------------------------------------- 26 // G4VUserPhysicsList << 28 // History 27 // << 29 // first version 09 Jan. 1998 by H.Kurashige 28 // Class description: << 30 // modified 24 Jan. 1998 by H.Kurashige 29 // << 31 // rename DumpCutValues/DumpCutValuesTable 30 // This class is an abstract class for constru << 32 // change SetCuts method 31 // User must implement the following two pure << 33 // add SetCutsWithDefault method 32 // class derived from this class: << 34 // modified 06 June 1998 by H.Kurashige 33 // - G4VUserPhysicsList::ConstructParticle() << 35 // add AddProcessManager 34 // Construct particles << 36 // add BuildPhysicsTable 35 // - G4VUserPhysicsList::ConstructProcess() << 37 // modified 29 June 1998 by H.Kurashige 36 // Construct procesess and register them t << 38 // add AddProcessManager 37 << 39 // modified 05 Dec. 1998 by H.Kurashige 38 // Original author: H.Kurashige (Kobe Universi << 40 // add ConstructAllParticles() 39 // ------------------------------------------- << 41 // modified 14, Apr 1999 by H.Kurashige 40 #ifndef G4VUserPhysicsList_hh << 42 // change BuildPhysicsTable as public 41 #define G4VUserPhysicsList_hh 1 << 43 // removed ConstructAllParticles() and related methods 42 << 44 // changed SetCuts method argument 43 #include "G4ParticleDefinition.hh" << 45 // ------------------------------------------------------------ 44 #include "G4ParticleTable.hh" << 46 #ifndef G4VUserPhysicsList_h 45 #include "G4PhysicsModelCatalog.hh" << 47 #define G4VUserPhysicsList_h 1 46 #include "G4ProductionCutsTable.hh" << 47 #include "G4Threading.hh" << 48 #include "G4VUPLSplitter.hh" << 49 #include "G4ios.hh" << 50 #include "globals.hh" 48 #include "globals.hh" >> 49 #include "G4ios.hh" 51 50 52 #include "rundefs.hh" << 51 #include "G4ParticleTable.hh" 53 #include "tls.hh" << 52 #include "G4ParticleDefinition.hh" 54 53 55 class G4UserPhysicsListMessenger; 54 class G4UserPhysicsListMessenger; 56 class G4PhysicsListHelper; << 57 class G4VProcess; << 58 << 59 // Encapsulate the fields of class G4VUserPhys << 60 class G4VUPLData << 61 { << 62 public: << 63 void initialize(); << 64 << 65 G4ParticleTable::G4PTblDicIterator* _thePa << 66 G4UserPhysicsListMessenger* _theMessenger << 67 G4PhysicsListHelper* _thePLHelper = nullpt << 68 G4bool _fIsPhysicsTableBuilt = false; << 69 G4int _fDisplayThreshold = 0; << 70 }; << 71 << 72 // The type G4VUPLManager is introduced to enc << 73 // both the master thread and worker threads t << 74 // the fields encapsulated by the class G4VUPL << 75 // changes the value for these fields, it refe << 76 // definition defined below. For every G4VUser << 77 // there is a corresponding G4VUPLData instanc << 78 // are organized by the class G4VUPLManager as << 79 // The field "int g4vuplInstanceID" is added t << 80 // The value of this field in each G4VUserPhys << 81 // subscript of the corresponding G44VUPLData << 82 // In order to use the class G44VUPLManager, w << 83 // G4VUserPhysicsList as follows: "static G4VU << 84 // Both the master thread and worker threads c << 85 // for G44VUPLData instances mutually along wi << 86 // instances are created. For each worker thre << 87 // Consider any thread A, if there is any othe << 88 // This ion is shared by the thread A. So the << 89 // in the array of G4PDefData instances for th << 90 // << 91 // Important Note: you may wonder why we are i << 92 // since there is only one PL << 93 // This is true, in the sense << 94 // to be associated to a G4Run << 95 // instantiate as many PLs are << 96 // of the PLs to be used we th << 97 // guarantee that the system w << 98 // this (unusual) case. This m << 99 // << 100 using G4VUPLManager = G4VUPLSplitter<G4VUPLDat << 101 using G4VUserPhysicsListSubInstanceManager = G << 102 55 103 class G4VUserPhysicsList 56 class G4VUserPhysicsList 104 { 57 { 105 public: << 58 public: 106 G4VUserPhysicsList(); 59 G4VUserPhysicsList(); 107 virtual ~G4VUserPhysicsList(); 60 virtual ~G4VUserPhysicsList(); 108 G4VUserPhysicsList(const G4VUserPhysicsLis << 109 G4VUserPhysicsList& operator=(const G4VUse << 110 << 111 // Each particle type will be instantiated << 112 // This method is invoked by the RunManger << 113 virtual void ConstructParticle() = 0; << 114 61 115 // By calling the "Construct" method, << 62 public: // with description 116 // process manager and processes are creat << 63 // By calling the "Construct" method, >> 64 // particles and processes are created 117 void Construct(); 65 void Construct(); >> 66 118 67 119 // Each physics process will be instantiat << 68 protected: // with description 120 // registered to the process manager of ea << 69 // These two methods of ConstructParticle() and ConstructProcess() 121 // Invoked in the Construct() method. << 70 // will be invoked in the Construct() method. >> 71 >> 72 // each particle type will be instantiated >> 73 virtual void ConstructParticle() = 0; >> 74 >> 75 // each physics process will be instantiated and >> 76 // registered to the process manager of each particle type 122 virtual void ConstructProcess() = 0; 77 virtual void ConstructProcess() = 0; 123 78 124 // Sets a cut value for all particle types << 79 protected: // with description 125 virtual void SetCuts(); << 80 // User must invoke this method in his ConstructProcess() >> 81 // implementation in order to insures particle transportation. >> 82 // !! Caution: this class must not be overriden !! >> 83 void AddTransportation(); 126 84 127 // Set/get the default cut value. Calling << 85 ///////////////////////////////////// 128 // re-calcuration of cut values and physic << 86 public: 129 // next event loop. << 87 // "SetCuts" method sets a cut value for all particle types 130 void SetDefaultCutValue(G4double newCutVal << 88 // in the particle table >> 89 virtual void SetCuts() = 0; >> 90 >> 91 protected: // with description >> 92 // "SetCutsWithDefault" method sets a cut value with the default >> 93 // cut values for all particle types in the particle table >> 94 void SetCutsWithDefault(); >> 95 >> 96 public: // with description >> 97 // >> 98 void BuildPhysicsTable(G4ParticleDefinition* ); >> 99 >> 100 protected: // with description >> 101 // Following are utility methods for SetCuts/reCalcCuts >> 102 >> 103 // Reset cut values in energy for all particle types >> 104 // By calling this methods, the run manager will invoke >> 105 // SetCuts() just before event loop >> 106 void ResetCuts(); >> 107 >> 108 // SetCutValue sets a cut value for a particle type >> 109 void SetCutValue(G4double aCut, const G4String& name); >> 110 void ReCalcCutValue(const G4String& name); >> 111 >> 112 // "setCutsForOthers" method sets a cut value to all particle types >> 113 // which have not be called SetCuts() methods yet. >> 114 // (i.e. particles which have no definit cut values) >> 115 void SetCutValueForOthers(G4double cutValue); >> 116 >> 117 // "setCutsForOtherThan" sets a cut value to all particle types >> 118 // other than particle types specified in arguments >> 119 void SetCutValueForOtherThan(G4double cutValue, >> 120 G4ParticleDefinition* first, >> 121 G4ParticleDefinition* second = NULL, >> 122 G4ParticleDefinition* third = NULL, >> 123 G4ParticleDefinition* fourth = NULL, >> 124 G4ParticleDefinition* fifth = NULL, >> 125 G4ParticleDefinition* sixth = NULL, >> 126 G4ParticleDefinition* seventh = NULL, >> 127 G4ParticleDefinition* eighth = NULL, >> 128 G4ParticleDefinition* nineth = NULL, >> 129 G4ParticleDefinition* tenth = NULL ); >> 130 >> 131 // "reCalcCutsForOthers" method re-calculates a cut value >> 132 // to all particle types which have not be called SetCuts() methods yet. >> 133 void ReCalcCutValueForOthers(); >> 134 >> 135 public: // with description >> 136 // set/get the default cut value >> 137 // Calling SetDefaultCutValue causes re-calcuration of cut values >> 138 // and physics tables just before the next event loop >> 139 void SetDefaultCutValue(G4double newCutValue); 131 G4double GetDefaultCutValue() const; 140 G4double GetDefaultCutValue() const; 132 141 133 // Invoke BuildPhysicsTable for all proces << 142 protected: 134 // In case of "Retrieve" flag is ON, Physi << 143 // this is the default cut value for all particles 135 // retrieved from files. << 144 G4double defaultCutValue; 136 void BuildPhysicsTable(); << 137 << 138 // Prepare the PhysicsTable for specified << 139 void PreparePhysicsTable(G4ParticleDefinit << 140 << 141 // Build the PhysicsTable for specified pa << 142 void BuildPhysicsTable(G4ParticleDefinitio << 143 << 144 // Store PhysicsTable together with both m << 145 // information in files under the specifie << 146 // Returns "true" if files are successfull << 147 G4bool StorePhysicsTable(const G4String& d << 148 << 149 // Return true if "Retrieve" flag is ON. << 150 // (i.e. PhysicsTable will be retrieved fr << 151 G4bool IsPhysicsTableRetrieved() const; << 152 G4bool IsStoredInAscii() const; << 153 << 154 // Get directory path for physics table fi << 155 const G4String& GetPhysicsTableDirectory() << 156 << 157 // Set "Retrieve" flag. Directory path can << 158 // Null string (default) means directory i << 159 // from the current value. << 160 void SetPhysicsTableRetrieved(const G4Stri << 161 void SetStoredInAscii(); << 162 << 163 // Reset "Retrieve" flag. << 164 void ResetPhysicsTableRetrieved(); << 165 void ResetStoredInAscii(); << 166 145 167 // Print out the List of registered partic << 146 ///////////////////////////////////// >> 147 public: // with description >> 148 // Print out the List of registered particles types 168 void DumpList() const; 149 void DumpList() const; 169 150 170 // Request to print out information of cut << 151 public: // with description 171 // Printing will be performed when all tab << 152 // Print out information of cut values 172 void DumpCutValuesTable(G4int flag = 1); << 153 void DumpCutValuesTable() const; 173 << 154 void DumpCutValues(const G4String &particle_name = "ALL") const; 174 // Triggers the print-out requested by the << 155 void DumpCutValues(G4ParticleDefinition* ) const; 175 // This method must be invoked by RunManag << 156 176 void DumpCutValuesTableIfRequested(); << 157 protected: // with description 177 << 158 // adds new ProcessManager to all particles in the Particle Table 178 // Set/get control flag for output message << 159 // this routine is used in Construct() 179 // 0: Silent << 160 void InitializeProcessManager(); 180 // 1: Warning message << 181 // 2: More << 182 void SetVerboseLevel(G4int value); << 183 G4int GetVerboseLevel() const; << 184 << 185 void UseCoupledTransportation(G4bool vl = << 186 << 187 // Invokes default SetCuts() method. << 188 // Note: cut values will not be overwritte << 189 // Use of default SetCuts() method is reco << 190 void SetCutsWithDefault(); << 191 << 192 // Sets a cut value for a particle type fo << 193 void SetCutValue(G4double aCut, const G4St << 194 << 195 // Gets a cut value for a particle type fo << 196 G4double GetCutValue(const G4String& pname << 197 << 198 // Sets a cut value for a particle type fo << 199 void SetCutValue(G4double aCut, const G4St << 200 << 201 // Invoke SetCuts for specified particle f << 202 // If the pointer to the region is NULL, t << 203 // In case of "Retrieve" flag is ON, cut v << 204 // from files. << 205 void SetParticleCuts(G4double cut, G4Parti << 206 void SetParticleCuts(G4double cut, const G << 207 << 208 // Invoke SetCuts() for all particles in a << 209 void SetCutsForRegion(G4double aCut, const << 210 << 211 // Gets/sets the flag for ApplyCuts(). << 212 void SetApplyCuts(G4bool value, const G4St << 213 G4bool GetApplyCuts(const G4String& name) << 214 161 215 // Remove and delete ProcessManagers for a << 162 public: // with description 216 // Particle Table. << 163 // remove and delete ProcessManagers for all particles in tha Particle Table >> 164 // this routine is invoked from RunManager 217 void RemoveProcessManager(); 165 void RemoveProcessManager(); 218 166 219 // Remove and delete TrackingManagers for << 167 public: // with description 220 // Particle Table. << 168 // add process manager for particles created on-the-fly 221 void RemoveTrackingManager(); << 222 << 223 // Add process manager for particles creat << 224 void AddProcessManager(G4ParticleDefinitio 169 void AddProcessManager(G4ParticleDefinition* newParticle, 225 G4ProcessManager* n << 170 G4ProcessManager* newManager = NULL ); 226 << 171 227 // Check consistencies of list of particle << 228 void CheckParticleList(); << 229 << 230 void DisableCheckParticleList(); << 231 << 232 inline G4int GetInstanceID() const; << 233 static const G4VUPLManager& GetSubInstance << 234 << 235 // Used by Worker threads on the shared in << 236 // to initialise workers. Derived class re << 237 // must also call this base class method. << 238 virtual void InitializeWorker(); << 239 << 240 // Destroy thread-local data. Note that de << 241 // implementing this method should still c << 242 virtual void TerminateWorker(); << 243 << 244 protected: << 245 // User must invoke this method in his Con << 246 // implementation in order to enable parti << 247 void AddTransportation(); << 248 << 249 // Register a process to the particle type << 250 // according to the ordering parameter tab << 251 // 'true' is returned if the process is re << 252 G4bool RegisterProcess(G4VProcess* process << 253 << 254 // Build PhysicsTable for making the integ << 255 void BuildIntegralPhysicsTable(G4VProcess* << 256 << 257 // Retrieve PhysicsTable from files for pr << 258 // Normal BuildPhysics procedure of proces << 259 // fails (in case of process's RetrievePhy << 260 virtual void RetrievePhysicsTable(G4Partic << 261 G4bool a << 262 << 263 // Adds new ProcessManager to all particle << 264 // This function is used in Construct(). << 265 void InitializeProcessManager(); << 266 << 267 G4ParticleTable::G4PTblDicIterator* GetPar << 268 << 269 protected: 172 protected: 270 // The particle table has the complete Lis << 173 // the particle table has the complete List of existing particle types 271 G4ParticleTable* theParticleTable = nullpt << 174 G4ParticleTable* theParticleTable; 272 << 175 G4ParticleTable::G4PTblDicIterator* theParticleIterator; 273 G4int verboseLevel = 1; << 176 274 << 177 protected: 275 // Default cut value for all particles << 178 // pointer to G4UserPhysicsListMessenger 276 G4double defaultCutValue = 1.0; << 179 G4UserPhysicsListMessenger* theMessenger; 277 G4bool isSetDefaultCutValue = false; << 180 278 << 181 public: // with description 279 // Pointer to ProductionCutsTable. << 182 void SetVerboseLevel(G4int value); 280 G4ProductionCutsTable* fCutsTable = nullpt << 183 G4int GetVerboseLevel() const; 281 << 184 // set/get controle flag for output message 282 // Flag to determine if physics table will << 185 // 0: Silent 283 G4bool fRetrievePhysicsTable = false; << 186 // 1: Warning message 284 G4bool fStoredInAscii = true; << 187 // 2: More 285 << 286 G4bool fIsCheckedForRetrievePhysicsTable = << 287 G4bool fIsRestoredCutValues = false; << 288 << 289 // Directory name for physics table files. << 290 G4String directoryPhysicsTable = "."; << 291 188 292 // Flag for CheckParticleList(). << 189 protected: 293 G4bool fDisableCheckParticleList = false; << 190 G4int verboseLevel; 294 191 295 // MT data << 296 G4int g4vuplInstanceID = 0; << 297 G4RUN_DLL static G4VUPLManager subInstance << 298 }; 192 }; 299 193 300 // Inline methods implementations << 301 194 302 inline void G4VUserPhysicsList::Construct() 195 inline void G4VUserPhysicsList::Construct() 303 { 196 { 304 #ifdef G4VERBOSE << 197 if (verboseLevel >1) G4cout << "G4VUserPhysicsList::Construct()" << endl; 305 if (verboseLevel > 1) G4cout << "G4VUserPhys << 306 #endif << 307 198 308 if (G4Threading::IsMasterThread()) G4Physics << 199 if (verboseLevel >1) G4cout << "Construct particles " << endl; >> 200 ConstructParticle(); 309 201 310 InitializeProcessManager(); 202 InitializeProcessManager(); 311 203 312 #ifdef G4VERBOSE << 204 if (verboseLevel >1) G4cout << "Construct processes " << endl; 313 if (verboseLevel > 1) G4cout << "Construct p << 314 #endif << 315 ConstructProcess(); 205 ConstructProcess(); 316 } 206 } 317 207 318 inline G4double G4VUserPhysicsList::GetDefault 208 inline G4double G4VUserPhysicsList::GetDefaultCutValue() const 319 { 209 { 320 return defaultCutValue; 210 return defaultCutValue; 321 } 211 } 322 212 323 inline G4int G4VUserPhysicsList::GetVerboseLev << 213 inline void G4VUserPhysicsList::SetVerboseLevel(G4int value) 324 { << 325 return verboseLevel; << 326 } << 327 << 328 inline G4bool G4VUserPhysicsList::IsPhysicsTab << 329 { << 330 return fRetrievePhysicsTable; << 331 } << 332 << 333 inline G4bool G4VUserPhysicsList::IsStoredInAs << 334 { << 335 return fStoredInAscii; << 336 } << 337 << 338 inline const G4String& G4VUserPhysicsList::Get << 339 { << 340 return directoryPhysicsTable; << 341 } << 342 << 343 inline void G4VUserPhysicsList::SetStoredInAsc << 344 { << 345 fStoredInAscii = true; << 346 } << 347 << 348 inline void G4VUserPhysicsList::ResetPhysicsTa << 349 { << 350 fRetrievePhysicsTable = false; << 351 fIsRestoredCutValues = false; << 352 fIsCheckedForRetrievePhysicsTable = false; << 353 } << 354 << 355 inline void G4VUserPhysicsList::ResetStoredInA << 356 { << 357 fStoredInAscii = false; << 358 } << 359 << 360 inline void G4VUserPhysicsList::DisableCheckPa << 361 { << 362 fDisableCheckParticleList = true; << 363 } << 364 << 365 inline G4int G4VUserPhysicsList::GetInstanceID << 366 { 214 { 367 return g4vuplInstanceID; << 215 verboseLevel = value; >> 216 if (verboseLevel >1){ >> 217 G4cout << "G4VUserPhysicsList::SetVerboseLevel :"; >> 218 G4cout << " Verbose level is set to " << verboseLevel << endl; >> 219 } 368 } 220 } 369 221 370 inline const G4VUPLManager& G4VUserPhysicsList << 222 inline G4int G4VUserPhysicsList::GetVerboseLevel() const 371 { 223 { 372 return subInstanceManager; << 224 return verboseLevel; 373 } 225 } 374 226 375 #endif 227 #endif 376 228