Book For Appli Dev
Book For Appli Dev
Geant4 Collaboration
Table of Contents
1. Introduction .............................................................................................................................. 1 1.1. Scope of this manual ....................................................................................................... 1 1.2. How to use this manual ................................................................................................... 1 2. Getting Started with Geant4 - Running a Simple Example ................................................................ 2 2.1. How to Define the main() Program .................................................................................... 2 2.1.1. A Sample main() Method ................................................................................... 2 2.1.2. G4RunManager .................................................................................................... 2 2.1.3. User Initialization and Action Classes ...................................................................... 4 2.1.4. G4UImanager and UI CommandSubmission ............................................................. 4 2.1.5. G4cout and G4cerr ............................................................................................... 5 2.2. How to Define a Detector Geometry .................................................................................. 6 2.2.1. Basic Concepts .................................................................................................... 6 2.2.2. Create a Simple Volume ........................................................................................ 6 2.2.3. Choose a Solid .................................................................................................... 6 2.2.4. Create a Logical Volume ....................................................................................... 7 2.2.5. Place a Volume .................................................................................................... 7 2.2.6. Create a Physical Volume ...................................................................................... 7 2.2.7. Coordinate Systems and Rotations ........................................................................... 8 2.3. How to Specify Materials in the Detector ............................................................................ 8 2.3.1. General Considerations .......................................................................................... 8 2.3.2. Define a Simple Material ....................................................................................... 8 2.3.3. Define a Molecule ................................................................................................ 9 2.3.4. Define a Mixture by Fractional Mass ....................................................................... 9 2.3.5. Define a Material from the Geant4 Material Database ................................................. 9 2.3.6. Print Material Information ..................................................................................... 9 2.4. How to Specify Particles ................................................................................................ 10 2.4.1. Particle Definition ............................................................................................... 10 2.4.2. Range Cuts ........................................................................................................ 12 2.5. How to Specify Physics Processes .................................................................................... 13 2.5.1. Physics Processes ............................................................................................... 13 2.5.2. Managing Processes ............................................................................................ 14 2.5.3. Specifying Physics Processes ................................................................................ 14 2.6. How to Generate a Primary Event .................................................................................... 15 2.6.1. Generating Primary Events ................................................................................... 15 2.6.2. G4VPrimaryGenerator ......................................................................................... 17 2.7. How to Make an Executable Program ............................................................................... 18 2.7.1. Building ExampleN01 in a UNIX Environment ........................................................ 18 2.7.2. Building ExampleN01 in a Windows Environment .................................................... 18 2.8. How to Set Up an Interactive Session ............................................................................... 19 2.8.1. Introduction ....................................................................................................... 19 2.8.2. A Short Description of Available Interface Classes ................................................... 19 2.8.3. Building the Interface Libraries ............................................................................. 22 2.8.4. How to Use the Interface in Your Application .......................................................... 22 2.9. How to Execute a Program ............................................................................................. 23 2.9.1. Introduction ....................................................................................................... 23 2.9.2. 'Hard-coded' Batch Mode ..................................................................................... 23 2.9.3. Batch Mode with Macro File ................................................................................ 24 2.9.4. Interactive Mode Driven by Command Lines ........................................................... 25 2.9.5. General Case ..................................................................................................... 26 2.10. How to Visualize the Detector and Events ....................................................................... 28 2.10.1. Introduction ..................................................................................................... 28 2.10.2. Visualization Drivers ......................................................................................... 28 2.10.3. How to Incorporate Visualization Drivers into an Executable ..................................... 29 2.10.4. Writing the main() Method to Include Visualization ............................................. 29 2.10.5. Sample Visualization Sessions ............................................................................. 30
iii
Geant4 User's Guide for Application Developers 2.10.6. For More Information on Geant4 Visualization ....................................................... 30 3. Toolkit Fundamentals ............................................................................................................... 31 3.1. Class Categories and Domains ......................................................................................... 31 3.1.1. What is a class category? ..................................................................................... 31 3.1.2. Class categories in Geant4 .................................................................................... 31 3.2. Global Usage Classes .................................................................................................... 32 3.2.1. Signature of Geant4 classes .................................................................................. 33 3.2.2. The HEPRandom module in CLHEP ...................................................................... 33 3.2.3. The HEPNumerics module ................................................................................... 37 3.2.4. General management classes ................................................................................. 37 3.3. System of units ............................................................................................................. 39 3.3.1. Basic units ........................................................................................................ 39 3.3.2. Input your data ................................................................................................... 39 3.3.3. Output your data ................................................................................................ 40 3.3.4. Introduce new units ............................................................................................. 40 3.3.5. Print the list of units ........................................................................................... 41 3.4. Run ............................................................................................................................ 41 3.4.1. Basic concept of Run .......................................................................................... 41 3.4.2. Geant4 as a state machine .................................................................................... 42 3.4.3. User's hook for state change ................................................................................. 43 3.4.4. Customizing the Run Manager .............................................................................. 43 3.5. Event .......................................................................................................................... 46 3.5.1. Representation of an event ................................................................................... 46 3.5.2. Structure of an event ........................................................................................... 46 3.5.3. Mandates of G4EventManager .............................................................................. 46 3.5.4. Stacking mechanism ............................................................................................ 46 3.6. Event Generator Interface ............................................................................................... 47 3.6.1. Structure of a primary event ................................................................................. 47 3.6.2. Interface to a primary generator ............................................................................ 47 3.6.3. Event overlap using multiple generators .................................................................. 49 3.7. Event Biasing Techniques ............................................................................................... 49 3.7.1. Scoring, Geometrical Importance Sampling and Weight Roulette ................................. 49 3.7.2. Physics Based Biasing ......................................................................................... 56 3.7.3. Adjoint/Reverse Monte Carlo ................................................................................ 58 4. Detector Definition and Response ............................................................................................... 63 4.1. Geometry ..................................................................................................................... 63 4.1.1. Introduction ....................................................................................................... 63 4.1.2. Solids ............................................................................................................... 63 4.1.3. Logical Volumes ................................................................................................ 82 4.1.4. Physical Volumes ............................................................................................... 84 4.1.5. Touchables: Uniquely Identifying a Volume ............................................................ 93 4.1.6. Creating an Assembly of Volumes ......................................................................... 94 4.1.7. Reflecting Hierarchies of Volumes ......................................................................... 97 4.1.8. The Geometry Navigator ...................................................................................... 98 4.1.9. A Simple Geometry Editor ................................................................................. 104 4.1.10. Converting Geometries from Geant3.21 ............................................................... 106 4.1.11. Detecting Overlapping Volumes ......................................................................... 107 4.1.12. Dynamic Geometry Setups ................................................................................ 111 4.1.13. Importing XML Models Using GDML ................................................................ 112 4.1.14. Importing ASCII Text Models ........................................................................... 112 4.1.15. Saving geometry tree objects in binary format ...................................................... 112 4.2. Material ..................................................................................................................... 112 4.2.1. General considerations ....................................................................................... 112 4.2.2. Introduction to the Classes .................................................................................. 113 4.2.3. Recipes for Building Elements and Materials ......................................................... 114 4.2.4. The Tables ....................................................................................................... 116 4.3. Electromagnetic Field ................................................................................................... 117 4.3.1. An Overview of Propagation in a Field ................................................................. 117
iv
Geant4 User's Guide for Application Developers 4.3.2. Practical Aspects ............................................................................................... 4.3.3. Spin Tracking ................................................................................................... 4.4. Hits ........................................................................................................................... 4.4.1. Hit .................................................................................................................. 4.4.2. Sensitive detector .............................................................................................. 4.4.3. Readout geometry ............................................................................................. 4.4.4. G4SDManager .................................................................................................. 4.4.5. G4MultiFunctionalDetector and G4VPrimitiveScorer ............................................... 4.4.6. Concrete classes of G4VPrimitiveScorer ................................................................ 4.4.7. G4VSDFilter and its derived classes ..................................................................... 4.4.8. Scoring for Event Biasing ................................................................................... 4.5. Digitization ................................................................................................................ 4.5.1. Digi ................................................................................................................ 4.5.2. Digitizer module ............................................................................................... 4.6. Object Persistency ....................................................................................................... 4.6.1. Persistency in Geant4 ........................................................................................ 4.6.2. Using Reflex for persistency of Geant4 objects ....................................................... 4.7. Parallel Geometries ...................................................................................................... 4.7.1. A parallel world ................................................................................................ 4.7.2. Defining a parallel world .................................................................................... 4.7.3. Detector sensitivity in a parallel world .................................................................. 4.8. Command-based scoring ............................................................................................... 4.8.1. Introduction ..................................................................................................... 4.8.2. Defining a scoring mesh ..................................................................................... 4.8.3. Drawing scores ................................................................................................. 4.8.4. Writing scores to a file ...................................................................................... 5. Tracking and Physics .............................................................................................................. 5.1. Tracking .................................................................................................................... 5.1.1. Basic Concepts ................................................................................................. 5.1.2. Access to Track and Step Information ................................................................... 5.1.3. Handling of Secondary Particles .......................................................................... 5.1.4. User Actions .................................................................................................... 5.1.5. Verbose Outputs ............................................................................................... 5.1.6. Trajectory and Trajectory Point ........................................................................... 5.2. Physics Processes ........................................................................................................ 5.2.1. Electromagnetic Interactions ............................................................................... 5.2.2. Hadronic Interactions ......................................................................................... 5.2.3. Particle Decay Process ....................................................................................... 5.2.4. Photolepton-hadron Processes .............................................................................. 5.2.5. Optical Photon Processes .................................................................................... 5.2.6. Parameterization ............................................................................................... 5.2.7. Transportation Process ....................................................................................... 5.3. Particles ..................................................................................................................... 5.3.1. Basic concepts .................................................................................................. 5.3.2. Definition of a particle ....................................................................................... 5.3.3. Dynamic particle ............................................................................................... 5.4. Production Threshold versus Tracking Cut ....................................................................... 5.4.1. General considerations ....................................................................................... 5.4.2. Set production threshold (SetCut methods) .......................................................... 5.4.3. Apply cut ........................................................................................................ 5.4.4. Why produce secondaries below threshold? ........................................................... 5.4.5. Cuts in stopping range or in energy? .................................................................... 5.4.6. Summary ......................................................................................................... 5.4.7. Special tracking cuts .......................................................................................... 5.5. Cuts per Region .......................................................................................................... 5.5.1. General Concepts .............................................................................................. 5.5.2. Default Region ................................................................................................. 5.5.3. Assigning Production Cuts to a Region ................................................................. 118 123 124 124 126 126 128 129 131 133 133 134 134 135 136 136 136 137 137 137 138 139 139 139 140 141 142 142 142 143 145 145 145 145 146 149 158 163 165 165 173 179 180 180 180 183 184 184 184 184 185 185 185 185 186 186 187 187
Geant4 User's Guide for Application Developers 5.6. Physics Table ............................................................................................................. 187 5.6.1. General Concepts .............................................................................................. 187 5.6.2. Material-Cuts Couple ......................................................................................... 188 5.6.3. File I/O for the Physics Table ............................................................................. 188 5.6.4. Building the Physics Table ................................................................................. 188 5.7. User Limits ................................................................................................................ 188 5.7.1. General Concepts .............................................................................................. 188 5.7.2. Processes co-working with G4UserLimits .............................................................. 189 5.8. Track Error Propagation ............................................................................................... 189 5.8.1. Physics ............................................................................................................ 189 5.8.2. Trajectory state ................................................................................................. 190 5.8.3. Trajectory state error ......................................................................................... 191 5.8.4. Targets ............................................................................................................ 192 5.8.5. Managing the track propagation ........................................................................... 193 5.8.6. Limiting the step ............................................................................................... 194 6. User Actions ......................................................................................................................... 195 6.1. Mandatory User Actions and Initializations ...................................................................... 195 6.2. Optional User Actions .................................................................................................. 198 6.2.1. Usage of User Actions ....................................................................................... 198 6.2.2. Killing Tracks in User Actions and Energy Conservation .......................................... 202 6.3. User Information Classes .............................................................................................. 202 6.3.1. G4VUserEventInformation .................................................................................. 203 6.3.2. G4VUserTrackInformation .................................................................................. 203 6.3.3. G4VUserPrimaryVertexInformation and G4VUserPrimaryTrackInformation ................. 203 6.3.4. G4VUserRegionInformation ................................................................................ 204 7. Communication and Control .................................................................................................... 205 7.1. Built-in Commands ...................................................................................................... 205 7.2. User Interface - Defining New Commands ....................................................................... 205 7.2.1. G4UImessenger ................................................................................................ 205 7.2.2. G4UIcommand and its derived classes .................................................................. 206 7.2.3. An example messenger ...................................................................................... 210 7.2.4. How to control the output of G4cout/G4cerr .......................................................... 212 8. Visualization ......................................................................................................................... 214 8.1. Introduction to Visualization .......................................................................................... 214 8.1.1. What Can be Visualized ..................................................................................... 214 8.1.2. You have a Choice of Visualization Drivers ........................................................... 214 8.1.3. Choose the Driver that Meets Your Needs ............................................................. 215 8.1.4. Controlling Visualization .................................................................................... 216 8.1.5. Visualization Details .......................................................................................... 216 8.2. Adding Visualization to Your Executable ......................................................................... 217 8.2.1. Installing Visualization Drivers ............................................................................ 217 8.2.2. How to Realize Visualization Drivers in an Executable ............................................ 218 8.2.3. Visualization Manager ....................................................................................... 218 8.2.4. How to Write the main() Function .................................................................... 219 8.3. The Visualization Drivers ............................................................................................. 220 8.3.1. Availability of drivers on the supported systems ..................................................... 221 8.3.2. OpenGL .......................................................................................................... 221 8.3.3. Qt .................................................................................................................. 222 8.3.4. OpenInventor ................................................................................................... 223 8.3.5. HepRepFile ...................................................................................................... 223 8.3.6. HepRepXML .................................................................................................... 224 8.3.7. DAWN ........................................................................................................... 226 8.3.8. Remote Visualization with the DAWN-Network Driver ............................................ 226 8.3.9. VRML ............................................................................................................ 228 8.3.10. RayTracer ...................................................................................................... 229 8.3.11. gMocren ........................................................................................................ 230 8.3.12. Visualization of detector geometry tree ................................................................ 231 8.3.13. GAG Tree ...................................................................................................... 232
vi
Geant4 User's Guide for Application Developers 8.3.14. XML Tree ...................................................................................................... 8.4. Controlling Visualization from Commands ....................................................................... 8.4.1. Scene, scene handler, and viewer ......................................................................... 8.4.2. Create a scene handler and a viewer: /vis/open command .................................... 8.4.3. Create an empty scene: /vis/scene/create command ...................................... 8.4.4. Visualization of a physical volume: /vis/drawVolume command .......................... 8.4.5. Visualization of a logical volume: /vis/specify command .................................. 8.4.6. Visualization of trajectories: /vis/scene/add/trajectories command ............ 8.4.7. Visualization of hits: /vis/scene/add/hits command ..................................... 8.4.8. Visualization of Scored Data ............................................................................... 8.4.9. HepRep Attributes for Hits ................................................................................. 8.4.10. Basic camera workings: /vis/viewer/ commands ............................................ 8.4.11. Declare the end of visualization for flushing: /vis/viewer/flush command ........ 8.4.12. End of Event Action and End of Run Action: /vis/viewer/ endOfEventAction and /vis/viewer/endOfRunAction commands ..................... 8.4.13. HepRep Attributes for Trajectories ..................................................................... 8.4.14. How to save a visualized views to PostScript files ................................................. 8.4.15. Culling .......................................................................................................... 8.4.16. Cut view ........................................................................................................ 8.5. Controlling Visualization from Compiled Code ................................................................. 8.5.1. G4VVisManager ............................................................................................... 8.5.2. Visualization of detector components .................................................................... 8.5.3. Visualization of trajectories ................................................................................. 8.5.4. Enhanced trajectory drawing ............................................................................... 8.5.5. HepRep Attributes for Trajectories ....................................................................... 8.5.6. Visualization of hits .......................................................................................... 8.5.7. HepRep Attributes for Hits ................................................................................. 8.5.8. Visualization of text .......................................................................................... 8.5.9. Visualization of polylines and tracking steps .......................................................... 8.5.10. Visualization User Action ................................................................................. 8.5.11. Standalone Visualization ................................................................................... 8.6. Visualization Attributes ................................................................................................ 8.6.1. Visibility ......................................................................................................... 8.6.2. Colour ............................................................................................................. 8.6.3. Forcing attributes .............................................................................................. 8.6.4. Other attributes ................................................................................................. 8.6.5. Constructors of G4VisAttributes .......................................................................... 8.6.6. How to assign G4VisAttributes to a logical volume ................................................. 8.6.7. Additional User-Defined Attributes ...................................................................... 8.7. Enhanced Trajectory Drawing ........................................................................................ 8.7.1. Default Configuration ........................................................................................ 8.7.2. Trajectory Drawing Models ................................................................................ 8.7.3. Controlling from Commands ............................................................................... 8.7.4. Controlling from Compiled Code ......................................................................... 8.7.5. Drawing by time ............................................................................................... 8.8. Trajectory Filtering ...................................................................................................... 8.8.1. Controlling from Commands ............................................................................... 8.8.2. Example commands ........................................................................................... 8.8.3. Hit Filtering ..................................................................................................... 8.9. Polylines, Markers and Text .......................................................................................... 8.9.1. Polylines ......................................................................................................... 8.9.2. Markers ........................................................................................................... 8.9.3. Text ................................................................................................................ 8.10. Making a Movie ........................................................................................................ 8.10.1. OGLX ........................................................................................................... 8.10.2. Qt ................................................................................................................. 8.10.3. DAWNFILE ................................................................................................... 8.10.4. RayTracerX .................................................................................................... 232 234 234 234 235 235 235 236 237 237 237 237 239 239 239 240 241 242 243 243 243 243 244 244 244 247 247 247 248 250 250 250 251 253 253 254 254 255 255 255 256 257 259 259 260 261 261 261 262 262 262 263 264 265 266 266 267
vii
Geant4 User's Guide for Application Developers 9. Examples .............................................................................................................................. 268 9.1. Novice Examples ......................................................................................................... 268 9.1.1. Novice Example Summary ................................................................................. 268 9.1.2. Example N01 ................................................................................................... 270 9.1.3. Example N02 ................................................................................................... 271 9.1.4. Example N03 ................................................................................................... 272 9.1.5. Example N04 ................................................................................................... 273 9.1.6. Example N05 ................................................................................................... 276 9.1.7. Example N06 ................................................................................................... 277 9.1.8. Example N07 ................................................................................................... 278 9.2. Extended Examples ...................................................................................................... 279 9.2.1. Extended Example Summary ............................................................................... 279 9.3. Advanced Examples ..................................................................................................... 282 9.3.1. Advanced Examples .......................................................................................... 282 FAQ. Frequentry Asked Questions ............................................................................................... 284 FAQ.1. Installation ............................................................................................................ 284 FAQ.2. Run Time Problems ................................................................................................ 285 FAQ.3. Geometry .............................................................................................................. 285 FAQ.4. Tracks and steps ..................................................................................................... 286 FAQ.5. Physics and cuts ..................................................................................................... 289 FAQ.6. Visualization .......................................................................................................... 290 FAQ.7. User Support Policy ................................................................................................ 290 Appendix ................................................................................................................................ 292 1. Tips for Program Compilation .......................................................................................... 292 1.1. Unix/Linux - g++ ................................................................................................ 292 1.2. Windows - MS Visual C++ ................................................................................... 292 1.3. MacOS-X - g++ .................................................................................................. 292 2. Histogramming .............................................................................................................. 293 2.1. JAS ................................................................................................................... 293 2.2. iAida ................................................................................................................. 293 2.3. Open Scientist Lab .............................................................................................. 293 2.4. rAIDA ............................................................................................................... 293 2.5. Examples ........................................................................................................... 293 3. CLHEP Foundation Library ............................................................................................. 293 4. C++ Standard Template Library ....................................................................................... 294 5. Makefiles and Environment Variables ................................................................................ 294 5.1. The GNUmake system in Geant4 ........................................................................... 294 5.2. Environment variables .......................................................................................... 295 5.3. Linking External Libraries with Geant4 ................................................................... 299 6. Step-by-Step Installation Guides ....................................................................................... 301 6.1. Building on MS Visual C++ .................................................................................. 301 7. Development and debug tools .......................................................................................... 301 7.1. UNIX ................................................................................................................ 301 8. Python Interface ............................................................................................................ 302 8.1. Installation ......................................................................................................... 302 8.2. Using Geant4Py .................................................................................................. 303 8.3. Site-modules ....................................................................................................... 304 8.4. Examples ........................................................................................................... 305 9. Geant4 Material Database ................................................................................................ 306 9.1. Pure Materials ..................................................................................................... 306 9.2. NIST Compounds ................................................................................................ 307 9.3. HEP Materials .................................................................................................... 318 Bibliography ............................................................................................................................ 319
viii
Chapter 1. Introduction
1.1. Scope of this manual
The User's Guide for Application Developers is the first manual the reader should consult when learning about Geant4 or developing a Geant4-based detector simulation program. This manual is designed to: introduce the first-time user to the Geant4 object-oriented detector simulation toolkit, provide a description of the available tools and how to use them, and supply the practical information required to develop and run simulation applications which may be used in real experiments. This manual is intended to be an overview of the toolkit, rather than an exhaustive treatment of it. Related physics discussions are not included unless required for the description of a particular tool. Detailed discussions of the physics included in Geant4 can be found in the Physics Reference Manual. Details of the design and functionality of the Geant4 classes can be found in the User's Guide for Toolkit Developers, and a complete list of all Geant4 classes is given in the Software Reference Manual. Geant4 is a completely new detector simulation toolkit written in the C++ language. The reader is assumed to have a basic knowledge of object-oriented programming using C++. No knowledge of earlier FORTRAN versions of Geant is required. Although Geant4 is a fairly complicated software system, only a relatively small part of it needs to be understood in order to begin developing detector simulation applications.
The main() method is implemented by two toolkit classes, G4RunManager and G4UImanager, and three classes, ExN01DetectorConstruction, ExN01PhysicsList and ExN01PrimaryGeneratorAction, which are derived from toolkit classes. Each of these are explained in the following sections.
2.1.2. G4RunManager
The first thing main() must do is create an instance of the G4RunManager class. This is the only manager class in the Geant4 kernel which should be explicitly constructed in the user's main(). It controls the flow of the program and manages the event loop(s) within a run. When G4RunManager is created, the other major manager classes are also created. They are deleted automatically when G4RunManager is deleted. The run manager is also responsible for managing initialization procedures, including methods in the user initialization classes. Through these the run manager must be given all the information necessary to build and run the simulation, including
Getting Started with Geant4 - Running a Simple Example 1. 2. 3. 4. how the detector should be constructed, all the particles and all the physics processes to be simulated, how the primary particle(s) in an event should be produced and any additional requirements of the simulation.
create objects which specify the detector geometry and physics processes, respectively, and pass their pointers to the run manager. ExN01DetectorConstruction is an example of a user initialization class which is derived from G4VUserDetectorConstruction. This is where the user describes the entire detector setup, including its geometry, the materials used in its construction, a definition of its sensitive regions and the readout schemes of the sensitive regions.
Similarly ExN01PhysicsList is derived from G4VUserPhysicsList and requires the user to define the particles to be used in the simulation, the range cuts for these particles and all the physics processes to be simulated. The next instruction in main()
runManager->SetUserAction(new ExN01PrimaryGeneratorAction);
creates an instance of a particle generator and passes its pointer to the run manager. ExN01PrimaryGeneratorAction is an example of a user action class which is derived from G4VUserPrimaryGeneratorAction. In this class the user must describe the initial state of the primary event. This class has a public virtual method named generatePrimaries() which will be invoked at the beginning of each event. Details will be given in Section 2.6. Note that Geant4 does not provide any default behavior for generating a primary event. The next instruction
runManager->Initialize();
performs the detector construction, creates the physics processes, calculates cross sections and otherwise sets up the run. The final run manager method in main()
begins a run of three sequentially processed events. The beamOn() method may be invoked any number of times within main() with each invocation representing a separate run. Once a run has begun neither the detector setup nor the physics processes may be changed. They may be changed between runs, however, as described in Section 3.4.4. More information on G4RunManager in general is found in Section 3.4.
Getting Started with Geant4 - Running a Simple Example As mentioned above, other manager classes are created when the run manager is created. One of these is the user interface manager, G4UImanager. In main() a pointer to the interface manager must be obtained
G4UImanager* UI = G4UImanager::getUIpointer();
in order for the user to issue commands to the program. In the present example the applyCommand() method is called three times to direct the program to print out information at the run, event and tracking levels of simulation. A wide range of commands is available which allows the user detailed control of the simulation. A list of these commands can be found in Section 7.1.
There are several virtual methods in each of these classes which allow the specification of additional procedures at all levels of the simulation application. Details of the user initialization and action classes are provided in Chapter 6.
Example 2.2. An example of main() using interactive terminal and visualization. Code modified from the previous example are shown in blue.
#include #include #include #include #include #include #include #include #include #include "G4RunManager.hh" "G4UImanager.hh" "G4UIExecutive.hh" "G4VisExecutive.hh" "N02DetectorConstruction.hh" "N02PhysicsList.hh" "N02PrimaryGeneratorAction.hh" "N02RunAction.hh" "N02EventAction.hh" "N02SteppingAction.hh"
#include "g4templates.hh" int main(int argc,char** argv) { // construct the default run manager G4RunManager * runManager = new G4RunManager; // set mandatory initialization classes N02DetectorConstruction* detector = new N02DetectorConstruction; runManager->SetUserInitialization(detector); runManager->SetUserInitialization(new N02PhysicsList); // visualization manager G4VisManager* visManager = new G4VisExecutive; visManager->Initialize(); // set user action classes runManager->SetUserAction(new runManager->SetUserAction(new runManager->SetUserAction(new runManager->SetUserAction(new
// get the pointer to the User Interface manager G4UImanager* UImanager = G4UImanager::GetUIpointer();
if(argc==1) // Define (G)UI terminal for interactive mode { G4UIExecutive * ui = new G4UIExecutive(argc,argv); UImanager->ApplyCommand("/control/execute prerun.g4mac"); ui->sessionStart(); delete ui; } else // Batch mode { G4String command = "/control/execute "; G4String fileName = argv[1]; UImanager->ApplyCommand(command+fileName); }
This creates a box named "expHall_box" with extent from -3.0 meters to +3.0 meters along the X axis, from -1.0 to 1.0 meters in Y, and from -1.0 to 1.0 meters in Z. It is also very simple to create a cylinder. To do this, you can use the G4Tubs class.
This creates a full cylinder, named "tracker_tube", of radius 60 centimeters and length 50 cm.
This logical volume is named "expHall_log". Similarly we create a logical volume with the cylindrical solid filled with aluminium
G4LogicalVolume* tracker_log = new G4LogicalVolume(tracker_tube,Al,"tracker_log");
This places the logical volume tracker_log at the origin of the mother volume experimentalHall_log, shifted by one meter along X and unrotated. The resulting physical volume is named "tracker" and has a copy number of 0.
Getting Started with Geant4 - Running a Simple Example An exception exists to the rule that a physical volume must be placed inside a mother volume. That exception is for the World volume, which is the largest volume created, and which contains all other volumes. This volume obviously cannot be contained in any other. Instead, it must be created as a G4PVPlacement with a null mother pointer. It also must be unrotated, and it must be placed at the origin of the global coordinate system. Generally, it is best to choose a simple solid as the World volume, and in Example N01, we use the experimental hall:
The G4Material class describes the macroscopic properties of matter: density, state, temperature, pressure, as well as macroscopic quantities like radiation length, mean free path, dE/dx, etc.
The G4Material class is the one which is visible to the rest of the toolkit, and is used by the tracking, the geometry, and the physics. It contains all the information relative to the eventual elements and isotopes of which it is made, at the same time hiding the implementation details.
The pointer to the material, lAr, will be used to specify the matter of which a given logical volume is made:
G4LogicalVolume* myLbox = new G4LogicalVolume(aBox,lAr,"Lbox",0,0,0);
density = 1.000*g/cm3; G4Material* H2O = new G4Material(name="Water",density,ncomponents=2); H2O->AddElement(elH, natoms=2); H2O->AddElement(elO, natoms=1);
Example 2.9. Creating air by defining the fractional mass of its components.
a = 14.01*g/mole; G4Element* elN = new G4Element(name="Nitrogen",symbol="N" , z= 7., a); a = 16.00*g/mole; G4Element* elO = new G4Element(name="Oxygen"
density = 1.290*mg/cm3; G4Material* Air = new G4Material(name="Air ",density,ncomponents=2); Air->AddElement(elN, fractionmass=70*perCent); Air->AddElement(elO, fractionmass=30*perCent);
Example 2.10. Defining air and water from the internal Geant4 database.
G4NistManager* man = G4NistManager::Instance(); G4Material* H2O G4Material* Air = man->FindOrBuildMaterial("G4_WATER"); = man->FindOrBuildMaterial("G4_AIR");
Getting Started with Geant4 - Running a Simple Example In examples/novice/N03/N03DetectorConstruction.cc, you will find examples of all possible ways to build a material.
// construction of particles // construct processes and register them to particles // setting a range cut value for all particles
This section provides some simple examples of the ConstructParticle() and SetCuts() methods. For information on ConstructProcess() methods, please see Section 2.5.
Each particle is represented by its own class, which is derived from G4ParticleDefinition. (Exception: G4Ions represents all heavy nuclei. Please see Section 5.3.) Particles are organized into six major categories: lepton, meson, baryon, boson, shortlived and ion,
each of which is defined in a corresponding sub-directory under geant4/source/particles. There is also a corresponding granular library for each particle category.
10
Getting Started with Geant4 - Running a Simple Example More than 100 types of particles are provided by default, to be used in various physics processes. In normal applications, users will not need to define their own particles. The unique object for each particle class is created when its static method to get the pointer is called at the first time. Because particles are dynamic objects and should be instantiated before initialization of physics processes, you must explicitly invoke static methods of all particle classes required by your program at the initialization step. (NOTE: The particle object was static and created automatically before 8.0 release)
and
the
static
method
As for heavy ions (including hyper-nuclei), objects are created dynamically by requests from users and processes. The G4ParticleTable class provides methods to create ions, such as:
G4ParticleDefinition* GetIon( G4int atomicNumber, G4int atomicMass, G4double excitationEnergy);
Particles are registered automatically during construction. The user has no control over particle registration.
Due to the large number of pre-defined particles in Geant4, it is cumbersome to list all the particles by this method. If you want all the particles in a Geant4 particle category, there are six utility classes, corresponding to each of the particle categories, which perform this function: G4BosonConstructor G4LeptonConstructor G4MesonConstructor G4BarionConstructor G4IonConstructor G4ShortlivedConstructor.
11
Example 2.14. Set cut values by using the default cut value.
void ExN04PhysicsList::SetCuts() { // the G4VUserPhysicsList::SetCutsWithDefault() method sets // the default cut value for all particle types SetCutsWithDefault(); }
The defaultCutValue is set to 1.0 mm by default. Of course, you can set the new default cut value in the constructor of your physics list class as shown below.
12
Getting Started with Geant4 - Running a Simple Example The SetDefaultCutValue() method in G4VUserPhysicsList may also be used, and the "/run/setCut" command may be used to change the default cut value interactively. You can set different cut values in range for different particle types. The "/run/setCutForAGivenParticle" command may be used interactively. WARNING: DO NOT change cut values inside the event loop. Cut values may however be changed between runs. An example implementation of SetCuts() is shown below:
Beginning with Geant4 version 5.1, it is now possible to set production thresholds for each geometrical region. This new functionality is described in Section 5.5.
All physics processes are derived from the G4VProcess base class. Its virtual methods AtRestDoIt, AlongStepDoIt, and PostStepDoIt and the corresponding methods AtRestGetPhysicalInteractionLength, AlongStepGetPhysicalInteractionLength, and PostStepGetPhysicalInteractionLength describe the behavior of a physics process when they are implemented in a derived class. The details of these methods are described in Section 5.2. The following are specialized base classes to be used for simple processes: G4VAtRestProcess Processes with only AtRestDoIt
13
Getting Started with Geant4 - Running a Simple Example G4VContinuousProcess Processes with only AlongStepDoIt G4VDiscreteProcess processes with only PostStepDoIt Another 4 virtual classes, such as G4VContinuousDiscreteProcess, are provided for complex processes.
Here, the AddTransportation() method is provided in the G4VUserPhysicsList class to register the G4Transportation class with all particle classes. The G4Transportation class (and/or related classes) describes the particle motion in space and time. It is the mandatory process for tracking particles. In the ConstructProcess() method, physics processes should be created and registered with each particle's instance of G4ProcessManager. An example of process registration is given in the G4VUserPhysicsList::AddTransportation() method. Registration in G4ProcessManager is a complex procedure for other processes and particles because the relations between processes are crucial for some processes. Please see Section 5.2 and the example codes. An example of electromagnetic process registration for photons is shown below:
14
15
Example 2.19. An example of a G4VUserPrimaryGeneratorAction concrete class using G4ParticleGun. For the usage of G4ParticleGun refer to the next subsection.
#ifndef ExN01PrimaryGeneratorAction_h #define ExN01PrimaryGeneratorAction_h 1 #include "G4VUserPrimaryGeneratorAction.hh" class G4ParticleGun; class G4Event; class ExN01PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction { public: ExN01PrimaryGeneratorAction(); ~ExN01PrimaryGeneratorAction(); public: void generatePrimaries(G4Event* anEvent); private: G4ParticleGun* particleGun; }; #endif #include #include #include #include #include #include "ExN01PrimaryGeneratorAction.hh" "G4Event.hh" "G4ParticleGun.hh" "G4ThreeVector.hh" "G4Geantino.hh" "globals.hh"
ExN01PrimaryGeneratorAction::ExN01PrimaryGeneratorAction() { G4int n_particle = 1; particleGun = new G4ParticleGun(n_particle); particleGun->SetParticleDefinition(G4Geantino::GeantinoDefinition()); particleGun->SetParticleEnergy(1.0*GeV); particleGun->SetParticlePosition(G4ThreeVector(-2.0*m,0.0*m,0.0*m)); } ExN01PrimaryGeneratorAction::~ExN01PrimaryGeneratorAction() { delete particleGun; } void ExN01PrimaryGeneratorAction::generatePrimaries(G4Event* anEvent) { G4int i = anEvent->get_eventID() % 3; switch(i) { case 0: particleGun->SetParticleMomentumDirection(G4ThreeVector(1.0,0.0,0.0)); break; case 1: particleGun->SetParticleMomentumDirection(G4ThreeVector(1.0,0.1,0.0)); break; case 2: particleGun->SetParticleMomentumDirection(G4ThreeVector(1.0,0.0,0.1)); break; } particleGun->generatePrimaryVertex(anEvent); }
16
Getting Started with Geant4 - Running a Simple Example In Example 2.19, G4ParticleGun is constructed to use as the actual primary particle generator. Methods of G4ParticleGun are described in the following section. Please note that the primary generator object(s) you construct in your G4VUserPrimaryGeneratorAction concrete class must be deleted in your destructor.
2.6.2. G4VPrimaryGenerator
Geant4 provides three G4VPrimaryGenerator concrete classes. Among these G4ParticleGun and G4GeneralParticleSource will be discussed here. The third one is G4HEPEvtInterface, which will be discussed in Section 3.6.
2.6.2.1. G4ParticleGun
G4ParticleGun is a generator provided by Geant4. This class generates primary particle(s) with a given momentum and position. It does not provide any sort of randomizing. The constructor of G4ParticleGun takes an integer which causes the generation of one or more primaries of exactly same kinematics. It is a rather frequent user requirement to generate a primary with randomized energy, momentum, and/or position. Such randomization can be achieved by invoking various set methods provided by G4ParticleGun. The invocation of these methods should be implemented in the generatePrimaries() method of your concrete G4VUserPrimaryGeneratorAction class before invoking generatePrimaryVertex() of G4ParticleGun. Geant4 provides various random number generation methods with various distributions (see Section 3.2).
2.6.2.3. G4GeneralParticleSource
For many applications G4ParticleGun is a suitable particle generator. Howevr if you want to generate primary particles in more sophisticated manner, you can utilize G4GeneralParticleSource - Geant4 General Particle Source module (GPS). Using this tool, you can control the following characteristics of primary particles: Spectrum: linear, exponential, power-law, Gaussian, blackbody, or piece-wise fits to data. Angular distribution: unidirectional, isotropic, cosine-law, beam or arbitrary (user defined). Spatial sampling: on simple 2D or 3D surfaces such as discs, spheres, and boxes. Multiple sources: multiple independent sources can be used in the same run.
Details of information on the General Source Particle Module can be found in the documents Geant4 General Particle Source.
17
This will create, in $G4WORKDIR/bin/$G4SYSTEM, the "exampleN01" executable, which you can invoke and run. You should actually add $G4WORKDIR/bin/$G4SYSTEM to $PATH in your environment.
18
19
Getting Started with Geant4 - Running a Simple Example help command show command help. exit terminate the session. G4UItcsh supports user-friendly key bindings a-la-tcsh. G4UItcsh runs on Solaris and Linux. The following keybindings are supported; ^A move cursor to the top ^B backward cursor ([LEFT] cursor) ^C (except Windows terminal) abort a run (soft abort) during event processing. A program will be terminated while accepting a user command. ^D delete/exit/show matched list ^E move cursor to the end ^F forward cursor ([RIGHT] cursor) ^K clear after the cursor ^N next command ([DOWN] cursor) ^P previous command ([UP] cursor) TAB command completion DEL backspace BS backspace The example below shows how to set a user's prompt.
The following strings are supported as substitutions in a prompt string. %s current application status %/ current working directory
20
Getting Started with Geant4 - Running a Simple Example %h history number Command history in a user's session is saved in a file $(HOME)/.g4_hist that is automatically read at the next session, so that command history is available across sessions.
GAG has following functions. GAG Menu: The menus are to choose and run a Geant4 executable file, to kill or exit a Geant4 process and to exit GAG. Upon the normal exit or an unexpected death of the Geant4 process, GAG window are automatically reset to run another Geant4 executable.
21
Getting Started with Geant4 - Running a Simple Example Geant4 Command tree: Upon the establishment of the pipe connection with the Geant4 process, GAG displays the command menu, using expandable tree browser whose look and feel is similar to a file browser. Disabled commands are shown in opaque. GAG doesn't display commands that are just below the root of the command hierarchy. Direct type-in field is available for such input. Guidance of command categories and commands are displayed upon focusing. GAG has a command history function. User can re-execute a command with old parameters, edit the history, or save the history to create a macro file. Command Parameter panel: GAG's parameter panel is the user-friendliest part. It displays parameter name, its guidance, its type(s) (integer, double, Boolean or string), omittable, default value(s), expression(s) of its range and candidate list(s) (for example, of units). Range check is done by intercoms and the error message from it is shown in the popup dialog box. When a parameter component has a candidate list, a list box is automatically displayed . When a file is requested by a command, the file chooser is available. Logging: Log can be redirected to the terminal (xterm or cygwin window) from which GAG is invoked. It can be interrupted as will, in the middle of a long session of execution. Log can be saved to a file independent of the above redirection . GAG displays warning or error messages from Geant4 in a pop-up warning widget.
terminal,Xm,
Xaw,
Win32,
Qt,
GAG,
If you want to select a session type according to your environment variable, the code can be:
// to include the class definition in the main program: #if defined(G4UI_USE_TCSH) #include "G4UIterminal.hh" #include "G4UItcsh.hh" #elif defined(G4UI_USE_XM) #include "G4UIXm.hh" .... #endif #if defined(G4UI_USE_TCSH)
22
If the user wants to deactivate the default signal handler (soft abort) raised by "Ctr-C", the false flag can be set in the second argument of the G4UIterminal constructor like;
G4UIsession* session = new G4UIterminal(new G4UItcsh, false).
Using G4UIExecutive (implemented in all novice examples) : The above code is rather troublesome. This is more convenient way for choosing a session type.
// to include the class definition in the main program: #ifdef G4UI_USE #include "G4UIExecutive.hh" #endif // to instantiate a session of your choice and start the session #ifdef G4UI_USE G4UIExecutive* ui = new G4UIExecutive(argc,argv); ui->SessionStart(); // the line next to the "SessionStart" is necessary to finish the session delete ui; #endif
A corresponding environment variable must be preset to select a given interface. But some of them are set by defaults for your convenience. G4UIterminal, G4UItcsh, G4UIGAG and G4UIGainServer can be used without setting any environment variables. Sessions not needing external packages or libraries are always built (see "G4UI_BUILD.gmk") and linked, so the user can instantiate one of these sessions without rebuilding the libraries and without setting any environment variables. The environment variable G4UI_USE_XM, G4UI_USE_QT, G4UI_USE_XAW or G4UI_USE_WIN32 must be set to use the respective interface. The file "$G4INSTALL/config/G4UI_USE.gmk" resolves their dependencies on external packages. If the environment variable G4UI_NONE is set, no external libraries are selected. Also, for your convenience, if any G4UI_USE_XXX environment variable is set, then the corresponding C-pre-processor flag is also set. However, if the environment variable G4UI_NONE is set, no C-pre-processor flags are set.
The last mode will be covered in Section 2.8. The first three modes are explained here.
Example 2.20. An example of the main() routine for an application which will run in batch mode.
int main() { // Construct the default run manager G4RunManager* runManager = new G4RunManager; // set mandatory initialization classes runManager->SetUserInitialization(new ExN01DetectorConstruction); runManager->SetUserInitialization(new ExN01PhysicsList); // set mandatory user action class runManager->SetUserAction(new ExN01PrimaryGeneratorAction); // Initialize G4 kernel runManager->Initialize(); // start a run int numberOfEvent = 1000; runManager->BeamOn(numberOfEvent); // job termination delete runManager; return 0; }
Even the number of events in the run is `frozen`. To change this number you must at least recompile main().
Example 2.21. An example of the main() routine for an application which will run in batch mode, but reading a file of commands.
int main(int argc,char** argv) { // Construct the default run manager G4RunManager * runManager = new G4RunManager; // set mandatory initialization classes runManager->SetUserInitialization(new MyDetectorConstruction); runManager->SetUserInitialization(new MyPhysicsList); // set mandatory user action class runManager->SetUserAction(new MyPrimaryGeneratorAction); // Initialize G4 kernel runManager->Initialize(); //read a macro file of commands G4UImanager * UI = G4UImanager::getUIpointer(); G4String command = "/control/execute "; G4String fileName = argv[1]; UI->applyCommand(command+fileName); delete runManager; return 0; }
where myProgram is the name of your executable and run1.mac is a macro of commands located in the current directory, which could look like:
24
Indeed, you can re-execute your program with different run conditions without recompiling anything. Digression: many G4 category of classes have a verbose flag which controls the level of 'verbosity'. Usually verbose=0 means silent. For instance /run/verbose is for the RunManager /event/verbose is for the EventManager /tracking/verbose is for the TrackingManager ...etc...
Example 2.23. An example of the main() routine for an application which will run interactively, waiting for commands from the keyboard.
int main(int argc,char** argv) { // Construct the default run manager G4RunManager * runManager = new G4RunManager; // set mandatory initialization classes runManager->SetUserInitialization(new MyDetectorConstruction); runManager->SetUserInitialization(new MyPhysicsList); // visualization manager G4VisManager* visManager = new G4VisExecutive; visManager->Initialize(); // set user action classes runManager->SetUserAction(new runManager->SetUserAction(new runManager->SetUserAction(new runManager->SetUserAction(new // Initialize G4 kernel runManager->Initialize(); // Define UI terminal for interactive mode G4UIsession * session = new G4UIterminal; session->SessionStart(); delete session; // job termination delete visManager; delete runManager; return 0; }
25
Getting Started with Geant4 - Running a Simple Example This example will be executed with the command:
> myProgram
where myProgram is the name of your executable. The G4 kernel will prompt:
Idle>
and you can start your session. An example session could be: Create an empty scene ("world" is default):
Idle> /vis/scene/create
Idle> /vis/scene/add/volume
Create a scene handler for a specific graphics system. Change the next line to choose another graphic system:
Create a viewer:
Idle> /vis/viewer/create
Idle> Idle> Idle> Idle> Idle> Idle> Idle> Idle> Idle> Idle> Idle>
/vis/scene/notifyHandlers /run/verbose 0 /event/verbose 0 /tracking/verbose 1 /gun/particle mu+ /gun/energy 10 GeV /run/beamOn 1 /gun/particle proton /gun/energy 100 MeV /run/beamOn 3 exit
For the meaning of the machine state Idle, see Section 3.4.2. This mode is useful for running a few events in debug mode and visualizing them. Notice that the VisManager is created in the main(), and the visualization system is choosen via the command:
/vis/sceneHandler/create OGLIX
26
Example 2.24. The typical main() routine from the examples directory.
int main(int argc,char** argv) { // Construct the default run manager G4RunManager * runManager = new G4RunManager; // set mandatory initialization classes N03DetectorConstruction* detector = new N03DetectorConstruction; runManager->SetUserInitialization(detector); runManager->SetUserInitialization(new N03PhysicsList); #ifdef G4VIS_USE // visualization manager G4VisManager* visManager = new G4VisExecutive; visManager->Initialize(); #endif // set user action classes runManager->SetUserAction(new runManager->SetUserAction(new runManager->SetUserAction(new runManager->SetUserAction(new
// get the pointer to the User Interface manager G4UImanager* UI = G4UImanager::GetUIpointer(); if (argc==1) // Define UI terminal for interactive mode { G4UIExecutive* session = new G4UIExecutive(argc, argv); UI->ApplyCommand("/control/execute prerunN03.mac"); session->SessionStart(); delete session; } else // Batch mode { G4String command = "/control/execute "; G4String fileName = argv[1]; UI->ApplyCommand(command+fileName); } // job termination #ifdef G4VIS_USE delete visManager; #endif delete runManager; return 0; }
Notice that the visualization system is under the control of the precompiler variable G4VIS_USE. Notice also that, in interactive mode, few intializations have been put in the macro prerunN03.mac which is executed before the session start.
27
Also, this example demonstrates that you can read and execute a macro interactively:
Idle> /control/execute
mySubMacro.mac
No one graphics system is ideal for all of these requirements, and many of the large software frameworks into which Geant4 has been incorporated already have their own visualization systems, so Geant4 visualization was designed around an abstract interface that supports a diverse family of graphics systems. Some of these graphics systems use a graphics library compiled with Geant4, such as OpenGL, Qt or OpenInventor, while others involve a separate application, such as HepRApp or DAWN.
28
Getting Started with Geant4 - Running a Simple Example You need not use all visualization drivers. You can select those suitable to your purposes. In the following, for simplicity, we assume that the Geant4 libraries are built with the OpenGL driver. If you build Geant4 using the standard ./Configure -build procedure, you include OpenGL by answering "y" to the question, "Enable building of the X11 OpenGL visualization driver?". Other Configure questions handle setup of other optional visualization drivers, and you can ignore the details below about enironment variables. Configure handles all of this for you. In order to use the the OpenGL drivers, you need the OpenGL library, which is installed in many platforms by default. When you run ./Configure, answer yes to OpenGL. It sets appropriate G4VIS_... variables. (If you wish to "do-it-yourself", see Section 8.2.1.) The makefiles then set appropriate C-pre-processor flags to select appropriate code at compilation time.
... RegisterGraphicsSystem (new G4DAWNFILE); ... #ifdef G4VIS_USE_OPENGLX RegisterGraphicsSystem (new G4OpenGLImmediateX); RegisterGraphicsSystem (new G4OpenGLStoredX); #endif ...
If you wish to use G4VisExecutive but register an additional graphics system, XXX say, you may do so either before or after initializing:
29
In the instantiation, initialization, and deletion of the Visualization Manager, the use of the macro G4VIS_USE is recommended. This is set unless the environment variable G4VIS_NONE is set. This allows one easily to build an executable without visualization, if required, without changing the code (but remember you have to force recompilation whenever you change the environment). Note that it is your responsibility to delete the instantiated Visualization Manager by yourself. A complete description of a sample main() function is described in examples/novice/N03/exampleN03.cc.
30
31
Toolkit Fundamentals
1. Run and Event These are categories related to the generation of events, interfaces to event generators, and any secondary particles produced. Their roles are principally to provide particles to be tracked to the Tracking Management. 2. Tracking and Track These are categories related to propagating a particle by analyzing the factors limiting the step and applying the relevant physics processes. The important aspect of the design was that a generalized Geant4 physics process (or interaction) could perform actions, along a tracking step, either localized in space, or in time, or distributed in space and time (and all the possible combinations that could be built from these cases). 3. Geometry and Magnetic Field These categories manage the geometrical definition of a detector (solid modeling) and the computation of distances to solids (also in a magnetic field). The Geant4 geometry solid modeler is based on the ISO STEP standard and it is fully compliant with it, in order to allow in future the exchange of geometrical information with CAD systems. A key feature of the Geant4 geometry is that the volume definitions are independent of the solid representation. By this abstract interface for the G4 solids, the tracking component works identically for various representations. The treatment of the propagation in the presence of fields has been provided within specified accuracy. An OO design allows us to exchange different numerical algorithms and/or different fields (not only B-field), without affecting any other component of the toolkit. 4. Particle Definition and Matter These two categories manage the the definition of materials and particles. 5. Physics This category manages all physics processes participating in the interactions of particles in matter. The abstract interface of physics processes allows multiple implementations of physics models per interaction or per channel. Models can be selected by energy range, particle type, material, etc. Data encapsulation and polymorphism make it possible to give transparent access to the cross sections (independently of the choice of reading from an ascii file, or of interpolating from a tabulated set, or of computing analytically from a formula). Electromagnetic and hadronic physics were handled in a uniform way in such a design, opening up the physics to the users. 6. Hits and Digitization These two categories manage the creation of hits and their use for the digitization phase. The basic design and implementation of the Hits and Digi had been realized, and also several prototypes, test cases and scenarios had been developed before the alpha-release. Volumes (not necessarily the ones used by the tracking) are aggregated in sensitive detectors, while hits collections represent the logical read out of the detector. Different ways of creating and managing hits collections had been delivered and tested, notably for both single hits and calorimetry hits types. In all cases, hits collections had been successfully stored into and retrieved from an Object Data Base Management System. 7. Visualization This manages the visualization of solids, trajectories and hits, and interacts with underlying graphical libraries (the Visualization class category). The basic and most frequently used graphics functionality had been implemented already by the alpha-release. The OO design of the visualization component allowed us to develop several drivers independently, such as for OpenGL, Qt and OpenInventor (for X11 and Windows), DAWN, Postscript (via DAWN) and VRML. 8. Interfaces This category handles the production of the graphical user interface (GUI) and the interactions with external software (OODBMS, reconstruction etc.).
Toolkit Fundamentals
which currently consist of simple typedefs to respective types defined in the CLHEP, STL or system libraries. Most definitions of these basic types come with the inclusion of a single header file, globals.hh. This file also provides inclusion of required system headers, as well as some global utility functions needed and used within the Geant4 kernel.
Toolkit Fundamentals
1. Using the static generator defined in the HepRandom class: random values are shot using static methods shoot() defined for each distribution class. The static generator will use, as default engine, a HepJamesRandom object, and the user can set its properties or change it with a new instantiated engine object by using the static methods defined in the HepRandom class. 2. Skipping the static generator and specifying an engine object: random values are shot using static methods shoot(*HepRandomEngine) defined for each distribution class. The user must instantiate an engine object and give it as argument to the shoot method. The generator mechanism will then be by-passed by using the basic flat() method of the specified engine. The user must take care of the engine objects he/she instantiates. 3. Skipping the static generator and instantiating a distribution object: random values are shot using fire() methods (NOT static) defined for each distribution class. The user must instantiate a distribution object giving as argument to the constructor an engine by pointer or by reference. By doing so, the engine will be associated to the distribution object and the generator mechanism will be by-passed by using the basic flat() method of that engine. In this guide, we'll only focus on the static generator (point 1.), since the static interface of HEPRandom is the only one used within the Geant4 toolkit.
RanluxEngine theRanluxEngine(seed,4); // instantiates an engine with `seed' and the best luxury-level ... or RanluxEngine theRanluxEngine; // instantiates an engine with default seed value and luxury-level ...
34
Toolkit Fundamentals
The class provides a getLuxury() method to get the engine luxury level. The SetSeed() and SetSeeds() methods to set the initial seeds for the engine, can be invoked specifying the luxury level. For example:
// sets the seed to `seed' and luxury to 4 // sets the seed to `seed' keeping // the current luxury level
RanecuEngine The algorithm for RanecuEngine is taken from the one originally written in FORTRAN77 as part of the MATHLIB HEP library. The initialisation is carried out using a Multiplicative Congruential generator using formula constants of L'Ecuyer as described in ``F.James, Comp. Phys. Comm. 60 (1990) 329-344''. Handling of seeds for this engine is slightly different than the other engines in HEPRandom. Seeds are taken from a seed table given an index, the getSeed() method returns the current index of seed table. The setSeeds() method will set seeds in the local SeedTable at a given position index (if the index number specified exceeds the table's size, [index%size] is taken). For example:
// static interface const G4long* table_entry; table_entry = HepRandom::getTheSeeds(); // it returns a pointer `table_entry' to the local SeedTable // at the current `index' position. The couple of seeds // accessed represents the current `status' of the engine itself ! ... G4int index=n; G4long seeds[2]; HepRandom::setTheSeeds(seeds,index); // sets the new `index' for seeds and modify the values inside // the local SeedTable at the `index' position. If the index // is not specified, the current index in the table is considered. ...
The setSeed() method resets the current `status' of the engine to the original seeds stored in the static table of seeds in HepRandom, at the specified index. Except for the RanecuEngine, for which the internal status is represented by just a couple of longs, all the other engines have a much more complex representation of their internal status, which currently can be obtained only through the methods saveStatus(), restoreStatus() and showStatus(), which can also be statically called from HepRandom. The status of the generator is needed for example to be able to reproduce a run or an event in a run at a given stage of the simulation. RanecuEngine is probably the most suitable engine for this kind of operation, since its internal status can be fetched/reset by simply using getSeeds()/setSeeds() (getTheSeeds()/setTheSeeds() for the static interface in HepRandom).
HepRandom::setTheSeed(seed); // to change the current seed to 'seed' int startSeed = HepRandom::getTheSeed(); // to get the current initial seed
35
Toolkit Fundamentals
HepRandom::saveEngineStatus(); // to save the current engine status on file HepRandom::restoreEngineStatus(); // to restore the current engine to a previous // saved configuration HepRandom::showEngineStatus(); // to display the current engine status to stdout ... int index=n; long seeds[2]; HepRandom::getTheTableSeeds(seeds,index); // fills `seeds' with the values stored in the global // seedTable at position `index'
Only one random engine can be active at a time, the user can decide at any time to change it, define a new one (if not done already) and set it. For example:
or simply setting it to an old instantiated engine (the old engine status is kept and the new random sequence will start exactly from the last one previously interrupted). For example:
HepRandom::setTheEngine(&myOldEngine);
Other static methods defined in this class are: void setTheSeeds(const G4long* seeds, G4int) const G4long* getTheSeeds() To set/get an array of seeds for the generator, in the case of a RanecuEngine this corresponds also to set/get the current status of the engine. HepRandomEngine* getTheEngine() To get a pointer to the current engine used by the static generator.
Toolkit Fundamentals
Classes implementing the Gauss-Chebyshev, Gauss-Hermite, Gauss-Jacobi, Gauss-Laguerre and GaussLegendre quadrature methods. Roots of orthogonal polynomials and corresponding weights are calculated based on iteration method (by bisection Newton algorithm). G4Integrator Template class collecting integrator methods for generic functions (Legendre, Simpson, Adaptive Gauss, Laguerre, Hermite, Jacobi). G4SimpleIntegration Class implementing simple numerical methods (Trapezoidal, MidPoint, Gauss, Simpson, Adaptive Gauss, for integration of functions with signature: double f(double).
37
Toolkit Fundamentals
tracks (G4Track): aTrackAllocator stacked tracks (G4StackedTrack): aStackedTrackAllocator primary particles (G4PrimaryParticle): aPrimaryParticleAllocator primary vertices (G4PrimaryVertex): aPrimaryVertexAllocator decay products (G4DecayProducts): aDecayProductsAllocator digits collections of an event (G4DCofThisEvent): anDCoTHAllocator digits collections (G4DigiCollection): aDCAllocator hits collections of an event (G4HCofThisEvent): anHCoTHAllocator hits collections (G4HitsCollection): anHCAllocator touchable histories (G4TouchableHistory): aTouchableHistoryAllocator trajectories (G4Trajectory): aTrajectoryAllocator trajectory points (G4TrajectoryPoint): aTrajectoryPointAllocator trajectory containers (G4TrajectoryContainer): aTrajectoryContainerAllocator navigation levels (G4NavigationLevel): aNavigationLevelAllocator navigation level nodes (G4NavigationLevelRep): aNavigLevelRepAllocator reference-counted handles (G4ReferenceCountedHandle<X>): aRCHAllocator counted objects (G4CountedObject<X>): aCountedObjectAllocator HEPEvt primary particles (G4HEPEvtParticle): aHEPEvtParticleAllocator electron occupancy objects(G4ElectronOccupancy): aElectronOccupancyAllocator "rich" trajectories (G4RichTrajectory): aRichTrajectoryAllocator "rich" trajectory points (G4RichTrajectoryPoint): aRichTrajectoryPointAllocator "smooth" trajectories (G4SmoothTrajectory): aSmoothTrajectoryAllocator "smooth" trajectory points (G4SmoothTrajectoryPoint): aSmoothTrajectoryPointAllocator "ray" trajectories (G4RayTrajectory): G4RayTrajectoryAllocator "ray" trajectory points (G4RayTrajectoryPoint): G4RayTrajectoryPointAllocator
For each of these allocators, accessible from the global namespace, it is possible to monitor the allocation in their memory pools or force them to release the allocated memory (for example at the end of a run):
// Return the size of the total memory allocated for tracks // aTrackAllocator.GetAllocatedSize(); // Return allocated storage for tracks to the free store // aTrackAllocator.ResetStorage();
G4ReferenceCountedHandle Template class acting as a smart pointer and wrapping the type to be counted. It performs the reference counting during the life-time of the counted object. G4FastVector Template class defining a vector of pointers, not performing boundary checking. G4PhysicsVector Defines a physics vector which has values of energy-loss, cross-section, and other physics values of a particle in matter in a given range of the energy, momentum, etc. This class serves as the base class for a vector having various energy scale, for example like 'log' (G4PhysicsLogVector) 'linear' (G4PhysicsLinearVector), 'free' (G4PhysicsFreeVector), etc. G4LPhysicsFreeVector Implements a free vector for low energy physics cross-section data. A subdivision method is used to find the energy|momentum bin. G4PhysicsOrderedFreeVector A physics ordered free vector inherits from G4PhysicsVector. It provides, in addition, a method for the user to insert energy/value pairs in sequence. Methods to retrieve the max and min energies and values from the vector are also provided. G4Timer Utility class providing methods to measure elapsed user/system process time. Uses <sys/times.h> and <unistd.h> - POSIX.1. G4UserLimits Class collecting methods for get and set any kind of step limitation allowed in Geant4. 38
Toolkit Fundamentals
millimeter nanosecond Mega electron Volt positron charge degree Kelvin the amount of substance luminous intensity radian steradian
All other units are defined from the basic ones. For instance:
In the file $CLHEP_BASE_DIR/include/CLHEP/Units/SystemOfUnits.h from the CLHEP installation, one can find all untis definitions. One can also change the system of units to be used by the kernel.
Geant4 assumes that these specifications for the units are respected, in order to assure indeipendence from the units chosen in the client application. If units are not specified in the client application, data are implicitly treated in internal Geant4 system units; this practice is however strongly discouraged. If the data set comes from an array or from an external file, it is strongly recommended to set the units as soon as the data are read, before any treatment. For instance:
39
Toolkit Fundamentals
...
If units are not specified, or are not valid, the command is refused.
G4cout << KineticEnergy/keV << " keV"; G4cout << density/(g/cm3) << " g/cm3";
Of course, G4cout << KineticEnergy will print the energy in the internal units system. There is another way to output the data. Let Geant4 choose the most appropriate units for the actual numerical value of the data. It is sufficient to specify to which category the data belong to (Length, Time, Energy, etc.). For example
StepSize will be printed in km, m, mm, fermi, etc. depending of its actual value.
Using this method, it is not easy to define composed units. It is better to do the following: Instantiate an object of the class G4UnitDefinition
G4UnitDefinition ( "km/hour" , "km/h", "Speed", km/(3600*s) ); G4UnitDefinition ( "meter/ns", "m/ns", "Speed", m/ns );
The category "Speed" does not exist by default in G4UnitsTable, but it will be created automatically. The class 40 G4UnitDefinition is located in source/global/management.
Toolkit Fundamentals
3.4. Run
3.4.1. Basic concept of Run
In Geant4, Run is the largest unit of simulation. A run consists of a sequence of events. Within a run, the detector geometry, the set up of sensitive detectors, and the physics processes used in the simulation should be kept unchanged. A run is represented by a G4Run class object. A run starts with BeamOn() method of G4RunManager.
41
Toolkit Fundamentals
explained in the following sub-section, is "EventProc". When Geant4 is in a state other than "EventProc", this method returns null. Please note that the return value of this method is const G4Event * and thus you cannot modify the contents of the object. SetNumberOfEventsToBeStored(G4int nPrevious) When simulating the "pile up" of more than one event, it is essential to access more than one event at the same moment. By invoking this method, G4RunManager keeps nPrevious G4Event objects. This method must be invoked before proceeding to BeamOn(). GetPreviousEvent(G4int i_thPrevious) The pointer to the i_thPrevious G4Event object can be obtained through this method. A pointer to a const object is returned. It is inevitable that i_thPrevious events must have already been simulated in the same run for getting the i_thPrevious event. Otherwise, this method returns null. AbortRun() This method should be invoked whenever the processing of a run must be stopped. It is valid for GeomClosed and EventProc states. Run processing will be safely aborted even in the midst of processing an event. However, the last event of the aborted run will be incomplete and should not be used for further analysis.
3.4.1.3. G4UserRunAction
G4UserRunAction is one of the user action classes from which you can derive your own concrete class. This base class has two virtual methods, as follows: BeginOfRunAction() This method is invoked at the beginning of the BeamOn() method but after confirmation of the conditions of the Geant4 kernel. Likely uses of this method include: setting a run identification number, booking histograms, setting run specific conditions of the sensitive detectors and/or digitizer modules (e.g., dead channels). EndOfRunAction() This method is invoked at the very end of the BeamOn() method. Typical use cases of this method are store/print histograms, manipulate run summaries.
42
Toolkit Fundamentals
G4State_EventProc state A Geant4 application is in this state when a particular event is being processed. GetCurrentEvent() and GetPreviousEvent() methods of G4RunManager are available only at this state. G4State_Quit state When the destructor of G4RunManager is invoked, the application comes to this "dead end" state. Managers of the Geant4 kernel are being deleted and thus the application cannot come back to any other state. G4State_Abort state When a G4Exception occurs, the application comes to this "dead end" state and causes a core dump. The user still has a hook to do some "safe" opperations, e.g. storing histograms, by implementing a user concrete class of G4VStateDependent. The user also has a choice to suppress the occurence of G4Exception by a UI command /control/suppressAbortion. When abortion is suppressed, you will still get error messages issued by G4Exception, and there is NO guarantee of a correct result after the G4Exception error message. G4StateManager belongs to the intercoms category.
43
Toolkit Fundamentals
application. Thus, instead of constructing the G4RunManager provided by Geant4, you are free to construct your own RunManager. It is recommended, however, that your RunManager inherit G4RunManager. For this purpose, G4RunManager has various virtual methods which provide all the functionalities required to handle the Geant4 kernel. Hence, your customized run manager need only override the methods particular to your needs; the remaining methods in G4RunManager base class can still be used. A summary of the available methods is presented here: public: virtual void Initialize(); main entry point of Geant4 kernel initialization protected: virtual void InitializeGeometry(); geometry construction protected: virtual void InitializePhysics(); physics processes construction public: virtual void BeamOn(G4int n_event); main entry point of the event loop protected: virtual G4bool ConfirmBeamOnCondition(); check the kernel conditions for the event loop protected: virtual void RunInitialization(); prepare a run protected: virtual void DoEventLoop(G4int n_events); manage an event loop protected: virtual G4Event* GenerateEvent(G4int i_event); generation of G4Event object protected: virtual void AnalyzeEvent(G4Event* anEvent); storage/analysis of an event protected: virtual void RunTermination(); terminate a run public: virtual void DefineWorldVolume(G4VPhysicalVolume * worldVol); set the world volume to G4Navigator public: virtual void AbortRun(); abort the run
44
Toolkit Fundamentals
information once and store it, perhaps in a database. The second program could then retrieve the stored G4Event objects and perform the digitization (analysis) using the above threshold, gate and trigger settings. These settings could then be changed and the digitization program re-run without re-generating the G4Events.
Presumably this case is rather rare. The second case is more frequent for the user. The second case is the following. Suppose you want to move and/or rotate a particular piece of your detector component. This case can easily happen for a beam test of your detector. It is obvious for this case that you need not change the world volume. Rather, it should be said that your world volume (experimental hall for your beam test) should be big enough for moving/rotating your test detector. For this case, you can still use all of your detector geometries, and just use a Set method of a particular physical volume to update the transformation vector as you want. Thus, you don't need to re-set your world volume pointer to RunManager. If you want to change your geometry for every run, you can implement it in the BeginOfRunAction() method of G4UserRunAction class, which will be invoked at the beginning of each run, or, derive the RunInitialization() method. Please note that, for both of the above mentioned cases, you need to let RunManager know "the geometry needs to be closed again". Thus, you need to invoke
runManager->GeometryHasBeenModified();
before proceeding to the next run. An example of changing geometry is given in a Geant4 tutorial in Geant4 Training kit #2.
45
Toolkit Fundamentals
3.5. Event
3.5.1. Representation of an event
G4Event represents an event. An object of this class contains all inputs and outputs of the simulated event. This class object is constructed in G4RunManager and sent to G4EventManager. The event currently being processed can be obtained via the getCurrentEvent() method of G4RunManager.
46
Toolkit Fundamentals
As the event is processed G4StackManager pops tracks from the urgent stack until it is empty. At this point the NewStage() method of G4UserStackingAction is called. In this method tracks from the waiting stack may be sent to the urgent stack, retained in the waiting stack or postponed to the next event. Details of the user-defined methods of G4UserStackingAction and how they affect track stack management are given in Section 6.3.
47
Toolkit Fundamentals
allows such a link. Linking to a FORTRAN package might be convenient in some cases, but we will lose many advantages of object-oriented features of C++, such as robustness. Instead, Geant4 provides an ASCII file interface for such event generators. G4HEPEvtInterface is one of G4VPrimaryGenerator concrete class and thus it can be used in your G4VUserPrimaryGeneratorAction concrete class. G4HEPEvtInterface reads an ASCII file produced by an event generator and reproduces G4PrimaryParticle objects associated with a G4PrimaryVertex object. It reproduces a full production chain of the event generator, starting with primary quarks, etc. In other words, G4HEPEvtInterface converts information stored in the /HEPEVT/ common block to an object-oriented data structure. Because the /HEPEVT/ common block is commonly used by almost all event generators written in FORTRAN, G4HEPEvtInterface can interface to almost all event generators currently used in the HEP community. The constructor of G4HEPEvtInterface takes the file name. Example 3.3 shows an example how to use G4HEPEvtInterface. Note that an event generator is not assumed to give a place of the primary particles, the interaction point must be set before invoking GeneratePrimaryVertex() method.
#include "ExN04PrimaryGeneratorAction.hh" #include "G4Event.hh" #include "G4HEPEvtInterface.hh" ExN04PrimaryGeneratorAction::ExN04PrimaryGeneratorAction() { HEPEvt = new G4HEPEvtInterface("pythia_event.data"); } ExN04PrimaryGeneratorAction::~ExN04PrimaryGeneratorAction() { delete HEPEvt; } void ExN04PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { HEPEvt->SetParticlePosition(G4ThreeVector(0.*cm,0.*cm,0.*cm)); HEPEvt->GeneratePrimaryVertex(anEvent); }
48
Toolkit Fundamentals
Each line in an event corresponds to a particle in the /HEPEVT/ common. Each line has ISTHEP, IDHEP, JDAHEP(1), JDAHEP(2), PHEP(1), PHEP(2), PHEP(3), PHEP(5). Refer to the /HEPEVT/ manual for the meanings of these variables. Example 3.4 shows an example FORTRAN code to generate an ASCII file.
49
Toolkit Fundamentals
may be found in the documents 'Scoring, geometrical importance sampling and weight roulette' . A detailed description of different use-cases which employ the sampling and scoring techniques can be found in the document 'Use cases of importance sampling and scoring in Geant4' . The purpose of importance sampling is to save computing time by sampling less often the particle histories entering "less important" geometry regions, and more often in more "important" regions. Given the same amount of computing time, an importance-sampled and an analogue-sampled simulation must show equal mean values, while the importance-sampled simulation will have a decreased variance. The implementation of scoring is independent of the implementation of importance sampling. However both share common concepts. Scoring and importance sampling apply to particle types chosen by the user, which should be borne in mind when interpreting the output of any biased simulation. Examples on how to use scoring and importance sampling may be found in examples/extended/biasing.
3.7.1.1. Geometries
The kind of scoring referred to in this note and the importance sampling apply to spatial cells provided by the user. A cell is a physical volume (further specified by it's replica number, if the volume is a replica). Cells may be defined in two kinds of geometries: 1. mass geometry: the geometry setup of the experiment to be simulated. Physics processes apply to this geometry. 2. parallel-geometry: a geometry constructed to define the physical volumes according to which scoring and/or importance sampling is applied. The user has the choice to score and/or sample by importance the particles of the chosen type, according to mass geometry or to parallel geometry. It is possible to utilize several parallel geometries in addition to the mass geometry. This provides the user with a lot of flexibility to define separate geometries for different particle types in order to apply scoring or/and importance sampling.
Note
Parallel geometries should be constructed using the implementation as described in Section 4.7. There are a few conditions for parallel geometries: The world volume for parallel and mass geometries must be identical copies. Scoring and importance cells must not share boundaries with the world volume.
50
Toolkit Fundamentals
G4VWeightWindowAlgorithm *wwAlg = 0, G4PlaceOfAction placeOfAction = onBoundary) = 0; virtual void Configure() = 0; virtual void ClearSampling() = 0; virtual G4bool IsConfigured() const = 0; };
The methods for setting up the desired combination need specific information: Importance sampling: message PrepareImportanceSampling with a G4VIStore and optionally a G4VImportanceAlgorithm Weight window: message PrepareWeightWindow with the arguments: *wwstore: a G4VWeightWindowStore for retrieving the lower weight bounds for the energy-space cells *wwAlg: a G4VWeightWindowAlgorithm if a customized algorithm should be used placeOfAction: a G4PlaceOfAction specifying where to perform the biasing Weight roulette: message PrepareWeightRoulett with the optional parameters: wsurvive: survival weight wlimit: minimal allowed value of weight * source importance / cell importance isource: importance of the source cell Each object of a sampler class is responsible for one particle type. The particle type is given to the constructor of the sampler classes via the particle type name, e.g. "neutron". Depending on the specific purpose, the Configure() of a sampler will set up specialized processes (derived from G4VProcess) for transportation in the parallel geometry, importance sampling and weight roulette for the given particle type. When Configure() is invoked the sampler places the processes in the correct order independent of the order in which user invoked the Prepare... methods.
Note
The Prepare...() functions may each only be invoked once. To configure the sampling the function Configure() must be called after the G4RunManager has been initialized and the PhysicsList has been instantiated. The interface and framework are demonstrated in the examples/extended/biasing directory, with the main changes being to the G4GeometrySampler class and the fact that in the parallel case the WorldVolume is a copy of the Mass World. The parallel geometry now has to inherit from G4VUserParallelWorld which also has the GetWorld() method in order to retrieve a copy of the mass geometry WorldVolume.
class B02ImportanceDetectorConstruction : public G4VUserParallelWorld ghostWorld = GetWorld();
The constructor for G4GeometrySampler takes a pointer to the physical world volume and the particle type name (e.g. "neutron") as arguments. In a single mass geometry the sampler is created as follows:
G4GeometrySampler mgs(detector->GetWorldVolume(),"neutron"); mgs.SetParallel(false);
Whilst the following lines of code are required in order to set up the sampler for the parallel geometry case:
G4VPhysicalVolume* ghostWorld = pdet->GetWorldVolume(); G4GeometrySampler pgs(ghostWorld,"neutron"); pgs.SetParallel(true);
Also note that the preparation and configuration of the samplers has to be carried out after the instantiation of the UserPhysicsList and after the initialisation of the G4RunManager:
pgs.PrepareImportanceSampling(&aIstore, 0); pgs.Configure();
51
Toolkit Fundamentals
Due to the fact that biasing is a process and has to be inserted after all the other processes have been created.
A concrete implementation of an importance store is provided by the class G4VStore. The public part of the class is:
class G4IStore : public G4VIStore { public: explicit G4IStore(const G4VPhysicalVolume &worldvolume); virtual ~G4IStore(); virtual G4double GetImportance(const G4GeometryCell &gCell) const; virtual G4bool IsKnown(const G4GeometryCell &gCell) const; virtual const G4VPhysicalVolume &GetWorldVolume() const; void AddImportanceGeometryCell(G4double importance, const G4GeometryCell &gCell); void AddImportanceGeometryCell(G4double importance, const G4VPhysicalVolume &, G4int aRepNum = 0); void ChangeImportance(G4double importance, const G4GeometryCell &gCell); void ChangeImportance(G4double importance, const G4VPhysicalVolume &, G4int aRepNum = 0); G4double GetImportance(const G4VPhysicalVolume &, G4int aRepNum = 0) const ; private: ..... };
The member function AddImportanceGeometryCell() enters a cell and an importance value into the importance store. The importance values may be returned either according to a physical volume and a replica number or according to a G4GeometryCell. The user must be aware of the interpretation of assigning importance values to a cell. If scoring is also implemented then this is attached to logical volumes, in which case the physical volume and replica number method should be used for assigning importance values. See examples/ extended/biasing B01 and B02 for examples of this.
52
Toolkit Fundamentals
Note
An importance value must be assigned to every cell. The different cases: Cell is not in store Not filling a certain cell in the store will cause an exception. Importance value = zero Tracks of the chosen particle type will be killed. importance values > 0 Normal allowed values Importance value smaller zero Not allowed!
The method Calculate() takes the arguments: ipre, ipost: importance of the previous cell and the importance of the current cell, respectively. init_w: the particles weight It returns the struct:
class G4Nsplit_Weight { public: G4int fN; G4double fW; };
fN: the calculated number of particles to exit the importance sampling fW: the weight of the particles The user may have a customized G4VImportanceAlgorithm. algorithm used by providing a class inheriting from
If no customized algorithm is given to the sampler the default importance sampling algorithm is used. This algorithm is implemented in G4ImportanceAlgorithm.
53
Toolkit Fundamentals
user defines weight windows in contrast to defining importance values as in importance sampling In contrast to importance sampling this technique is not weight blind. Instead the technique is applied according to the particle weight with respect to the current energy-space cell. Therefore the technique is convenient to apply in combination with other variance reduction techniques such as cross-section biasing and implicit capture. A weight window may be specified for every cell and for several energy regions: space-energy cell.
The energy-space cells are realized by G4GeometryCell as in importance sampling. The cells are stored in a weight window store defined by G4VWeightWindowStore:
class G4VWeightWindowStore { public: G4VWeightWindowStore(); virtual ~G4VWeightWindowStore(); virtual G4double GetLowerWeitgh(const G4GeometryCell &gCell, G4double partEnergy) const = 0; virtual G4bool IsKnown(const G4GeometryCell &gCell) const = 0; virtual const G4VPhysicalVolume &GetWorldVolume() const = 0; };
54
Toolkit Fundamentals
void AddUpperEboundLowerWeightPairs(const G4GeometryCell &gCell, const G4UpperEnergyToLowerWeightMap& enWeMap); void SetGeneralUpperEnergyBounds(const std::set<G4double, std::less<G4double> > & enBounds); private:: ... };
The user may choose equal energy bounds for all cells. In this case a set of upper energy bounds must be given to the store using the method SetGeneralUpperEnergyBounds. If a general set of energy bounds have been set AddLowerWeights can be used to add the cells. Alternatively, the user may chose different energy regions for different cells. In this case the user must provide a mapping of upper energy bounds to lower weight bounds for every cell using the method AddUpperEboundLowerWeightPairs. Weight window algorithms implementing the interface class G4VWeightWindowAlgorithm can be used to define a customized algorithm:
class G4VWeightWindowAlgorithm { public: G4VWeightWindowAlgorithm(); virtual ~G4VWeightWindowAlgorithm(); virtual G4Nsplit_Weight Calculate(G4double init_w, G4double lowerWeightBound) const = 0; };
The constructor takes three parameters which are used to: calculate the upper weight bound (upperLimitFaktor), calculate the survival weight (survivalFaktor), and introduce a maximal number (maxNumberOfSplits) of copies to be created in one go. In addition, the inverse of the maxNumberOfSplits is used to specify the minimum survival probability in case of Russian roulette.
55
Toolkit Fundamentals
Weight roulette uses a relative minimal weight limit and a relative survival weight. When a particle falls below the weight limit Russian roulette is applied. If the particle survives, tracking will be continued and the particle weight will be set to the survival weight. The weight roulette uses the following parameters with their default values: wsurvival: 0.5 wlimit: 0.25 isource: 1 The following algorithm is applied: If a particle weight "w" is lower than R*wlimit: the weight of the particle will be changed to "ws = wsurvival*R" the probability for the particle to survive is "p = w/ws"
The biasing can be configured through interactive commands. Extensive documentation can be found in Primary particle biasing. Examples are also distributed with the Geant4 distribution in examples/extended/ eventgenerator/exgps.
56
Toolkit Fundamentals
... G4RadioactiveDecay* theRadioactiveDecay = new G4RadioactiveDecay(); G4ProcessManager* pmanager = ... pmanager ->AddProcess(theRadioactiveDecay); ... }
The biasing can be controlled either in compiled code or through interactive commands. Extensive documentation can be found in Radioactive decay biasing example and Radioactive decay biasing . Radioactive decay biasing examples are also distributed with the Geant4 distribution in examples/extended/ radioactivedecay/exrdm.
3.7.2.2. G4WrapperProcess
G4WrapperProcess can be used to implement user defined event biasing. G4WrapperProcess, which is a process itself, wraps an existing process. By default, all function calls are forwared to the wrapped process. It is a noninvasive way to modify the behaviour of an existing process. To use this utility, first create a derived class inheriting from G4WrapperProcess. Override the methods whose behaviour you would like to modify, for example, PostStepDoIt, and register the derived class in place of the process to be wrapped. Finally, register the wrapped process with G4WrapperProcess. The code snippets below demonstrate its use.
class MyWrapperProcess : public G4WrapperProcess { ... G4VParticleChange* PostStepDoIt(const G4Track& track, const G4Step& step) { // Do something interesting } };
void MyPhysicsList::ConstructProcess()
57
Toolkit Fundamentals
{ ... G4LowEnergyBremsstrahlung* bremProcess = new G4LowEnergyBremsstrahlung(); MyWrapperProcess* wrapper = new MyWrapperProcess(); wrapper->RegisterProcess(bremProcess); processManager->AddProcess(wrapper, -1, -1, 3); }
Figure 3.3. Schematic view of an adjoint/reverse simulation in Geant4 3.7.3.1.1. Adjoint tracking phase
Adjoint particles (adjoint_e-, adjoint_gamma,...) are generated one by one on the so called adjoint source with random position, energy (1/E distribution) and direction. The adjoint source is the external surface of a user defined
58
Toolkit Fundamentals
volume or of a user defined sphere. The adjoint source should contain one or several sensitive volumes and should be small compared to the entire geometry. The user can set the minimum and maximum energy of the adjoint source. After its generation the adjoint primary particle is tracked backward in the geometry till a user defined external surface (spherical or boundary of a volume) or is killed before if it reaches a user defined upper energy limit that represents the maximum energy of the external source. During the reverse tracking, reverse processes take place where the adjoint particle being tracked can be either scattered or transformed in another type of adjoint particle. During the reverse tracking the G4AdjointSimulationManager replaces the user defined primary, run, stepping, ... actions, by its own actions. A reverse tracking phase corresponds to one Geant4 event.
It is important to note that the electromagnetic reverse processes are cut dependent as their equivalent forward processes. The implementation of the reverse processes is based on the forward processes implemented in the G4 standard electromagnetic package.
3.7.3.2. How to update a G4 application to use the reverse Monte Carlo mode
Some modifications are needed to an existing Geant4 application in order to adapt it for the use of the reverse simulation mode (see also the G4 example examples/extended/biasing/ReverseMC01). It consists into the: Creation of the adjoint simulation manager in the main code Optional declaration of user actions that will be used during the adjoint tracking phase Use of a special physics lists that combine the adjoint and forward processes Modification of the user analysis part of the code
59
Toolkit Fundamentals
By doing this the G4 application can be run in the reverse MC mode as well as in the forward MC mode. It is important to note that G4AdjointSimManager is not a new G4RunManager and that the creation of G4RunManager in the main and the declaration of the geometry, physics list, and user actions to G4RunManager is still needed. The definition of the adjoint and external sources and the start of an adjoint simulation can be controlled by G4UI commands in the directory /adjoint.
No stacking, tracking and event actions are considered by default. If needed the user can declare to G4AdjointSimManager stacking, tracking and event actions that will be used only during the adjoint tracking phase. The following lines of code show how to declare these adjoint actions to G4AdjointSimManager:
G4AdjointSimManager* theAdjointSimManager = G4AdjointSimManager::GetInstance(); theAdjointSimManager->SetAdjointEventAction(aUserDefinedEventAction); theAdjointSimManager->SetAdjointStackingAction(aUserDefinedStackingAction); theAdjointSimManager->SetAdjointTrackingAction(aUserDefinedTrackingAction);
By default no user run action is considered in an adjoint simulation but if needed such action can be declared to G4AdjointSimManager as such:
G4AdjointSimManager* theAdjointSimManager = G4AdjointSimManager::GetInstance(); theAdjointSimManager->SetAdjointRunAction(aUserDefinedRunAction);
Toolkit Fundamentals
differential flux corresponding to this spectrum The weight, direction, position , kinetic energy and type of the last adjoint particle that reaches the external source, and that would represents the primary of a forward simulation, can be get from G4AdjointSimManager by using for example the following line of codes
G4AdjointSimManager* theAdjointSimManager = G4AdjointSimManager::GetInstance(); G4String particle_name = theAdjointSimManager->GetFwdParticleNameAtEndOfLastAdjointTrack(); G4int PDGEncoding= theAdjointSimManager->GetFwdParticlePDGEncodingAtEndOfLastAdjointTrack(); G4double weight = theAdjointSimManager->GetWeightAtEndOfLastAdjointTrack(); G4double Ekin = theAdjointSimManager->GetEkinAtEndOfLastAdjointTrack(); G4double Ekin_per_nuc=theAdjointSimManager->GetEkinNucAtEndOfLastAdjointTrack(); // in case of ions G4ThreeVector dir = theAdjointSimManager->GetDirectionAtEndOfLastAdjointTrack(); G4ThreeVector pos = theAdjointSimManager->GetPositionAtEndOfLastAdjointTrack();
In order to have a code working for both forward and adjoint simulation mode, the extra code needed in user actions or analysis manager for the adjoint simulation mode can be separated to the code needed only for the normal forward simulation by using the following public method of G4AdjointSimManager:
G4bool GetAdjointSimMode();
that returns true if an adjoint simulation is running and false if not. The following code example shows how to normalize a detector signal and compute an answer matrix in the case of an adjoint simulation.
Example 3.5. Normalization in the case of an adjoint simulation. The detector signal S computed during the forward tracking phase is normalized to a primary source of e- with a differential directional flux given by the function F. An answer matrix of the signal is also computed.
G4double S = ...; // signal in the sensitive volume computed during a forward tracking phase
//Normalization of the signal for an adjoint simulation G4AdjointSimManager* theAdjSimManager = G4AdjointSimManager::GetInstance(); if (theAdjSimManager->GetAdjointSimMode()) { G4double normalized_S=0.; //normalized to a given e- primary spectrum G4double S_for_answer_matrix=0.; //for e- answer matrix if (theAdjSimManager->GetFwdParticleNameAtEndOfLastAdjointTrack() == "e-"){ G4double ekin_prim = theAdjSimManager->GetEkinAtEndOfLastAdjointTrack(); G4ThreeVector dir_prim = theAdjointSimManager->GetDirectionAtEndOfLastAdjointTrack(); G4double weight_prim = theAdjSimManager->GetWeightAtEndOfLastAdjointTrack(); S_for_answer_matrix = S*weight_prim; normalized_S = S_for_answer_matrix*F(ekin_prim,dir); //F(ekin_prim,dir_prim) gives the differential directional } //follows the code where normalized_S and S_for_answer_matrix are registered or whatever .... } //analysis/normalization code for forward simulation else { ... } ...
61
Toolkit Fundamentals
62
4.1.2. Solids
The STEP standard supports multiple solid representations. Constructive Solid Geometry (CSG) representations and Boundary Represented Solids (BREPs) are available. Different representations are suitable for different purposes, applications, required complexity, and levels of detail. CSG representations are easy to use and normally give superior performance, but they cannot reproduce complex solids such as those used in CAD systems. BREP representations can handle more extended topologies and reproduce the most complex solids. All constructed solids can stream out their contents via appropriate methods and streaming operators. For all solids it is possible to estimate the geometrical volume and the surface area by invoking the methods:
which return an estimate of the solid volume and total area in internal units respectively. For elementary solids the functions compute the exact geometrical quantities, while for composite or complex solids an estimate is made using Monte Carlo techniques. For all solids it is also possible to generate pseudo-random points lying on their surfaces, by invoking the method
which returns the generated point in local coordinates relative to the solid.
Box:
To create a box one can use the constructor:
63
In the picture: pX = 30, pY = 40, pZ = 60 by giving the box a name and its half-lengths along the X, Y and Z axis: pX half length in X pY half length in Y pZ half length in Z
This will create a box that extends from -pX to +pX in X, from -pY to +pY in Y, and from -pZ to +pZ in Z. For example to create a box that is 2 by 6 by 10 centimeters in full length, and called BoxA one should use the following code:
In the picture: pRMin = 10, pRMax = 15, pDz = 20 giving its name pName and its parameters which are: pRMin Inner radius pRMax Outer radius
64
pDz pDPhi
pSPhi
In the picture: pRmin1 = 5, pRmax1 = 10, pRmin2 = 20, pRmax2 = 25, pDz = 40, pSPhi = 0, pDPhi = 4/3*Pi giving its name pName, and its parameters which are: pRmin1 pRmin2 pDz pDPhi inside radius at -pDz inside radius at +pDz half length in z the angle of the segment in radians pRmax1 pRmax2 pSPhi outside radius at -pDz outside radius at +pDz starting angle of segment in radians the
Parallelepiped:
A parallelepiped is constructed using:
G4Para(const G4String& pName, G4double dx, G4double dy, G4double dz, G4double alpha, G4double theta, G4double phi)
In the picture: dx = 30, dy = 40, dz = 60 giving its name pName and its parameters which are: dx,dy,dz Half-length in x,y,z
65
alpha
Angle formed by the y axis and by the plane joining the centre of the faces parallel to the z-x plane at -dy and +dy Polar angle of the line joining the centres of the faces at -dz and +dz in z Azimuthal angle of the line joining the centres of the faces at -dz and +dz in z
theta phi
Trapezoid:
To construct a trapezoid use:
In the picture: dx1 = 30, dx2 = 10, dy1 = 40, dy2 = 15, dz = 60 to obtain a solid with name pName and parameters dx1 dx2 dy1 dy2 dz Half-length along x at the surface positioned at -dz Half-length along x at the surface positioned at +dz Half-length along y at the surface positioned at -dz Half-length along y at the surface positioned at +dz Half-length along z axis
Generic Trapezoid:
To build a generic trapezoid, the G4Trap class is provided. Here are the two costructors for a Right Angular Wedge and for the general trapezoid for it:
G4Trap(const G4String& pName, G4double pZ, G4double pY, G4double pX, G4double pLTX) G4Trap(const G4String& pName, G4double pDz, G4double pPhi, G4double pDx1, G4double pAlp1, G4double pDx3, G4double pAlp2)
In the picture:
66
pDx1 = 30, pDx2 = 40, pDy1 = 40, pDx3 = 10, pDx4 = 14, pDy2 = 16, pDz = 60, pTheta = 20*Degree, pPhi = 5*Degree, pAlp1 = pAlp2 = 10*Degree to obtain a Right Angular Wedge with name pName and parameters: pZ pY pX pLTX Length along z Length along y Length along x at the wider side Length along x at the narrower side (plTX<=pX)
or to obtain the general trapezoid (see the Software Reference Manual): pDx1 pDx2 pDz pTheta pPhi pDy1 pDy2 pDx3 pDx4 pAlp1 pAlp2 Half x length of the side at y=-pDy1 of the face at -pDz Half x length of the side at y=+pDy1 of the face at -pDz Half z length Polar angle of the line joining the centres of the faces at -/+pDz Azimuthal angle of the line joining the centre of the face at -pDz to the centre of the face at +pDz Half y length at -pDz Half y length at +pDz Half x length of the side at y=-pDy2 of the face at +pDz Half x length of the side at y=+pDy2 of the face at +pDz Angle with respect to the y axis from the centre of the side (lower endcap) Angle with respect to the y axis from the centre of the side (upper endcap)
Note on pAlph1/2: the two angles have to be the same due to the planarity condition.
In the picture: pRmin = 100, pRmax = 120, pSPhi = 0*Degree, pDPhi = 180*Degree, pSTheta = 0 Degree, pDTheta = 180*Degree to obtain a solid with name pName and parameters:
67
Inner radius Outer radius Starting Phi angle of the segment in radians Delta Phi angle of the segment in radians Starting Theta angle of the segment in radians Delta Theta angle of the segment in radians
In the picture: pRmax = 100 The Orb can be obtained from a Sphere with: pRmin = 0, pSPhi = 0, pDPhi = 2*Pi, pSTheta = 0, pDTheta = Pi pRmax Outer radius
Torus:
To build a torus use:
G4Torus(const G4String& pName, G4double pRmin, G4double pRmax, G4double pRtor, G4double pSPhi, G4double pDPhi)
In the picture: pRmin = 40, pRmax = 60, pRtor = 200, pSPhi = 0, pDPhi = 90*Degree to obtain a solid with name pName and parameters: pRmin pRmax pRtor pSPhi pDPhi Inside radius Outside radius Swept radius of torus Starting Phi angle in radians (fSPhi+fDPhi<=2PI, fSPhi>-2PI) Delta angle of the segment in radians
68
In addition, the Geant4 Design Documentation shows in the Solids Class Diagram the complete list of CSG classes, and the STEP documentation contains a detailed EXPRESS description of each CSG solid.
In the picture: phiStart = 1/4*Pi, phiTotal = 3/2*Pi, numZPlanes = 9, rInner = { 0, 0, 0, 0, 0, 0, 0, 0, 0}, rOuter = { 0, 10, 10, 5 , 5, 10 , 10 , 2, 2}, z = { 5, 7, 9, 11, 25, 27, 29, 31, 35 } where: phiStart phiTotal numZPlanes numRZ zPlane rInner rOuter r z Initial Phi starting angle Total Phi angle Number of z planes Number of corners in r,z space Position of z planes Tangent distance to inner surface Tangent distance to outer surface r coordinate of corners z coordinate of corners
Polyhedra (PGON):
Polyhedra (PGON) are implemented through G4Polyhedra:
G4Polyhedra(const G4String& G4double G4double G4int G4int const G4double const G4double const G4double pName, phiStart, phiTotal, numSide, numZPlanes, zPlane[], rInner[], rOuter[] )
69
In the picture: phiStart = -1/4*Pi, phiTotal= 5/4*Pi, numSide = 3, nunZPlanes = 7, rInner = { 0, 0, 0, 0, 0, 0, 0 }, rOuter = { 0, 15, 15, 4, 4, 10, 10 }, z = { 0, 5, 8, 13 , 30, 32, 35 }
where: phiStart phiTotal numSide numZPlanes numRZ zPlane rInner rOuter r z Initial Phi starting angle Total Phi angle Number of sides Number of z planes Number of corners in r,z space Position of z planes Tangent distance to inner surface Tangent distance to outer surface r coordinate of corners z coordinate of corners
General Ellipsoid:
The general ellipsoid with possible cut in Z can be defined as follows:
70
In the picture: pxSemiAxis = 10, pySemiAxis = 20, pzSemiAxis = 50, pzBottomCut = -10, pzTopCut = 40 A general (or triaxial) ellipsoid is a quadratic surface which is given in Cartesian coordinates by:
1.0 = (x/pxSemiAxis)**2 + (y/pySemiAxis)**2 + (z/pzSemiAxis)**2
where: pxSemiAxis pySemiAxis pzSemiAxis pzBottomCut pzTopCut Semiaxis in X Semiaxis in Y Semiaxis in Z lower cut plane level, z upper cut plane level, z
In the picture: pxSemiAxis = 30/75, pySemiAxis = 60/75, zMax = 50, pzTopCut = 25 where: pxSemiAxis pySemiAxis zMax pzTopCut Semiaxis in X Semiaxis in Y Height of elliptical cone upper cut plane level
71
An elliptical cone of height zMax, semiaxis pxSemiAxis, and semiaxis pySemiAxis is given by the parametric equations:
x = pxSemiAxis * ( zMax - u ) / u * Cos(v) y = pySemiAxis * ( zMax - u ) / u * Sin(v) z = u
In the picture: R1 = 20, R2 = 35, Dz = 20 R1 Radius at -Dz R2 Radius at +Dz greater than R1
Dz
Half length Z
In the picture: innerStereo = 0.7, outerStereo = 0.7, halfLenZ = 50, innerRadius = 20, outerRadius = 30 G4Hype is shaped with curved sides parallel to the z-axis, has a specified half-length along the z axis about which it is centred, and a given minimum and maximum radius. A minimum radius of 0 defines a filled Hype (with hyperbolic inner surface), i.e. inner radius = 0 AND inner stereo angle = 0. The inner and outer hyperbolic surfaces can have different stereo angles. A stereo angle of 0 gives a cylindrical surface: innerRadius outerRadius Inner radius Outer radius
72
Inner stereo angle in radians Outer stereo angle in radians Half length in Z
Tetrahedra:
A tetrahedra solid can be defined as follows:
G4Tet(const G4String& pName, G4ThreeVector anchor, G4ThreeVector p2, G4ThreeVector p3, G4ThreeVector p4, G4bool *degeneracyFlag=0)
In the picture: anchor = {0, 0, sqrt(3)}, p2 = { 0, 2*sqrt(2/3), -1/ sqrt(3) }, p3 = { -sqrt(2), sqrt(2/3),-1/sqrt(3) }, p4 = { sqrt(2), -sqrt(2/3) , -1/sqrt(3) } The solid is defined by 4 points in space: anchor p2 p3 p4 degeneracyFlag Anchor point Point 2 Point 3 Point 4 Flag indicating degeneracy of points
Extruded Polygon:
The extrusion of an arbitrary polygon (extruded solid) with fixed outline in the defined Z sections can be defined as follows (in a general way, or as special construct with two Z sections):
G4ExtrudedSolid(const G4String& pName, std::vector<G4TwoVector> polygon, std::vector<ZSection> zsections) G4ExtrudedSolid(const G4String& pName, std::vector<G4TwoVector> polygon, G4double hz, G4TwoVector off1, G4double scale1, G4TwoVector off2, G4double scale2)
In the picture: poligon = {-30,-30},{-30,30}, {30,30},{30,-30}, {15,-30}, {15,15},{-15,15},{-15,-30} zsections = [-60,{0,30},0.8], [-15, {0,-30},1.], [10, {0,0},0.6], [60,{0,30},1.2]
73
The z-sides of the solid are the scaled versions of the same polygon. polygon zsections hz off1, off2 scale1, scale2 the vertices of the outlined polygon defined in clockwise order the z-sections defined by z position in increasing order Half length in Z Offset of the side in -hz and +hz respectively Scale of the side in -hz and +hz respectively
Box Twisted:
A box twisted along one axis can be defined as follows:
G4TwistedBox(const G4String& G4double G4double G4double G4double pName, twistedangle, pDx, pDy, pDz)
In the picture: twistedangle = 30*Degree, pDx = 30, pDy =40, pDz = 60 G4TwistedBox is a box twisted along the z-axis. The twist angle cannot be greater than 90 degrees: twistedangle pDx pDy pDz Twist angle Half x length Half y length Half z length
In the picture: pDx1 = 30, pDx2 = 40, pDy1 = 40, pDx3 = 10, pDx4 = 14,
74
pDy2 = 16, pDz = 60, pTheta = 20*Degree, pDphi = 5*Degree, pAlph = 10*Degree, twistedangle = 30*Degree The first constructor of G4TwistedTrap produces a regular trapezoid twisted along the z-axis, where the caps of the trapezoid are of the same shape and size. The second constructor produces a generic trapezoid with polar, azimuthal and tilt angles. The twist angle cannot be greater than 90 degrees: twistedangle pDx1 pDx2 pDy pDz pTheta pDy1 pDx1 pDx2 pDy2 pDx3 pDx4 pAlph Twisted angle Half x length at y=-pDy Half x length at y=+pDy Half y length Half z length Polar angle of the line joining the centres of the faces at -/+pDz Half y length at -pDz Half x length at -pDz, y=-pDy1 Half x length at -pDz, y=+pDy1 Half y length at +pDz Half x length at +pDz, y=-pDy2 Half x length at +pDz, y=+pDy2 Angle with respect to the y axis from the centre of the side
In the picture: dx1 = 30, dx2 = 10, dy1 = 40, dy2 = 15, dz = 60, twistedangle = 30*Degree where: pDx1 pDx2 Half x length at the surface positioned at -dz Half x length at the surface positioned at +dz
75
Half y length at the surface positioned at -dz Half y length at the surface positioned at +dz Half z length Twisted angle
In the picture: pDz = 25 vertices = {-30, -30}, {-30, 30}, {30, 30}, {30, -30} {-5, -20}, {-20, 20}, {20, 20}, {20, -20} where: pDz vertices
In the picture: pDz = 25 vertices = {-30,-30}, {-30,30}, {30,30}, {30,-30} {-20,-20}, {-20, 20}, {20,20}, {20, 20}
In the picture: pDz = 25 vertices = {-30,-30}, {-30,30}, {30,30}, {30,-30} {0,0}, {0,0}, {0,0}, {0,0}
The order of specification of the coordinates for the vertices in G4GenericTrap is important. The first four points are the vertices sitting on the -hz plane; the last four points are the vertices sitting on the +hz plane. The order of defining the vertices of the solid is the following: point 0 is connected with points 1,3,4 point 1 is connected with points 0,2,5 point 2 is connected with points 1,3,6 point 3 is connected with points 0,2,7 point 4 is connected with points 0,5,7 point 5 is connected with points 1,4,6 point 6 is connected with points 2,5,7 point 7 is connected with points 3,4,6
Points can be identical in order to create shapes with less than 8 vertices; the only limitation is to have at least one triangle at +hz or -hz; the lateral surfaces are not necessarily planar. Not planar lateral surfaces are represented by a surface that linearly changes from the edge on -hz to the corresponding edge on +hz; it represents a sweeping surface with twist angle linearly dependent on Z, but it is not a real twisted surface mathematically described by equations as for the other twisted solids described in this chapter.
76
In the picture: endinnerrad = 10, endouterrad = 15, halfzlen = 20, dphi = 90*Degree, twistedangle = 60*Degree G4TwistedTubs is a sort of twisted cylinder which, placed along the z-axis and divided into phi-segments is shaped like an hyperboloid, where each of its segmented pieces can be tilted with a stereo angle. It can have inner and outer surfaces with the same stereo angle: twistedangle endinnerrad endouterrad halfzlen dphi Twisted angle Inner radius at endcap Outer radius at endcap Half z length Phi angle of a segment
Additional constructors are provided, allowing the shape to be specified either as: the number of segments in phi and the total angle for all segments, or a combination of the above constructors providing instead the inner and outer radii at z=0 with different zlengths along negative and positive z-axis.
77
The constituent solids of a Boolean operation should possibly avoid be composed by sharing all or part of their surfaces. This precaution is necessary in order to avoid the generation of 'fake' surfaces due to precision loss, or errors in the final visualization of the Boolean shape. Moreover, the final Boolean solid should represent a single 'closed' solid, i.e. a Boolean operation between two solids which are disjoint or far apart each other, is not a valid Boolean composition. The tracking cost for navigating in a Boolean solid in the current implementation, is proportional to the number of constituent solids. So care must be taken to avoid extensive, unecessary use of Boolean solids in performance-critical areas of a geometry description, where each solid is created from Boolean combinations of many other solids. Examples of the creation of the simplest Boolean solids are given below:
G4UnionSolid* union = new G4UnionSolid("Box+Cylinder", box, cyl); G4IntersectionSolid* intersection = new G4IntersectionSolid("Box*Cylinder", box, cyl); G4SubtractionSolid* subtraction = new G4SubtractionSolid("Box-Cylinder", box, cyl);
where the union, intersection and subtraction of a box and cylinder are constructed. The more useful case where one of the solids is displaced from the origin of coordinates also exists. In this case the second solid is positioned relative to the coordinate system (and thus relative to the first). This can be done in two ways: Either by giving a rotation matrix and translation vector that are used to transform the coordinate system of the second solid to the coordinate system of the first solid. This is called the passive method. Or by creating a transformation that moves the second solid from its desired position to its standard position, e.g., a box's standard position is with its centre at the origin and sides parallel to the three axes. This is called the active method. In the first case, the translation is applied first to move the origin of coordinates. Then the rotation is used to rotate the coordinate system of the second solid to the coordinate system of the first.
G4UnionSolid* unionMoved = new G4UnionSolid("Box+CylinderMoved", box, cyl, yRot, zTrans); // // The new coordinate system of the cylinder is translated so that // its centre is at +50 on the original Z axis, and it is rotated // with its X axis halfway between the original X and Z axes. // Now we build the same solid using the alternative method // G4RotationMatrix invRot = *(yRot->invert()); G4Transform3D transform(invRot, zTrans); G4UnionSolid* unionMoved = new G4UnionSolid("Box+CylinderMoved", box, cyl, transform);
Note that the first constructor that takes a pointer to the rotation-matrix (G4RotationMatrix*), does NOT copy it. Therefore once used a rotation-matrix to construct a Boolean solid, it must NOT be modified.
78
In contrast, with the alternative method shown, a G4Transform3D is provided to the constructor by value, and its transformation is stored by the Boolean solid. The user may modify the G4Transform3D and eventually use it again. When positioning a volume associated to a Boolean solid, the relative center of coordinates considered for the positioning is the one related to the first of the two constituent solids.
// sections,
The conical sections do not need to fill 360 degrees, but can have a common start and opening angle. start_angle opening_angle num_z_planes z_start z_values RMIN RMAX starting angle opening angle number of planes perpendicular to the z-axis used. starting value of z z coordinates of each plane radius of inner cone at each plane radius of outer cone at each plane
The polygonal solid G4BREPSolidPolyhedra is a shape defined by an inner and outer polygonal surface and two planes perpendicular to the Z axis. Each polygonal surface is created by linking a series of polygons created
79
at different planes perpendicular to the Z-axis. All these polygons all have the same number of sides (sides) and are defined at the same Z planes for both inner and outer polygonal surfaces. The polygons do not need to fill 360 degrees, but have a start and opening angle. The constructor takes the following parameters:
G4BREPSolidPolyhedra( const G4String& G4double G4double G4int G4int G4double const G4double const G4double const G4double pName, start_angle, opening_angle, sides, num_z_planes, z_start, z_values[], RMIN[], RMAX[] )
which in addition to its name have the following meaning: start_angle opening_angle sides num_z_planes z_start z_values RMIN RMAX starting angle opening angle number of sides of each polygon in the x-y plane number of planes perpendicular to the z-axis used. starting value of z z coordinates of each plane radius of inner polygon at each corner radius of outer polygon at each corner
the shape is defined by the number of sides sides of the polygon in the plane perpendicular to the z-axis.
Figure 4.1. Example of geometries imported from CAD system and converted to tessellated solids.
They can also be used to generate a solid bounded with a generic surface made of planar facets. It is important that the supplied facets shall form a fully enclose space to represent the solid. Two types of facet can be used for the construction of a G4TessellatedSolid: a triangular facet (G4TriangularFacet) and a quadrangular facet (G4QuadrangularFacet). An example on how to generate a simple tessellated shape is given below.
80
The G4TriangularFacet class is used for the contruction of G4TessellatedSolid. It is defined by three vertices, which shall be supplied in anti-clockwise order looking from the outside of the solid where it belongs. Its constructor looks like:
G4TriangularFacet ( const G4ThreeVector const G4ThreeVector const G4ThreeVector G4FacetVertexType Pt0, vt1, vt2, fType )
i.e., it takes 4 parameters to define the three vertices: G4FacetVertexType ABSOLUTE in which case Pt0, vt1 and vt2 are the three vertices in anti-clockwise order looking from the outside. RELATIVE in which case the first vertex is Pt0, the second vertex is Pt0+vt1 and the third vertex is Pt0+vt2, all in anti-clockwise order when looking from the outside.
G4FacetVertexType
The G4QuadrangularFacet class can be used for the contruction of G4TessellatedSolid as well. It is defined by four vertices, which shall be in the same plane and be supplied in anti-clockwise order looking from the outside of the solid where it belongs. Its constructor looks like:
81
i.e., it takes 5 parameters to define the four vertices: G4FacetVertexType ABSOLUTE in which case Pt0, vt1, vt2 and vt3 are the four vertices required in anti-clockwise order when looking from the outside. RELATIVE in which case the first vertex is Pt0, the second vertex is Pt0+vt, the third vertex is Pt0+vt2 and the fourth vertex is Pt0+vt3, in anti-clockwise order when looking from the outside.
G4FacetVertexType
Through the logical volume it is also possible to tune the granularity of the optimisation algorithm to be applied to the sub-tree of volumes represented. This is possible using the methods:
G4double GetSmartless() const void SetSmartless(G4double s)
The default smartless value is 2 and controls the average number of slices per contained volume which are used in the optimisation. The smaller the value, the less fine grained optimisation grid is generated; this will translate in a possible reduction of memory consumed for the optimisation of that portion of geometry at the price of a slight CPU time increase at tracking time. Manual tuning of the optimisation is in general not required, since the
82
optimal granularity level is computed automatically and adapted to the specific geometry setup; however, in some cases (like geometry portions with 'dense' concentration of volumes distributed in a non-uniform way), it may be necessary to adopt manual tuning for helping the optimisation process in dealing with the most critical areas. By setting the verbosity to 2 through the following UI run-time command:
/run/verbose 2
a statistics of the memory consumed for the allocated optimisation nodes will be displayed volume by volume, allowing to easily identify the critical areas which may eventually require manual intervention. The logical volume provides a way to estimate the mass of a tree of volumes defining a detector or sub-detector. This can be achieved by calling the method:
G4double GetMass(G4bool forced=false)
The mass of the logical volume tree is computed from the estimated geometrical volume of each solid and material associated with the logical volume and its daughters. Note that this computation may require a considerable amount of time, depending on the complexity of the geometry tree. The returned value is cached by default and can be used for successive calls, unless recomputation is forced by providing true for the boolean argument forced in input. Computation should be forced if the geometry setup has changed after the previous call. Finally, the Logical Volume manages the information relative to the Envelopes hierarchy required for fast Monte Carlo parameterisations (Section 5.2.6).
A G4Region must then be assigned to a logical volume, in order to make it a Root Logical Volume:
G4Region* emCalorimeter = new G4Region("EM-Calorimeter"); emCalorimeter->AddRootLogicalVolume(emCalorimeter);
A root logical volume is the first volume at the top of the hierarchy to which a given region is assigned. Once the region is assigned to the root logical volume, the information is automatically propagated to the volume tree, so that each daughter volume shares the same region. Propagation on a tree branch will be interrupted if an already existing root logical volume is encountered. A specific Production Cut can be assigned to the region, by defining and assigning to it a G4ProductionCut object
emCalorimeter->SetProductionCuts(emCalCuts);
Section 5.4.2 describes how to define a production cut. The same region can be assigned to more than one root logical volume, and root logical volumes can be removed from an existing region. A logical volume can have only one region assigned to it. Regions will be automatically registered in a store which will take care of destroying them at the end of the job. A default region with a default production cut is automatically created and assigned to the world volume.
83
Regions can also become 'envelopes' for fast-simulation; can be assigned user-limits or generic user-information (G4VUserRegionInformation); can be associated to specific stepping-actions (G4UserSteppingAction) or have assigned a local magnetic-field (local fields specifically associated to logical volumes take precedence anyhow).
where: pRot tlate pCurrentLogical pName pMotherLogical pMany pCopyNo pSurfChk Rotation with respect to its mother volume Translation with respect to its mother volume The associated Logical Volume String identifier for this placement The associated mother volume For future use. Can be set to false Integer which identifies this placement if true activates check for overlaps with existing volumes
Care must be taken because the rotation matrix is not copied by a G4PVPlacement. So the user must not modify it after creating a Placement that uses it. However the same rotation matrix can be re-used for many volumes.
84
Currently Boolean operations are not implemented at the level of physical volume. So pMany must be false. However, an alternative implementation of Boolean operations exists. In this approach a solid can be created from the union, intersection or subtraction of two solids. See Section 4.1.2.2 above for an explanation of this. The mother volume must be specified for all volumes except the world volume. An alternative way to specify a Placement utilizes a different method to place the volume. The solid itself is moved by rotating and translating it to bring it into the system of coordinates of the mother volume. This active method can be utilized using the following constructor:
G4PVPlacement( G4Transform3D G4LogicalVolume* const G4String& G4LogicalVolume* G4bool G4int G4bool solidTransform, pCurrentLogical, pName, pMotherLogical, pMany, pCopyNo, pSurfChk=false )
An alternative method to specify the mother volume is to specify its placed physical volume. It can be used in either of the above methods of specifying the placement's position and rotation. The effect will be exactly the same as for using the mother logical volume. Note that a Placement Volume can still represent multiple detector elements. This can happen if several copies exist of the mother logical volume. Then different detector elements will belong to different branches of the tree of the hierarchy of geometrical volumes.
Replicas:
Replicas are repeated volumes in the case when the multiple copies of the volume are all identical. The coordinate axis and the number of replicas need to be specified for the program to compute at run time the transformation matrix corresponding to each copy.
G4PVReplica( const G4String& G4LogicalVolume* G4LogicalVolume* const EAxis const G4int const G4double const G4double pName, pCurrentLogical, pMotherLogical, // OR G4VPhysicalVolume* pAxis, nReplicas, width, offset=0 )
where: pName pCurrentLogical pMotherLogical pAxis nReplicas width offset String identifier for the replicated volume The associated Logical Volume The associated mother volume The axis along with the replication is applied The number of replicated volumes The width of a single replica along the axis of replication Possible offset associated to mother offset along the axis of replication
G4PVReplica represents nReplicas volumes differing only in their positioning, and completely filling the containing mother volume. Consequently if a G4PVReplica is 'positioned' inside a given mother it MUST be the
85
mother's only daughter volume. Replica's correspond to divisions or slices that completely fill the mother volume and have no offsets. For Cartesian axes, slices are considered perpendicular to the axis of replication. The replica's positions are calculated by means of a linear formula. Replication may occur along: Cartesian axes (kXAxis,kYAxis,kZAxis) The replications, of specified width width*(nReplicas-1)*0.5+n*width,0,0) have coordinates of form (-
where n=0.. nReplicas-1 for the case of kXAxis, and are unrotated. Radial axis (cylindrical polar) (kRho) The replications are cons/tubs sections, centred on the origin and are unrotated. They have radii of width*n+offset to width*(n+1)+offset where n=0..nReplicas-1 Phi axis (cylindrical polar) (kPhi) The replications are phi sections or wedges, and of cons/tubs form. They have phi of offset+n*width to offset+(n+1)*width where n=0..nReplicas-1 The coordinate system of the replicas is at the centre of each replica for the cartesian axis. For the radial case, the coordinate system is unchanged from the mother. For the phi axis, the new coordinate system is rotated such that the X axis bisects the angle made by each wedge, and Z remains parallel to the mother's Z axis. The solid associated via the replicas' logical volume should have the dimensions of the first volume created and must be of the correct symmetry/type, in order to assist in good visualisation. ex. For X axis replicas in a box, the solid should be another box with the dimensions of the replications. (same Y & Z dimensions as mother box, X dimension = mother's X dimension/nReplicas). Replicas may be placed inside other replicas, provided the above rule is observed. Normal placement volumes may be placed inside replicas, provided that they do not intersect the mother's or any previous replica's boundaries. Parameterised volumes may not be placed inside. Because of these rules, it is not possible to place any other volume inside a replication in radius. The world volume cannot act as a replica, therefore it cannot be sliced. During tracking, the translation + rotation associated with each G4PVReplica object is modified according to the currently 'active' replication. The solid is not modified and consequently has the wrong parameters for the cases of phi and r replication and for when the cross-section of the mother is not constant along the replication. Example:
86
RepX is an array of 5 replicas of width 10*mm, positioned inside and completely filling the volume pointed by pContainingMother. The mother's X length must be 5*10*mm=50*mm (for example, if the mother's solid were a Box of half lengths [25,25,25] then the replica's solid must be a box of half lengths [25,25,5]). If the containing mother's solid is a tube of radius 50*mm and half Z length of 25*mm, RepR divides the mother tube into 5 cylinders (hence the solid associated with pRepRLogical must be a tube of radius 10*mm, and half Z length 25*mm); repRZ divides it into 5 shorter cylinders (the solid associated with pRepRZLogical must be a tube of radius 10*mm, and half Z length 5*mm); finally, repRZPhi divides it into 4 tube segments with full angle of 90 degrees (the solid associated with pRepRZPhiLogical must be a tube segment of radius 10*mm, half Z length 5*mm and delta phi of M_PI*0.5*rad). No further volumes may be placed inside these replicas. To do so would result in intersecting boundaries due to the r replications.
Parameterised Volumes:
Parameterised Volumes are repeated volumes in the case in which the multiple copies of a volume can be different in size, solid type, or material. The solid's type, its dimensions, the material and the transformation matrix can all be parameterised in function of the copy number, both when a strong symmetry exist and when it does not. The user implements the desired parameterisation function and the program computes and updates automatically at run time the information associated to the Physical Volume. An example of creating a parameterised volume (by dimension and position) exists in novice example N02. The implementation is provided in the two classes ExN02DetectorConstruction and ExN02ChamberParameterisation. To create a parameterised volume, one must first create its logical volume like trackerChamberLV below. Then one must create his own parameterisation class (ExN02ChamberParameterisation) and instantiate an object of this class (chamberParam). We will see how to create the parameterisation below.
87
G4PVParameterised( const G4String& G4LogicalVolume* G4LogicalVolume* const EAxis const G4int G4VPVParameterisation* G4bool
Note that for a parameterised volume the user must always specify a mother volume. So the world volume can never be a parameterised volume, nor it can be sliced. The mother volume can be specified either as a physical or a logical volume. pAxis specifies the tracking optimisation algorithm to apply: if a valid axis (the axis along which the parameterisation is performed) is specified, a simple one-dimensional voxelisation algorithm is applied; if "kUndefined" is specified instead, the default three-dimensional voxelisation algorithm applied for normal placements will be activated. In the latter case, more voxels will be generated, therefore a greater amount of memory will be consumed by the optimisation algorithm. pSurfChk if true activates a check for overlaps with existing volumes or paramaterised instances. The parameterisation mechanism associated to a parameterised volume is defined in the parameterisation class and its methods. Every parameterisation must create two methods: ComputeTransformation defines where one of the copies is placed, ComputeDimensions defines the size of one copy, and a constructor that initializes any member variables that are required. An example is ExN02ChamberParameterisation that parameterises a series of boxes of different sizes
These methods works as follows: The ComputeTransformation method is called with a copy number for the instance of the parameterisation under consideration. It must compute the transformation for this copy, and set the physical volume to utilize this transformation:
void ExN02ChamberParameterisation::ComputeTransformation (const G4int copyNo,G4VPhysicalVolume *physVol) const { G4double Zposition= fStartZ + copyNo * fSpacing; G4ThreeVector origin(0,0,Zposition); physVol->SetTranslation(origin); physVol->SetRotation(0); }
Note that the translation and rotation given in this scheme are those for the frame of coordinates (the passive method). They are not for the active method, in which the solid is rotated into the mother frame of coordinates. Similarly the ComputeDimensions method is used to set the size of that copy.
88
void ExN02ChamberParameterisation::ComputeDimensions (G4Box & trackerChamber, const G4int copyNo, const G4VPhysicalVolume * physVol) const { G4double halfLength= fHalfLengthFirst + (copyNo-1) * fHalfLengthIncr; trackerChamber.SetXHalfLength(halfLength); trackerChamber.SetYHalfLength(halfLength); trackerChamber.SetZHalfLength(fHalfWidth); }
The user must ensure that the type of the first argument of this method (in this example G4Box &) corresponds to the type of object the user give to the logical volume of parameterised physical volume. More advanced usage allows the user: to change the type of solid by creating a ComputeSolid method, or to change the material of the volume by creating a ComputeMaterial method. This method can also utilise information from a parent or other ancestor volume (see the Nested Parameterisation below.) for the parameterisation. Example N07 shows a simple parameterisation by material. A more complex example is provided in examples/ extended/medical/DICOM, where a phantom grid of cells is built using a parameterisation by material defined through a map.
Note
Currently for many cases it is not possible to add daughter volumes to a parameterised volume. Only parameterised volumes all of whose solids have the same size are allowed to contain daughter volumes. When the size or type of solid varies, adding daughters is not supported. So the full power of parameterised volumes can be used only for "leaf" volumes, which contain no other volumes. A hierarchy of volumes included in a parameterised volume cannot vary. Therefore, it is not possible to implement a parameterisation which can modify the hierachy of volumes included inside a specific parameterised copy.
The implementation of the method can utilise any information from a parent or other ancestor volume of its parameterised physical volume, but typically it will use only the copy number:
G4Material*
89
SampleNestedParameterisation::ComputeMaterial(G4VPhysicalVolume *currentVol, const G4int no_lev, const G4VTouchable *parentTouchable) { G4Material *material=0; // Get the information about the parent volume G4int no_parent= parentTouchable->GetReplicaNumber(); G4int no_total= no_parent + no_lev; // A simple 'checkerboard' pattern of two materials if( no_total / 2 == 1 ) material= material1; else material= material2; // Set the material to the current logical volume G4LogicalVolume* currentLogVol= currentVol->GetLogicalVolume(); currentLogVol->SetMaterial( material ); return material; }
Nested parameterisations are suitable for the case of regular, 'voxel' geometries in which a large number of 'equal' volumes are required, and their only difference is in their material. By creating two (or more) levels of parameterised physical volumes it is possible to divide space, while requiring only limited additional memory for very fine-level optimisation. This provides fast navigation. Alternative implementations, taking into account the regular structure of such geometries in navigation are under study.
Divisions of Volumes
Divisions in Geant4 are implemented as a specialized type of parameterised volumes. They serve to divide a volume into identical copies along one of its axes, providing the possibility to define an offset, and without the limitation that the daugthers have to fill the mother volume as it is the case for the replicas. In the case, for example, of a tube divided along its radial axis, the copies are not strictly identical, but have increasing radii, although their widths are constant. To divide a volume it will be necessary to provide: 1. the axis of division, and 2. either the number of divisions (so that the width of each division will be automatically calculated), or the division width (so that the number of divisions will be automatically calculated to fill as much of the mother as possible), or both the number of divisions and the division width (this is especially designed for the case where the copies do not fully fill the mother). An offset can be defined so that the first copy will start at some distance from the mother wall. The dividing copies will be then distributed to occupy the rest of the volume. There are three constructors, corresponding to the three input possibilities described above: Giving only the number of divisions:
G4PVDivision( const G4String& pName, G4LogicalVolume* pCurrentLogical, G4LogicalVolume* pMotherLogical, const EAxis pAxis, const G4int nDivisions, const G4double offset )
90
where: pName pCurrentLogical pMotherLogical pAxis nDivisions width offset String identifier for the replicated volume The associated Logical Volume The associated mother Logical Volume The axis along which the division is applied The number of divisions The width of a single division along the axis Possible offset associated to the mother along the axis of division
The parameterisation is calculated automatically using the values provided in input. Therefore the dimensions of the solid associated with pCurrentLogical will not be used, but recomputed through the G4VParameterisation::ComputeDimension() method. Since G4VPVParameterisation may have different ComputeDimension() methods for each solid type, the user must provide a solid that is of the same type as of the one associated to the mother volume. As for any replica, the coordinate system of the divisions is related to the centre of each division for the cartesian axis. For the radial axis, the coordinate system is the same of the mother volume. For the phi axis, the new coordinate system is rotated such that the X axis bisects the angle made by each wedge, and Z remains parallel to the mother's Z axis. As divisions are parameterised volumes with constant dimensions, they may be placed inside other divisions, except in the case of divisions along the radial axis. It is also possible to place other volumes inside a volume where a division is placed. The list of volumes that currently support divisioning and the possible division axis are summarised below: G4Box G4Tubs G4Cons G4Trd G4Para G4Polycone G4Polyhedra (*) - G4Polyhedra: kPhi - the number of divisions has to be the same as solid sides, (i.e. numSides), the width will not be taken into account. In the case of division along kRho of G4Cons, G4Polycone, G4Polyhedra, if width is provided, it is taken as the width at the -Z radius; the width at other radii will be scaled to this one. kXAxis, kYAxis, kZAxis kRho, kPhi, kZAxis kRho, kPhi, kZAxis kXAxis, kYAxis, kZAxis kXAxis, kYAxis, kZAxis kRho, kPhi, kZAxis kRho, kPhi, kZAxis (*)
91
Examples are given below in listings Example 4.4 and Example 4.5.
Example 4.5. An example of a box division along different axes, with or without offset.
G4Box* motherSolid = new G4Box("motherSolid", 0.5*m, 0.5*m, 0.5*m); G4LogicalVolume* motherLog = new G4LogicalVolume(motherSolid, material, "mother",0,0,0); G4Para* divSolid = new G4Para("divSolid", 0.512*m, 1.21*m, 1.43*m); G4LogicalVolume* childLog = new G4LogicalVolume(divSolid, material, "child",0,0,0); G4PVDivision divBox1("division along X giving nDiv", childLog, motherLog, kXAxis, 5, 0.); G4PVDivision divBox2("division along X giving width and offset", childLog, motherLog, kXAxis, 0.1*m, 0.45*m); G4PVDivision divBox3("division along X giving nDiv, width and offset", childLog, motherLog, kXAxis, 3, 0.1*m, 0.5*m);
divBox1 is a division of a box along its X axis in 5 equal copies. Each copy will have a dimension in meters of [0.2, 1., 1.]. divBox2 is a division of the same box along its X axis with a width of 0.1 meters and an offset of 0.5 meters. As the mother dimension along X of 1 meter (0.5*m of halflength), the division will be sized in total 1 0.45 = 0.55 meters. Therefore, there's space for 5 copies, the first extending from -0.05 to 0.05 meters in the mother's frame and the last from 0.35 to 0.45 meters. divBox3 is a division of the same box along its X axis in 3 equal copies of width 0.1 meters and an offset of 0.5 meters. The first copy will extend from 0. to 0.1 meters in the mother's frame and the last from 0.2 to 0.3 meters.
divPconePhiW is a division of a polycone along its phi axis in equal copies of width 30 degrees with an offset of 60 degrees. As the mother extends from 0 to 180 degrees, there's space for 4 copies. All the copies
92
have a starting angle of 20 degrees (as for the mother) and a phi extension of 30 degrees. They are rotated around the Z axis by 60 and 30 degrees, so that the first copy will extend from 80 to 110 and the last from 170 to 200 degrees. divPconeZN is a division of the same polycone along its Z axis. As the mother polycone has two sections, it will be divided in two one-section polycones, the first one extending from -1 to -0.25 meters, the second from -0.25 to 1 meters. Although specified, the offset will not be used.
93
These methods are valid only for the touchable-history type, as specified also below. An update method, with different arguments is available, so that the information in a touchable can be updated: 8. UpdateYourself(vol, history) takes a physical volume pointer and can additionally take a NavigationHistory pointer.
this will return a handle to the touchable. The methods that differentiate the touchable-history from other touchables (since they have meaning only for this type...), are:
G4int GetHistoryDepth() const; G4int MoveUpHistory( G4int num_levels = 1 );
The first method is used to find out how many levels deep in the geometry tree the current volume is. The second method asks the touchable to eliminate its deepest level. As mentioned above, MoveUpHistory(num) significantly modifies the state of a touchable.
where: WWW - assembly volume instance number XXX - assembly volume imprint number YYY - the name of the placed logical volume ZZZ - the logical volume index inside the assembly volume
It is however possible to access the constituent physical volumes of an assembly and eventually customise ID and copy-number.
4.1.6.4. Example
This example shows how to use the G4AssemblyVolume class. It implements a layered detector where each layer consists of 4 plates. In the code below, at first the world volume is defined, then solid and logical volume for the plate are created, followed by the definition of the assembly volume for the layer. The assembly volume for the layer is then filled by the plates in the same way as normal physical volumes are placed inside a mother volume. Finally the layers are placed inside the world volume as the imprints of the assembly volume (see Example 4.7).
95
96
G4PhysicalVolumesPair Replicate(const G4String& G4LogicalVolume* G4LogicalVolume* EAxis G4int G4double G4double G4PhysicalVolumesPair Divide(const G4String& G4LogicalVolume* G4LogicalVolume* EAxis G4int G4double G4double
The method Place() used for placements, evaluates the passed transformation. In case the transformation contains a reflection, the factory will act as follows: 1. Performs the transformation decomposition. 2. Creates a new reflected solid and logical volume, or retrieves them from a map if the reflected object was already created. 3. Transforms the daughters (if any) and place them in the given mother. If successful, the result is a pair of physical volumes, where the second physical volume is a placement in a reflected mother. Optionally, it is also possible to force the overlaps check at the time of placement, by activating the surfCheck flag. The method Replicate() creates replicas in the given mother. If successful, the result is a pair of physical volumes, where the second physical volume is a replica in a reflected mother.
97
The method Divide() creates divisions in the given mother. If successful, the result is a pair of physical volumes, where the second physical volume is a division in a reflected mother. There exists also two more variants of this method which may specify or not width or number of divisions.
Notes
In order to reflect hierarchies containing divided volumes, it is necessary to explicitely instantiate a concrete division factory -before- applying the actual reflection: (i.e. G4PVDivisionFactory::GetInstance();). Reflection of generic parameterised volumes is not possible yet.
// // // // // // //
the transformation with reflection the actual name the logical volume the mother volume no boolean operation copy number no overlap check triggered
// // // // // //
layer name layer logical volume (defined elsewhere) its mother axis of replication number of replica width of replica
98
G4NormalNavigation - provides location & distance computation functions for geometries containing 'placement' volumes, with no voxels. G4VoxelNavigation - provides location and distance computation functions for geometries containing 'placement' physical volumes with voxels. Internally a stack of voxel information is maintained. Private functions allow for isotropic distance computation to voxel boundaries and for computation of the 'next voxel' in a specified direction. G4ParameterisedNavigation - provides location and distance computation functions for geometries containing parameterised volumes with voxels. Voxel information is maintained similarly to G4VoxelNavigation, but computation can also be simpler by adopting voxels to be one level deep only (unrefined, or 1D optimisation) G4ReplicaNavigation - provides location and distance computation functions for replicated volumes. In addition, the navigator maintains a set of flags for exiting/entry optimisation. A navigator is not a singleton class; this is mainly to allow a design extension in future (e.g geometrical event biasing).
that is guaranteed to contain the point is found, and then scanning 'down' until the actual volume that contains the point is found. In ComputeStep() three types of computation are treated depending on the current containing volume: The volume contains normal (placement) daughters (or none) The volume contains a single parameterised volume object, representing many volumes The volume is a replica and contains normal (placement) daughters
This also allows to retrieve at any time a pointer to the world volume assigned for tracking:
G4VPhysicalVolume* tracking_world = tracking_navigator->GetWorldVolume();
The navigator for tracking also retains all the information of the current history of volumes transversed at a precise moment of the tracking during a run. Therefore, if the navigator for tracking is used during tracking for locating a generic point in the tree of volumes, the actual particle gets also -relocated- in the specified position and tracking will be of course affected ! In order to avoid the problem above and provide information about location of a point without affecting the tracking, it is suggested to either use an alternative G4Navigator object (which can then be assigned to the world-volume), or access the information through the step.
To determine the exact position in global coordinates in the mass geometry and convert to local coordinates (local to the current volume):
G4ThreeVector worldPosition = preStepPoint->GetPosition(); G4ThreeVector localPosition = theTouchable->GetHistory()-> GetTopTransform().TransformPoint(worldPosition);
100
Then, locate the point myPoint (defined in global coordinates), retrieve a touchable handle and do whatever you need with it:
aNavigator->LocateGlobalPointAndSetup(myPoint); G4TouchableHistoryHandle aTouchable = aNavigator->CreateTouchableHistoryHandle(); // Do whatever you need with it ... // ... convert point in local coordinates (local to the current volume) // G4ThreeVector localPosition = aTouchable->GetHistory()-> GetTopTransform().TransformPoint(myPoint); // ... convert back to global coordinates system G4ThreeVector globalPosition = aTouchable->GetHistory()-> GetTopTransform().Inverse().TransformPoint(localPosition);
If outside of the tracking run and given a generic local position (local to a given volume in the geometry tree), it is -not- possible to determine a priori its global position and convert it to the global coordinates system. The reason for this is rather simple, nobody can guarantee that the given (local) point is located in the right -copy- of the physical volume ! In order to retrieve this information, some extra knowledge related to the absolute position of the physical volume is required first, i.e. one should first determine a global point belonging to that volume, eventually making a dedicated scan of the geometry tree through a dedicated G4Navigator object and then apply the method above after having created the touchable for it.
where fVoxelHalfX is the half dimension of the voxel along X and fNoVoxelX is the number of voxels in the X dimension. Voxel 0 will be the one closest to the corner (fVoxelHalfX*fNoVoxelX, fVoxelHalfY*fNoVoxelY, fVoxelHalfZ*fNoVoxelZ).
101
Having the voxels filling completely the container volume allows to avoid the lengthy computation of ComputeStep() and ComputeSafety methods required in the traditional navigation algorithm. In this case, when a track is inside the parent volume, it has always to be inside one of the voxels and it will be only necessary to calculate the distance to the walls of the current voxel.
Example
To use the specialised navigation, G4PhantomParameterisation: it is required to first create an object of type
102
G4VPhysicalVolume * cont_phys = new G4PVPlacement(rotm, pos, // cont_logic, // "PhantomContainer", // world_logic, // false, // 1); //
// rotation translation logical volume name mother volume No op. bool. Copy number
The physical volume should be assigned as the container volume of the parameterisation:
param->BuildContainerSolid(cont_phys); // Assure that the voxels are completely filling the container volume // param->CheckVoxelsFillContainer( cont_solid->GetXHalfLength(), cont_solid->GetyHalfLength(), cont_solid->GetzHalfLength() ); // The parameterised volume which uses this parameterisation is placed // in the container logical volume // G4PVParameterised * patient_phys = new G4PVParameterised("Patient", // name patient_logic, // logical volume cont_logic, // mother volume kXAxis, // optimisation hint nVoxelX*nVoxelY*nVoxelZ, // number of voxels param); // parameterisation // Indicate that this physical volume is having a regular structure // patient_phys->SetRegularStructureId(1);
An example showing the application of the optimised navigation algorithm for phantoms geometries is available in examples/extended/medical/DICOM. It implements a real application for reading DICOM images and convert them to Geant4 geometries with defined materials and densities, allowing for different implementation solutions to be chosen (non optimised, classical 3D optimisation, nested parameterisations and use of G4PhantomParameterisation).
The latter will force more strict and less tolerant checks in step/safety computation to verify the correctness of the solids' response in the geometry. By combining check_mode with verbosity level-1, additional verbosity checks on the response from the solids can be activated.
103
G4GeometryManager::GetInstance()->SetWorldMaximumExtent(WorldExtent);
where, WorldExtent is the actual maximum extent of the world volume used for placing the whole geometry setup. Such call to G4GeometryManager must be done before defining any geometrical component of the setup (solid shape or volume), and can be done only once ! The class G4GeometryTolerance is to be used for retrieving the actual values defined for tolerances, surface (Cartesian), angular or radial respectively:
G4GeometryTolerance::GetInstance()->GetSurfaceTolerance(); G4GeometryTolerance::GetInstance()->GetAngularTolerance(); G4GeometryTolerance::GetInstance()->GetRadialTolerance();
Use marks the used materials. Only the elements and materials used in the logical volumes are kept in the detector object and are used to generate C++ constructors. By selecting multiple elements in the periodic table, a material from a combination of elements is assigned to a row of the compound material table. The minimum actions user have to do is to give a name to the material and define its density.
104
Use
Name
Elements Density
Unit
State
Temperature Unit
Pressure
Unit
By clicking the column Elements, a new window is open to select one of two methods: Add an element, giving its fraction by weight Add an element, giving its number of atoms.
4.1.9.2. Solids
The most popular CSG solids (G4Box, G4Tubs, G4Cons, G4Trd) and specific BREPs solids (Pcons, Pgons) are supported. All relevant parameters of such a solid can be specified in the parameter table, which pops up upon selection. Color, or the visualization attribute of a logical volume can be created, using color chooser panel. Users can view each solid using DAWN.
The lists of solid types, names of the materials defined in the material tables, and names of user-defined visualization attributes are shown automatically in respective table cell for user's choices. The construction and assignment of appropriate G4VSensitiveDetector are left to the user. entities for G4FieldManager and
Third, repeated copies are created by rotation around an axis, placing an object repeatedly on a ``cylindrical'' pattern. Fourth, replicas are created by slicing a volume along a Cartesian direction. Fifth, replicas are created by cutting a volume cylindrically.
4.1.9.6. Visualization
The whole geometry can be visualized after the compilation of the source code MyDetectorConstruction.cc with appropriate parts of Geant4. (In particular only the geometry and visualization, together with the small other parts they depend on, are needed.) MOMO provides Physics Editor to create standard electromagnetic physics and a minimum main program. See the on-line document in MOMO.
105
from the top-level source/g3tog4 directory. To build the converter executable rztog4, simply type
gmake bin
106
GSDV* routines for dividing volumes are implemented, using G4PVReplicas, for shapes: BOX, TUBE, TUBS, PARA - all axes; CONE, CONS - axes 2, 3; TRD1, TRD2, TRAP - axis 3; PGON, PCON - axis 2; PARA -axis 1; axis 2,3 for a special case GSPOSP is implemented via individual logical volumes for each instantiation. GSROTM is implemented. Reflections of hierachies based on plain CSG solids are implemented through the G3Division class. Hits are not implemented. Conversion of GEANT 3.21 magnetic field is currently not supported. However, the usage of magnetic field has to be turned on.
107
nRho - number of Rho points The new settings will be applied to the cylinder_test command. geometry/test/cylinder_scaleZ --> to define the resolution of the cylinder geometry, by specifying the fraction scale for points along Z. The new settings will be applied to the cylinder_test command. geometry/test/cylinder_scaleRho --> to define the resolution of the cylinder geometry, by specifying the fraction scale for points along Rho. The new settings will be applied to the cylinder_test command. geometry/test/recursion_start --> to set the initial level in the geometry tree for starting the recursion (default value being zero, i.e. the world volume). The new settings will then be applied to any recursive test. geometry/test/recursion_depth --> to set the depth in the geometry tree for recursion, so that recursion will stop after having reached the specified depth (the default being the full depth of the geometry tree). The new settings will then be applied to any recursive test.
To detect overlapping volumes, the built-in test uses the intersection of solids with linear trajectories. For example, consider Figure 4.4:
108
geometry/test/tolerance <new-value>
Finally, notice that no mention is made of the possible daughter volumes of A, B, C, and D. To keep the code simple, only the immediate daughters of a volume are checked at one pass. To test these "granddaughter" volumes, the daughters A, B, C, and D each have to be tested themselves in turn. To make this more automatic, an optional recursive algorithm is included; it first tests a target volume, then it loops over all daughter volumes and calls itself. Pay attention! For a complex geometry, checking the entire volume hierarchy can be extremely time consuming.
which will force the check for the specified volume, and can be therefore used to verify for overlaps also once the geometry is fully built. The check verifies if each placed or parameterised instance is overlapping with other instances or with its mother volume. A default resolution for the number of points to be generated and verified is provided. The method returns true if an overlap occurs. It is also possible to specify a "tolerance" by which overlaps not exceeding such quantity will not be reported; by default, all overlaps are reported. Using the visualization driver: DAVID The Geant4 visualization offers a powerful debugging tool for detecting potential intersections of physical volumes. The Geant4 DAVID visualization tool can infact automatically detect the overlaps between the volumes defined in Geant4 and converted to a graphical representation for visualization purposes. The accuracy of the graphical representation can be tuned onto the exact geometrical description. In the debugging, physicalvolume surfaces are automatically decomposed into 3D polygons, and intersections of the generated polygons are investigated. If a polygon intersects with another one, physical volumes which these polygons belong to are visualized in color (red is the default). The Figure 4.5 below is a sample visualization of a detector geometry with intersecting physical volumes highlighted:
109
Visual debugging of physical-volume surfaces is performed with the DAWNFILE driver defined in the visualization category and with the two application packages, i.e. Fukui Renderer "DAWN" and a visual intersection debugger "DAVID". DAWN and DAVID can be downloaded from the Web. How to compile Geant4 with the DAWNFILE driver incorporated is described in Section 8.3. If the DAWNFILE driver, DAWN and DAVID are all working well in your host machine, the visual intersection debugging of physical-volume surfaces can be performed as follows: Run your Geant4 executable, invoke the DAWNFILE driver, and execute visualization commands to visualize your detector geometry:
Idle> /vis/open DAWNFILE .....(setting camera etc)... Idle> /vis/drawVolume Idle> /vis/viewer/update
Then a file "g4.prim", which describes the detector geometry, is generated in the current directory and DAVID is invoked to read it. (The description of the format of the file g4.prim can be found from the DAWN web site documentation.) If DAVID detects intersection of physical-volume surfaces, it automatically invokes DAWN to visualize the detector geometry with the intersected physical volumes highlighted (See the above sample visualization). If no intersection is detected, visualization is skipped and the following message is displayed on the console:
-----------------------------------------------------!!! Number of intersected volumes : 0 !!! !!! Congratulations ! \(^o^)/ !!! ------------------------------------------------------
If you always want to skip visualization, set an environmental variable as follows beforehand:
% setenv DAVID_NO_VIEW 1
To control the precision associated to computation of intersections (default precision is set to 9), it is possible to use the environmental variable for the DAWNFILE graphics driver, as follows:
% setenv G4DAWNFILE_PRECISION 10
If necessary, re-visualize the detector geometry with intersected parts highlighted. The data are saved in a file "g4david.prim" in the current directory. This file can be re-visualized with DAWN as follows:
% dawn g4david.prim
It is also helpful to convert the generated file g4david.prim into a VRML-formatted file and perform interactive visualization of it with your WWW browser. The file conversion tool prim2wrml can be downloaded from the DAWN web site download pages. For more details, see the document of DAVID mentioned above.
110
Run-time commands are provided by the tool to navigate in the geometry tree. UNIX like navigation of the logical volume hierarchy is provided by the /olap/cd command. The root of the logical volume tree can be accessed by the character '/'. Any node in the volume tree can be accessed by a '/' separated string of regular expressions. If '/' is at the beginning of the string, the tree hierarchy is transversed from the root, otherwise from the currently chosen logical volume. Further the command /olap/goto [regexp] can be used to jump to the first logical volume matching the expression [regexp]. Every successful navigation command (/olap/cd, olap/goto) results in the construction of a NewWorld, the mother volume being the argument of the command and the daughter volumes being the direct daughters of the mother volume. /olap/pwd always shows where in the full geometrical hierarchy the current NewWorld and mother volume are located. For more detailed information, view the README file provided with the tool.
The above notification needs to be performed also if a material associated to a positioned volume is changed, in order to allow for the internal materials/cuts table to be updated. However, for relatively complex geometries the re-optimisation step may be extremely inefficient, since it has the effect that the whole geometry setup will be reoptimised and re-initialised. In cases where only a limited portion of the geometry has changed, it may be suitable to apply the re-optimisation only to the affected portion of the geometry (subtree). Since release 7.1 of the Geant4 toolkit, it is possible to apply re-optimisation local to the subtree of the geometry which has changed. The user will have to explicitly "open/close" the geometry providing a pointer to the top physical volume concerned:
Example 4.9. Opening and closing a portion of the geometry without notifying the G4RunManager.
#include "G4GeometryManager.hh" // Open geometry for the physical volume to be modified ... // G4GeometryManager::OpenGeometry(physCalor); // Modify dimension of the solid ... // physCalor->GetLogicalVolume()->GetSolid()->SetXHalfLength(12.5*cm); // Close geometry for the portion modified ... // G4GeometryManager::CloseGeometry(physCalor);
If the existing geometry setup is modified locally in more than one place, it may be convenient to apply such a technique only once, by specifying a physical volume on top of the hierarchy (subtree) containing all changed portions of the setup.
111
An alternative solution for dealing with dynamic geometries is to specify NOT to apply optimisation for the subtree affected by the change and apply the general solution of invoking the G4RunManager. In this case, a performance penalty at run-time may be observed (depending on the complexity of the not-optimised subtree), considering that, without optimisation, intersections to all volumes in the subtree will be explicitely computed each time.
4.2. Material
4.2.1. General considerations
In nature, materials (chemical compounds, mixtures) are made of elements, and elements are made of isotopes. Geant4 has three main classes designed to reflect this organization. Each of these classes has a table, which is a static data member, used to keep track of the instances of the respective classes created. G4Isotope This class describes the properties of atoms: atomic number, number of nucleons, mass per mole, etc. G4Element This class describes the properties of elements: effective atomic number, effective number of nucleons, effective mass per mole, number of isotopes, shell energy, and quantities like cross section per atom, etc. G4Material This class describes the macroscopic properties of matter: density, state, temperature, pressure, and macroscopic quantities like radiation length, mean free path, dE/dx, etc. Only the G4Material class is visible to the rest of the toolkit and used by the tracking, the geometry and the physics. It contains all the information relevant to its constituent elements and isotopes, while at the same time hiding their implementation details.
112
4.2.2.2. G4Element
A G4Element object has a name, symbol, effective atomic number, effective number of nucleons, effective mass of a mole, an index in the elements table, the number of isotopes, a vector of pointers to such isotopes, and a vector of relative abundances referring to such isotopes (where relative abundance means the number of atoms per volume). In addition, the class has methods to add, one by one, the isotopes which are to form the element. A G4Element object can be constructed by directly providing the effective atomic number, effective number of nucleons, and effective mass of a mole, if the user explicitly wants to do so. Alternatively, a G4Element object can be constructed by declaring the number of isotopes of which it will be composed. The constructor will "new" a vector of pointers to G4Isotopes and a vector of doubles to store their relative abundances. Finally, the method to add an isotope must be invoked for each of the desired (pre-existing) isotope objects, providing their addresses and relative abundances. At the last isotope entry, the system will automatically compute the effective atomic number, effective number of nucleons and effective mass of a mole, and will store "this" element in the elements table. A few quantities, with physical meaning or not, which are constant in a given element, are computed and stored here as "derived data members". Using the internal Geant4 database, a G4Element can be accessed by atomic number or by atomic symbol ("Al", "Fe", "Pb"...). In that case G4Element will be found from the list of existing elements or will be constructed using data from the Geant4 database, which is derived from the NIST database of elements and isotope compositions. Thus, the natural isotope composition can be built by default. The same element can be created as using the NIST database with the natural composition of isotopes and from scratch in user code with user defined isotope composition.
4.2.2.3. G4Material
A G4Material object has a name, density, physical state, temperature and pressure (by default the standard conditions), the number of elements and a vector of pointers to such elements, a vector of the fraction of mass for each element, a vector of the atoms (or molecules) numbers of each element, and an index in the materials table. In addition, the class has methods to add, one by one, the elements which will comprise the material. A G4Material object can be constructed by directly providing the resulting effective numbers, if the user explicitly wants to do so (an underlying element will be created with these numbers). Alternatively, a G4Material object can be constructed by declaring the number of elements of which it will be composed. The constructor will "new" a vector of pointers to G4Element and a vector of doubles to store their fraction of mass. Finally, the method to add an element must be invoked for each of the desired (pre-existing) element objects, providing their addresses and mass fractions. At the last element entry, the system will automatically compute the vector of the number of atoms of each element per volume, the total number of electrons per volume, and will store "this" material in the materials table. In the same way, a material can be constructed as a mixture of other materials and elements. It should be noted that if the user provides the number of atoms (or molecules) for each element comprising the chemical compound, the system automatically computes the mass fraction. A few quantities, with physical meaning or not, which are constant in a given material, are computed and stored here as "derived data members". Some materials are included in the internal Geant4 database, which were derived from the NIST database of material properties. Additionally a number of materials friquently used in HEP is included in the database. Materials are interrogated or constructed by their names (Section 9). There are UI commands for the material category, which provide an interactive access to the database. If material is created using the NIST database by it will consist by default of elements with the natural composition of isotopes.
113
Example 4.10. A program which illustrates the different ways to define materials.
#include #include #include #include "G4Isotope.hh" "G4Element.hh" "G4Material.hh" "G4UnitsTable.hh"
int main() { G4String name, symbol; G4double a, z, density; G4int iz, n; G4int ncomponents, natoms; G4double abundance, fractionmass; G4double temperature, pressure;
// // // //
a=mass of a mole; z=mean number of protons; iz=nb of protons in an isotope; n=nb of nucleons in an isotope;
G4UnitDefinition::BuildUnitsTable(); // define Elements a = 1.01*g/mole; G4Element* elH = new G4Element(name="Hydrogen",symbol="H" , z= 1., a); a = 12.01*g/mole; G4Element* elC = new G4Element(name="Carbon"
a = 14.01*g/mole; G4Element* elN = new G4Element(name="Nitrogen",symbol="N" , z= 7., a); a = 16.00*g/mole; G4Element* elO = new G4Element(name="Oxygen"
a = 28.09*g/mole; G4Element* elSi = new G4Element(name="Silicon", symbol="Si", z=14., a); a = 55.85*g/mole; G4Element* elFe = new G4Element(name="Iron"
a = 183.84*g/mole; G4Element* elW = new G4Element(name="Tungsten" ,symbol="W", a = 207.20*g/mole; G4Element* elPb = new G4Element(name="Lead"
z=74., a);
// define an Element from isotopes, by relative abundance G4Isotope* U5 = new G4Isotope(name="U235", iz=92, n=235, a=235.01*g/mole); G4Isotope* U8 = new G4Isotope(name="U238", iz=92, n=238, a=238.03*g/mole); G4Element* elU = new G4Element(name="enriched Uranium", symbol="U", ncomponents=2); elU->AddIsotope(U5, abundance= 90.*perCent); elU->AddIsotope(U8, abundance= 10.*perCent); cout << *(G4Isotope::GetIsotopeTable()) << endl; cout << *(G4Element::GetElementTable()) << endl;
114
// define simple materials density = 2.700*g/cm3; a = 26.98*g/mole; G4Material* Al = new G4Material(name="Aluminum", z=13., a, density); density = 1.390*g/cm3; a = 39.95*g/mole; vG4Material* lAr = new G4Material(name="liquidArgon", z=18., a, density); density = 8.960*g/cm3; a = 63.55*g/mole; G4Material* Cu = new G4Material(name="Copper"
, z=29., a, density);
// define a material from elements. case 1: chemical molecule density = 1.000*g/cm3; G4Material* H2O = new G4Material(name="Water", density, ncomponents=2); H2O->AddElement(elH, natoms=2); H2O->AddElement(elO, natoms=1); density = 1.032*g/cm3; G4Material* Sci = new G4Material(name="Scintillator", density, ncomponents=2); Sci->AddElement(elC, natoms=9); Sci->AddElement(elH, natoms=10); density = 2.200*g/cm3; G4Material* SiO2 = new G4Material(name="quartz", density, ncomponents=2); SiO2->AddElement(elSi, natoms=1); SiO2->AddElement(elO , natoms=2); density = 8.280*g/cm3; G4Material* PbWO4= new G4Material(name="PbWO4", density, ncomponents=3); PbWO4->AddElement(elO , natoms=4); PbWO4->AddElement(elW , natoms=1); PbWO4->AddElement(elPb, natoms=1); // define a material from elements. case 2: mixture by fractional mass density = 1.290*mg/cm3; G4Material* Air = new G4Material(name="Air " , density, ncomponents=2); Air->AddElement(elN, fractionmass=0.7); Air->AddElement(elO, fractionmass=0.3); // define a material from elements and/or others materials (mixture of mixtures) density = 0.200*g/cm3; G4Material* Aerog = new G4Material(name="Aerogel", density, ncomponents=3); Aerog->AddMaterial(SiO2, fractionmass=62.5*perCent); Aerog->AddMaterial(H2O , fractionmass=37.4*perCent); Aerog->AddElement (elC , fractionmass= 0.1*perCent);
of gas in non STP conditions = 27.*mg/cm3; = 50.*atmosphere; = 325.*kelvin; CO2 = new G4Material(name="Carbonic gas", density, ncomponents=2, kStateGas,temperature,pressure); CO2->AddElement(elC, natoms=1); CO2->AddElement(elO, natoms=2); density pressure temperature G4Material* = 0.3*mg/cm3; = 2.*atmosphere; = 500.*kelvin; steam = new G4Material(name="Water steam ", density, ncomponents=1, kStateGas,temperature,pressure); steam->AddMaterial(H2O, fractionmass=1.); // What about vacuum ? Vacuum is an ordinary gas with very low density density = universe_mean_density; //from PhysicalConstants.h pressure = 1.e-19*pascal; temperature = 0.1*kelvin; new G4Material(name="Galactic", z=1., a=1.01*g/mole, density, kStateGas,temperature,pressure); density pressure temperature G4Material* = 1.e-5*g/cm3; = 2.e-2*bar; = STP_Temperature; //from PhysicalConstants.h beam = new G4Material(name="Beam ", density, ncomponents=1,
115
kStateGas,temperature,pressure); beam->AddMaterial(Air, fractionmass=1.); // print the table of materials G4cout << *(G4Material::GetMaterialTable()) << endl; return EXIT_SUCCESS; }
As can be seen in the later examples, a material has a state: solid (the default), liquid, or gas. The constructor checks the density and automatically sets the state to gas below a given threshold (10 mg/cm3). In the case of a gas, one may specify the temperature and pressure. The defaults are STP conditions defined in PhysicalConstants.hh. An element must have the number of nucleons >= number of protons >= 1. A material must have non-zero values of density, temperature and pressure. Materials can also be defined using the internal Geant4 database. Example 4.11 illustrates how to do this for the same materials used in Example 4.10. There are also UI commands which allow the database to be accessed. The list of currently avalable material names (Section 9) is extended permanetly.
Example 4.11. A program which shows how to define materials from the internal database.
#include "globals.hh" #include "G4Material.hh" #include "G4NistManager.hh" int main() { G4NistManager* man = G4NistManager::Instance(); man->SetVerbose(1); // define elements G4Element* C = man->FindOrBuildElement("C"); G4Element* Pb = man->FindOrBuildMaterial("Pb"); // define pure NIST materials G4Material* Al = man->FindOrBuildMaterial("G4_Al"); G4Material* Cu = man->FindOrBuildMaterial("G4_Cu"); // define NIST materials G4Material* H2O = man->FindOrBuildMaterial("G4_WATER"); G4Material* Sci = man->FindOrBuildMaterial("G4_PLASTIC_SC_VINYLTOLUENE"); G4Material* SiO2 = man->FindOrBuildMaterial("G4_SILICON_DIOXIDE"); G4Material* Air = man->FindOrBuildMaterial("G4_AIR"); // HEP materials G4Material* PbWO4 G4Material* lAr G4Material* vac
// define gas material at non STP conditions (T = 120K, P=0.5atm) G4Material* coldAr = man->ConstructNewGasdMaterial("ColdAr","G4_Ar",120.*kelvin,0.5*atmosphere); // print the table of materials G4cout << *(G4Material::GetMaterialTable()) << endl; return EXIT_SUCCESS; }
116
Figure 4.6. The curved trajectory will be approximated by chords, so that the maximum estimated distance between curve and chord is less than the the miss distance.
In addition to the miss distance there are two more parameters which the user can set in order to adjust the accuracy (and performance) of tracking in a field. In particular these parameters govern the accuracy of the intersection with a volume boundary and the accuracy of the integration of other steps. As such they play an important role for tracking. The delta intersection parameter is the accuracy to which an intersection with a volume boundary is calculated. If a candidate boundary intersection is estimated to have a precision better than this, it is accepted. This parameter is especially important because it is used to limit a bias that our algorithm (for boundary crossing in a field) exhibits. This algorithm calculates the intersection with a volume boundary using a chord between two points on the curved particle trajectory. As such, the intersection point is always on the 'inside' of the curve. By setting a value for this parameter that is much smaller than some acceptable error, the user can limit the effect of this bias on, for example, the future estimation of the reconstructed particle momentum.
117
Figure 4.7. The distance between the calculated chord intersection point C and a computed curve point D is used to determine whether C is an accurate representation of the intersection of the curved path ADB with a volume boundary. Here CD is likely too large, and a new intersection on the chord AD will be calculated.
The delta one step parameter is the accuracy for the endpoint of 'ordinary' integration steps, those which do not intersect a volume boundary. This parameter is a limit on the estimated error of the endpoint of each physics step. It can be seen as akin to a statistical uncertainty and is not expected to contribute any systematic behavior to physical quantities. In contrast, the bias addressed by delta intersection is clearly correlated with potential systematic errors in the momentum of reconstructed tracks. Thus very strict limits on the intersection parameter should be used in tracking detectors or wherever the intersections are used to reconstruct a track's momentum. Delta intersection and delta one step are parameters of the Field Manager; the user can set them according to the demands of his application. Because it is possible to use more than one field manager, different values can be set for different detector regions. Note that reasonable values for the two parameters are strongly coupled: it does not make sense to request an accuracy of 1 nm for delta intersection and accept 100 μm for the delta one step error value. Nevertheless delta intersection is the more important of the two. It is recommended that these parameters should not differ significantly - certainly not by more than an order of magnitude.
118
Using the second parameter to SetFieldManager you choose whether daughter volumes of this logical volume will also be given this new field. If it has the value true, the field will be assigned also to its daughters, and all their sub-volumes. Else, if it is false, it will be copied only to those daughter volumes which do not have a field manager already.
Example 4.12. How to define a uniform electric field for the whole of a detector, extracted from example in examples/extended/field/field02 .
// in the header file (or first) #include "G4EqMagElectricField.hh" #include "G4UniformElectricField.hh" ... G4ElectricField* G4EqMagElectricField* G4MagIntegratorStepper* G4FieldManager* G4double G4ChordFinder* // in the source file { fEMfield = new G4UniformElectricField( G4ThreeVector(0.0,100000.0*kilovolt/cm,0.0)); // Create an equation of motion for this field fEquation = new G4EqMagElectricField(fEMfield); G4int nvar = 8; fStepper = new G4ClassicalRK4( fEquation, nvar ); // Get the global field manager fFieldManager= G4TransportationManager::GetTransportationManager()-> GetFieldManager(); // Set this field to the global field manager fFieldManager->SetDetectorField(fEMfield ); fMinStep = 0.010*mm ; // minimal step of 10 microns
fIntgrDriver = new G4MagInt_Driver(fMinStep, fStepper, fStepper->GetNumberOfVariables() ); fChordFinder = new G4ChordFinder(fIntgrDriver); fFieldManager->SetChordFinder( fChordFinder ); }
119
An example with an electric field is examples/extended/field/field02, where the class F02ElectricFieldSetup demonstrates how to set these and other parameters, and how to choose different Integration Steppers. The user can also create their own type of field, inheriting from G4VField, and an associated Equation of Motion class (inheriting from G4EqRhs) to simulate other types of fields.
G4int nvar = 8;
// To integrate time & energy // in addition to position, momentum G4EqMagElectricField* fEquation= new G4EqMagElectricField(fEMfield); fStepper = new G4SimpleHeum( fEquation, nvar ); // 3rd order, a good alternative to ClassicalRK fStepper = new G4SimpleRunge( fEquation, nvar ); // 2nd order, for less smooth fields fStepper = new G4CashKarpRKF45( fEquation ); // 4/5th order for very smooth fields
Specialized steppers for pure magnetic fields are also available. They take into account the fact that a local trajectory in a slowly varying field will not vary significantly from a helix. Combining this in with a variation the Runge-Kutta method can provide higher accuracy at lower computational cost when large steps are possible.
G4Mag_UsualEqRhs* fEquation = new G4Mag_UsualEqRhs(fMagneticField); fStepper = new G4HelixImplicitEuler( fEquation ); // Note that for magnetic field that do not vary with time, // the default number of variables suffices. // or .. fStepper = new G4HelixExplicitEuler( fEquation ); fStepper = new G4HelixSimpleRunge( fEquation );
A new stepper for propagation in magnetic field is available in release 9.3. Choosing the G4NystromRK4 stepper provides accuracy near that of G4ClassicalRK4 (4th order) with a significantly reduced cost in field evaluation. Using a novel analytical expression for estimating the error of a proposed step and the Nystrom reuse of the midpoint field value, it requires only 2 additional field evaluations per attempted step, in place of 10 field evaluations of ClassicalRK4 (which uses the general midpoint method for estimating the step error.)
120
It is proposed as an alternative stepper in the case of a pure magnetic field. It is not applicable for the simulation of electric or full electromagnetic or other types of field. For a pure magnetic field, results should be fully compatible with the results of ClassicalRK4 in nearly all cases. ( The only potential exceptions are large steps for tracks with small momenta - which cannot be integrated well by any RK method except the Helical extended methods.) You can choose an alternative stepper either when the field manager is constructed or later. At the construction of the ChordFinder it is an optional argument:
Example 4.13. How to set accuracy parameters for the 'global' field of the setup.
G4FieldManager *globalFieldManager; G4TransportationManager *transportMgr= G4TransportationManager::GetTransportationManager(); globalFieldManager = transportMgr->GetFieldManager(); // Relative accuracy values: G4double minEps= 1.0e-5; // Minimum & value for smallest steps G4double maxEps= 1.0e-4; // Maximum & value for largest steps globalFieldManager->SetMinimumEpsilonStep( minEps ); globalFieldManager->SetMaximumEpsilonStep( maxEps ); globalFieldManager->SetDeltaOneStep( 0.5e-3 * mm ); // 0.5 micrometer G4cout << "EpsilonStep: set min= " << minEps << " max= " << maxEps << G4endl;
We note that the relevant parameters above limit the inaccuracy in each step. The final inaccuracy due to the full trajectory will accumulate! The exact point at which a track crosses a boundary is also calculated with finite accuracy. To limit this inaccuracy, a parameter called DeltaIntersection is used. This is a maximum for the inaccuracy of a single boundary crossing.
121
Thus the accuracy of the position of the track after a number of boundary crossings is directly proportional to the number of boundaries.
G4MagneticField * pMagField;
pMagField,
distanceConst);
to configure itself using the parameters of the current track. An example of this will be available in examples/ extended/field05.
122
from the chord between endpoints.) For tracks with small curvature (typically low momentum particles in strong fields) this can cause a large number of steps even in areas where there are no volumes to intersect (something that is expected to be addressed in future development, in which the safety will be utilized to partially alleviate this limitation) especially in a region near a volume boundary (in which case it is necessary in order to discover whether a track might intersect a volume for only a short distance.) Requiring such precision at the intersection is clearly expensive, and new development would be necessary to minimize the expense. By contrast, changing the intersection parameter is less computationally expensive. It causes further calculation for only a fraction of the steps, in particular those that intersect a volume boundary.
#include "G4Mag_SpinEqRhs.hh" G4Mag_EqRhs* fEquation = new G4Mag_SpinEqRhs(magField); G4MagIntegratorStepper* pStepper = new G4ClassicalRK4(fEquation,12); notice the 12
2. in your PrimaryGenerator
particleGun->SetParticlePolarization(G4ThreeVector p)
for example:
where you set the initial spin direction. While the G4Mag_SpinEqRhs class constructor
anomaly = 1.165923e-3; }
sets the muon anomaly by default, the class also comes with the public method:
with which you can set the magnetic anomaly to any value you require. For the moment, the code is written such that field tracking of the spin is done only for particles with non-zero charge. Please, see the Forum posting: http://geant4-hn.slac.stanford.edu:5090/ HyperNews/public/get/emfields/88/3/1.html for modifications the user is required to make to facilitate neutron spin tracking.
4.4. Hits
4.4.1. Hit
A hit is a snapshot of the physical interaction of a track in the sensitive region of a detector. In it you can store information associated with a G4Step object. This information can be the position and time of the step, the momentum and energy of the track, the energy deposition of the step, geometrical information,
G4VHit
G4VHit is an abstract base class which represents a hit. You must inherit this base class and derive your own concrete hit class(es). The member data of your concrete hit class can be, and should be, your choice. G4VHit has two virtual methods, Draw() and Print(). To draw or print out your concrete hits, these methods should be implemented. How to define the drawing method is described in Section 8.9.
G4THitsCollection
G4VHit is an abstract class from which you derive your own concrete classes. During the processing of a given event, represented by a G4Event object, many objects of the hit class will be produced, collected and associated with the event. Therefore, for each concrete hit class you must also prepare a concrete class derived from G4VHitsCollection, an abstract class which represents a vector collection of user defined hits. G4THitsCollection is a template class derived from G4VHitsCollection, and the concrete hit collection class of a particular G4VHit concrete class can be instantiated from this template class. Each object of a hit collection must have a unique name for each event. G4Event has a G4HCofThisEvent class object, that is a container class of collections of hits. Hit collections are stored by their pointers, whose type is that of the base class.
124
class ExN04TrackerHit : public G4VHit { public: ExN04TrackerHit(); ~ExN04TrackerHit(); ExN04TrackerHit(const ExN04TrackerHit &right); const ExN04TrackerHit& operator=(const ExN04TrackerHit &right); int operator==(const ExN04TrackerHit &right) const; inline void * operator new(size_t); inline void operator delete(void *aHit); void Draw() const; void Print() const; private: G4double edep; G4ThreeVector pos; public: inline void SetEdep(G4double de) { edep = de; } inline G4double GetEdep() const { return edep; } inline void SetPos(G4ThreeVector xyz) { pos = xyz; } inline G4ThreeVector GetPos() const { return pos; } }; typedef G4THitsCollection<ExN04TrackerHit> ExN04TrackerHitsCollection; extern G4Allocator<ExN04TrackerHit> ExN04TrackerHitAllocator; inline void* ExN04TrackerHit::operator new(size_t) { void *aHit; aHit = (void *) ExN04TrackerHitAllocator.MallocSingle(); return aHit; } inline void ExN04TrackerHit::operator delete(void *aHit) { ExN04TrackerHitAllocator.FreeSingle((ExN04TrackerHit*) aHit); } #endif
G4Allocator is a class for fast allocation of objects to the heap through the paging mechanism. For details of G4Allocator, refer to Section 3.2.4. Use of G4Allocator is not mandatory, but it is recommended, especially for users who are not familiar with the C++ memory allocation mechanism or alternative tools of memory allocation. On the other hand, note that G4Allocator is to be used only for the concrete class that is not used as a base class of any other classes. For example, do not use the G4Trajectory class as a base class for a customized trajectory class, since G4Trajectory uses G4Allocator.
G4THitsMap
G4THitsMap is an alternative to G4THitsCollection. G4THitsMap does not demand G4VHit, but instead any variable which can be mapped with an integer key. Typically the key is a copy number of the volume, and the mapped value could for example be a double, such as the energy deposition in a volume. G4THitsMap is
125
convenient for applications which do not need to output event-by-event data but instead just accumulate them. All the G4VPrimitiveScorer classes discussed in Section 4.4.5 use G4THitsMap. G4THitsMap is derived from the G4VHitsCollection abstract base class and all objects of this class are also stored in G4HCofThisEvent at the end of an event. How to access a G4THitsMap object is discussed in the following section (Section 4.4.5).
where myEMcal is the name of your detector. The pointer to your sensitive detector must be set to one or more G4LogicalVolume objects to set the sensitivity of these volumes. The pointer should also be registered to G4SDManager, as described in Section 4.4.4. G4VSensitiveDetector has three major virtual methods. ProcessHits() This method is invoked by G4SteppingManager when a step is composed in the G4LogicalVolume which has the pointer to this sensitive detector. The first argument of this method is a G4Step object of the current step. The second argument is a G4TouchableHistory object for the ``Readout geometry'' described in the next section. The second argument is NULL if ``Readout geometry'' is not assigned to this sensitive detector. In this method, one or more G4VHit objects should be constructed if the current step is meaningful for your detector. Initialize() This method is invoked at the beginning of each event. The argument of this method is an object of the G4HCofThisEvent class. Hit collections, where hits produced in this particular event are stored, can be associated with the G4HCofThisEvent object in this method. The hit collections associated with the G4HCofThisEvent object during this method can be used for ``during the event processing'' digitization. EndOfEvent() This method is invoked at the end of each event. The argument of this method is the same object as the previous method. Hit collections occasionally created in your sensitive detector can be associated with the G4HCofThisEvent object.
126
by the ROhist argument. Thus, you will be able to use information from both the G4Step and the G4TouchableHistory coming from your Readout geometry. Note that since the association is done through a sensitive detector object, it is perfectly possible to have several Readout geometries in parallel.
which you must override in your concrete class. The G4VPhysicalVolume pointer you will have to return is of the physical world of the Readout geometry. The step by step procedure for constructing a Readout geometry is: inherit from G4VReadoutGeometry to define a MyROGeom class; implement the Readout geometry in the build() method, returning the physical world of this geometry. The world is specified in the same way as for the detector construction: a physical volume with no mother. The axis system of this world is the same as the one of the world for tracking. In this geometry you need to declare the sensitive parts in the same way as in the tracking geometry: by setting a non-NULL G4VSensitiveDetector pointer in, say, the relevant G4LogicalVolume objects. This sensitive class needs to be there, but will not be used. You will also need to assign well defined materials to the volumes you place in this geometry, but these materials are irrelevant since they will not be seen by the tracking. It is foreseen to allow the setting of a NULL pointer in this case of the parallel geometry. 127
in the construct() method of your concrete G4VUserDetectorConstruction class: instantiate your Readout geometry:
build it:
ROgeom->buildROGeometry();
That will invoke your build() method. Instantiate the sensitive detector which will receive the ROGeom pointer, MySensitive, and add this sensitive to the G4SDManager. Associate this sensitive to the volume(s) of the tracking geometry as usual. Associate the sensitive to the Readout geometry:
MySensitive->SetROgeometry(ROgeom);
4.4.4. G4SDManager
G4SDManager is the singleton manager class for sensitive detectors.
where detector_name can be the detector name or the category name. For example, if your EM calorimeter is named
The following is an example of how to access the hit collection of a particular concrete type:
G4int collectionID = fSDM->GetCollectionID("collection_name"); const G4Event* currentEvent = fRM->GetCurrentEvent(); G4HCofThisEvent* HCofEvent = currentEvent->GetHCofThisEvent(); MyHitsCollection* myCollection = (MyHitsCollection*)(HC0fEvent->GetHC(collectionID));
129
Example 4.15. An example of defining primitive sensitivity classes taken from ExN07DetectorConstruction.
void ExN07DetectorConstruction::SetupDetectors() { G4String filterName, particleName; G4SDParticleFilter* gammaFilter = new G4SDParticleFilter(filterName="gammaFilter",particleName="gamma"); G4SDParticleFilter* electronFilter = new G4SDParticleFilter(filterName="electronFilter",particleName="e-"); G4SDParticleFilter* positronFilter = new G4SDParticleFilter(filterName="positronFilter",particleName="e+"); G4SDParticleFilter* epFilter = new G4SDParticleFilter(filterName="epFilter"); epFilter->add(particleName="e-"); epFilter->add(particleName="e+");
for(G4int i=0;i<3;i++) { for(G4int j=0;j<2;j++) { // Loop counter j = 0 : absorber // = 1 : gap G4String detName = calName[i]; if(j==0) { detName += "_abs"; } else { detName += "_gap"; } G4MultiFunctionalDetector* det = new G4MultiFunctionalDetector(detName); // The second argument in each primitive means the "level" of geometrical hierarchy, // the copy number of that level is used as the key of the G4THitsMap. // For absorber (j = 0), the copy number of its own physical volume is used. // For gap (j = 1), the copy number of its mother physical volume is used, since there // is only one physical volume of gap is placed with respect to its mother. G4VPrimitiveScorer* primitive; primitive = new G4PSEnergyDeposit("eDep",j); det->RegisterPrimitive(primitive); primitive = new G4PSNofSecondary("nGamma",j); primitive->SetFilter(gammaFilter); det->RegisterPrimitive(primitive); primitive = new G4PSNofSecondary("nElectron",j); primitive->SetFilter(electronFilter); det->RegisterPrimitive(primitive); primitive = new G4PSNofSecondary("nPositron",j); primitive->SetFilter(positronFilter); det->RegisterPrimitive(primitive); primitive = new G4PSMinKinEAtGeneration("minEkinGamma",j); primitive->SetFilter(gammaFilter); det->RegisterPrimitive(primitive); primitive = new G4PSMinKinEAtGeneration("minEkinElectron",j); primitive->SetFilter(electronFilter); det->RegisterPrimitive(primitive); primitive = new G4PSMinKinEAtGeneration("minEkinPositron",j); primitive->SetFilter(positronFilter); det->RegisterPrimitive(primitive); primitive = new G4PSTrackLength("trackLength",j); primitive->SetFilter(epFilter); det->RegisterPrimitive(primitive); primitive = new G4PSNofStep("nStep",j); primitive->SetFilter(epFilter); det->RegisterPrimitive(primitive); G4SDManager::GetSDMpointer()->AddNewDetector(det); if(j==0) { layerLogical[i]->SetSensitiveDetector(det); } else { gapLogical[i]->SetSensitiveDetector(det); } } } }
Each G4THitsMap object can be accessed from G4HCofThisEvent with a unique collection ID number. This ID number can be obtained from G4SDManager::GetCollectionID() with a name of G4MultiFunctionalDetector
130
and G4VPrimitiveScorer connected with a slush ("/"). G4THitsMap has a [] operator taking the key value as an argument and returning the pointer of the value. Please note that the [] operator returns the pointer of the value. If you get zero from the [] operator, it does not mean the value is zero, but that the provided key does not exist. The value itself is accessible with an astarisk ("*"). It is advised to check the validity of the returned pointer before accessing the value. G4THitsMap also has a += operator in order to accumulate event data into run data. Example 4.16 shows the use of G4THitsMap.
ExN07Run::ExN07Run() { G4String detName[6] = {"Calor-A_abs","Calor-A_gap","Calor-B_abs","Calor-B_gap", "Calor-C_abs","Calor-C_gap"}; G4String primNameSum[6] = {"eDep","nGamma","nElectron","nPositron","trackLength","nStep"}; G4String primNameMin[3] = {"minEkinGamma","minEkinElectron","minEkinPositron"}; G4SDManager* SDMan = G4SDManager::GetSDMpointer(); G4String fullName; for(size_t i=0;i<6;i++) { for(size_t j=0;j<6;j++) { fullName = detName[i]+"/"+primNameSum[j]; colIDSum[i][j] = SDMan->GetCollectionID(fullName); } for(size_t k=0;k<3;k++) { fullName = detName[i]+"/"+primNameMin[k]; colIDMin[i][k] = SDMan->GetCollectionID(fullName); } } }
void ExN07Run::RecordEvent(const G4Event* evt) { G4HCofThisEvent* HCE = evt->GetHCofThisEvent(); if(!HCE) return; numberOfEvent++; for(size_t i=0;i<6;i++) { for(size_t j=0;j<6;j++) { G4THitsMap<G4double>* evtMap = (G4THitsMap<G4double>*)(HCE->GetHC(colIDSum[i][j])); mapSum[i][j] += *evtMap; } for(size_t k=0;k<3;k++) { G4THitsMap<G4double>* evtMap = (G4THitsMap<G4double>*)(HCE->GetHC(colIDMin[i][k])); std::map<G4int,G4double*>::iterator itr = evtMap->GetMap()->begin(); for(; itr != evtMap->GetMap()->end(); itr++) { G4int key = (itr->first); G4double val = *(itr->second); G4double* mapP = mapMin[i][k][key]; if( mapP && (val>*mapP) ) continue; mapMin[i][k].set(key,val); } } } }
131
132
in the cell. The expression for cell flux is given by the sum of (W*L)/V, where W is a particle weight, and is multiplied by the track length at each step. G4PSPassageCellFlux Passage cell flux is a volume based scorer similar to G4PSCellFlux. The only difference is that tracks which pass through a cell are taken into account. It means generated or stopped tracks inside the volume are excluded from the calculation.
Other scorers
G4PSMinKinEAtGeneration This scorer records the minimum kinetic energy of secondary particles at their production point in the volume in an event. This primitive scorer does not integrate the quantity, but records the minimum quantity. G4PSNofSecondary This class scores the number of secondary particles generated in the volume. The weight of the secondary track is taken into account. G4PSNofStep This class scores the number of steps in the cell. A particle weight is not applied. G4PSCellCharge This class scored the total charge of particles which has stoped in the volume.
that should return true if this particular step should be scored by the G4VSensitiveDetector or G4VPrimitiveScorer. While the user can implement his/her own filter class, Geant4 version 8.0 provides the following concrete filter classes: G4SDChargedFilter All charged particles are accepted. G4SDNeutralFilter All neutral particles are accepted. G4SDParticleFilter Particle species which are registered to this filter object by Add("particle_name") are accepted. More than one species can be registered. G4SDKineticEnergyFilter A track with kinetic energy greater than or equal to EKmin and smaller than EKmin is accepted. EKmin and EKmax should be defined as arguments of the constructor. The default values of EKmin and EKmax are zero and DBL_MAX. G4SDParticleWithEnergyFilter Combination of G4SDParticleFilter and G4SDParticleWithEnergyFilter. The use of the G4SDParticleFilter class is demonstrated in Example 4.15, where filters which accept gamma, electron, positron and electron/positron are defined.
133
appraise particle quantities related to special regions or surfaces, be applicable to all "cells" (physical volumes or replicas) of a given geometry, be customizable. Standard scoring must be provided for quantities such as tracks entering a cell, average weight of entering tracks, energy of entering tracks, and collisions inside the cell. A number of scorers have been created for this specific appliction: G4PSNofCollision This scorer records the number of collisions that occur within a scored volume/cell. There is the additional possibility to take into account the track weight whilst scoring the number of collisions, via the following command:
G4PSNofCollision* scorer1 = new G4PSNofCollision(psName="CollWeight"); scorer1->Weighted(true);
G4PSPopulation This scores the number of tracks within in a given cell per event. G4PSTrackLength The track lengths within a cell are measured and if, additionally, the result is desired to be weighted then the following code has to be implemented:
G4PSTrackLength* scorer5 = new G4PSTrackLength(psName="SLW"); scorer5->Weighted(true);
Further if the energy track flux is required then the following should be implemented:
G4PSTrackLength* scorer6 = new G4PSTrackLength(psName="SLWE"); scorer6->Weighted(true); scorer6->MultiplyKineticEnergy(true); MFDet->RegisterPrimitive(scorer6);
4.5. Digitization
4.5.1. Digi
A hit is created by a sensitive detector when a step goes through it. Thus, the sensitive detector is associated to the corresponding G4LogicalVolume object(s). On the other hand, a digit is created using information of hits and/ or other digits by a digitizer module. The digitizer module is not associated with any volume, and you have to implicitly invoke the Digitize() method of your concrete G4VDigitizerModule class. Typical usages of digitizer module include: simulate ADC and/or TDC
134
simulate readout scheme generate raw data simulate trigger logics simulate pile up
G4VDigi
G4VDigi is an abstract base class which represents a digit. You have to inherit this base class and derive your own concrete digit class(es). The member data of your concrete digit class should be defined by yourself. G4VDigi has two virtual methods, Draw() and Print().
G4TDigiCollection
G4TDigiCollection is a template class for digits collections, which is derived from the abstract base class G4VDigiCollection. G4Event has a G4DCofThisEvent object, which is a container class of collections of digits. The usages of G4VDigi and G4TDigiCollection are almost the same as G4VHit and G4THitsCollection, respectively, explained in the previous section.
G4DigiManager
G4DigiManager is the singleton manager class of the digitizer modules. All of your concrete digitizer modules should be registered to G4DigiManager with their unique names.
G4DigiManager * fDM = G4DigiManager::GetDMpointer(); MyDigitizer * myDM = new MyDigitizer( "/myDet/myCal/myEMdigiMod" ); fDM->AddNewModule(myDM);
Your concrete digitizer module can be accessed from your code using the unique module name.
G4DigiManager * fDM = G4DigiManager::GetDMpointer(); MyDigitizer * myDM = fDM->FindDigitizerModule( "/myDet/myCal/myEMdigiMod" ); myDM->Digitize();
Also, G4DigiManager has a Digitize() method which takes the unique module name.
G4DigiManager * fDM = G4DigiManager::GetDMpointer(); MyDigitizer * myDM = fDM->Digitize( "/myDet/myCal/myEMdigiMod" );
135
Then, you can get the pointer to your concrete G4THitsCollection object or G4TDigiCollection object of the currently processing event.
MyHitsCollection * HC = fDM->GetHitsCollection( myHitsCollID ); MyDigiCollection * DC = fDM->GetDigiCollection( myDigiCollID );
In case you want to access to the hits or digits collection of previous events, add the second argument.
MyHitsCollection * HC = fDM->GetHitsCollection( myHitsCollID, n ); MyDigiCollection * DC = fDM->GetDigiCollection( myDigiCollID, n );
where, n indicates the hits or digits collection of the nth previous event.
136
3. Whenever the objects to be persistified are available, call the WriteObject method of TFile with the pointer to the appropriate object as argument (usually it is some sort of container, like std::vector containing the collection of objects to be persistified) The two examples (P01 and P02) provided in examples/extended/persistency demonstrate how to perform object persistency using the Reflex mechanism in ROOT I/O for storing hits and geometry description.
Example 4.17. An example header file of a concrete user parallel world class.
#ifndef MyParallelWorld_h #define MyParallelWorld_h 1 #include "globals.hh" #include "G4VUserParallelWorld.hh" class MyParallelWorld : public G4VUserParallelWorld { public: MyParallelWorld(G4String worldName); virtual ~MyParallelWorld(); public: virtual void Construct(); }; #endif
A parallel world must have its unique name, which should be set to the G4VUserParallelWorld base class as an argument of the base class constructor. The world physical volume of the parallel world is provided by the G4RunManager as a clone of the mass geometry. In the Construct() virtual method of the user's class, the pointer to this cloned world physical volume is available through the GetWorld() method defined in the base class. The user should fill the volumes
137
in the parallel world by using this provided world volume. For a logical volume in a parallel world, the material pointer can be 0. Even if specified a valid material pointer, it will not be taken into account by any physics process.
Example 4.18. An example source code of a concrete user parallel world class.
#include #include #include #include #include "MyParallelWorld.hh" "G4LogicalVolume.hh" "G4VPhysicalVolume.hh" "G4Box.hh" "G4PVPlacement.hh"
MyParallelWorld::MyParallelWorld(G4String worldName) :G4VUserParallelWorld(worldName) {;} MyParallelWorld::~MyParallelWorld() {;} void MyParallelWorld::Construct() { G4VPhysicalVolume* ghostWorld = GetWorld(); G4LogicalVolume* worldLogical = ghostWorld->GetLogicalVolume(); // place volumes in the parallel world here. For example ... // G4Box * ghostSolid = new G4Box("GhostdBox", 60.*cm, 60.*cm, 60.*cm); G4LogicalVolume * ghostLogical = new G4LogicalVolume(ghostSolid, 0, "GhostLogical", 0, 0, 0); new G4PVPlacement(0, G4ThreeVector(), ghostLogical, "GhostPhysical", worldLogical, 0, 0); }
In case the user needs to define more than one parallel worlds, each of them must be implemented through its dedicated class. Each parallel world should be registered to the mass geometry class using the method RegisterParallelWorld() available through the class G4VUserDetectorConstruction. The registration must be done -before- the mass world is registed to the G4RunManager.
138
G4ParallelWorldScoringProcess objects must be instantiated with the name of each parallel world respectively and registered to the particles.
At the end of processing an event, all hits collections made for the parallel world are stored in G4HCofThisEvent as well as those for the mass geometry.
139
Shape and name of the 3D scoring mesh. Currently, box is the only available shape. Size of the scoring mesh. Mesh size must be specified as "half width" similar to the arguments of G4Box. Number of bins for each axes. Note that too hugh number causes immense memory consumption. Optionally, position and rotation of the mesh. If not specified, the mesh is positioned at the center of the world volume without rotation.
For a scoring mesh the user can have arbitrary number of quantities to be scored for each cell of the mesh. For each scoring quantity, the use can set one filter. Please note that /score/filter affects on the preceding scorer. Names of scorers and filters must be unique for the mesh. It is possible to define more than one scorer of same kind with different names and, likely, with different filters. Defining a scoring mesh and scores in the mesh should terminate with the /score/close command. The following sample UI commands define a scoring mesh named boxMesh_1, size of which is 2 m * 2 m * 2 m, and sliced into 30 cells along each axes. For each cell energy deposition, number of steps of gamma, number of steps of electron and number of steps of positron are scored.
Scored data can be visualized using the commands "/score/drawProjection" and "/score/ drawColumn". For details, see examples/extended/runAndEvent/RE03. By default, entries are linearly mapped to colors (gray - blue - green - red). This color mapping is implemented in G4DefaultLinearColorMap class, and registered to G4ScoringManager with the color map name "defaultLinearColorMap". The user may alternate color map by implementing a customised color map class derived from G4VScoreColorMap and register it to G4ScoringManager. Then, for each draw command, one can specify the preferred color map.
141
What is a Process?
Only processes can change information of G4Track and add secondary tracks via ParticleChange. G4VProcess is a base class of all processes and it has 3 kinds of DoIt and GetPhysicalInteraction methods in order to describe interactions generically. If a user want to modify information of G4Track, he (or she) SHOULD create a special process for the purpose and register the process to the particle.
What is a Track?
G4Track keeps 'current' information of the particle. (i.e. energy,momentum, position ,time and so on) and has 'static' information (i.e. mass, charge, life and so on) also. Note that G4Track keeps information at the beginning of the step while the AlongStepDoIts are being invoked for the step in progress.After finishing all AlongStepDoIts, G4Track is updated. On the other hand, G4Track is updated after each invocation of a PostStepDoIt.
What is a Step?
G4Step stores the transient information of a step. This includes the two endpoints of the step, PreStepPoint and PostStepPoint, which contain the points' coordinates and the volumes containing the points. G4Step also stores the change in track properties between the two points. These properties, such as energy and momentum, are updated as the various active processes are invoked.
What is a ParticleChange?
Processes do NOT change any information of G4Track directly in their DoIt. Instead, they proposes changes as a result of interactions by using ParticleChange. After each DoIt, ParticleChange updates PostStepPoint based on proposed changes. Then, G4Track is updated after finishing all AlongStepDoIts and after each PostStepDoIt.
143
the energy lost by secondaries which have NOT been generated because each of their energies was below the cut threshold. number of secondaries particles list of secondary particles (list of G4Track)
In all but the first, the construction of G4Track is done in the methods using information given by the arguments.
145
The creation of a trajectory can be controlled by invoking G4TrackingManager::SetStoreTrajectory(G4bool). The UI command /tracking/storeTrajectory _bool_ does the same. The user can set this flag for each individual track from his/her G4UserTrackingAction::PreUserTrackingAction() method. The user should not create trajectories for secondaries in a shower due to the large amount of memory consumed. All the created trajectories in an event are stored in G4TrajectoryContainer class object and this object will be kept by G4Event. To draw or print trajectories generated in an event, the user may invoke the DrawTrajectory() or ShowTrajectory() methods of G4VTrajectory, respectively, from his/her G4UserEventAction::EndOfEventAction(). The geometry must be drawn before the trajectory drawing. The color of the drawn trajectory depends on the particle charge: negative: red neutral: green positive: blue Due to improvements in G4Navigator, a track can execute more than one turn of its spiral trajectory without being broken into smaller steps as long as the trajectory does not cross a geometrical boundary. Thus a drawn trajectory may not be circular.
The generalization and abstraction of physics processes is a key issue in the design of Geant4. All physics processes are treated in the same manner from the tracking point of view. The Geant4 approach enables anyone to create a
146
process and assign it to a particle type. This openness should allow the creation of processes for novel, domainspecific or customised purposes by individuals or groups of users. Each process has two groups of methods which play an important role in tracking, GetPhysicalInteractionLength (GPIL) and DoIt. The GPIL method gives the step length from the current space-time point to the next space-time point. It does this by calculating the probability of interaction based on the process's cross section information. At the end of this step the DoIt method should be invoked. The DoIt method implements the details of the interaction, changing the particle's energy, momentum, direction and position, and producing secondary tracks if required. These changes are recorded as G4VParticleChange objects(see Particle Change).
G4VProcess
G4VProcess is the base class for all physics processes. Each physics process must implement virtual methods of G4VProcess which describe the interaction (DoIt) and determine when an interaction should occur (GPIL). In order to accommodate various types of interactions G4VProcess provides three DoIt methods: G4VParticleChange* stepData ) AlongStepDoIt( const G4Track& track, const G4Step&
This method is invoked while G4SteppingManager is transporting a particle through one step. The corresponding AlongStepDoIt for each defined process is applied for every step regardless of which process produces the minimum step length. Each resulting change to the track information is recorded and accumulated in G4Step. After all processes have been invoked, changes due to AlongStepDoIt are applied to G4Track, including the particle relocation and the safety update. Note that after the invocation of AlongStepDoIt, the endpoint of the G4Track object is in a new volume if the step was limited by a geometric boundary. In order to obtain information about the old volume, G4Step must be accessed, since it contains information about both endpoints of a step. G4VParticleChange* PostStepDoIt( const G4Track& track, const G4Step& stepData ) This method is invoked at the end point of a step, only if its process has produced the minimum step length, or if the process is forced to occur. G4Track will be updated after each invocation of PostStepDoIt, in contrast to the AlongStepDoIt method. G4VParticleChange* AtRestDoIt( const G4Track& track, const G4Step& stepData ) This method is invoked only for stopped particles, and only if its process produced the minimum step length or the process is forced to occur. For each of the above DoIt methods G4VProcess provides a corresponding pure virtual GPIL method: G4double PostStepGetPhysicalInteractionLength( const G4Track& G4double previousStepSize, G4ForceCondition* condition ) track,
This method generates the step length allowed by its process. It also provides a flag to force the interaction to occur regardless of its step length. G4double AlongStepGetPhysicalInteractionLength( const G4Track& track, G4double previousStepSize, G4double currentMinimumStep, G4double& proposedSafety, G4GPILSelection* selection ) This method generates the step length allowed by its process. G4double AtRestGetPhysicalInteractionLength( G4ForceCondition* condition )
const
G4Track&
track,
This method generates the step length in time allowed by its process. It also provides a flag to force the interaction to occur regardless of its step length. Other pure virtual methods in G4VProcess follow: virtual G4bool IsApplicable(const G4ParticleDefinition&)
147
returns true if this process object is applicable to the particle type. virtual void PreparePhysicsTable(const G4ParticleDefinition&) and virtual void BuildPhysicsTable(const G4ParticleDefinition&) is messaged by the process manager, whenever cross section tables should be prepared and rebuilt due to changing cut-off values. It is not mandatory if the process is not affected by cut-off values. virtual void StartTracking() and virtual void EndTracking() are messaged by the tracking manager at the beginning and end of tracking the current track.
Particle change
G4VParticleChange and its descendants are used to store the final state information of the track, including secondary tracks, which has been generated by the DoIt methods. The instance of G4VParticleChange is the only object whose information is updated by the physics processes, hence it is responsible for updating the step. The stepping manager collects secondary tracks and only sends requests via particle change to update G4Step. G4VParticleChange is introduced as an abstract class. It has a minimal set of methods for updating G4Step and handling secondaries. A physics process can therefore define its own particle change derived from G4VParticleChange. Three pure virtual methods are provided, virtual G4Step* UpdateStepForAtRest( G4Step* step), virtual G4Step* UpdateStepForAlongStep( G4Step* step ) and virtual G4Step* UpdateStepForPostStep( G4Step* step), which correspond to the three DoIt methods of G4VProcess. Each derived class should implement these methods.
148
149
Ionisation in low-density media (class name G4BraggIonGasModel) Ionisation in low-density media (class name G4BetheBlochIonGasModel) It is recommended to use physics constructor classes provided with rederence physics lists ($G4INSTALL/source/ physics_lists/builders): default EM physics (class name G4EmStandardPhysics) optional EM physics providing fast but less acurate electron transport due to "Simple" method of step limitation by multiple scattering, reduced step limitation by ionisation process and enabled "ApplyCuts" option (class name G4EmStandardPhysics_option1) Experimental EM physics with enabled "ApplyCuts" option, alternative models G4PEEffectFluoModel for photo-electric effect and G4KleinNishinaModel Compton scattering both providing simulation of atomic deexcitation and PIXE, G4WentzelVIModel for multiple scattering of protons, pions, kaons, and alternative model G4Generator2BS of bremsstrahlung gamma angular distribution (class name G4EmStandardPhysics_option2) EM physics for simulation with high accuracy due to "UseDistanceToBoundary" multiple scattering step limitation, reduced finalRange parameter of stepping function optimized per particle type, alternative models G4PEEffectFluoModel for photo-electric effect and G4KleinNishinaModel Compton scattering both providing simulation of atomic deexcitation and PIXE, and G4IonParameterisedLossModel for ion ionisation (class name G4EmStandardPhysics_option3) Combined Standard and Low-energy EM physics constructors based on the Option3 constructor; low-energy models are applied below 1 GeV: Models based on Livermore data bases for electrons and gamma (G4EmLivermorePhysics); Polarized models based on Livermore data bases for electrons and gamma (G4EmLivermorePolarizedPhysics); Penelope models for electrons, positrons and gamma (G4EmPenelopePhysics); Low-energy DNA physics (G4EmDNAPhysics). Examples of the registration of these physics constructor and construction of alternative combinations of options are shown in novice, extended and advanced examples ($G4INSTALL/examples/extended/electromagnetic and $G4INSTALL/examples/advanced). Examples illustrating the use of electromagnetic processes are available as part of the Geant4 release. Options are available for steering of electromagnetic processes. These options may be invoked either by UI commands or by the interface class G4EmProcessOptions. This class has the following public methods: SetLossFluctuations(G4bool) SetSubCutoff(G4bool, const G4Region* r=0) SetIntegral(G4bool) SetMinSubRange(G4double) SetMinEnergy(G4double) SetMaxEnergy(G4double) SetMaxEnergyForCSDARange(G4double) SetMaxEnergyForMuons(G4double) SetDEDXBinning(G4int) SetDEDXBinningForCSDARange(G4int) SetLambdaBinning(G4int) SetStepFunction(G4double, G4double) SetRandomStep(G4bool) SetApplyCuts(G4bool) SetSpline(G4bool) SetBuildCSDARange(G4bool) SetVerbose(G4int, const G4String name= "all") SetLambdaFactor(G4double) SetLinearLossLimit(G4double) ActivateDeexcitation(const G4String& processName, G4bool val, const G4String& regionName) SetDeexcitationActive(G4bool val) SetDeexcitationActiveRegion(const G4String& regionName, G4bool Fluo, G4bool Auger, G4bool PIXE)
150
SetAugerActive(G4bool val) SetPIXEActive(G4bool val) SetPIXECrossSectionModel(G4bool val) SetMscStepLimitation(G4MscStepLimitType val) SetMscLateralDisplacement(G4bool val) SetSkin(G4double) SetMscRangeFactor(G4double) SetMscGeomFactor(G4double) SetLPMFlag(G4bool) SetSplineFlag(G4bool) SetBremsstrahlungTh(G4double) SetPolarAngleLimit(G4double) SetFactorForAngleLimit(G4double)
The corresponding UI command can be accessed in the UI subdirectory "/process/eLoss". The following types of step limitation by multiple scattering are available: fSimple - simplified step limitation as in g4 7.1 version (used in QGSP_BERT_EMV Physics List) fUseSafety - default fUseDistanceToBoundary - advance method of step limitation used in EM examples, required parameter skin > 0, should be used for setup without magnetic field G4EmCalculator is a class which provides access to cross sections and stopping powers. This class can be used anywhere in the user code provided the physics list has already been initialised (G4State_Idle). G4EmCalculator has "Get" methods which can be applied to materials for which physics tables are already built, and "Compute" methods which can be applied to any material defined in the application or existing in the Geant4 internal database. The public methods of this class are: GetDEDX(kinEnergy,particle,material,G4Region region=0) GetRangeFromRestrictedDEDX(kinEnergy,particle,material,G4Region* region=0) GetCSDARange(kinEnergy,particle,material,G4Region* region=0) GetRange(kinEnergy,particle,material,G4Region* region=0) GetKinEnergy(range,particle,material,G4Region* region=0) GetCrosSectionPerVolume(kinEnergy,particle,material,G4Region* region=0) GetShellIonisationCrossSectionPerAtom(particle,Z,shell,kinEnergy) GetMeanFreePath(kinEnergy,particle,material,G4Region* region=0) PrintDEDXTable(particle) PrintRangeTable(particle) PrintInverseRangeTable(particle) ComputeDEDX(kinEnergy,particle,process,material,cut=DBL_MAX) ComputeElectronicDEDX(kinEnergy,particle,material,cut=DBL_MAX) ComputeNuclearDEDX(kinEnergy,particle,material,cut=DBL_MAX) ComputeTotalDEDX(kinEnergy,particle,material,cut=DBL_MAX) ComputeCrossSectionPerVolume(kinEnergy,particle,process,material,cut=0) ComputeCrossSectionPerAtom(kinEnergy,particle,process,Z,A,cut=0) ComputeShellIonisationCrossSectionPerAtom(particle,Z,shell,kinEnergy) ComputeMeanFreePath(kinEnergy,particle,process,material,cut=0) ComputeEnergyCutFromRangeCut(range,particle,material) FindParticle(const G4String&) FindIon(G4int Z, G4int A) FindMaterial(const G4String&) FindRegion(const G4String&) FindCouple(const G4Material*, const G4Region* region=0) SetVerbose(G4int)
For these interfaces, particles, materials, or processes may be pointers or strings with names.
151
152
Options are available in the G4LivermoreIonisationModel and G4Livermore(Polarized)PhotoElectricModel classes to enable and disable the usage of atomic de-excitation via the G4AtomicDeexcitation module: SetDeexcitationFlag(G4bool) DeexcitationFlag() The default is "true", namely vacancies in atomic shells produced by the interaction are handled by the G4AtomicDeexcitation module, possibly with the subsequent emission of fluorescence x-rays. If is set to "false" by the user, the energy released in the re-arrangement of atomic vacancies is treated in the model as a local energy deposit, without emission of secondary particles. The methods are actually inherited from G4VEmModel, so they work for all Livermore models; by the way, they have effect only in G4LivermorePhotoElectricModel, G4LivermorePolarizedPhotoElectricModel and G4LivermoreIonisationModel. An option is also available in these models to enable the production of Auger electrons by the G4AtomicDeexcitation module ActivateAuger(G4bool). The default (coming from G4AtomicDeexcitation) is "false", namely only fluorescence x-rays are emitted but not Auger electrons. One should notice that this option has effect only if the usage of the atomic deexcitation is enabled. . Notice that SetDeexcitationFlag(G4bool) enables only the fluorescence produced at the PostStep level. For G4LivermoreIonisationModel, it is also possible to produce fluorescence (x-rays or Auger) from the continuous energy deposit at the AlongStep level. Anyway, this has to be manually enabled by the user via the method G4VEmProcess::ActivateDeexcitation(true); invoked the process which registers the ionisation model. At the moment, it is not possible to enable/disable the AlongStep fluorescence on a model-by-model basis.
153
Bremsstrahlung (class G4PenelopeBremsstrahlungModel) Ionisation and delta ray production (class G4PenelopeIonisationModel) Positron models Bremsstrahlung (class G4PenelopeBremsstrahlungModel) Ionisation and delta ray production (class G4PenelopeIonisationModel) Positron annihilation (class class G4PenelopeAnnihilationModel) All Penelope models can be applied up to a maximum energy of 100 GeV, although it is advisable not to use them above a few hundreds of MeV. Options are available in the all Penelope Models, allowing to set (and retrieve) the verbosity level of the model, namely the amount of information which is printed on the screen. SetVerbosityLevel(G4int) GetVerbosityLevel() The default verbosity level is 0 (namely, no textual output on the screen). The default value should be used in general for normal runs. Higher verbosity levels are suggested only for testing and debugging purposes. The verbosity scale defined for all Penelope processes is the following: 0 = no printout on the screen (default) 1 = issue warnings only in the case of energy non-conservation in the final state (should never happen) 2 = reports full details on the energy budget in the final state 3 = writes also informations on cross section calculation, data file opening and sampling of atoms 4 = issues messages when entering in methods
Options are available in G4PenelopeComptonModel, G4PenelopePhotoElectricModel and G4PenelopeIonisationModel to enable or disable the usage of atomic de-excitation via the G4AtomicDeexcitation module. SetDeexcitationFlag(G4bool) DeexcitationFlag() The default is true, namely vacancies in atomic shells produced by the interaction are handled by the G4AtomicDeexcitation module, possibly with the subsequent emission of fluorescence x-rays. If is set to false by the user, the energy released in the re-arrangement of atomic vacancies is treated in the model as a local energy deposit, without emission of secondary particles. The methods are actually inherited from G4VEmModel, so they work for all Penelope models; by the way, they have effect only in G4PenelopeComptonModel, G4PenelopePhotoElectricModel and G4PenelopeIonisationModel. An option is also available in these models to enable the production of Auger electrons by the G4AtomicDeexcitation module ActivateAuger(G4bool). The default (coming from G4AtomicDeexcitation) is false, namely only fluorescence x-rays are emitted but not Auger electrons. One should notice that this option has effect only if the usage of the atomic deexcitation is enabled. A warning message is printed if one tries to enable the emission of the Auger electrons after having disabled the atomic deexcitation via SetDeexcitationFlag(false).
154
process class is G4DNAElastic two alternative model classes are : G4DNAScreenedRutherfordElasticModel G4DNAChampionElasticModel Excitation process class is G4DNAExcitation model class is G4DNABornExcitationModel Ionisation process class is G4DNAIonisation model class is G4DNABornIonisationModel Attachment process class is G4DNAAttachment model class is G4DNAMeltonAttachmentModel Vibrational excitation process class is G4DNAVibExcitation model class is G4DNASancheExcitationModel
(default)
or
155
Ionisation process class is G4DNAIonisation model classes is G4DNARuddIonisationModel Charge increase process class is G4DNAChargeIncrease model classes is G4DNADingfelderChargeIncreaseModel Charge decrease process class is G4DNAChargeDecrease model classes is G4DNADingfelderChargeDecreaseModel
156
#include "G4hImpactIonisation.hh" [...] void eRositaPhysicsList::ConstructProcess() { [...] theParticleIterator->reset(); while( (*theParticleIterator)() ) { G4ParticleDefinition* particle = theParticleIterator->value(); G4ProcessManager* processManager = particle->GetProcessManager(); G4String particleName = particle->GetParticleName(); if (particleName == "proton") { // Instantiate the G4hImpactIonisation process G4hImpactIonisation* hIonisation = new G4hImpactIonisation(); // Select the cross section models to be applied for K, L and M shell vacancy creation // (here the ECPSSR model is selected for K, L and M shell; one can mix and match // different models for each shell) hIonisation->SetPixeCrossSectionK("ecpssr"); hIonisation->SetPixeCrossSectionL("ecpssr"); hIonisation->SetPixeCrossSectionM("ecpssr"); // Register the process with the processManager associated with protons processManager -> AddProcess(hIonisation, -1, 2, 2); } } }
157
ecpssr pwba
This method must return True if the data set is able to calculate a total cross section for the given particle and material, and False otherwise.
G4double GetCrossSection( const G4DynamicParticle*, const G4Element* )
This method, which will be invoked only if True was returned by IsApplicable, must return a cross section, in Geant4 default units, for the given particle and material.
void BuildPhysicsTable( const G4ParticleDefinition& )
This method may be invoked to request the data set to recalculate its internal database or otherwise reset its state after a change in the cuts or other parameters of the given particle type.
void DumpPhysicsTable( const G4ParticleDefinition& ) = 0
This method may be invoked to request the data set to print its internal database and/or other state information, for the given particle type, to the standard output stream.
158
G4CrossSectionDataStore() ~G4CrossSectionDataStore()
and
G4double GetCrossSection( const G4DynamicParticle*, const G4Element* )
For a given particle and material, this method returns a cross section value provided by one of the collection of cross section data sets listed in the data store object. If there are no known data sets, a G4Exception is thrown and DBL_MIN is returned. Otherwise, each data set in the list is queried, in reverse list order, by invoking its IsApplicable method for the given particle and material. The first data set object that responds positively will then be asked to return a cross section value via its GetCrossSection method. If no data set responds positively, a G4Exception is thrown and DBL_MIN is returned.
void AddDataSet( G4VCrossSectionDataSet* aDataSet )
This method adds the given cross section data set to the end of the list of data sets in the data store. For the evaluation of cross sections, the list has a LIFO (Last In First Out) priority, meaning that data sets added later to the list will have priority over those added earlier to the list. Another way of saying this, is that the data store, when given a GetCrossSection request, does the IsApplicable queries in the reverse list order, starting with the last data set in the list and proceeding to the first, and the first data set that responds positively is used to calculate the cross section.
void BuildPhysicsTable( const G4ParticleDefinition& aParticleType )
This method may be invoked to indicate to the data store that there has been a change in the cuts or other parameters of the given particle type. In response, the data store will invoke the BuildPhysicsTable of each of its data sets.
void DumpPhysicsTable( const G4ParticleDefinition& )
This method may be used to request the data store to invoke the DumpPhysicsTable method of each of its data sets.
which gives public access to the data store for each process. The user's cross section data sets can be added to the data store according to the following framework:
G4Hadron...Process aProcess(...) MyCrossSectionDataSet myDataSet(...) aProcess.GetCrossSectionDataStore()->AddDataSet( &MyDataSet )
The added data set will override the default cross section data whenever so indicated by its IsApplicable method. In addition to the ``get'' method, G4HadronicProcess also has the method
159
which allows the user to completely replace the default data store with a new data store. It should be noted that a process does not send any information about itself to its associated data store (and hence data set) objects. Thus, each data set is assumed to be formulated to calculate cross sections for one and only one type of process. Of course, this does not prevent different data sets from sharing common data and/or calculation methods, as in the case of the G4HadronCrossSections class mentioned above. Indeed, G4VCrossSectionDataSet specifies only the abstract interface between physics processes and their data sets, and leaves the user free to implement whatever sort of underlying structure is appropriate. The current implementation of the data set G4HadronCrossSections reuses the total cross-sections for inelastic and elastic scattering, radiative capture and fission as used with GHEISHA to provide cross-sections for calculation of the respective mean free paths of a given particle in a given material.
Obviously the last process does not, strictly speaking, deal with a ``hadron at rest''. It does, nonetheless, share common features with the others in the above list because of the implementation model chosen. The differences between the alternative implementation for kaon and pion absorption concern the fast part of the emitted particle spectrum. G4PiMinusAbsorptionAtRest, and G4KaonMinusAbsorptionAtRest focus especially on a good description of this part of the spectrum.
160
This method returns the time taken before the interaction actually occurs. In all processes listed above, except for muon capture, a value of zero is returned. For the muon capture process the muon capture lifetime is returned. AtRestDoIt( const G4Track&, const G4Step&) This method generates the secondary particles produced by the process. IsApplicable( const G4ParticleDefinition& ) This method returns the result of a check to see if the process is possible for a given particle.
G4HadronInelasticProcess
G4HadronFissionProcess G4CaptureProcess
Table 5.1. Hadronic processes and relevant particles. How to register Models
To register an inelastic process model for a particle, a proton for example, first get the pointer to the particle's process manager:
G4ParticleDefinition *theProton = G4Proton::ProtonDefinition(); G4ProcessManager *theProtonProcMan = theProton->GetProcessManager();
Create an instance of the model which determines the secondaries produced in the interaction, and calculates the momenta of the particles:
G4LEProtonInelastic *theProtonIE = new G4LEProtonInelastic();
161
Finally, add the particle's inelastic process to the list of discrete processes:
theProtonProcMan->AddDiscreteProcess( theProtonIEProc );
The particle's inelastic process class, G4ProtonInelasticProcess in the example above, derives from the G4HadronicInelasticProcess class, and simply defines the process name and calls the G4HadronicInelasticProcess constructor. All of the specific particle inelastic processes derive from the G4HadronicInelasticProcess class, which calls the PostStepDoIt function, which returns the particle change object from the G4HadronicProcess function GeneralPostStepDoIt. This class also gets the mean free path, builds the physics table, and gets the microscopic cross section. The G4HadronicInelasticProcess class derives from the G4HadronicProcess class, which is the top level hadronic process class. The G4HadronicProcess class derives from the G4VDiscreteProcess class. The inelastic, elastic, capture, and fission processes derive from the G4HadronicProcess class. This pure virtual class also provides the energy range manager object and the RegisterMe access function. A sample case for the proton's inelastic interaction model class is shown in Example 5.1, where G4LEProtonInelastic.hh is the name of the include file:
The CascadeAndCalculateMomenta function is the bulk of the model and is to be provided by the model's creator. It should determine what secondary particles are produced in the interaction, calculate the momenta for all the particles, and put this information into the ParticleChange object which is returned. The G4LEProtonInelastic class derives from the G4InelasticInteraction class, which is an abstract base class since the pure virtual function ApplyYourself is not defined there. G4InelasticInteraction itself derives from the G4HadronicInteraction abstract base class. This class is the base class for all the model classes. It sorts out the energy range for the models and provides class utilities. The G4HadronicInteraction class provides the Set/GetMinEnergy and the Set/GetMaxEnergy functions which determine the minimum and maximum
162
energy range for the model. An energy range can be set for a specific element, a specific material, or for general applicability:
void void void void void void SetMinEnergy( SetMinEnergy( SetMinEnergy( SetMaxEnergy( SetMaxEnergy( SetMaxEnergy( G4double anEnergy, G4Element *anElement ) G4double anEnergy, G4Material *aMaterial ) const G4double anEnergy ) G4double anEnergy, G4Element *anElement ) G4double anEnergy, G4Material *aMaterial ) const G4double anEnergy )
163
Decay for some particles may be switched on or off by using G4ParticleDefinition::SetPDGStable() as well as ActivateProcess() and InActivateProcess() methods of G4ProcessManager. G4Decay proposes the step length (or step time for AtRest) according to the lifetime of the particle unless PreAssignedDecayProperTime is defined in G4DynamicParticle. The G4Decay class itself does not define decay modes of the particle. Geant4 provides two ways of doing this: using G4DecayChannel in G4DecayTable, and using thePreAssignedDecayProducts of G4DynamicParticle The G4Decay class calculates the PhysicalInteractionLength and boosts decay products created by G4VDecayChannel or event generators. See below for information on the determination of the decay modes. An object of G4Decay can be shared by particles. Registration of the decay process to particles in the ConstructPhysics method of PhysicsList (see Section 2.5.3) is shown in Example 5.2.
Example 5.2. Registration of the decay process to particles in the ConstructPhysics method of PhysicsList.
#include "G4Decay.hh" void ExN02PhysicsList::ConstructGeneral() { // Add Decay Process G4Decay* theDecayProcess = new G4Decay(); theParticleIterator->reset(); while( (*theParticleIterator)() ){ G4ParticleDefinition* particle = theParticleIterator->value(); G4ProcessManager* pmanager = particle->GetProcessManager(); if (theDecayProcess->IsApplicable(*particle)) { pmanager ->AddProcess(theDecayProcess); // set ordering for PostStepDoIt and AtRestDoIt pmanager ->SetProcessOrdering(theDecayProcess, idxPostStep); pmanager ->SetProcessOrdering(theDecayProcess, idxAtRest); } } }
Decay modes and branching ratios defined in Geant4 are listed in Section 5.3.2. Branching ratios and life time can be set in tracking time.
// set lifetime G4Neutron::Neutron()->SetPDGLifeTime(885.7*second); // allow neutron decay G4Neutron::Neutron()->SetPDGStable(false);
Branching ratios and life time can be modified by using user commands, also.
164
165
properties may be constants or they may be expressed as a function of the photon's wavelength. This table is a private data member of the G4Material class. The G4MaterialPropertiesTable is implemented as a hash directory, in which each entry consists of a value and a key. The key is used to quickly and efficiently retrieve the corresponding value. All values in the dictionary are either instantiations of G4double or the class G4MaterialPropertyVector, and all keys are of type G4String. A G4MaterialPropertyVector is composed of instantiations of the class G4MPVEntry. The G4MPVEntry is a pair of numbers, which in the case of an optical property, are the photon momentum and corresponding property value. The G4MaterialPropertyVector is implemented as a G4std::vector, with the sorting operation defined as MPVEntry1 < MPVEntry2 == photon_momentum1 < photon_momentum2. This results in all G4MaterialPropertyVectors being sorted in ascending order of photon momenta. It is possible for the user to add as many material (optical) properties to the material as he wishes using the methods supplied by the G4MaterialPropertiesTable class. An example of this is shown in Example 5.3.
166
G4int MaxNumPhotons = 300; theCerenkovProcess->SetTrackSecondariesFirst(true); theCerenkovProcess->SetMaxNumPhotonsPerStep(MaxNumPhotons); theParticleIterator->reset(); while( (*theParticleIterator)() ){ G4ParticleDefinition* particle = theParticleIterator->value(); G4ProcessManager* pmanager = particle->GetProcessManager(); G4String particleName = particle->GetParticleName(); if (theCerenkovProcess->IsApplicable(*particle)) { pmanager->AddContinuousProcess(theCerenkovProcess); } } }
G4Material* Scnt; G4MaterialPropertiesTable* Scnt_MPT = new G4MaterialPropertiesTable(); Scnt_MPT->AddProperty("FASTCOMPONENT", Scnt_PP, Scnt_FAST, NUMENTRIES); Scnt_MPT->AddProperty("SLOWCOMPONENT", Scnt_PP, Scnt_SLOW, NUMENTRIES); Scnt_MPT->AddConstProperty("SCINTILLATIONYIELD", 5000./MeV); Scnt_MPT->AddConstProperty("RESOLUTIONSCALE", 2.0); Scnt_MPT->AddConstProperty("FASTTIMECONSTANT", 1.*ns); Scnt_MPT->AddConstProperty("SLOWTIMECONSTANT", 10.*ns); Scnt_MPT->AddConstProperty("YIELDRATIO", 0.8); Scnt->SetMaterialPropertiesTable(Scnt_MPT);
167
In cases where the scintillation yield of a scintillator depends on the particle type, different scintillation processes may be defined for them. How this yield scales to the one specified for the material is expressed with the ScintillationYieldFactor in the user's PhysicsList as shown in Example 5.6. In those cases where the fast to slow excitation ratio changes with particle type, the method SetScintillationExcitationRatio can be called for each scintillation process (see the advanced underground_physics example). This overwrites the YieldRatio obtained from the G4MaterialPropertiesTable.
A Gaussian-distributed number of photons is generated according to the energy lost during the step. A resolution scale of 1.0 produces a statistical fluctuation around the average yield set with AddConstProperty("SCINTILLATIONYIELD"), while values > 1 broaden the fluctuation. A value of zero produces no fluctuation. Each photon's frequency is sampled from the empirical spectrum. The photons originate evenly along the track segment and are emitted uniformly into 4 with a random linear polarization and at times characteristic for the scintillation component. When there are multiple scintillators in the simulation and/or when the scintillation yield is a non-linear function of the energy deposited, the user can also define an array of total scintillation light yields as a function of the energy deposited and particle type. The available particles are protons, electrons, deuterons, tritons, alphas, and carbon ions. These are the particles known to significantly effect the scintillation light yield, of for example, BC501A (NE213/EJ301) liquid organic scintillator and BC420 plastic scintillator as function of energy deposited. The method works as follows: 1. In the user's physics lists, the user must set a G4bool flag that allows scintillation light emission to depend on the energy deposited by particle type:
theScintProcess->SetScintillationByParticleType(true);
2. The user must also specify and add, via the AddProperty method of the MPT, the scintillation light yield as function of incident particle energy with new keywords, for example: PROTONSCINTILLATIONYIELD etc. and pairs of protonEnergy and scintLightYield.
168
specifying these empirical parameters for each WLS material in the simulation. It is sufficient to specify in the user's DetectorConstruction class a relative spectral distribution as a function of photon energy for the WLS material. WLSABSLENGTH is the absorption length of the material as a function of the photon's momentum. WLSCOMPONENT is the relative emission spectrum of the material as a function of the photon's momentum, and WLSTIMECONSTANT accounts for any time delay which may occur between absorption and re-emission of the photon. An example is shown in Example 5.7.
The process is defined in the PhysicsList in the usual way. The process class name is G4OpWLS. It should be instantiated with theWLSProcess = new G4OpWLS("OpWLS") and attached to the process manager of the optical photon as a DiscreteProcess. The way the WLSTIMECONSTANT is used depends on the time profile method chosen by the user. If in the PhysicsList theWLSProcess->UseTimeGenerator("exponential") option is set, the time delay between absorption and re-emission of the photon is sampled from an exponential distribution, with the decay term equal to WLSTIMECONSTANT. If, on the other hand, theWLSProcess->UseTimeGenerator("delta") is chosen, the time delay is a delta function and equal to WLSTIMECONSTANT. The default is "delta" in case the G4OpWLS::UseTimeGenerator(const G4String name) method is not used.
Rayleigh Scattering
The differential cross section in Rayleigh scattering, /, is proportional to 1+cos2(), where is the polar of the new polarization vector with respect to the old polarization vector. The G4OpRayleigh scattering process samples this angle accordingly and then calculates the scattered photon's new direction by requiring that it be perpendicular to the photon's new polarization in such a way that the final direction, initial and final polarizations are all in one plane. This process thus depends on the particle's polarization (spin). The photon's polarization is a data member of the G4DynamicParticle class. A photon which is not assigned a polarization at production, either via the SetPolarization method of the G4PrimaryParticle class, or indirectly with the SetParticlePolarization method of the G4ParticleGun class, may not be Rayleigh scattered. Optical photons produced by the G4Cerenkov process
169
have inherently a polarization perpendicular to the cone's surface at production. Scintillation photons have a random linear polarization perpendicular to their direction. The process requires a G4MaterialPropertiesTable to be filled by the user with Rayleigh scattering length data. The Rayleigh scattering attenuation length is the average distance traveled by a photon before it is Rayleigh scattered in the medium and it is the distance returned by the GetMeanFreePath method. The G4OpRayleigh class provides a RayleighAttenuationLengthGenerator method which calculates the attenuation coefficient of a medium following the Einstein-Smoluchowski formula whose derivation requires the use of statistical mechanics, includes temperature, and depends on the isothermal compressibility of the medium. This generator is convenient when the Rayleigh attenuation length is not known from measurement but may be calculated from first principles using the above material constants. For a medium named Water and no Rayleigh scattering attenutation length specified by the user, the program automatically calls the RayleighAttenuationLengthGenerator which calculates it for 10 degrees Celsius liquid water.
Mie Scattering
Mie Scattering (or Mie solution) is an analytical solution of Maxwell's equations for scattering of optical photons by spherical particles. It is significant only when the radius of the scattering object is of order of the wave length. The analytical expressions for Mie Scattering are very complicated since they are a series sum of Bessel functions. One common approximation made is call Henyey-Greenstein (HG). The implementation in Geant4 follows the HG approximation (for details see the Physics Reference Manual) and the treatment of polarization and momentum are similar to that of Rayleigh scattering. We require the final polarization direction to be perpendicular to the momentum direction. We also require the final momentum, initial polarization and final polarization to be in the same plane. The process requires a G4MaterialPropertiesTable to be filled by the user with Mie scattering length data (entered with the name: MIEHG) analogous to Rayleigh scattering. The Mie scattering attenuation length is the average distance traveled by a photon before it is Mie scattered in the medium and it is the distance returned by the GetMeanFreePath method. In practice, the user not only needs to provide the attenuation length of Mie scattering, but also needs to provide the constant parameters of the approximation: g_f, g_b, and r_f. (with AddConstProperty and with the names: MIEHG_FORWARD, MIEHG_BACKWARD, and MIEHG_FORWARD_RATIO, respectively.)
Boundary Process
Reference: E. Hecht and A. Zajac, Optics [ Hecht1974 ] For the simple case of a perfectly smooth interface between two dielectric materials, all the user needs to provide are the refractive indices of the two materials stored in their respective G4MaterialPropertiesTable. In all other cases, the optical boundary process design relies on the concept of surfaces. The information is split into two classes. One class in the material category keeps information about the physical properties of the surface itself, and a second class in the geometry category holds pointers to the relevant physical and logical volumes involved and has an association to the physical class. Surface objects of the second type are stored in a related table and can be retrieved by either specifying the two ordered pairs of physical volumes touching at the surface, or by the logical volume entirely surrounded by this surface. The former is called a border surface while the latter is referred to as the skin surface. This second type of surface is useful in situations where a volume is coded with a reflector and is placed into many different mother volumes. A limitation is that the skin surface can only have one and the same optical property for all of the enclosed volume's sides. The border surface is an ordered pair of physical volumes, so in principle, the user can choose different optical properties for photons arriving from the reverse side of the same interface. For the optical boundary process to use a border surface, the two volumes must have been positioned with G4PVPlacement. The ordered combination can exist at many places in the simulation. When the surface concept is not needed, and a perfectly smooth surface exists beteen two dielectic materials, the only relevant property is the index of refraction, a quantity stored with the material, and no restriction exists on how the volumes were positioned. The physical surface object also specifies which model the boundary process should use to simulate interactions with that surface. In addition, the physical surface can have a material property table all its own. The usage of this table allows all specular constants to be wavelength dependent. In case the surface is painted or wrapped (but not a
170
cladding), the table may include the thin layer's index of refraction. This allows the simulation of boundary effects at the intersection between the medium and the surface layer, as well as the Lambertian reflection at the far side of the thin layer. This occurs within the process itself and does not invoke the G4Navigator. Combinations of surface finish properties, such as polished or ground and front painted or back painted, enumerate the different situations which can be simulated. When a photon arrives at a medium boundary its behavior depends on the nature of the two materials that join at that boundary. Medium boundaries may be formed between two dielectric materials or a dielectric and a metal. In the case of two dielectric materials, the photon can undergo total internal reflection, refraction or reflection, depending on the photon's wavelength, angle of incidence, and the refractive indices on both sides of the boundary. Furthermore, reflection and transmission probabilites are sensitive to the state of linear polarization. In the case of an interface between a dielectric and a metal, the photon can be absorbed by the metal or reflected back into the dielectric. If the photon is absorbed it can be detected according to the photoelectron efficiency of the metal. As expressed in Maxwell's equations, Fresnel reflection and refraction are intertwined through their relative probabilities of occurrence. Therefore neither of these processes, nor total internal reflection, are viewed as individual processes deserving separate class implementation. Nonetheless, an attempt was made to adhere to the abstraction of having independent processes by splitting the code into different methods where practicable. One implementation of the G4OpBoundaryProcess class employs the UNIFIED model [A. Levin and C. Moisan, A More Physical Approach to Model the Surface Treatment of Scintillation Counters and its Implementation into DETECT, TRIUMF Preprint TRI-PP-96-64, Oct. 1996] of the DETECT program [G.F. Knoll, T.F. Knoll and T.M. Henderson, Light Collection Scintillation Detector Composites for Neutron Detection, IEEE Trans. Nucl. Sci., 35 (1988) 872.]. It applies to dielectric-dielectric interfaces and tries to provide a realistic simulation, which deals with all aspects of surface finish and reflector coating. The surface may be assumed as smooth and covered with a metallized coating representing a specular reflector with given reflection coefficient, or painted with a diffuse reflecting material where Lambertian reflection occurs. The surfaces may or may not be in optical contact with another component and most importantly, one may consider a surface to be made up of micro-facets with normal vectors that follow given distributions around the nominal normal for the volume at the impact point. For very rough surfaces, it is possible for the photon to inversely aim at the same surface again after reflection of refraction and so multiple interactions with the boundary are possible within the process itself and without the need for relocation by G4Navigator. The UNIFIED model provides for a range of different reflection mechanisms. The specular lobe constant represents the reflection probability about the normal of a micro facet. The specular spike constant, in turn, illustrates the probability of reflection about the average surface normal. The diffuse lobe constant is for the probability of internal Lambertian reflection, and finally the back-scatter spike constant is for the case of several reflections within a deep groove with the ultimate result of exact back-scattering. The four probabilities must add up to one, with the diffuse lobe constant being implicit. The reader may consult the reference for a thorough description of the model.
171
const G4int NUM = 2; G4double G4double G4double G4double G4double G4double G4double pp[NUM] = {2.038*eV, 4.144*eV}; specularlobe[NUM] = {0.3, 0.3}; specularspike[NUM] = {0.2, 0.2}; backscatter[NUM] = {0.1, 0.1}; rindex[NUM] = {1.35, 1.40}; reflectivity[NUM] = {0.3, 0.5}; efficiency[NUM] = {0.8, 0.1};
G4MaterialPropertiesTable* SMPT = new G4MaterialPropertiesTable(); SMPT SMPT SMPT SMPT SMPT SMPT -> -> -> -> -> -> AddProperty("RINDEX",pp,rindex,NUM); AddProperty("SPECULARLOBECONSTANT",pp,specularlobe,NUM); AddProperty("SPECULARSPIKECONSTANT",pp,specularspike,NUM); AddProperty("BACKSCATTERCONSTANT",pp,backscatter,NUM); AddProperty("REFLECTIVITY",pp,reflectivity,NUM); AddProperty("EFFICIENCY",pp,efficiency,NUM);
The original GEANT3.21 implementation of this process is also available via the GLISUR methods flag. [GEANT Detector Description and Simulation Tool, Application Software Group, Computing and Networks Division, CERN, PHYS260-6 tp 260-7.].
Example 5.9. Dielectric metal surface properties defined via the G4OpticalSurface.
G4LogicalVolume* volume_log; G4OpticalSurface* OpSurface = new G4OpticalSurface("name"); G4LogicalSkinSurface* Surface = new G4LogicalSkinSurface("name",volume_log,OpSurface); OpSurface -> SetType(dielectric_metal); OpSurface -> SetFinish(ground); OpSurface -> SetModel(glisur); G4double polish = 0.8; G4MaterialPropertiesTable *OpSurfaceProperty = new G4MaterialPropertiesTable(); OpSurfaceProperty -> AddProperty("REFLECTIVITY",pp,reflectivity,NUM); OpSurfaceProperty -> AddProperty("EFFICIENCY",pp,efficiency,NUM); OpSurface -> SetMaterialPropertiesTable(OpSurfaceProperty);
The reflectivity off a metal surface can also be calculated by way of a complex index of refraction. Instead of storing the REFLECTIVITY directly, the user stores the real part (REALRINDEX) and the imaginary part (IMAGINARYRINDEX) as a function of photon energy separately in the G4MaterialPropertyTable. Geant4 then calculates the reflectivity depending on the incident angle, photon energy, degree of TE and TM polarization, and this complex refractive index. The program defaults to the GLISUR model and polished surface finish when no specific model and surface finish is specified by the user. In the case of a dielectric-metal interface, or when the GLISUR model is
172
specified, the only surface finish options available are polished or ground. For dielectric-metal surfaces, the G4OpBoundaryProcess also defaults to unit reflectivity and zero detection efficiency. In cases where the user specifies the UNIFIED model, but does not otherwise specify the model reflection probability constants, the default becomes Lambertian reflection. Martin Janecek and Bill Moses (Lawrence Berkeley National Laboratory) built an instrument for measuring the angular reflectivity distribution inside of BGO crystals with common surface treatments and reflectors applied. These results have been incorporate into the Geant4 code. A third class of reflection type besides dielectric_metal and dielectric_dielectric is added: dielectric_LUT. The distributions have been converted to 21 look-up-tables (LUT); so far for 1 scintillator material (BGO) x 3 surface treatments x 7 reflector materials. The modified code allows the user to specify the surface treatment (rough-cut, chemically etched, or mechanically polished), the attached reflector (Lumirror, Teflon, ESR film, Tyvek, or TiO2 paint), and the bonding type (air-coupled or glued). The glue used is MeltMount, and the ESR film used is VM2000. Each LUT consists of measured angular distributions with 4 by 5 resolution in theta and phi, respectively, for incidence angles from 0 to 90 degrees, in 1-steps. The code might in the future be updated by adding more LUTs, for instance, for other scintillating materials (such as LSO or NaI). To use these LUT the user has to download them from Geant4 Software Download and set an environment variable, G4REALSURFACEDATA, to the directory of geant4/ data/RealSurface1.0. For details see: M. Janecek, W. W. Moses, IEEE Trans. Nucl. Sci. 57 (3) (2010) 964-970. The enumeration G4OpticalSurfaceFinish has been extended to include (what follows should be a 2 column table):
polishedlumirrorair, polishedlumirrorglue, polishedair, polishedteflonair, polishedtioair, polishedtyvekair, polishedvm2000air, polishedvm2000glue, etchedlumirrorair, etchedlumirrorglue, etchedair, etchedteflonair, etchedtioair, etchedtyvekair, etchedvm2000air, etchedvm2000glue, groundlumirrorair, groundlumirrorglue, groundair, groundteflonair, groundtioair, groundtyvekair, groundvm2000air, groundvm2000glue
// // // // // // // // // // // // // // // // // // // // // // // //
mechanically polished surface, with lumirror mechanically polished surface, with lumirror & meltmount mechanically polished surface mechanically polished surface, with teflon mechanically polished surface, with tio paint mechanically polished surface, with tyvek mechanically polished surface, with esr film mechanically polished surface, with esr film & meltmount chemically etched surface, with lumirror chemically etched surface, with lumirror & meltmount chemically etched surface chemically etched surface, with teflon chemically etched surface, with tio paint chemically etched surface, with tyvek chemically etched surface, with esr film chemically etched surface, with esr film & meltmount rough-cut surface, with lumirror rough-cut surface, with lumirror & meltmount rough-cut surface rough-cut surface, with teflon rough-cut surface, with tio paint rough-cut surface, with tyvek rough-cut surface, with esr film rough-cut surface, with esr film & meltmount
5.2.6. Parameterization
In this section we describe how to use the parameterization or "fast simulation" facilities of GEANT4. Examples are provided in the examples/novice/N05 directory.
5.2.6.1. Generalities:
The Geant4 parameterization facilities allow you to shortcut the detailed tracking in a given volume and for given particle types in order for you to provide your own implementation of the physics and of the detector response. Parameterisations are bound to a G4Region object, which, in the case of fast simulation is also called an envelope. Prior to release 8.0, parameterisations were bound to a G4LogicalVolume, the root of a volume
173
hierarchy. These root volumes are now attributes of the G4Region. Envelopes often correspond to the volumes of sub-detectors: electromagnetic calorimeters, tracking chambers, etc. With GEANT4 it is also possible to define envelopes by overlaying a parallel or "ghost" geometry as discussed in Section 5.2.6.7. In GEANT4, parameterisations have three main features. You must specify: the particle types for which your parameterisation is valid; the dynamics conditions for which your parameterisation is valid and must be triggered; the parameterisation itself: where the primary will be killed or moved, whether or not to create it or create secondaries, etc., and where the detector response will be computed. GEANT4 will message your parameterisation code for each step starting in any root G4LogicalVolume (including daughters. sub-daughters, etc. of this volume) of the G4Region. It will proceed by first asking the available parameterisations for the current particle type if one of them (and only one) wants to issue a trigger. If so it will invoke its parameterisation. In this case, the tracking will not apply physics to the particle in the step. Instead, the UserSteppingAction will be invoked. Parameterisations look like a "user stepping action" but are more advanced because: parameterisation code is messaged only in the G4Region to which it is bound; parameterisation code is messaged anywhere in the G4Region, that is, any volume in which the track is located; GEANT4 will provide information to your parameterisation code about the current root volume of the G4Region in which the track is travelling.
G4FastSimulationManagerProcess This is a G4VProcess. It provides the interface between the tracking and the parameterisation. It must be set in the process list of the particles you want to parameterise. G4GlobalFastSimulationManager This a singleton class which provides the management of the G4FastSimulationManager objects and some ghost facilities.
174
Virtual methods:
The G4VFastSimulationModel has three pure virtual methods which must be overriden in your concrete class: G4VFastSimulationModel( const G4String& aName): Here aName identifies the parameterisation model. G4bool ModelTrigger( const G4FastTrack&): You must return "true" when the dynamic conditions to trigger your parameterisation are fulfilled. G4FastTrack provides access to the current G4Track, gives simple access to the current root G4LogicalVolume related features (its G4VSolid, and G4AffineTransform references between the global and the root G4LogicalVolume local coordinates systems) and simple access to the position and momentum expressed in the root G4LogicalVolume coordinate system. Using these quantities and the G4VSolid methods, you can for example easily check how far you are from the root G4LogicalVolume boundary. G4bool IsApplicable( const G4ParticleDefinition&): In your implementation, you must return "true" when your model is applicable to the G4ParticleDefinition passed to this method. The G4ParticleDefinition provides all intrinsic particle information (mass, charge, spin, name ...). If you want to implement a model which is valid only for certain particle types, it is recommended for efficiency that you use the static pointer of the corresponding particle classes. As an example, in a model valid for gammas only, the IsApplicable() method should take the form:
#include "G4Gamma.hh" G4bool MyGammaModel::IsApplicable(const G4ParticleDefinition& partDef) { return &partDef == G4Gamma::GammaDefinition(); }
G4bool ModelTrigger( const G4FastTrack&): You must return "true" when the dynamic conditions to trigger your parameterisation are fulfilled. The G4FastTrack provides access to the current G4Track, gives simple access to envelope related features (G4LogicalVolume, G4VSolid, and G4AffineTransform references between the global and the envelope local coordinates systems) and simple access to the position and momentum expressed in the envelope coordinate system. Using these quantities and the G4VSolid methods, you can for example easily check how far you are from the envelope boundary. void DoIt( const G4FastTrack&, G4FastStep&): The details of your parameterisation will be implemented in this method. The G4FastTrack reference provides the input information, and the final state of the particles after parameterisation must be returned through the
175
G4FastStep reference. Tracking for the final state particles is requested after your parameterisation has been invoked.
Constructor:
G4FastSimulationManager( G4Region *anEnvelope, G4bool IsUnique=false): This is the only constructor. You specify the G4Region by providing its pointer. The G4FastSimulationManager object will bind itself to this G4Region. If you know that this G4Region has a single root G4LogicalVolume, placed only once, you can set the IsUnique boolean to "true" to allow some optimization. Note that if you choose to use the G4VFastSimulationModel(const G4String&, G4Region*, G4bool) constructor for your model, the G4FastSimulationManager will be constructed using the given G4Region* and G4bool values of the model constructor.
This ordering is important if you use ghost geometries, since the G4FastSimulationManagerProcess will provide navigation in the ghost world to limit the step on ghost boundaries. The G4FastSimulationManager must be added to the process list of a particle as a continuous and discrete process if you use ghost geometries for this particle. You can add it as a discrete process if you don't use ghosts. The following code registers the G4FastSimulationManagerProcess with all the particles as a discrete and continuous process:
void MyPhysicsList::addParameterisation() { G4FastSimulationManagerProcess* theFastSimulationManagerProcess = new G4FastSimulationManagerProcess(); theParticleIterator->reset();
176
while( (*theParticleIterator)() ) { G4ParticleDefinition* particle = theParticleIterator->value(); G4ProcessManager* pmanager = particle->GetProcessManager(); pmanager->AddProcess(theFastSimulationManagerProcess, -1, 0, 0); } }
Presently, you will mainly need to use the GlobalFastSimulationManager if you use ghost geometries.
177
or:
AddGhostPlacement(G4Transform3D*);
where the rotation matrix and translation vector of the 3-D transformation describe the placement relative to the ghost world coordinates. 5. build your G4VFastSimulationModel objects and add them to the myGhostFSManager. The IsApplicable() methods of your models will be used by the G4GlobalFastSimulationManager to build the ghost geometries corresponding to a given particle type. 6. Invoke the G4GlobalFastSimulationManager method:
G4GlobalFastSimulationManager::getGlobalFastSimulationManager()-> CloseFastSimulation();
This last call will cause the G4GlobalFastSimulationManager to build the flavour-dependent ghost geometries. This call must be done before the RunManager closes the geometry. (It is foreseen that the run manager in the future will invoke the CloseFastSimulation() to synchronize properly with the closing of the geometry). Visualization facilities are provided for ghosts geometries. After the CloseFastSimulation() invocation, it is possible to ask for the drawing of ghosts in an interactive session. The basic commands are: /vis/draw/Ghosts particle_name which makes the drawing of the ghost geometry associated with the particle specified by name in the command line. /vis/draw/Ghosts which draws all the ghost geometries.
178
The envelope in which the parameterization should be performed must be specified (below: G4Region m_calo_region) and the GFlashShowerModel must be assigned to this region. Furthermore, the classes GFlashParticleBounds (which provides thresholds for the parameterization like minimal energy etc.), GflashHitMaker(a helper class to generate hits in the sensitive detector) and GFlashHomoShowerParamterisation (which does the computations) must be constructed (by the user at the moment) and assigned to the GFlashShowerModel. Please note that at the moment only homogeneous calorimeters are supported.
m_theFastShowerModel = new GFlashShowerModel("fastShowerModel",m_calo_region); m_theParametrisation = new GFlashHomoShowerParamterisation(matManager->getMaterial(mat)); m_theParticleBounds = new GFlashParticleBounds(); m_theHMaker = new GFlashHitMaker(); m_theFastShowerModel->SetParametrisation(*m_theParametrisation); m_theFastShowerModel->SetParticleBounds(*m_theParticleBounds) ; m_theFastShowerModel->SetHitMaker(*m_theHMaker);
The user must also set the material of the calorimeter, since the computation depends on the material. It is mandatory to use G4VGFlashSensitiveDetector as (additional) base class for the sensitive detector.
class ExGflashSensitiveDetector: public G4VSensitiveDetector ,public G4VGFlashSensitiveDetector
Here it is necessary to implement a separate interface, where the GFlash spots are processed.
(ProcessHits(G4GFlashSpot*aSpot ,G4TouchableHistory* ROhist))
A separate interface is used, because the Gflash spots naturally contain less information than the full simulation. Since the parameters in the Gflash package are taken from fits to full simulations with Geant3, some retuning might be necessary for good agreement with Geant4 showers. For experiment-specific geometries some retuning might be necessary anyway. The tuning is quite complicated since there are many parameters (some correlated) and cannot be described here (see again hep-ex/0001020). For brave users the Gflash framework already forsees the possibility of passing a class with the (users) parameters,GVFlashHomoShowerTuning, to the GFlashHomoShowerParamterisation constructor. The default parameters are the original Gflash parameters:
GFlashHomoShowerParameterisation(G4Material * aMat, GVFlashHomoShowerTuning * aPar = 0);
Now there is also a preliminary implemenation of a parameterization for sampling calorimeters. The user must specify the active and passive material, as well as the thickness of the active and passive layer. The sampling structure of the calorimeter is taken into account by using an "effective medium" to compute the shower shape. All material properties needed are calculated automatically. If tuning is required, the user can pass his own parameter set in the class GFlashSamplingShowerTuning. Here the user can also set his calorimeter resolution. All in all the constructor looks the following:
GFlashSamplingShowerParamterisation(G4Material * Mat1, G4Material * Mat2,G4double d1,G4double d2, GVFlashSamplingShowerTuning * aPar = 0);
An implementation of some tools that should help the user to tune the parameterization is forseen.
5.3. Particles
5.3.1. Basic concepts
There are three levels of classes to describe particles in Geant4. G4ParticleDefinition defines a particle G4DynamicParticle describes a particle interacting with materials G4Track describes a particle traveling in space and time G4ParticleDefinition aggregates information to characterize a particle's properties, such as name, mass, spin, life time, and decay modes. G4DynamicParticle aggregates information to describe the dynamics of particles, such as energy, momentum, polarization, and proper time, as well as ``particle definition'' information. G4Track includes all information necessary for tracking in a detector simulation, such as time, position, and step, as well as ``dynamic particle'' information. G4Track has all the information necessary for tracking in Geant4. It includes position, time, and step, as well as kinematics. Details of G4Track will be described in Section 5.1.
Here is a list of particles in Geant4. This list is generated automatically by using Geant4 functionality, so listed values are same as those in your Geant4 application (as far as you do not change source codes).
Categories
gluon / quarks / di-quarks leptons mesons baryons ions
180
others
For example, spin 3/2 baryons and anti-baryons d. meson excited states with very short life For example, spin 1 vector bosons
5.3.2.4. G4ParticleDefinition
The G4ParticleDefinition class has ``read-only'' properties to characterize individual particles, such as name, mass, charge, spin, and so on. These properties are set during initialization of each particle. Methods to get these properties are listed in Table 5.2. G4String GetParticleName() G4double GetPDGMass() G4double GetPDGWidth() G4double GetPDGCharge() G4double GetPDGSpin() G4double GetPDGMagneticMoment() G4int GetPDGiParity() G4int GetPDGiConjugation() G4double GetPDGIsospin() G4double GetPDGIsospin3() particle name mass decay width electric charge spin magnetic moment (0: not defined or no magnetic moment) parity (0:not defined) charge conjugation (0:not defined) iso-spin 3rd-component of iso-spin
182
G4int GetPDGiGParity() G4String GetParticleType() G4String GetParticleSubType() G4int GetLeptonNumber() G4int GetBaryonNumber() G4int GetPDGEncoding() G4int GetAntiPDGEncoding()
G-parity (0:not defined) particle type particle sub-type lepton number baryon number particle encoding number by PDG encoding for anti-particle of this particle
Table 5.3. Methods to get particle decay modes and life time.
Users can modify these properties, though the other properties listed above can not be change without rebuilding the libraries. Each particle has its own G4ProcessManger object that manages a list of processes applicable to the particle.(see Section 2.5.2 )
183
ions Resonance particles have large mass width and the total energy of decay products at the center of mass system can be different event by event. As for ions, G4ParticleDefintion defines a nucleus and G4DynamicParticle defines an atom. G4ElectronOccupancy describes state of orbital electrons. So, the dynamic mass can be different from the PDG mass by the mass of electrons (and their binding energy). In addition, the dynamical charge, spin and magnetic moment are those of the atom/ion (i.e. including nucleus and orbit electrons). Decay products of heavy flavor particles are given in many event generators. In such cases, G4VPrimaryGenerator sets this information in *thePreAssignedDecayProducts. In addition, decay time of the particle can be set arbitrarily time by using PreAssignedDecayProperTime.
184
ApplyCut in ON: the TrackingManager checks the range of each secondary against the production threshold and against the safety. The particle is stacked if range > min(cut,safety). If not, check if the process has nevertheless set the flag ``good for tracking'' and then stack it (see Section 5.4.4 below for the explanation of the GoodForTracking flag). If not, recuperate its kinetic energy in the localEnergyDeposit, and set tkin=0. Then check in the ProcessManager if the vector of ProcessAtRest is not empty. If yes, stack the particle for performing the ``Action At Rest'' later. If not, and only in this case, abandon this secondary. With this sophisticated mechanism we have the global cut that we wanted, but with energy conservation, and we respect boundary constraint (safety) and the wishes of the processes (via ``good for tracking'').
5.4.6. Summary
In summary, we do not have tracking cuts; we only have production thresholds in range. All particles produced and accepted are tracked up to zero range. It must be clear that the overall coherency that we provide cannot go beyond the capability of processes to produce particles down to the recommended threshold. In other words a process can produce the secondaries down to the recommended threshold, and by interrogating the geometry, or by realizing when mass-to-energy conversion can occur, recognize when particles below the threshold have to be produced.
185
min remaining range The user can instantiate a UserLimits object only for the desired logical volumes and do the association. The first item (max step size) is automatically taken into account by the G4 kernel while the others items must be managed by the user, as explained below. Example(see novice/N02): in the Tracker region, in order to force the step size not to exceed 1/10 of the Tracker thickness, it is enough to put the following code in DetectorConstruction::Construct():
G4double maxStep = 0.1*TrackerLength; logicTracker->SetUserLimits(new G4UserLimits(maxStep));
and in PhysicsList, the process G4StepLimiter needs to be attached to each particle's process manager where step limitation in the Tracker region is required:
// Step limitation seen as a process G4StepLimiter* stepLimiter = new G4StepLimiter(); pmanager->AddDiscreteProcess(StepLimiter);
The G4UserLimits class is in source/global/management. Concerning the others cuts, the user must define dedicaced process(es). He registers this process (or its descendant) only for the desired particles in their process manager. He can apply his cuts in the DoIt of this process, since, via G4Track, he can access the logical volume and UserLimits. An example of such process (called UserSpecialCuts) is provided in the repository, but not inserted in any process manager of any particle. Example: neutrons. One may need to abandon the tracking of neutrons after a given time of flight (or a charged particle in a magnetic field after a given total track length ... etc ...). Example(see novice/N02): in the Tracker region, in order to force the total time of flight of the neutrons not to exceed 10 milliseconds, put the following code in DetectorConstruction::Construct():
G4double maxTime = 10*ms; logicTracker->SetUserLimits(new G4UserLimits(DBL_MAX,DBL_MAX,maxTime));
186
Please note that this new feature is intended only for users who 1. are simulating the most complex geometries, such as an LHC detector, and 2. are experienced in simulating electromagnetic showers in matter. We strongly recommend that results generated with this new feature be compared with results using the same geometry and uniform production thresholds. Setting completely different cut values for individual regions may break the coherent and comprehensive accuracy of the simulation. Therefore cut values should be carefully optimized, based on a comparison with results obtained using uniform cuts.
187
A change in production cut values therefore require these cross sections to be re-calculated. Cross sections for hadronic processes and gamma processes do not depend on the production cut. The G4PhysicsTable class is used to handle cross section tables. G4PhysicsTable is a collection of instances of G4PhysicsVector (and derived classes), each of which has cross section values for a particle within a given energy range traveling in a material. By default the linear interpolation is used, alternatively spline may be used if the flag of spline is activated by SetSpline method of the G4PhysicsVector
188
= = = = =
Maximum step length Maximum total track length Maximum global time for a track Minimum remaining kinetic energy for a track Minimum remaining range for a track
Note that uStepMax is affecting to each step, while all other limits are affecting to a track. The user can set G4UserLimits to logical volume and/or to a region. User limits assigned to logical volume do not propagate to daughter volumes, while User limits assigned to region propagate to daughter volumes unless daughters belong to another region. If both logical volume and associated region have user limits, those of logical volume win.
5.8.1. Physics
The error propagator package computes the average trajectory that a particle would follow. This means that the physics list must have the following characteristics: No multiple scattering No random fluctuations for energy loss No creation of secondary tracks No hadronic processes It has also to be taken into account that when the propagation is done backwards (in the direction opposed to the one the original track traveled) the energy loss has to be changed into an energy gain.
189
All this is done in the G4ErrorPhysicsList class, that is automatically set by G4ErrorPropagatorManager as the GEANT4 physics list. It sets G4ErrorEnergyLoss as unique electromagnetic process. This process uses the GEANT4 class G4EnergyLossForExtrapolator to compute the average energy loss for forwards or backwards propagation. To avoid getting too different energy loss calculation when the propagation is done forwards (when the energy at the beginning of the step is used) or backwards (when the energy at the end of the step is used, always smaller than at the beginning) G4ErrorEnergyLoss computes once the energy loss and then replaces the original energy loss by subtracting/ adding half of this value (what is approximately the same as computing the energy loss with the energy at the middle of the step). In this way, a better calculation of the energy loss is obtained with a minimal impact on the total CPU time. The user may use his/her own physics list instead of G4ErrorPhysicsList. As it is not needed to define a physics list when running this package, the user may have not realized that somewhere else in his/her application it has been defined; therefore a warning will be sent to advert the user that he is using a physics list different to G4ErrorPhysicsList. If a new physics list is used, it should also initialize the G4ErrorMessenger with the classes that serve to limit the step:
G4ErrorEnergyLoss* eLossProcess = new G4ErrorEnergyLoss; G4ErrorStepLengthLimitProcess* stepLengthLimitProcess = new G4ErrorStepLengthLimitProcess; G4ErrorMagFieldLimitProcess* magFieldLimitProcess = new G4ErrorMagFieldLimitProcess; new G4ErrorMessenger( stepLengthLimitProcess, magFieldLimitProcess, eLossProcess );
To ease the use of this package in the reconstruction code, the physics list, whether G4ErrorPhysicsList or the user's one, will be automatically initialized before starting the track propagation if it has not been done by the user.
A particle trajectory is characterized by five independent variables as a function of one parameter (e.g. the path length). Among the five variables, one is related to the curvature (to the absolute value of the momentum), two are related to the direction of the particle and the other two are related to the spatial location. There are two possible representations of these five parameters in the error propagator package: as a free trajectory state, class G4ErrorTrajStateFree, or as a trajectory state on a surface, class G4ErrorTrajStateonSurface.
190
G4double fYPerp G4double fZPerp where fInvP is the inverse of the momentum. fLambda and fPhi are the dip and azimuthal angles related to the momentum components in the following way: p_x = p cos(lambda) cos(phi) p_y = p cos(lambda) sin(phi) p_z = p sin(lambda) that is, lambda = 90 - theta, where theta is the usual angle with respect to the Z axis. fYperp and fZperp are the coordinates of the trajectory in a local orthonormal reference frame with the X axis along the particle direction, the Y axis being parallel to the X-Y plane (obtained by the vectorial product of the global Z axis and the momentum).
or by providing a plane
G4ErrorSurfaceTrajState( const const const const const G4String& partType, G4Point3D& pos, G4Vector3D& mom, G4Plane3D& plane, G4ErrorTrajErr& errmat = G4ErrorTrajErr(5,0) );
In this second case the vector V is calculated as the vector in the plane perpendicular to the global vector X (if the plane normal is equal to X, Z is used instead) and W is calculated as the vector in the plane perpendicular to V.
191
5.8.4. Targets
The user has to define up to where the propagation must be done: the target. The target can be a surface G4ErrorSurfaceTarget, which is not part of the GEANT4 geometry. It can also be the surface of a GEANT4 volume G4ErrorGeomVolumeTarget, so that the particle will be stopped when it enters this volume. Or it can be that the particle is stopped when a certain track length is reached, by implementing a G4ErrorTrackLengthTarget.
192
It is implemented as a G4VDiscreteProcess and it limits the step in PostStepGetPhysicalInteractionLength. To ease its use, the process is registered to all particles in the constructor.
You can get the pointer to the only instance of G4ErrorPropagatorManager with
G4ErrorPropagatorManager* g4emgr = G4ErrorPropagatorManager::GetErrorPropagatorManager();
Another possibility is to invoke the propagation step by step, returning control to the user after each step. This can be done with the method
G4int PropagateOneStep( G4ErrorTrajState* currentTS, G4ErrorMode mode = G4ErrorMode_PropForwards );
In this case you should register the target first with the command
193
G4ErrorPropagatorData::GetG4ErrorPropagatorData()->SetTarget( theG4eTarget );
The second one is by setting the maximum percentage of energy loss in the step (or energy gain is propagation is backwards). This can be set by invoking the user command :
G4UImanager::GetUIpointer()->ApplyCommand("/geant4e/limits/energyLoss MY_VALUE");
The last one is by setting the maximum difference between the value of the magnetic field at the beginning and at the end of the step. Indeed what is limited is the curvature, or exactly the value of the magnetic field divided by the value of the momentum transversal to the field. This can be set by invoking the user command :
G4UImanager::GetUIpointer()->ApplyCommand("/geant4e/limits/magField MY_VALUE");
The classes that limit the step are implemented as GEANT4 processes. Therefore, the invocation of the above-mentioned commands should only be done after the initialization (for example after G4ErrorPropagatorManager::InitGeant4e().
194
G4VUserPhysicsList
This is an abstract class for constructing particles and processes. The user must derive a concrete class from it and implement three virtual methods: ConstructParticle() to instantiate each requested particle type, ConstructPhysics() to instantiate the desired physics processes and register each of them with the process managers of the appropriate particles, and SetCuts(G4double aValue) to set a cut value in range for all particles in the particle table, which invokes the rebuilding of the physics table. When called, the Construct() method of G4VUserPhysicsList first invokes ConstructParticle() and then ConstructProcess(). The ConstructProcess() method must always invoke the AddTransportation() method in order to insure particle transportation. AddTransportation() must never be overridden. G4VUserPhysicsList provides several utility methods for the implementation of the above virtual methods. They are presented with comments in the class declaration in Example 6.2.
195
User Actions
///////////////////////////////////////////////////////////////////// public: // with description // Invoke BuildPhysicsTable for all processes for all particles // In case of "Retrieve" flag is ON, PhysicsTable will be // retrieved from files void BuildPhysicsTable(); // do BuildPhysicsTable for specified particle type void BuildPhysicsTable(G4ParticleDefinition* ); // Store PhysicsTable together with both material and cut value // information in files under the specified directory. // (return true if files are sucessfully created) G4bool StorePhysicsTable(const G4String& directory = "."); // Return true if "Retrieve" flag is ON. // (i.e. PhysicsTable will be retrieved from files) G4bool IsPhysicsTableRetrieved() const; G4bool IsStoredInAscii() const; // Get directory path for physics table files. const G4String& GetPhysicsTableDirectory() const; // Set "Retrieve" flag // Directory path can be set together. // Null string (default) means directory is not changed // from the current value void SetPhysicsTableRetrieved(const G4String& directory = ""); void SetStoredInAscii(); // Reset "Retrieve" flag void ResetPhysicsTableRetrieved();
196
User Actions
void
ResetStoredInAscii();
/////////////////////////////////////////////////////////////////////// public: // with description // Print out the List of registered particles types void DumpList() const; public: // with description // Request to print out information of cut values // Printing will be performed when all tables are made void DumpCutValuesTable(G4int nParticles=3); // The following method actually trigger the print-out requested // by the above method. This method must be invoked by RunManager // at the proper moment. void DumpCutValuesTableIfRequested(); public: // with description void SetVerboseLevel(G4int value); G4int GetVerboseLevel() const; // set/get controle flag for output message // 0: Silent // 1: Warning message // 2: More
/////////////////////////////////////////////////////////////////////////// public: // with description // "SetCutsWithDefault" method sets the default cut value // for all particles for the default region. void SetCutsWithDefault(); // Following are utility methods for SetCuts // SetCutValue sets a cut value for a particle type for the default region void SetCutValue(G4double aCut, const G4String& pname); // SetCutValue sets a cut value for a particle type for a region void SetCutValue(G4double aCut, const G4String& pname, const G4String& rname); // Invoke SetCuts for specified particle for a region // If the pointer to the region is NULL, the default region is used // In case of "Retrieve" flag is ON, // Cut values will be retrieved from files void SetParticleCuts(G4double cut,G4ParticleDefinition* particle,G4Region* region=0); // Invoke SetCuts for all particles in a region void SetCutsForRegion(G4double aCut, const G4String& rname); // Following are utility methods are obsolete void ResetCuts(); /////////////////////////////////////////////////////////////////// public: // Get/SetApplyCuts gets/sets the flag for ApplyCuts void SetApplyCuts(G4bool value, const G4String& name); G4bool GetApplyCuts(const G4String& name) const; /////////////////////////////////////////////////////////////////////////////// protected: // do BuildPhysicsTable for make the integral schema void BuildIntegralPhysicsTable(G4VProcess* ,G4ParticleDefinition* );
protected: // Retrieve PhysicsTable from files for proccess belongng the particle. // Normal BuildPhysics procedure of processes will be invoked, // if it fails (in case of Process's RetrievePhysicsTable returns false) virtual void RetrievePhysicsTable(G4ParticleDefinition* , const G4String& directory, G4bool ascii = false); ///////////////////////////////////////////////////////////////// protected: // adds new ProcessManager to all particles in the Particle Table // this routine is used in Construct() void InitializeProcessManager();
197
User Actions
public: // with description // remove and delete ProcessManagers for all particles in tha Particle Table // this routine is invoked from RunManager void RemoveProcessManager(); public: // with description // add process manager for particles created on-the-fly void AddProcessManager(G4ParticleDefinition* newParticle, G4ProcessManager* newManager = 0 ); };
198
User Actions
G4UserEventAction
This class has two virtual methods which are invoked by G4EventManager for each event: beginOfEventAction() This method is invoked before converting the primary particles to G4Track objects. A typical use of this method would be to initialize and/or book histograms for a particular event. endOfEventAction() This method is invoked at the very end of event processing. It is typically used for a simple analysis of the processed event. If the user wants to keep the currently processing event until the end of the current run, the user can invoke fpEventManager->KeepTheCurrentEvent(); so that it is kept in G4Run object. This should be quite useful if you simulate quite many events and want to visualize only the most interest ones after the long execution. Given the memory size of an event and its contents may be large, it is the user's responsibility not to keep unnecessary events.
G4UserStackingAction
This class has three virtual methods, ClassifyNewTrack, NewStage and PrepareNewEvent which the user may override in order to control the various track stacking mechanisms. ExampleN04 could be a good example to understand the usage of this class. ClassifyNewTrack() is invoked by G4StackManager whenever a new G4Track object is "pushed" onto a stack by G4EventManager. ClassifyNewTrack() returns an enumerator, G4ClassificationOfNewTrack, whose value indicates to which stack, if any, the track will be sent. This value should be determined by the user. G4ClassificationOfNewTrack has four possible values: fUrgent - track is placed in the urgent stack fWaiting - track is placed in the waiting stack, and will not be simulated until the urgent stack is empty fPostpone - track is postponed to the next event fKill - the track is deleted immediately and not stored in any stack.
These assignments may be made based on the origin of the track which is obtained as follows:
199
User Actions
where parent_ID = 0 indicates a primary particle parent_ID > 0 indicates a secondary particle parent_ID < 0 indicates postponed particle from previous event. NewStage() is invoked when the urgent stack is empty and the waiting stack contains at least one G4Track object. Here the user may kill or re-assign to different stacks all the tracks in the waiting stack by calling the stackManager->ReClassify() method which, in turn, calls the ClassifyNewTrack() method. If no user action is taken, all tracks in the waiting stack are transferred to the urgent stack. The user may also decide to abort the current event even though some tracks may remain in the waiting stack by calling stackManager>clear(). This method is valid and safe only if it is called from the G4UserStackingAction class. A global method of event abortion is
PrepareNewEvent() is invoked at the beginning of each event. At this point no primary particles have been converted to tracks, so the urgent and waiting stacks are empty. However, there may be tracks in the postponedto-next-event stack; for each of these the ClassifyNewTrack() method is called and the track is assigned to the appropriate stack.
200
User Actions
201
User Actions
202
User Actions
6.3.1. G4VUserEventInformation
G4VUserEventInformation is an abstract class from which the user can derive his/her own concrete class for storing user information associated with a G4Event class object. It is the user's responsibility to construct a concrete class object and set the pointer to a proper G4Event object. Within a concrete implementation of G4UserEventAction, the SetUserEventInformation() method of G4EventManager may be used to set a pointer of a concrete class object to G4Event, given that the G4Event object is available only by "pointer to const". Alternatively, the user may modify the GenerateEvent() method of his/her own RunManager to instantiate a G4VUserEventInformation object and set it to G4Event. The concrete class object is deleted by the Geant4 kernel when the associated G4Event object is deleted.
6.3.2. G4VUserTrackInformation
This is an abstract class from which the user can derive his/her own concrete class for storing user information associated with a G4Track class object. It is the user's responsibility to construct a concrete class object and set the pointer to the proper G4Track object. Within a concrete implementation of G4UserTrackingAction, the SetUserTrackInformation() method of G4TrackingManager may be used to set a pointer of a concrete class object to G4Track, given that the G4Track object is available only by "pointer to const". The ideal place to copy a G4VUserTrackInformation object from a mother track to its daughter tracks is G4UserTrackingAction::PostUserTrackingAction().
The concrete class object is deleted by the Geant4 kernel when the associated G4Track object is deleted. In case the user wants to keep the information, it should be copied to a trajectory corresponding to the track.
203
User Actions
6.3.4. G4VUserRegionInformation
This abstract base class allows the user to attach information associated with a region. For example, it would be quite beneficial to add some methods returning a boolean flag to indicate the characteristics of the region (e.g. tracker, calorimeter, etc.). With this example, the user can easily and quickly identify the detector component.
void SetWorld(G4bool v=true) {isWorld = v;} void SetTracker(G4bool v=true) {isTracker = v;} void SetCalorimeter(G4bool v=true) {isCalorimeter = v;} G4bool IsWorld() const {return isWorld;} G4bool IsTracker() const {return isTracker;} G4bool IsCalorimeter() const {return isCalorimeter;}
The following code is an example of a stepping action. Here, a track is suspended when it enters the "calorimeter region" from the "tracker region".
204
Note
The availability of individual commands, the ranges of parameters, the available candidates on individual command parameters vary according to the implementation of your application and may even vary dynamically during the execution of your job. The following is a short summary of available commands. You can also see the all available commands by executeing 'help' in your UI session. List of built-in commands
205
at least one parameter of the command has a range at least one parameter of the command has a candidate list at least the value of one parameter is omitted and this parameter is defined as omittable and currentValueAsDefault For the first two cases, you can re-set the range or the candidate list if you need to do so, but these ``re-set'' parameters are needed only for the case where the range or the candidate list varies dynamically. A command can be ``state sensitive'', i.e., the command can be accepted only for a certain G4ApplicationState(s). For example, the /run/beamOn command should not be accepted when Geant4 is processing another event (``G4State_EventProc'' state). You can set the states available for the command with the AvailableForStates() method.
G4UIdirectory
This is a G4UIcommand derived class for defining a directory. G4UIdirectory(char* directoryPath) Constructor. Argument is the (full-path) directory, which must begin and terminate with `/'.
G4UIcmdWithoutParameter
This is a G4UIcommand derived class for a command which takes no parameter. G4UIcmdWithoutParameter(char* commandPath, G4UImessenger* theMessenger) Constructor. Arguments are the (full-path) command name and the pointer to your messenger.
G4UIcmdWithABool
This is a G4UIcommand derived class which takes one boolean type parameter. G4UIcmdWithABool(char* commandpath,G4UImanager* theMessenger) Constructor. Arguments are the (full-path) command name and the pointer to your messenger. void SetParameterName(char* paramName, G4bool omittable) 206
Define the name of the boolean parameter and set the omittable flag. If omittable is true, you should define the default value using the next method. void SetDefaultValue(G4bool defVal) Define the default value of the boolean parameter. G4bool GetNewBoolValue(G4String paramString) Convert G4String parameter value given by the SetNewValue() method of your messenger into boolean. G4String convertToString(G4bool currVal) Convert the current boolean value to G4String whichshould be returned by the GetCurrentValue() method of your messenger.
G4UIcmdWithAnInteger
This is a G4UIcommand derived class which takes one integer type parameter. G4UIcmdWithAnInteger(char* commandpath, G4UImanager* theMessenger) Constructor. Arguments are the (full-path) command name and the pointer to your messenger. void SetParameterName(char* paramName, G4bool omittable) Define the name of the integer parameter and set the omittable flag. If omittable is true, you should define the default value using the next method. void SetDefaultValue(G4int defVal) Define the default value of the integer parameter. G4int GetNewIntValue(G4String paramString) Convert G4String parameter value given by the SetNewValue() method of your messenger into integer. G4String convertToString(G4int currVal) Convert the current integer value to G4String, which should be returned by the GetCurrentValue() method of your messenger.
G4UIcmdWithADouble
This is a G4UIcommand derived class which takes one double type parameter. G4UIcmdWithADouble(char* commandpath, G4UImanager* theMessenger) Constructor. Arguments are the (full-path) command name and the pointer to your messenger. void SetParameterName(char* paramName, G4bool omittable) Define the name of the double parameter and set the omittable flag. If omittable is true, you should define the default value using the next method. void SetDefaultValue(G4double defVal) Define the default value of the double parameter. G4double GetNewDoubleValue(G4String paramString) Convert G4String parameter value given by the SetNewValue() method of your messenger into double. G4String convertToString(G4double currVal) Convert the current double value to G4String which should be returned by the GetCurrentValue() method of your messenger.
G4UIcmdWithAString
This is a G4UIcommand derived class which takes one string type parameter.
207
G4UIcmdWithAString(char* commandpath, G4UImanager* theMessenger) Constructor. Arguments are the (full-path) command name and the pointer to your messenger. void SetParameterName(char* paramName, G4bool omittable) Define the name of the string parameter and set the omittable flag. If omittable is true, you should define the default value using the next method. void SetDefaultValue(char* defVal) Define the default value of the string parameter. void SetCandidates(char* candidateList) Define a candidate list which can be taken by the parameter. Each candidate listed in this list should be separated by a single space. If this candidate list is given, a string given by the user but which is not listed in this list will be rejected.
G4UIcmdWith3Vector
This is a G4UIcommand derived class which takes one three vector parameter. G4UIcmdWith3Vector(char* commandpath, G4UImanager* theMessenger) Constructor. Arguments are the (full-path) command name and the pointer to your messenger. void SetParameterName(char* paramNamX, char* paramNamY, char* paramNamZ, G4bool omittable) Define the names of each component of the three vector and set the omittable flag. If omittable is true, you should define the default value using the next method. void SetDefaultValue(G4ThreeVector defVal) Define the default value of the three vector. G4ThreeVector GetNew3VectorValue(G4String paramString) Convert the G4String parameter value given by the SetNewValue() method of your messenger into a G4ThreeVector. G4String convertToString(G4ThreeVector currVal) Convert the current three vector to G4String, which should be returned by the GetCurrentValue() method of your messenger.
G4UIcmdWithADoubleAndUnit
This is a G4UIcommand derived class which takes one double type parameter and its unit. G4UIcmdWithADoubleAndUnit(char* commandpath, G4UImanager* theMessenger) Constructor. Arguments are the (full-path) command name and the pointer to your messenger. void SetParameterName(char* paramName, G4bool omittable) Define the name of the double parameter and set the omittable flag. If omittable is true, you should define the default value using the next method. void SetDefaultValue(G4double defVal) Define the default value of the double parameter. void SetUnitCategory(char* unitCategory) Define acceptable unit category. void SetDefaultUnit(char* defUnit) Define the default unit. Please use this method and the SetUnitCategory() method alternatively. 208
G4double GetNewDoubleValue(G4String paramString) Convert G4String parameter value given by the SetNewValue() method of your messenger into double. Please note that the return value has already been multiplied by the value of the given unit. G4double GetNewDoubleRawValue(G4String paramString) Convert G4String parameter value given by the SetNewValue() method of your messenger into double but without multiplying the value of the given unit. G4double GetNewUnitValue(G4String paramString) Convert G4String unit value given by the SetNewValue() method of your messenger into double. G4String convertToString(G4bool currVal, char* unitName) Convert the current double value to a G4String, which should be returned by the GetCurrentValue() method of your messenger. The double value will be divided by the value of the given unit and converted to a string. Given unit will be added to the string.
G4UIcmdWith3VectorAndUnit
This is a G4UIcommand derived class which takes one three vector parameter and its unit. G4UIcmdWith3VectorAndUnit(char* commandpath, G4UImanager* theMessenger) Constructor. Arguments are the (full-path) command name and the pointer to your messenger. void SetParameterName(char* paramNamX, char* paramNamY, paramNamZ,G4bool omittable)
char*
Define the names of each component of the three vector and set the omittable flag. If omittable is true, you should define the default value using the next method. void SetDefaultValue(G4ThreeVector defVal) Define the default value of the three vector. void SetUnitCategory(char* unitCategory) Define acceptable unit category. void SetDefaultUnit(char* defUnit) Define the default unit. Please use this method and the SetUnitCategory() method alternatively. G4ThreeVector GetNew3VectorValue(G4String paramString) Convert a G4String parameter value given by the SetNewValue() method of your messenger into a G4ThreeVector. Please note that the return value has already been multiplied by the value of the given unit. G4ThreeVector GetNew3VectorRawValue(G4String paramString) Convert a G4String parameter value given by the SetNewValue() method of your messenger into three vector, but without multiplying the value of the given unit. G4double GetNewUnitValue(G4String paramString) Convert a G4String unit value given by the SetNewValue() method of your messenger into a double. G4String convertToString(G4ThreeVector currVal, char* unitName) Convert the current three vector to a G4String which should be returned by the GetCurrentValue() method of your messenger. The three vector value will be divided by the value of the given unit and converted to a string. Given unit will be added to the string.
false. If you assign this extra argument as true, the default value of the parameter will be overriden by the current value of the target class.
#include "G4UImessenger.hh" #include "globals.hh" class G4ParticleGunMessenger: public G4UImessenger { public: G4ParticleGunMessenger(G4ParticleGun * fPtclGun); ~G4ParticleGunMessenger(); public: void SetNewValue(G4UIcommand * command,G4String newValues); G4String GetCurrentValue(G4UIcommand * command); private: G4ParticleGun * fParticleGun; G4ParticleTable * particleTable; private: //commands G4UIdirectory * gunDirectory; G4UIcmdWithoutParameter * listCmd; G4UIcmdWithAString * particleCmd; G4UIcmdWith3Vector * directionCmd; G4UIcmdWithADoubleAndUnit * energyCmd; G4UIcmdWith3VectorAndUnit * positionCmd; G4UIcmdWithADoubleAndUnit * timeCmd; }; #endif
210
G4ParticleGunMessenger::G4ParticleGunMessenger(G4ParticleGun * fPtclGun) :fParticleGun(fPtclGun) { particleTable = G4ParticleTable::GetParticleTable(); gunDirectory = new G4UIdirectory("/gun/"); gunDirectory->SetGuidance("Particle Gun control commands."); listCmd = new G4UIcmdWithoutParameter("/gun/list",this); listCmd->SetGuidance("List available particles."); listCmd->SetGuidance(" Invoke G4ParticleTable."); particleCmd = new G4UIcmdWithAString("/gun/particle",this); particleCmd->SetGuidance("Set particle to be generated."); particleCmd->SetGuidance(" (geantino is default)"); particleCmd->SetParameterName("particleName",true); particleCmd->SetDefaultValue("geantino"); G4String candidateList; G4int nPtcl = particleTable->entries(); for(G4int i=0;i<nPtcl;i++) { candidateList += particleTable->GetParticleName(i); candidateList += " "; } particleCmd->SetCandidates(candidateList); directionCmd = new G4UIcmdWith3Vector("/gun/direction",this); directionCmd->SetGuidance("Set momentum direction."); directionCmd->SetGuidance("Direction needs not to be a unit vector."); directionCmd->SetParameterName("Px","Py","Pz",true,true); directionCmd->SetRange("Px != 0 || Py != 0 || Pz != 0"); energyCmd = new G4UIcmdWithADoubleAndUnit("/gun/energy",this); energyCmd->SetGuidance("Set kinetic energy."); energyCmd->SetParameterName("Energy",true,true); energyCmd->SetDefaultUnit("GeV"); energyCmd->SetUnitCandidates("eV keV MeV GeV TeV"); positionCmd = new G4UIcmdWith3VectorAndUnit("/gun/position",this); positionCmd->SetGuidance("Set starting position of the particle."); positionCmd->SetParameterName("X","Y","Z",true,true); positionCmd->SetDefaultUnit("cm"); positionCmd->SetUnitCandidates("micron mm cm m km"); timeCmd = new G4UIcmdWithADoubleAndUnit("/gun/time",this); timeCmd->SetGuidance("Set initial time of the particle."); timeCmd->SetParameterName("t0",true,true); timeCmd->SetDefaultUnit("ns"); timeCmd->SetUnitCandidates("ns ms s"); // Set initial value to G4ParticleGun fParticleGun->SetParticleDefinition( G4Geantino::Geantino() ); fParticleGun->SetParticleMomentumDirection( G4ThreeVector(1.0,0.0,0.0) ); fParticleGun->SetParticleEnergy( 1.0*GeV ); fParticleGun->SetParticlePosition(G4ThreeVector(0.0*cm, 0.0*cm, 0.0*cm)); fParticleGun->SetParticleTime( 0.0*ns ); }
G4ParticleGunMessenger::~G4ParticleGunMessenger() {
211
void G4ParticleGunMessenger::SetNewValue( G4UIcommand * command,G4String newValues) { if( command==listCmd ) { particleTable->dumpTable(); } else if( command==particleCmd ) { G4ParticleDefinition* pd = particleTable->findParticle(newValues); if(pd != NULL) { fParticleGun->SetParticleDefinition( pd ); } } else if( command==directionCmd ) { fParticleGun->SetParticleMomentumDirection(directionCmd-> GetNew3VectorValue(newValues)); } else if( command==energyCmd ) { fParticleGun->SetParticleEnergy(energyCmd-> GetNewDoubleValue(newValues)); } else if( command==positionCmd ) { fParticleGun->SetParticlePosition( directionCmd->GetNew3VectorValue(newValues)); } else if( command==timeCmd ) { fParticleGun->SetParticleTime(timeCmd-> GetNewDoubleValue(newValues)); } } G4String G4ParticleGunMessenger::GetCurrentValue(G4UIcommand * command) { G4String cv; if( command==directionCmd ) { cv = directionCmd->ConvertToString( fParticleGun->GetParticleMomentumDirection()); } else if( command==energyCmd ) { cv = energyCmd->ConvertToString( fParticleGun->GetParticleEnergy(),"GeV"); } else if( command==positionCmd ) { cv = positionCmd->ConvertToString( fParticleGun->GetParticlePosition(),"cm"); } else if( command==timeCmd ) { cv = timeCmd->ConvertToString( fParticleGun->GetParticleTime(),"ns"); } else if( command==particleCmd ) { // update candidate list G4String candidateList; G4int nPtcl = particleTable->entries(); for(G4int i=0;i<nPtcl;i++) { candidateList += particleTable->GetParticleName(i); candidateList += " "; } particleCmd->SetCandidates(candidateList); } return cv; }
212
These methods receive the string stream of G4cout and G4cerr, respectively. The string can be handled to meet specific requirements. The following sample code shows how to make a log file of the output stream:
ostream logFile; logFile.open("MyLogFile"); G4int MySession::ReceiveG4cout(G4String coutString) { logFile << coutString << flush; return 0; }
2. Set the destination of G4cout/G4cerr using G4UImanager::SetCoutDestination(session). Typically this method is invoked from the constructor of G4UIsession and its derived classes, such as G4UIGAG/G4UIteminal. This method sets the destination of G4cout/G4cerr to the session. For example, when the following code appears in the constructor of G4UIterminal, the method SetCoutDestination(this) tells UImanager that this instance of G4UIterminal receives the stream generated by G4cout.
G4UIterminal::G4UIterminal() { UI = G4UImanager::GetUIpointer(); UI->SetCoutDestination(this); // ... }
Similarly, UI->SetCoutDestination(NULL) must be added to the destructor of the class. 3. Write or modify the main program. To modify exampleN01 to produce a log file, derive a class as described in step 1 above, and add the following lines to the main program:
#include "MySession.hh" main() { // get the pointer to the User Interface manager G4UImanager* UI = G4UImanager::GetUIpointer(); // construct a session which receives G4cout/G4cerr MySession * LoggedSession = new MySession; UI->SetCoutDestination(LoggedSession); // session->SessionStart(); // not required in this case // .... do simulation here ... delete LoggedSession; return 0; }
Note
G4cout/G4cerr should not be used in the constructor of a class if the instance of the class is intended to be used as static. This restriction comes from the language specification of C++. See the documents below for details: M.A.Ellis, B.Stroustrup, ``Annotated C++ Reference Manual'', Section 3.4 [ Ellis1990 ] P.J.Plauger, ``The Draft Standard C++ Library'' [ Plauger1995 ]
213
Chapter 8. Visualization
8.1. Introduction to Visualization
The Geant4 visualization system was developed in response to a diverse set of requirements: 1. 2. 3. 4. 5. Quick response to study geometries, trajectories and hits High-quality output for publications Flexible camera control to debug complex geometries Tools to show volume overlap errors in detector geometries Interactive picking to get more information on visualized objects
No one graphics system is ideal for all of these requirements, and many of the large software frameworks into which Geant4 has been incorporated already have their own visualization systems, so Geant4 visualization was designed around an abstract interface that supports a diverse family of graphics systems. Some of these graphics systems use a graphics library compiled with Geant4, such as OpenGL, Qt, while others involve a separate application, such as HepRApp or DAWN. Most examples include a vis.mac to perform typical visualization for that example. The macro includes optional code which you can uncomment to activate additional visualization features.
Visualization
zoom, rotate, translate Fast response (can usually exploit full potential of graphics hardware) Expanded printing ability (vector and pixel graphics) Easy interface to make movies OpenInventor View directly from Geant4 Requires addition of OpenInventor libraries (freely available for most Linux systems). Rendered, photorealistic image Many interactive features zoom, rotate, translate click to "see inside" opaque volumes Fast response (can usually exploit full potential of graphics hardware) Expanded printing ability (vector and pixel graphics) HepRep Create a file to view in a HepRep browser such as HepRApp, FRED or WIRED4 Requires a HepRep browser (above options work on any operating system) Wireframe or simple area fills (not photorealistic) Many interactive features zoom, rotate, translate click to show attributes (momentum, etc.) special projections (FishEye, etc.) control visibility from hierarchical (tree) view of data Hierarchical view of the geometry Export to many vector graphic formats (PostScript, PDF, etc.) DAWN Create a file to view in the DAWN Renderer Requires DAWN, available for all Linux and Windows systems. Rendered, photorealistic image No interactive features Highest quality technical rendering - output to vector PostScript VRML Create a file to view in any VRML browser (some as web browser plug-ins). Requires VRML browser (many different choices for different operating systems). Rendered, photorealistic image with some interactive features zoom, rotate, translate Limited printing ability (pixel graphics, not vector graphics) RayTracer Create a jpeg file Forms image by using Geant4's own tracking to follow photons through the detector Can show geometry but not trajectories Can render any geometry that Geant4 can handle (such as Boolean solids) Supports shadows, transparency and mirrored surfaces gMocren Create a gMocren file suiable for viewing in the gMocren volume data visualization application Represents three dimensional volume data such as radiation therapy dose Can also include geometry and trajectory information ASCIITree Text dump of the geometry hierarchy Not graphical Control over level of detail to be dumped Can calculate mass and volume of any hierarchy of volumes
Visualization
Only Qt can do that If you want very responsive photorealistic graphics plus more interactivity (and have the OpenInventor or Qt libraries installed) OpenInventor or Qt are good solutions If you want GUI control, very responsive photorealistic graphics plus more interactivity (and have the Qt libraries installed). Qt is a good solution If you want GUI control, want to be able to pick on items to inquire about them (identity, momentum, etc.), perhaps want to render to vector formats, and a wireframe look will do HepRep will meet your needs If you want to render highest quality photorealistic images for use in a poster or a technical design report, and you can live without quick rotate and zoom DAWN is the way to go If you want to render to a 3D format that others can view in a variety of commodity browsers (including some web browser plug-ins) VRML is the way to go If you want to visualize a geometry that the other visualization drivers can't handle, or you need transparency or mirrors, and you don't need to visualize trajectories RayTracer will do it If you want to visualization volume data, such as radiation therapy dose distributions gMocren will meet your needs If you just want to quickly check the geometry hierarchy, or if you want to calculate the volume or mass of any geometry hierarchy ASCIITree will meet your needs You can also add your own visualization driver. Geant4's visualization system is modular. By creating just three new classes, you can direct Geant4 information to your own visualization system.
Visualization
Section 8.6 Visualization Attributes Section 8.7 Enhanced Trajectory Drawing Section 8.9 Polylines, Markers and Text Section 8.10 Making a Movie
Other useful references for Geant4 visualization outside of this user guide: Introduction to Geant4 Visualization ( pdf, ppt ) Geant4 Visualization Commands ( pdf, ppt ) Geant4 Advanced Visualization ( pdf, ppt ) How to Make a Movie ( pdf, ppt ) Geant4 Visualization Tutorial using the HepRApp HepRep Browser Geant4 Visualization Tutorial using the OpenGL Event Display Geant4 Visualization Tutorial using the DAWN Event Display Macro files distributed in Geant4 source in examples/novice/N03/visTutor/.
If you wish to "do-it-yourself", use "export" (for Bourne-like shells, including bash) or "setenv" (for Cshells). "G4VIS_BUILD_DRIVERNAME_DRIVER" should be set to "1" before installing the Geant4 libraries:
setenv setenv setenv setenv setenv setenv setenv G4VIS_BUILD_OPENGLX_DRIVER G4VIS_BUILD_OPENGLXM_DRIVER G4VIS_BUILD_OPENGLQT_DRIVER G4VIS_BUILD_OIX_DRIVER G4VIS_BUILD_RAYTRACERX_DRIVER G4VIS_BUILD_DAWN_DRIVER G4VIS_BUILD_VRML_DRIVER 1 1 1 1 1 1 1 # # # # # # # OpenGL-Xlib driver OpenGL-Motif driver Qt driver OpenInventor-Xlib driver RayTracer-XLib driver DAWN-Network driver VRML-Network
217
Visualization
Unless the environment variable G4VIS_NONE is set to "1", setting any of the above variables sets a C-pre-processor flag of the same name. Also the C-pre-processor flag G4VIS_BUILD is set (see config/ G4VIS_BUILD.gmk), which incorparates the selected driver into the Geant4 libraries.
If you wish to use G4VisExecutive but register an additional graphics system, XXX say, you may do so either before or after initializing:
visManager->RegisterGraphicsSytem(new XXX); visManager->Initialize();
By default, you get the DAWNFILE, HepRepFile, RayTracer, VRML1FILE, VRML2FILE, ATree and GAGTree drivers. Additionally, you may choose from the OpenGL-Xlib, OpenGL-Motif, Qt, OpenInventor, RayTracerX, DAWN-Network and VRML-Network drivers, each of which can be selected with "Configure" or by setting the proper environment variable:
setenv setenv setenv setenv setenv setenv setenv G4VIS_USE_OPENGLX G4VIS_USE_OPENGLXM G4VIS_USE_OPENGLQT G4VIS_USE_OIX G4VIS_USE_RAYTRACERX G4VIS_USE_DAWN G4VIS_USE_VRML 1 1 1 1 1 1 1
(Of course, this has to be chosen from the set incorporated into the Geant4 libraries during their compilation.) Unless the environment variable G4VIS_NONE is set, these set C-pre-processor flags of the same name. Also, unless the environment variable G4VIS_NONE is set, the C-pre-processor flag G4VIS_USE is always set by default. This flag is available in describing the main() function. You may have to set additional environment variables for your selected visualization drivers and graphics systems. For example, the OpenGL driver may require the setting of OGLHOME which points to the location of the OpenGL libraries. For more details, see Section 8.3 "Visualization Drivers" and pages linked from there.
218
Visualization
visualization manager, G4VisExecutive. The Visualization Manager accepts users' requests for visualization, processes them, and passes the processed requirements to the abstract interface, i.e., to the currently selected visualization driver.
Alternatively, you can implement an empty RegisterGraphicsSystems() function, and register visualization drivers you want directly in your main() function. See Example 8.2.
Do not forget to delete the instantiated Visualization Manager by yourself. Note that a graphics system for Geant4 Visualization may run as a different process. In that case, the destructor of G4VisManager might have to terminate the graphics system and/or close the connection. We recommend that the instantiation, initialization, and deletion of the Visualization Manager be protected by Cpre-processor commands, as in the novice examples. The C-pre-processor macro G4VIS_USE is automatically defined unless the environment variable G4VIS_NONE is set. This assumes that you are compiling your Geant4 executable with the standard version of GNUmakefile found in the config directory. Example 8.3 shows an example of the main() function available for Geant4 Visualization.
219
Visualization
Example 8.3. An example of the main() function available for Geant4 Visualization.
//----- C++ source codes: An example of main() for visualization ..... #include "G4VisExecutive.hh" #include "G4UIExecutive.hh" ..... int main() { // Run Manager G4RunManager * runManager = new G4RunManager; // Detector components runManager->set_userInitialization(new MyDetectorConstruction); runManager->set_userInitialization(new MyPhysicsList); // UserAction classes. runManager->set_userAction(new runManager->set_userAction(new runManager->set_userAction(new runManager->set_userAction(new
#ifdef G4VIS_USE G4VisManager* visManager = new G4VisExecutive; visManager -> initialize (); #endif // Define (G)UI G4UIExecutive * ui = new G4UIExecutive; ui->SessionStart(); delete ui; delete runManager; #ifdef G4VIS_USE delete visManager; #endif return 0; } //----- end of C++
Useful information on incorporated visualization drivers can be displayed in initializing the Visualization Manager. This is done by setting the verbosity flag to an appropriate number or string:
Simple graded message 0) quiet, // 1) startup, // 2) errors, // 3) warnings, // 4) confirmations, // 5) parameters, // 6) all // scheme - give first letter or a digit: Nothing is printed. Startup and endup messages are printed... ...and errors... ...and warnings... ...and confirming messages... ...and parameters of scenes and views... ...and everything available.
220
Visualization
Details are given below for: Section 8.3.2 OpenGL Section 8.3.3 Qt Section 8.3.4 OpenInventor Section 8.3.5 HepRepFile Section 8.3.6 HepRepXML Section 8.3.7 DAWN Section 8.3.9 VRML Section 8.3.10 RayTracer Section 8.3.11 gMocren Section 8.3.12 ASCIITree Section 8.3.13 GAGTree Section 8.3.14 XMLTree
Fukui Renderer DAWN Fukui Renderer DAWN any VRML viewer any JPEG viewer none GAG any XML viewer
Table 8.1. Required graphics systems and supported platforms for the various visualization drivers.
8.3.2. OpenGL
These drivers have been developed by John Allison and Andrew Walkden (University of Manchester). It is an interface to the de facto standard 3D graphics library, OpenGL. It is well suited for real-time fast visualization and demonstration. Fast visualization is realized with hardware acceleration, reuse of shapes stored in a display list, etc. NURBS visualization is also supported. Several versions of the OpenGL drivers are prepared. Versions for Xlib, Motif, Qt and Win32 platforms are available by default. For each version, there are two modes: immediate mode and stored mode. The former has no limitation on data size, and the latter is fast for visualizing large data repetitively, and so is suitable for animation. Output can be exported to EPS (both vector and pixel graphics) using vis/ogl/printEPS.
221
Visualization
More information can be found here : Section 8.4.14 If you want to open a OGL viewer, the generic way is :
/vis/open OGL
According to your G4VIS_USE... variables it will open the correct viewer. By default, it will be open in stored mode. You can specify to open an "OGLS" or "OGLI" viewer, or even "OGLSXm","OGLIXm",... If you don't have Motif or Qt, all control is done from Geant4 commands:
But if you have Motif libraries or Qt install, you can control Geant4 from Motif widgets or mouse with Qt:
/vis/open OGLSQt
The OpenGL driver added Smooth shading and Transparency since Geant4 release 8.0. Further information (OpenGL and Mesa): http://www.opengl.org/ http://www.mesa3d.org http://geant4.slac.stanford.edu/Presentations/vis/G4OpenGLTutorial/G4OpenGLTutorial.html OpenGL Graphics System
using
the
8.3.3. Qt
This driver has been developed by Laurent Garnier (IN2P3, LAL Orsay). It is an interface to the powerful application framework, Qt, now free on most platforms. This driver also requires the OpenGL library. The Qt driver is well suited for real-time fast visualization and demonstration. Fast visualization is realized with hardware acceleration, reuse of shapes stored in a display list, etc. NURBS visualization is also supported. All OpenGL features are implemented in the Qt driver, but one also gets mouse control of rotation/translation/zoom, the ability to save your scene in many formats (both vector and pixel graphics) and an easy interface for making movies. Two display modes are available: Immediate mode and Stored mode. The former has no limitation on data size, and the latter is fast for visualizing large data repetitively, and so is suitable for animation. This driver has the feature to open a vis window into the UI window as a new tab. You can have as many tabs you want and mix them from Stored or Immediate mode. To see the visualization window in the UI :
(Generic way. For Stored mode if you have define your G4VIS_USE_QT variable) (for Immediate mode) (for Stored mode) (for Immediate mode) (for Stored mode)
222
Visualization
8.3.4. OpenInventor
These drivers were developed by Jeff Kallenbach (FNAL) and Guy Barrand (IN2P3) based on the Hepvis class library originated by Joe Boudreau (Pittsburgh University). The OpenInventor drivers and the Hepvis class library are based on the well-established OpenInventor technology for scientific visualization. They have high extendibility. They support high interactivity, e.g., attribute e diting of picked objects. Some OpenInventor viewers support "stereoscopic" effects. It is also possible to save a visualized 3D scene as an OpenInventor-formatted file, and re-visualize the scene afterwards. Because it is connected directly to the Geant4 kernel, using same language as that kernel (C++), OpenInventor systems can have direct access to Geant4 data (geometry, trajectories, etc.). Because OpenInventor uses OpenGL for rendering, it supports lighting and transparency. OpenInventor provides thumbwheel control to rotate and zoom. OpenInventor supports picking to ask about data. [Control Clicking] on a volume turns on rendering of that volume's daughters. [Shift Clicking] a daughter turns that rendering off: If modeling opaque solid, effect is like opening a box to look inside. Further information (HEPVis and OpenScientist): Geant4 Inventor Visualization with OpenScientist http://openscientist.lal.in2p3.fr/v15r0/html/ osc_g4_vis_ui.html Overall OpenScientist Home http://openscientist.lal.in2p3.fr/v15r0/html/osc_g4_vis_ui.html HEPVis http://www-pat.fnal.gov/graphics/HEPVis/www Further information (OpenInventor): http://oss.sgi.com/projects/inventor Josie Wernecke, "The Inventor Mentor", Addison Wesley (ISBN 0-201-62495-8) Josie Wernecke, "The Inventor Toolmaker", Addison Wesley (ISBN 0-201-62493-1) "The Open Inventor C++ Reference Manual", Addison Wesley (ISBN 0-201-62491-5)
8.3.5. HepRepFile
The HepRepFile driver creates a HepRep XML file in the HepRep1 format suitable for viewing with the HepRApp HepRep Browser. The HepRep graphics format is further described at http://www.slac.stanford.edu/~perl/heprep . To write just the detector geometry to this file, use the command:
/vis/viewer/flush
Or, to also include trajectories and hits (after the appropriate /vis/viewer/add/trajectories or /vis/viewer/add/hits commands), just issue:
/run/beamOn 1
HepRepFile will write a file called G4Data0.heprep to the current directory. Each subsequent file will have a file name like G4Data1.heprep, G4Data2.heprep, etc. View the file using the HepRApp HepRep Browser, available from: http://www.slac.stanford.edu/~perl/HepRApp/ .
223
Visualization
HepRApp allows you to pick on volumes, trajectories and hits to find out their associated HepRep Attributes, such as volume name, particle ID, momentum, etc. These same attributes can be displayed as labels on the relevant objects, and you can make visibility cuts based on these attributes ("show me only the photons", or "omit any volumes made of iron"). HepRApp can read heprep files in zipped format as well as unzipped, so you can save space by applying gzip to the heprep file. This will reduce the file to about five percent of its original size. Several commands are available to override some of HepRepFile's defaults You can specify a different directory for the heprep output files by using the setFileDir command, as in:
/vis/heprep/setFileDir <someOtherDir/someOtherSubDir>
You can specify a different file name (the part before the number) by using the setFileName command, as in:
/vis/heprep/setFileName <my_file_name>
which will produce files named <my_file_name>0.heprep, <my_file_name>1.heprep, etc. You can specify that each file should overwrite the previous file (always rewriting to the same file name) by using the setOverwrite command, as in:
/vis/heprep/setOverwrite true
This may be useful in some automated applications where you always want to see the latest output file in the same location. Geant4 visualization supports a concept called "culling", by which certain parts of the detector can be made invisible. Since you may want to control visibility from the HepRep browser, turning on visibility of detector parts that had defaulted to be invisible, the HepRepFile driver does not omit these invisible detector parts from the HepRep file. But for very large files, if you know that you will never want to make these parts visible, you can choose to have them left entirely out of the file. Use the /vis/heprep/setCullInvisibles command, as in:
/vis/heprep/setCullInvisibles true
Further information: HepRApp Users Home Page: http://www.slac.stanford.edu/~perl/HepRApp/ . HepRep graphics format: http://www.slac.stanford.edu/~perl/heprep Geant4 Visualization Tutorial using the HepRApp HepRep Browser http://geant4.slac.stanford.edu/Presentations/vis/G4HepRAppTutorial/G4HepRAppTutorial.html
8.3.6. HepRepXML
The HepRepXML driver creates a HepRep file in the HepRep2 format suitable for viewing with the WIRED4 Plugin to the JAS3 Analysis System or the FRED event display. This driver can write both Binary HepRep (.bheprep) and XML HepRep (.heprep) files. Binary HepRep files are a one-to-one translation of XML HepRep files, but they are considerably shorter and faster to parse by a HepRepViewer such as WIRED 4. 224
Visualization
Both Binary HepRep and XML HepRep can be compressed using the standard zlib library if linked into Geant4 using G4LIB_USE_ZLIB. If a standard zlib is not available (WIN32-VC for instance) you should also set G4LIB_BUILD_ZLIB to build G4zlib included with Geant4. HepRep files (Binary and XML) can contain multiple HepRep events/geometries. If the file contains more than one HepRep it is not strictly XML anymore. Files can be written in .heprep.zip, .heprep.gz or .heprep format and their binary versions .bheprep.zip, .bheprep.gz or .bheprep. The .heprep.zip is the default for file output, the .heprep is the default for stdout and stderr. (Optional) To set the filename with a particular extension as: .heprep.zip, .heprep.gz, .heprep, .bheprep.zip, .bheprep.gz or .bheprep use for instance:
/vis/scene/create filename.bheprep.zip
such
(Optional) To create separate files for each event, you can set a suffix such as "-0001" to start writing files from filename-0001.bheprep.zip to filename-9999.bheprep.zip (or up), while "-55-sub" will start write files filename-55-sub.bheprep.zip to filename-99-sub.bheprep.zip (or up).
/vis/heprep/setEventNumberSuffix -0001
(Note: suffix has to contain at least one digit) (Optional) To route the HepRep XML output to stdout (or stderr), by default uncompressed, use:
/vis/scene/create stdout
Be aware that this may increase the size of the output dramatically. (Optional) You may use the commands:
/vis/viewer/zoom /vis/viewer/set/viewpointThetaPhi /vis/heprep/setCoordinateSystem uvw to set an initial zoom factor to set an initial view point to change the coordinate system, where uvw can be "xyz", "zxy", ...
(Optional) You may decide to write .zip files with events and geometry separated (but linked). This results in a smaller zip file, as the geometry is only written once. Use the command:
/vis/heprep/appendGeometry false
Limitations: Only one SceneHandler can exist at any time, connected to a single Viewer. Since the HepRep format is a model rather than a view this is not a real limitation. In WIRED 4 you can create as many views (SceneHandlers) as you like. Further information: WIRED4 Plugin to the JAS3 Analysis System
225
Visualization
8.3.7. DAWN
The DAWN drivers are interfaces to Fukui Renderer DAWN, which has been developed by Satoshi Tanaka, Minato Kawaguti et al (Fukui University). It is a vectorized 3D PostScript processor, and so well suited to prepare technical high quality outputs for presentation and/or documentation. It is also useful for precise debugging of detector geometry. Remote visualization, off-line re-visualization, cut view, and many other useful functions of detector simulation are supported. A DAWN process is automatically invoked as a co-process of Geant4 when visualization is performed, and 3D data are passed with inter-process communication, via a file, or the TCP/IP socket. When Geant4 Visualization is performed with the DAWN driver, the visualized view is automatically saved to a file named g4.eps in the current directory, which describes a vectorized (Encapsulated) PostScript data of the view. There are two kinds of DAWN drivers, the DAWNFILE driver and the DAWN-Network driver. The DAWNFILE driver is usually recommended, since it is faster and safer in the sense that it is not affected by network conditions. The DAWNFILE driver sends 3D data to DAWN via an intermediate file, named g4.prim in the current directory. The file g4.prim can be re-visualized later without the help of Geant4. This is done by invoking DAWN by hand:
% dawn g4.prim
DAWN files can also serve as input to two additional programs: A standalone program, DAWNCUT, can perform a planar cut on a DAWN image. DAWNCUT takes as input a .prim file and some cut parameters. Its output is a new .prim file to which the cut has been applied. Another standalone program, DAVID, can show you any volume overlap errors in your geometry. DAVID takes as input a .prim file and outputs a new .prim file in which overlapping volumes have been highlighted. The use of DAVID is described in section Section 4.1.11 of this manual. The DAWN-Network driver is almost the same as the DAWNFILE driver except that 3D data are passed to DAWN via the TCP/IP the socket (default) or the named pipe, and that, If you have not set up network configurations of your host machine, set the environment variable G4DAWN_NAMED_PIPE to "1", e.g., % setenv G4DAWN_NAMED_PIPE 1. This setting switches the default socket connection to the named-pipe connection within the same host machine. The DAWN-Network driver also saves the 3D data to the file g4.prim in the current directory.
226
Visualization
Local_Host> dawn -G
This invokes DAWN with the network connection mode. 2. Login to the remote host where a Geant4 executable is placed. 3. Set an environment variable on the remote host as follows:
For example, if you are working in the local host named "arkoop.kek.jp", set this environment variable as follows:
This tells a Geant4 process running on the remote host where Geant4 Visualization should be performed, i.e., where the visualized views should be displayed. 4. Invoke a Geant4 process and perform visualization with the DAWN-Network driver. For example:
In step 4, 3D scene data are sent from the remote host to the local host as DAWN-formatted data, and the local DAWN will visualize the data. The transferred data are saved as a file named g4.prim in the current directory of the local host. Further information: http://geant4.kek.jp/GEANT4/vis/DAWN/About_DAWN.html http://geant4.kek.jp/GEANT4/vis/DAWN/G4PRIM_FORMAT_24/ Further information: Fukui Renderer DAWN: http://geant4.kek.jp/GEANT4/vis/DAWN/About_DAWN.html The DAWNFILE driver: http://geant4.kek.jp/GEANT4/vis/GEANT4/DAWNFILE_driver.html The DAWN-Network driver: http://geant4.kek.jp/GEANT4/vis/GEANT4/DAWNNET_driver.html Environmental variables to customize DAWN and DAWN drivers: http://geant4.kek.jp/GEANT4/vis/DAWN/DAWN_ENV.html http://geant4.kek.jp/GEANT4/vis/GEANT4/g4vis_on_linux.html DAWN format (g4.prim format) manual: http://geant4.kek.jp/GEANT4/vis/DAWN/G4PRIM_FORMAT_24/ Geant4 Fukui University Group Home Page: http://geant4.kek.jp/GEANT4/vis/ DAWNCUT: http://geant4.kek.jp/GEANT4/vis/DAWN/About_DAWNCUT.html 227
Visualization
DAVID: http://geant4.kek.jp/GEANT4/vis/DAWN/About_DAVID.html Geant4 Visualization Tutorial using the DAWN Renderer: http://geant4.slac.stanford.edu/Presentations/vis/GDAWNTutorial/G4DAWNTutorial.html
8.3.9. VRML
These drivers were developed by Satoshi Tanaka and Yasuhide Sawada (Fukui University). They generate VRML files, which describe 3D scenes to be visualized with a proper VRML viewer, at either a local or a remote host. It realizes virtual-reality visualization with your WWW browser. There are many excellent VRML viewers, which enable one to perform interactive spinning of detectors, walking and/or flying inside detectors or particle showers, interactive investigation of detailed detector geometry etc. There are two kinds of VRML drivers: the VRMLFILE driver, and the VRML-Network driver. The VRMLFILE driver is usually recommended, since it is faster and safer in the sense that it is not affected by network conditions. The VRMLFILE driver sends 3D data to your VRML viewer, which is running on the same host machine as Geant4, via an intermediate file named g4.wrl created in the current directory. This file can be re-visualization afterwards. In visualization, the name of the VRML viewer should be specified by setting the environment variable G4VRML_VIEWER beforehand. For example,
% setenv G4VRML_VIEWER "netscape"
Its default value is NONE, which means that no viewer is invoked and only the file g4.wrl is generated.
Installation instructions for g4vrmlview can be found in the README file there, or on the WWW page below. The following steps realize remote Geant4 visualization displayed with your local VRML browser: 1. Invoke the g4vrmlview on your local host, giving a VRML viewer name as its argument:
Local_Host> java g4vrmlview VRML_viewer_name
For example, if you want to use the Netscape browser as your VRML viewer, execute g4vrmlview as follows:
Local_Host> java g4vrmlview netscape
228
Visualization
Of course, the command path to the VRML viewer should be properly set. 2. Log in to the remote host where a Geant4 executable is placed. 3. Set an environment variable on the remote host as follows:
Remote_Host> setenv G4VRML_HOST_NAME local_host_name
For example, if you are working on the local host named "arkoop.kek.jp", set this environment variable as follows:
Remote_Host> setenv G4VRML_HOST_NAME arkoop.kek.jp
This tells a Geant4 process running on the remote host where Geant4 Visualization should be performed, i.e., where the visualized views should be displayed. 4. Invoke a Geant4 process and perform visualization with the VRML-Network driver. For example:
Idle> /vis/open VRML2 Idle> /vis/drawVolume Idle> /vis/viewer/update
In step 4, 3D scene data are sent from the remote host to the local host as VRML-formatted data, and the VRML viewer specified in step 3 is invoked by the g4vrmlview process to visualize the VRML data. The transferred VRML data are saved as a file named g4.wrl in the current directory of the local host. Further information: http://geant4.kek.jp/GEANT4/vis/GEANT4/VRML_net_driver.html Further information (VRML drivers): http://geant4.kek.jp/GEANT4/vis/GEANT4/VRML_file_driver.html http://geant4.kek.jp/GEANT4/vis/GEANT4/VRML_net_driver.html Sample VRML files: http://geant4.kek.jp/GEANT4/vis/GEANT4/VRML2_FIG/ Further information (VRML language and browsers): http://www.vrmlsite.com/
8.3.10. RayTracer
This driver was developed by Makoto Asai and Minamimoto (Hirosihma Instutute of Technology). It performs ray-tracing visualization using the tracking routines of Geant4. It is, therefore, available for every kinds of shapes/ solids which Geant4 can handle. It is also utilized for debugging the user's geometry for the tracking routines of Geant4. It is well suited for photo-realistic high quality output for presentation, and for intuitive debugging of detector geometry. It produces a JPEG file. This driver is by default listed in the available visualization drivers of user's application. Some pieces of geometries may fail to show up in other visualization drivers (due to algorithms those drivers use to compute visualizable shapes and polygons), but RayTracer can handle any geometry that the Geant4 navigator can handle. Because RayTracer in essence takes over Geant4's tracking routines for its own use, RayTracer cannot be used to visualize Trajectories or hits. 229
Visualization
An X-Window version, called RayTracerX, can be selected by setting G4VIS_BUILD_RATRACERX_DRIVER at Geant4 library build time and G4VIS_USE_RAYTRACERX at application (user code) build time (assuming you use the standard visualization manager, G4VisExecutive, or an equally smart vis manager). RayTracerX builds the same jpeg file as RayTracer, but simultaneously renders to screen so you can watch as rendering grows progressively smoother. RayTracer has its own built-in commands - /vis/rayTracer/.... Alternatively, you can treat it as a normal vis system and use /vis/viewer/... commands, e.g:
The view parameters are translated into the necessary RayTracer parameters. RayTracer is compute intensive. If you are unsure of a good viewing angle or zoom factor, you might be advised to choose them with a faster renderer, such as OpenGL, and transfer the view parameters with /vis/viewer/ set/all:
/vis/open OGL /vis/drawVolume /vis/viewer/zoom # plus any /vis/viewer/commands that get you the view you want. /vis/open RayTracerX /vis/viewer/set/all viewer-0 /vis/viewer/refresh
8.3.11. gMocren
The gMocrenFile driver creates a gdd file suitable for viewing with the gMocren volume visualizer. gMocren, a sophisticated tool for rendering volume data, can show volume data such as Geant4 dose distrubutions overlaid with scoring grids, trajectories and detector geometry. gMocren provides additional advanced functionality such as transfer functions, colormap editing, image rotation, image scaling, and image clipping. gMocren is further described at http://geant4.kek.jp/gMocren/ . At this link you will find the gMocren download, the user manual, a tutorial and some example gdd data files. Please note that the gMocren file driver is currently considered a Beta release. Users are encouraged to try this driver, and feedback is welcome, but users should be aware that features of this driver may change in upcoming releases. To send volume data from Geant4 scoring to a gMocren file, the user needs to tell the gMocren driver the name of the specific scoring volume that is to be displayed. For scoring done in C++, this is the name of the sensitive volume. For command-based scoring, this is the name of the scoring mesh.
/vis/gMocren/setVolumeName <volume_name>
The following is an example of the minimum command sequence to send command-based scoring data to the a gMocren file:
# an example of a command-based scoring definition /score/create/boxMesh scoringMesh # name of the scoring mesh /score/mesh/boxSize 10. 10. 10. cm # dimension of the scoring mesh /score/mesh/nBin 10 10 10 # number of divisions of the scoring mesh /score/quantity/energyDeposit eDep # quantity to be scored /score/close # configuration of the gMocren-file driver /vis/scene/create /vis/open gMocrenFile /vis/gMocren/setVolumeName scoringMesh
230
Visualization
/vis/viewer/flush
gMocrenFile will write a file named G4_00.gd to the current directory. Subsequent draws will create files named g4_01.gdd, g4_02.gdd, etc. An alternate output directory can be specified with an environment variable:
export G4GMocrenFile_DEST_DIR=<someOtherDir/someOtherSubDir/>
View the resuling gMocren files with the gMocren viewer, available from: http://geant4.kek.jp/gMocren/ .
/vis/ASCIITree/Verbose 4 /vis/viewer/flush "HadCalorimeterPhysical":0 / "HadCalorimeterLogical" / "HadCalorimeterBox"(G4Box), 1.8 m3 , 11.35 g/cm3 "HadCalColumnPhysical":-1 (10 replicas) / "HadCalColumnLogical" / "HadCalColumnBox"(G4Box), 180000 cm3, 11.35 g/cm3 "HadCalCellPhysical":-1 (2 replicas) / "HadCalCellLogical" / "HadCalCellBox"(G4Box), 90000 cm3, 11.35 g/cm3 "HadCalLayerPhysical":-1 (20 replicas) / "HadCalLayerLogical" / "HadCalLayerBox"(G4Box), 4500 cm3, 11.35 g/cm3 "HadCalScintiPhysical":0 / "HadCalScintiLogical" / "HadCalScintiBox"(G4Box), 900 cm3, 1.032 g/cm3 Calculating mass(es)... Overall volume of "worldPhysical":0, is 2400 m3 Mass of tree to unlimited depth is 22260.5 kg
Idle> /vis/ASCIITree/verbose 1 Idle> /vis/drawTree # Set verbosity with "/vis/ASCIITree/verbose # < 10: - does not print daughters of repeated placements, does not repeat replicas. # >= 10: prints all physical volumes. # The level of detail is given by verbosity%10: # for each volume: # >= 0: physical volume name. # >= 1: logical volume name (and names of sensitive detector and readout geometry, if any). # >= 2: solid name and type.
231
Visualization
# >= 3: volume and density. # >= 5: daughter-subtracted volume and mass. # and in the summary at the end of printing: # >= 4: daughter-included mass of top physical volume(s) in scene to depth specified. ..... "Calorimeter", copy no. 0, belongs to logical volume "Calorimeter" "Layer", copy no. -1, belongs to logical volume "Layer" (10 replicas) "Absorber", copy no. 0, belongs to logical volume "Absorber" "Gap", copy no. 0, belongs to logical volume "Gap" ..... Idle> /vis/ASCIITree/verbose 15 Idle> /vis/drawTree .... "tube_phys":0 / "tube_L" / "tube"(G4Tubs), 395841 cm3, 1.782 mg/cm3, 9.6539e-08 mm3, 1.72032e-10 mg "divided_tube_phys":0 / "divided_tube_L" / "divided_tube"(G4Tubs), 65973.4 cm3, 1.782 mg/cm3, 7587.54 cm3, 13.521 g "divided_tube_inset_phys":0 / "divided_tube_inset_L" / "divided_tube_inset"(G4Tubs), 58385.9 cm3, 1.782 mg/cm3, 6.03369e-09 mm3, 1.0752e-11 mg "sub_divided_tube_phys":0 / "sub_divided_tube_L" / "sub_divided_tube"(G4Tubs), 14596.5 cm3, 1.782 mg/cm3, 12196.5 cm3, 21.7341 g ..... Calculating mass(es)... Overall volume of "expHall_P":0, is 8000 m3 and the daughter-included mass to unlimited depth is 78414 kg .....
For the complete list of commands and options, see the Control...UICommands section of this user guide.
232
Visualization
Searching a string:
233
Visualization
These seven steps can be controlled explicitly to create multiple scenes and multiple viewers, each with its own set of parameters, with easy switching from one scene to another. But for the most common case of just having one scene and one viewer, many steps are handled implicitly for you.
or
234
Visualization
For additional options, see the Control...UICommands section of this user guide.
Argument A physical-volume name. The default value is "world", which is omittable. Action Creates a scene consisting of the given physical volume and asks the current viewer to draw it. The scene becomes current. Command "/vis/viewer/flush" should follow this command in order to declare end of visualization. Example: Visualization of the whole world with coordinate axes
Visualization
Command: /vis/specify [logical-volume-name][depth-of-descent] flag] [voxels-flag] [readout-flag] Argument A logical-volume name. Action
[booleans-
Creates a scene consisting of the given logical volume and asks the current viewer to draw it. The scene becomes current. Example (visualization of a selected logical volume with coordinate axes)
For more options, see the Control...UICommands section of this user guide.
Additional note 1 See the section Section 8.7.3 Enhanced Trajectory Drawing for details on how to control how trajectories are color-coded. Additional note 2 Events may be kept and reviewed at end of run with
Idle> /vis/reviewKeptEvents
Visualization
For more options, see the Control...UICommands section of this user guide.
You can add additional attributes of your choosing by modifying the relevant part of the hit class (look for the methods GetAttDefs and CreateAttValues).
237
Visualization
for each viewer. They can be initialized to the default values with command "/vis/viewer/reset". Some visualization systems, such as the VRML and HepRep browsers also allow camera control from the standalone graphics application. Just a few of the camera commands are described here. For more commands, see the Control...UICommands section of this user guide. Command: /vis/viewer/set/viewpointThetaPhi [theta] [phi] [deg|rad] Arguments Arguments "theta" and "phi" are polar and azimuthal camera angles, respectively. The default unit is "degree". Action Set a view point in direction of (theta, phi). Example: Set the viewpoint in direction of (70 deg, 20 deg) /
Idle> /vis/viewer/set/viewpointThetaPhi 70 20
Additional notes Camera parameters should be set for each viewer. They are initialized with command "/vis/viewer/ reset". Command: /vis/viewer/zoom [scale_factor] Argument The scale factor. The command multiplies magnification of the view by this factor. Action Zoom up/down of view. Example: Zoom up by factor 1.5
Idle> /vis/viewer/zoom 1.5
Additional notes Camera parameters should be set for each viewer. They are initialized with command "/vis/viewer/ reset". A similar pair of commands, scale and scaleTo allow non-uniform scaling (i.e., zoom differently along different axes). For details, see the Control...UICommands section of this user guide. Command: /vis/viewer/set/style [style_name] Arguments Candidate values of the argument are "wireframe" and "surface". ("w" and "s" also work.) Action Set a drawing style to wireframe or surface. Example: Set the drawing style to "surface"
Idle> /vis/viewer/set/style surface
Additional notes The style of some geometry components may have been forced one way or the other through calls in compiled code. The set/style command will NOT override such force styles. 238
Visualization
Drawing style should be set for each viewer. The drawing style is initialized with command "/vis/viewer/ reset".
8.4.11. Declare the end of visualization for flushing: /vis/ viewer/flush command
Command: /vis/viewer/flush Action Declare the end of visualization for flushing. Additional notes Command "/vis/viewer/flush" should follow "/vis/drawVolume", "/vis/specify", etc in order to complete visualization. It corresponds to Step 7. The flush is done automatically after every /run/beamOn command unless you have non-default values for /vis/ scene/endOfEventAction or /vis/scene/endOfRunAction (described above).
8.4.12. End of Event Action and End of Run Action: / vis/viewer/endOfEventAction and /vis/viewer/ endOfRunAction commands
By default, a separate picture is created for each event. You can change this behavior to accumulate multiple events, or even multiple runs, in a single picture. Command: /vis/scene/endOfEventAction [refresh|accumulate] Action Control how often the picture should be cleared. refresh means each event will be written to a new picture. accumulate means events will be accumulated into a single picture. Picture will be flushed at end of run, unless you have also set /vis/scene/endOfRunAction accumulate Additional note You may instead choose to use update commands from your BeginOfRunAction or EndOfEventAction, as in early examples, but now the vis manager ia able to do most of what most users require through the above commands. Command: /vis/scene/endOfRunAction [refresh|accumulate] Action Control how often the picture should be cleared. refresh means each run will be written to a new picture. accumulate means runs will be accumulated into a single picture. To start a new picture, you must explicitly issue /vis/viewer/refresh, /vis/viewer/update or /vis/viewer/flush
239
Visualization
Particle Name Charge PDG Encoding Momentum 3-Vector Momentum magnitude Number of points
Using /vis/scene/add/trajectories rich will get you additional attributes. You may also add additional attributes of your choosing by modifying the relevant part of G4Trajectory (look for the methods GetAttDefs and CreateAttValues). If you are using your own trajectory class, you may want to consider copying these methods from G4Trajectory.
This is a good example to show that the visualization drivers are complementary to each other. OpenInventor In the OpenInventor drivers, you can simply click the "Print" button on their GUI to generate a PostScript file as a hard copy of a visualized view. OpenGL The OpenGL drivers can also generate PostScript files, either from a pull-down menu (Motif and Qt drivers) or with /vis/ogl/printEPS. It can generate either vector or bitmap PostScript data with /vis/ogl/set/ printMode ("vectored" or "pixmap"). You can change the filename by /vis/ogl/set/printMode And the print size by /vis/ogl/set/printSize In generating vectorized PostScript data, hidden-surface removal is performed based on the painter's algorithm after dividing facets of shapes into small sub-triangles. 240
Visualization
Note that a fundamental limitation of the gl2ps library used for this PostScript printing causes the /vis/ viewer/set/hiddenMarker command to be ignored. Trajectories will always be fully drawn in the printEPS output even when the hiddenMarker hidden line removal option has been set to hide these trajectories in the corresponding OpenGL view. The /vis/ogl/set/printSize command can be used to print EPS files even larger than the current screen resolution. This can allow creation of very large images, suitable for creation of posters, etc. The only size limitation is the graphics card's viewport dimension: GL_MAX_VIEWPORT_DIMS
# Invoke the OpenGL visualization driver in its stored mode /vis/open OGLSX # Camera setting /vis/viewer/set/viewpointThetaPhi 20 20 # Camera setting /vis/drawVolume /vis/viewer/flush # set print mode to vectored /vis/ogl/set/printMode vectored # set print size larger than screen /vis/ogl/set/printSize 2000 2000 # print /vis/ogl/printEPS
HepRep The HepRApp HepRep Browser and WIRED4 JAS Plug-In can generate a wide variety of bitmap and vector output formats including PostScript and PDF.
8.4.15. Culling
"Culling" means to skip visualizing parts of a 3D scene. Culling is useful for avoiding complexity of visualized views, keeping transparent features of the 3D scene, and for quick visualization. Geant4 Visualization supports the following 3 kinds of culling: Culling of invisible physical volumes Culling of low density physical volumes. Culling of covered physical volumes by others In order that one or all types of the above culling are on, i.e., activated, the global culling flag should also be on. Table 8.2 summarizes the default culling policies. Culling Type global invisible low density covered daughter Default Value ON ON OFF OFF
241
Visualization
global
flag
invisible
flag
# low density # "value" is a proper value of a treshold density # "unit" is either g/cm3, mg/cm3 or kg/m3 /vis/viewer/set/culling density flag value unit # covered daughter /vis/viewer/set/culling
coveredDaughters
flag
density
The HepRepFile graphic system will, by default, include culled objects in the file so that they can still be made visible later from controls in the HepRep browser. If this behavior would cause files to be too large, you can instead choose to have culled objects be omitted from the HepRep file. See details in the HepRepFile Driver section of this user guide.
where the vector (x,y,z) defines a point on the sectioning plane, and the vector (nx,ny,nz) defines the normal vector of the sectioning plane. For example, the following sets a sectioning plane to a yz plane at x = 2 cm:
Idle> /vis/viewer/set/sectionPlane on 2.0 0.0 0.0 cm 1.0 0.0 0.0
Cutting away
"Cutting away" means to remove a half space, defined with a plane, from a 3D scene. Cutting away is supported by the DAWNFILE driver "off-line". Do the following: Perform visualization with the DAWNFILE driver to generate a file g4.prim, describing the whole 3D scene. Make the application "DAWNCUT" read the generated file to make a view of cutting away. See the following WWW page for details: http://geant4.kek.jp/GEANT4/vis/DAWN/About_DAWNCUT.html Alternatively, add up to three cutaway planes:
/vis/viewer/addCutawayPlane 0 0 0 m 1 0 0 /vis/viewer/addCutawayPlane 0 0 0 m 0 1 0 ...
and, for more that one plane, you can change the mode to (a) "add" or, equivalently, "union" (default) or (b) "multiply" or, equivalently, "intersection":
/vis/viewer/set/cutawayMode multiply
To de-activate:
/vis/viewer/clearCutawayPlanes
242
Visualization
8.5.1. G4VVisManager
The Visualization Manager is implemented by classes G4VisManager and G4VisExecutive. See Section 8.2 "Making a Visualization Executable". In order that your Geant4 be compilable either with or without the visualization category, you should not use these classes directly in your C++ source code, other than in the main() function. Instead, you should use their abstract base class G4VVisManager, defined in the intercoms category. The pointer to the concrete instance of the real Visualization Manager can be obtained as follows:
//----- Getting a pointer to the concrete Visualization Manager instance G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance();
The method G4VVisManager::GetConcreteInstance() returns NULL if Geant4 is not ready for visualization. Thus your C++ source code should be protected as follows:
//----- How to protect your C++ source codes in visualization if (pVVisManager) { .... pVVisManager ->Draw (...); .... }
In the above, you should also describe /vis/open command somewhere in your C++ codes or execute the command from (G)UI at the executing stage.
243
Visualization
//----- A drawing method of G4Polyline virtual void G4VVisManager::Draw (const G4Polyline&, ...) ;
The real implementation of this method is described in the class G4VisManager. At the end of one event, a set of trajectories can be stored as a list of G4Trajectory objects. Therefore you can visualize trajectories, for example, at the end of each event, by implementing the method MyEventAction::EndOfEventAction() as follows:
//----- C++ source codes void ExN03EventAction::EndOfEventAction(const G4Event* evt) { ..... // extract the trajectories and draw them if (G4VVisManager::GetConcreteInstance()) { G4TrajectoryContainer* trajectoryContainer = evt->GetTrajectoryContainer(); G4int n_trajectories = 0; if (trajectoryContainer) n_trajectories = trajectoryContainer->entries(); for (G4int i=0; i < n_trajectories; i++) { G4Trajectory* trj=(G4Trajectory*)((*(evt->GetTrajectoryContainer()))[i]); if (drawFlag == "all") trj->DrawTrajectory(50); else if ((drawFlag == "charged")&&(trj->GetCharge() != 0.)) trj->DrawTrajectory(50); else if ((drawFlag == "neutral")&&(trj->GetCharge() == 0.)) trj->DrawTrajectory(50); } } } //----- end of C++ source codes
You can add additional attributes of your choosing by modifying the relevant part of G4Trajectory (look for the methods GetAttDefs and CreateAttValues). If you are using your own trajectory class, you may want to consider copying these methods from G4Trajectory.
244
Visualization
digits+hits category. You can overload these methods, using the following drawing methods of class G4VVisManager, in order to visualize hits:
//----- Drawing methods of G4Square and G4Circle virtual void G4VVisManager::Draw (const G4Circle&, ...) ; virtual void G4VVisManager::Draw (const G4Square&, ...) ;
The real implementations of these Draw() methods are described in class G4VisManager. The overloaded implementation of G4VHits::Draw() will be held by, for example, class MyTrackerHits inheriting G4VHit as follows:
//----- C++ source codes: An example of giving concrete implementation of // G4VHit::Draw(), using class MyTrackerHit : public G4VHit {...} // void MyTrackerHit::Draw() { G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); if(pVVisManager) { // define a circle in a 3D space G4Circle circle(pos); circle.SetScreenSize(0.3); circle.SetFillStyle(G4Circle::filled); // make the circle red G4Colour colour(1.,0.,0.); G4VisAttributes attribs(colour); circle.SetVisAttributes(attribs); // make a 3D data for visualization pVVisManager->Draw(circle); } } //----- end of C++ source codes
The overloaded implementation of G4VHitsCollection::DrawAllHits() will be held by, for example, class MyTrackerHitsCollection inheriting class G4VHitsCollection as follows:
//----- C++ source codes: An example of giving concrete implementation of // G4VHitsCollection::Draw(), // using class MyTrackerHit : public G4VHitsCollection{...} // void MyTrackerHitsCollection::DrawAllHits() { G4int n_hit = theCollection.entries(); for(G4int i=0;i < n_hit;i++) { theCollection[i].Draw(); } } //----- end of C++ source codes
Thus, you can visualize hits as well as trajectories, for example, at the end of each event by implementing the method MyEventAction::EndOfEventAction() as follows:
void MyEventAction::EndOfEventAction() { const G4Event* evt = fpEventManager->GetConstCurrentEvent(); G4SDManager * SDman = G4SDManager::GetSDMpointer(); G4String colNam; G4int trackerCollID = SDman->GetCollectionID(colNam="TrackerCollection"); G4int calorimeterCollID = SDman->GetCollectionID(colNam="CalCollection"); G4TrajectoryContainer * trajectoryContainer = evt->GetTrajectoryContainer();
245
Visualization
G4int n_trajectories = 0; if(trajectoryContainer) { n_trajectories = trajectoryContainer->entries(); } G4HCofThisEvent * HCE = evt->GetHCofThisEvent(); G4int n_hitCollection = 0; if(HCE) { n_hitCollection = HCE->GetCapacity(); } G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); if(pVVisManager) { // Declare begininng of visualization G4UImanager::GetUIpointer()->ApplyCommand("/vis/scene/notifyHandlers"); // Draw trajectories for(G4int i=0; i < n_trajectories; i++) { (*(evt->GetTrajectoryContainer()))[i]->DrawTrajectory(); } // Construct 3D data for hits MyTrackerHitsCollection* THC = (MyTrackerHitsCollection*)(HCE->GetHC(trackerCollID)); if(THC) THC->DrawAllHits(); MyCalorimeterHitsCollection* CHC = (MyCalorimeterHitsCollection*)(HCE->GetHC(calorimeterCollID)); if(CHC) CHC->DrawAllHits(); // Declare end of visualization G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/update"); } } //----- end of C++ codes
You can re-visualize a physical volume, where a hit is detected, with a highlight color, in addition to the whole set of detector components. It is done by calling a drawing method of a physical volume directly. The method is:
//----- Drawing methods of a physical volume virtual void Draw (const G4VPhysicalVolume&, ...) ;
This method is, for example, called in a method MyXXXHit::Draw(), describing the visualization of hits with markers. The following is an example for this:
//----- C++ source codes: An example of visualizing hits with void MyCalorimeterHit::Draw() { G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); if(pVVisManager) { G4Transform3D trans(rot,pos); G4VisAttributes attribs; G4LogicalVolume* logVol = pPhys->GetLogicalVolume(); const G4VisAttributes* pVA = logVol->GetVisAttributes(); if(pVA) attribs = *pVA; G4Colour colour(1.,0.,0.); attribs.SetColour(colour); attribs.SetForceSolid(true); //----- Re-visualization of a selected physical volume with red color pVVisManager->Draw(*pPhys,attribs,trans); } } //----- end of C++ codes
246
Visualization
You can add additional attributes of your choosing by modifying the relevant part of the hit class (look for the methods GetAttDefs and CreateAttValues).
The real implementation of this method is described in class G4VisManager. Using this method, C++ source codes to visualize G4Polyline are described as follows:
//----- C++ source code: How to visualize a polyline G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); if (pVVisManager) { G4Polyline polyline ; ..... (C++ source codes to set vertex positions, color, etc) pVVisManager -> Draw(polyline); } //----- end of C++ source codes
247
Visualization
Tracking steps are able to be visualized based on the above visualization of G4Polyline. You can visualize tracking steps at each step automatically by writing a proper implementation of class MySteppingAction inheriting G4UserSteppingAction, and also with the help of the Run Manager. First, you must implement a method, MySteppingAction::UserSteppingAction(). A typical implementation of this method is as follows:
//----- C++ source code: An example of visualizing tracking steps void MySteppingAction::UserSteppingAction() { G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); if (pVVisManager) { //----- Get the Stepping Manager const G4SteppingManager* pSM = GetSteppingManager(); //----- Define a line segment G4Polyline polyline; G4double charge = pSM->GetTrack()->GetDefinition()->GetPDGCharge(); G4Colour colour; if (charge < 0.) colour = G4Colour(1., 0., 0.); else if (charge < 0.) colour = G4Colour(0., 0., 1.); else colour = G4Colour(0., 1., 0.); G4VisAttributes attribs(colour); polyline.SetVisAttributes(attribs); polyline.push_back(pSM->GetStep()->GetPreStepPoint()->GetPosition()); polyline.push_back(pSM->GetStep()->GetPostStepPoint()->GetPosition()); //----- Call a drawing method for G4Polyline pVVisManager -> Draw(polyline); } } //----- end of C++ source code
Next, in order that the above C++ source code works, you have to pass the information of the MySteppingAction to the Run Manager in the main() function:
//----- C++ source code: Passing what to do at each step to the Run Manager int main() { ... // Run Manager G4RunManager * runManager = new G4RunManager; // User initialization classes ... runManager->SetUserAction(new MySteppingAction); ... } //----- end of C++ source code
Thus you can visualize tracking steps with various visualization attributes, e.g., color, at each step, automatically. As well as tracking steps, you can visualize any kind 3D object made of line segments, using class G4Polyline and its drawing method, defined in class G4VVisManager. See, for example, the implementation of the /vis/ scene/add/axes command.
248
Visualization
// Same, but explicit polyhedron... G4Polyhedron* pA = G4Box("boxA",3*m,3*m,3*m).CreatePolyhedron(); G4Polyhedron* pB = G4Box("boxB",1*m,1*m,1*m).CreatePolyhedron(); pB->Transform(G4Translate3D(3*m,3*m,3*m)); G4Polyhedron* pSubtracted = new G4Polyhedron(pA->subtract(*pB)); G4VisAttributes subVisAtts(G4Colour(0,1,1)); pSubtracted->SetVisAttributes(&subVisAtts); pVisManager->Draw(*pSubtracted,G4Translate3D(6*m,6*m,6*m)); delete pA; delete pB; delete pSubtracted;
If efficiency is an issue, create the objects in the constructor, delete them in the destructor and draw them in your Draw method. Anyway, an instance of your class needs to be registered with the vis manager, e.g.:
... G4VisManager* visManager = new G4VisExecutive; visManager->Initialize (); visManager->SetUserAction (new StandaloneVisAction, G4VisExtent(-5*m,5*m,-5*m,5*m,-5*m,5*m)); ...
The extent can be added on registration or on the command line or neither (if the extent of the scene is set by other components). Your Draw method will be called whenever needed to refresh the screen or rebuild a graphics database, for any chosen viewer. The scene can be attached to any scene handler and your drawing will be shown.
249
Visualization
#include "StandaloneVisAction.hh" int main() { G4VisManager* visManager = new G4VisExecutive; visManager->Initialize (); visManager->SetUserAction (new StandaloneVisAction, G4VisExtent(-5*m,5*m,-5*m,5*m,-5*m,5*m));
G4UImanager* UI = G4UImanager::GetUIpointer (); UI->ApplyCommand ("/control/execute standalone.g4m"); G4UIsession* session = new G4UIterminal(new G4UItcsh); session->SessionStart(); delete session; delete visManager; }
8.6.1. Visibility
Visibility is a boolean flag to control the visibility of objects that are passed to the Visualization Manager for visualization. Visibility is set with the following access function:
void G4VisAttributes::SetVisibility (G4bool visibility);
If you give false to the argument, and if culling is activated (see below), visualization is skipped for objects for which this set of visualization attributes is assigned. The default value of visibility is true. Note that whether an object is visible or not is also affected by the current culling policy, which can be tuned with visualization commands. By default the following public static function is defined:
static const G4VisAttributes& GetInvisible();
which returns a reference to a const object in which visibility is set to false. It can be used as follows:
250
Visualization
Direct access to the public static const data member G4VisAttributes::Invisible is also possible but deprecated on account of initialisation issues with dynamic libraries.
8.6.2. Colour
8.6.2.1. Construction
Class G4Colour (an equivalent class name, G4Color, is also available) has 4 fields, which represent the RGBA (red, green, blue, and alpha) components of colour. Each component takes a value between 0 and 1. If an irrelevant value, i.e., a value less than 0 or greater than 1, is given as an argument of the constructor, such a value is automatically clipped to 0 or 1. Alpha is opacity, which is not used at present. You can use its default value 1, which means "opaque" in instantiation of G4Colour. A G4Colour object is instantiated by giving red, green, and blue components to its constructor, i.e.,
G4Colour::G4Colour ( G4double G4double G4double G4double r g b a // = 1.0, = 1.0, = 1.0, = 1.0); 0<=red, green, blue <= 1.0
The default value of each component is 1.0. That is to say, the default colour is "white" (opaque). For example, colours which are often used can be instantiated as follows:
G4Colour G4Colour G4Colour G4Colour G4Colour G4Colour G4Colour G4Colour G4Colour G4Colour white white gray black red green blue cyan magenta yellow () (1.0, (0.5, (0.0, (1.0, (0.0, (0.0, (0.0, (1.0, (1.0, ; ; ; ; ; ; ; ; ; ; // // // // // // // // // // white white gray black red green blue cyan magenta yellow
It is also possible to instantiate common colours through static public data member functions:
static static static static static static static static static static const const const const const const const const const const G4Colour& G4Colour& G4Colour& G4Colour& G4Colour& G4Colour& G4Colour& G4Colour& G4Colour& G4Colour& White Gray Grey Black Red Green Blue Cyan Magenta Yellow (); (); (); (); (); (); (); (); (); ();
After instantiation of a G4Colour object, you can access to its components with the following access functions:
G4double G4Colour::GetRed () const ; // Get the red component. G4double G4Colour::GetGreen () const ; // Get the green component. G4double G4Colour::GetBlue () const ; // Get the blue component.
251
Visualization
G4String G4Colour --------------------------------------white G4Colour::White () gray G4Colour::Gray () grey G4Colour::Grey () black G4Colour::Black () red G4Colour::Red () green G4Colour::Green () blue G4Colour::Blue () cyan G4Colour::Cyan () magenta G4Colour::Magenta () yellow G4Colour::Yellow ()
For example:
G4Colour myColour(G4Colour::Black()); if (G4Colour::GetColour("red", myColour)) { // Successfully retrieved colour "red". myColour is now red } else { // Colour did not exist in map. myColour is still black }
If the key is not registered in the colour map, a warning message is printed and the input colour is not changed. The colour map is case insensitive. It is also possible to load user defined G4Colour's into the map through the public AddToMap method. For example:
G4Colour myColour(0.2, 0.2, 0.2, 1); G4Colour::AddToMap("custom", myColour);
This loads a user defined G4Colour with key "custom" into the colour map.
, , , = 1.0); , , , = 1.);
252
Visualization
Note that colour assigned to a G4VisAttributes object is not always the colour that ultimately appears in the visualization. The ultimate appearance may be affected by shading and lighting models applied in the selected visualization driver or stand-alone graphics system.
If you give true as the argument, objects for which this set of visualization attributes is assigned are always visualized in wireframe even if in general, the surface drawing style has been requested. The default value of the forced wireframe style is false. Similarly, forced solid style, i.e., to force that objects are always visualized with surfaces, is set with:
void G4VisAttributes::SetForceSolid (G4bool force);
The default value of the forced solid style is false, too. You can also force auxiliary edges to be visible. Normally they are not visible unless you set the appropriate view parameter. Forcing the auxiliary edges to be visible means that auxiliary edges will be seen whatever the view parameters. Auxiliary edges are not genuine edges of the volume. They may be in a curved surface made out of polygons, for example, or in plane surface of complicated shape that has to be broken down into simpler polygons. HepPolyhedron breaks all surfaces into triangles or quadrilaterals. There will be auxiliary edges for any volumes with a curved surface, such as a tube or a sphere, or a volume resulting from a Boolean operation. Normally, they are not shown, but sometimes it is useful to see them. In particular, a sphere, because it has no egdes, will not be seen in wireframe mode in some graphics systems unless requested by the view parameters or forced, as described here. To force auxiliary edges to be visible, use:
void G4VisAttributes::SetForceAuxEdgeVisible (G4bool force);
The default value of the force auxiliary edges visible flag is false. For volumes with edges that are parts of a circle, such as a tube (G4Tubs), etc., it is possible to force the precision of polyhedral representation for visualisation. This is recommended for volumes containing only a small angle of circle, for example, a thin tube segment. For visualisation, a circle is represented by an N-sided polygon. The default is 24 sides or segments. The user may change this for all volumes in a particular viewer at run time with /vis/viewer/set/lineSegmentsPerCircle; alternatively it can be forced for a particular volume with:
void G4VisAttributes::SetForceLineSegmentsPerCircle (G4int nSegments);
253
Visualization
(G4bool); (G4bool); (const G4Colour&); (const G4Color&); (G4double red, G4double green, G4double blue, G4double alpha = 1.); void SetColor (G4double red, G4double green, G4double blue, G4double alpha = 1.); void SetLineStyle (LineStyle); void SetLineWidth (G4double); void SetForceWireframe (G4bool); void SetForceSolid (G4bool); void SetForceAuxEdgeVisible (G4bool); void SetForceLineSegmentsPerCircle (G4int nSegments); // Allows choice of circle approximation. A circle of 360 degrees // will be composed of nSegments line segments. If your solid has // curves of D degrees that you need to divide into N segments, // specify nSegments = N * 360 / D. void SetStartTime (G4double); void SetEndTime (G4double); void SetAttValues (const std::vector<G4AttValue>*); void SetAttDefs (const std::map<G4String,G4AttDef>*);
The following is sample C++ source codes for assigning a set of visualization attributes with cyan colour and forced wireframe style to a logical volume:
//----- C++ source codes: Assigning G4VisAttributes to a logical volume ... // Instantiation of a logical volume myTargetLog = new G4LogicalVolume( myTargetTube,BGO, "TLog", 0, 0, 0); ... // Instantiation of a set of visualization attributes with cyan colour G4VisAttributes * calTubeVisAtt = new G4VisAttributes(G4Colour(0.,1.,1.)); // Set the forced wireframe style calTubeVisAtt->SetForceWireframe(true); // Assignment of the visualization attributes to the logical volume myTargetLog->SetVisAttributes(calTubeVisAtt); //----- end of C++ source codes
254
Visualization
Note that the life of the visualization attributes must be at least as long as the objects to which they are assigned; it is the users' responsibility to ensure this, and to delete the visualization attributes when they are no longer needed (or just leave them to die at the end of the job).
See geant4/source/tracking/src/G4Trajectory.cc for a good example. G4AttValue objects are light, containing just the value; for the long description and other sharable information the G4AttValue object refers to a G4AttDef object. They are based on the HepRep standard described at http:// www.slac.stanford.edu/~perl/heprep/ . Geant4 also provides an G4AttDefStore. Geant4 provides some default examples of the use of this facility in the trajectory classes in /source/tracking such as G4Trajectory, G4SmoothTrajectory. G4Trajectory::CreateAttValues shows how G4AttValue objects can be made and G4Trajectory::GetAttDefs shows how to make the corresponding G4AttDef objects and use the G4AttDefStore. Note that the "user" of CreateAttValues guarantees to destroy them; this is a way of allowing creation on demand and leaving the G4Trajectory object, for example, free of such objects in memory. The comments in G4VTrajectory.hh explain further and additional insights might be obtained by looking at two methods which use them, namely G4VTrajectory::DrawTrajectory and G4VTrajectory::ShowTrajectory. Hits classes in examples /extended/analysis/A01 and /extended/runAndEvent/RE01 show how to do the same for your hits. The base class no-action methods CreateAttValues and GetAttDefs should be overridden in your concrete class. The comments in G4VHit.hh explain further. In addition, the user is free to add a G4std::vector<G4AttValue>* and a G4std::vector<G4AttDef>* to a G4VisAttributes object as could, for example, be used by a G4LogicalVolume object. At the time of writing, only the HepRep graphics systems are capable of displaying the G4AttValue information, but this information will become useful for all Geant4 visualization systems through improvements in release 8.1 or later.
255
Visualization
Line colour Line visibility Draw line Draw auxiliary points Auxiliary point type Auxiliary point size Auxiliary point size type Auxiliary point fill style Auxiliary point colour Auxiliary point visibility Draw step point Step point type Step point size Step point size type Step point fill style Step point colour Step point visibility Time slice interval
grey true true false squares 2 pixels or mm* screen filled magenta true false circles 2 pixels or mm* screen filled yellow true 0
* Depending on size type. If size type == screen, pixels are assumed and no unit need be supplied. If size type == world, a unit must be supplied, e.g., 10 cm. Points to note: The context approach is intended to replace the configuration through the imode parameter. The use of imode is depreciated and will be removed in Geant4 v10.0. Different visualisation drivers handle trajectory configuration in different ways, so trajectories may not necessarily get displayed as you have configured them.
Both the context and model properties can be configured by the user. The models are described briefly below, followed by some example configuration commands.
G4TrajectoryGenericDrawer
This model simply draws all trajectories in the same style, with the properties provided by the context.
G4TrajectoryDrawByCharge
This is the default model - if no model is specified by the user, this model will be constructed automatically. The trajectory lines are coloured according to charge, with all other configuration parameters provided by the default context. The default colouring scheme is shown below.
256
Visualization
G4TrajectoryDrawByParticleID
This model colours trajectory lines according to particle type. All other configuration parameters are provided by the default context. By default, all trajectories are coloured grey. Chosen particle types can be highlighted with specified colours.
G4TrajectoryDrawByOriginVolume
This model colours trajectory lines according to the trajectories originating volume name. The volume can be either a logical or physical volume. Physical volume takes precedence over logical volume. All trajectories are coloured grey by default.
G4TrajectoryDrawByAttribute
This model draws trajectories based on the HepRep style attributes associated with trajectories. Each attribute drawer can be configured with interval and/or single value data. A new context object is created for each interval/ single value. This makes it possible to have different step point markers etc, as well as line colour for trajectory attributes falling into different intervals, or matching single values. The single value data should override the interval data, allowing specific values to be highlighted. Units should be specified on the command line if the attribute unit is specified either as a G4BestUnit or if the unit is part of the value string.
#Create a drawByCharge model named drawCharge-0 by default (Subsequent models will be named drawByCharge-1, drawByCharge-2, etc.)
/vis/modeling/trajectories/create/drawByCharge
257
Visualization
/vis/modeling/trajectories/drawByAttribute-0/brem_key/setLineColour red /vis/modeling/trajectories/drawByAttribute-0/annihil_key/setLineColour green /vis/modeling/trajectories/drawByAttribute-0/decay_key/setLineColour cyan /vis/modeling/trajectories/drawByAttribute-0/eIon_key/setLineColour yellow /vis/modeling/trajectories/drawByAttribute-0/muIon_key/setLineColour magenta
258
Visualization
0.0 keV 2.5MeV 2.5 MeV 5 MeV 5 MeV 7.5 MeV 7.5 MeV 10 MeV 10 MeV 12.5 MeV 12.5 MeV 10000 MeV 0.8 0 0.8 1 0.23 0.41 1 1 0 1 0 1 1 1 0 1 1 0.3 0 1 1 0 0 1
or
/vis/scene/add/trajectories rich smooth
When you run, you need to create a trajectory model and set the time slice interval (remembering that paticles are often relativistic and travel 30 cm/ns):
/vis/modeling/trajectories/create/drawByCharge /vis/modeling/trajectories/drawByCharge-0/default/setDrawStepPts true /vis/modeling/trajectories/drawByCharge-0/default/setStepPtsSize 5 /vis/modeling/trajectories/drawByCharge-0/default/setDrawAuxPts true /vis/modeling/trajectories/drawByCharge-0/default/setAuxPtsSize 5 /vis/modeling/trajectories/drawByCharge-0/default/setTimeSliceInterval 0.1 ns /vis/modeling/trajectories/list
259
Visualization
/vis/viewer/refresh
A good way to see the particles moving through the detector is:
/vis/ogl/set/fade 1 /vis/ogl/set/displayHeadTime true /control/alias timeRange 1 /control/loop movie.loop -{timeRange} 40 0.1
where fade gives a vapour-trail effect, displayHeadTime displays the time of the leading edge as 2D text, and movie.loop is a macro file:
/vis/ogl/set/startTime {startTime} ns {timeRange} ns
Multiple filters are automatically chained together, and can configured either interactively or in commands or in compiled code. The filters can be inverted, set to be inactive or set in a verbose mode. The above models are described briefly below, followed by some example configuration commands.
G4TrajectoryChargeFilter
This model filters trajectories according to charge. In standard running mode, only trajectories with charges matching those registered with the model will pass the filter.
G4TrajectoryParticleFilter
This model filters trajectories according to particle type. In standard running mode, only trajectories with particle types matching those registered with the model will pass the filter.
G4TrajectoryOriginVolumeFilter
This model filters trajectories according to originating volume name. In standard running mode, only trajectories with originating volumes matching those registered with the model will pass the filter.
G4TrajectoryAttributeFilter
This model filters trajectories based on the HepRep style attributes associated with trajectories. Each attribute drawer can be configured with interval and/or single value data. Single value data should override the interval data. Units should be specified on the command line if the attribute unit is specified either as a G4BestUnit or if the unit is part of the value string.
260
Visualization
#Create a charge filter. Configure to pass only neutral trajectories. #Set verbose printout. Reset filter and reconfigure to pass only #negativly charged trajectories.
/vis/filtering/trajectories/create/chargeFilter /vis/filtering/trajectories/chargeFilter-0/add 0 /vis/filtering/trajectories/chargeFilter-0/verbose true /vis/filtering/trajectories/chargeFilter-0/reset true /vis/filtering/trajectories/chargeFilter-0/add -1
#List filters
/vis/filtering/trajectories/list
#Note that although particleFilter-0 and chargeFilter-0 are automatically #chained, particleFilter-0 will not have any effect since #it is has been deactivated.
261
Visualization
8.9.1. Polylines
A polyline is a set of successive line segments. It is defined with a class G4Polyline defined in the graphics_reps category. A polyline is used to visualize tracking steps, particle trajectories, coordinate axes, and any other user-defined objects made of line segments. G4Polyline is defined as a list of G4Point3D objects, i.e., vertex positions. The vertex positions are set to a G4Polyline object with the push_back() method. For example, an x-axis with length 5 cm and with red color is defined in Example 8.4.
Example 8.4. Defining an x-axis with length 5 cm and with colour red.
//----- C++ source codes: An example of defining a line segment // Instantiate an emply polyline object G4Polyline x_axis; // Set red line colour G4Colour red(1.0, 0.0, 0.0); G4VisAttributes att(red); x_axis.SetVisAttributes(&att); // Set vertex positions x_axis.push_back( G4Point3D(0., 0., 0.) ); x_axis.push_back( G4Point3D(5.*cm, 0., 0.) ); //----- end of C++ source codes
8.9.2. Markers
Here we explain how to use 3D markers in Geant4 Visualization.
262
Visualization
These classes are inherited from class G4VMarker. They have constructors as follows:
//----- Constructors of G4Circle and G4Square G4Circle::G4Circle (const G4Point3D& pos ); G4Square::G4Square (const G4Point3D& pos);
Example 8.5. The access functions inherited from the base class G4VMarker.
//----- Set functions of G4VMarker void G4VMarker::SetPosition( const G4Point3D& ); void G4VMarker::SetWorldSize( G4double ); void G4VMarker::SetWorldDiameter( G4double ); void G4VMarker::SetWorldRadius( G4double ); void G4VMarker::SetScreenSize( G4double ); void G4VMarker::SetScreenDiameter( G4double ); void G4VMarker::SetScreenRadius( G4double ); void G4VMarker::SetFillStyle( FillStyle ); // Note: enum G4VMarker::FillStyle {noFill, hashed, filled}; //----- Get functions of G4VMarker G4Point3D G4VMarker::GetPosition () const; G4double G4VMarker::GetWorldSize () const; G4double G4VMarker::GetWorldDiameter () const; G4double G4VMarker::GetWorldRadius () const; G4double G4VMarker::GetScreenSize () const; G4double G4VMarker::GetScreenDiameter () const; G4double G4VMarker::GetScreenRadius () const; FillStyle G4VMarker::GetFillStyle () const; // Note: enum G4VMarker::FillStyle {noFill, hashed, filled};
Example 8.6 shows sample C++ source code to define a very small red circle, i.e., a dot with diameter 1.0 pixel. Such a dot is often used to visualize a hit.
Example 8.6. Sample C++ source code to define a very small red circle.
//----- C++ source codes: An example of defining a red small maker G4Circle circle(position); // Instantiate a circle with its 3D // position. The argument "position" // is defined as G4Point3D instance circle.SetScreenDiameter (1.0); // Should be circle.SetScreenDiameter // (1.0 * pixels) - to be implemented circle.SetFillStyle (G4Circle::filled); // Make it a filled circle G4Colour colour(1.,0.,0.); // Define red color G4VisAttributes attribs(colour); // Define a red visualization attribute circle.SetVisAttributes(attribs); // Assign the red attribute to the circle //----- end of C++ source codes
8.9.3. Text
Text, i.e., a character string, is used to visualize various kinds of description, particle name, energy, coordinate names etc. Text is described by the class G4Text . The following constructors are supported:
//----- Constructors of G4Text G4Text (const G4String& text); G4Text (const G4String& text, const G4Point3D& pos);
263
Visualization
where the argument text is the text (string) to be visualized, and pos is the 3D position at which the text is visualized. Text is currently drawn only by the OpenGL drivers, such as OGLIX, OGLIXm and OpenInventor. It is not yet supported on other drivers, including the Windows OpenGL drivers, HepRep, etc. Note that class G4Text also inherits G4VMarker. Size of text is recognized as "font size", i.e., height of the text. All the access functions defined for class G4VMarker mentioned above are available. In addition, the following access functions are available, too:
//----- Set functions of G4Text void G4Text::SetText ( const G4String& text ) ; void G4Text::SetOffset ( double dx, double dy ) ; //----- Get functions of G4Text G4String G4Text::GetText () const; G4double G4Text::GetXOffset () const; G4double G4Text::GetYOffset () const;
Method SetText() defines text to be visualized, and GetText() returns the defined text. Method SetOffset() defines x (horizontal) and y (vertical) offsets in the screen coordinates. By default, both offsets are zero, and the text starts from the 3D position given to the constructor or to the method G4VMarker:SetPosition(). Offsets should be given with the same units as the one adopted for the size, i.e., world-size or screen-size units. Example 8.7 shows sample C++ source code to define text with the following properties: Text: "Welcome to Geant4 Visualization" Position: (0.,0.,0.) in the world coordinates Horizontal offset: 10 pixels Vertical offset: -20 pixels Colour: blue (default)
264
Visualization
The procedures described here need graphics drivers that can produce picture files that can be converted to a form suitable for an MPEG encoder. There may be other ways of capturing the screen images and we would be happy to hear about them. Graphics drivers currently capable of producing picture files are: More informations about MPEG encoder Driver DAWNFILE HepRepFile HepRep OGLX Qt RayTracer VRMLFILE File type prim then eps using dawn HepRep1 HepRep2 eps jpeg, eps, ppm, ... jpeg vrml
So far, only DAWNFILE, OGLX, OGLQt and RayTracer have been "road tested". Once in a standard format, such as eps, the convert program from ImageMagick can convert to ppm files suitable for ppmtompeg available here: http://netpbm.sourceforge.net/
8.10.1. OGLX
Make a macro something like this:
/control/verbose 2 /vis/open OGL 600x600-0+0 /vis/drawVolume /vis/viewer/reset /vis/viewer/set/style surface /vis/viewer/set/projection perspective 50 deg /control/alias phi 30 /control/loop movie.loop theta 0 360 1
265
Visualization
for i in G4OpenGL*eps; do j=`basename $i .eps`; command="convert $i $j.ppm"; echo $command; $command; done
Then
mpeg2encode mpeg2encode.par G4OpenGL.mpg
8.10.2. Qt
The Qt driver provides one of the easiest ways to make a movie. Of course, you first need to add the Qt libraries and link with Qt, but once you have that, Qt provides a ready-made function to store all updates of the OpenGL frame into the movie format. You then use loops (as defined in OGLX section above) or even move/rotate/zoom you scene by mouse actions to form your movie. The Qt driver automatically handles all of the movie-making steps described in the OGLX section of this document - storing the files, converting them and assembling the finished movie. You just have to take care of installing an mpeg_encoder. To make a movie : Right click to display a context menu, "Action"->"Movie parameters". Select MPEG encoder path if it was not found. Select the name of the output movie. Let go! Hit SPACE to Start/Pause recording, RETURN to STOP
8.10.3. DAWNFILE
You need to invoke dawn in "direct" mode, which picks up parameters from .DAWN_1.history, and suppress the GUI:
alias dawn='dawn -d' export DAWN_BATCH=1
Change OGL to DAWNFILE in the above set of Geant4 commands and run. Then convert to ppm files as above:
for i in g4_*.eps; do j=`basename $i .eps`; command="convert $i $j.ppm"; echo $command; $command; done
266
Visualization
< 1 /* input picture file format: 0=*.Y,*.U,*.V, 1=*.yuv, 2=*.ppm */ --> 2 /* input picture file format: 0=*.Y,*.U,*.V, 1=*.yuv, 2=*.ppm */ 9c9 < 1 /* number of first frame */ --> 0 /* number of first frame */ 15,16c15,16 < /* horizontal_size */ < /* vertical_size */ --> 482 /* horizontal_size */ > 730 /* vertical_size */
8.10.4. RayTracerX
/control/verbose 2 /vis/open RayTracerX 600x600-0+0 # (Raytracer doesn't need a scene; smoother not to /vis/drawVolume.) /vis/viewer/reset /vis/viewer/set/style surface /vis/viewer/set/projection perspective 50 deg /control/alias phi 30 /control/loop movie.loop theta 0 360 1
where movie.loop is as above. This produces lots of jpeg files (but takes 3 days!!!). Then...
make_mpeg2encode_parfile.sh g4RayTracer*jpeg
267
Chapter 9. Examples
9.1. Novice Examples
The Geant4 toolkit includes several fully coded examples which demonstrate the implementation of the user classes required to build a customized simulation. Seven "novice" examples are provided ranging from the simulation of a non-interacting particle and a trivial detector, to the simulation of electromagnetic and hadronic physics processes in a complex detector. Each example may be used as a base from which more detailed applications can be developed. A set of "extended" examples implement simulations of actual high energy physics detectors and require some libraries in addition to those of Geant4. The "advanced" examples cover cases useful to the developement of the Geant4 toolkit itself. The examples can be compiled and run without modification. Most of them can be run both in interactive and batch mode using the input macro files (*.in) and reference output files (*.out) provided. These examples are run routinely as part of the validation, or testing, of official releases of the Geant4 toolkit.
ExampleN05 (Description below) Simplified BaBar calorimeter EM shower parametrisation ExampleN06 (Description below) Optical photon processes ExampleN07 (Description below) Geometrical Regions for production thresholds Dynamic geometry setups between runs Primitive scorer and filter Derived run class and run action
268
Examples
Table 9.1, Table 9.2 and Table 9.3 display the ``item charts'' for the examples currently prepared in the novice level. ExampleN01 comments Run ExampleN02 ExampleN03 tracker EM shower in calorimeter
main() for hard coded main() for interactive main() for interactive batch mode mode SetCut and Process On/ Off event generator selection event generator selection event generator selection (particleGun) (particleGun) (particleGun) ``end of event'' simple analysis in UserEventAction hard coded verbose level selecting secondaries setting select trajectories
Event
Tracking Geometry
geometry definition (CSG) geometry definition geometry definition (includes Parametrised (includes replica) volume) uniform magnetic field uniform magnetic field tracker type hits calorimeter-type hits minimal particle set EM particles set EM particles set single element material mixtures and compound mixtures and compound elements elements transportation EM physics EM physics & trajectory detector & trajectory detector drawing drawing tracker type hits drawing GUI selection -
Hits/Digi PIIM
Physics Vis
(G)UI Global
GUI selection -
Table 9.1. The ``item chart'' for novice level examples N01, N02 and N03.
ExampleN04 comments Run Event simplified geometry ExampleN05 collider parametrised example ExampleN06 shower Optical photon example
main() for interactive main() for interactive main() for interactive mode mode mode event generator selection event generator selection event generator selection (HEPEvtInterface) (HEPEvtInterface) (particleGun) Stack control select trajectories selecting secondaries -
Tracking Geometry
geometry definition ghost volume for shower geometry definition (includes Param/ parametrisation (BREP with rotation) Replica) non-uniform magnetic field Tracker/calorimeter/ counter types ReadOut geometry Full particle set Sensitive detector for shower parametrisation EM set EM set -
Hits/Digi
PIIM
269
Examples
mixtures and compound mixtures and compound mixtures and compound elements elements elements Physics Vis Full physics processes Parametrized shower Optical photon processes detector & hit drawing detector & hit drawing calorimeter type hits drawing define user commands define user commands -
(G)UI Global
Table 9.2. The ``item chart'' for novice level examples N04, N05, and N06.
ExampleN07 comments Run Event Tracking Geometry Hits/Digi PIIM Physics Vis (G)UI Global Cuts per region main() for interactive mode Customized run class event generator selection (particleGun) geometry definition (includes Replica) Region Primitive scorer Filter EM set mixtures and compound elements EM processes detector & trajectory drawing define user commands -
Table 9.3. The ``item chart'' for novice level example N07.
Classes
main() (source file) hard coded batch construction and deletion of G4RunManager hard coded verbose level setting to G4RunManager, G4EventManager and G4TrackingManager construction and set of mandatory user classes hard coded beamOn() Hard coded UI command application
ExN01DetectorConstruction
(header file) (source file) derived from G4VUserDetectorConstruction definitions of single element materials CSG solids
270
Examples
ExN01PhysicsList
(header file) (source file) derived from G4VUserPhysicsList definition of geantino assignment of transportation process
ExN01PrimaryGeneratorAction
(header file) (source file) derived from G4VPrimaryGeneratorAction construction of G4ParticleGun primary event generation via particle gun
Classes
main() (source file) main() for interactive mode (and batch mode via macro file) construction and deletion of (G)UI session and VisManager random number engine construction and deletion of G4RunManager construction and set of mandatory user classes
ExN02DetectorConstruction
(header file) (source file) derived from G4VUserDetectorConstruction definitions of single-element, mixture and compound materials CSG solids Uniform magnetic field: construction of ExN02MagneticField Physical Volumes G4Placement volumes with & without rotation. G4PVParameterised volumes without rotation
ExN02MagneticField
(header file) (source file) derived from G4MagneticField Uniform field. ExN02MagneticField
ExN02PhysicsList
(header file) (source file)
271
Examples
derived from G4VUserPhysicsList definition of geantinos, electrons, positrons, gammas utilisation of transportation and 'standard' EM-processes Interactivity: chooses processes interactively (=> messenger class)
ExN02PrimaryGeneratorAction
(header file) (source file) derived from G4VPrimaryGeneratorAction construction of G4ParticleGun primary event generation via particle gun
ExN02RunAction
(header file) (source file) derived from G4VUserRunAction draw detector
ExN02EventAction
(header file) (source file) derived from G4VUserEventAction print time information
ExN02TrackerSD
(header file) (source file) derived from G4VSensitiveDetector tracker-type hit generation
ExN02TrackerHit
(header file) (source file) derived from G4VHit draw hit point
Classes
main() (source file) main() for interactive mode and batch mode via macro file construction and deletion of G4RunManager construction and deletion of (G)UI session and VisManager construction and set of mandatory user classes automatic initialization of geometry and visualization via a macro file
272
Examples
DetectorConstruction
(header file) (source file) derived from G4VUserDetectorConstruction definitions of single materials and mixtures CSG solids G4PVPlacement without rotation Interactivity: change detector size, material, magnetic field. (=>messenger class) visualization
PhysicsList
(header file) (source file) derived from G4VUserPhysicsList definition of geantinos, gamma, leptons, light mesons barions and ions Transportation process, 'standard' Em processes, Decay Interactivity: SetCut, process on/off. (=> messenger class)
PrimaryGeneratorAction
(header file) (source file) derived from G4VPrimaryGeneratorAction construction of G4ParticleGun primary event generation via particle gun Interactivity: shoot particle randomly. (=> messenger class)
RunAction
(header file) (source file) derived from G4VUserRunAction draw detector and tracks Interactivity: SetCut, process on/off. Interactivity: change detector size, material, magnetic field.
EventAction
(header file) (source file) derived from G4VUserEventAction store trajectories print end of event information (energy deposited, etc.)
SteppingAction
(header file) (source file) derived from G4VUserSteppingAction collect energy deposition, etc.
273
Examples
Full hits/digits/trigger
Classes
main() (source file) construction and deletion of ExN04RunManager construction and deletion of (G)UI session and VisManager construction and set of user classes
ExN04DetectorConstruction
(header file) (source file) derived from G4VUserDetectorConstruction construction of ExN04MagneticField definitions of mixture and compound materials material-dependent CutOff simplified collider geometry with Param/Replica tracker/muon -- parametrised calorimeter -- replica
ExN04TrackerParametrisation
(header file) (source file) derived from G4VPVParametrisation parametrised sizes
ExN04CalorimeterParametrisation
(header file) (source file) derived from G4VPVParametrisation parametrized position/rotation
ExN04MagneticField
(header file) (source file) derived from G4MagneticField solenoid and toroidal fields
ExN04TrackerSD
(header file) (source file) derived from G4VSensitiveDetector tracker-type hit generation
ExN04TrackerHit
(header file) (source file) derived from G4VHit draw hit point
ExN04CalorimeterSD
(header file) (source file)
274
Examples
ExN04CalorimeterHit
(header file) (source file) derived from G4VHit draw physical volume with variable color
ExN04MuonSD
(header file) (source file) derived from G4VSensitiveDetector Scintillator-type hit generation
ExN04MuonHit
(header file) (source file) derived from G4VHit draw physical volume with variable color
ExN04PrimaryGeneratorAction
(header file) (source file) derived from G4VPrimaryGeneratorAction construction of G4HEPEvtInterface primary event generation with PYTHIA event
ExN04EventAction
(header file) (source file) store the initial seeds
ExN04StackingAction
(header file) (source file) derived from G4UserStackingAction ``stage'' control and priority control event abortion
ExN04StackingActionMessenger
(header file) (source file) derived from G4UImessenger define abortion conditions
ExN04TrackingAction
(header file) (source file) derived from G4UserTrackingAction select trajectories select secondaries
275
Examples
Classes
main() (source file) main() for interactive mode construction and deletion of G4RunManager construction and set of mandatory user classes construction of the G4GlobalFastSimulationmanager construction of a G4FastSimulationManager to assign fast simulation model to a logical volume (envelope) (definition of ghost volume for parameterisation) construction EM physics shower fast simulation model
ExN05EMShowerModel
(header file) (source file) derived from G4VFastSimulationModel energy deposition in sensitive detector
ExN05PionShowerModel
(header file) (source file) derived from G4VFastSimulationModel energy deposition in sensitive detector
ExN05DetectorConstruction
(header file) (source file) derived from G4VUserDetectorConstruction definitions of single materials and mixtures CSG solids G4PVPlacement
ExN05PhysicsList
(header file) (source file) derived from G4VUserPhysicsList assignment of G4FastSimulationManagerProcess
ExN05PrimaryGeneratorAction
(header file) (source file) derived from G4VPrimaryGeneratorAction construction of G4ParticleGun primary event generation via particle gun
276
Examples
ExN05RunAction
(header file) (source file) derived from G4VUserRunAction draw detector (activation/deactivation of parameterisation ?)
ExN05EventAction
(header file) (source file) derived from G4VUserEventAction print time information
Classes
main() (source file) main() for interactive mode and batch mode via macro file random number engine construction and deletion of G4RunManager construction and set of mandatory user classes hard coded beamOn
ExN06DetectorConstruction
(header file) (source file) derived from G4VUserDetectorConstruction definitions of single materials and mixtures generate and add Material Properties Table to materials CSG and BREP solids G4PVPlacement with rotation definition of surfaces generate and add Material Properties Table to surfaces visualization
ExN06PhysicsList
(header file) (source file) derived from G4VUserPhysicsList definition of gamma, leptons and optical photons transportation, 'standard' EM-processes, decay, Cerenkov, scintillation, 'standard' optical and boundary process modify/augment optical process parameters
277
Examples
ExN06PrimaryGeneratorAction
(header file) (source file) derived from G4VPrimaryGeneratorAction construction of G4ParticleGun primary event generation via particle gun
ExN06RunAction
(header file) (source file) derived from G4VUserRunAction draw detector
Classes
main() (source file) main() for interactive mode and batch mode via macro file construction and deletion of G4RunManager construction and deletion of G4VisExective and G4UITerminal construction and set of mandatory user classes construction and set of ExN07RunAction
ExN07DetectorConstruction
(header file) (source file) derived from G4VUserDetectorConstruction definitions of materials and mixtures G4Box with G4PVPlacement and G4PVReplica Dynamic changing of size, position, orientation and number of volumes G4Region for each calorimeter tower G4VPrimitiveScorer and G4VSDFilter visualization
ExN07DetectorMessenger
(header file) (source file) derived from G4UIMessenger definition of example-specific geometry commands
ExN07PhysicsList
(header file) (source file) derived from G4VUserPhysicsList difine all types of particles
278
Examples
define standard EM and decay processes production thresholds for each region
ExN07PrimaryGeneratorAction
(header file) (source file) derived from G4VPrimaryGeneratorAction construction of G4ParticleGun primary event generation via particle gun
ExN07RunAction
(header file) (source file) derived from G4UserRunAction constructing ExN07Run class object print out a run summary with ExN07Run class object
ExN07Run
(header file) (source file) derived from G4Run uses G4THitsMap template class to accumulate physics quantities extracts event data from G4Event and add up to run data
9.2.1.1. Analysis
A01 - hit-scoring and histogramming using the AIDA interface AnaEx01 - histogram and tuple manipulations using an AIDA compliant system N03Con - modified novice example N03 showing how to use a Convergence Tester
9.2.1.2. Electromagnetic
TestEm0 - how to print cross-sections and stopping power used in input by the standard EM package TestEm1 - how to count processes, activate/inactivate them and survey the range of charged particles. How to define a maximum step size TestEm2 - shower development in an homogeneous material : longitudinal and lateral profiles TestEm3 - shower development in a sampling calorimeter : collect energy deposited, survey energy flow and print stopping power TestEm4 - 9 MeV point like photon source: plot spectrum of energy deposited in a single media TestEm5 - how to study transmission, absorption and reflection of particles through a single, thin or thick, layer. TestEm6 - physics list for rare, high energy, electromagnetic processes: gamma conversion and e+ annihilation into pair of muons
279
Examples
TestEm7 - how to produce a Bragg curve in water phantom. How to compute dose in tallies TestEm8 - test of photo-absorption-ionisation model in thin absorbers, and transition radiation TestEm9 - shower development in a crystal calorimeter; cut-per-region TestEm10 - XTR transition radiation model, investigation of ionisation in thin absorbers TestEm11 - how to plot a depth dose profile in a rectangular box TestEm12 - how to plot a depth dose profile in spherical geometry : point like source TestEm13 - how to compute cross sections of EM processes from rate of transmission coefficient TestEm14 - how to compute cross sections of EM processes from direct evaluation of the mean-free path. How to plot final state TestEm15 - compute and plot final state of Multiple Scattering as an isolated process TestEm16 - simulation of synchrotron radiation TestEm17 - check the cross sections of high energy muon processes TestEm18 - energy lost by a charged particle in a single layer, due to ionization and bremsstrahlung Check basic quantities
Total cross sections, mean free paths ... Stopping power, particle range ... Final state : energy spectra, angular distributions Energy loss fluctuations as an isolated mechanism as a result of particle transport Single layer: transmission, absorption, reflexion Bragg curve, tallies Depth dose distribution Shower shapes, Moliere radius Sampling calorimeters, energy flow Crystal calorimeters High energy muon physics Other rare, high energy processes Synchrotron radiation Transition radiation Photo-absorption-ionization model
Em0, Em13, Em14 Em0, Em1, Em5, Em11, Em12 Em14 Em18 Multiple Coulomb scattering Em15 Em5 More global verifications Em5 Em7 Em11, Em12 Em2 Em3 Em9 Other specialized programs Em17 Em6 Em16 Em8 Em10
280
Examples
MCTruth - demonstrating a mechanism for Monte Carlo truth handling using HepMC as the event record exgps - illustrating the usage of the G4GeneralParticleSource utility particleGun - demonstrating three different ways of usage of G4ParticleGun, shooting primary particles in different cases pythia - illustrating the usage of Pythia as Monte Carlo event generator, interfaced with Geant4, and showing how to implement an external decayer
9.2.1.7. Fields
BlineTracer - tracing and visualizing magnetic field lines field01 - tracking using magnetic field and field-dependent processes field02 - tracking using electric field and field-dependent processes field03 - tracking in a magnetic field where field associated with selected logical volumes varies field04 - definition of overlapping fields either magnetic, electric or both field05 - demonstration of "spin-frozen" condition, how to cancel the muon g-2 precession by applying an electric field
9.2.1.9. Geometry
ReadMe OLAP - debugging tool for overlapping geometries
9.2.1.10. Hadronic
Hadr00 - example demonstrating the usage of G4PhysListFactory to build physics lists and usage of G4HadronicProcessStore to access the cross sections Hadr01 - example based on the application IION developed for simulation of proton or ion beam interaction with a water target. Different aspects of beam target interaction are included
281
Examples
ParGeant4 - set of examples (ParN02 and ParN04) derived from novice using parallelism at event level with the TopC application
9.2.1.14. Parameterisations
Gflash - Demonstrates the use of the GFLASH parameterisation library. It uses the GFLASH equations(hepex/0001020, Grindhammer & Peters) to parametrise electromagnetic showers in matter
9.2.1.15. Persistency
General ReadMe GDML - examples set illustrating import and export of a detector geometry with GDML, and how to extend the GDML schema or use the auxiliary information field for defining additional persistent properties P01 - storing calorimeter hits using reflection mechanism with Root P02 - storing detector description using reflection mechanism with Root P03 - illustrating import and export of a detector geometry using ASCII text description and syntax
9.2.1.16. Polarisation
Pol01 - interaction of polarized beam (e.g. circularly polarized photons) with polarized target
9.2.1.19. Visualization
Examples of customisation for visualization
282
Examples
eRosita , simplified version of the simulation of the shielding of the eROSITA X-ray mission; it demonstrates the simulation of PIXE (Particle Induced X-ray Emission) as described in M.G. Pia et al., PIXE simulation with Geant4, IEEE Trans. Nucl. Sci., vol. 56, no. 6, pp. 3614-3649, 2009. gammaray_telescope , illustrating an application to typical gamma ray telescopes with a flexible configuration. hadrontherapy , is a basic example for people interested in Monte Carlo studies related to proton/ion therapy. Hadrontherapy permits the simulation of a typical hadron therapy beam line (with all its elements) and the calculation of fundamentals quantities of interests: 3D dose distributions, fluences, stopping powers, production cross sections for the produced secondary particle, etc.. A 'complete' version of Hadrontherapy is released by the authors in a separate web site: http://www.lns.infn.it/link/Hadrontherapy. Users can request the version of Hadrontherapy containing other features: LET and RBE calculation, active scanning simulation, DICOM images inport, etc. Please contact the authors for any question. human_phantom , implementing an Anthropomorphic Phantom body built importing the description from a GDML representation. medical_linac , illustrating a typical medical physics application simulating energy deposit in a Phantom filled with water for a typical linac used for intensity modulated radiation therapy. The experimental set-up is very similar to one used in clinical practice. microbeam , simulates the cellular irradiation beam line installed on the AIFIRA electrostatic accelerator facility located at CENBG, Bordeaux-Gradignan, France. microdosimetry , simulates the track of a 10 keV Helium+ (positive charge is +e) particle in liquid water using very low energy electromagnetic Geant4 DNA processes. nanobeam , simulates the beam optics of the "nanobeam line" installed on the AIFIRA electrostatic accelerator facility located at CENBG, Bordeaux-Gradignan, France. purging_magnet , illustrating an application that simulates electrons traveling through a 3D magnetic field; used in a medical environment for simulating a strong purging magnet in a treatment head. radioprotection , illustrating an application to evaluate the dose in astronauts, in vehicle concepts and Moon surface habitat configurations, in a defined interplanetary space radiation environment. xray_telescope , illustrating an application for the study of the radiation background in a typical X-ray telescope. xray_fluorescence , illustrating the emission of X-ray fluorescence and PIXE. underground_physics , illustrating an underground detector for dark matter searches. lAr_calorimeter , simulating the Forward Liquid Argon Calorimeter (FCAL) of the ATLAS Detector at LHC. Rich , simulating the TestBeam Setup of the Rich detector at the LHCb experiment, testing the performance of the aerogel radiator For documentation about the analysis tools used in these examples, see Appendix Section 2 of this manual.
283
A:
Q: A:
Q:
Has Geant4 been installed properly ? What to do to solve this error ? A: The message:
gmake[1]: cernlib: Command not found
shows that you don't have the 'cernlib' command installed in your system; 'cernlib' is a command from the CERN program library (cernlib) returning a list of libraries needed to link a cernlib application. This command is only used in the 'g3tog4' module, however, if you do not make use of the 'g3tog4' tool, it's harmless. The cernlib script (and the needed cernlib libraries) are available from: http://cern.ch/cernlib. Q: Trying building the Geant4 libraries I see several of these errors appearing and my installation fails:
.....G4Exception.d:1: *** missing separator. Stop. ...../G4DalitzDecayChannel.d:1: *** missing separator. Stop. : :
Has Geant4 been installed properly ? What to do to solve this error ? A: It looks like some file dependencies (.d) are corrupted, possibly due to previous build attempts which failed for some reason. You need to remove each of them. A quick recipe for doing this is to: Configure the environment with the installation to be repaired Unset the G4WORKDIR environment variable (in case it is eventually set) Type:
284
from the affected module (i.e. for this case, from $G4INSTALL/source/global/management and $G4INSTALL/source/particles/management) and rebuild. Alternatively, you may use:
Q:
error in loading shared libraries: libCLHEP.so: cannot open shared object file: No such file or directory.
A:
Your installation of CLHEP includes shared libraries. You need to specify the path where libCLHEP.so is installed through your environment variable LD_LIBRARY_PATH. For example, in tcsh UNIX shell:
Q:
On my system I get a Floating Point Exception (FPE) since some physics processes sometimes return DBL_MAX as interaction length and this number is afterwards multiplied by a number greater than 1. Geant4 coding conventions and installation setup explicitly follow the ANSI/IEEE-754 Standard for the initialization of floating-point arithmetic hardware and portability. The Standard foresees floating-point arithmetic to be nonstop and underflows to be gradual. On DEC platforms, for example, the ANSI/IEEE-754 Standard compliance needs to be explicitly set (since deactivated by default); in this case we use infact the option "-ieee" on the DEC/cxx native C++ compiler to achieve this. You should check if your compiler provides compilation options for activating Standard initialization of FP arithmetic (it may be platform specific).
A:
FAQ.3. Geometry
Q: I have a generic point and I would like to know in which physical volume I'm located in my detector geometry. The best way of doing this is by invoking the G4Navigator. First get a pointer of the navigator through the G4TransportationManager, and then locate the point. i.e.
A:
#include "G4TransportationManager.hh" #include "G4Navigator.hh" G4ThreeVector myPoint = ....; G4Navigator* theNavigator = G4TransportationManager::GetTransportationManager() ->GetNavigatorForTracking(); 285 G4VPhysicalVolume* myVolume = theNavigator->LocateGlobalPointAndSetup(myPoint);
Note
by using the navigator for tracking as shown above, the actual particle gets also -relocated- in the specified position. Therefore, if this information is needed during tracking time, in order to avoid affecting tracking, you should either use an alternative G4Navigator object (which you then assign to your world-volume), or you access the information through the track or touchable as specified in the FAQ for tracking and steps. Q: A: How can I access the daughter volumes of a specific physical volume? Through the associated logical volume.
G4VPhysicalVolume* myPVolume = ....; G4LogicalVolume* myLVolume = myPVolume->GetLogicalVolume(); for (G4int i=0; iGetNoDaughters(); i++) myPVolume = myLVolume->GetDaughter(i);
Q: A:
How can I identify the exact copy-number of a specific physical volume in my mass geometry? I tried with GetCopyNo() from my physical volume pointer, but it doesn't seem to work! The correct way to identify -uniquely- a physical volume in your mass geometry is by using the touchables (see also section 4.1.5 of the User's Guide for Application Developers), as follows:
G4Step* aStep = ..; G4StepPoint* preStepPoint = aStep->GetPreStepPoint(); G4TouchableHandle theTouchable = preStepPoint->GetTouchableHandle(); G4int copyNo = theTouchable->GetCopyNumber(); G4int motherCopyNo = theTouchable->GetCopyNumber(1);
where Copy here stays for any duplicated instance of a physical volume, either if it is a G4PVPlacement (multiple placements of the same logical volume) or a G4PVReplica/G4PVParameterised. The method GetCopyNo() is meant to return only the serial number of placements not duplicated in the geometry tree. Q: A: How can I determine the exact position in global coordinates in my mass geometry during tracking and how can I convert it to coordinates local to the current volume ? You need again to do it through the touchables (see also section 4.1.5 of the User's Guide for Application Developers), as follows:
G4Step* aStep = ..; G4StepPoint* preStepPoint = aStep->GetPreStepPoint(); G4TouchableHandle theTouchable = preStepPoint->GetTouchableHandle(); G4ThreeVector worldPosition = preStepPoint->GetPosition(); G4ThreeVector localPosition = theTouchable->GetHistory()-> GetTopTransform().TransformPoint(worldPosition);
where worldPosition here stays for the position related to the world volume, while localPosition refers to the coordinates local to the volume where the particle is currently placed.
286
Hereafter we call current volume the volume where the step has just gone through. Geometrical informations are available from preStepPoint. G4VTouchable and its derivates keep these geometrical informations. We retrieve a touchable by creating a handle for it:
To check that the particle has just entered in the current volume (i.e. it is at the first step in the volume; the preStepPoint is at the boundary):
if (point1->GetStepStatus() == fGeomBoundary)
To check that the particle is leaving the current volume (i.e. it is at the last step in the volume; the postStepPoint is at the boundary):
if (point2->GetStepStatus() == fGeomBoundary)
From touch2, all informations on the next volume can be retrieved as above. Physics quantities are available from the step (G4Step) or from the track (G4Track). To get the energy deposition, step length, displacement and time of flight spent by the current step:
= = = =
To get momentum, kinetic energy and global time (time since the beginning of the event) of the track after the completion of the current step:
= = = =
Remark
To transform a position from the global coordinate system to the local system of the current volume, use the preStepPoint transformation, as described in the geometry section above. 288 Q: How can I get and store (or plot) informations at tracking time from a given volume ?
1. If the geometry is simple enough, and wish to score some commonly used physics quantities (e.g. energy deposition, dose, flux, etc.), just activate G4ScoringManager in your main program, and use the scorer-based UI commands to transform volume A into a scorer. See Option 6 below, and the example RE03 in examples/extended/runAndEvent. 2. Through the SteppingAction, check that the particle is inside volume A and do whatever needed. Hints can be found in the previous section of this FAQ document. Usually, the hits containers and histograms are attributes of a Track, Event or Run and can be managed through either a TrackingAction, EventAction and/or RunAction and eventually messaging their pointer to the SteppingAction. > A similar approach is illustrated in examples/novice electromagnetic, optical, and many others... N03, N06, extended/
3. In DetectorConstruction, by declaring volume A as a SensitiveDetector. At stepping time, the Geant4 kernel will automatically check that a particle is inside volume A and will handle the control to a specific function G4VSensitiveDetector::ProcessHits(). It is just necessary to instanciate a class inherited from G4VSensitiveDetector, say VolumeA_SD, and do whatever needed by implementing the function VolumeA_SD::ProcessHits(), as described in Option 2 above. 4. In addition to Option 3 above, should create a HitsCollection to store the information. A HitsCollection can be created in VolumeA_SD::Initialize(). A Hit can be created or filled in VolumeA_SD::ProcessHits(). Additional operations on HitsCollection can be performed in VolumeA_SD::EndOfEvent(). This approach is illustrated in examples/novice N02, N04 and extended/analysis, extended/runAndEvent RE01, etc... 5. In DetectorConstruction, volume A can be declared as SensitiveDetector, and one or several pre-defined scorers can be attached to volume A. In this case, neither a SteppingAction nor a spcific VolumeA_SD sensitive detector is needed any longer. It is just necessary to create a dedicated scorer, e.g. MyRunScorer, inherited from G4Run, and handle the HitsCollections within MyRunScorer::RecordEvent(). MyRunScorer itself can be instanciated from RunAction::GenerateRun(). This approach is illustrated in examples/novice N07, extended/runAndEvent RE02. 6. A set of build-in scorer-based UI commands allows to perform most possible operations described through the previous Option 5 directly from run-time macros. See example extended/runAndEvent RE03.
A:
289
another step will occur on the other side of that boundary. In summary the "production threshold" range and its equivalent in energy are not utilised as a "tracking cut". A particle is not abandoned by Geant4 below a certain range/energy unless the user registers a process to do this by him/her-self.
FAQ.6. Visualization
Q: A: I have set G4VIS... environmental variables but visualization does not appear to be enabled. This might be because you set the environment variables *after* already compiling. The environment variables control C-pre-processor macros of the same name and therefore influence what code gets compiled. It is suggested to proceed with the following manual procedure to correct the current installation: Configure the environment according to the installation making sure to -unset- the G4WORKDIR environment variable, if set. Verify and eventually set the environment variables of the visualization module [name] concerned (setenv or export both G4VIS_BUILD_[name]_DRIVER and G4VIS_USE_[name] variables according to the UNIX shell used), and then proceed as follows:
cd $G4INSTALL/source/visualization gmake clean gmake cd $G4INSTALL/source/interfaces gmake clean gmake cd $G4INSTALL/source gmake libmap setenv G4WORKDIR [your working directory] cd [your application directory] gmake clean gmake
(or export)
Q:
While visualizing my geometry setup I often see the following error message printed out:
A:
There is a known limitation for the visualization of Boolean solids in the so-called BooleanProcessor which is used to make polyhedra for visualisation. It does not affect the tracking which is done through such solids. So the error message you see does not affect the simulation in any way. The workaround is to move one of the affected solids by a small distance in order to avoid shared surfaces.
A:
Q: A:
Q:
A:
The responsible person is the working group coordinator of the domain in which the fix is to be applied. This person is usually also a TSB member. If the fix affects more than one domain, the matter will be addressed by the TSB. To whom should I send a proposal for an improvement in Geant4 functionality? Any new requirement should be submitted via the automatic web system. It will be discussed at the Geant4 TSB. You may also ask your TSB representative to forward your requirement to the TSB. A new requirement will trigger a cycle of analysis, design, implementation, testing and documentation, which may involve different working groups. Any new software or enhancement which will become a part of Geant4 must be agreed upon by the TSB, which is charged with ensuring the consistency of the entire toolkit. Is there a regular user meeting which I should attend? There is only one Geant4 workshop per year. However, many experiments and institutes in the Geant4 collaboration organize their own regular and/or special Geant4 user workshops. Where can I find solutions to particular problems as well as general user support? Solutions and tips for solving practical problems can be found on the current FAQ page. General and specific user support information is available at the User Support page.
Q: A:
Q: A:
Q: A:
291
Appendix . Appendix
1. Tips for Program Compilation
This section is dedicated to illustrate and justify some of the options used and fixed by default in the compilation of the Geant4 toolkit. It is also meant to be a simple guide for the user/installer to avoid or overcome problems which may occur on some compilers. Solutions proposed here are based on the experience gained while porting the Geant4 code to different architectures/compilers and are specific to the OS's and compiler's version valid at the current time of writing of this manual. It's well known that each compiler adopts its own internal techniques to produce the object code, which in the end might be more or less perfomant and more or less optimised, depending on several factors also related to the system architecture which it applies to. After the installation of the libraries, we strongly suggest to always distinguish between the installation directory (identified by $G4INSTALL) and the working directory (identified by $G4WORKDIR), in order not to alter the installation area.
Note
Additional compilation options (-march=XXX -mfpmath=sseYYY) to adopt chip specific floatingpoint operations on the SSE unit, can be activated by adapting the XXX, YYY options and uncommenting the relevant part in the Linux-g++.gmk configuration script. By doing so, it has been verified a greater stability of results, making possible reproducibility of exact outputs between debug, non-optimised and optimised runs. A little performance improvement (in the order of 2%) can also be achieved in some cases. To be considered that binaries built using these chip-specific options will likely NOT be portable cross platforms; generated applications will only run on the specific chip-based architectures.
292
Appendix
Dynamic libraries (.dylib) are supported as well; once built, in order to run the generated application, the user must specify the absolute path in the system where they're installed with the DYLD_LIBRARY_PATH system variable.
2. Histogramming
Geant4 is independent of any histogramming package. The Geant4 toolkit has no drivers for histogramming, and no drivers are needed in Geant4 to use a histogramming package. The code for generating histograms on some of the distributed examples should be compliant with the AIDA abstract interfaces for Data Analysis. Consequently, you may use your favourite package together with the Geant4 toolkit.
2.1. JAS
Please refer to the JAS documentation on histogramming for using the JAVA Analysis Studio tool.
2.2. iAida
Please refer to the iAIDA (an implementation of AIDA in C++) documentation : tool for generating histograms with AIDA to HBook, Root and AIDA-native compressed XML format.
2.4. rAIDA
Please refer to the rAIDA documentation (a Root implementation of AIDA): Root plugin for generating histograms with AIDA.
2.5. Examples
Examples in Geant4 showing how to use AIDA compliant tools for histogramming are available in the code distribution in the following directories: geant4/examples/extended/analysis, geant4/examples/extended/electromagnetic geant4/examples/advanced
293
Appendix
and lorentz vectors and their transformations. Although these classes have Geant4 names like G4ThreeVector, these are just typedefs to the CLHEP classes.
STL in Geant4
Since release 0.1, Geant4 supports STL, the Standard Template Library. From release 1.0 of Geant4, STL is required. Native implementations of STL are foreseen on all supported platforms.
294
Appendix
starts the compilation process to build a single compound kernel library per category. If issued after "make", both 'granular' and 'compound' libraries will be available (NOTE: this will consistently increase the disk space required. Compound libraries will then be selected by default at link time, unless G4LIB_USE_GRANULAR is specified). make bin or make (only for examples/) starts the compilation process to build an executable. This command will build implicitly the library associated with the example and link the final application. It assumes all kernel libraries are already generated and placed in the correct $G4INSTALL path defined for them. The linking order is controlled automatically in case libraries have been built with maximum granularity, and the link list is generated on the fly. make dll On Windows systems this will start the compilation process to build single compound kernel library per category and generate Dynamic Link Libraries (DLLs). Once the libraries are generated, the process will imply also the deletion of all temporary files generated during the compilation.
System configuration
$CLHEP_BASE_DIR Specifies the path where the CLHEP package is installed in your system. $G4SYSTEM Defines the architecture and compiler currently used. NOTE: This variable is set automatically if the Configure script is adopted for the installation. This will result in the proper settings also for configuring the environment with the generated shell scripts env.[c]sh.
Installation paths
$G4INSTALL Defines the path where the Geant4 toolkit is located. It should be set by the system installer. By default, it sets to $HOME/geant4, assuming the Geant4 distribution is placed in $HOME. $G4BASE (*) Defines the path to the source code. Internally used to define $CPPFLAGS and $LDFLAGS for -I and -L directives. It has to be set to $G4INSTALL/src. $G4WORKDIR Defines the path for the user's workdir for Geant4. It is set by default to $HOME/geant4, assuming the user's working directory for Geant4 is placed in $HOME.
295
Appendix
$G4INCLUDE Defines the path where source header files may be mirrored at installation by issuing gmake includes (default is set to $G4INSTALL/include) $G4BIN, $G4BINDIR (*) Used by the system to specify the place where to store executables. By default they're set to $G4WORKDIR/ bin and $G4BIN/$G4SYSTEM respectively. The path to $G4WORKDIR/bin/$G4SYSTEM should be added to $PATH in the user environment. $G4BIN can be overridden. $G4TMP, $G4TMPDIR (*) Used by the system to specify the place where to store temporary files products of the compilation/build of a user application or test. By default they're set to $G4WORKDIR/tmp and $G4TMP/$G4SYSTEM respectively. $G4TMP can be overridden. $G4LIB, $G4LIBDIR (*) Used by the system to specify the place where to install libraries. By default they're set to $G4INSTALL/ lib and $G4LIB/$G4SYSTEM respectively. $G4LIB can be overridden.
Build specific
$G4TARGET Specifies the target (name of the source file defining the main()) of the application/example to be built. This variable is set automatically for the examples and tests placed in $G4INSTALL/examples. $G4DEBUG Specifies to compile the code (libraries or examples) including symbolic information in the object code for debugging. The size of the generated object code can increase considerably. By default, code is compiled in optimised mode ($G4OPTIMISE set). $G4OPTDEBUG Only available for the g++ compiler, specifies to compile the code (libraries or examples) in optimised mode, but including symbolic information in the object code for debugging. $G4NO_OPTIMISE Specifies to compile the code (libraries or examples) without compiler optimisation. $G4PROFILE On Linux systems with the g++ compiler, it allows to build libraries with profiling setup for monitoring with the gprof tool. $G4_NO_VERBOSE Geant4 code is compiled by default in high verbosity mode ($G4VERBOSE flag set). For better performance, verbosity code can be left out by defining $G4_NO_VERBOSE. $G4LIB_BUILD_SHARED Flag specifying if to build kernel libraries as shared libraries (libraries will be then used by default). If not set, static archive libraries are built by default. $G4LIB_BUILD_STATIC Flag specifying if to build kernel libraries as static archive libraries in addition to shared libraries (in case $G4LIB_BUILD_SHARED is set as well). $G4LIB_BUILD_DLL (*) Internal flag for specifying to build DLL kernel libraries for Windows systems. The flag is automatically set when requested to build DLLs. $G4LIB_USE_DLL For Windows systems only. Flag to specify to build an application using the installed DLL kernel libraries for Windows systems. It is required to have this flag set in the environment in order to successfully build an application if the DLL libraries have been installed.
296
Appendix
$G4LIB_USE_GRANULAR To force usage of "granular" libraries against "compound" libraries at link time in case both have been installed. The Geant4 building system chooses "compound" libraries by default, if installed.
UI specific
The most relevant flags for User Interface drivers are just listed here. A more detailed description is given also in section 2. of this User's Guide. G4UI_USE_TERMINAL Specifies to use dumb terminal interface in the application to be built (default). G4UI_USE_TCSH Specifies to use the tcsh-shell like interface in the application to be built. G4UI_BUILD_XM_SESSION, G4UI_BUILD_XAW_SESSION Specifies to include in kernel library the XM or XAW Motif-based user interfaces. G4UI_USE_XM, G4UI_USE_XAW Specifies to use the XM or XAW interfaces in the application to be built. G4UI_BUILD_WIN32_SESSION Specifies to include in kernel library the WIN32 terminal interface for Windows systems. G4UI_USE_WIN32 Specifies to use the WIN32 interfaces in the application to be built on Windows systems. G4UI_BUILD_QT_SESSION Specifies to include in kernel library the Qt terminal interface. $QTHOME should specify the path where Qt libraries and headers are installed G4UI_USE_QT Specifies to use the Qt interfaces in the application to be built. G4UI_NONE If set, no UI sessions nor any UI libraries are built. This can be useful when running a pure batch job or in a user framework having its own UI system.
Visualization specific
The most relevant flags for visualization graphics drivers are just listed here. A description of these variables is given also in section 2. of this User's Guide. $G4VIS_BUILD_OPENGLX_DRIVER Specifies to build kernel library for visualization including the OpenGL driver with X11 extension. It requires $OGLHOME set (path to OpenGL installation). $G4VIS_USE_OPENGLX Specifies to use OpenGL graphics with X11 extension in the application to be built. $G4VIS_BUILD_OPENGLXM_DRIVER Specifies to build kernel library for visualization including the OpenGL driver with XM extension. It requires $OGLHOME set (path to OpenGL installation). $G4VIS_USE_OPENGLXM Specifies to use OpenGL graphics with XM extension in the application to be built. G4VIS_BUILD_OPENGLQT_DRIVER Specifies to build kernel library for visualization including the OpenGL driver with Qt extension. It requires $QTHOME set to specify the path where Qt libraries and headers are installed.
297
Appendix
G4VIS_USE_OPENGLQT Specifies to use OpenGL graphics with Qt extension in the application to be built. $G4VIS_BUILD_OI_DRIVER Specifies to build kernel library for visualization including the OpenInventor driver. It requires $OIHOME set (paths to the OpenInventor installation). $G4VIS_USE_OI Specifies to use OpenInventor graphics in the application to be built. $G4VIS_BUILD_OIX_DRIVER Specifies to build the driver for the free X11 version of OpenInventor. $G4VIS_USE_OIX Specifies to use the free X11 version of OpenInventor. $G4VIS_BUILD_RAYTRACERX_DRIVER Specifies to build kernel library for visualization including the Ray-Tracer driver with X11 extension. It requires X11 installed in the system. $G4VIS_USE_RAYTRACERX Specifies to use the X11 version of the Ray-Tracer driver. $G4VIS_BUILD_OIWIN32_DRIVER Specifies to build the driver for the free X11 version of OpenInventor on Windows systems. $G4VIS_USE_OIWIN32 Specifies to use the free X11 version of OpenInventor on Windows systems. $G4VIS_BUILD_DAWN_DRIVER Specifies to build kernel library for visualization including the driver for DAWN. $G4VIS_USE_DAWN Specifies to use DAWN as a possible graphics renderer in the application to be built. $G4DAWN_HOST_NAME To specify the hostname for use with the DAWN-network driver. $G4VIS_NONE If specified, no visualization drivers will be built or used.
298
Appendix
$G4LIB_USE_GDML Specifies to use the gdml module. The flag is automatically set if $G4LIB_BUILD_GDML is set in the environment. $G4LIB_BUILD_ZLIB If set, triggers compilation of a specific zlib module for the compression of output files (mainly in use currently for the HepRep graphics driver). By default, the flag is not set and the built-in system library for compression is adopted instead. Setting this flag will also implicitely set the flag below. On Windows systems, if OpenGL or OpenInventor visualization drivers are built, this module is automatically built. $G4LIB_USE_ZLIB Specifies to use the zlib module, either system built-in or Geant4 specific. $G4LIB_BUILD_G3TOG4 If set, triggers compilation of the g3tog4 module for conversions of simple legacy geometries descriptions to Geant4. By default, the flag is not set and the module's library is not built. Setting this flag will also implicitely set the flag below. $G4LIB_USE_G3TOG4 Specifies to use the g3tog4 module, assuming the related library has been already installed.
Analysis specific
$G4ANALYSIS_USE Specifies to activate the appropriate environment for analysis, if an application includes code for histogramming based on AIDA. Additional setup variables are required ($G4ANALYSIS_AIDA_CONFIG_CFLAGS, $G4ANALYSIS_AIDA_CONFIG_LIBS) to define config options for AIDA ("aida-config --cflags" and "aida-config --libs"). See installation instructions of the specific analysis tools for details.
299
Appendix
or
EXTRALIBS := <your-path>/lib/lib<myExtraLib>.a
You may also specify EXTRA_LINK_DEPENDENCIES, which is added to the dependency of the target executable, and you may also specify a rule for making it, e.g.:
Note that you almost certainly need to augment CPPFLAGS for the header files of the external library, e.g.:
CPPFLAGS+=-I<your-path>/include
Example 84. An example of a customised GNUmakefile for an application or example using an external module not bound to Geant4.
# -------------------------------------------------------------------# GNUmakefile for the application "sim" depending on module "Xplotter" # -------------------------------------------------------------------name := sim G4TARGET := $(name) G4EXLIB := true CPPFLAGS += -I$(HOME)/Xplotter/include EXTRALIBS += -L$(HOME)/Xplotter/lib -lXplotter EXTRA_LINK_DEPENDENCIES := $(HOME)/Xplotter/lib/libXplotter.a .PHONY: all all: lib bin include $(G4INSTALL)/config/binmake.gmk $(HOME)/Xplotter/lib/libXplotter.a: cd $(HOME)/Xplotter; $(MAKE)
EXTRALIBS += $(G4WORKDIR)/tmp/$(G4SYSTEM)/<myApp>/lib<myApp>.a \ -L<your-path>/lib -l<myExtraLib> EXTRALIBSSOURCEDIRS += <your-path>/<myApp> <your-path>/<MyExtraModule> EXTRA_LINK_DEPENDENCIES := $(G4WORKDIR)/tmp/$(G4SYSTEM)/<myApp>/lib<myApp>.a MYSOURCES := $(wildcard <your-path>/<myApp>/src/*cc) $(G4WORKDIR)/tmp/$(G4SYSTEM)/<myApp>/lib<myApp>.a: $(MYSOURCES) cd <your-path>/<myApp>; $(MAKE)
300
Appendix
Example 85. An example of a customised GNUmakefile for an application or example using external modules bound to Geant4.
# ----------------------------------------------------------------# GNUmakefile for the application "phys" depending on module "reco" # ----------------------------------------------------------------name := phys G4TARGET := $(name) G4EXLIB := true EXTRALIBS += $(G4WORKDIR)/tmp/$(G4SYSTEM)/$(name)/libphys.a \ -L$(HOME)/reco/lib -lreco EXTRALIBSSOURCEDIRS += $(HOME)/phys $(HOME)/reco EXTRA_LINK_DEPENDENCIES := $(G4WORKDIR)/tmp/$(G4SYSTEM)/$(name)/libphys.a .PHONY: all all: lib bin include $(G4INSTALL)/config/binmake.gmk MYSOURCES := $(wildcard $(HOME)/phys/src/*cc) $(G4WORKDIR)/tmp/$(G4SYSTEM)/$(name)/libphys.a: $(MYSOURCES) cd $(HOME)/phys; $(MAKE)
301
Appendix
Microsoft Visual Studio development environment. Parasoft Insure++ run-time debugger and memory checker Parasoft C++ Test source code analyzer. Enterprise Architect UML Visual Modeling tool. Borland Together Visual Modeling for Software Architecture Design tool.
8. Python Interface
Python is a popular scripting language with an interactive interpreter. Geant4Py, a Geant4-Python bridge, provides a bridge for Geant4 classes. This enables to directly access Geant4 classes from Python scripting. User applications can be easily configured with many Python third-party modules, such as PyROOT, on the Python software bus. Geant4Py is located in the directory environments/g4py/.
8.1. Installation
8.1.1. Software Requirements
Geant4Py requires Boost-C++ external library, which helps Python binding of C++ codes. A Precompiled package is available for many Linux distributions (SL, SuSE, Ubuntu, etc) and Mac OSX. Geant4 libraries can be built as "static" and "granular", where library components (variables, functions, ...) used in the application are linked statically and shipped with the application. On the other hands, in dynamic binding, the library components are not included in the application, and their binding is carried out at run time. The modular approach of Python is based on dynamic binding mechanism, so you have Geant4 shared libraries are required instead. For generic information about building Geant4 libraries, please refer to the Installation Guide. Here are some tips for manually building "global" and "shared" libraries from an already existing "static + granular" installation. After setting additional environment variables like: Environment Variable G4LIB G4TMP G4LIB_BUILD_SHARED Description Value (example)
Path where the Geant4 libraries are $G4INSTALL/slib installed Path where temporary files are $G4INSTALL/tmp-slib placed Flag for building shared libraries 1
Table 11. Additional environment variables for building global and shared library
execute the following:
# cd $G4INSTALL/source # make # make global
In addition, it is required that all header files are installed in a single directory.
# cd $G4INSTALL/source # make includes
This will collect all relevant header files in $G4INSTALL/include (or $G4INCLUDE). There are additional tools for helping building a Geant4 library in the directory g4py/tools/.
302
Appendix
Usage:
SYSTEM: System type (see Supported Arhitectures) Options: -h, --help Installation directories: --prefix=PREFIX --libdir=DIR
Fine tuning of the library path: --with-g4-incdir=DIR Geant4 header dir [$G4INCLUDE] --with-g4-libdir=DIR Geant4 library dir [$G4LIB/$G4SYSTEM] --with-clhep-incdir=DIR CLHEP header dir [$CLHEP_INCLUDE_DIR] --with-clhep-libdir=DIR CLHEP library dir [$CLHEP_LIB_DIR] --with-clhep-lib=LIB library name of libCLHEP.so [CLHEP|$CLHEP_LIB] --with-python-incdir=DIR --with-python-libdir=DIR --with-boost-incdir=DIR Python header dir [/usr/include/python(2.#)], (location of pyconfig.h) Python library dir [/usr/lib(64)] header dir [/usr/include], of boost/) library dir [/usr/lib] name of libboost_python.so [boost_python]
--with-xercesc-incdir=DIR Xerces-C header dir [/usr/include] --with-xercesc-libdir=DIR Xerces-C library dir [/usr/lib(64)] Enable/disable openglx openglxm raytracerx options: prefix with either --enable- or --disableOpenGLX support [auto] OpenGLXm support [disable, $G4VIS_USE_OPENGLXM] RayTracerX support [disable, $G4VIS_USE_RAYTRACERX]
Supported Architectures: linux for Linux gcc 3.x and 4.x (32bit) linux64 for Linux gcc 3.x and 4.x (64bit, alias to linuxx8664gcc) linuxx8664gcc for AMD Opteron and Intel EM64T Linux gcc 3.x and 4.x macosx for MacOSX with gcc (Tiger/Leopard and Xcode)
The configure script automatically check your environment, and create config/config.gmk, which describes your envrionment. After executing the configure script successfully, then
# make # make install
303
Appendix
Python 2.6.2 (r262:71600, Oct 24 2009, 03:15:21) [GCC 4.4.1 [gcc-4_4-branch revision 150839]] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from Geant4 import * ************************************************************* Geant4 version Name: geant4-09-03 (18-December-2009) Copyright : Geant4 Collaboration Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* Visualization Manager instantiating... >>>
gApplyUICommand gControlExecute gElementTable gEmCalculator gEventManager gExceptionHandler gG4Date gG4VERSION_NUMBER gG4Version gGeometryManager gGetCurrentValues
8.3. Site-modules
Geant4Py provides additional utility modules called "g4py" in the directory site-modules. It consists of predifined geometries, materials, physics lists, primary generator actions, and so on.
304
Appendix
# a target box is placed global target target= G4EzVolume("Target") au= G4Material.GetMaterial("G4_Au") target.CreateTubeVolume(au, 0., 1.*cm, 1.*mm) target.PlaceIt(G4ThreeVector(0.,0.,-10.*cm))
8.4. Examples
There are some examples of Geant4Py in the directories "tests/" and "examples/". In the "tests/" directory,
gtest01 gtest02 gtest03 gtest04 gtest05 gtest06 gtest07 : : : : : : : exposes a user application test for using site-module packages test for ezgeom package test for getting command tree and command information test for constructing CSG geometries in Python test for constructing/visualizing boolean geoemtries test for checking overlapped geometries
The "examples/" directory contains a set of examples of Geant4Py. demos/water_phantom An example of "water phantom dosimetry". This demo program shows that a Geant4 application well coworks with Root on Python front end. VisManager, PrimaryGeneratorAction, UserAction-s, histogramming with Root are implemented in Python; dose calculation in a water phantom Python overloading of user actions on-line histogramming with Root visualization
305
Appendix
education Educational examples with Graphical User Interface using TKinter * lesson1 The first version of the courseware of the mass attenuation coefficient. * lesson2 GUI interface of ExN03, which can control geometry configuration, intial particle condition, physics processes, cut value, magnetic field and visualization outputs. emplot Examples of plotting photon cross sections and stopping powers with Root. gdml Examples of writing/reading user's geometry to/from a GDML file
306
Appendix
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
G4_Ag G4_Cd G4_In G4_Sn G4_Sb G4_Te G4_I G4_Xe G4_Cs G4_Ba G4_La G4_Ce G4_Pr G4_Nd G4_Pm G4_Sm G4_Eu G4_Gd G4_Tb G4_Dy G4_Ho G4_Er G4_Tm G4_Yb G4_Lu G4_Hf G4_Ta G4_W G4_Re G4_Os G4_Ir G4_Pt G4_Au G4_Hg G4_Tl G4_Pb G4_Bi G4_Po G4_At G4_Rn G4_Fr G4_Ra G4_Ac G4_Th G4_Pa G4_U G4_Np G4_Pu G4_Am G4_Cm G4_Bk G4_Cf
10.5 8.65 7.31 7.31 6.691 6.24 4.93 0.00548536 1.873 3.5 6.154 6.657 6.71 6.9 7.22 7.46 5.243 7.9004 8.229 8.55 8.795 9.066 9.321 6.73 9.84 13.31 16.654 19.3 21.02 22.57 22.42 21.45 19.32 13.546 11.72 11.35 9.747 9.32 9.32 0.00900662 1 5 10.07 11.72 15.37 18.95 20.25 19.84 13.67 13.51 14 10
470 469 488 488 487 485 491 482 488 491 501 523 535 546 560 574 580 591 614 628 650 658 674 684 694 705 718 727 736 746 757 790 790 800 810 823 823 830 825 794 827 826 841 847 878 890 902 921 934 939 952 966
307
Appendix
13
14
7 0.518276 G4_ADIPOSE_TISSUE_ICRP 1 0.119477 6 0.63724 7 0.00797 8 0.232333 11 0.0005 12 2e-05 15 0.00016 16 0.00073 17 0.00119 19 0.00032 20 2e-05 26 2e-05 30 2e-05 G4_AIR 6 0.000124 7 0.755268 8 0.231781 18 0.012827 G4_ALANINE 1 0.0791899 6 0.404439 7 0.157213 8 0.359159 G4_ALUMINUM_OXIDE Al_2O_3 8 0.470749 13 0.529251 G4_AMBER 1 0.10593 6 0.788974 8 0.105096 G4_AMMONIA 1 0.177547 7 0.822453 G4_ANILINE 1 0.075759 6 0.773838 7 0.150403 G4_ANTHRACENE 1 0.05655 6 0.94345 G4_B-100_BONE 1 0.0654709 6 0.536944 7 0.0215 8 0.032085 9 0.167411 20 0.176589 G4_BAKELITE 1 0.057441 6 0.774591 8 0.167968 G4_BARIUM_FLUORIDE 9 0.21672 56 0.78328 G4_BARIUM_SULFATE 8 0.274212 16 0.137368 56 0.58842 G4_BENZENE 1 0.077418 6 0.922582 G4_BERYLLIUM_OXIDE 4 0.36032 8 0.63968 G4_BGO 8 0.154126 32 0.17482 83 0.671054 G4_BLOOD_ICRP 1 0.101866 6 0.10002 7 0.02964 8 0.759414 11 0.00185 12 4e-05
0.92
63.2
0.00120479
85.7
1.42
71.9
3.97
145.2
1.1
63.2
0.000826019
53.7
1.0235
66.2
1.283
69.5
1.45
85.9
1.25
72.4
4.89
375.9
4.5
285.7
0.87865
63.4
3.01
93.2
7.13
534.1
1.06
75.2
308
Appendix
13
14 3e-05 15 0.00035 16 0.00185 17 0.00278 19 0.00163 20 6e-05 26 0.00046 30 1e-05 G4_BONE_COMPACT_ICRU 1 0.063984 6 0.278 7 0.027 8 0.410016 12 0.002 15 0.07 16 0.002 20 0.147 G4_BONE_CORTICAL_ICRP 1 0.047234 6 0.14433 7 0.04199 8 0.446096 12 0.0022 15 0.10497 16 0.00315 20 0.20993 30 0.0001 G4_BORON_CARBIDE 5 0.78261 6 0.21739 G4_BORON_OXIDE 5 0.310551 8 0.689449 G4_BRAIN_ICRP 1 0.110667 6 0.12542 7 0.01328 8 0.737723 11 0.00184 12 0.00015 15 0.00354 16 0.00177 17 0.00236 19 0.0031 20 9e-05 26 5e-05 30 1e-05 G4_BUTANE 1 0.173408 6 0.826592 G4_N-BUTYL_ALCOHOL 1 0.135978 6 0.648171 8 0.215851 G4_C-552 1 0.02468 6 0.501611 8 0.004527 9 0.465209 14 0.003973 G4_CADMIUM_TELLURIDE 48 0.468355 52 0.531645 G4_CADMIUM_TUNGSTATE 8 0.177644 48 0.312027 74 0.510329 G4_CALCIUM_CARBONATE 6 0.120003 8 0.479554 20 0.400443 G4_CALCIUM_FLUORIDE 9 0.486659 20 0.513341 G4_CALCIUM_OXIDE 8 0.285299 20 0.714701
1.85
91.9
1.85
106.4
2.52
84.7
1.812
99.6
1.03
73.3
0.00249343
48.3
0.8098
59.9
1.76
86.8
6.2
539.3
7.9
468.3
2.8
136.4
3.18
166
3.3
176.1
309
Appendix
10
G4_CALCIUM_SULFATE 8 0.470095 16 0.235497 20 0.294408 G4_CALCIUM_TUNGSTATE 8 0.22227 20 0.139202 74 0.638528 G4_CARBON_DIOXIDE CO_2 6 0.272916 8 0.727084 G4_CARBON_TETRACHLORIDE 6 0.078083 17 0.921917 G4_CELLULOSE_CELLOPHANE 1 0.062162 6 0.444462 8 0.493376 G4_CELLULOSE_BUTYRATE 1 0.067125 6 0.545403 8 0.387472 G4_CELLULOSE_NITRATE 1 0.029216 6 0.271296 7 0.121276 8 0.578212 G4_CERIC_SULFATE 1 0.107596 7 0.0008 8 0.874976 16 0.014627 58 0.002001 G4_CESIUM_FLUORIDE 9 0.125069 55 0.874931 G4_CESIUM_IODIDE 53 0.488451 55 0.511549 G4_CHLOROBENZENE 1 0.044772 6 0.640254 17 0.314974 G4_CHLOROFORM 1 0.008443 6 0.100613 17 0.890944 G4_CONCRETE 1 0.01 6 0.001 8 0.529107 11 0.016 12 0.002 13 0.033872 14 0.337021 19 0.013 20 0.044 26 0.014 G4_CYCLOHEXANE 1 0.143711 6 0.856289 G4_1,2-DICHLOROBENZENE 1 0.027425 6 0.490233 17 0.482342 G4_DICHLORODIETHYL_ETHER 1 0.0563811 6 0.335942 8 0.111874 17 0.495802 G4_1,2-DICHLOROETHANE 1 0.04074 6 0.242746 17 0.716514 G4_DIETHYL_ETHER 1 0.135978 6 0.648171
2.96
152.3
6.062
395
0.00184212
85
1.594
166.3
1.42
77.6
1.2
74.6
1.49
87
1.03
76.7
4.115
440.7
4.51
553.1
1.1058
89.1
1.4832
156
2.3
135.2
0.779
56.4
1.3048
106.5
1.2199
103.3
1.2351
111.9
0.71378
60
310
Appendix
8 0.215851 G4_N,N-DIMETHYL_FORMAMIDE 1 0.096523 6 0.492965 7 0.191625 8 0.218887 G4_DIMETHYL_SULFOXIDE 1 0.077403 6 0.307467 8 0.204782 16 0.410348 G4_ETHANE 1 0.201115 6 0.798885 G4_ETHYL_ALCOHOL 1 0.131269 6 0.521437 8 0.347294 G4_ETHYL_CELLULOSE 1 0.090027 6 0.585182 8 0.324791 G4_ETHYLENE 1 0.143711 6 0.856289 G4_EYE_LENS_ICRP 1 0.099269 6 0.19371 7 0.05327 8 0.653751 G4_FERRIC_OXIDE 8 0.300567 26 0.699433 G4_FERROBORIDE 5 0.162174 26 0.837826 G4_FERROUS_OXIDE 8 0.222689 26 0.777311 G4_FERROUS_SULFATE 1 0.108259 7 2.7e-05 8 0.878636 11 2.2e-05 16 0.012968 17 3.4e-05 26 5.4e-05 G4_FREON-12 6 0.099335 9 0.314247 17 0.586418 G4_FREON-12B2 6 0.057245 9 0.181096 35 0.761659 G4_FREON-13 6 0.114983 9 0.545621 17 0.339396 G4_FREON-13B1 6 0.080659 9 0.382749 35 0.536592 G4_FREON-13I1 6 0.061309 9 0.290924 53 0.647767 G4_GADOLINIUM_OXYSULFIDE 8 0.084528 16 0.08469 64 0.830782 G4_GALLIUM_ARSENIDE 31 0.482019 33 0.517981 G4_GEL_PHOTO_EMULSION 1 0.08118 6 0.41606
0.9487
66.6
1.1014
98.6
0.00125324
45.4
0.7893
62.9
1.13
69.3
0.00117497
50.7
1.1
73.3
5.2
227.3
7.15
261
5.7
248.6
1.024
76.4
1.12
143
1.8
284.9
0.95
126.6
1.5
210.5
1.8
293.5
7.44
493.3
5.31
384.9
1.2914
74.8
311
Appendix
7 0.11124 8 0.38064 16 0.01088 G4_Pyrex_Glass 5 0.0400639 8 0.539561 11 0.0281909 13 0.011644 14 0.377219 19 0.00332099 G4_GLASS_LEAD 8 0.156453 14 0.080866 22 0.008092 33 0.002651 82 0.751938 G4_GLASS_PLATE 8 0.4598 11 0.0964411 14 0.336553 20 0.107205 G4_GLUCOSE 1 0.071204 6 0.363652 8 0.565144 G4_GLUTAMINE 1 0.0689651 6 0.410926 7 0.191681 8 0.328427 G4_GLYCEROL 1 0.0875539 6 0.391262 8 0.521184 G4_GUANINE 1 0.033346 6 0.39738 7 0.463407 8 0.105867 G4_GYPSUM 1 0.023416 8 0.557572 16 0.186215 20 0.232797 G4_N-HEPTANE 1 0.160937 6 0.839063 G4_N-HEXANE 1 0.163741 6 0.836259 G4_KAPTON 1 0.026362 6 0.691133 7 0.07327 8 0.209235 G4_LANTHANUM_OXYBROMIDE 8 0.068138 35 0.340294 57 0.591568 G4_LANTHANUM_OXYSULFIDE 8 0.0936 16 0.093778 57 0.812622 G4_LEAD_OXIDE 8 0.071682 82 0.928318 G4_LITHIUM_AMIDE 1 0.087783 3 0.302262 7 0.609955 G4_LITHIUM_CARBONATE 3 0.187871 6 0.16255 8 0.649579 G4_LITHIUM_FLUORIDE 3 0.267585 9 0.732415
2.23
134
6.22
526.4
2.4
145.4
1.54
77.2
1.46
73.3
1.2613
72.6
1.58
75
2.32
129.7
0.68376
54.4
0.6603
54
1.42
79.6
6.28
439.7
5.86
421.2
9.53
766.7
1.178
55.5
2.11
87.9
2.635
94
312
Appendix
13
13
G4_LITHIUM_HYDRIDE 1 0.126797 3 0.873203 G4_LITHIUM_IODIDE 3 0.051858 53 0.948142 G4_LITHIUM_OXIDE 3 0.46457 8 0.53543 G4_LITHIUM_TETRABORATE 3 0.082085 5 0.25568 8 0.662235 G4_LUNG_ICRP 1 0.101278 6 0.10231 7 0.02865 8 0.757072 11 0.00184 12 0.00073 15 0.0008 16 0.00225 17 0.00266 19 0.00194 20 9e-05 26 0.00037 30 1e-05 G4_M3_WAX 1 0.114318 6 0.655824 8 0.0921831 12 0.134792 20 0.002883 G4_MAGNESIUM_CARBONATE 6 0.142455 8 0.569278 12 0.288267 G4_MAGNESIUM_FLUORIDE 9 0.609883 12 0.390117 G4_MAGNESIUM_OXIDE 8 0.396964 12 0.603036 G4_MAGNESIUM_TETRABORATE 5 0.240837 8 0.62379 12 0.135373 G4_MERCURIC_IODIDE 53 0.55856 80 0.44144 G4_METHANE 1 0.251306 6 0.748694 G4_METHANOL 1 0.125822 6 0.374852 8 0.499326 G4_MIX_D_WAX 1 0.13404 6 0.77796 8 0.03502 12 0.038594 22 0.014386 G4_MS20_TISSUE 1 0.081192 6 0.583442 7 0.017798 8 0.186381 12 0.130287 17 0.0009 G4_MUSCLE_SKELETAL_ICRP 1 0.100637 6 0.10783 7 0.02768 8 0.754773 11 0.00075 12 0.00019
0.82
36.5
3.494
485.1
2.013
73.6
2.44
94.6
1.05
75.3
1.05
67.9
2.958
118
134.3
3.58
143.8
2.53
108.3
6.36
684.5
0.000667151
41.7
0.7914
67.6
0.99
60.9
75.1
1.04
75.3
313
Appendix
15 0.0018 16 0.00241 17 0.00079 19 0.00302 20 3e-05 26 4e-05 30 5e-05 G4_MUSCLE_STRIATED_ICRU 1 0.101997 6 0.123 7 0.035 8 0.729003 11 0.0008 12 0.0002 15 0.002 16 0.005 19 0.003 G4_MUSCLE_WITH_SUCROSE 1 0.0982341 6 0.156214 7 0.035451 8 0.710101 G4_MUSCLE_WITHOUT_SUCROSE 1 0.101969 6 0.120058 7 0.035451 8 0.742522 G4_NAPHTHALENE 1 0.062909 6 0.937091 G4_NITROBENZENE 1 0.040935 6 0.585374 7 0.113773 8 0.259918 G4_NITROUS_OXIDE 7 0.636483 8 0.363517 G4_NYLON-8062 1 0.103509 6 0.648416 7 0.0995361 8 0.148539 G4_NYLON-6/6 1 0.097976 6 0.636856 7 0.123779 8 0.141389 G4_NYLON-6/10 1 0.107062 6 0.680449 7 0.099189 8 0.1133 G4_NYLON-11_RILSAN 1 0.115476 6 0.720818 7 0.0764169 8 0.0872889 G4_OCTANE 1 0.158821 6 0.841179 G4_PARAFFIN 1 0.148605 6 0.851395 G4_N-PENTANE 1 0.167635 6 0.832365 G4_PHOTO_EMULSION 1 0.0141 6 0.072261 7 0.01932 8 0.066101 16 0.00189 35 0.349103 47 0.474105 53 0.00312 G4_PLASTIC_SC_VINYLTOLUENE
1.04
74.7
1.11
74.3
1.07
74.2
1.145
68.4
1.19867
75.8
0.00183094
84.9
1.08
64.3
1.14
63.9
1.14
63.2
1.425
61.6
0.7026
54.7
0.93
55.9
0.6262
53.6
3.815
331
1.032
64.7
314
Appendix
1 0.085 6 0.915 G4_PLUTONIUM_DIOXIDE 11.46 746.5 8 0.118055 94 0.881945 G4_POLYACRYLONITRILE 1.17 69.6 1 0.0569829 6 0.679055 7 0.263962 G4_POLYCARBONATE 1.2 73.1 1 0.055491 6 0.755751 8 0.188758 G4_POLYCHLOROSTYRENE 1.3 81.7 1 0.061869 6 0.696325 17 0.241806 G4_POLYETHYLENE (C_2H_4)_N-Polyethylene 0.94 57.4 1 0.143711 6 0.856289 G4_MYLAR 1.4 78.7 1 0.041959 6 0.625016 8 0.333025 G4_PLEXIGLASS 1.19 74 1 0.080538 6 0.599848 8 0.319614 G4_POLYOXYMETHYLENE 1.425 77.4 1 0.067135 6 0.400017 8 0.532848 G4_POLYPROPYLENE (C_2H_4)_N-Polypropylene 0.9 56.5 1 0.143711 6 0.856289 G4_POLYSTYRENE 1.06 68.7 1 0.077418 6 0.922582 G4_TEFLON 2.2 99.1 6 0.240183 9 0.759817 G4_POLYTRIFLUOROCHLOROETHYLENE 2.1 120.7 6 0.20625 9 0.489354 17 0.304395 G4_POLYVINYL_ACETATE 1.19 73.7 1 0.070245 6 0.558066 8 0.371689 G4_POLYVINYL_ALCOHOL 1.3 69.7 1 0.091517 6 0.545298 8 0.363185 G4_POLYVINYL_BUTYRAL 1.12 67.2 1 0.092802 6 0.680561 8 0.226637 G4_POLYVINYL_CHLORIDE 1.3 108.2 1 0.04838 6 0.38436 17 0.56726 G4_POLYVINYLIDENE_CHLORIDE 1.7 134.3 1 0.020793 6 0.247793 17 0.731414 G4_POLYVINYLIDENE_FLUORIDE 1.76 88.8 1 0.03148 6 0.375141 9 0.593379 G4_POLYVINYL_PYRROLIDONE 1.25 67.7 1 0.081616 6 0.648407 7 0.126024 8 0.143953
315
Appendix
13
G4_POTASSIUM_IODIDE 19 0.235528 53 0.764472 G4_POTASSIUM_OXIDE 8 0.169852 19 0.830148 G4_PROPANE 1 0.182855 6 0.817145 G4_lPROPANE 1 0.182855 6 0.817145 G4_N-PROPYL_ALCOHOL 1 0.134173 6 0.599595 8 0.266232 G4_PYRIDINE 1 0.06371 6 0.759217 7 0.177073 G4_RUBBER_BUTYL 1 0.143711 6 0.856289 G4_RUBBER_NATURAL 1 0.118371 6 0.881629 G4_RUBBER_NEOPRENE 1 0.05692 6 0.542646 17 0.400434 G4_SILICON_DIOXIDE SiO_2 8 0.532565 14 0.467435 G4_SILVER_BROMIDE 35 0.425537 47 0.574463 G4_SILVER_CHLORIDE 17 0.247368 47 0.752632 G4_SILVER_HALIDES 35 0.422895 47 0.573748 53 0.003357 G4_SILVER_IODIDE 47 0.459458 53 0.540542 G4_SKIN_ICRP 1 0.100588 6 0.22825 7 0.04642 8 0.619002 11 7e-05 12 6e-05 15 0.00033 16 0.00159 17 0.00267 19 0.00085 20 0.00015 26 1e-05 30 1e-05 G4_SODIUM_CARBONATE 6 0.113323 8 0.452861 11 0.433815 G4_SODIUM_IODIDE 11 0.153373 53 0.846627 G4_SODIUM_MONOXIDE 8 0.258143 11 0.741857 G4_SODIUM_NITRATE 7 0.164795 8 0.56472 11 0.270485 G4_STILBENE 1 0.067101 6 0.932899
3.13
431.9
2.32
189.9
0.00187939
47.1
0.43
52
0.8035
61.1
0.9819
66.2
0.92
56.5
0.92
59.8
1.23
93
2.32
139.2
6.473
486.6
5.56
398.4
6.47
487.1
6.01
543.5
1.1
72.7
2.532
125
3.667
452
2.27
148.8
2.261
114.6
0.9707
67.7
316
Appendix
13
13
G4_SUCROSE 1 0.064779 6 0.42107 8 0.514151 G4_TERPHENYL 1 0.044543 6 0.955457 G4_TESTES_ICRP 1 0.104166 6 0.09227 7 0.01994 8 0.773884 11 0.00226 12 0.00011 15 0.00125 16 0.00146 17 0.00244 19 0.00208 20 0.0001 26 2e-05 30 2e-05 G4_TETRACHLOROETHYLENE 6 0.144856 17 0.855144 G4_THALLIUM_CHLORIDE 17 0.147822 81 0.852178 G4_TISSUE_SOFT_ICRP 1 0.104472 6 0.23219 7 0.02488 8 0.630238 11 0.00113 12 0.00013 15 0.00133 16 0.00199 17 0.00134 19 0.00199 20 0.00023 26 5e-05 30 3e-05 G4_TISSUE_SOFT_ICRU-4 1 0.101172 6 0.111 7 0.026 8 0.761828 G4_TISSUE-METHANE 1 0.101869 6 0.456179 7 0.035172 8 0.40678 G4_TISSUE-PROPANE 1 0.102672 6 0.56894 7 0.035022 8 0.293366 G4_TITANIUM_DIOXIDE 8 0.400592 22 0.599408 G4_TOLUENE 1 0.08751 6 0.91249 G4_TRICHLOROETHYLENE 1 0.007671 6 0.182831 17 0.809498 G4_TRIETHYL_PHOSPHATE 1 0.082998 6 0.395628 8 0.351334 15 0.17004 G4_TUNGSTEN_HEXAFLUORIDE 9 0.382723 74 0.617277 G4_URANIUM_DICARBIDE 6 0.091669 92 0.908331
1.5805
77.5
1.234
71.7
1.04
75
1.625
159.2
7.004
690.3
72.3
74.9
0.00106409
61.2
0.00182628
59.5
4.26
179.5
0.8669
62.5
1.46
148.1
1.07
81.2
2.4
354.4
11.28
752
317
Appendix
G4_URANIUM_MONOCARBIDE 6 0.048036 92 0.951964 G4_URANIUM_OXIDE 8 0.118502 92 0.881498 G4_UREA 1 0.067131 6 0.199999 7 0.466459 8 0.266411 G4_VALINE 1 0.0946409 6 0.512644 7 0.119565 8 0.27315 G4_VITON 1 0.009417 6 0.280555 9 0.710028 G4_WATER H_2O 1 0.111894 8 0.888106 G4_WATER_VAPOR H_2O-Gas 1 0.111894 8 0.888106 G4_XYLENE 1 0.094935 6 0.905065 G4_GRAPHITE Graphite
13.63
862
10.96
720.6
1.323
72.8
1.23
67.7
1.8
98.6
75
0.000756182
71.6
0.87
61.8
1.7
78
318
Bibliography
[ Booch1994 ] Grady Booch. Object-Oriented Analysis and Design with Applications . The Benjamin/Cummings Publishing Co. Inc . 1994 . ISBN: 0-8053-5340-2 . [ Ellis1990 ] Margaret Ellis and Bjarne Stroustrup. Annotated C++ Reference Manual (ARM) . Addison-Wesley Publishing Co. . 1990 . [ Hecht1974 ] E. Hecht and A. Zajac. Optics . Addison-Wesley Publishing Co. . 1974 . pp. 71-80 and pp. 244-246 . [ Josuttis1999 ] Nicolai M. Josuttis. The C++ Standard Library - A Tutorial and Reference . Addison-Wesley Publishing Co. . 1999 . ISBN: 0-201-37926-0 . [ Meyers2001 ] Scott Meyers. Effective STL . Addison-Wesley Publishing Co. . 2001 . ISBN: 0-201-74962-9 . [ Musser1996 ] David R. Musser and Atul Saini. STL Tutorial and Reference Guide / C++ Programming with the Standard Template Library . Addison-Wesley Publishing Co. . 1996 . ISBN: 0-201-63398-1 . [ Plauger1995 ] P.J. Plauger. The Draft Standard C++ Library . Prentice Hall, Englewood Cliffs . 1995 . [ Chauvie2007 ] S. Chauvie, Z. Francis, S. Guatelli, S. Incerti, B. Mascialino, P. Moretto, P. Nieminen and M. G. Pia . Geant4 physics processes for microdosimetry simulation: design foundation and implementation of the first set of models . To be published in IEEE Trans. Nucl. Sci., Dec. 2007 . 2007 .
319